PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-cspr/dist/test/unit/lib/transactionBuilder
Просмотр файла: walletInitialization.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const lib_1 = require("../../../../src/lib");
const testData = __importStar(require("../../../fixtures/resources"));
const sdk_core_1 = require("@bitgo/sdk-core");
const utils_1 = require("../../../../src/lib/utils");
const statics_1 = require("@bitgo/statics");
describe('CSPR Wallet initialization', () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
const owner2Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress();
const owner3Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress();
const owner4Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_4.publicKey }).getAddress();
const sourceAddress = new lib_1.KeyPair({ pub: testData.ROOT_ACCOUNT.publicKey }).getAddress();
const initSignedTxBuilder = () => {
const txBuilder = initUnsignedTxBuilder();
txBuilder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
return txBuilder;
};
const initSignedTxBuilderWithExtendedKey = () => {
const txBuilder = initUnsignedTxBuilder();
txBuilder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
return txBuilder;
};
const initUnsignedTxBuilder = () => {
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.fee(testData.FEE);
txBuilder.owner(owner1Address);
txBuilder.owner(owner2Address);
txBuilder.owner(owner3Address);
txBuilder.source({ address: sourceAddress });
return txBuilder;
};
describe('should build ', () => {
it('an init transaction', async () => {
const txBuilder = initSignedTxBuilder();
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.fee, testData.FEE);
should_1.default.deepEqual(tx.signature.length, 1);
should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
should_1.default.equal(txJson.from, sourceAddress);
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
});
it('an init transaction using extended key to sign', async () => {
const txBuilder = initSignedTxBuilderWithExtendedKey();
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.fee, testData.FEE);
should_1.default.deepEqual(tx.signature.length, 1);
should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
should_1.default.equal(txJson.from, sourceAddress);
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
});
it('an init transaction with external signature', async () => {
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.fee(testData.FEE);
txBuilder.owner(owner1Address);
txBuilder.owner(owner2Address);
txBuilder.owner(owner3Address);
txBuilder.source({ address: sourceAddress });
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.equal(txJson.from, sourceAddress);
});
it('an init transaction with external signature included twice', async () => {
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.fee(testData.FEE);
txBuilder.owner(owner1Address);
txBuilder.owner(owner2Address);
txBuilder.owner(owner3Address);
txBuilder.source({ address: sourceAddress });
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.equal(txJson.from, sourceAddress);
});
});
describe('should fail to build', () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
it('a transaction without fee', async () => {
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.owner(owner1Address);
txBuilder.owner(owner2Address);
txBuilder.owner(owner3Address);
txBuilder.source({ address: sourceAddress });
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_FEE);
});
it('a wallet initialization the wrong number of owners', async () => {
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.fee(testData.FEE);
txBuilder.owner(owner1Address);
txBuilder.owner(owner2Address);
txBuilder.source({ address: sourceAddress });
await txBuilder.build().should.be.rejectedWith(testData.INVALID_NUMBER_OF_OWNERS_TWO_OF_THREE);
assert_1.default.throws(() => txBuilder.owner(owner1Address), 'Repeated owner address: ' + owner1Address);
should_1.default.doesNotThrow(() => txBuilder.owner(owner3Address));
assert_1.default.throws(() => txBuilder.owner(owner4Address), /A maximum of 3 owners can be set for a multisig wallet/);
const newTxBuilder = factory.getWalletInitializationBuilder();
newTxBuilder.fee(testData.FEE);
txBuilder.source({ address: sourceAddress });
await newTxBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_OWNERS);
});
it('a transaction with invalid source', async () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('thbar'));
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.fee(testData.FEE);
txBuilder.owner(owner1Address);
txBuilder.owner(owner2Address);
txBuilder.owner(owner3Address);
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_SOURCE);
});
});
describe('should validate', () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
it('an address', async () => {
const txBuilder = factory.getWalletInitializationBuilder();
txBuilder.validateAddress({ address: testData.VALID_ADDRESS });
assert_1.default.throws(() => txBuilder.validateAddress({ address: testData.INVALID_ADDRESS }), new RegExp('Invalid address ' + testData.INVALID_ADDRESS));
});
it('value should be greater than zero', () => {
const txBuilder = factory.getWalletInitializationBuilder();
assert_1.default.throws(() => txBuilder.fee({ gasLimit: '-10' }));
should_1.default.doesNotThrow(() => txBuilder.fee({ gasLimit: '10' }));
});
it('a private key', () => {
const txBuilder = factory.getWalletInitializationBuilder();
assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Unsupported private key/);
should_1.default.doesNotThrow(() => txBuilder.validateKey({ key: testData.ACCOUNT_1.privateKey }));
});
it('a transaction to build', async () => {
const txBuilder = factory.getWalletInitializationBuilder();
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
txBuilder.fee(testData.FEE);
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
txBuilder.source({ address: testData.VALID_ADDRESS });
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.doesNotThrow(() => txBuilder.validateTransaction());
});
});
describe('should build from', () => {
describe('serialized transactions', () => {
it('a non signed transfer transaction from serialized', async () => {
const builder = initUnsignedTxBuilder();
const tx = (await builder.build());
const txJson = tx.toJson();
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
const builder2 = factory.getWalletInitializationBuilder();
builder2.from(tx.toBroadcastFormat());
const tx2 = (await builder2.build());
const tx2Json = tx2.toJson();
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
});
it('a signed transfer transaction from serialized', async () => {
const builder = initUnsignedTxBuilder();
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
const tx = (await builder.build());
const txJson = tx.toJson();
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
const builder2 = factory.getWalletInitializationBuilder();
builder2.from(tx.toBroadcastFormat());
const tx2 = (await builder2.build());
const tx2Json = tx2.toJson();
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
});
it('a signed transfer transaction with extended key from serialized', async () => {
const builder = initUnsignedTxBuilder();
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
const tx = (await builder.build());
const txJson = tx.toJson();
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
const builder2 = factory.getWalletInitializationBuilder();
builder2.from(tx.toBroadcastFormat());
const tx2 = (await builder2.build());
const tx2Json = tx2.toJson();
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
});
it('an offline multisig transfer transaction', async () => {
const builder = initUnsignedTxBuilder();
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
builder.sign({ key: testData.ACCOUNT_1.privateKey });
const tx = (await builder.build());
const txJson = tx.toJson();
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
const builder2 = factory.getWalletInitializationBuilder();
builder2.from(tx.toBroadcastFormat());
const tx2 = (await builder2.build());
const tx2Json = tx2.toJson();
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
});
it('an offline multisig transfer transaction using extended keys', async () => {
const builder = initUnsignedTxBuilder();
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
const tx = (await builder.build());
const txJson = tx.toJson();
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
const builder2 = factory.getWalletInitializationBuilder();
builder2.from(tx.toBroadcastFormat());
const tx2 = (await builder2.build());
const tx2Json = tx2.toJson();
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
});
it('an offline multisig transfer transaction using one extended key', async () => {
const builder = initUnsignedTxBuilder();
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
builder.sign({ key: testData.ACCOUNT_1.privateKey });
const tx = (await builder.build());
const txJson = tx.toJson();
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
const builder2 = factory.getWalletInitializationBuilder();
builder2.from(tx.toBroadcastFormat());
const tx2 = (await builder2.build());
const tx2Json = tx2.toJson();
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
});
});
});
describe('txJson validation', () => {
it('contains all required fields for Wallet Initialization', async () => {
const txBuilder = initSignedTxBuilder();
const tx = (await txBuilder.build());
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.fee, testData.FEE);
should_1.default.equal(txJson.deployType, 'WalletInitialization');
should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
});
it('contains all required fields for Wallet Initialization using extended key to sign', async () => {
const txBuilder = initSignedTxBuilderWithExtendedKey();
const tx = (await txBuilder.build());
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.fee, testData.FEE);
should_1.default.equal(txJson.deployType, 'WalletInitialization');
should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uQnVpbGRlci93YWxsZXRJbml0aWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsNkNBQXlFO0FBQ3pFLHNFQUF3RDtBQUN4RCw4Q0FBa0Q7QUFFbEQscURBQTREO0FBRTVELDRDQUF1QztBQUV2QyxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMs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QyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXpFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IHZlcmlmeVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgQ0xTdHJpbmcgfSBmcm9tICdjYXNwZXItanMtc2RrJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnQ1NQUiBXYWxsZXQgaW5pdGlhbGl6YXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rjc3ByJykpO1xuICBjb25zdCBvd25lcjFBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBvd25lcjJBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBvd25lcjNBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBvd25lcjRBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfNC5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBzb3VyY2VBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuXG4gIGNvbnN0IGluaXRTaWduZWRUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgaW5pdFNpZ25lZFR4QnVpbGRlcldpdGhFeHRlbmRlZEtleSA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgaW5pdFVuc2lnbmVkVHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG93bmVyM0FkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0U2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB2ZXJpZnlTaWduYXR1cmUodHguc2lnbmF0dXJlWzBdLCB0eEpzb24uaGFzaCwgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBzb3VyY2VBZGRyZXNzKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiB1c2luZyBleHRlbmRlZCBrZXkgdG8gc2lnbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRTaWduZWRUeEJ1aWxkZXJXaXRoRXh0ZW5kZWRLZXkoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgdGVzdERhdGEuRkVFKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHZlcmlmeVNpZ25hdHVyZSh0eC5zaWduYXR1cmVbMF0sIHR4SnNvbi5oYXNoLCB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5KSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHNvdXJjZUFkZHJlc3MpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnNpZ25hdHVyZSxcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5wdWJsaWNLZXkgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgc291cmNlQWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25hdHVyZSBpbmNsdWRlZCB0d2ljZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnNpZ25hdHVyZSxcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5wdWJsaWNLZXkgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgc291cmNlQWRkcmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgZmFpbCB0byBidWlsZCcsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y3NwcicpKTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGhvdXQgZmVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfRkVFKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHdhbGxldCBpbml0aWFsaXphdGlvbiB0aGUgd3JvbmcgbnVtYmVyIG9mIG93bmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuSU5WQUxJRF9OVU1CRVJfT0ZfT1dORVJTX1RXT19PRl9USFJFRSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm93bmVyKG93bmVyMUFkZHJlc3MpLCAnUmVwZWF0ZWQgb3duZXIgYWRkcmVzczogJyArIG93bmVyMUFkZHJlc3MpO1xuXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vd25lcihvd25lcjRBZGRyZXNzKSwgL0EgbWF4aW11bSBvZiAzIG93bmVycyBjYW4gYmUgc2V0IGZvciBhIG11bHRpc2lnIHdhbGxldC8pO1xuXG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgbmV3VHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBuZXdUeEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHRlc3REYXRhLklOVkFMSURfVFJBTlNBQ1RJT05fTUlTU0lOR19PV05FUlMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RoYmFyJykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuSU5WQUxJRF9UUkFOU0FDVElPTl9NSVNTSU5HX1NPVVJDRSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGNzcHInKSk7XG5cbiAgICBpdCgnYW4gYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdGVzdERhdGEuVkFMSURfQUREUkVTUyB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiB0ZXN0RGF0YS5JTlZBTElEX0FERFJFU1MgfSksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0ludmFsaWQgYWRkcmVzcyAnICsgdGVzdERhdGEuSU5WQUxJRF9BRERSRVNTKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZmVlKHsgZ2FzTGltaXQ6ICctMTAnIH0pKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLmZlZSh7IGdhc0xpbWl0OiAnMTAnIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiAnYWJjJyB9KSwgL1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5Lyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gdG8gYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB3YWxsZXQgb3duZXJzLyk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC9JbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHdhbGxldCBvd25lcnMvKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiB0ZXN0RGF0YS5WQUxJRF9BRERSRVNTIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB3YWxsZXQgb3duZXJzLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAxLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAyLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnc2hvdWxkIGJ1aWxkIGZyb20nLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ3NlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgaXQoJ2Egbm9uIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Egc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGV4dGVuZGVkIGtleSBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQueFByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYW4gb2ZmbGluZSBtdWx0aXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbiB1c2luZyBleHRlbmRlZCBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYW4gb2ZmbGluZSBtdWx0aXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbiB1c2luZyBvbmUgZXh0ZW5kZWQga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0eEpzb24gdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnY29udGFpbnMgYWxsIHJlcXVpcmVkIGZpZWxkcyBmb3IgV2FsbGV0IEluaXRpYWxpemF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmRlcGxveVR5cGUsICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCAnMDInICsgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmhhc2gsIEJ1ZmZlci5mcm9tKHR4LmNhc3BlclR4Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIxLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjIsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMywgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb250YWlucyBhbGwgcmVxdWlyZWQgZmllbGRzIGZvciBXYWxsZXQgSW5pdGlhbGl6YXRpb24gdXNpbmcgZXh0ZW5kZWQga2V5IHRvIHNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0U2lnbmVkVHhCdWlsZGVyV2l0aEV4dGVuZGVkS2V5KCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgdGVzdERhdGEuRkVFKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZGVwbG95VHlwZSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sICcwMicgKyB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uaGFzaCwgQnVmZmVyLmZyb20odHguY2FzcGVyVHguaGFzaCkudG9TdHJpbmcoJ2hleCcpKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjEsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMiwgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIzLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!