PHP WebShell

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

Просмотр файла: permissionlessValidatorTxBuilder.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_api_1 = require("@bitgo/sdk-api");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const statics_1 = require("@bitgo/statics");
const assert_1 = __importDefault(require("assert"));
const src_1 = require("../../../src");
const AvaxpLib = __importStar(require("../../../src/lib"));
const lib_1 = require("../../../src/lib");
const permissionlessValidatorTxBuilder_1 = require("../../../src/lib/permissionlessValidatorTxBuilder");
const testData = __importStar(require("../../resources/avaxp"));
// import { pvm } from '@bitgo-forks/avalanchejs';
describe('AvaxP permissionlessValidatorTxBuilder', () => {
    let basecoin;
    let bitgo;
    const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'));
    before(() => {
        bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
            env: 'mock',
        });
        bitgo.initializeTestVars();
        bitgo.safeRegister('avaxp', src_1.AvaxP.createInstance);
        bitgo.safeRegister('tavaxp', src_1.TavaxP.createInstance);
        basecoin = bitgo.coin('tavaxp');
    });
    it('should create transaction builder from hex', () => {
        const txBuilder = factory.from(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.halfSignedTx);
        txBuilder.should.be.an.instanceOf(permissionlessValidatorTxBuilder_1.PermissionlessValidatorTxBuilder);
    });
    describe('Transaction readable', () => {
        let tx;
        before(async () => {
            const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADD_VALIDATOR_ID_SAMPLE.fullsigntxHex);
            tx = await txBuilder.build();
        });
        it('Should json stringifiy addPermissionlessValidator transaction', async () => {
            const txJson = tx.toJson();
            (0, assert_1.default)(typeof JSON.stringify(tx.toJson()), 'string');
            txJson.id.should.equal(testData.ADD_VALIDATOR_ID_SAMPLE.txid);
        });
        it('Should get a txid', async () => {
            tx.id.should.equal(testData.ADD_VALIDATOR_ID_SAMPLE.txid);
        });
    });
    describe('should explains transaction', () => {
        it('should explains a Signed AddPermissionlessValidatorTx', async () => {
            const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(
            // https://testnet.snowtrace.io/pvm/tx/2tt3KE6gAG7qpMLL6xoynSyk7ht4egQ74wcF7AuGm25vQ3QNWB?chainId=43113
            '0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000000baeb90000000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee000000024f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000023a4c180000000030000000200000000000000014f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000023a4c180000000030000000200000000000000010000000094a8b8179f0b6e7e7ce55b4d6ec5ad56dae1de9f0000000062bb03e60000000062e32556000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001c8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e1586a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca0000000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee0000000b00000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee0000000b00000000000000000000000200000003ac03c0ca71a1dde84702d272fbdd08600186701242e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1ee00030d40000000020000000900000002b631e9553a8721978bffed3e778de7eb904e167599c1d26d5a8d3c46158df661164c6ca6029f24988020ccfcd673e5c19817ff74d012651f245d009a749591160170eae73d7e19b045671d41050b11791643567d1bc9cc51fa226d2be95a65689f19cda06a242a9749f6a150fcc2a5b50af12a1bc3564d1b76ac1e3826b5e21361010000000900000002b631e9553a8721978bffed3e778de7eb904e167599c1d26d5a8d3c46158df661164c6ca6029f24988020ccfcd673e5c19817ff74d012651f245d009a749591160170eae73d7e19b045671d41050b11791643567d1bc9cc51fa226d2be95a65689f19cda06a242a9749f6a150fcc2a5b50af12a1bc3564d1b76ac1e3826b5e2136101');
            const tx = await txBuilder.build();
            const txExplain = tx.explainTransaction();
            txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
            txExplain.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
        });
        it('should explains a Signed AddPermissionlessValidatorTx and order inputs', async () => {
            const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('avaxp')).from(
            // https://testnet.snowtrace.io/pvm/tx/2tt3KE6gAG7qpMLL6xoynSyk7ht4egQ74wcF7AuGm25vQ3QNWB?chainId=43113
            '0x0000000000190000000100000000000000000000000000000000000000000000000000000000000000000000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000700000000773594000000000000000000000000020000000393ca93e4cb3b6c10d167d41fbabeb8e94ed2deb5dc787323d722ff40fdfe56040fb98f7aee2075eff4dd7a368ddb6ef7132bff693cbfd9ba30f17c18000000046f8bdc3c893edd2c7f24a6190d6233fda5ccf517d96dd6c08d134179abb2d14e0000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000500000047036aaa00000000020000000100000002865cc8568b9c4c7d36bb96e086619d8c85218d653ff56d051334f839e58977c30000000221e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000000005fb5d590000000020000000100000002865cc8568b9c4c7d36bb96e086619d8c85218d653ff56d051334f839e58977c30000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000500000007ae61e378000000020000000100000002865cc8568b9c4c7d36bb96e086619d8c85218d653ff56d051334f839e58977c30000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000003ffb6db3f6900000002000000010000000200000000953cc95e84f29dc6ee7589ef6acb01c9d561cba3000000006616c6750000000066560e750000044e51280e7100000000000000000000000000000000000000000000000000000000000000000000001ca7a2f29ca580c4254e3beabce2047e04ea8c3c7c69a5817b5461c2239593561a3843bc7cb14576390378b145135301478ff8cb5a651e3d082fd6cd1e1777edeabd5b0924ca648f3890d82ebd6259b3cca00e30faa249482fef10293f42e28afb15f0a5dd3f37e5524cd5de3f3c2b909df49873b8196af60004d3f3a84baa46ba08df7baf8e486b0b79a9c207095e1a430000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000070000044e51280e710000000000000000000000020000000393ca93e4cb3b6c10d167d41fbabeb8e94ed2deb5dc787323d722ff40fdfe56040fb98f7aee2075eff4dd7a368ddb6ef7132bff693cbfd9ba30f17c180000000b0000000000000000000000020000000393ca93e4cb3b6c10d167d41fbabeb8e94ed2deb5dc787323d722ff40fdfe56040fb98f7aee2075eff4dd7a368ddb6ef7132bff693cbfd9ba30f17c180000000b0000000000000000000000020000000393ca93e4cb3b6c10d167d41fbabeb8e94ed2deb5dc787323d722ff40fdfe56040fb98f7aee2075eff4dd7a368ddb6ef7132bff693cbfd9ba30f17c1800004e2000000004000000090000000208304e8841ab96169ea2b28dc358df3594523b3ce87593f1f579b51b7bfb844d49d690f71edb4e6530b8800436a4ef7357046a2155c5b52c15414ae76ca956c8007bbd8dbea9071c1bf1788f853472e08362b1afadc9d0a4412b13b0ea43b703e010df1204d88c6fe0484140b1bb91fdbf7a032d262475a419f80829411a04114001000000090000000208304e8841ab96169ea2b28dc358df3594523b3ce87593f1f579b51b7bfb844d49d690f71edb4e6530b8800436a4ef7357046a2155c5b52c15414ae76ca956c8007bbd8dbea9071c1bf1788f853472e08362b1afadc9d0a4412b13b0ea43b703e010df1204d88c6fe0484140b1bb91fdbf7a032d262475a419f80829411a04114001000000090000000208304e8841ab96169ea2b28dc358df3594523b3ce87593f1f579b51b7bfb844d49d690f71edb4e6530b8800436a4ef7357046a2155c5b52c15414ae76ca956c8007bbd8dbea9071c1bf1788f853472e08362b1afadc9d0a4412b13b0ea43b703e010df1204d88c6fe0484140b1bb91fdbf7a032d262475a419f80829411a04114001000000090000000208304e8841ab96169ea2b28dc358df3594523b3ce87593f1f579b51b7bfb844d49d690f71edb4e6530b8800436a4ef7357046a2155c5b52c15414ae76ca956c8007bbd8dbea9071c1bf1788f853472e08362b1afadc9d0a4412b13b0ea43b703e010df1204d88c6fe0484140b1bb91fdbf7a032d262475a419f80829411a0411400127efec04');
            const tx = await txBuilder.build();
            const txExplain = tx.explainTransaction();
            txExplain.inputs[0].id.should.equal('r8JUUYFv9NWcNe5cxMFdBRjqkL6FZewDf2GtkttmxWCdeFFMK:0');
            txExplain.inputs[1].id.should.equal('22B7GH7fDarBqyw8W7atC8ED3euVnefTiEWBPBmaSXrAhAQ4Lk:0');
            txExplain.inputs[2].id.should.equal('22B7GH7fDarBqyw8W7atC8ED3euVnefTiEWBPBmaSXrAhAQ4Lk:1');
            txExplain.inputs[3].id.should.equal('22B7GH7fDarBqyw8W7atC8ED3euVnefTiEWBPBmaSXrAhAQ4Lk:2');
        });
        it('should explains a Signed AddPermissionlessValidatorTx from raw', async () => {
            const oldHex = '0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000000b9f76c00000000000000000000000020000000342e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1eeac03c0ca71a1dde84702d272fbdd086001867012000000024f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000023a4c1800000000200000000000000014f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000023a4c1800000000200000000000000010000000094a8b8179f0b6e7e7ce55b4d6ec5ad56dae1de9f0000000062bb03e60000000062e32556000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001c8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e1586a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca000000000000000000000000020000000342e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1eeac03c0ca71a1dde84702d272fbdd0860018670120000000b0000000000000000000000020000000342e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1eeac03c0ca71a1dde84702d272fbdd0860018670120000000b0000000000000000000000020000000342e19ad9a617fb95dcf8843ade66e06e578f549a8be54f016ab748127ab1a184626cba44c748a1eeac03c0ca71a1dde84702d272fbdd08600186701200004e2000000002000000090000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008be54f016ab748127ab1a184626cba44c748a1ee000000090000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008be54f016ab748127ab1a184626cba44c748a1ee964888d4';
            const sortedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(oldHex);
            const sortedTx = await sortedBuilder.build();
            const txExplain = sortedTx.explainTransaction();
            // this tx is sorted and can be broadcasted
            const newHex = sortedTx.toBroadcastFormat();
            (0, assert_1.default)(newHex === oldHex);
            txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
            txExplain.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            txExplain.outputs[0].address.should.equal('NodeID-EZ38CcWHoSyoEfAkDN9zaieJ5Yq64YePY');
        });
        it('should explain AddPermissionlessValidatorTx with 1 input', async () => {
            const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from('0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d425721000000014f194d8e066b11dfe92f593cfa5c2fa1ae450927ecd5b093952e61834f4d8aa4000000003d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000007735940000000002000000000000000100000000e25c9a09eb9c68d4807a39f97893facd9a6a7da100000000660d750900000000660ec689000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001c8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e1586a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d4257210000000b000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d4257210000000b000000000000000000000002000000032a00839550f75ee8879cacd97ff350a51d47ae14db94335f2f668b9707c78903c3b5ac54c6f4054783c4a6ecd5b18fa07692d35ee4c3f8b74d42572100030d40000000010000000900000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db94335f2f668b9707c78903c3b5ac54c6f4054700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c5543b0');
            const tx = await txBuilder.build();
            const txExplain = tx.explainTransaction();
            txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
            txExplain.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            txExplain.outputs[0].address.should.equal('NodeID-MdteS9U987PY7iwA5Pcz3sKVprJAbAvE7');
        });
        it('should explains a Half Signed AddPermissionlessValidatorTx', async () => {
            const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
            const tx = await txBuilder.build();
            const txExplain = tx.explainTransaction();
            txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
            txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
            txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
        });
        it('should explains a unsigned AddPermissionlessValidatorTx', async () => {
            const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
            const tx = await txBuilder.build();
            const txExplain = tx.explainTransaction();
            txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
            txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
            txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
        });
    });
    describe('Sign Transaction', () => {
        it('build and sign an AddPermissionlessValidator transaction and broadcast', async () => {
            /*
      
          const keyMapping: Record<string, any> = {
            f45d1c9bf57d3c02299a727d6e5d8d4e76498846b1a289b4e31a2ecccbc212fb: {
              source: 'user',
              encoded: 'BhjEzaXMSFj4aQBhw27Dsn73b8rR9gCTX',
              pub: '02abb451c0cc240e9a4fb97a130846d90a87247264e57014e41dc226ebf4965724',
              prv: 'f45d1c9bf57d3c02299a727d6e5d8d4e76498846b1a289b4e31a2ecccbc212fb',
              address: 'P-fuji1w4jjs4qfugq0m3nu0d3htx6662dlq87zq5nz33',
            },
            '2e0ffe6efbfcc27e9aaf4bce6af78d4c66e89b0955b85f02d7e15910e16ed4cd': {
              source: 'backup',
              encoded: 'BFzPJNifqdf6Z8H2P76gTEbd8RmCjMSzL',
              pub: '025523fa48a5b0c8ed4a8344aab8396061fb42cb4f168ba5d3ae19f034c4ea2d4d',
              prv: '2e0ffe6efbfcc27e9aaf4bce6af78d4c66e89b0955b85f02d7e15910e16ed4cd',
              address: 'P-fuji1wzr0hsm8zlr6gpaakxvt67f999nj044ete07uw',
            },
            '5a360c848021024528dfc02e79ba441f1727c765b4d0dcec288ffbd2772cd432': {
              source: 'bitgo',
              encoded: 'HT6zoSecYyqJX63Hqaj1usvyqJbrnc8ia',
              pub: '03d71cda3b1c32eed044866ec96c2ac54af43e7edb8f1535df51f341e49674ffaa',
              prv: '5a360c848021024528dfc02e79ba441f1727c765b4d0dcec288ffbd2772cd432',
              address: 'P-fuji1k3ca2njcunzl4hhxy24avca7htf66cmjjukl0n',
            },
          };
             */
            const unixNow = BigInt(Math.round(new Date().getTime() / 1000));
            const startTime = unixNow + BigInt(60);
            const endTime = startTime + BigInt(60 * 60 * 24 + 600); // 24 hours + 10 minutes
            // const AVAX_PUBLIC_URL = 'https://api.avax-test.network';
            // const pvmapi = new pvm.PVMApi(AVAX_PUBLIC_URL);
            // const { utxos } = await pvmapi.getUTXOs({
            //   addresses: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses,
            // });
            // console.log(utxos);
            const recoveryMode = false;
            const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
                .getPermissionlessValidatorTxBuilder()
                .threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.threshold)
                .locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.locktime)
                .recoverMode(recoveryMode)
                .fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses)
                .startTime(startTime.toString())
                .endTime(endTime.toString())
                .stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount)
                .delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.delegationFeeRate)
                .nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.nodeId)
                .blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsPublicKey)
                .blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsSignature)
                .utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.utxos);
            const tx = await txBuilder.build();
            const txExplain = tx.explainTransaction();
            const txJson = tx.toJson();
            (0, assert_1.default)(txExplain.outputAmount === testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount);
            txExplain.inputs[0].id.should.equal('WyjYJHa7Ye1KMsBZiQ8hQJzY7YYxTJTTyMkxcVrKRDiNytTY8:0');
            txExplain.inputs[1].id.should.equal('WyjYJHa7Ye1KMsBZiQ8hQJzY7YYxTJTTyMkxcVrKRDiNytTY8:1');
            txExplain.inputs[2].id.should.equal('s92SjoZQemgG97HocX9GgyFy6ZKmapgcgqQ3y5J2uwP3qWBUy:0');
            txExplain.fee.fee.should.equal('1000000');
            (0, assert_1.default)(txJson.outputs[0].value === testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount);
            tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            console.log(tx.toBroadcastFormat());
            const txBuilder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
                .from(tx.toBroadcastFormat())
                .recoverMode(false);
            const tx2 = await txBuilder2.build();
            tx2.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            // Test sign with user key
            txBuilder2.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.userPrivateKey });
            const halfSigned = await txBuilder2.build();
            const halfSignedTxHex = halfSigned.toBroadcastFormat();
            (0, assert_1.default)(txBuilder['_stakeAmount'] === txBuilder2['_stakeAmount']);
            console.log(halfSignedTxHex);
            // const txBuilder2 = factory.from(halfSignedTxHex);
            // txBuilder2.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.backupPrivateKey });
            // const fullSignedTx = await txBuilder2.build();
            // console.log(fullSignedTx.toJson());
            // const res = await pvmapi.issueTx({ tx: fullSignedTx.toBroadcastFormat() });
            // const txSigned =
            //   '0x000000000019000000050000000000000000000000000000000000000000000000000000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000070000000005c81a40000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad6372000000024411af9d9877c52c1be3f77825a74ca11869128478c4145910e92695a24c7d80000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000003b9aca0000000002000000010000000271d8644c9199e30b9fef53af56aef243e5431c6b1b09d5f11a6622c86db3f39d000000003d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000050000000005c81a4000000002000000010000000200000000129a271ff407b1101f35aec82a2f715c5239bd3900000000660f4ab50000000066109e8d000000003b9aca0000000000000000000000000000000000000000000000000000000000000000000000001cad9e9476b701edec88e53b1c314456053b3cf846a1192117872e41455f440c074d6ee89530d45e88f79ac0eda06f2887a94d6182edbd953516b262f17565a65d98f5741549cd70d2423abff750bb4b8d982d482376b189142ff8aa4705615fee14be6174610860e9c003aa4aeaa613b1732abf3cd0c9c42fa5856345644068c0d1f9fa1d9af32e20b14fca02983260bc000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000003b9aca00000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000b000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad63720000000b000000000000000000000002000000037086fbc36717c7a407bdb198bd7925296727d6b97565285409e200fdc67c7b63759b5ad29bf01fc2b471d54e58e4c5fadee622abd663bebad3ad637200030d4000000002000000090000000228a59420971953aa61b4b4c90b934ef76e6e9c8ad256e9417e9a6b5017d836813b2b5cad2a890c66c8295f104d74192c4964cf289e2a45adb57a7b05b5e9529e004ec2dae5c48ba6fa4d1e0b1c6b9d9bbe79c481ff16848c1fa3fa3a6ed47431a12af4b2d9779bb192bb3f254408731798b50c8f03f25b7e7d7313738892e71d6601000000090000000228a59420971953aa61b4b4c90b934ef76e6e9c8ad256e9417e9a6b5017d836813b2b5cad2a890c66c8295f104d74192c4964cf289e2a45adb57a7b05b5e9529e004ec2dae5c48ba6fa4d1e0b1c6b9d9bbe79c481ff16848c1fa3fa3a6ed47431a12af4b2d9779bb192bb3f254408731798b50c8f03f25b7e7d7313738892e71d660151aa291f';
            // const txBuilder = new TransactionBuilderFactory(coins.get('tavaxp')).from(tx);
            // const decode = await txBuilder.build();
            // console.log(decode.toJson());
            // const res = await pvmapi.issueTx({ tx: txSigned });
            // console.log(res);
        });
        it('build and sign an AddPermissionlessValidator transaction', async () => {
            const recoveryMode = false;
            const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
                .getPermissionlessValidatorTxBuilder()
                .threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.threshold)
                .locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.locktime)
                .recoverMode(recoveryMode)
                .fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.bitgoAddresses)
                .startTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.startTime)
                .endTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.endTime)
                .stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.stakeAmount)
                .delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.delegationFeeRate)
                .nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.nodeId)
                .blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsPublicKey)
                .blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsSignature)
                .utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.utxos);
            const tx = await txBuilder.build();
            tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            // Test sign with user key
            txBuilder.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.userPrivateKey });
            txBuilder.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.backupPrivateKey });
            const fullSignedTx = await txBuilder.build();
            console.log(fullSignedTx.toJson());
        });
        it('build and sign a transaction in recovery mode', async () => {
            const recoveryMode = true;
            const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
                .getPermissionlessValidatorTxBuilder()
                .threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.threshold)
                .locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.locktime)
                .recoverMode(recoveryMode)
                .fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.bitgoAddresses)
                .startTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.startTime)
                .endTime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.endTime)
                .stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.stakeAmount)
                .delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.delegationFeeRate)
                .nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.nodeId)
                .blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsPublicKey)
                .blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.blsSignature)
                .utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.utxos);
            const tx = await txBuilder.build();
            let txHex = tx.toBroadcastFormat();
            txHex.should.equal(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.unsignedRawtxRecovery);
            const privateKey = recoveryMode
                ? testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.backupPrivateKey
                : testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.userPrivateKey;
            const params = {
                txPrebuild: {
                    txHex: tx.toBroadcastFormat(),
                },
                prv: privateKey,
            };
            const halfSignedTransaction = await basecoin.signTransaction(params);
            txHex = halfSignedTransaction?.halfSigned?.txHex;
            txHex.should.equal(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_SAMPLE.halfSignedRawTxRecovery);
        });
        it('build and sign an AddPermissionlessValidator transaction and broadcast in recovery mode', async () => {
            const unixNow = BigInt(Math.round(new Date().getTime() / 1000));
            const startTime = unixNow + BigInt(60);
            const endTime = startTime + BigInt(60 * 60 * 24 + 600);
            const recoveryMode = true;
            const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
                .getPermissionlessValidatorTxBuilder()
                .threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.threshold)
                .locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.locktime)
                .recoverMode(recoveryMode)
                .fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses)
                .startTime(startTime.toString())
                .endTime(endTime.toString())
                .stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmount)
                .delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.delegationFeeRate)
                .nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.nodeId)
                .blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsPublicKey)
                .blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsSignature)
                .utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.utxos);
            const tx = await txBuilder.build();
            tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessValidator);
            // Test sign with user key
            txBuilder.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.backupPrivateKey });
            const halfSigned = await txBuilder.build();
            const halfSignedTxHex = halfSigned.toBroadcastFormat();
            const txBuilder2 = factory.from(halfSignedTxHex);
            txBuilder2.sign({ key: testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.userPrivateKey });
            const fullSignedTx = await txBuilder2.build();
            console.log(fullSignedTx.toJson());
        });
    });
    it('Should fail to build if utxos change output 0', async () => {
        const unixNow = BigInt(Math.round(new Date().getTime() / 1000));
        const startTime = unixNow + BigInt(60);
        const endTime = startTime + BigInt(60 * 60 * 24 + 600);
        const txBuilder = new AvaxpLib.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
            .getPermissionlessValidatorTxBuilder()
            .threshold(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.threshold)
            .locktime(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.locktime)
            .recoverMode(false)
            .fromPubKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.bitgoAddresses)
            .startTime(startTime.toString())
            .endTime(endTime.toString())
            .stakeAmount(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.stakeAmountNoOutput)
            .delegationFeeRate(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.delegationFeeRate)
            .nodeID(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.nodeId)
            .blsPublicKey(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsPublicKey)
            .blsSignature(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.blsSignature)
            .utxos(testData.BUILD_AND_SIGN_ADD_PERMISSIONLESS_VALIDATOR_SAMPLE.utxos);
        const tx = await txBuilder.build();
        const txJson = tx.toJson();
        const txExplain = tx.explainTransaction();
        txJson.changeOutputs.length.should.equal(0);
        txExplain.changeOutputs.length.should.equal(0);
        txExplain.changeAmount.should.equal('0');
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3Blcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBDO0FBQzFDLDhDQUFpRztBQUNqRyw4Q0FBMEQ7QUFDMUQsNENBQXVDO0FBQ3ZDLG9EQUE0QjtBQUM1QixzQ0FBNkM7QUFDN0MsMkRBQTZDO0FBQzdDLDBDQUE2RDtBQUM3RCx3R0FBcUc7QUFDckcsZ0VBQWtEO0FBQ2xELGtEQUFrRDtBQUVsRCxRQUFRLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO0lBQ3RELElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1FBQ3BELE1BQU0sU0FBUyxH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c0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb24sIEhhbGZTaWduZWRBY2NvdW50VHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEF2YXhQLCBUYXZheFAgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgQXZheHBMaWIgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvcGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXInO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2F2YXhwJztcbi8vIGltcG9ydCB7IHB2bSB9IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5cbmRlc2NyaWJlKCdBdmF4UCBwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcicsICgpID0+IHtcbiAgbGV0IGJhc2Vjb2luO1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpO1xuXG4gIGJlZm9yZSgoKSA9PiB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHtcbiAgICAgIGVudjogJ21vY2snLFxuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcignYXZheHAnLCBBdmF4UC5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YXZheHAnLCBUYXZheFAuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGF2YXhwJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZnJvbSBoZXgnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmhhbGZTaWduZWRUeCk7XG4gICAgdHhCdWlsZGVyLnNob3VsZC5iZS5hbi5pbnN0YW5jZU9mKFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHJlYWRhYmxlJywgKCkgPT4ge1xuICAgIGxldCB0eDogQmFzZVRyYW5zYWN0aW9uO1xuICAgIGJlZm9yZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERfVkFMSURBVE9SX0lEX1NBTVBMRS5mdWxsc2lnbnR4SGV4XG4gICAgICApO1xuICAgICAgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQganNvbiBzdHJpbmdpZml5IGFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBhc3NlcnQodHlwZW9mIEpTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKSwgJ3N0cmluZycpO1xuICAgICAgdHhKc29uLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERfVkFMSURBVE9SX0lEX1NBTVBMRS50eGlkKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGEgdHhpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERfVkFMSURBVE9SX0lEX1NBTVBMRS50eGlkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBleHBsYWlucyB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW5zIGEgU2lnbmVkIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICAvLyBodHRwczovL3Rlc3RuZXQuc25vd3RyYWNlLmlvL3B2bS90eC8ydHQzS0U2Z0FHN3FwTUxMNnhveW5TeWs3aHQ0ZWdRNzR3Y0Y3QXVHbTI1dlEzUU5XQj9jaGFpbklkPTQzMTEzXG4gICAgICAgICcweDAwMDAwMDAwMDAxOTAwMDAwMDA1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxM2Q5YmRhYzBlZDFkNzYxMzMwY2Y2ODBlZmRlYjFhNDIxNTllYjM4N2Q2ZDI5NTBjOTZmN2QyOGY2MWJiZTJhYTAwMDAwMDA3MDAwMDAwMDAwYmFlYjkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzYWMwM2MwY2E3MWExZGRlODQ3MDJkMjcyZmJkZDA4NjAwMTg2NzAxMjQyZTE5YWQ5YTYxN2ZiOTVkY2Y4ODQzYWRlNjZlMDZlNTc4ZjU0OWE4YmU1NGYwMTZhYjc0ODEyN2FiMWExODQ2MjZjYmE0NGM3NDhhMWVlMDAwMDAwMDI0ZjE5NGQ4ZTA2NmIxMWRmZTkyZjU5M2NmYTVjMmZhMWFlNDUwOTI3ZWNkNWIwOTM5NTJlNjE4MzRmNGQ4YWE0MDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDUwMDAwMDAwMDIzYTRjMTgwMDAwMDAwMDMwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDE0ZjE5NGQ4ZTA2NmIxMWRmZTkyZjU5M2NmYTVjMmZhMWFlNDUwOTI3ZWNkNWIwOTM5NTJlNjE4MzRmNGQ4YWE0MDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDUwMDAwMDAwMDIzYTRjMTgwMDAwMDAwMDMwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDk0YThiODE3OWYwYjZlN2U3Y2U1NWI0ZDZlYzVhZDU2ZGFlMWRlOWYwMDAwMDAwMDYyYmIwM2U2MDAwMDAwMDA2MmUzMjU1NjAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWM4Zjk1NDIzZjcxNDJkMDBhNDhlMTAxNGEzZGU4ZDI4OTA3ZDQyMGRjMzNiMzA1MmE2ZGVlMDNhM2YyOTQxYTM5M2MyMzUxZTM1NDcwNGNhNjZhM2ZjMjk4NzAyODJlMTU4NmEzYWI0YzQ1Y2ZlMzFjYWUzNGMxZDA2ZjIxMjQzNGFjNzFiMWJlNmNmZTA0NmM4MGMxNjJlMDU3NjE0YTk0YTViYzlmMWRlZDFhNzAyOWRlYjBiYTRjYTdjOWI3MTQxMWUyOTM0Mzg2OTFiZTc5YzJkYmYxOWQxY2E3YzNlYWRiOWM3NTYyNDZmYzVkZTViN2I4OTUxMWM3ZDczMDJhZTA1MWQ5ZTAzZDc5OTExMzgyOTliNWVkNmE1NzBhOTgwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNzAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwM2FjMDNjMGNhNzFhMWRkZTg0NzAyZDI3MmZiZGQwODYwMDE4NjcwMTI0MmUxOWFkOWE2MTdmYjk1ZGNmODg0M2FkZTY2ZTA2ZTU3OGY1NDlhOGJlNTRmMDE2YWI3NDgxMjdhYjFhMTg0NjI2Y2JhNDRjNzQ4YTFlZTAwMDAwMDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDNhYzAzYzBjYTcxYTFkZGU4NDcwMmQyNzJmYmRkMDg2MDAxODY3MDEyNDJlMTlhZDlhNjE3ZmI5NWRjZjg4NDNhZGU2NmUwNmU1NzhmNTQ5YThiZTU0ZjAxNmFiNzQ4MTI3YWIxYTE4NDYyNmNiYTQ0Yzc0OGExZWUwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzYWMwM2MwY2E3MWExZGRlODQ3MDJkMjcyZmJkZDA4NjAwMTg2NzAxMjQyZTE5YWQ5YTYxN2ZiOTVkY2Y4ODQzYWRlNjZlMDZlNTc4ZjU0OWE4YmU1NGYwMTZhYjc0ODEyN2FiMWExODQ2MjZjYmE0NGM3NDhhMWVlMDAwMzBkNDAwMDAwMDAwMjAwMDAwMDA5MDAwMDAwMDJiNjMxZTk1NTNhODcyMTk3OGJmZmVkM2U3NzhkZTdlYjkwNGUxNjc1OTljMWQyNmQ1YThkM2M0NjE1OGRmNjYxMTY0YzZjYTYwMjlmMjQ5ODgwMjBjY2ZjZDY3M2U1YzE5ODE3ZmY3NGQwMTI2NTFmMjQ1ZDAwOWE3NDk1OTExNjAxNzBlYWU3M2Q3ZTE5YjA0NTY3MWQ0MTA1MGIxMTc5MTY0MzU2N2QxYmM5Y2M1MWZhMjI2ZDJiZTk1YTY1Njg5ZjE5Y2RhMDZhMjQyYTk3NDlmNmExNTBmY2MyYTViNTBhZjEyYTFiYzM1NjRkMWI3NmFjMWUzODI2YjVlMjEzNjEwMTAwMDAwMDA5MDAwMDAwMDJiNjMxZTk1NTNhODcyMTk3OGJmZmVkM2U3NzhkZTdlYjkwNGUxNjc1OTljMWQyNmQ1YThkM2M0NjE1OGRmNjYxMTY0YzZjYTYwMjlmMjQ5ODgwMjBjY2ZjZDY3M2U1YzE5ODE3ZmY3NGQwMTI2NTFmMjQ1ZDAwOWE3NDk1OTExNjAxNzBlYWU3M2Q3ZTE5YjA0NTY3MWQ0MTA1MGIxMTc5MTY0MzU2N2QxYmM5Y2M1MWZhMjI2ZDJiZTk1YTY1Njg5ZjE5Y2RhMDZhMjQyYTk3NDlmNmExNTBmY2MyYTViNTBhZjEyYTFiYzM1NjRkMWI3NmFjMWUzODI2YjVlMjEzNjEwMSdcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm5vZGVJRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW5zIGEgU2lnbmVkIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHggYW5kIG9yZGVyIGlucHV0cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgnYXZheHAnKSkuZnJvbShcbiAgICAgICAgLy8gaHR0cHM6Ly90ZXN0bmV0LnNub3d0cmFjZS5pby9wdm0vdHgvMnR0M0tFNmdBRzdxcE1MTDZ4b3luU3lrN2h0NGVnUTc0d2NGN0F1R20yNXZRM1FOV0I/Y2hhaW5JZD00MzExM1xuICAgICAgICAnMHgwMDAwMDAwMDAwMTkwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIxZTY3MzE3Y2JjNGJlMmFlYjAwNjc3YWQ2NDYyNzc4YThmNTIyNzRiOWQ2MDVkZjI1OTFiMjMwMjdhODdkZmYwMDAwMDAwNzAwMDAwMDAwNzczNTk0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzkzY2E5M2U0Y2IzYjZjMTBkMTY3ZDQxZmJhYmViOGU5NGVkMmRlYjVkYzc4NzMyM2Q3MjJmZjQwZmRmZTU2MDQwZmI5OGY3YWVlMjA3NWVmZjRkZDdhMzY4ZGRiNmVmNzEzMmJmZjY5M2NiZmQ5YmEzMGYxN2MxODAwMDAwMDA0NmY4YmRjM2M4OTNlZGQyYzdmMjRhNjE5MGQ2MjMzZmRhNWNjZjUxN2Q5NmRkNmMwOGQxMzQxNzlhYmIyZDE0ZTAwMDAwMDAwMjFlNjczMTdjYmM0YmUyYWViMDA2NzdhZDY0NjI3NzhhOGY1MjI3NGI5ZDYwNWRmMjU5MWIyMzAyN2E4N2RmZjAwMDAwMDA1MDAwMDAwNDcwMzZhYWEwMDAwMDAwMDAyMDAwMDAwMDEwMDAwMDAwMjg2NWNjODU2OGI5YzRjN2QzNmJiOTZlMDg2NjE5ZDhjODUyMThkNjUzZmY1NmQwNTEzMzRmODM5ZTU4OTc3YzMwMDAwMDAwMjIxZTY3MzE3Y2JjNGJlMmFlYjAwNjc3YWQ2NDYyNzc4YThmNTIyNzRiOWQ2MDVkZjI1OTFiMjMwMjdhODdkZmYwMDAwMDAwNTAwMDAwMDAwNWZiNWQ1OTAwMDAwMDAwMjAwMDAwMDAxMDAwMDAwMDI4NjVjYzg1NjhiOWM0YzdkMzZiYjk2ZTA4NjYxOWQ4Yzg1MjE4ZDY1M2ZmNTZkMDUxMzM0ZjgzOWU1ODk3N2MzMDAwMDAwMDEyMWU2NzMxN2NiYzRiZTJhZWIwMDY3N2FkNjQ2Mjc3OGE4ZjUyMjc0YjlkNjA1ZGYyNTkxYjIzMDI3YTg3ZGZmMDAwMDAwMDUwMDAwMDAwN2FlNjFlMzc4MDAwMDAwMDIwMDAwMDAwMTAwMDAwMDAyODY1Y2M4NTY4YjljNGM3ZDM2YmI5NmUwODY2MTlkOGM4NTIxOGQ2NTNmZjU2ZDA1MTMzNGY4MzllNTg5NzdjMzAwMDAwMDAwMjFlNjczMTdjYmM0YmUyYWViMDA2NzdhZDY0NjI3NzhhOGY1MjI3NGI5ZDYwNWRmMjU5MWIyMzAyN2E4N2RmZjAwMDAwMDA1MDAwMDAzZmZiNmRiM2Y2OTAwMDAwMDAyMDAwMDAwMDEwMDAwMDAwMjAwMDAwMDAwOTUzY2M5NWU4NGYyOWRjNmVlNzU4OWVmNmFjYjAxYzlkNTYxY2JhMzAwMDAwMDAwNjYxNmM2NzUwMDAwMDAwMDY2NTYwZTc1MDAwMDA0NGU1MTI4MGU3MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxY2E3YTJmMjljYTU4MGM0MjU0ZTNiZWFiY2UyMDQ3ZTA0ZWE4YzNjN2M2OWE1ODE3YjU0NjFjMjIzOTU5MzU2MWEzODQzYmM3Y2IxNDU3NjM5MDM3OGIxNDUxMzUzMDE0NzhmZjhjYjVhNjUxZTNkMDgyZmQ2Y2QxZTE3NzdlZGVhYmQ1YjA5MjRjYTY0OGYzODkwZDgyZWJkNjI1OWIzY2NhMDBlMzBmYWEyNDk0ODJmZWYxMDI5M2Y0MmUyOGFmYjE1ZjBhNWRkM2YzN2U1NTI0Y2Q1ZGUzZjNjMmI5MDlkZjQ5ODczYjgxOTZhZjYwMDA0ZDNmM2E4NGJhYTQ2YmEwOGRmN2JhZjhlNDg2YjBiNzlhOWMyMDcwOTVlMWE0MzAwMDAwMDAxMjFlNjczMTdjYmM0YmUyYWViMDA2NzdhZDY0NjI3NzhhOGY1MjI3NGI5ZDYwNWRmMjU5MWIyMzAyN2E4N2RmZjAwMDAwMDA3MDAwMDA0NGU1MTI4MGU3MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzOTNjYTkzZTRjYjNiNmMxMGQxNjdkNDFmYmFiZWI4ZTk0ZWQyZGViNWRjNzg3MzIzZDcyMmZmNDBmZGZlNTYwNDBmYjk4ZjdhZWUyMDc1ZWZmNGRkN2EzNjhkZGI2ZWY3MTMyYmZmNjkzY2JmZDliYTMwZjE3YzE4MDAwMDAwMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzkzY2E5M2U0Y2IzYjZjMTBkMTY3ZDQxZmJhYmViOGU5NGVkMmRlYjVkYzc4NzMyM2Q3MjJmZjQwZmRmZTU2MDQwZmI5OGY3YWVlMjA3NWVmZjRkZDdhMzY4ZGRiNmVmNzEzMmJmZjY5M2NiZmQ5YmEzMGYxN2MxODAwMDAwMDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM5M2NhOTNlNGNiM2I2YzEwZDE2N2Q0MWZiYWJlYjhlOTRlZDJkZWI1ZGM3ODczMjNkNzIyZmY0MGZkZmU1NjA0MGZiOThmN2FlZTIwNzVlZmY0ZGQ3YTM2OGRkYjZlZjcxMzJiZmY2OTNjYmZkOWJhMzBmMTdjMTgwMDAwNGUyMDAwMDAwMDA0MDAwMDAwMDkwMDAwMDAwMjA4MzA0ZTg4NDFhYjk2MTY5ZWEyYjI4ZGMzNThkZjM1OTQ1MjNiM2NlODc1OTNmMWY1NzliNTFiN2JmYjg0NGQ0OWQ2OTBmNzFlZGI0ZTY1MzBiODgwMDQzNmE0ZWY3MzU3MDQ2YTIxNTVjNWI1MmMxNTQxNGFlNzZjYTk1NmM4MDA3YmJkOGRiZWE5MDcxYzFiZjE3ODhmODUzNDcyZTA4MzYyYjFhZmFkYzlkMGE0NDEyYjEzYjBlYTQzYjcwM2UwMTBkZjEyMDRkODhjNmZlMDQ4NDE0MGIxYmI5MWZkYmY3YTAzMmQyNjI0NzVhNDE5ZjgwODI5NDExYTA0MTE0MDAxMDAwMDAwMDkwMDAwMDAwMjA4MzA0ZTg4NDFhYjk2MTY5ZWEyYjI4ZGMzNThkZjM1OTQ1MjNiM2NlODc1OTNmMWY1NzliNTFiN2JmYjg0NGQ0OWQ2OTBmNzFlZGI0ZTY1MzBiODgwMDQzNmE0ZWY3MzU3MDQ2YTIxNTVjNWI1MmMxNTQxNGFlNzZjYTk1NmM4MDA3YmJkOGRiZWE5MDcxYzFiZjE3ODhmODUzNDcyZTA4MzYyYjFhZmFkYzlkMGE0NDEyYjEzYjBlYTQzYjcwM2UwMTBkZjEyMDRkODhjNmZlMDQ4NDE0MGIxYmI5MWZkYmY3YTAzMmQyNjI0NzVhNDE5ZjgwODI5NDExYTA0MTE0MDAxMDAwMDAwMDkwMDAwMDAwMjA4MzA0ZTg4NDFhYjk2MTY5ZWEyYjI4ZGMzNThkZjM1OTQ1MjNiM2NlODc1OTNmMWY1NzliNTFiN2JmYjg0NGQ0OWQ2OTBmNzFlZGI0ZTY1MzBiODgwMDQzNmE0ZWY3MzU3MDQ2YTIxNTVjNWI1MmMxNTQxNGFlNzZjYTk1NmM4MDA3YmJkOGRiZWE5MDcxYzFiZjE3ODhmODUzNDcyZTA4MzYyYjFhZmFkYzlkMGE0NDEyYjEzYjBlYTQzYjcwM2UwMTBkZjEyMDRkODhjNmZlMDQ4NDE0MGIxYmI5MWZkYmY3YTAzMmQyNjI0NzVhNDE5ZjgwODI5NDExYTA0MTE0MDAxMDAwMDAwMDkwMDAwMDAwMjA4MzA0ZTg4NDFhYjk2MTY5ZWEyYjI4ZGMzNThkZjM1OTQ1MjNiM2NlODc1OTNmMWY1NzliNTFiN2JmYjg0NGQ0OWQ2OTBmNzFlZGI0ZTY1MzBiODgwMDQzNmE0ZWY3MzU3MDQ2YTIxNTVjNWI1MmMxNTQxNGFlNzZjYTk1NmM4MDA3YmJkOGRiZWE5MDcxYzFiZjE3ODhmODUzNDcyZTA4MzYyYjFhZmFkYzlkMGE0NDEyYjEzYjBlYTQzYjcwM2UwMTBkZjEyMDRkODhjNmZlMDQ4NDE0MGIxYmI5MWZkYmY3YTAzMmQyNjI0NzVhNDE5ZjgwODI5NDExYTA0MTE0MDAxMjdlZmVjMDQnXG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1swXS5pZC5zaG91bGQuZXF1YWwoJ3I4SlVVWUZ2OU5XY05lNWN4TUZkQlJqcWtMNkZaZXdEZjJHdGt0dG14V0NkZUZGTUs6MCcpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1sxXS5pZC5zaG91bGQuZXF1YWwoJzIyQjdHSDdmRGFyQnF5dzhXN2F0QzhFRDNldVZuZWZUaUVXQlBCbWFTWHJBaEFRNExrOjAnKTtcbiAgICAgIHR4RXhwbGFpbi5pbnB1dHNbMl0uaWQuc2hvdWxkLmVxdWFsKCcyMkI3R0g3ZkRhckJxeXc4VzdhdEM4RUQzZXVWbmVmVGlFV0JQQm1hU1hyQWhBUTRMazoxJyk7XG4gICAgICB0eEV4cGxhaW4uaW5wdXRzWzNdLmlkLnNob3VsZC5lcXVhbCgnMjJCN0dIN2ZEYXJCcXl3OFc3YXRDOEVEM2V1Vm5lZlRpRVdCUEJtYVNYckFoQVE0TGs6MicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWlucyBhIFNpZ25lZCBBZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4IGZyb20gcmF3JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb2xkSGV4ID1cbiAgICAgICAgJzB4MDAwMDAwMDAwMDE5MDAwMDAwMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDBiOWY3NmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM0MmUxOWFkOWE2MTdmYjk1ZGNmODg0M2FkZTY2ZTA2ZTU3OGY1NDlhOGJlNTRmMDE2YWI3NDgxMjdhYjFhMTg0NjI2Y2JhNDRjNzQ4YTFlZWFjMDNjMGNhNzFhMWRkZTg0NzAyZDI3MmZiZGQwODYwMDE4NjcwMTIwMDAwMDAwMjRmMTk0ZDhlMDY2YjExZGZlOTJmNTkzY2ZhNWMyZmExYWU0NTA5MjdlY2Q1YjA5Mzk1MmU2MTgzNGY0ZDhhYTQwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNTAwMDAwMDAwMjNhNGMxODAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDE0ZjE5NGQ4ZTA2NmIxMWRmZTkyZjU5M2NmYTVjMmZhMWFlNDUwOTI3ZWNkNWIwOTM5NTJlNjE4MzRmNGQ4YWE0MDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDUwMDAwMDAwMDIzYTRjMTgwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDA5NGE4YjgxNzlmMGI2ZTdlN2NlNTViNGQ2ZWM1YWQ1NmRhZTFkZTlmMDAwMDAwMDA2MmJiMDNlNjAwMDAwMDAwNjJlMzI1NTYwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFjOGY5NTQyM2Y3MTQyZDAwYTQ4ZTEwMTRhM2RlOGQyODkwN2Q0MjBkYzMzYjMwNTJhNmRlZTAzYTNmMjk0MWEzOTNjMjM1MWUzNTQ3MDRjYTY2YTNmYzI5ODcwMjgyZTE1ODZhM2FiNGM0NWNmZTMxY2FlMzRjMWQwNmYyMTI0MzRhYzcxYjFiZTZjZmUwNDZjODBjMTYyZTA1NzYxNGE5NGE1YmM5ZjFkZWQxYTcwMjlkZWIwYmE0Y2E3YzliNzE0MTFlMjkzNDM4NjkxYmU3OWMyZGJmMTlkMWNhN2MzZWFkYjljNzU2MjQ2ZmM1ZGU1YjdiODk1MTFjN2Q3MzAyYWUwNTFkOWUwM2Q3OTkxMTM4Mjk5YjVlZDZhNTcwYTk4MDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM0MmUxOWFkOWE2MTdmYjk1ZGNmODg0M2FkZTY2ZTA2ZTU3OGY1NDlhOGJlNTRmMDE2YWI3NDgxMjdhYjFhMTg0NjI2Y2JhNDRjNzQ4YTFlZWFjMDNjMGNhNzFhMWRkZTg0NzAyZDI3MmZiZGQwODYwMDE4NjcwMTIwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzNDJlMTlhZDlhNjE3ZmI5NWRjZjg4NDNhZGU2NmUwNmU1NzhmNTQ5YThiZTU0ZjAxNmFiNzQ4MTI3YWIxYTE4NDYyNmNiYTQ0Yzc0OGExZWVhYzAzYzBjYTcxYTFkZGU4NDcwMmQyNzJmYmRkMDg2MDAxODY3MDEyMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzQyZTE5YWQ5YTYxN2ZiOTVkY2Y4ODQzYWRlNjZlMDZlNTc4ZjU0OWE4YmU1NGYwMTZhYjc0ODEyN2FiMWExODQ2MjZjYmE0NGM3NDhhMWVlYWMwM2MwY2E3MWExZGRlODQ3MDJkMjcyZmJkZDA4NjAwMTg2NzAxMjAwMDA0ZTIwMDAwMDAwMDIwMDAwMDAwOTAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhiZTU0ZjAxNmFiNzQ4MTI3YWIxYTE4NDYyNmNiYTQ0Yzc0OGExZWUwMDAwMDAwOTAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhiZTU0ZjAxNmFiNzQ4MTI3YWIxYTE4NDYyNmNiYTQ0Yzc0OGExZWU5NjQ4ODhkNCc7XG4gICAgICBjb25zdCBzb3J0ZWRCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShvbGRIZXgpO1xuICAgICAgY29uc3Qgc29ydGVkVHggPSBhd2FpdCBzb3J0ZWRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSBzb3J0ZWRUeC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIC8vIHRoaXMgdHggaXMgc29ydGVkIGFuZCBjYW4gYmUgYnJvYWRjYXN0ZWRcbiAgICAgIGNvbnN0IG5ld0hleCA9IHNvcnRlZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBhc3NlcnQobmV3SGV4ID09PSBvbGRIZXgpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubWluVmFsaWRhdG9yU3Rha2UpO1xuICAgICAgdHhFeHBsYWluLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcik7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnTm9kZUlELUVaMzhDY1dIb1N5b0VmQWtETjl6YWllSjVZcTY0WWVQWScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHggd2l0aCAxIGlucHV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgJzB4MDAwMDAwMDAwMDE5MDAwMDAwMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDMyYTAwODM5NTUwZjc1ZWU4ODc5Y2FjZDk3ZmYzNTBhNTFkNDdhZTE0ZGI5NDMzNWYyZjY2OGI5NzA3Yzc4OTAzYzNiNWFjNTRjNmY0MDU0NzgzYzRhNmVjZDViMThmYTA3NjkyZDM1ZWU0YzNmOGI3NGQ0MjU3MjEwMDAwMDAwMTRmMTk0ZDhlMDY2YjExZGZlOTJmNTkzY2ZhNWMyZmExYWU0NTA5MjdlY2Q1YjA5Mzk1MmU2MTgzNGY0ZDhhYTQwMDAwMDAwMDNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNTAwMDAwMDAwNzczNTk0MDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMGUyNWM5YTA5ZWI5YzY4ZDQ4MDdhMzlmOTc4OTNmYWNkOWE2YTdkYTEwMDAwMDAwMDY2MGQ3NTA5MDAwMDAwMDA2NjBlYzY4OTAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWM4Zjk1NDIzZjcxNDJkMDBhNDhlMTAxNGEzZGU4ZDI4OTA3ZDQyMGRjMzNiMzA1MmE2ZGVlMDNhM2YyOTQxYTM5M2MyMzUxZTM1NDcwNGNhNjZhM2ZjMjk4NzAyODJlMTU4NmEzYWI0YzQ1Y2ZlMzFjYWUzNGMxZDA2ZjIxMjQzNGFjNzFiMWJlNmNmZTA0NmM4MGMxNjJlMDU3NjE0YTk0YTViYzlmMWRlZDFhNzAyOWRlYjBiYTRjYTdjOWI3MTQxMWUyOTM0Mzg2OTFiZTc5YzJkYmYxOWQxY2E3YzNlYWRiOWM3NTYyNDZmYzVkZTViN2I4OTUxMWM3ZDczMDJhZTA1MWQ5ZTAzZDc5OTExMzgyOTliNWVkNmE1NzBhOTgwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNzAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzJhMDA4Mzk1NTBmNzVlZTg4NzljYWNkOTdmZjM1MGE1MWQ0N2FlMTRkYjk0MzM1ZjJmNjY4Yjk3MDdjNzg5MDNjM2I1YWM1NGM2ZjQwNTQ3ODNjNGE2ZWNkNWIxOGZhMDc2OTJkMzVlZTRjM2Y4Yjc0ZDQyNTcyMTAwMDAwMDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDMyYTAwODM5NTUwZjc1ZWU4ODc5Y2FjZDk3ZmYzNTBhNTFkNDdhZTE0ZGI5NDMzNWYyZjY2OGI5NzA3Yzc4OTAzYzNiNWFjNTRjNmY0MDU0NzgzYzRhNmVjZDViMThmYTA3NjkyZDM1ZWU0YzNmOGI3NGQ0MjU3MjEwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzMmEwMDgzOTU1MGY3NWVlODg3OWNhY2Q5N2ZmMzUwYTUxZDQ3YWUxNGRiOTQzMzVmMmY2NjhiOTcwN2M3ODkwM2MzYjVhYzU0YzZmNDA1NDc4M2M0YTZlY2Q1YjE4ZmEwNzY5MmQzNWVlNGMzZjhiNzRkNDI1NzIxMDAwMzBkNDAwMDAwMDAwMTAwMDAwMDA5MDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBkYjk0MzM1ZjJmNjY4Yjk3MDdjNzg5MDNjM2I1YWM1NGM2ZjQwNTQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNjNTU0M2IwJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ05vZGVJRC1NZHRlUzlVOTg3UFk3aXdBNVBjejNzS1ZwckpBYkF2RTcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbnMgYSBIYWxmIFNpZ25lZCBBZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm5vZGVJRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW5zIGEgdW5zaWduZWQgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcik7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbiBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnYnVpbGQgYW5kIHNpZ24gYW4gQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IgdHJhbnNhY3Rpb24gYW5kIGJyb2FkY2FzdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8qXG5cbiAgICBjb25zdCBrZXlNYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgZjQ1ZDFjOWJmNTdkM2MwMjI5OWE3MjdkNmU1ZDhkNGU3NjQ5ODg0NmIxYTI4OWI0ZTMxYTJlY2NjYmMyMTJmYjoge1xuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jb2RlZDogJ0JoakV6YVhNU0ZqNGFRQmh3MjdEc243M2I4clI5Z0NUWCcsXG4gICAgICAgIHB1YjogJzAyYWJiNDUxYzBjYzI0MGU5YTRmYjk3YTEzMDg0NmQ5MGE4NzI0NzI2NGU1NzAxNGU0MWRjMjI2ZWJmNDk2NTcyNCcsXG4gICAgICAgIHBydjogJ2Y0NWQxYzliZjU3ZDNjMDIyOTlhNzI3ZDZlNWQ4ZDRlNzY0OTg4NDZiMWEyODliNGUzMWEyZWNjY2JjMjEyZmInLFxuICAgICAgICBhZGRyZXNzOiAnUC1mdWppMXc0ampzNHFmdWdxMG0zbnUwZDNodHg2NjYyZGxxODd6cTVuejMzJyxcbiAgICAgIH0sXG4gICAgICAnMmUwZmZlNmVmYmZjYzI3ZTlhYWY0YmNlNmFmNzhkNGM2NmU4OWIwOTU1Yjg1ZjAyZDdlMTU5MTBlMTZlZDRjZCc6IHtcbiAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAgZW5jb2RlZDogJ0JGelBKTmlmcWRmNlo4SDJQNzZnVEViZDhSbUNqTVN6TCcsXG4gICAgICAgIHB1YjogJzAyNTUyM2ZhNDhhNWIwYzhlZDRhODM0NGFhYjgzOTYwNjFmYjQyY2I0ZjE2OGJhNWQzYWUxOWYwMzRjNGVhMmQ0ZCcsXG4gICAgICAgIHBydjogJzJlMGZmZTZlZmJmY2MyN2U5YWFmNGJjZTZhZjc4ZDRjNjZlODliMDk1NWI4NWYwMmQ3ZTE1OTEwZTE2ZWQ0Y2QnLFxuICAgICAgICBhZGRyZXNzOiAnUC1mdWppMXd6cjBoc204emxyNmdwYWFreHZ0NjdmOTk5bmowNDRldGUwN3V3JyxcbiAgICAgIH0sXG4gICAgICAnNWEzNjBjODQ4MDIxMDI0NTI4ZGZjMDJlNzliYTQ0MWYxNzI3Yzc2NWI0ZDBkY2VjMjg4ZmZiZDI3NzJjZDQzMic6IHtcbiAgICAgICAgc291cmNlOiAnYml0Z28nLFxuICAgICAgICBlbmNvZGVkOiAnSFQ2em9TZWNZeXFKWDYzSHFhajF1c3Z5cUpicm5jOGlhJyxcbiAgICAgICAgcHViOiAnMDNkNzFjZGEzYjFjMzJlZWQwNDQ4NjZlYzk2YzJhYzU0YWY0M2U3ZWRiOGYxNTM1ZGY1MWYzNDFlNDk2NzRmZmFhJyxcbiAgICAgICAgcHJ2OiAnNWEzNjBjODQ4MDIxMDI0NTI4ZGZjMDJlNzliYTQ0MWYxNzI3Yzc2NWI0ZDBkY2VjMjg4ZmZiZDI3NzJjZDQzMicsXG4gICAgICAgIGFkZHJlc3M6ICdQLWZ1amkxazNjYTJuamN1bnpsNGhoeHkyNGF2Y2E3aHRmNjZjbWpqdWtsMG4nLFxuICAgICAgfSxcbiAgICB9O1xuICAgICAgICovXG4gICAgICBjb25zdCB1bml4Tm93ID0gQmlnSW50KE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKSk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSB1bml4Tm93ICsgQmlnSW50KDYwKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBzdGFydFRpbWUgKyBCaWdJbnQoNjAgKiA2MCAqIDI0ICsgNjAwKTsgLy8gMjQgaG91cnMgKyAxMCBtaW51dGVzXG5cbiAgICAgIC8vIGNvbnN0IEFWQVhfUFVCTElDX1VSTCA9ICdodHRwczovL2FwaS5hdmF4LXRlc3QubmV0d29yayc7XG4gICAgICAvLyBjb25zdCBwdm1hcGkgPSBuZXcgcHZtLlBWTUFwaShBVkFYX1BVQkxJQ19VUkwpO1xuICAgICAgLy8gY29uc3QgeyB1dHhvcyB9ID0gYXdhaXQgcHZtYXBpLmdldFVUWE9zKHtcbiAgICAgIC8vICAgYWRkcmVzc2VzOiB0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5iaXRnb0FkZHJlc3NlcyxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gY29uc29sZS5sb2codXR4b3MpO1xuXG4gICAgICBjb25zdCByZWNvdmVyeU1vZGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBdmF4cExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUubG9ja3RpbWUpXG4gICAgICAgIC5yZWNvdmVyTW9kZShyZWNvdmVyeU1vZGUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmJpdGdvQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHN0YXJ0VGltZS50b1N0cmluZygpKVxuICAgICAgICAuZW5kVGltZShlbmRUaW1lLnRvU3RyaW5nKCkpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5zdGFrZUFtb3VudClcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmRlbGVnYXRpb25GZWVSYXRlKVxuICAgICAgICAubm9kZUlEKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLm5vZGVJZClcbiAgICAgICAgLmJsc1B1YmxpY0tleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5ibHNQdWJsaWNLZXkpXG4gICAgICAgIC5ibHNTaWduYXR1cmUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYmxzU2lnbmF0dXJlKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudXR4b3MpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBhc3NlcnQodHhFeHBsYWluLm91dHB1dEFtb3VudCA9PT0gdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuc3Rha2VBbW91bnQpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1swXS5pZC5zaG91bGQuZXF1YWwoJ1d5allKSGE3WWUxS01zQlppUThoUUp6WTdZWXhUSlRUeU1reGNWcktSRGlOeXRUWTg6MCcpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1sxXS5pZC5zaG91bGQuZXF1YWwoJ1d5allKSGE3WWUxS01zQlppUThoUUp6WTdZWXhUSlRUeU1reGNWcktSRGlOeXRUWTg6MScpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1syXS5pZC5zaG91bGQuZXF1YWwoJ3M5MlNqb1pRZW1nRzk3SG9jWDlHZ3lGeTZaS21hcGdjZ3FRM3k1SjJ1d1AzcVdCVXk6MCcpO1xuICAgICAgdHhFeHBsYWluLmZlZS5mZWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQodHhKc29uLm91dHB1dHNbMF0udmFsdWUgPT09IHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnN0YWtlQW1vdW50KTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcik7XG4gICAgICBjb25zb2xlLmxvZyh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpXG4gICAgICAgIC5yZWNvdmVyTW9kZShmYWxzZSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICB0eDIudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yKTtcbiAgICAgIC8vIFRlc3Qgc2lnbiB3aXRoIHVzZXIga2V5XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnVzZXJQcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeEhleCA9IGhhbGZTaWduZWQudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydCh0eEJ1aWxkZXJbJ19zdGFrZUFtb3VudCddID09PSB0eEJ1aWxkZXIyWydfc3Rha2VBbW91bnQnXSk7XG4gICAgICBjb25zb2xlLmxvZyhoYWxmU2lnbmVkVHhIZXgpO1xuXG4gICAgICAvLyBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5mcm9tKGhhbGZTaWduZWRUeEhleCk7XG4gICAgICAvLyB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmJhY2t1cFByaXZhdGVLZXkgfSk7XG4gICAgICAvLyBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhmdWxsU2lnbmVkVHgudG9Kc29uKCkpO1xuXG4gICAgICAvLyBjb25zdCByZXMgPSBhd2FpdCBwdm1hcGkuaXNzdWVUeCh7IHR4OiBmdWxsU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSB9KTtcbiAgICAgIC8vIGNvbnN0IHR4U2lnbmVkID1cbiAgICAgIC8vICAgJzB4MDAwMDAwMDAwMDE5MDAwMDAwMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDA1YzgxYTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM3MDg2ZmJjMzY3MTdjN2E0MDdiZGIxOThiZDc5MjUyOTY3MjdkNmI5NzU2NTI4NTQwOWUyMDBmZGM2N2M3YjYzNzU5YjVhZDI5YmYwMWZjMmI0NzFkNTRlNThlNGM1ZmFkZWU2MjJhYmQ2NjNiZWJhZDNhZDYzNzIwMDAwMDAwMjQ0MTFhZjlkOTg3N2M1MmMxYmUzZjc3ODI1YTc0Y2ExMTg2OTEyODQ3OGM0MTQ1OTEwZTkyNjk1YTI0YzdkODAwMDAwMDAwMTNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwNTAwMDAwMDAwM2I5YWNhMDAwMDAwMDAwMjAwMDAwMDAxMDAwMDAwMDI3MWQ4NjQ0YzkxOTllMzBiOWZlZjUzYWY1NmFlZjI0M2U1NDMxYzZiMWIwOWQ1ZjExYTY2MjJjODZkYjNmMzlkMDAwMDAwMDAzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDUwMDAwMDAwMDA1YzgxYTQwMDAwMDAwMDIwMDAwMDAwMTAwMDAwMDAyMDAwMDAwMDAxMjlhMjcxZmY0MDdiMTEwMWYzNWFlYzgyYTJmNzE1YzUyMzliZDM5MDAwMDAwMDA2NjBmNGFiNTAwMDAwMDAwNjYxMDllOGQwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFjYWQ5ZTk0NzZiNzAxZWRlYzg4ZTUzYjFjMzE0NDU2MDUzYjNjZjg0NmExMTkyMTE3ODcyZTQxNDU1ZjQ0MGMwNzRkNmVlODk1MzBkNDVlODhmNzlhYzBlZGEwNmYyODg3YTk0ZDYxODJlZGJkOTUzNTE2YjI2MmYxNzU2NWE2NWQ5OGY1NzQxNTQ5Y2Q3MGQyNDIzYWJmZjc1MGJiNGI4ZDk4MmQ0ODIzNzZiMTg5MTQyZmY4YWE0NzA1NjE1ZmVlMTRiZTYxNzQ2MTA4NjBlOWMwMDNhYTRhZWFhNjEzYjE3MzJhYmYzY2QwYzljNDJmYTU4NTYzNDU2NDQwNjhjMGQxZjlmYTFkOWFmMzJlMjBiMTRmY2EwMjk4MzI2MGJjMDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDNiOWFjYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM3MDg2ZmJjMzY3MTdjN2E0MDdiZGIxOThiZDc5MjUyOTY3MjdkNmI5NzU2NTI4NTQwOWUyMDBmZGM2N2M3YjYzNzU5YjVhZDI5YmYwMWZjMmI0NzFkNTRlNThlNGM1ZmFkZWU2MjJhYmQ2NjNiZWJhZDNhZDYzNzIwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzNzA4NmZiYzM2NzE3YzdhNDA3YmRiMTk4YmQ3OTI1Mjk2NzI3ZDZiOTc1NjUyODU0MDllMjAwZmRjNjdjN2I2Mzc1OWI1YWQyOWJmMDFmYzJiNDcxZDU0ZTU4ZTRjNWZhZGVlNjIyYWJkNjYzYmViYWQzYWQ2MzcyMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzcwODZmYmMzNjcxN2M3YTQwN2JkYjE5OGJkNzkyNTI5NjcyN2Q2Yjk3NTY1Mjg1NDA5ZTIwMGZkYzY3YzdiNjM3NTliNWFkMjliZjAxZmMyYjQ3MWQ1NGU1OGU0YzVmYWRlZTYyMmFiZDY2M2JlYmFkM2FkNjM3MjAwMDMwZDQwMDAwMDAwMDIwMDAwMDAwOTAwMDAwMDAyMjhhNTk0MjA5NzE5NTNhYTYxYjRiNGM5MGI5MzRlZjc2ZTZlOWM4YWQyNTZlOTQxN2U5YTZiNTAxN2Q4MzY4MTNiMmI1Y2FkMmE4OTBjNjZjODI5NWYxMDRkNzQxOTJjNDk2NGNmMjg5ZTJhNDVhZGI1N2E3YjA1YjVlOTUyOWUwMDRlYzJkYWU1YzQ4YmE2ZmE0ZDFlMGIxYzZiOWQ5YmJlNzljNDgxZmYxNjg0OGMxZmEzZmEzYTZlZDQ3NDMxYTEyYWY0YjJkOTc3OWJiMTkyYmIzZjI1NDQwODczMTc5OGI1MGM4ZjAzZjI1YjdlN2Q3MzEzNzM4ODkyZTcxZDY2MDEwMDAwMDAwOTAwMDAwMDAyMjhhNTk0MjA5NzE5NTNhYTYxYjRiNGM5MGI5MzRlZjc2ZTZlOWM4YWQyNTZlOTQxN2U5YTZiNTAxN2Q4MzY4MTNiMmI1Y2FkMmE4OTBjNjZjODI5NWYxMDRkNzQxOTJjNDk2NGNmMjg5ZTJhNDVhZGI1N2E3YjA1YjVlOTUyOWUwMDRlYzJkYWU1YzQ4YmE2ZmE0ZDFlMGIxYzZiOWQ5YmJlNzljNDgxZmYxNjg0OGMxZmEzZmEzYTZlZDQ3NDMxYTEyYWY0YjJkOTc3OWJiMTkyYmIzZjI1NDQwODczMTc5OGI1MGM4ZjAzZjI1YjdlN2Q3MzEzNzM4ODkyZTcxZDY2MDE1MWFhMjkxZic7XG4gICAgICAvLyBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKHR4KTtcbiAgICAgIC8vIGNvbnN0IGRlY29kZSA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgLy8gY29uc29sZS5sb2coZGVjb2RlLnRvSnNvbigpKTtcblxuICAgICAgLy8gY29uc3QgcmVzID0gYXdhaXQgcHZtYXBpLmlzc3VlVHgoeyB0eDogdHhTaWduZWQgfSk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhyZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuZCBzaWduIGFuIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3ZlcnlNb2RlID0gZmFsc2U7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQXZheHBMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0UGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5sb2NrdGltZSlcbiAgICAgICAgLnJlY292ZXJNb2RlKHJlY292ZXJ5TW9kZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5iaXRnb0FkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5lbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5zdGFrZUFtb3VudClcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUuZGVsZWdhdGlvbkZlZVJhdGUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5ub2RlSWQpXG4gICAgICAgIC5ibHNQdWJsaWNLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5ibHNQdWJsaWNLZXkpXG4gICAgICAgIC5ibHNTaWduYXR1cmUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5ibHNTaWduYXR1cmUpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnV0eG9zKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IpO1xuXG4gICAgICAvLyBUZXN0IHNpZ24gd2l0aCB1c2VyIGtleVxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUudXNlclByaXZhdGVLZXkgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5iYWNrdXBQcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zb2xlLmxvZyhmdWxsU2lnbmVkVHgudG9Kc29uKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuZCBzaWduIGEgdHJhbnNhY3Rpb24gaW4gcmVjb3ZlcnkgbW9kZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5TW9kZSA9IHRydWU7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQXZheHBMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0UGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5sb2NrdGltZSlcbiAgICAgICAgLnJlY292ZXJNb2RlKHJlY292ZXJ5TW9kZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5iaXRnb0FkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5lbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5zdGFrZUFtb3VudClcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19TQU1QTEUuZGVsZWdhdGlvbkZlZVJhdGUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5ub2RlSWQpXG4gICAgICAgIC5ibHNQdWJsaWNLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5ibHNQdWJsaWNLZXkpXG4gICAgICAgIC5ibHNTaWduYXR1cmUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5ibHNTaWduYXR1cmUpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLnV0eG9zKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGxldCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICB0eEhleC5zaG91bGQuZXF1YWwodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS51bnNpZ25lZFJhd3R4UmVjb3ZlcnkpO1xuXG4gICAgICBjb25zdCBwcml2YXRlS2V5ID0gcmVjb3ZlcnlNb2RlXG4gICAgICAgID8gdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS5iYWNrdXBQcml2YXRlS2V5XG4gICAgICAgIDogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1NBTVBMRS51c2VyUHJpdmF0ZUtleTtcblxuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogcHJpdmF0ZUtleSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgdHhIZXggPSAoaGFsZlNpZ25lZFRyYW5zYWN0aW9uIGFzIEhhbGZTaWduZWRBY2NvdW50VHJhbnNhY3Rpb24pPy5oYWxmU2lnbmVkPy50eEhleDtcbiAgICAgIHR4SGV4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfU0FNUExFLmhhbGZTaWduZWRSYXdUeFJlY292ZXJ5KTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhbmQgc2lnbiBhbiBBZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvciB0cmFuc2FjdGlvbiBhbmQgYnJvYWRjYXN0IGluIHJlY292ZXJ5IG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1bml4Tm93ID0gQmlnSW50KE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKSk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSB1bml4Tm93ICsgQmlnSW50KDYwKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBzdGFydFRpbWUgKyBCaWdJbnQoNjAgKiA2MCAqIDI0ICsgNjAwKTtcblxuICAgICAgY29uc3QgcmVjb3ZlcnlNb2RlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBdmF4cExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUubG9ja3RpbWUpXG4gICAgICAgIC5yZWNvdmVyTW9kZShyZWNvdmVyeU1vZGUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmJpdGdvQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHN0YXJ0VGltZS50b1N0cmluZygpKVxuICAgICAgICAuZW5kVGltZShlbmRUaW1lLnRvU3RyaW5nKCkpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5zdGFrZUFtb3VudClcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmRlbGVnYXRpb25GZWVSYXRlKVxuICAgICAgICAubm9kZUlEKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLm5vZGVJZClcbiAgICAgICAgLmJsc1B1YmxpY0tleSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5ibHNQdWJsaWNLZXkpXG4gICAgICAgIC5ibHNTaWduYXR1cmUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYmxzU2lnbmF0dXJlKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudXR4b3MpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcik7XG5cbiAgICAgIC8vIFRlc3Qgc2lnbiB3aXRoIHVzZXIga2V5XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYmFja3VwUHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWQgPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeEhleCA9IGhhbGZTaWduZWQudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZnJvbShoYWxmU2lnbmVkVHhIZXgpO1xuICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS51c2VyUHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnNvbGUubG9nKGZ1bGxTaWduZWRUeC50b0pzb24oKSk7XG4gICAgfSk7XG4gIH0pO1xuICBpdCgnU2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgdXR4b3MgY2hhbmdlIG91dHB1dCAwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVuaXhOb3cgPSBCaWdJbnQoTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSB1bml4Tm93ICsgQmlnSW50KDYwKTtcbiAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgQmlnSW50KDYwICogNjAgKiAyNCArIDYwMCk7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQXZheHBMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgLmdldFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyKClcbiAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudGhyZXNob2xkKVxuICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLmxvY2t0aW1lKVxuICAgICAgLnJlY292ZXJNb2RlKGZhbHNlKVxuICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYml0Z29BZGRyZXNzZXMpXG4gICAgICAuc3RhcnRUaW1lKHN0YXJ0VGltZS50b1N0cmluZygpKVxuICAgICAgLmVuZFRpbWUoZW5kVGltZS50b1N0cmluZygpKVxuICAgICAgLnN0YWtlQW1vdW50KHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLnN0YWtlQW1vdW50Tm9PdXRwdXQpXG4gICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuZGVsZWdhdGlvbkZlZVJhdGUpXG4gICAgICAubm9kZUlEKHRlc3REYXRhLkJVSUxEX0FORF9TSUdOX0FERF9QRVJNSVNTSU9OTEVTU19WQUxJREFUT1JfU0FNUExFLm5vZGVJZClcbiAgICAgIC5ibHNQdWJsaWNLZXkodGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUuYmxzUHVibGljS2V5KVxuICAgICAgLmJsc1NpZ25hdHVyZSh0ZXN0RGF0YS5CVUlMRF9BTkRfU0lHTl9BRERfUEVSTUlTU0lPTkxFU1NfVkFMSURBVE9SX1NBTVBMRS5ibHNTaWduYXR1cmUpXG4gICAgICAudXR4b3ModGVzdERhdGEuQlVJTERfQU5EX1NJR05fQUREX1BFUk1JU1NJT05MRVNTX1ZBTElEQVRPUl9TQU1QTEUudXR4b3MpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgY29uc3QgdHhFeHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgdHhKc29uLmNoYW5nZU91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eEV4cGxhaW4uY2hhbmdlT3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RXhwbGFpbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG4gIH0pO1xufSk7XG4iXX0=

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


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