PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/dist/test/unit/transactionBuilder
Просмотр файла: ataInitBuilder.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 src_1 = require("../../../src");
const should_1 = __importDefault(require("should"));
const testData = __importStar(require("../../resources/sol"));
const getBuilderFactory_1 = require("../getBuilderFactory");
describe('Sol Associated Token Account Builder', () => {
function verifyInputOutputAndRawTransaction(tx, rawTx, owner = sender) {
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const instructions = tx.toJson().instructionsData;
let ataInitInstruction;
for (const instruction of instructions) {
if (instruction.type === 'CreateAssociatedTokenAccount') {
ataInitInstruction = instruction;
break;
}
}
should_1.default.exist(ataInitInstruction);
ataInitInstruction.params.tokenName.should.equal(mint);
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
}
const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
const ataInitBuilder = () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.nonce(recentBlockHash);
txBuilder.sender(account.pub);
txBuilder.mint(mint);
txBuilder.rentExemptAmount(rentAmount);
return txBuilder;
};
const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
const sender = {
pubkey: account.pub,
ataPubkey: testData.associatedTokenAccounts.accounts[0].ata,
};
const wrongAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
const mint = testData.associatedTokenAccounts.mint;
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
const rentAmount = '30000';
// for diff owner case
const accountOwner = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[1]).getKeys();
const ownerPubkeys = {
pubkey: accountOwner.pub,
ataPubkey: testData.associatedTokenAccounts.accounts[1].ata,
};
describe('Build and sign', () => {
describe('Succeed', () => {
it('build an associated token account init tx unsigned', async () => {
const txBuilder = ataInitBuilder();
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_TX);
});
it('build an associated token account init tx unsigned with memo', async () => {
const txBuilder = ataInitBuilder();
txBuilder.memo('test memo please ignore');
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_TX_WITH_MEMO);
});
it('build an associated token account init tx signed', async () => {
const txBuilder = ataInitBuilder();
txBuilder.sender(account.pub);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX);
});
it('build an associated token account init tx with memo signed', async () => {
const txBuilder = ataInitBuilder();
txBuilder.memo('test memo please ignore');
txBuilder.sender(account.pub);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_WITH_MEMO);
});
it('build an associated token account init tx with durable nonce unsigned', async () => {
const txBuilder = ataInitBuilder();
txBuilder.memo('test memo please ignore');
txBuilder.sender(account.pub);
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: account.pub });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_TX_DURABLE_NONCE);
});
it('build an associated token account init tx with durable nonce signed', async () => {
const txBuilder = ataInitBuilder();
txBuilder.memo('test memo please ignore');
txBuilder.sender(account.pub);
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: account.pub });
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_DURABLE_NONCE);
});
});
describe('ATA creation with different owner', () => {
it('build an associated token account init for diff owner tx unsigned', async () => {
const txBuilder = ataInitBuilder();
txBuilder.owner(accountOwner.pub);
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX);
});
it('build an associated token account init for diff owner tx unsigned with memo', async () => {
const txBuilder = ataInitBuilder();
txBuilder.owner(accountOwner.pub);
txBuilder.memo('test memo please ignore');
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
should_1.default.equal(rawTx, testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX_WITH_MEMO);
});
it('build an associated token account init for diff owner tx signed', async () => {
const txBuilder = ataInitBuilder();
txBuilder.owner(accountOwner.pub);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX);
});
it('build an associated token account init for diff owner tx with memo signed', async () => {
const txBuilder = ataInitBuilder();
txBuilder.owner(accountOwner.pub);
txBuilder.memo('test memo please ignore');
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX_WITH_MEMO);
});
});
describe('Fail', () => {
it('build an associated token account init tx when mint is invalid', () => {
const txBuilder = ataInitBuilder();
(0, should_1.default)(() => txBuilder.mint('invalidToken')).throwError('Invalid transaction: invalid token name, got: invalidToken');
});
it('build a wallet init tx and sign with an incorrect account', async () => {
const txBuilder = ataInitBuilder();
txBuilder.sender(account.pub);
txBuilder.sign({ key: wrongAccount.prv });
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
});
it('build when nonce is not provided', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.sender(account.pub);
txBuilder.mint(mint);
txBuilder.sign({ key: account.prv });
await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
});
it('build when sender is not provided', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.nonce(recentBlockHash);
txBuilder.mint(mint);
txBuilder.sign({ key: account.prv });
await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
});
it('build when mint is not provided', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.sender(account.pub);
txBuilder.nonce(recentBlockHash);
txBuilder.sign({ key: account.prv });
await txBuilder.build().should.rejectedWith('Mint must be set before building the transaction');
});
it('build when mint is invalid', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
(0, should_1.default)(() => txBuilder.mint('sol:invalid mint')).throwError('Invalid transaction: invalid token name, got: sol:invalid mint');
});
it('build when rentExemptAmount is invalid', async () => {
const txBuilder = ataInitBuilder();
(0, should_1.default)(() => txBuilder.rentExemptAmount('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
(0, should_1.default)(() => txBuilder.associatedTokenAccountRent('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
});
it('build when owner is invalid', async () => {
const txBuilder = ataInitBuilder();
(0, should_1.default)(() => txBuilder.owner('invalid owner')).throwError('Invalid or missing ownerAddress, got: invalid owner');
});
it('to sign twice with the same key', () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX);
txBuilder.sign({ key: account.prv });
(0, should_1.default)(() => txBuilder.sign({ key: account.prv })).throwError('Duplicated signer: ' + account.prv?.toString());
});
});
});
describe('Build and sign with enableToken', () => {
const recipients = [
{
ownerAddress: sender.pubkey,
tokenName: mint,
ataAddress: sender.ataPubkey,
},
{
ownerAddress: ownerPubkeys.pubkey,
tokenName: 'sol:ray',
ataAddress: 'ACEuzYtR4gBFt6HLQTYisg2T7k8Vh4ss1SpnqmbVQSNy',
},
];
const multiAtaInitBuilder = (recipients) => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.nonce(recentBlockHash);
recipients.forEach((recipient) => {
txBuilder.enableToken(recipient);
});
txBuilder.sender(sender.pubkey);
txBuilder.rentExemptAmount(rentAmount);
return txBuilder;
};
describe('ATA creation for multiple recipients', () => {
it('build an associated token account init for multiple recipients', async () => {
const txBuilder = multiAtaInitBuilder(recipients);
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
const ownerRayATA = 'ACEuzYtR4gBFt6HLQTYisg2T7k8Vh4ss1SpnqmbVQSNy';
tx.inputs.length.should.equal(0);
tx.outputs.length.should.equal(0);
const instructions = tx.toJson().instructionsData;
instructions.length.should.equal(2);
instructions[0].params.tokenName.should.equal(mint);
instructions[0].params.ownerAddress.should.equal(sender.pubkey);
instructions[0].params.ataAddress.should.equal(sender.ataPubkey);
instructions[1].params.tokenName.should.equal('sol:ray');
instructions[1].params.ownerAddress.should.equal(ownerPubkeys.pubkey);
instructions[1].params.ataAddress.should.equal(ownerRayATA);
should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_UNSIGNED_TX);
});
it('build an associated token account init for multiple recipients with memo', async () => {
const txBuilder = multiAtaInitBuilder(recipients);
txBuilder.memo('test memo please ignore');
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_UNSIGNED_TX_WITH_MEMO);
});
it('build an associated token account init tx for multiple recipients signed', async () => {
const txBuilder = multiAtaInitBuilder(recipients);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX);
});
it('build an associated token account init for multiple recipients tx with memo signed', async () => {
const txBuilder = multiAtaInitBuilder(recipients);
txBuilder.memo('test memo please ignore');
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX_WITH_MEMO);
});
});
describe('Fail', () => {
it('should fail to build an associated token account init with duplicate recipients', async () => {
const duplicateRecipient = {
ownerAddress: sender.pubkey,
tokenName: mint,
ataAddress: sender.ataPubkey,
};
const txBuilder = multiAtaInitBuilder(recipients);
(0, should_1.default)(() => txBuilder.enableToken(duplicateRecipient)).throwError('Invalid transaction: invalid duplicate recipients, got: owner 12f6D3WubGVeQoH2m8kTvvcrasWdXWwtVzUCyRNDZxA2 and tokenName sol:usdc twice');
});
it('build an associated token account init tx when mint is invalid', () => {
const errorMintRecipient = {
ownerAddress: ownerPubkeys.pubkey,
tokenName: 'invalidToken',
ataAddress: ownerPubkeys.ataPubkey,
};
const txBuilder = multiAtaInitBuilder(recipients);
(0, should_1.default)(() => txBuilder.enableToken(errorMintRecipient)).throwError('Invalid transaction: invalid token name, got: invalidToken');
});
it('build a wallet init tx and sign with an incorrect account', async () => {
const txBuilder = multiAtaInitBuilder(recipients);
txBuilder.sender(account.pub);
txBuilder.sign({ key: wrongAccount.prv });
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
});
it('build when nonce is not provided', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.sender(account.pub);
txBuilder.enableToken({
ownerAddress: account.pub,
tokenName: mint,
ataAddress: sender.ataPubkey,
});
txBuilder.sign({ key: account.prv });
await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
});
it('build when sender is not provided', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.nonce(recentBlockHash);
txBuilder.enableToken({
ownerAddress: account.pub,
tokenName: mint,
ataAddress: sender.ataPubkey,
});
txBuilder.sign({ key: account.prv });
await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
});
it('build when recipient is not provided', async () => {
const txBuilder = factory.getAtaInitializationBuilder();
txBuilder.sender(account.pub);
txBuilder.nonce(recentBlockHash);
txBuilder.sign({ key: account.prv });
await txBuilder.build().should.rejectedWith('Mint must be set before building the transaction');
});
it('build when rentExemptAmount is invalid', async () => {
const txBuilder = multiAtaInitBuilder(recipients);
(0, should_1.default)(() => txBuilder.rentExemptAmount('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
(0, should_1.default)(() => txBuilder.associatedTokenAccountRent('invalid amount')).throwError('Invalid tokenAccountRentExemptAmount, got: invalid amount');
});
it('build when token owner is invalid', async () => {
const invalidOwner = {
ownerAddress: 'invalid owner',
tokenName: mint,
ataAddress: sender.ataPubkey,
};
const txBuilder = multiAtaInitBuilder(recipients);
(0, should_1.default)(() => txBuilder.enableToken(invalidOwner)).throwError('Invalid or missing ownerAddress, got: invalid owner');
});
it('to sign twice with the same key', () => {
const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX);
txBuilder.sign({ key: account.prv });
(0, should_1.default)(() => txBuilder.sign({ key: account.prv })).throwError('Duplicated signer: ' + account.prv?.toString());
});
});
});
describe('From and sign', () => {
describe('Succeed', () => {
it('build from a unsigned ATA init and sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX);
txBuilder.rentExemptAmount(rentAmount);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX);
});
it('build from a unsigned ATA init with memo and sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX_WITH_MEMO);
txBuilder.rentExemptAmount(rentAmount);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_WITH_MEMO);
});
it('build from a unsigned ATA init with diff owner and sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX);
txBuilder.rentExemptAmount(rentAmount);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX);
});
it('build from a unsigned ATA init with diff owner with memo and sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_DIFF_OWNER_TX_WITH_MEMO);
txBuilder.rentExemptAmount(rentAmount);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
verifyInputOutputAndRawTransaction(tx, rawTx, ownerPubkeys);
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_DIFF_OWNER_TX_WITH_MEMO);
});
it('build from a unsigned ATA init for multi recipients and sign it', async () => {
const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX);
txBuilder.rentExemptAmount(rentAmount);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX);
});
it('build from a unsigned ATA init for multi recipients with memo and sign it', async () => {
const txBuilder = factory.from(testData.MULTI_ATA_INIT_UNSIGNED_TX_WITH_MEMO);
txBuilder.rentExemptAmount(rentAmount);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.MULTI_ATA_INIT_SIGNED_TX_WITH_MEMO);
});
it('build from an unsigned ATA init with durable nonce and sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX_DURABLE_NONCE);
txBuilder.sign({ key: account.prv });
const tx = await txBuilder.build();
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.ATA_INIT_SIGNED_TX_DURABLE_NONCE);
});
});
describe('Fail', () => {
it('build from a unsigned ATA init and fail to sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_UNSIGNED_TX);
txBuilder.sign({ key: wrongAccount.prv });
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
});
it('build from a signed ATA init and fail to sign it', async () => {
const txBuilder = factory.from(testData.ATA_INIT_SIGNED_TX);
txBuilder.sign({ key: wrongAccount.prv });
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhSW5pdEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2F0YUluaXRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQXdFO0FBQ3hFLG9EQUE0QjtBQUM1Qiw4REFBZ0Q7QUFFaEQsNERBQXlEO0FBRXpELFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7SUFDcEQsU0FBUyxrQ0FBa0MsQ0FDekMsRUFBbUIsRUFDbkIsS0FBYSxFQUNiLFFBQStDLE1BQU07UUFFckQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsRCxJQUFJLGtCQUFrQixDQUFDO1FBQ3ZCLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLDhCQUE4QixFQUFFLENBQUM7Z0JBQ3hELGtCQUFrQixHQUFHLFdBQVcsQ0FBQztnQkFDakMsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxD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QyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDOUcsQ0FBQyxDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2hFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzVELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsOERBQThELENBQUMsQ0FBQztZQUM5RyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtleVBhaXIsIFV0aWxzLCBBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb24gfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5cbmRlc2NyaWJlKCdTb2wgQXNzb2NpYXRlZCBUb2tlbiBBY2NvdW50IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGZ1bmN0aW9uIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24oXG4gICAgdHg6IEJhc2VUcmFuc2FjdGlvbixcbiAgICByYXdUeDogc3RyaW5nLFxuICAgIG93bmVyOiB7IHB1YmtleTogc3RyaW5nOyBhdGFQdWJrZXk6IHN0cmluZyB9ID0gc2VuZGVyXG4gICkge1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgIGxldCBhdGFJbml0SW5zdHJ1Y3Rpb247XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSAnQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCcpIHtcbiAgICAgICAgYXRhSW5pdEluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBzaG91bGQuZXhpc3QoYXRhSW5pdEluc3RydWN0aW9uKTtcbiAgICBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZS5zaG91bGQuZXF1YWwobWludCk7XG5cbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3NvbCcpO1xuICBjb25zdCBhdGFJbml0QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgIHR4QnVpbGRlci5taW50KG1pbnQpO1xuICAgIHR4QnVpbGRlci5yZW50RXhlbXB0QW1vdW50KHJlbnRBbW91bnQpO1xuXG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhY2NvdW50ID0gbmV3IEtleVBhaXIodGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0pLmdldEtleXMoKTtcbiAgY29uc3Qgbm9uY2VBY2NvdW50ID0gbmV3IEtleVBhaXIodGVzdERhdGEubm9uY2VBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IHNlbmRlciA9IHtcbiAgICBwdWJrZXk6IGFjY291bnQucHViLFxuICAgIGF0YVB1YmtleTogdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0uYXRhLFxuICB9O1xuICBjb25zdCB3cm9uZ0FjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG1pbnQgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5taW50O1xuICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuICBjb25zdCByZW50QW1vdW50ID0gJzMwMDAwJztcblxuICAvLyBmb3IgZGlmZiBvd25lciBjYXNlXG4gIGNvbnN0IGFjY291bnRPd25lciA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzFdKS5nZXRLZXlzKCk7XG4gIGNvbnN0IG93bmVyUHVia2V5cyA9IHtcbiAgICBwdWJrZXk6IGFjY291bnRPd25lci5wdWIsXG4gICAgYXRhUHVia2V5OiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1sxXS5hdGEsXG4gIH07XG5cbiAgZGVzY3JpYmUoJ0J1aWxkIGFuZCBzaWduJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdTdWNjZWVkJywgKCkgPT4ge1xuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IHR4IHVuc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1VOU0lHTkVEX1RYKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggdW5zaWduZWQgd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbygndGVzdCBtZW1vIHBsZWFzZSBpZ25vcmUnKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9VTlNJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCB0eCBzaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfU0lHTkVEX1RYKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggd2l0aCBtZW1vIHNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbyBwbGVhc2UgaWdub3JlJyk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IHR4IHdpdGggZHVyYWJsZSBub25jZSB1bnNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbyBwbGVhc2UgaWdub3JlJyk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGFjY291bnQucHViIH0pO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9VTlNJR05FRF9UWF9EVVJBQkxFX05PTkNFKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggd2l0aCBkdXJhYmxlIG5vbmNlIHNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbyBwbGVhc2UgaWdub3JlJyk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGFjY291bnQucHViIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4KTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWF9EVVJBQkxFX05PTkNFKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0FUQSBjcmVhdGlvbiB3aXRoIGRpZmZlcmVudCBvd25lcicsICgpID0+IHtcbiAgICAgIGl0KCdidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCBmb3IgZGlmZiBvd25lciB0eCB1bnNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm93bmVyKGFjY291bnRPd25lci5wdWIpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgsIG93bmVyUHVia2V5cyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfRElGRl9PV05FUl9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IGZvciBkaWZmIG93bmVyIHR4IHVuc2lnbmVkIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm93bmVyKGFjY291bnRPd25lci5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbygndGVzdCBtZW1vIHBsZWFzZSBpZ25vcmUnKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4LCBvd25lclB1YmtleXMpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1VOU0lHTkVEX0RJRkZfT1dORVJfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIGRpZmYgb3duZXIgdHggc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIub3duZXIoYWNjb3VudE93bmVyLnB1Yik7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHZlcmlmeUlucHV0T3V0cHV0QW5kUmF3VHJhbnNhY3Rpb24odHgsIHJhd1R4LCBvd25lclB1YmtleXMpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9ESUZGX09XTkVSX1RYKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIGRpZmYgb3duZXIgdHggd2l0aCBtZW1vIHNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm93bmVyKGFjY291bnRPd25lci5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbygndGVzdCBtZW1vIHBsZWFzZSBpZ25vcmUnKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgsIG93bmVyUHVia2V5cyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfU0lHTkVEX0RJRkZfT1dORVJfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggd2hlbiBtaW50IGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIubWludCgnaW52YWxpZFRva2VuJykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgdG9rZW4gbmFtZSwgZ290OiBpbnZhbGlkVG9rZW4nXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGEgd2FsbGV0IGluaXQgdHggYW5kIHNpZ24gd2l0aCBhbiBpbmNvcnJlY3QgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gYXRhSW5pdEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3cm9uZ0FjY291bnQucHJ2IH0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd1bmtub3duIHNpZ25lcjogQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiBub25jZSBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIubWludChtaW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vbmNlIGJsb2NraGFzaCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIHNlbmRlciBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgICB0eEJ1aWxkZXIubWludChtaW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlcicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIG1pbnQgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnTWludCBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gbWludCBpcyBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLm1pbnQoJ3NvbDppbnZhbGlkIG1pbnQnKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbjogaW52YWxpZCB0b2tlbiBuYW1lLCBnb3Q6IHNvbDppbnZhbGlkIG1pbnQnXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gcmVudEV4ZW1wdEFtb3VudCBpcyBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhdGFJbml0QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnJlbnRFeGVtcHRBbW91bnQoJ2ludmFsaWQgYW1vdW50JykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCwgZ290OiBpbnZhbGlkIGFtb3VudCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hc3NvY2lhdGVkVG9rZW5BY2NvdW50UmVudCgnaW52YWxpZCBhbW91bnQnKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCB0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50LCBnb3Q6IGludmFsaWQgYW1vdW50J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIG93bmVyIGlzIGludmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGF0YUluaXRCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIub3duZXIoJ2ludmFsaWQgb3duZXInKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiBpbnZhbGlkIG93bmVyJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd0byBzaWduIHR3aWNlIHdpdGggdGhlIHNhbWUga2V5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSkpLnRocm93RXJyb3IoJ0R1cGxpY2F0ZWQgc2lnbmVyOiAnICsgYWNjb3VudC5wcnY/LnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBhbmQgc2lnbiB3aXRoIGVuYWJsZVRva2VuJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICB7XG4gICAgICAgIG93bmVyQWRkcmVzczogc2VuZGVyLnB1YmtleSxcbiAgICAgICAgdG9rZW5OYW1lOiBtaW50LFxuICAgICAgICBhdGFBZGRyZXNzOiBzZW5kZXIuYXRhUHVia2V5LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvd25lclB1YmtleXMucHVia2V5LFxuICAgICAgICB0b2tlbk5hbWU6ICdzb2w6cmF5JyxcbiAgICAgICAgYXRhQWRkcmVzczogJ0FDRXV6WXRSNGdCRnQ2SExRVFlpc2cyVDdrOFZoNHNzMVNwbnFtYlZRU055JyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBtdWx0aUF0YUluaXRCdWlsZGVyID0gKHJlY2lwaWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHJlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci5lbmFibGVUb2tlbihyZWNpcGllbnQpO1xuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHNlbmRlci5wdWJrZXkpO1xuICAgICAgdHhCdWlsZGVyLnJlbnRFeGVtcHRBbW91bnQocmVudEFtb3VudCk7XG5cbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGRlc2NyaWJlKCdBVEEgY3JlYXRpb24gZm9yIG11bHRpcGxlIHJlY2lwaWVudHMnLCAoKSA9PiB7XG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIG11bHRpcGxlIHJlY2lwaWVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG11bHRpQXRhSW5pdEJ1aWxkZXIocmVjaXBpZW50cyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgY29uc3Qgb3duZXJSYXlBVEEgPSAnQUNFdXpZdFI0Z0JGdDZITFFUWWlzZzJUN2s4Vmg0c3MxU3BucW1iVlFTTnknO1xuXG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG5cbiAgICAgICAgaW5zdHJ1Y3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICAgIGluc3RydWN0aW9uc1swXS5wYXJhbXMudG9rZW5OYW1lLnNob3VsZC5lcXVhbChtaW50KTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnBhcmFtcy5vd25lckFkZHJlc3Muc2hvdWxkLmVxdWFsKHNlbmRlci5wdWJrZXkpO1xuICAgICAgICBpbnN0cnVjdGlvbnNbMF0ucGFyYW1zLmF0YUFkZHJlc3Muc2hvdWxkLmVxdWFsKHNlbmRlci5hdGFQdWJrZXkpO1xuICAgICAgICBpbnN0cnVjdGlvbnNbMV0ucGFyYW1zLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ3NvbDpyYXknKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnBhcmFtcy5vd25lckFkZHJlc3Muc2hvdWxkLmVxdWFsKG93bmVyUHVia2V5cy5wdWJrZXkpO1xuICAgICAgICBpbnN0cnVjdGlvbnNbMV0ucGFyYW1zLmF0YUFkZHJlc3Muc2hvdWxkLmVxdWFsKG93bmVyUmF5QVRBKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX0FUQV9JTklUX1VOU0lHTkVEX1RYKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgZm9yIG11bHRpcGxlIHJlY2lwaWVudHMgd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbygndGVzdCBtZW1vIHBsZWFzZSBpZ25vcmUnKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggZm9yIG11bHRpcGxlIHJlY2lwaWVudHMgc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX0FUQV9JTklUX1NJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBpbml0IGZvciBtdWx0aXBsZSByZWNpcGllbnRzIHR4IHdpdGggbWVtbyBzaWduZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG11bHRpQXRhSW5pdEJ1aWxkZXIocmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8gcGxlYXNlIGlnbm9yZScpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX0FUQV9JTklUX1NJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgaW5pdCB3aXRoIGR1cGxpY2F0ZSByZWNpcGllbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkdXBsaWNhdGVSZWNpcGllbnQgPSB7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBzZW5kZXIucHVia2V5LFxuICAgICAgICAgIHRva2VuTmFtZTogbWludCxcbiAgICAgICAgICBhdGFBZGRyZXNzOiBzZW5kZXIuYXRhUHVia2V5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmVuYWJsZVRva2VuKGR1cGxpY2F0ZVJlY2lwaWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgZHVwbGljYXRlIHJlY2lwaWVudHMsIGdvdDogb3duZXIgMTJmNkQzV3ViR1ZlUW9IMm04a1R2dmNyYXNXZFhXd3RWelVDeVJORFp4QTIgYW5kIHRva2VuTmFtZSBzb2w6dXNkYyB0d2ljZSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGluaXQgdHggd2hlbiBtaW50IGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yTWludFJlY2lwaWVudCA9IHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6IG93bmVyUHVia2V5cy5wdWJrZXksXG4gICAgICAgICAgdG9rZW5OYW1lOiAnaW52YWxpZFRva2VuJyxcbiAgICAgICAgICBhdGFBZGRyZXNzOiBvd25lclB1YmtleXMuYXRhUHVia2V5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmVuYWJsZVRva2VuKGVycm9yTWludFJlY2lwaWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgdG9rZW4gbmFtZSwgZ290OiBpbnZhbGlkVG9rZW4nXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGEgd2FsbGV0IGluaXQgdHggYW5kIHNpZ24gd2l0aCBhbiBpbmNvcnJlY3QgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gbXVsdGlBdGFJbml0QnVpbGRlcihyZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3cm9uZ0FjY291bnQucHJ2IH0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd1bmtub3duIHNpZ25lcjogQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiBub25jZSBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgICB0eEJ1aWxkZXIuZW5hYmxlVG9rZW4oe1xuICAgICAgICAgIG93bmVyQWRkcmVzczogYWNjb3VudC5wdWIsXG4gICAgICAgICAgdG9rZW5OYW1lOiBtaW50LFxuICAgICAgICAgIGF0YUFkZHJlc3M6IHNlbmRlci5hdGFQdWJrZXksXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gc2VuZGVyIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICAgIHR4QnVpbGRlci5lbmFibGVUb2tlbih7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBhY2NvdW50LnB1YixcbiAgICAgICAgICB0b2tlbk5hbWU6IG1pbnQsXG4gICAgICAgICAgYXRhQWRkcmVzczogc2VuZGVyLmF0YVB1YmtleSxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBzZW5kZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgd2hlbiByZWNpcGllbnQgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnTWludCBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIHdoZW4gcmVudEV4ZW1wdEFtb3VudCBpcyBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBtdWx0aUF0YUluaXRCdWlsZGVyKHJlY2lwaWVudHMpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnJlbnRFeGVtcHRBbW91bnQoJ2ludmFsaWQgYW1vdW50JykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCwgZ290OiBpbnZhbGlkIGFtb3VudCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hc3NvY2lhdGVkVG9rZW5BY2NvdW50UmVudCgnaW52YWxpZCBhbW91bnQnKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCB0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50LCBnb3Q6IGludmFsaWQgYW1vdW50J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCB3aGVuIHRva2VuIG93bmVyIGlzIGludmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRPd25lciA9IHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6ICdpbnZhbGlkIG93bmVyJyxcbiAgICAgICAgICB0b2tlbk5hbWU6IG1pbnQsXG4gICAgICAgICAgYXRhQWRkcmVzczogc2VuZGVyLmF0YVB1YmtleSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gbXVsdGlBdGFJbml0QnVpbGRlcihyZWNpcGllbnRzKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5lbmFibGVUb2tlbihpbnZhbGlkT3duZXIpKS50aHJvd0Vycm9yKFxuICAgICAgICAgICdJbnZhbGlkIG9yIG1pc3Npbmcgb3duZXJBZGRyZXNzLCBnb3Q6IGludmFsaWQgb3duZXInXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3RvIHNpZ24gdHdpY2Ugd2l0aCB0aGUgc2FtZSBrZXknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5NVUxUSV9BVEFfSU5JVF9VTlNJR05FRF9UWCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KSkudGhyb3dFcnJvcignRHVwbGljYXRlZCBzaWduZXI6ICcgKyBhY2NvdW50LnBydj8udG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Zyb20gYW5kIHNpZ24nLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnYnVpbGQgZnJvbSBhIHVuc2lnbmVkIEFUQSBpbml0IGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCB3aXRoIG1lbW8gYW5kIHNpZ24gaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5BVEFfSU5JVF9VTlNJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFUQV9JTklUX1NJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgdW5zaWduZWQgQVRBIGluaXQgd2l0aCBkaWZmIG93bmVyIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfRElGRl9PV05FUl9UWCk7XG4gICAgICAgICh0eEJ1aWxkZXIgYXMgQXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKS5yZW50RXhlbXB0QW1vdW50KHJlbnRBbW91bnQpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICB2ZXJpZnlJbnB1dE91dHB1dEFuZFJhd1RyYW5zYWN0aW9uKHR4LCByYXdUeCwgb3duZXJQdWJrZXlzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfRElGRl9PV05FUl9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCB3aXRoIGRpZmYgb3duZXIgd2l0aCBtZW1vIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfRElGRl9PV05FUl9UWF9XSVRIX01FTU8pO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgdmVyaWZ5SW5wdXRPdXRwdXRBbmRSYXdUcmFuc2FjdGlvbih0eCwgcmF3VHgsIG93bmVyUHVia2V5cyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuQVRBX0lOSVRfU0lHTkVEX0RJRkZfT1dORVJfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgZnJvbSBhIHVuc2lnbmVkIEFUQSBpbml0IGZvciBtdWx0aSByZWNpcGllbnRzIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICAodHhCdWlsZGVyIGFzIEF0YUluaXRpYWxpemF0aW9uQnVpbGRlcikucmVudEV4ZW1wdEFtb3VudChyZW50QW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5NVUxUSV9BVEFfSU5JVF9TSUdORURfVFgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgdW5zaWduZWQgQVRBIGluaXQgZm9yIG11bHRpIHJlY2lwaWVudHMgd2l0aCBtZW1vIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTVVMVElfQVRBX0lOSVRfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgICAgKHR4QnVpbGRlciBhcyBBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIpLnJlbnRFeGVtcHRBbW91bnQocmVudEFtb3VudCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVRBX0lOSVRfU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkIGZyb20gYW4gdW5zaWduZWQgQVRBIGluaXQgd2l0aCBkdXJhYmxlIG5vbmNlIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFhfRFVSQUJMRV9OT05DRSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhY2NvdW50LnBydiB9KTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfVFhfRFVSQUJMRV9OT05DRSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgICAgaXQoJ2J1aWxkIGZyb20gYSB1bnNpZ25lZCBBVEEgaW5pdCBhbmQgZmFpbCB0byBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuQVRBX0lOSVRfVU5TSUdORURfVFgpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd3JvbmdBY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdidWlsZCBmcm9tIGEgc2lnbmVkIEFUQSBpbml0IGFuZCBmYWlsIHRvIHNpZ24gaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5BVEFfSU5JVF9TSUdORURfVFgpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd3JvbmdBY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!