PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/apis/avm
Просмотр файла: api.test.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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const jest_mock_axios_1 = __importDefault(require("jest-mock-axios"));
const src_1 = require("src");
const api_1 = require("../../../src/apis/avm/api");
const keychain_1 = require("../../../src/apis/avm/keychain");
const buffer_1 = require("buffer/");
const bn_js_1 = __importDefault(require("bn.js"));
const bintools_1 = __importDefault(require("../../../src/utils/bintools"));
const utxos_1 = require("../../../src/apis/avm/utxos");
const inputs_1 = require("../../../src/apis/avm/inputs");
const create_hash_1 = __importDefault(require("create-hash"));
const tx_1 = require("../../../src/apis/avm/tx");
const constants_1 = require("../../../src/apis/avm/constants");
const outputs_1 = require("../../../src/apis/avm/outputs");
const ops_1 = require("../../../src/apis/avm/ops");
const bech32 = __importStar(require("bech32"));
const payload_1 = require("../../../src/utils/payload");
const initialstates_1 = require("../../../src/apis/avm/initialstates");
const constants_2 = require("../../../src/utils/constants");
const helperfunctions_1 = require("../../../src/utils/helperfunctions");
const output_1 = require("../../../src/common/output");
const minterset_1 = require("../../../src/apis/avm/minterset");
const constants_3 = require("../../../src/utils/constants");
const persistenceoptions_1 = require("../../../src/utils/persistenceoptions");
const constants_4 = require("../../../src/utils/constants");
const serialization_1 = require("../../../src/utils/serialization");
const utils_1 = require("src/utils");
const utils_2 = require("src/utils");
/**
* @ignore
*/
const bintools = bintools_1.default.getInstance();
const serialization = serialization_1.Serialization.getInstance();
const dumpSerailization = false;
const display = "display";
const serialzeit = (aThing, name) => {
if (dumpSerailization) {
console.log(JSON.stringify(serialization.serialize(aThing, "avm", "hex", name + " -- Hex Encoded")));
console.log(JSON.stringify(serialization.serialize(aThing, "avm", "display", name + " -- Human-Readable")));
}
};
describe("AVMAPI", () => {
const networkID = 1337;
const blockchainID = constants_2.Defaults.network[networkID].X.blockchainID;
const ip = "127.0.0.1";
const port = 9650;
const protocol = "https";
const username = "AvaLabs";
const password = "password";
const avalanche = new src_1.Avalanche(ip, port, protocol, networkID, undefined, undefined, undefined, true);
let api;
let alias;
const addrA = `X-${bech32.bech32.encode(avalanche.getHRP(), bech32.bech32.toWords(bintools.cb58Decode("B6D4v1VtPYLbiUvYXtW4Px8oE9imC2vGW")))}`;
const addrB = `X-${bech32.bech32.encode(avalanche.getHRP(), bech32.bech32.toWords(bintools.cb58Decode("P5wdRuZeaDt28eHMP5S3w9ZdoBfo7wuzF")))}`;
const addrC = `X-${bech32.bech32.encode(avalanche.getHRP(), bech32.bech32.toWords(bintools.cb58Decode("6Y3kysjF9jnHnYkdS9yGAuoHyae2eNmeV")))}`;
beforeAll(() => {
api = new api_1.AVMAPI(avalanche, "/ext/bc/X", blockchainID);
alias = api.getBlockchainAlias();
});
afterEach(() => {
jest_mock_axios_1.default.reset();
});
test("fails to send with incorrect username", () => __awaiter(void 0, void 0, void 0, function* () {
const memo = "hello world";
const incorrectUserName = "asdfasdfsa";
const message = `problem retrieving user: incorrect password for user "${incorrectUserName}"`;
const result = api.send(incorrectUserName, password, "assetId", 10, addrA, [addrB], addrA, memo);
const payload = {
result: {
code: -32000,
message,
data: null
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["code"]).toBe(-32000);
expect(response["message"]).toBe(message);
}));
test("fails to send with incorrect Password", () => __awaiter(void 0, void 0, void 0, function* () {
const memo = "hello world";
const incorrectPassword = "asdfasdfsa";
const message = `problem retrieving user: incorrect password for user "${incorrectPassword}"`;
const result = api.send(username, incorrectPassword, "assetId", 10, addrA, [addrB], addrA, memo);
const payload = {
result: {
code: -32000,
message,
data: null
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["code"]).toBe(-32000);
expect(response["message"]).toBe(message);
}));
test("can Send 1", () => __awaiter(void 0, void 0, void 0, function* () {
const txId = "asdfhvl234";
const memo = "hello world";
const changeAddr = "X-local1";
const result = api.send(username, password, "assetId", 10, addrA, [addrB], addrA, memo);
const payload = {
result: {
txID: txId,
changeAddr: changeAddr
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["txID"]).toBe(txId);
expect(response["changeAddr"]).toBe(changeAddr);
}));
test("can Send 2", () => __awaiter(void 0, void 0, void 0, function* () {
const txId = "asdfhvl234";
const memo = buffer_1.Buffer.from("hello world");
const changeAddr = "X-local1";
const result = api.send(username, password, bintools.b58ToBuffer("6h2s5de1VC65meajE1L2PjvZ1MXvHc3F6eqPCGKuDt4MxiweF"), new bn_js_1.default(10), addrA, [addrB], addrA, memo);
const payload = {
result: {
txID: txId,
changeAddr: changeAddr
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["txID"]).toBe(txId);
expect(response["changeAddr"]).toBe(changeAddr);
}));
test("can Send Multiple", () => __awaiter(void 0, void 0, void 0, function* () {
const txId = "asdfhvl234";
const memo = "hello world";
const changeAddr = "X-local1";
const result = api.sendMultiple(username, password, [{ assetID: "assetId", amount: 10, to: addrA }], [addrB], addrA, memo);
const payload = {
result: {
txID: txId,
changeAddr: changeAddr
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["txID"]).toBe(txId);
expect(response["changeAddr"]).toBe(changeAddr);
}));
test("refreshBlockchainID", () => __awaiter(void 0, void 0, void 0, function* () {
const n3bcID = constants_2.Defaults.network[3].X["blockchainID"];
const n1337bcID = constants_2.Defaults.network[1337].X["blockchainID"];
const testAPI = new api_1.AVMAPI(avalanche, "/ext/bc/avm", n3bcID);
const bc1 = testAPI.getBlockchainID();
expect(bc1).toBe(n3bcID);
testAPI.refreshBlockchainID();
const bc2 = testAPI.getBlockchainID();
expect(bc2).toBe(n1337bcID);
testAPI.refreshBlockchainID(n3bcID);
const bc3 = testAPI.getBlockchainID();
expect(bc3).toBe(n3bcID);
}));
test("listAddresses", () => __awaiter(void 0, void 0, void 0, function* () {
const addresses = [addrA, addrB];
const result = api.listAddresses(username, password);
const payload = {
result: {
addresses
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(addresses);
}));
test("importKey", () => __awaiter(void 0, void 0, void 0, function* () {
const address = addrC;
const result = api.importKey(username, password, "key");
const payload = {
result: {
address
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(address);
}));
test("getBalance", () => __awaiter(void 0, void 0, void 0, function* () {
const balance = new bn_js_1.default("100", 10);
const respobj = {
balance,
utxoIDs: [
{
txID: "LUriB3W919F84LwPMMw4sm2fZ4Y76Wgb6msaauEY7i1tFNmtv",
outputIndex: 0
}
]
};
const result = api.getBalance(addrA, "ATH");
const payload = {
result: respobj
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(JSON.stringify(response)).toBe(JSON.stringify(respobj));
}));
test("getBalance includePartial", () => __awaiter(void 0, void 0, void 0, function* () {
const balance = new bn_js_1.default("100", 10);
const respobj = {
balance,
utxoIDs: [
{
txID: "LUriB3W919F84LwPMMw4sm2fZ4Y76Wgb6msaauEY7i1tFNmtv",
outputIndex: 0
}
]
};
const result = api.getBalance(addrA, "ATH", true);
const payload = {
result: respobj
};
const responseObj = {
data: payload
};
const expectedRequestPayload = {
id: 1,
method: "avm.getBalance",
params: {
address: addrA,
assetID: "ATH",
includePartial: true
},
jsonrpc: "2.0"
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
const calledWith = {
baseURL: "https://127.0.0.1:9650",
data: '{"id":9,"method":"avm.getBalance","params":{"address":"X-custom1d6kkj0qh4wcmus3tk59npwt3rluc6en755a58g","assetID":"ATH","includePartial":true},"jsonrpc":"2.0"}',
headers: {
"Content-Type": "application/json;charset=UTF-8"
},
method: "POST",
params: {},
responseType: "json",
url: "/ext/bc/X"
};
expect(jest_mock_axios_1.default.request).toBeCalledWith(calledWith);
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(JSON.stringify(response)).toBe(JSON.stringify(respobj));
}));
test("exportKey", () => __awaiter(void 0, void 0, void 0, function* () {
const key = "sdfglvlj2h3v45";
const result = api.exportKey(username, password, addrA);
const payload = {
result: {
privateKey: key
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(key);
}));
test("export", () => __awaiter(void 0, void 0, void 0, function* () {
const amount = new bn_js_1.default(100);
const to = "abcdef";
const assetID = "AVAX";
const username = "Robert";
const password = "Paulson";
const txID = "valid";
const result = api.export(username, password, to, amount, assetID);
const payload = {
result: {
txID: txID
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(txID);
}));
test("import", () => __awaiter(void 0, void 0, void 0, function* () {
const to = "abcdef";
const username = "Robert";
const password = "Paulson";
const txID = "valid";
const result = api.import(username, password, to, blockchainID);
const payload = {
result: {
txID: txID
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(txID);
}));
test("createAddress", () => __awaiter(void 0, void 0, void 0, function* () {
const alias = "randomalias";
const result = api.createAddress(username, password);
const payload = {
result: {
address: alias
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(alias);
}));
test("createFixedCapAsset", () => __awaiter(void 0, void 0, void 0, function* () {
const kp = new keychain_1.KeyPair(avalanche.getHRP(), alias);
kp.importKey(buffer_1.Buffer.from("ef9bf2d4436491c153967c9709dd8e82795bdb9b5ad44ee22c2903005d1cf676", "hex"));
const denomination = 0;
const assetID = "8a5d2d32e68bc50036e4d086044617fe4a0a0296b274999ba568ea92da46d533";
const initialHolders = [
{
address: "7sik3Pr6r1FeLrvK1oWwECBS8iJ5VPuSh",
amount: "10000"
},
{
address: "7sik3Pr6r1FeLrvK1oWwECBS8iJ5VPuSh",
amount: "50000"
}
];
const result = api.createFixedCapAsset(username, password, "Some Coin", "SCC", denomination, initialHolders);
const payload = {
result: {
assetID: assetID
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(assetID);
}));
test("createVariableCapAsset", () => __awaiter(void 0, void 0, void 0, function* () {
const kp = new keychain_1.KeyPair(avalanche.getHRP(), alias);
kp.importKey(buffer_1.Buffer.from("ef9bf2d4436491c153967c9709dd8e82795bdb9b5ad44ee22c2903005d1cf676", "hex"));
const denomination = 0;
const assetID = "8a5d2d32e68bc50036e4d086044617fe4a0a0296b274999ba568ea92da46d533";
const minterSets = [
{
minters: ["4peJsFvhdn7XjhNF4HWAQy6YaJts27s9q"],
threshold: 1
},
{
minters: [
"dcJ6z9duLfyQTgbjq2wBCowkvcPZHVDF",
"2fE6iibqfERz5wenXE6qyvinsxDvFhHZk",
"7ieAJbfrGQbpNZRAQEpZCC1Gs1z5gz4HU"
],
threshold: 2
}
];
const result = api.createVariableCapAsset(username, password, "Some Coin", "SCC", denomination, minterSets);
const payload = {
result: {
assetID: assetID
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(assetID);
}));
test("mint 1", () => __awaiter(void 0, void 0, void 0, function* () {
const username = "Collin";
const password = "Cusce";
const amount = 2;
const assetID = "f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7";
const to = "dcJ6z9duLfyQTgbjq2wBCowkvcPZHVDF";
const minters = [
"dcJ6z9duLfyQTgbjq2wBCowkvcPZHVDF",
"2fE6iibqfERz5wenXE6qyvinsxDvFhHZk",
"7ieAJbfrGQbpNZRAQEpZCC1Gs1z5gz4HU"
];
const result = api.mint(username, password, amount, assetID, to, minters);
const payload = {
result: {
txID: "sometx"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("sometx");
}));
test("mint 2", () => __awaiter(void 0, void 0, void 0, function* () {
const username = "Collin";
const password = "Cusce";
const amount = new bn_js_1.default(1);
const assetID = buffer_1.Buffer.from("f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7", "hex");
const to = "dcJ6z9duLfyQTgbjq2wBCowkvcPZHVDF";
const minters = [
"dcJ6z9duLfyQTgbjq2wBCowkvcPZHVDF",
"2fE6iibqfERz5wenXE6qyvinsxDvFhHZk",
"7ieAJbfrGQbpNZRAQEpZCC1Gs1z5gz4HU"
];
const result = api.mint(username, password, amount, assetID, to, minters);
const payload = {
result: {
txID: "sometx"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("sometx");
}));
test("getTx", () => __awaiter(void 0, void 0, void 0, function* () {
const txid = "f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7";
const result = api.getTx(txid);
const payload = {
result: {
tx: "sometx"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("sometx");
}));
test("getTxStatus", () => __awaiter(void 0, void 0, void 0, function* () {
const txid = "f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7";
const result = api.getTxStatus(txid);
const payload = {
result: {
status: "accepted"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("accepted");
}));
test("getAssetDescription as string", () => __awaiter(void 0, void 0, void 0, function* () {
const assetID = buffer_1.Buffer.from("8a5d2d32e68bc50036e4d086044617fe4a0a0296b274999ba568ea92da46d533", "hex");
const assetidstr = bintools.cb58Encode(assetID);
const result = api.getAssetDescription(assetidstr);
const payload = {
result: {
name: "Collin Coin",
symbol: "CKC",
assetID: assetidstr,
denomination: "10"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response.name).toBe("Collin Coin");
expect(response.symbol).toBe("CKC");
expect(response.assetID.toString("hex")).toBe(assetID.toString("hex"));
expect(response.denomination).toBe(10);
}));
test("getAssetDescription as Buffer", () => __awaiter(void 0, void 0, void 0, function* () {
const assetID = buffer_1.Buffer.from("8a5d2d32e68bc50036e4d086044617fe4a0a0296b274999ba568ea92da46d533", "hex");
const assetidstr = bintools.cb58Encode(buffer_1.Buffer.from("8a5d2d32e68bc50036e4d086044617fe4a0a0296b274999ba568ea92da46d533", "hex"));
const result = api.getAssetDescription(assetID);
const payload = {
result: {
name: "Collin Coin",
symbol: "CKC",
assetID: assetidstr,
denomination: "11"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response.name).toBe("Collin Coin");
expect(response.symbol).toBe("CKC");
expect(response.assetID.toString("hex")).toBe(assetID.toString("hex"));
expect(response.denomination).toBe(11);
}));
test("getUTXOs", () => __awaiter(void 0, void 0, void 0, function* () {
// Payment
const OPUTXOstr1 = bintools.cb58Encode(buffer_1.Buffer.from("000038d1b9f1138672da6fb6c35125539276a9acc2a668d63bea6ba3c795e2edb0f5000000013e07e38e2f23121be8756412c18db7246a16d26ee9936f3cba28be149cfd3558000000070000000000004dd500000000000000000000000100000001a36fd0c2dbcab311731dde7ef1514bd26fcdc74d", "hex"));
const OPUTXOstr2 = bintools.cb58Encode(buffer_1.Buffer.from("0000c3e4823571587fe2bdfc502689f5a8238b9d0ea7f3277124d16af9de0d2d9911000000003e07e38e2f23121be8756412c18db7246a16d26ee9936f3cba28be149cfd355800000007000000000000001900000000000000000000000100000001e1b6b6a4bad94d2e3f20730379b9bcd6f176318e", "hex"));
const OPUTXOstr3 = bintools.cb58Encode(buffer_1.Buffer.from("0000f29dba61fda8d57a911e7f8810f935bde810d3f8d495404685bdb8d9d8545e86000000003e07e38e2f23121be8756412c18db7246a16d26ee9936f3cba28be149cfd355800000007000000000000001900000000000000000000000100000001e1b6b6a4bad94d2e3f20730379b9bcd6f176318e", "hex"));
const set = new utxos_1.UTXOSet();
set.add(OPUTXOstr1);
set.addArray([OPUTXOstr2, OPUTXOstr3]);
const persistOpts = new persistenceoptions_1.PersistanceOptions("test", true, "union");
expect(persistOpts.getMergeRule()).toBe("union");
let addresses = set
.getAddresses()
.map((a) => api.addressFromBuffer(a));
let result = api.getUTXOs(addresses, api.getBlockchainID(), 0, undefined, persistOpts);
const payload = {
result: {
numFetched: 3,
utxos: [OPUTXOstr1, OPUTXOstr2, OPUTXOstr3],
stopIndex: { address: "a", utxo: "b" }
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
let response = (yield result).utxos;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(JSON.stringify(response.getAllUTXOStrings().sort())).toBe(JSON.stringify(set.getAllUTXOStrings().sort()));
addresses = set.getAddresses().map((a) => api.addressFromBuffer(a));
result = api.getUTXOs(addresses, api.getBlockchainID(), 0, undefined, persistOpts);
jest_mock_axios_1.default.mockResponse(responseObj);
response = (yield result).utxos;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(2);
expect(JSON.stringify(response.getAllUTXOStrings().sort())).toBe(JSON.stringify(set.getAllUTXOStrings().sort()));
}));
describe("Transactions", () => {
let set;
let keymgr2;
let keymgr3;
let addrs1;
let addrs2;
let addrs3;
let addressbuffs = [];
let addresses = [];
let utxos;
let inputs;
let outputs;
let ops;
let amnt = 10000;
const assetID = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update("mary had a little lamb").digest());
const NFTassetID = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
.update("I can't stand it, I know you planned it, I'mma set straight this Watergate.")
.digest());
let secpbase1;
let secpbase2;
let secpbase3;
let initialState;
let nftpbase1;
let nftpbase2;
let nftpbase3;
let nftInitialState;
let nftutxoids = [];
let fungutxoids = [];
let avm;
const fee = 10;
const name = "Mortycoin is the dumb as a sack of hammers.";
const symbol = "morT";
const denomination = 8;
let secpMintOut1;
let secpMintOut2;
let secpMintTXID;
let secpMintUTXO;
let secpMintXferOut1;
let secpMintXferOut2;
let secpMintOp;
let xfersecpmintop;
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
avm = new api_1.AVMAPI(avalanche, "/ext/bc/X", blockchainID);
const result = avm.getAVAXAssetID(true);
const payload = {
result: {
name,
symbol,
assetID: bintools.cb58Encode(assetID),
denomination: denomination
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
yield result;
set = new utxos_1.UTXOSet();
avm.newKeyChain();
keymgr2 = new keychain_1.KeyChain(avalanche.getHRP(), alias);
keymgr3 = new keychain_1.KeyChain(avalanche.getHRP(), alias);
addrs1 = [];
addrs2 = [];
addrs3 = [];
utxos = [];
inputs = [];
outputs = [];
ops = [];
nftutxoids = [];
fungutxoids = [];
const pload = buffer_1.Buffer.alloc(1024);
pload.write("All you Trekkies and TV addicts, Don't mean to diss don't mean to bring static.", 0, 1024, "utf8");
for (let i = 0; i < 3; i++) {
addrs1.push(avm.addressFromBuffer(avm.keyChain().makeKey().getAddress()));
addrs2.push(avm.addressFromBuffer(keymgr2.makeKey().getAddress()));
addrs3.push(avm.addressFromBuffer(keymgr3.makeKey().getAddress()));
}
const amount = constants_4.ONEAVAX.mul(new bn_js_1.default(amnt));
addressbuffs = avm.keyChain().getAddresses();
addresses = addressbuffs.map((a) => avm.addressFromBuffer(a));
const locktime = new bn_js_1.default(54321);
const threshold = 3;
for (let i = 0; i < 5; i++) {
let txid = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
.update(bintools.fromBNToBuffer(new bn_js_1.default(i), 32))
.digest());
let txidx = buffer_1.Buffer.alloc(4);
txidx.writeUInt32BE(i, 0);
const out = new outputs_1.SECPTransferOutput(amount, addressbuffs, locktime, threshold);
const xferout = new outputs_1.TransferableOutput(assetID, out);
outputs.push(xferout);
const u = new utxos_1.UTXO();
u.fromBuffer(buffer_1.Buffer.concat([u.getCodecIDBuffer(), txid, txidx, xferout.toBuffer()]));
fungutxoids.push(u.getUTXOID());
utxos.push(u);
txid = u.getTxID();
txidx = u.getOutputIdx();
const asset = u.getAssetID();
const input = new inputs_1.SECPTransferInput(amount);
const xferinput = new inputs_1.TransferableInput(txid, txidx, asset, input);
inputs.push(xferinput);
const nout = new outputs_1.NFTTransferOutput(1000 + i, pload, addressbuffs, locktime, threshold);
const op = new ops_1.NFTTransferOperation(nout);
const nfttxid = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
.update(bintools.fromBNToBuffer(new bn_js_1.default(1000 + i), 32))
.digest());
const nftutxo = new utxos_1.UTXO(constants_1.AVMConstants.LATESTCODEC, nfttxid, 1000 + i, NFTassetID, nout);
nftutxoids.push(nftutxo.getUTXOID());
const xferop = new ops_1.TransferableOperation(NFTassetID, [nftutxo.getUTXOID()], op);
ops.push(xferop);
utxos.push(nftutxo);
}
set.addArray(utxos);
secpbase1 = new outputs_1.SECPTransferOutput(new bn_js_1.default(777), addrs3.map((a) => avm.parseAddress(a)), (0, helperfunctions_1.UnixNow)(), 1);
secpbase2 = new outputs_1.SECPTransferOutput(new bn_js_1.default(888), addrs2.map((a) => avm.parseAddress(a)), (0, helperfunctions_1.UnixNow)(), 1);
secpbase3 = new outputs_1.SECPTransferOutput(new bn_js_1.default(999), addrs2.map((a) => avm.parseAddress(a)), (0, helperfunctions_1.UnixNow)(), 1);
initialState = new initialstates_1.InitialStates();
initialState.addOutput(secpbase1, constants_1.AVMConstants.SECPFXID);
initialState.addOutput(secpbase2, constants_1.AVMConstants.SECPFXID);
initialState.addOutput(secpbase3, constants_1.AVMConstants.SECPFXID);
nftpbase1 = new outputs_1.NFTMintOutput(0, addrs1.map((a) => api.parseAddress(a)), locktime, 1);
nftpbase2 = new outputs_1.NFTMintOutput(1, addrs2.map((a) => api.parseAddress(a)), locktime, 1);
nftpbase3 = new outputs_1.NFTMintOutput(2, addrs3.map((a) => api.parseAddress(a)), locktime, 1);
nftInitialState = new initialstates_1.InitialStates();
nftInitialState.addOutput(nftpbase1, constants_1.AVMConstants.NFTFXID);
nftInitialState.addOutput(nftpbase2, constants_1.AVMConstants.NFTFXID);
nftInitialState.addOutput(nftpbase3, constants_1.AVMConstants.NFTFXID);
secpMintOut1 = new outputs_1.SECPMintOutput(addressbuffs, new bn_js_1.default(0), 1);
secpMintOut2 = new outputs_1.SECPMintOutput(addressbuffs, new bn_js_1.default(0), 1);
secpMintTXID = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
.update(bintools.fromBNToBuffer(new bn_js_1.default(1337), 32))
.digest());
secpMintUTXO = new utxos_1.UTXO(constants_1.AVMConstants.LATESTCODEC, secpMintTXID, 0, assetID, secpMintOut1);
secpMintXferOut1 = new outputs_1.SECPTransferOutput(new bn_js_1.default(123), addrs3.map((a) => avm.parseAddress(a)), (0, helperfunctions_1.UnixNow)(), 2);
secpMintXferOut2 = new outputs_1.SECPTransferOutput(new bn_js_1.default(456), [avm.parseAddress(addrs2[0])], (0, helperfunctions_1.UnixNow)(), 1);
secpMintOp = new ops_1.SECPMintOperation(secpMintOut1, secpMintXferOut1);
set.add(secpMintUTXO);
xfersecpmintop = new ops_1.TransferableOperation(assetID, [secpMintUTXO.getUTXOID()], secpMintOp);
}));
test("getDefaultMintTxFee", () => {
expect(avm.getDefaultMintTxFee().toString()).toBe("1000000");
});
test("signTx", () => __awaiter(void 0, void 0, void 0, function* () {
const txu1 = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1);
const txu2 = set.buildBaseTx(networkID, bintools.cb58Decode(blockchainID), new bn_js_1.default(amnt), assetID, addrs3.map((a) => avm.parseAddress(a)), addrs1.map((a) => avm.parseAddress(a)), addrs1.map((a) => avm.parseAddress(a)), avm.getTxFee(), assetID, undefined, (0, helperfunctions_1.UnixNow)(), new bn_js_1.default(0), 1);
const tx1 = avm.signTx(txu1);
const tx2 = avm.signTx(txu2);
expect(tx2.toBuffer().toString("hex")).toBe(tx1.toBuffer().toString("hex"));
expect(tx2.toString()).toBe(tx1.toString());
}));
test("buildBaseTx1", () => __awaiter(void 0, void 0, void 0, function* () {
const txu1 = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1, new payload_1.UTF8Payload("hello world").getContent());
const memobuf = buffer_1.Buffer.from("hello world");
const txu2 = set.buildBaseTx(networkID, bintools.cb58Decode(blockchainID), new bn_js_1.default(amnt), assetID, addrs3.map((a) => avm.parseAddress(a)), addrs1.map((a) => avm.parseAddress(a)), addrs1.map((a) => avm.parseAddress(a)), avm.getTxFee(), assetID, memobuf, (0, helperfunctions_1.UnixNow)(), new bn_js_1.default(0), 1);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
}));
test("xssPreventionObject", () => __awaiter(void 0, void 0, void 0, function* () {
const txu1 = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1);
const tx1 = avm.signTx(txu1);
const tx1obj = tx1.serialize("hex");
const sanitized = tx1.sanitizeObject(tx1obj);
expect(tx1obj).toStrictEqual(sanitized);
}));
test("xssPreventionHTML", () => __awaiter(void 0, void 0, void 0, function* () {
const dirtyDom = "<img src='https://x' onerror=alert(1)//>";
const sanitizedString = `<img src="https://x" />`;
const txu1 = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1);
const tx1 = avm.signTx(txu1);
const tx1obj = tx1.serialize("hex");
const dirtyObj = Object.assign(Object.assign({}, tx1obj), { dirtyDom: dirtyDom });
const sanitizedObj = tx1.sanitizeObject(dirtyObj);
expect(sanitizedObj.dirtyDom).toBe(sanitizedString);
}));
test("buildBaseTx2", () => __awaiter(void 0, void 0, void 0, function* () {
const txu1 = yield avm.buildBaseTx(set, new bn_js_1.default(amnt).sub(new bn_js_1.default(100)), bintools.cb58Encode(assetID), addrs3, addrs1, addrs2, new payload_1.UTF8Payload("hello world"));
const txu2 = set.buildBaseTx(networkID, bintools.cb58Decode(blockchainID), new bn_js_1.default(amnt).sub(new bn_js_1.default(100)), assetID, addrs3.map((a) => avm.parseAddress(a)), addrs1.map((a) => avm.parseAddress(a)), addrs2.map((a) => avm.parseAddress(a)), avm.getTxFee(), assetID, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)(), new bn_js_1.default(0), 1);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const outies = txu1
.getTransaction()
.getOuts()
.sort(outputs_1.TransferableOutput.comparator());
expect(outies.length).toBe(2);
const outaddr0 = outies[0]
.getOutput()
.getAddresses()
.map((a) => avm.addressFromBuffer(a));
const outaddr1 = outies[1]
.getOutput()
.getAddresses()
.map((a) => avm.addressFromBuffer(a));
const testaddr2 = JSON.stringify(addrs2.sort());
const testaddr3 = JSON.stringify(addrs3.sort());
const testout0 = JSON.stringify(outaddr0.sort());
const testout1 = JSON.stringify(outaddr1.sort());
expect((testaddr2 == testout0 && testaddr3 == testout1) ||
(testaddr3 == testout0 && testaddr2 == testout1)).toBe(true);
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "BaseTx");
}));
test("issueTx Serialized", () => __awaiter(void 0, void 0, void 0, function* () {
const txu = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1);
const tx = avm.signTx(txu);
const txid = "f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7";
const result = avm.issueTx(tx.toString());
const payload = {
result: {
txID: txid
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(response).toBe(txid);
}));
test("issueTx Buffer", () => __awaiter(void 0, void 0, void 0, function* () {
const txu = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1);
const tx = avm.signTx(txu);
const txid = "f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7";
const result = avm.issueTx(tx.toBuffer());
const payload = {
result: {
txID: txid
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(response).toBe(txid);
}));
test("issueTx Class Tx", () => __awaiter(void 0, void 0, void 0, function* () {
const txu = yield avm.buildBaseTx(set, new bn_js_1.default(amnt), bintools.cb58Encode(assetID), addrs3, addrs1, addrs1);
const tx = avm.signTx(txu);
const txid = "f966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7";
const result = avm.issueTx(tx);
const payload = {
result: {
txID: txid
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(response).toBe(txid);
}));
test("buildCreateAssetTx - Fixed Cap", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setCreationTxFee(new bn_js_1.default(fee));
const txu1 = yield avm.buildCreateAssetTx(set, addrs1, addrs2, initialState, name, symbol, denomination);
const txu2 = set.buildCreateAssetTx(avalanche.getNetworkID(), bintools.cb58Decode(avm.getBlockchainID()), addrs1.map((a) => avm.parseAddress(a)), addrs2.map((a) => avm.parseAddress(a)), initialState, name, symbol, denomination, undefined, utils_1.CENTIAVAX, assetID);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "CreateAssetTx");
}));
test("buildCreateAssetTx - Variable Cap", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setCreationTxFee(new bn_js_1.default(constants_2.Defaults.network[12345].P["creationTxFee"]));
const mintOutputs = [secpMintOut1, secpMintOut2];
const txu1 = yield avm.buildCreateAssetTx(set, addrs1, addrs2, initialState, name, symbol, denomination, mintOutputs);
const txu2 = set.buildCreateAssetTx(avalanche.getNetworkID(), bintools.cb58Decode(avm.getBlockchainID()), addrs1.map((a) => avm.parseAddress(a)), addrs2.map((a) => avm.parseAddress(a)), initialState, name, symbol, denomination, mintOutputs, avm.getCreationTxFee(), assetID);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
}));
test("buildSECPMintTx", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setTxFee(new bn_js_1.default(fee));
const newMinter = new outputs_1.SECPMintOutput(addrs3.map((a) => avm.parseAddress(a)), new bn_js_1.default(0), 1);
const txu1 = yield avm.buildSECPMintTx(set, newMinter, secpMintXferOut1, addrs1, addrs2, secpMintUTXO.getUTXOID());
const txu2 = set.buildSECPMintTx(avalanche.getNetworkID(), bintools.cb58Decode(avm.getBlockchainID()), newMinter, secpMintXferOut1, addrs1.map((a) => avm.parseAddress(a)), addrs2.map((a) => avm.parseAddress(a)), secpMintUTXO.getUTXOID(), utils_2.MILLIAVAX, assetID);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "SECPMintTx");
}));
test("buildCreateNFTAssetTx", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setCreationTxFee(new bn_js_1.default(constants_2.Defaults.network[12345].P["creationTxFee"]));
const minterSets = [new minterset_1.MinterSet(1, addrs1)];
const locktime = new bn_js_1.default(0);
const txu1 = yield avm.buildCreateNFTAssetTx(set, addrs1, addrs2, minterSets, name, symbol, new payload_1.UTF8Payload("hello world"), (0, helperfunctions_1.UnixNow)(), locktime);
const txu2 = set.buildCreateNFTAssetTx(avalanche.getNetworkID(), bintools.cb58Decode(avm.getBlockchainID()), addrs1.map((a) => avm.parseAddress(a)), addrs2.map((a) => avm.parseAddress(a)), minterSets, name, symbol, avm.getCreationTxFee(), assetID, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)(), locktime);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "CreateNFTAssetTx");
}));
test("buildCreateNFTMintTx", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setTxFee(new bn_js_1.default(fee));
const groupID = 0;
const locktime = new bn_js_1.default(0);
const threshold = 1;
const payload = buffer_1.Buffer.from("Avalanche");
const addrbuff1 = addrs1.map((a) => avm.parseAddress(a));
const addrbuff2 = addrs2.map((a) => avm.parseAddress(a));
const addrbuff3 = addrs3.map((a) => avm.parseAddress(a));
const outputOwners = [];
const oo = new output_1.OutputOwners(addrbuff3, locktime, threshold);
outputOwners.push();
const txu1 = yield avm.buildCreateNFTMintTx(set, oo, addrs1, addrs2, nftutxoids, groupID, payload, undefined, (0, helperfunctions_1.UnixNow)());
const txu2 = set.buildCreateNFTMintTx(avalanche.getNetworkID(), bintools.cb58Decode(avm.getBlockchainID()), [oo], addrbuff1, addrbuff2, nftutxoids, groupID, payload, avm.getTxFee(), assetID, undefined, (0, helperfunctions_1.UnixNow)());
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
outputOwners.push(oo);
outputOwners.push(new output_1.OutputOwners(addrbuff3, locktime, threshold + 1));
const txu3 = yield avm.buildCreateNFTMintTx(set, outputOwners, addrs1, addrs2, nftutxoids, groupID, payload, undefined, (0, helperfunctions_1.UnixNow)());
const txu4 = set.buildCreateNFTMintTx(avalanche.getNetworkID(), bintools.cb58Decode(avm.getBlockchainID()), outputOwners, addrbuff1, addrbuff2, nftutxoids, groupID, payload, avm.getTxFee(), assetID, undefined, (0, helperfunctions_1.UnixNow)());
expect(txu4.toBuffer().toString("hex")).toBe(txu3.toBuffer().toString("hex"));
expect(txu4.toString()).toBe(txu3.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "CreateNFTMintTx");
}));
test("buildNFTTransferTx", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setTxFee(new bn_js_1.default(fee));
const pload = buffer_1.Buffer.alloc(1024);
pload.write("All you Trekkies and TV addicts, Don't mean to diss don't mean to bring static.", 0, 1024, "utf8");
const addrbuff1 = addrs1.map((a) => avm.parseAddress(a));
const addrbuff2 = addrs2.map((a) => avm.parseAddress(a));
const addrbuff3 = addrs3.map((a) => avm.parseAddress(a));
const txu1 = yield avm.buildNFTTransferTx(set, addrs3, addrs1, addrs2, nftutxoids[1], new payload_1.UTF8Payload("hello world"), (0, helperfunctions_1.UnixNow)(), new bn_js_1.default(0), 1);
const txu2 = set.buildNFTTransferTx(networkID, bintools.cb58Decode(blockchainID), addrbuff3, addrbuff1, addrbuff2, [nftutxoids[1]], avm.getTxFee(), assetID, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)(), new bn_js_1.default(0), 1);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "NFTTransferTx");
}));
test("buildImportTx", () => __awaiter(void 0, void 0, void 0, function* () {
const locktime = new bn_js_1.default(0);
const threshold = 1;
avm.setTxFee(new bn_js_1.default(fee));
const addrbuff1 = addrs1.map((a) => avm.parseAddress(a));
const addrbuff2 = addrs2.map((a) => avm.parseAddress(a));
const addrbuff3 = addrs3.map((a) => avm.parseAddress(a));
const fungutxo = set.getUTXO(fungutxoids[1]);
const fungutxostr = fungutxo.toString();
const result = avm.buildImportTx(set, addrs1, constants_3.PlatformChainID, addrs3, addrs1, addrs2, new payload_1.UTF8Payload("hello world"), (0, helperfunctions_1.UnixNow)(), locktime, threshold);
const payload = {
result: {
utxos: [fungutxostr]
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const txu1 = yield result;
const txu2 = set.buildImportTx(networkID, bintools.cb58Decode(blockchainID), addrbuff3, addrbuff1, addrbuff2, [fungutxo], bintools.cb58Decode(constants_3.PlatformChainID), avm.getTxFee(), yield avm.getAVAXAssetID(), new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)(), locktime, threshold);
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "ImportTx");
}));
test("buildExportTx", () => __awaiter(void 0, void 0, void 0, function* () {
avm.setTxFee(new bn_js_1.default(fee));
const addrbuff1 = addrs1.map((a) => avm.parseAddress(a));
const addrbuff2 = addrs2.map((a) => avm.parseAddress(a));
const addrbuff3 = addrs3.map((a) => avm.parseAddress(a));
const amount = new bn_js_1.default(90);
const type = "bech32";
const txu1 = yield avm.buildExportTx(set, amount, bintools.cb58Decode(constants_3.PlatformChainID), addrbuff3.map((a) => serialization.bufferToType(a, type, avalanche.getHRP(), "P")), addrs1, addrs2, new payload_1.UTF8Payload("hello world"), (0, helperfunctions_1.UnixNow)());
const txu2 = set.buildExportTx(networkID, bintools.cb58Decode(blockchainID), amount, assetID, addrbuff3, addrbuff1, addrbuff2, bintools.cb58Decode(constants_3.PlatformChainID), avm.getTxFee(), assetID, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)());
expect(txu2.toBuffer().toString("hex")).toBe(txu1.toBuffer().toString("hex"));
expect(txu2.toString()).toBe(txu1.toString());
const txu3 = yield avm.buildExportTx(set, amount, constants_3.PlatformChainID, addrs3, addrs1, addrs2, new payload_1.UTF8Payload("hello world"), (0, helperfunctions_1.UnixNow)());
const txu4 = set.buildExportTx(networkID, bintools.cb58Decode(blockchainID), amount, assetID, addrbuff3, addrbuff1, addrbuff2, undefined, avm.getTxFee(), assetID, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)());
expect(txu4.toBuffer().toString("hex")).toBe(txu3.toBuffer().toString("hex"));
expect(txu4.toString()).toBe(txu3.toString());
const tx1 = txu1.sign(avm.keyChain());
const checkTx = tx1.toBuffer().toString("hex");
const tx1obj = tx1.serialize("hex");
const tx1str = JSON.stringify(tx1obj);
const tx2newobj = JSON.parse(tx1str);
const tx2 = new tx_1.Tx();
tx2.deserialize(tx2newobj, "hex");
const tx2obj = tx2.serialize("hex");
const tx2str = JSON.stringify(tx2obj);
expect(tx1obj).toStrictEqual(tx2obj);
expect(tx1str).toStrictEqual(tx2str);
expect(tx2.toBuffer().toString("hex")).toBe(checkTx);
const tx3 = txu1.sign(avm.keyChain());
const tx3obj = tx3.serialize(display);
const tx3str = JSON.stringify(tx3obj);
const tx4newobj = JSON.parse(tx3str);
const tx4 = new tx_1.Tx();
tx4.deserialize(tx4newobj, display);
const tx4obj = tx4.serialize(display);
const tx4str = JSON.stringify(tx4obj);
expect(tx3obj).toStrictEqual(tx4obj);
expect(tx3str).toStrictEqual(tx4str);
expect(tx4.toBuffer().toString("hex")).toBe(checkTx);
serialzeit(tx1, "ExportTx");
}));
test("buildGenesis", () => __awaiter(void 0, void 0, void 0, function* () {
const genesisData = {
genesisData: {
assetAlias1: {
name: "human readable name",
symbol: "AVAL",
initialState: {
fixedCap: [
{
amount: 1000,
address: "A"
},
{
amount: 5000,
address: "B"
}
]
}
},
assetAliasCanBeAnythingUnique: {
name: "human readable name",
symbol: "AVAL",
initialState: {
variableCap: [
{
minters: ["A", "B"],
threshold: 1
},
{
minters: ["A", "B", "C"],
threshold: 2
}
]
}
}
}
};
const bytes = "111TNWzUtHKoSvxohjyfEwE2X228ZDGBngZ4mdMUVMnVnjtnawW1b1zbAhzyAM1v6d7ECNj6DXsT7qDmhSEf3DWgXRj7ECwBX36ZXFc9tWVB2qHURoUfdDvFsBeSRqatCmj76eZQMGZDgBFRNijRhPNKUap7bCeKpHDtuCZc4YpPkd4mR84dLL2AL1b4K46eirWKMaFVjA5btYS4DnyUx5cLpAq3d35kEdNdU5zH3rTU18S4TxYV8voMPcLCTZ3h4zRsM5jW1cUzjWVvKg7uYS2oR9qXRFcgy1gwNTFZGstySuvSF7MZeZF4zSdNgC4rbY9H94RVhqe8rW7MXqMSZB6vBTB2BpgF6tNFehmYxEXwjaKRrimX91utvZe9YjgGbDr8XHsXCnXXg4ZDCjapCy4HmmRUtUoAduGNBdGVMiwE9WvVbpMFFcNfgDXGz9NiatgSnkxQALTHvGXXm8bn4CoLFzKnAtq3KwiWqHmV3GjFYeUm3m8Zee9VDfZAvDsha51acxfto1htstxYu66DWpT36YT18WSbxibZcKXa7gZrrsCwyzid8CCWw79DbaLCUiq9u47VqofG1kgxwuuyHb8NVnTgRTkQASSbj232fyG7YeX4mAvZY7a7K7yfSyzJaXdUdR7aLeCdLP6mbFDqUMrN6YEkU2X8d4Ck3T";
const result = api.buildGenesis(genesisData);
const payload = {
result: {
bytes: bytes
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(response).toBe(bytes);
}));
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0cy9hcGlzL2F2bS9hcGkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0VBQXVDO0FBQ3ZDLDZCQUErQjtBQUMvQixtREFBa0Q7QUFDbEQsNkRBQWtFO0FBQ2xFLG9DQUFnQztBQUNoQyxrREFBc0I7QUFDdEIsMkVBQWtEO0FBQ2xELHVEQUEyRDtBQUMzRCx5REFHcUM7QUFDckMsOERBQW9DO0FBQ3BDLGlEQUF5RDtBQUN6RCwrREFBOEQ7QUFDOUQsMkRBTXNDO0FBQ3RDLG1EQUlrQztBQUNsQywrQ0FBZ0M7QUFDaEMsd0RBQXdEO0FBQ3hELHVFQUFtRTtBQUNuRSw0REFBdUQ7QUFDdkQsd0VBQTREO0FBQzVELHVEQUF5RDtBQUN6RCwrREFBMkQ7QUFDM0QsNERBQThEO0FBQzlELDhFQUEwRTtBQUMxRSw0REFBc0Q7QUFDdEQsb0VBS3lDO0FBT3pDLHFDQUFxQztBQUNyQyxxQ0FBcUM7QUFFckM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBYSxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ2pELE1BQU0sYUFBYSxHQUFrQiw2QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ2hFLE1BQU0saUJBQWlCLEdBQVksS0FBSyxDQUFBO0FBQ3hDLE1BQU0sT0FBTyxHQUF1QixTQUFTLENBQUE7QUFFN0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFvQixFQUFFLElBQVksRUFBUSxFQUFFO0lBQzlELElBQUksaUJBQWlCLEVBQUU7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLENBQUMsU0FBUyxDQUNaLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHLGlCQUFpQixDQUFDLENBQ3hFLENBQ0YsQ0FBQTtRQUNELE9B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QVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFcEQsTUFBTSxHQUFHLEdBQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUN6QyxNQUFNLE1BQU0sR0FBVyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzdDLE1BQU0sTUFBTSxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDN0MsTUFBTSxTQUFTLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM1QyxNQUFNLEdBQUcsR0FBTyxJQUFJLE9BQUUsRUFBRSxDQUFBO1lBQ3hCLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRW5DLE1BQU0sTUFBTSxHQUFXLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDN0MsTUFBTSxNQUFNLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFF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Q0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2NrQXhpb3MgZnJvbSBcImplc3QtbW9jay1heGlvc1wiXG5pbXBvcnQgeyBBdmFsYW5jaGUgfSBmcm9tIFwic3JjXCJcbmltcG9ydCB7IEFWTUFQSSB9IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9hdm0vYXBpXCJcbmltcG9ydCB7IEtleVBhaXIsIEtleUNoYWluIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2F2bS9rZXljaGFpblwiXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyL1wiXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCJcbmltcG9ydCBCaW5Ub29scyBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2JpbnRvb2xzXCJcbmltcG9ydCB7IFVUWE9TZXQsIFVUWE8gfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL3V0eG9zXCJcbmltcG9ydCB7XG4gIFRyYW5zZmVyYWJsZUlucHV0LFxuICBTRUNQVHJhbnNmZXJJbnB1dFxufSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2lucHV0c1wiXG5pbXBvcnQgY3JlYXRlSGFzaCBmcm9tIFwiY3JlYXRlLWhhc2hcIlxuaW1wb3J0IHsgVW5zaWduZWRUeCwgVHggfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL3R4XCJcbmltcG9ydCB7IEFWTUNvbnN0YW50cyB9IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9hdm0vY29uc3RhbnRzXCJcbmltcG9ydCB7XG4gIFRyYW5zZmVyYWJsZU91dHB1dCxcbiAgU0VDUFRyYW5zZmVyT3V0cHV0LFxuICBORlRNaW50T3V0cHV0LFxuICBORlRUcmFuc2Zlck91dHB1dCxcbiAgU0VDUE1pbnRPdXRwdXRcbn0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2F2bS9vdXRwdXRzXCJcbmltcG9ydCB7XG4gIE5GVFRyYW5zZmVyT3BlcmF0aW9uLFxuICBUcmFuc2ZlcmFibGVPcGVyYXRpb24sXG4gIFNFQ1BNaW50T3BlcmF0aW9uXG59IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9hdm0vb3BzXCJcbmltcG9ydCAqIGFzIGJlY2gzMiBmcm9tIFwiYmVjaDMyXCJcbmltcG9ydCB7IFVURjhQYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy91dGlscy9wYXlsb2FkXCJcbmltcG9ydCB7IEluaXRpYWxTdGF0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2luaXRpYWxzdGF0ZXNcIlxuaW1wb3J0IHsgRGVmYXVsdHMgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBVbml4Tm93IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy91dGlscy9oZWxwZXJmdW5jdGlvbnNcIlxuaW1wb3J0IHsgT3V0cHV0T3duZXJzIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9jb21tb24vb3V0cHV0XCJcbmltcG9ydCB7IE1pbnRlclNldCB9IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9hdm0vbWludGVyc2V0XCJcbmltcG9ydCB7IFBsYXRmb3JtQ2hhaW5JRCB9IGZyb20gXCIuLi8uLi8uLi9zcmMvdXRpbHMvY29uc3RhbnRzXCJcbmltcG9ydCB7IFBlcnNpc3RhbmNlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9zcmMvdXRpbHMvcGVyc2lzdGVuY2VvcHRpb25zXCJcbmltcG9ydCB7IE9ORUFWQVggfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50c1wiXG5pbXBvcnQge1xuICBTZXJpYWxpemFibGUsXG4gIFNlcmlhbGl6YXRpb24sXG4gIFNlcmlhbGl6ZWRFbmNvZGluZyxcbiAgU2VyaWFsaXplZFR5cGVcbn0gZnJvbSBcIi4uLy4uLy4uL3NyYy91dGlscy9zZXJpYWxpemF0aW9uXCJcbmltcG9ydCB7IEh0dHBSZXNwb25zZSB9IGZyb20gXCJqZXN0LW1vY2stYXhpb3MvZGlzdC9saWIvbW9jay1heGlvcy10eXBlc1wiXG5pbXBvcnQge1xuICBHZXRCYWxhbmNlUmVzcG9uc2UsXG4gIFNlbmRNdWx0aXBsZVJlc3BvbnNlLFxuICBTZW5kUmVzcG9uc2Vcbn0gZnJvbSBcInNyYy9hcGlzL2F2bS9pbnRlcmZhY2VzXCJcbmltcG9ydCB7IENFTlRJQVZBWCB9IGZyb20gXCJzcmMvdXRpbHNcIlxuaW1wb3J0IHsgTUlMTElBVkFYIH0gZnJvbSBcInNyYy91dGlsc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29sczogQmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpXG5jb25zdCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gU2VyaWFsaXphdGlvbi5nZXRJbnN0YW5jZSgpXG5jb25zdCBkdW1wU2VyYWlsaXphdGlvbjogYm9vbGVhbiA9IGZhbHNlXG5jb25zdCBkaXNwbGF5OiBTZXJpYWxpemVkRW5jb2RpbmcgPSBcImRpc3BsYXlcIlxuXG5jb25zdCBzZXJpYWx6ZWl0ID0gKGFUaGluZzogU2VyaWFsaXphYmxlLCBuYW1lOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYgKGR1bXBTZXJhaWxpemF0aW9uKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgc2VyaWFsaXphdGlvbi5zZXJpYWxpemUoYVRoaW5nLCBcImF2bVwiLCBcImhleFwiLCBuYW1lICsgXCIgLS0gSGV4IEVuY29kZWRcIilcbiAgICAgIClcbiAgICApXG4gICAgY29uc29sZS5sb2coXG4gICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgc2VyaWFsaXphdGlvbi5zZXJpYWxpemUoXG4gICAgICAgICAgYVRoaW5nLFxuICAgICAgICAgIFwiYXZtXCIsXG4gICAgICAgICAgXCJkaXNwbGF5XCIsXG4gICAgICAgICAgbmFtZSArIFwiIC0tIEh1bWFuLVJlYWRhYmxlXCJcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxufVxuXG5kZXNjcmliZShcIkFWTUFQSVwiLCAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IG5ldHdvcmtJRDogbnVtYmVyID0gMTMzN1xuICBjb25zdCBibG9ja2NoYWluSUQ6IHN0cmluZyA9IERlZmF1bHRzLm5ldHdvcmtbbmV0d29ya0lEXS5YLmJsb2NrY2hhaW5JRFxuICBjb25zdCBpcDogc3RyaW5nID0gXCIxMjcuMC4wLjFcIlxuICBjb25zdCBwb3J0OiBudW1iZXIgPSA5NjUwXG4gIGNvbnN0IHByb3RvY29sOiBzdHJpbmcgPSBcImh0dHBzXCJcblxuICBjb25zdCB1c2VybmFtZTogc3RyaW5nID0gXCJBdmFMYWJzXCJcbiAgY29uc3QgcGFzc3dvcmQ6IHN0cmluZyA9IFwicGFzc3dvcmRcIlxuXG4gIGNvbnN0IGF2YWxhbmNoZTogQXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcbiAgICBpcCxcbiAgICBwb3J0LFxuICAgIHByb3RvY29sLFxuICAgIG5ldHdvcmtJRCxcbiAgICB1bmRlZmluZWQsXG4gICAgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cnVlXG4gIClcbiAgbGV0IGFwaTogQVZNQVBJXG4gIGxldCBhbGlhczogc3RyaW5nXG5cbiAgY29uc3QgYWRkckE6IHN0cmluZyA9IGBYLSR7YmVjaDMyLmJlY2gzMi5lbmNvZGUoXG4gICAgYXZhbGFuY2hlLmdldEhSUCgpLFxuICAgIGJlY2gzMi5iZWNoMzIudG9Xb3JkcyhcbiAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoXCJCNkQ0djFWdFBZTGJpVXZZWHRXNFB4OG9FOWltQzJ2R1dcIilcbiAgICApXG4gICl9YFxuICBjb25zdCBhZGRyQjogc3RyaW5nID0gYFgtJHtiZWNoMzIuYmVjaDMyLmVuY29kZShcbiAgICBhdmFsYW5jaGUuZ2V0SFJQKCksXG4gICAgYmVjaDMyLmJlY2gzMi50b1dvcmRzKFxuICAgICAgYmludG9vbHMuY2I1OERlY29kZShcIlA1d2RSdVplYUR0MjhlSE1QNVMzdzlaZG9CZm83d3V6RlwiKVxuICAgIClcbiAgKX1gXG4gIGNvbnN0IGFkZHJDOiBzdHJpbmcgPSBgWC0ke2JlY2gzMi5iZWNoMzIuZW5jb2RlKFxuICAgIGF2YWxhbmNoZS5nZXRIUlAoKSxcbiAgICBiZWNoMzIuYmVjaDMyLnRvV29yZHMoXG4gICAgICBiaW50b29scy5jYjU4RGVjb2RlKFwiNlkza3lzakY5am5IbllrZFM5eUdBdW9IeWFlMmVObWVWXCIpXG4gICAgKVxuICApfWBcblxuICBiZWZvcmVBbGwoKCk6IHZvaWQgPT4ge1xuICAgIGFwaSA9IG5ldyBBVk1BUEkoYXZhbGFuY2hlLCBcIi9leHQvYmMvWFwiLCBibG9ja2NoYWluSUQpXG4gICAgYWxpYXMgPSBhcGkuZ2V0QmxvY2tjaGFpbkFsaWFzKClcbiAgfSlcblxuICBhZnRlckVhY2goKCk6IHZvaWQgPT4ge1xuICAgIG1vY2tBeGlvcy5yZXNldCgpXG4gIH0pXG5cbiAgdGVzdChcImZhaWxzIHRvIHNlbmQgd2l0aCBpbmNvcnJlY3QgdXNlcm5hbWVcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG1lbW86IHN0cmluZyA9IFwiaGVsbG8gd29ybGRcIlxuICAgIGNvbnN0IGluY29ycmVjdFVzZXJOYW1lOiBzdHJpbmcgPSBcImFzZGZhc2Rmc2FcIlxuICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IGBwcm9ibGVtIHJldHJpZXZpbmcgdXNlcjogaW5jb3JyZWN0IHBhc3N3b3JkIGZvciB1c2VyIFwiJHtpbmNvcnJlY3RVc2VyTmFtZX1cImBcbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8U2VuZFJlc3BvbnNlPiA9IGFwaS5zZW5kKFxuICAgICAgaW5jb3JyZWN0VXNlck5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIFwiYXNzZXRJZFwiLFxuICAgICAgMTAsXG4gICAgICBhZGRyQSxcbiAgICAgIFthZGRyQl0sXG4gICAgICBhZGRyQSxcbiAgICAgIG1lbW9cbiAgICApXG5cbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgY29kZTogLTMyMDAwLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBkYXRhOiBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogb2JqZWN0ID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZVtcImNvZGVcIl0pLnRvQmUoLTMyMDAwKVxuICAgIGV4cGVjdChyZXNwb25zZVtcIm1lc3NhZ2VcIl0pLnRvQmUobWVzc2FnZSlcbiAgfSlcblxuICB0ZXN0KFwiZmFpbHMgdG8gc2VuZCB3aXRoIGluY29ycmVjdCBQYXNzd29yZFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbWVtbzogc3RyaW5nID0gXCJoZWxsbyB3b3JsZFwiXG4gICAgY29uc3QgaW5jb3JyZWN0UGFzc3dvcmQ6IHN0cmluZyA9IFwiYXNkZmFzZGZzYVwiXG4gICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gYHByb2JsZW0gcmV0cmlldmluZyB1c2VyOiBpbmNvcnJlY3QgcGFzc3dvcmQgZm9yIHVzZXIgXCIke2luY29ycmVjdFBhc3N3b3JkfVwiYFxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxTZW5kUmVzcG9uc2U+ID0gYXBpLnNlbmQoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIGluY29ycmVjdFBhc3N3b3JkLFxuICAgICAgXCJhc3NldElkXCIsXG4gICAgICAxMCxcbiAgICAgIGFkZHJBLFxuICAgICAgW2FkZHJCXSxcbiAgICAgIGFkZHJBLFxuICAgICAgbWVtb1xuICAgIClcblxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBjb2RlOiAtMzIwMDAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBvYmplY3QgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlW1wiY29kZVwiXSkudG9CZSgtMzIwMDApXG4gICAgZXhwZWN0KHJlc3BvbnNlW1wibWVzc2FnZVwiXSkudG9CZShtZXNzYWdlKVxuICB9KVxuXG4gIHRlc3QoXCJjYW4gU2VuZCAxXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB0eElkOiBzdHJpbmcgPSBcImFzZGZodmwyMzRcIlxuICAgIGNvbnN0IG1lbW86IHN0cmluZyA9IFwiaGVsbG8gd29ybGRcIlxuICAgIGNvbnN0IGNoYW5nZUFkZHI6IHN0cmluZyA9IFwiWC1sb2NhbDFcIlxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxTZW5kUmVzcG9uc2U+ID0gYXBpLnNlbmQoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgXCJhc3NldElkXCIsXG4gICAgICAxMCxcbiAgICAgIGFkZHJBLFxuICAgICAgW2FkZHJCXSxcbiAgICAgIGFkZHJBLFxuICAgICAgbWVtb1xuICAgIClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgdHhJRDogdHhJZCxcbiAgICAgICAgY2hhbmdlQWRkcjogY2hhbmdlQWRkclxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IG9iamVjdCA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2VbXCJ0eElEXCJdKS50b0JlKHR4SWQpXG4gICAgZXhwZWN0KHJlc3BvbnNlW1wiY2hhbmdlQWRkclwiXSkudG9CZShjaGFuZ2VBZGRyKVxuICB9KVxuXG4gIHRlc3QoXCJjYW4gU2VuZCAyXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB0eElkOiBzdHJpbmcgPSBcImFzZGZodmwyMzRcIlxuICAgIGNvbnN0IG1lbW86IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFwiaGVsbG8gd29ybGRcIilcbiAgICBjb25zdCBjaGFuZ2VBZGRyOiBzdHJpbmcgPSBcIlgtbG9jYWwxXCJcbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8U2VuZFJlc3BvbnNlPiA9IGFwaS5zZW5kKFxuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIGJpbnRvb2xzLmI1OFRvQnVmZmVyKFwiNmgyczVkZTFWQzY1bWVhakUxTDJQanZaMU1YdkhjM0Y2ZXFQQ0dLdUR0NE14aXdlRlwiKSxcbiAgICAgIG5ldyBCTigxMCksXG4gICAgICBhZGRyQSxcbiAgICAgIFthZGRyQl0sXG4gICAgICBhZGRyQSxcbiAgICAgIG1lbW9cbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHR4SUQ6IHR4SWQsXG4gICAgICAgIGNoYW5nZUFkZHI6IGNoYW5nZUFkZHJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBvYmplY3QgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlW1widHhJRFwiXSkudG9CZSh0eElkKVxuICAgIGV4cGVjdChyZXNwb25zZVtcImNoYW5nZUFkZHJcIl0pLnRvQmUoY2hhbmdlQWRkcilcbiAgfSlcblxuICB0ZXN0KFwiY2FuIFNlbmQgTXVsdGlwbGVcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHR4SWQ6IHN0cmluZyA9IFwiYXNkZmh2bDIzNFwiXG4gICAgY29uc3QgbWVtbzogc3RyaW5nID0gXCJoZWxsbyB3b3JsZFwiXG4gICAgY29uc3QgY2hhbmdlQWRkcjogc3RyaW5nID0gXCJYLWxvY2FsMVwiXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPFNlbmRNdWx0aXBsZVJlc3BvbnNlPiA9IGFwaS5zZW5kTXVsdGlwbGUoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgW3sgYXNzZXRJRDogXCJhc3NldElkXCIsIGFtb3VudDogMTAsIHRvOiBhZGRyQSB9XSxcbiAgICAgIFthZGRyQl0sXG4gICAgICBhZGRyQSxcbiAgICAgIG1lbW9cbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHR4SUQ6IHR4SWQsXG4gICAgICAgIGNoYW5nZUFkZHI6IGNoYW5nZUFkZHJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBTZW5kTXVsdGlwbGVSZXNwb25zZSA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2VbXCJ0eElEXCJdKS50b0JlKHR4SWQpXG4gICAgZXhwZWN0KHJlc3BvbnNlW1wiY2hhbmdlQWRkclwiXSkudG9CZShjaGFuZ2VBZGRyKVxuICB9KVxuXG4gIHRlc3QoXCJyZWZyZXNoQmxvY2tjaGFpbklEXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBuM2JjSUQ6IHN0cmluZyA9IERlZmF1bHRzLm5ldHdvcmtbM10uWFtcImJsb2NrY2hhaW5JRFwiXVxuICAgIGNvbnN0IG4xMzM3YmNJRDogc3RyaW5nID0gRGVmYXVsdHMubmV0d29ya1sxMzM3XS5YW1wiYmxvY2tjaGFpbklEXCJdXG4gICAgY29uc3QgdGVzdEFQSTogQVZNQVBJID0gbmV3IEFWTUFQSShhdmFsYW5jaGUsIFwiL2V4dC9iYy9hdm1cIiwgbjNiY0lEKVxuICAgIGNvbnN0IGJjMTogc3RyaW5nID0gdGVzdEFQSS5nZXRCbG9ja2NoYWluSUQoKVxuICAgIGV4cGVjdChiYzEpLnRvQmUobjNiY0lEKVxuXG4gICAgdGVzdEFQSS5yZWZyZXNoQmxvY2tjaGFpbklEKClcbiAgICBjb25zdCBiYzI6IHN0cmluZyA9IHRlc3RBUEkuZ2V0QmxvY2tjaGFpbklEKClcbiAgICBleHBlY3QoYmMyKS50b0JlKG4xMzM3YmNJRClcblxuICAgIHRlc3RBUEkucmVmcmVzaEJsb2NrY2hhaW5JRChuM2JjSUQpXG4gICAgY29uc3QgYmMzOiBzdHJpbmcgPSB0ZXN0QVBJLmdldEJsb2NrY2hhaW5JRCgpXG4gICAgZXhwZWN0KGJjMykudG9CZShuM2JjSUQpXG4gIH0pXG5cbiAgdGVzdChcImxpc3RBZGRyZXNzZXNcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGFkZHJlc3NlcyA9IFthZGRyQSwgYWRkckJdXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZ1tdPiA9IGFwaS5saXN0QWRkcmVzc2VzKHVzZXJuYW1lLCBwYXNzd29yZClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgYWRkcmVzc2VzXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nW10gPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGFkZHJlc3NlcylcbiAgfSlcblxuICB0ZXN0KFwiaW1wb3J0S2V5XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gYWRkckNcbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5pbXBvcnRLZXkodXNlcm5hbWUsIHBhc3N3b3JkLCBcImtleVwiKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBhZGRyZXNzXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZShhZGRyZXNzKVxuICB9KVxuXG4gIHRlc3QoXCJnZXRCYWxhbmNlXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBiYWxhbmNlOiBCTiA9IG5ldyBCTihcIjEwMFwiLCAxMClcbiAgICBjb25zdCByZXNwb2JqOiBHZXRCYWxhbmNlUmVzcG9uc2UgPSB7XG4gICAgICBiYWxhbmNlLFxuICAgICAgdXR4b0lEczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHhJRDogXCJMVXJpQjNXOTE5Rjg0THdQTU13NHNtMmZaNFk3NldnYjZtc2FhdUVZN2kxdEZObXR2XCIsXG4gICAgICAgICAgb3V0cHV0SW5kZXg6IDBcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxHZXRCYWxhbmNlUmVzcG9uc2U+ID0gYXBpLmdldEJhbGFuY2UoYWRkckEsIFwiQVRIXCIpXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiByZXNwb2JqXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogb2JqZWN0ID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpLnRvQmUoSlNPTi5zdHJpbmdpZnkocmVzcG9iaikpXG4gIH0pXG5cbiAgdGVzdChcImdldEJhbGFuY2UgaW5jbHVkZVBhcnRpYWxcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGJhbGFuY2U6IEJOID0gbmV3IEJOKFwiMTAwXCIsIDEwKVxuICAgIGNvbnN0IHJlc3BvYmogPSB7XG4gICAgICBiYWxhbmNlLFxuICAgICAgdXR4b0lEczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHhJRDogXCJMVXJpQjNXOTE5Rjg0THdQTU13NHNtMmZaNFk3NldnYjZtc2FhdUVZN2kxdEZObXR2XCIsXG4gICAgICAgICAgb3V0cHV0SW5kZXg6IDBcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxHZXRCYWxhbmNlUmVzcG9uc2U+ID0gYXBpLmdldEJhbGFuY2UoXG4gICAgICBhZGRyQSxcbiAgICAgIFwiQVRIXCIsXG4gICAgICB0cnVlXG4gICAgKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDogcmVzcG9ialxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIGNvbnN0IGV4cGVjdGVkUmVxdWVzdFBheWxvYWQgPSB7XG4gICAgICBpZDogMSxcbiAgICAgIG1ldGhvZDogXCJhdm0uZ2V0QmFsYW5jZVwiLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJBLFxuICAgICAgICBhc3NldElEOiBcIkFUSFwiLFxuICAgICAgICBpbmNsdWRlUGFydGlhbDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGpzb25ycGM6IFwiMi4wXCJcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBvYmplY3QgPSBhd2FpdCByZXN1bHRcbiAgICBjb25zdCBjYWxsZWRXaXRoOiBvYmplY3QgPSB7XG4gICAgICBiYXNlVVJMOiBcImh0dHBzOi8vMTI3LjAuMC4xOjk2NTBcIixcbiAgICAgIGRhdGE6ICd7XCJpZFwiOjksXCJtZXRob2RcIjpcImF2bS5nZXRCYWxhbmNlXCIsXCJwYXJhbXNcIjp7XCJhZGRyZXNzXCI6XCJYLWN1c3RvbTFkNmtrajBxaDR3Y211czN0azU5bnB3dDNybHVjNmVuNzU1YTU4Z1wiLFwiYXNzZXRJRFwiOlwiQVRIXCIsXCJpbmNsdWRlUGFydGlhbFwiOnRydWV9LFwianNvbnJwY1wiOlwiMi4wXCJ9JyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIlxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBwYXJhbXM6IHt9LFxuICAgICAgcmVzcG9uc2VUeXBlOiBcImpzb25cIixcbiAgICAgIHVybDogXCIvZXh0L2JjL1hcIlxuICAgIH1cblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9CZUNhbGxlZFdpdGgoY2FsbGVkV2l0aClcbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpLnRvQmUoSlNPTi5zdHJpbmdpZnkocmVzcG9iaikpXG4gIH0pXG5cbiAgdGVzdChcImV4cG9ydEtleVwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSBcInNkZmdsdmxqMmgzdjQ1XCJcblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXBpLmV4cG9ydEtleSh1c2VybmFtZSwgcGFzc3dvcmQsIGFkZHJBKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBwcml2YXRlS2V5OiBrZXlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBzdHJpbmcgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGtleSlcbiAgfSlcblxuICB0ZXN0KFwiZXhwb3J0XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBhbW91bnQ6IEJOID0gbmV3IEJOKDEwMClcbiAgICBjb25zdCB0bzogc3RyaW5nID0gXCJhYmNkZWZcIlxuICAgIGNvbnN0IGFzc2V0SUQ6IHN0cmluZyA9IFwiQVZBWFwiXG4gICAgY29uc3QgdXNlcm5hbWU6IHN0cmluZyA9IFwiUm9iZXJ0XCJcbiAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gXCJQYXVsc29uXCJcbiAgICBjb25zdCB0eElEOiBzdHJpbmcgPSBcInZhbGlkXCJcbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5leHBvcnQoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdG8sXG4gICAgICBhbW91bnQsXG4gICAgICBhc3NldElEXG4gICAgKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICB0eElEOiB0eElEXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZSh0eElEKVxuICB9KVxuXG4gIHRlc3QoXCJpbXBvcnRcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHRvOiBzdHJpbmcgPSBcImFiY2RlZlwiXG4gICAgY29uc3QgdXNlcm5hbWU6IHN0cmluZyA9IFwiUm9iZXJ0XCJcbiAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gXCJQYXVsc29uXCJcbiAgICBjb25zdCB0eElEOiBzdHJpbmcgPSBcInZhbGlkXCJcbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5pbXBvcnQoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdG8sXG4gICAgICBibG9ja2NoYWluSURcbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHR4SUQ6IHR4SURcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBzdHJpbmcgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKHR4SUQpXG4gIH0pXG5cbiAgdGVzdChcImNyZWF0ZUFkZHJlc3NcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGFsaWFzOiBzdHJpbmcgPSBcInJhbmRvbWFsaWFzXCJcblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXBpLmNyZWF0ZUFkZHJlc3ModXNlcm5hbWUsIHBhc3N3b3JkKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBhZGRyZXNzOiBhbGlhc1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoYWxpYXMpXG4gIH0pXG5cbiAgdGVzdChcImNyZWF0ZUZpeGVkQ2FwQXNzZXRcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGtwOiBLZXlQYWlyID0gbmV3IEtleVBhaXIoYXZhbGFuY2hlLmdldEhSUCgpLCBhbGlhcylcbiAgICBrcC5pbXBvcnRLZXkoXG4gICAgICBCdWZmZXIuZnJvbShcbiAgICAgICAgXCJlZjliZjJkNDQzNjQ5MWMxNTM5NjdjOTcwOWRkOGU4Mjc5NWJkYjliNWFkNDRlZTIyYzI5MDMwMDVkMWNmNjc2XCIsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgIClcbiAgICApXG5cbiAgICBjb25zdCBkZW5vbWluYXRpb246IG51bWJlciA9IDBcbiAgICBjb25zdCBhc3NldElEOiBzdHJpbmcgPVxuICAgICAgXCI4YTVkMmQzMmU2OGJjNTAwMzZlNGQwODYwNDQ2MTdmZTRhMGEwMjk2YjI3NDk5OWJhNTY4ZWE5MmRhNDZkNTMzXCJcbiAgICBjb25zdCBpbml0aWFsSG9sZGVyczogb2JqZWN0W10gPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IFwiN3NpazNQcjZyMUZlTHJ2SzFvV3dFQ0JTOGlKNVZQdVNoXCIsXG4gICAgICAgIGFtb3VudDogXCIxMDAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBcIjdzaWszUHI2cjFGZUxydksxb1d3RUNCUzhpSjVWUHVTaFwiLFxuICAgICAgICBhbW91bnQ6IFwiNTAwMDBcIlxuICAgICAgfVxuICAgIF1cblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXBpLmNyZWF0ZUZpeGVkQ2FwQXNzZXQoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgXCJTb21lIENvaW5cIixcbiAgICAgIFwiU0NDXCIsXG4gICAgICBkZW5vbWluYXRpb24sXG4gICAgICBpbml0aWFsSG9sZGVyc1xuICAgIClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgYXNzZXRJRDogYXNzZXRJRFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoYXNzZXRJRClcbiAgfSlcblxuICB0ZXN0KFwiY3JlYXRlVmFyaWFibGVDYXBBc3NldFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qga3A6IEtleVBhaXIgPSBuZXcgS2V5UGFpcihhdmFsYW5jaGUuZ2V0SFJQKCksIGFsaWFzKVxuICAgIGtwLmltcG9ydEtleShcbiAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICBcImVmOWJmMmQ0NDM2NDkxYzE1Mzk2N2M5NzA5ZGQ4ZTgyNzk1YmRiOWI1YWQ0NGVlMjJjMjkwMzAwNWQxY2Y2NzZcIixcbiAgICAgICAgXCJoZXhcIlxuICAgICAgKVxuICAgIClcblxuICAgIGNvbnN0IGRlbm9taW5hdGlvbjogbnVtYmVyID0gMFxuICAgIGNvbnN0IGFzc2V0SUQ6IHN0cmluZyA9XG4gICAgICBcIjhhNWQyZDMyZTY4YmM1MDAzNmU0ZDA4NjA0NDYxN2ZlNGEwYTAyOTZiMjc0OTk5YmE1NjhlYTkyZGE0NmQ1MzNcIlxuICAgIGNvbnN0IG1pbnRlclNldHM6IG9iamVjdFtdID0gW1xuICAgICAge1xuICAgICAgICBtaW50ZXJzOiBbXCI0cGVKc0Z2aGRuN1hqaE5GNEhXQVF5NllhSnRzMjdzOXFcIl0sXG4gICAgICAgIHRocmVzaG9sZDogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWludGVyczogW1xuICAgICAgICAgIFwiZGNKNno5ZHVMZnlRVGdianEyd0JDb3drdmNQWkhWREZcIixcbiAgICAgICAgICBcIjJmRTZpaWJxZkVSejV3ZW5YRTZxeXZpbnN4RHZGaEhaa1wiLFxuICAgICAgICAgIFwiN2llQUpiZnJHUWJwTlpSQVFFcFpDQzFHczF6NWd6NEhVXCJcbiAgICAgICAgXSxcbiAgICAgICAgdGhyZXNob2xkOiAyXG4gICAgICB9XG4gICAgXVxuXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkuY3JlYXRlVmFyaWFibGVDYXBBc3NldChcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBcIlNvbWUgQ29pblwiLFxuICAgICAgXCJTQ0NcIixcbiAgICAgIGRlbm9taW5hdGlvbixcbiAgICAgIG1pbnRlclNldHNcbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGFzc2V0SUQ6IGFzc2V0SURcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBzdHJpbmcgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGFzc2V0SUQpXG4gIH0pXG5cbiAgdGVzdChcIm1pbnQgMVwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgdXNlcm5hbWU6IHN0cmluZyA9IFwiQ29sbGluXCJcbiAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gXCJDdXNjZVwiXG4gICAgY29uc3QgYW1vdW50OiBudW1iZXIgPSAyXG4gICAgY29uc3QgYXNzZXRJRDogc3RyaW5nID1cbiAgICAgIFwiZjk2Njc1MGY0Mzg4NjdjM2M5ODI4ZGRjZGJlNjYwZTIxY2NkYmIzNmE5Mjc2OTU4ZjAxMWJhNDcyZjc1ZDRlN1wiXG4gICAgY29uc3QgdG86IHN0cmluZyA9IFwiZGNKNno5ZHVMZnlRVGdianEyd0JDb3drdmNQWkhWREZcIlxuICAgIGNvbnN0IG1pbnRlcnM6IHN0cmluZ1tdID0gW1xuICAgICAgXCJkY0o2ejlkdUxmeVFUZ2JqcTJ3QkNvd2t2Y1BaSFZERlwiLFxuICAgICAgXCIyZkU2aWlicWZFUno1d2VuWEU2cXl2aW5zeER2RmhIWmtcIixcbiAgICAgIFwiN2llQUpiZnJHUWJwTlpSQVFFcFpDQzFHczF6NWd6NEhVXCJcbiAgICBdXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkubWludChcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBhbW91bnQsXG4gICAgICBhc3NldElELFxuICAgICAgdG8sXG4gICAgICBtaW50ZXJzXG4gICAgKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICB0eElEOiBcInNvbWV0eFwiXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZShcInNvbWV0eFwiKVxuICB9KVxuXG4gIHRlc3QoXCJtaW50IDJcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHVzZXJuYW1lOiBzdHJpbmcgPSBcIkNvbGxpblwiXG4gICAgY29uc3QgcGFzc3dvcmQ6IHN0cmluZyA9IFwiQ3VzY2VcIlxuICAgIGNvbnN0IGFtb3VudDogQk4gPSBuZXcgQk4oMSlcbiAgICBjb25zdCBhc3NldElEOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIFwiZjk2Njc1MGY0Mzg4NjdjM2M5ODI4ZGRjZGJlNjYwZTIxY2NkYmIzNmE5Mjc2OTU4ZjAxMWJhNDcyZjc1ZDRlN1wiLFxuICAgICAgXCJoZXhcIlxuICAgIClcbiAgICBjb25zdCB0bzogc3RyaW5nID0gXCJkY0o2ejlkdUxmeVFUZ2JqcTJ3QkNvd2t2Y1BaSFZERlwiXG4gICAgY29uc3QgbWludGVyczogc3RyaW5nW10gPSBbXG4gICAgICBcImRjSjZ6OWR1TGZ5UVRnYmpxMndCQ293a3ZjUFpIVkRGXCIsXG4gICAgICBcIjJmRTZpaWJxZkVSejV3ZW5YRTZxeXZpbnN4RHZGaEhaa1wiLFxuICAgICAgXCI3aWVBSmJmckdRYnBOWlJBUUVwWkNDMUdzMXo1Z3o0SFVcIlxuICAgIF1cbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5taW50KFxuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIGFtb3VudCxcbiAgICAgIGFzc2V0SUQsXG4gICAgICB0byxcbiAgICAgIG1pbnRlcnNcbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHR4SUQ6IFwic29tZXR4XCJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBzdHJpbmcgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKFwic29tZXR4XCIpXG4gIH0pXG5cbiAgdGVzdChcImdldFR4XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB0eGlkOiBzdHJpbmcgPVxuICAgICAgXCJmOTY2NzUwZjQzODg2N2MzYzk4MjhkZGNkYmU2NjBlMjFjY2RiYjM2YTkyNzY5NThmMDExYmE0NzJmNzVkNGU3XCJcblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmcgfCBvYmplY3Q+ID0gYXBpLmdldFR4KHR4aWQpXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIHR4OiBcInNvbWV0eFwiXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nIHwgb2JqZWN0ID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZShcInNvbWV0eFwiKVxuICB9KVxuXG4gIHRlc3QoXCJnZXRUeFN0YXR1c1wiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgdHhpZDogc3RyaW5nID1cbiAgICAgIFwiZjk2Njc1MGY0Mzg4NjdjM2M5ODI4ZGRjZGJlNjYwZTIxY2NkYmIzNmE5Mjc2OTU4ZjAxMWJhNDcyZjc1ZDRlN1wiXG5cbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5nZXRUeFN0YXR1cyh0eGlkKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBzdGF0dXM6IFwiYWNjZXB0ZWRcIlxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoXCJhY2NlcHRlZFwiKVxuICB9KVxuXG4gIHRlc3QoXCJnZXRBc3NldERlc2NyaXB0aW9uIGFzIHN0cmluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXRJRDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBcIjhhNWQyZDMyZTY4YmM1MDAzNmU0ZDA4NjA0NDYxN2ZlNGEwYTAyOTZiMjc0OTk5YmE1NjhlYTkyZGE0NmQ1MzNcIixcbiAgICAgIFwiaGV4XCJcbiAgICApXG4gICAgY29uc3QgYXNzZXRpZHN0cjogc3RyaW5nID0gYmludG9vbHMuY2I1OEVuY29kZShhc3NldElEKVxuXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPG9iamVjdD4gPSBhcGkuZ2V0QXNzZXREZXNjcmlwdGlvbihhc3NldGlkc3RyKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBuYW1lOiBcIkNvbGxpbiBDb2luXCIsXG4gICAgICAgIHN5bWJvbDogXCJDS0NcIixcbiAgICAgICAgYXNzZXRJRDogYXNzZXRpZHN0cixcbiAgICAgICAgZGVub21pbmF0aW9uOiBcIjEwXCJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlLm5hbWUpLnRvQmUoXCJDb2xsaW4gQ29pblwiKVxuICAgIGV4cGVjdChyZXNwb25zZS5zeW1ib2wpLnRvQmUoXCJDS0NcIilcbiAgICBleHBlY3QocmVzcG9uc2UuYXNzZXRJRC50b1N0cmluZyhcImhleFwiKSkudG9CZShhc3NldElELnRvU3RyaW5nKFwiaGV4XCIpKVxuICAgIGV4cGVjdChyZXNwb25zZS5kZW5vbWluYXRpb24pLnRvQmUoMTApXG4gIH0pXG5cbiAgdGVzdChcImdldEFzc2V0RGVzY3JpcHRpb24gYXMgQnVmZmVyXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBhc3NldElEOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIFwiOGE1ZDJkMzJlNjhiYzUwMDM2ZTRkMDg2MDQ0NjE3ZmU0YTBhMDI5NmIyNzQ5OTliYTU2OGVhOTJkYTQ2ZDUzM1wiLFxuICAgICAgXCJoZXhcIlxuICAgIClcbiAgICBjb25zdCBhc3NldGlkc3RyOiBzdHJpbmcgPSBiaW50b29scy5jYjU4RW5jb2RlKFxuICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgIFwiOGE1ZDJkMzJlNjhiYzUwMDM2ZTRkMDg2MDQ0NjE3ZmU0YTBhMDI5NmIyNzQ5OTliYTU2OGVhOTJkYTQ2ZDUzM1wiLFxuICAgICAgICBcImhleFwiXG4gICAgICApXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPG9iamVjdD4gPSBhcGkuZ2V0QXNzZXREZXNjcmlwdGlvbihhc3NldElEKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBuYW1lOiBcIkNvbGxpbiBDb2luXCIsXG4gICAgICAgIHN5bWJvbDogXCJDS0NcIixcbiAgICAgICAgYXNzZXRJRDogYXNzZXRpZHN0cixcbiAgICAgICAgZGVub21pbmF0aW9uOiBcIjExXCJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlLm5hbWUpLnRvQmUoXCJDb2xsaW4gQ29pblwiKVxuICAgIGV4cGVjdChyZXNwb25zZS5zeW1ib2wpLnRvQmUoXCJDS0NcIilcbiAgICBleHBlY3QocmVzcG9uc2UuYXNzZXRJRC50b1N0cmluZyhcImhleFwiKSkudG9CZShhc3NldElELnRvU3RyaW5nKFwiaGV4XCIpKVxuICAgIGV4cGVjdChyZXNwb25zZS5kZW5vbWluYXRpb24pLnRvQmUoMTEpXG4gIH0pXG5cbiAgdGVzdChcImdldFVUWE9zXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBQYXltZW50XG4gICAgY29uc3QgT1BVVFhPc3RyMTogc3RyaW5nID0gYmludG9vbHMuY2I1OEVuY29kZShcbiAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICBcIjAwMDAzOGQxYjlmMTEzODY3MmRhNmZiNmMzNTEyNTUzOTI3NmE5YWNjMmE2NjhkNjNiZWE2YmEzYzc5NWUyZWRiMGY1MDAwMDAwMDEzZTA3ZTM4ZTJmMjMxMjFiZTg3NTY0MTJjMThkYjcyNDZhMTZkMjZlZTk5MzZmM2NiYTI4YmUxNDljZmQzNTU4MDAwMDAwMDcwMDAwMDAwMDAwMDA0ZGQ1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDFhMzZmZDBjMmRiY2FiMzExNzMxZGRlN2VmMTUxNGJkMjZmY2RjNzRkXCIsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgIClcbiAgICApXG4gICAgY29uc3QgT1BVVFhPc3RyMjogc3RyaW5nID0gYmludG9vbHMuY2I1OEVuY29kZShcbiAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICBcIjAwMDBjM2U0ODIzNTcxNTg3ZmUyYmRmYzUwMjY4OWY1YTgyMzhiOWQwZWE3ZjMyNzcxMjRkMTZhZjlkZTBkMmQ5OTExMDAwMDAwMDAzZTA3ZTM4ZTJmMjMxMjFiZTg3NTY0MTJjMThkYjcyNDZhMTZkMjZlZTk5MzZmM2NiYTI4YmUxNDljZmQzNTU4MDAwMDAwMDcwMDAwMDAwMDAwMDAwMDE5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDFlMWI2YjZhNGJhZDk0ZDJlM2YyMDczMDM3OWI5YmNkNmYxNzYzMThlXCIsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgIClcbiAgICApXG4gICAgY29uc3QgT1BVVFhPc3RyMzogc3RyaW5nID0gYmludG9vbHMuY2I1OEVuY29kZShcbiAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICBcIjAwMDBmMjlkYmE2MWZkYThkNTdhOTExZTdmODgxMGY5MzViZGU4MTBkM2Y4ZDQ5NTQwNDY4NWJkYjhkOWQ4NTQ1ZTg2MDAwMDAwMDAzZTA3ZTM4ZTJmMjMxMjFiZTg3NTY0MTJjMThkYjcyNDZhMTZkMjZlZTk5MzZmM2NiYTI4YmUxNDljZmQzNTU4MDAwMDAwMDcwMDAwMDAwMDAwMDAwMDE5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDFlMWI2YjZhNGJhZDk0ZDJlM2YyMDczMDM3OWI5YmNkNmYxNzYzMThlXCIsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgIClcbiAgICApXG5cbiAgICBjb25zdCBzZXQ6IFVUWE9TZXQgPSBuZXcgVVRYT1NldCgpXG4gICAgc2V0LmFkZChPUFVUWE9zdHIxKVxuICAgIHNldC5hZGRBcnJheShbT1BVVFhPc3RyMiwgT1BVVFhPc3RyM10pXG5cbiAgICBjb25zdCBwZXJzaXN0T3B0czogUGVyc2lzdGFuY2VPcHRpb25zID0gbmV3IFBlcnNpc3RhbmNlT3B0aW9ucyhcbiAgICAgIFwidGVzdFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIFwidW5pb25cIlxuICAgIClcbiAgICBleHBlY3QocGVyc2lzdE9wdHMuZ2V0TWVyZ2VSdWxlKCkpLnRvQmUoXCJ1bmlvblwiKVxuICAgIGxldCBhZGRyZXNzZXM6IHN0cmluZ1tdID0gc2V0XG4gICAgICAuZ2V0QWRkcmVzc2VzKClcbiAgICAgIC5tYXAoKGEpID0+IGFwaS5hZGRyZXNzRnJvbUJ1ZmZlcihhKSlcbiAgICBsZXQgcmVzdWx0OiBQcm9taXNlPHtcbiAgICAgIG51bUZldGNoZWQ6IG51bWJlclxuICAgICAgdXR4b3M6IFVUWE9TZXRcbiAgICAgIGVuZEluZGV4OiB7IGFkZHJlc3M6IHN0cmluZzsgdXR4bzogc3RyaW5nIH1cbiAgICB9PiA9IGFwaS5nZXRVVFhPcyhcbiAgICAgIGFkZHJlc3NlcyxcbiAgICAgIGFwaS5nZXRCbG9ja2NoYWluSUQoKSxcbiAgICAgIDAsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBwZXJzaXN0T3B0c1xuICAgIClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgbnVtRmV0Y2hlZDogMyxcbiAgICAgICAgdXR4b3M6IFtPUFVUWE9zdHIxLCBPUFVUWE9zdHIyLCBPUFVUWE9zdHIzXSxcbiAgICAgICAgc3RvcEluZGV4OiB7IGFkZHJlc3M6IFwiYVwiLCB1dHhvOiBcImJcIiB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBsZXQgcmVzcG9uc2U6IFVUWE9TZXQgPSAoYXdhaXQgcmVzdWx0KS51dHhvc1xuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZ2V0QWxsVVRYT1N0cmluZ3MoKS5zb3J0KCkpKS50b0JlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc2V0LmdldEFsbFVUWE9TdHJpbmdzKCkuc29ydCgpKVxuICAgIClcblxuICAgIGFkZHJlc3NlcyA9IHNldC5nZXRBZGRyZXNzZXMoKS5tYXAoKGEpID0+IGFwaS5hZGRyZXNzRnJvbUJ1ZmZlcihhKSlcbiAgICByZXN1bHQgPSBhcGkuZ2V0VVRYT3MoXG4gICAgICBhZGRyZXNzZXMsXG4gICAgICBhcGkuZ2V0QmxvY2tjaGFpbklEKCksXG4gICAgICAwLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGVyc2lzdE9wdHNcbiAgICApXG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIHJlc3BvbnNlID0gKGF3YWl0IHJlc3VsdCkudXR4b3NcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpXG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmdldEFsbFVUWE9TdHJpbmdzKCkuc29ydCgpKSkudG9CZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNldC5nZXRBbGxVVFhPU3RyaW5ncygpLnNvcnQoKSlcbiAgICApXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJUcmFuc2FjdGlvbnNcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGxldCBzZXQ6IFVUWE9TZXRcbiAgICBsZXQga2V5bWdyMjogS2V5Q2hhaW5cbiAgICBsZXQga2V5bWdyMzogS2V5Q2hhaW5cbiAgICBsZXQgYWRkcnMxOiBzdHJpbmdbXVxuICAgIGxldCBhZGRyczI6IHN0cmluZ1tdXG4gICAgbGV0IGFkZHJzMzogc3RyaW5nW11cbiAgICBsZXQgYWRkcmVzc2J1ZmZzOiBCdWZmZXJbXSA9IFtdXG4gICAgbGV0IGFkZHJlc3Nlczogc3RyaW5nW10gPSBbXVxuICAgIGxldCB1dHhvczogVVRYT1tdXG4gICAgbGV0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXVxuICAgIGxldCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXVxuICAgIGxldCBvcHM6IFRyYW5zZmVyYWJsZU9wZXJhdGlvbltdXG4gICAgbGV0IGFtbnQ6IG51bWJlciA9IDEwMDAwXG4gICAgY29uc3QgYXNzZXRJRDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShcIm1hcnkgaGFkIGEgbGl0dGxlIGxhbWJcIikuZGlnZXN0KClcbiAgICApXG4gICAgY29uc3QgTkZUYXNzZXRJRDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAgIC51cGRhdGUoXG4gICAgICAgICAgXCJJIGNhbid0IHN0YW5kIGl0LCBJIGtub3cgeW91IHBsYW5uZWQgaXQsIEknbW1hIHNldCBzdHJhaWdodCB0aGlzIFdhdGVyZ2F0ZS5cIlxuICAgICAgICApXG4gICAgICAgIC5kaWdlc3QoKVxuICAgIClcbiAgICBsZXQgc2VjcGJhc2UxOiBTRUNQVHJhbnNmZXJPdXRwdXRcbiAgICBsZXQgc2VjcGJhc2UyOiBTRUNQVHJhbnNmZXJPdXRwdXRcbiAgICBsZXQgc2VjcGJhc2UzOiBTRUNQVHJhbnNmZXJPdXRwdXRcbiAgICBsZXQgaW5pdGlhbFN0YXRlOiBJbml0aWFsU3RhdGVzXG4gICAgbGV0IG5mdHBiYXNlMTogTkZUTWludE91dHB1dFxuICAgIGxldCBuZnRwYmFzZTI6IE5GVE1pbnRPdXRwdXRcbiAgICBsZXQgbmZ0cGJhc2UzOiBORlRNaW50T3V0cHV0XG4gICAgbGV0IG5mdEluaXRpYWxTdGF0ZTogSW5pdGlhbFN0YXRlc1xuICAgIGxldCBuZnR1dHhvaWRzOiBzdHJpbmdbXSA9IFtdXG4gICAgbGV0IGZ1bmd1dHhvaWRzOiBzdHJpbmdbXSA9IFtdXG4gICAgbGV0IGF2bTogQVZNQVBJXG4gICAgY29uc3QgZmVlOiBudW1iZXIgPSAxMFxuICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IFwiTW9ydHljb2luIGlzIHRoZSBkdW1iIGFzIGEgc2FjayBvZiBoYW1tZXJzLlwiXG4gICAgY29uc3Qgc3ltYm9sOiBzdHJpbmcgPSBcIm1vclRcIlxuICAgIGNvbnN0IGRlbm9taW5hdGlvbjogbnVtYmVyID0gOFxuXG4gICAgbGV0IHNlY3BNaW50T3V0MTogU0VDUE1pbnRPdXRwdXRcbiAgICBsZXQgc2VjcE1pbnRPdXQyOiBTRUNQTWludE91dHB1dFxuICAgIGxldCBzZWNwTWludFRYSUQ6IEJ1ZmZlclxuICAgIGxldCBzZWNwTWludFVUWE86IFVUWE9cbiAgICBsZXQgc2VjcE1pbnRYZmVyT3V0MTogU0VDUFRyYW5zZmVyT3V0cHV0XG4gICAgbGV0IHNlY3BNaW50WGZlck91dDI6IFNFQ1BUcmFuc2Zlck91dHB1dFxuICAgIGxldCBzZWNwTWludE9wOiBTRUNQTWludE9wZXJhdGlvblxuXG4gICAgbGV0IHhmZXJzZWNwbWludG9wOiBUcmFuc2ZlcmFibGVPcGVyYXRpb25cblxuICAgIGJlZm9yZUVhY2goYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXZtID0gbmV3IEFWTUFQSShhdmFsYW5jaGUsIFwiL2V4dC9iYy9YXCIsIGJsb2NrY2hhaW5JRClcblxuICAgICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPEJ1ZmZlcj4gPSBhdm0uZ2V0QVZBWEFzc2V0SUQodHJ1ZSlcbiAgICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgYXNzZXRJRDogYmludG9vbHMuY2I1OEVuY29kZShhc3NldElEKSxcbiAgICAgICAgICBkZW5vbWluYXRpb246IGRlbm9taW5hdGlvblxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiBwYXlsb2FkXG4gICAgICB9XG5cbiAgICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgICBhd2FpdCByZXN1bHRcbiAgICAgIHNldCA9IG5ldyBVVFhPU2V0KClcbiAgICAgIGF2bS5uZXdLZXlDaGFpbigpXG4gICAgICBrZXltZ3IyID0gbmV3IEtleUNoYWluKGF2YWxhbmNoZS5nZXRIUlAoKSwgYWxpYXMpXG4gICAgICBrZXltZ3IzID0gbmV3IEtleUNoYWluKGF2YWxhbmNoZS5nZXRIUlAoKSwgYWxpYXMpXG4gICAgICBhZGRyczEgPSBbXVxuICAgICAgYWRkcnMyID0gW11cbiAgICAgIGFkZHJzMyA9IFtdXG4gICAgICB1dHhvcyA9IFtdXG4gICAgICBpbnB1dHMgPSBbXVxuICAgICAgb3V0cHV0cyA9IFtdXG4gICAgICBvcHMgPSBbXVxuICAgICAgbmZ0dXR4b2lkcyA9IFtdXG4gICAgICBmdW5ndXR4b2lkcyA9IFtdXG4gICAgICBjb25zdCBwbG9hZDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEwMjQpXG4gICAgICBwbG9hZC53cml0ZShcbiAgICAgICAgXCJBbGwgeW91IFRyZWtraWVzIGFuZCBUViBhZGRpY3RzLCBEb24ndCBtZWFuIHRvIGRpc3MgZG9uJ3QgbWVhbiB0byBicmluZyBzdGF0aWMuXCIsXG4gICAgICAgIDAsXG4gICAgICAgIDEwMjQsXG4gICAgICAgIFwidXRmOFwiXG4gICAgICApXG5cbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgYWRkcnMxLnB1c2goXG4gICAgICAgICAgYXZtLmFkZHJlc3NGcm9tQnVmZmVyKGF2bS5rZXlDaGFpbigpLm1ha2VLZXkoKS5nZXRBZGRyZXNzKCkpXG4gICAgICAgIClcbiAgICAgICAgYWRkcnMyLnB1c2goYXZtLmFkZHJlc3NGcm9tQnVmZmVyKGtleW1ncjIubWFrZUtleSgpLmdldEFkZHJlc3MoKSkpXG4gICAgICAgIGFkZHJzMy5wdXNoKGF2bS5hZGRyZXNzRnJvbUJ1ZmZlcihrZXltZ3IzLm1ha2VLZXkoKS5nZXRBZGRyZXNzKCkpKVxuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50OiBCTiA9IE9ORUFWQVgubXVsKG5ldyBCTihhbW50KSlcbiAgICAgIGFkZHJlc3NidWZmcyA9IGF2bS5rZXlDaGFpbigpLmdldEFkZHJlc3NlcygpXG4gICAgICBhZGRyZXNzZXMgPSBhZGRyZXNzYnVmZnMubWFwKChhKSA9PiBhdm0uYWRkcmVzc0Zyb21CdWZmZXIoYSkpXG4gICAgICBjb25zdCBsb2NrdGltZTogQk4gPSBuZXcgQk4oNTQzMjEpXG4gICAgICBjb25zdCB0aHJlc2hvbGQ6IG51bWJlciA9IDNcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgbGV0IHR4aWQ6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgICAgICAgIC51cGRhdGUoYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKGkpLCAzMikpXG4gICAgICAgICAgICAuZGlnZXN0KClcbiAgICAgICAgKVxuICAgICAgICBsZXQgdHhpZHg6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgICB0eGlkeC53cml0ZVVJbnQzMkJFKGksIDApXG5cbiAgICAgICAgY29uc3Qgb3V0OiBTRUNQVHJhbnNmZXJPdXRwdXQgPSBuZXcgU0VDUFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICBhZGRyZXNzYnVmZnMsXG4gICAgICAgICAgbG9ja3RpbWUsXG4gICAgICAgICAgdGhyZXNob2xkXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgeGZlcm91dDogVHJhbnNmZXJhYmxlT3V0cHV0ID0gbmV3IFRyYW5zZmVyYWJsZU91dHB1dChhc3NldElELCBvdXQpXG4gICAgICAgIG91dHB1dHMucHVzaCh4ZmVyb3V0KVxuXG4gICAgICAgIGNvbnN0IHU6IFVUWE8gPSBuZXcgVVRYTygpXG4gICAgICAgIHUuZnJvbUJ1ZmZlcihcbiAgICAgICAgICBCdWZmZXIuY29uY2F0KFt1LmdldENvZGVjSURCdWZmZXIoKSwgdHhpZCwgdHhpZHgsIHhmZXJvdXQudG9CdWZmZXIoKV0pXG4gICAgICAgIClcbiAgICAgICAgZnVuZ3V0eG9pZHMucHVzaCh1LmdldFVUWE9JRCgpKVxuICAgICAgICB1dHhvcy5wdXNoKHUpXG5cbiAgICAgICAgdHhpZCA9IHUuZ2V0VHhJRCgpXG4gICAgICAgIHR4aWR4ID0gdS5nZXRPdXRwdXRJZHgoKVxuICAgICAgICBjb25zdCBhc3NldCA9IHUuZ2V0QXNzZXRJRCgpXG5cbiAgICAgICAgY29uc3QgaW5wdXQ6IFNFQ1BUcmFuc2ZlcklucHV0ID0gbmV3IFNFQ1BUcmFuc2ZlcklucHV0KGFtb3VudClcbiAgICAgICAgY29uc3QgeGZlcmlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAgICB0eGlkLFxuICAgICAgICAgIHR4aWR4LFxuICAgICAgICAgIGFzc2V0LFxuICAgICAgICAgIGlucHV0XG4gICAgICAgIClcbiAgICAgICAgaW5wdXRzLnB1c2goeGZlcmlucHV0KVxuXG4gICAgICAgIGNvbnN0IG5vdXQ6IE5GVFRyYW5zZmVyT3V0cHV0ID0gbmV3IE5GVFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICAgIDEwMDAgKyBpLFxuICAgICAgICAgIHBsb2FkLFxuICAgICAgICAgIGFkZHJlc3NidWZmcyxcbiAgICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgICB0aHJlc2hvbGRcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBvcDogTkZUVHJhbnNmZXJPcGVyYXRpb24gPSBuZXcgTkZUVHJhbnNmZXJPcGVyYXRpb24obm91dClcbiAgICAgICAgY29uc3QgbmZ0dHhpZDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICAgICAgY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgICAgICAgLnVwZGF0ZShiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihuZXcgQk4oMTAwMCArIGkpLCAzMikpXG4gICAgICAgICAgICAuZGlnZXN0KClcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBuZnR1dHhvOiBVVFhPID0gbmV3IFVUWE8oXG4gICAgICAgICAgQVZNQ29uc3RhbnRzLkxBVEVTVENPREVDLFxuICAgICAgICAgIG5mdHR4aWQsXG4gICAgICAgICAgMTAwMCArIGksXG4gICAgICAgICAgTkZUYXNzZXRJRCxcbiAgICAgICAgICBub3V0XG4gICAgICAgIClcbiAgICAgICAgbmZ0dXR4b2lkcy5wdXNoKG5mdHV0eG8uZ2V0VVRYT0lEKCkpXG4gICAgICAgIGNvbnN0IHhmZXJvcDogVHJhbnNmZXJhYmxlT3BlcmF0aW9uID0gbmV3IFRyYW5zZmVyYWJsZU9wZXJhdGlvbihcbiAgICAgICAgICBORlRhc3NldElELFxuICAgICAgICAgIFtuZnR1dHhvLmdldFVUWE9JRCgpXSxcbiAgICAgICAgICBvcFxuICAgICAgICApXG4gICAgICAgIG9wcy5wdXNoKHhmZXJvcClcbiAgICAgICAgdXR4b3MucHVzaChuZnR1dHhvKVxuICAgICAgfVxuICAgICAgc2V0LmFkZEFycmF5KHV0eG9zKVxuXG4gICAgICBzZWNwYmFzZTEgPSBuZXcgU0VDUFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICBuZXcgQk4oNzc3KSxcbiAgICAgICAgYWRkcnMzLm1hcCgoYSkgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIFVuaXhOb3coKSxcbiAgICAgICAgMVxuICAgICAgKVxuICAgICAgc2VjcGJhc2UyID0gbmV3IFNFQ1BUcmFuc2Zlck91dHB1dChcbiAgICAgICAgbmV3IEJOKDg4OCksXG4gICAgICAgIGFkZHJzMi5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBVbml4Tm93KCksXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIHNlY3BiYXNlMyA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTig5OTkpLFxuICAgICAgICBhZGRyczIubWFwKChhKSA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgVW5peE5vdygpLFxuICAgICAgICAxXG4gICAgICApXG4gICAgICBpbml0aWFsU3RhdGUgPSBuZXcgSW5pdGlhbFN0YXRlcygpXG4gICAgICBpbml0aWFsU3RhdGUuYWRkT3V0cHV0KHNlY3BiYXNlMSwgQVZNQ29uc3RhbnRzLlNFQ1BGWElEKVxuICAgICAgaW5pdGlhbFN0YXRlLmFkZE91dHB1dChzZWNwYmFzZTIsIEFWTUNvbnN0YW50cy5TRUNQRlhJRClcbiAgICAgIGluaXRpYWxTdGF0ZS5hZGRPdXRwdXQoc2VjcGJhc2UzLCBBVk1Db25zdGFudHMuU0VDUEZYSUQpXG5cbiAgICAgIG5mdHBiYXNlMSA9IG5ldyBORlRNaW50T3V0cHV0KFxuICAgICAgICAwLFxuICAgICAgICBhZGRyczEubWFwKChhKSA9PiBhcGkucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgbG9ja3RpbWUsXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIG5mdHBiYXNlMiA9IG5ldyBORlRNaW50T3V0cHV0KFxuICAgICAgICAxLFxuICAgICAgICBhZGRyczIubWFwKChhKSA9PiBhcGkucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgbG9ja3RpbWUsXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIG5mdHBiYXNlMyA9IG5ldyBORlRNaW50T3V0cHV0KFxuICAgICAgICAyLFxuICAgICAgICBhZGRyczMubWFwKChhKSA9PiBhcGkucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgbG9ja3RpbWUsXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIG5mdEluaXRpYWxTdGF0ZSA9IG5ldyBJbml0aWFsU3RhdGVzKClcbiAgICAgIG5mdEluaXRpYWxTdGF0ZS5hZGRPdXRwdXQobmZ0cGJhc2UxLCBBVk1Db25zdGFudHMuTkZURlhJRClcbiAgICAgIG5mdEluaXRpYWxTdGF0ZS5hZGRPdXRwdXQobmZ0cGJhc2UyLCBBVk1Db25zdGFudHMuTkZURlhJRClcbiAgICAgIG5mdEluaXRpYWxTdGF0ZS5hZGRPdXRwdXQobmZ0cGJhc2UzLCBBVk1Db25zdGFudHMuTkZURlhJRClcblxuICAgICAgc2VjcE1pbnRPdXQxID0gbmV3IFNFQ1BNaW50T3V0cHV0KGFkZHJlc3NidWZmcywgbmV3IEJOKDApLCAxKVxuICAgICAgc2VjcE1pbnRPdXQyID0gbmV3IFNFQ1BNaW50T3V0cHV0KGFkZHJlc3NidWZmcywgbmV3IEJOKDApLCAxKVxuICAgICAgc2VjcE1pbnRUWElEID0gQnVmZmVyLmZyb20oXG4gICAgICAgIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgICAgICAudXBkYXRlKGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTigxMzM3KSwgMzIpKVxuICAgICAgICAgIC5kaWdlc3QoKVxuICAgICAgKVxuICAgICAgc2VjcE1pbnRVVFhPID0gbmV3IFVUWE8oXG4gICAgICAgIEFWTUNvbnN0YW50cy5MQVRFU1RDT0RFQyxcbiAgICAgICAgc2VjcE1pbnRUWElELFxuICAgICAgICAwLFxuICAgICAgICBhc3NldElELFxuICAgICAgICBzZWNwTWludE91dDFcbiAgICAgIClcbiAgICAgIHNlY3BNaW50WGZlck91dDEgPSBuZXcgU0VDUFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICBuZXcgQk4oMTIzKSxcbiAgICAgICAgYWRkcnMzLm1hcCgoYSkgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIFVuaXhOb3coKSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgICAgc2VjcE1pbnRYZmVyT3V0MiA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTig0NTYpLFxuICAgICAgICBbYXZtLnBhcnNlQWRkcmVzcyhhZGRyczJbMF0pXSxcbiAgICAgICAgVW5peE5vdygpLFxuICAgICAgICAxXG4gICAgICApXG4gICAgICBzZWNwTWludE9wID0gbmV3IFNFQ1BNaW50T3BlcmF0aW9uKHNlY3BNaW50T3V0MSwgc2VjcE1pbnRYZmVyT3V0MSlcblxuICAgICAgc2V0LmFkZChzZWNwTWludFVUWE8pXG5cbiAgICAgIHhmZXJzZWNwbWludG9wID0gbmV3IFRyYW5zZmVyYWJsZU9wZXJhdGlvbihcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgW3NlY3BNaW50VVRYTy5nZXRVVFhPSUQoKV0sXG4gICAgICAgIHNlY3BNaW50T3BcbiAgICAgIClcbiAgICB9KVxuXG4gICAgdGVzdChcImdldERlZmF1bHRNaW50VHhGZWVcIiwgKCk6IHZvaWQgPT4ge1xuICAgICAgZXhwZWN0KGF2bS5nZXREZWZhdWx0TWludFR4RmVlKCkudG9TdHJpbmcoKSkudG9CZShcIjEwMDAwMDBcIilcbiAgICB9KVxuXG4gICAgdGVzdChcInNpZ25UeFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCB0eHUxOiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQmFzZVR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIG5ldyBCTihhbW50KSxcbiAgICAgICAgYmludG9vbHMuY2I1OEVuY29kZShhc3NldElEKSxcbiAgICAgICAgYWRkcnMzLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMVxuICAgICAgKVxuICAgICAgY29uc3QgdHh1MjogVW5zaWduZWRUeCA9IHNldC5idWlsZEJhc2VUeChcbiAgICAgICAgbmV0d29ya0lELFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKGJsb2NrY2hhaW5JRCksXG4gICAgICAgIG5ldyBCTihhbW50KSxcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgYWRkcnMzLm1hcCgoYSkgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIGFkZHJzMS5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBhZGRyczEubWFwKChhKSA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgYXZtLmdldFR4RmVlKCksXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgVW5peE5vdygpLFxuICAgICAgICBuZXcgQk4oMCksXG4gICAgICAgIDFcbiAgICAgIClcblxuICAgICAgY29uc3QgdHgxOiBUeCA9IGF2bS5zaWduVHgodHh1MSlcbiAgICAgIGNvbnN0IHR4MjogVHggPSBhdm0uc2lnblR4KHR4dTIpXG5cbiAgICAgIGV4cGVjdCh0eDIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgICAgdHgxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIClcbiAgICAgIGV4cGVjdCh0eDIudG9TdHJpbmcoKSkudG9CZSh0eDEudG9TdHJpbmcoKSlcbiAgICB9KVxuXG4gICAgdGVzdChcImJ1aWxkQmFzZVR4MVwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCB0eHUxOiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQmFzZVR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIG5ldyBCTihhbW50KSxcbiAgICAgICAgYmludG9vbHMuY2I1OEVuY29kZShhc3NldElEKSxcbiAgICAgICAgYWRkcnMzLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMSxcbiAgICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIikuZ2V0Q29udGVudCgpXG4gICAgICApXG4gICAgICBjb25zdCBtZW1vYnVmOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcImhlbGxvIHdvcmxkXCIpXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkQmFzZVR4KFxuICAgICAgICBuZXR3b3JrSUQsXG4gICAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoYmxvY2tjaGFpbklEKSxcbiAgICAgICAgbmV3IEJOKGFtbnQpLFxuICAgICAgICBhc3NldElELFxuICAgICAgICBhZGRyczMubWFwKChhKSA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgYWRkcnMxLm1hcCgoYSkgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIGFkZHJzMS5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBhdm0uZ2V0VHhGZWUoKSxcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgbWVtb2J1ZixcbiAgICAgICAgVW5peE5vdygpLFxuICAgICAgICBuZXcgQk4oMCksXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIGV4cGVjdCh0eHUyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICAgIHR4dTEudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgKVxuICAgICAgZXhwZWN0KHR4dTIudG9TdHJpbmcoKSkudG9CZSh0eHUxLnRvU3RyaW5nKCkpXG5cbiAgICAgIGNvbnN0IHR4MTogVHggPSB0eHUxLnNpZ24oYXZtLmtleUNoYWluKCkpXG4gICAgICBjb25zdCBjaGVja1R4OiBzdHJpbmcgPSB0eDEudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgY29uc3QgdHgxb2JqOiBvYmplY3QgPSB0eDEuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4MW9iailcbiAgICAgIGNvbnN0IHR4Mm5ld29iajogb2JqZWN0ID0gSlNPTi5wYXJzZSh0eDFzdHIpXG4gICAgICBjb25zdCB0eDI6IFR4ID0gbmV3IFR4KClcbiAgICAgIHR4Mi5kZXNlcmlhbGl6ZSh0eDJuZXdvYmosIFwiaGV4XCIpXG5cbiAgICAgIGNvbnN0IHR4Mm9iajogb2JqZWN0ID0gdHgyLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3QgdHgyc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDJvYmopXG4gICAgICBleHBlY3QodHgxb2JqKS50b1N0cmljdEVxdWFsKHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFzdHIpLnRvU3RyaWN0RXF1YWwodHgyc3RyKVxuICAgICAgZXhwZWN0KHR4Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGNoZWNrVHgpXG5cbiAgICAgIGNvbnN0IHR4MzogVHggPSB0eHUxLnNpZ24oYXZtLmtleUNoYWluKCkpXG4gICAgICBjb25zdCB0eDNvYmo6IG9iamVjdCA9IHR4My5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4M3N0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgzb2JqKVxuICAgICAgY29uc3QgdHg0bmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4M3N0cilcbiAgICAgIGNvbnN0IHR4NDogVHggPSBuZXcgVHgoKVxuICAgICAgdHg0LmRlc2VyaWFsaXplKHR4NG5ld29iaiwgZGlzcGxheSlcblxuICAgICAgY29uc3QgdHg0b2JqOiBvYmplY3QgPSB0eDQuc2VyaWFsaXplKGRpc3BsYXkpXG4gICAgICBjb25zdCB0eDRzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4NG9iailcbiAgICAgIGV4cGVjdCh0eDNvYmopLnRvU3RyaWN0RXF1YWwodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M3N0cikudG9TdHJpY3RFcXVhbCh0eDRzdHIpXG4gICAgICBleHBlY3QodHg0LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcbiAgICB9KVxuXG4gICAgdGVzdChcInhzc1ByZXZlbnRpb25PYmplY3RcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgdHh1MTogVW5zaWduZWRUeCA9IGF3YWl0IGF2bS5idWlsZEJhc2VUeChcbiAgICAgICAgc2V0LFxuICAgICAgICBuZXcgQk4oYW1udCksXG4gICAgICAgIGJpbnRvb2xzLmNiNThFbmNvZGUoYXNzZXRJRCksXG4gICAgICAgIGFkZHJzMyxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczFcbiAgICAgIClcblxuICAgICAgY29uc3QgdHgxOiBUeCA9IGF2bS5zaWduVHgodHh1MSlcbiAgICAgIGNvbnN0IHR4MW9iajogb2JqZWN0ID0gdHgxLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3Qgc2FuaXRpemVkOiBvYmplY3QgPSB0eDEuc2FuaXRpemVPYmplY3QodHgxb2JqKVxuICAgICAgZXhwZWN0KHR4MW9iaikudG9TdHJpY3RFcXVhbChzYW5pdGl6ZWQpXG4gICAgfSlcblxuICAgIHRlc3QoXCJ4c3NQcmV2ZW50aW9uSFRNTFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBkaXJ0eURvbTogc3RyaW5nID0gXCI8aW1nIHNyYz0naHR0cHM6Ly94JyBvbmVycm9yPWFsZXJ0KDEpLy8+XCJcbiAgICAgIGNvbnN0IHNhbml0aXplZFN0cmluZzogc3RyaW5nID0gYDxpbWcgc3JjPVwiaHR0cHM6Ly94XCIgLz5gXG5cbiAgICAgIGNvbnN0IHR4dTE6IFVuc2lnbmVkVHggPSBhd2FpdCBhdm0uYnVpbGRCYXNlVHgoXG4gICAgICAgIHNldCxcbiAgICAgICAgbmV3IEJOKGFtbnQpLFxuICAgICAgICBiaW50b29scy5jYjU4RW5jb2RlKGFzc2V0SUQpLFxuICAgICAgICBhZGRyczMsXG4gICAgICAgIGFkZHJzMSxcbiAgICAgICAgYWRkcnMxXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHR4MTogVHggPSBhdm0uc2lnblR4KHR4dTEpXG4gICAgICBjb25zdCB0eDFvYmo6IG9iamVjdCA9IHR4MS5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IGRpcnR5T2JqOiBvYmplY3QgPSB7XG4gICAgICAgIC4uLnR4MW9iaixcbiAgICAgICAgZGlydHlEb206IGRpcnR5RG9tXG4gICAgICB9XG4gICAgICBjb25zdCBzYW5pdGl6ZWRPYmo6IGFueSA9IHR4MS5zYW5pdGl6ZU9iamVjdChkaXJ0eU9iailcbiAgICAgIGV4cGVjdChzYW5pdGl6ZWRPYmouZGlydHlEb20pLnRvQmUoc2FuaXRpemVkU3RyaW5nKVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiYnVpbGRCYXNlVHgyXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHR4dTE6IFVuc2lnbmVkVHggPSBhd2FpdCBhdm0uYnVpbGRCYXNlVHgoXG4gICAgICAgIHNldCxcbiAgICAgICAgbmV3IEJOKGFtbnQpLnN1YihuZXcgQk4oMTAwKSksXG4gICAgICAgIGJpbnRvb2xzLmNiNThFbmNvZGUoYXNzZXRJRCksXG4gICAgICAgIGFkZHJzMyxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczIsXG4gICAgICAgIG5ldyBVVEY4UGF5bG9hZChcImhlbGxvIHdvcmxkXCIpXG4gICAgICApXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkQmFzZVR4KFxuICAgICAgICBuZXR3b3JrSUQsXG4gICAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoYmxvY2tjaGFpbklEKSxcbiAgICAgICAgbmV3IEJOKGFtbnQpLnN1YihuZXcgQk4oMTAwKSksXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIGFkZHJzMy5tYXAoKGEpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIGFkZHJzMS5tYXAoKGEpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIGFkZHJzMi5tYXAoKGEpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIGF2bS5nZXRUeEZlZSgpLFxuICAgICAgICBhc3NldElELFxuICAgICAgICBuZXcgVVRGOFBheWxvYWQoXCJoZWxsbyB3b3JsZFwiKS5nZXRQYXlsb2FkKCksXG4gICAgICAgIFVuaXhOb3coKSxcbiAgICAgICAgbmV3IEJOKDApLFxuICAgICAgICAxXG4gICAgICApXG5cbiAgICAgIGV4cGVjdCh0eHUyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICAgIHR4dTEudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgKVxuICAgICAgZXhwZWN0KHR4dTIudG9TdHJpbmcoKSkudG9CZSh0eHUxLnRvU3RyaW5nKCkpXG5cbiAgICAgIGNvbnN0IG91dGllcyA9IHR4dTFcbiAgICAgICAgLmdldFRyYW5zYWN0aW9uKClcbiAgICAgICAgLmdldE91dHMoKVxuICAgICAgICAuc29ydChUcmFuc2ZlcmFibGVPdXRwdXQuY29tcGFyYXRvcigpKSBhcyBUcmFuc2ZlcmFibGVPdXRwdXRbXVxuXG4gICAgICBleHBlY3Qob3V0aWVzLmxlbmd0aCkudG9CZSgyKVxuICAgICAgY29uc3Qgb3V0YWRkcjAgPSBvdXRpZXNbMF1cbiAgICAgICAgLmdldE91dHB1dCgpXG4gICAgICAgIC5nZXRBZGRyZXNzZXMoKVxuICAgICAgICAubWFwKChhKSA9PiBhdm0uYWRkcmVzc0Zyb21CdWZmZXIoYSkpXG4gICAgICBjb25zdCBvdXRhZGRyMSA9IG91dGllc1sxXVxuICAgICAgICAuZ2V0T3V0cHV0KClcbiAgICAgICAgLmdldEFkZHJlc3NlcygpXG4gICAgICAgIC5tYXAoKGEpID0+IGF2bS5hZGRyZXNzRnJvbUJ1ZmZlcihhKSlcblxuICAgICAgY29uc3QgdGVzdGFkZHIyID0gSlNPTi5zdHJpbmdpZnkoYWRkcnMyLnNvcnQoKSlcbiAgICAgIGNvbnN0IHRlc3RhZGRyMyA9IEpTT04uc3RyaW5naWZ5KGFkZHJzMy5zb3J0KCkpXG5cbiAgICAgIGNvbnN0IHRlc3RvdXQwID0gSlNPTi5zdHJpbmdpZnkob3V0YWRkcjAuc29ydCgpKVxuICAgICAgY29uc3QgdGVzdG91dDEgPSBKU09OLnN0cmluZ2lmeShvdXRhZGRyMS5zb3J0KCkpXG4gICAgICBleHBlY3QoXG4gICAgICAgICh0ZXN0YWRkcjIgPT0gdGVzdG91dDAgJiYgdGVzdGFkZHIzID09IHRlc3RvdXQxKSB8fFxuICAgICAgICAgICh0ZXN0YWRkcjMgPT0gdGVzdG91dDAgJiYgdGVzdGFkZHIyID09IHRlc3RvdXQxKVxuICAgICAgKS50b0JlKHRydWUpXG5cbiAgICAgIGNvbnN0IHR4MTogVHggPSB0eHUxLnNpZ24oYXZtLmtleUNoYWluKCkpXG4gICAgICBjb25zdCBjaGVja1R4OiBzdHJpbmcgPSB0eDEudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgY29uc3QgdHgxb2JqOiBvYmplY3QgPSB0eDEuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4MW9iailcbiAgICAgIGNvbnN0IHR4Mm5ld29iajogb2JqZWN0ID0gSlNPTi5wYXJzZSh0eDFzdHIpXG4gICAgICBjb25zdCB0eDI6IFR4ID0gbmV3IFR4KClcbiAgICAgIHR4Mi5kZXNlcmlhbGl6ZSh0eDJuZXdvYmosIFwiaGV4XCIpXG5cbiAgICAgIGNvbnN0IHR4Mm9iajogb2JqZWN0ID0gdHgyLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3QgdHgyc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDJvYmopXG4gICAgICBleHBlY3QodHgxb2JqKS50b1N0cmljdEVxdWFsKHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFzdHIpLnRvU3RyaWN0RXF1YWwodHgyc3RyKVxuICAgICAgZXhwZWN0KHR4Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGNoZWNrVHgpXG5cbiAgICAgIGNvbnN0IHR4MzogVHggPSB0eHUxLnNpZ24oYXZtLmtleUNoYWluKCkpXG4gICAgICBjb25zdCB0eDNvYmo6IG9iamVjdCA9IHR4My5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4M3N0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgzb2JqKVxuICAgICAgY29uc3QgdHg0bmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4M3N0cilcbiAgICAgIGNvbnN0IHR4NDogVHggPSBuZXcgVHgoKVxuICAgICAgdHg0LmRlc2VyaWFsaXplKHR4NG5ld29iaiwgZGlzcGxheSlcblxuICAgICAgY29uc3QgdHg0b2JqOiBvYmplY3QgPSB0eDQuc2VyaWFsaXplKGRpc3BsYXkpXG4gICAgICBjb25zdCB0eDRzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4NG9iailcbiAgICAgIGV4cGVjdCh0eDNvYmopLnRvU3RyaWN0RXF1YWwodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M3N0cikudG9TdHJpY3RFcXVhbCh0eDRzdHIpXG4gICAgICBleHBlY3QodHg0LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcblxuICAgICAgc2VyaWFsemVpdCh0eDEsIFwiQmFzZVR4XCIpXG4gICAgfSlcblxuICAgIHRlc3QoXCJpc3N1ZVR4IFNlcmlhbGl6ZWRcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgdHh1OiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQmFzZVR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIG5ldyBCTihhbW50KSxcbiAgICAgICAgYmludG9vbHMuY2I1OEVuY29kZShhc3NldElEKSxcbiAgICAgICAgYWRkcnMzLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMVxuICAgICAgKVxuICAgICAgY29uc3QgdHggPSBhdm0uc2lnblR4KHR4dSlcbiAgICAgIGNvbnN0IHR4aWQ6IHN0cmluZyA9XG4gICAgICAgIFwiZjk2Njc1MGY0Mzg4NjdjM2M5ODI4ZGRjZGJlNjYwZTIxY2NkYmIzNmE5Mjc2OTU4ZjAxMWJhNDcyZjc1ZDRlN1wiXG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXZtLmlzc3VlVHgodHgudG9TdHJpbmcoKSlcbiAgICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgdHhJRDogdHhpZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiBwYXlsb2FkXG4gICAgICB9XG4gICAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHhpZClcbiAgICB9KVxuXG4gICAgdGVzdChcImlzc3VlVHggQnVmZmVyXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHR4dTogVW5zaWduZWRUeCA9IGF3YWl0IGF2bS5idWlsZEJhc2VUeChcbiAgICAgICAgc2V0LFxuICAgICAgICBuZXcgQk4oYW1udCksXG4gICAgICAgIGJpbnRvb2xzLmNiNThFbmNvZGUoYXNzZXRJRCksXG4gICAgICAgIGFkZHJzMyxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczFcbiAgICAgIClcbiAgICAgIGNvbnN0IHR4ID0gYXZtLnNpZ25UeCh0eHUpXG5cbiAgICAgIGNvbnN0IHR4aWQ6IHN0cmluZyA9XG4gICAgICAgIFwiZjk2Njc1MGY0Mzg4NjdjM2M5ODI4ZGRjZGJlNjYwZTIxY2NkYmIzNmE5Mjc2OTU4ZjAxMWJhNDcyZjc1ZDRlN1wiXG4gICAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGF2bS5pc3N1ZVR4KHR4LnRvQnVmZmVyKCkpXG4gICAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgIHR4SUQ6IHR4aWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcGF5bG9hZFxuICAgICAgfVxuXG4gICAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHhpZClcbiAgICB9KVxuICAgIHRlc3QoXCJpc3N1ZVR4IENsYXNzIFR4XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHR4dTogVW5zaWduZWRUeCA9IGF3YWl0IGF2bS5idWlsZEJhc2VUeChcbiAgICAgICAgc2V0LFxuICAgICAgICBuZXcgQk4oYW1udCksXG4gICAgICAgIGJpbnRvb2xzLmNiNThFbmNvZGUoYXNzZXRJRCksXG4gICAgICAgIGFkZHJzMyxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczFcbiAgICAgIClcbiAgICAgIGNvbnN0IHR4ID0gYXZtLnNpZ25UeCh0eHUpXG5cbiAgICAgIGNvbnN0IHR4aWQ6IHN0cmluZyA9XG4gICAgICAgIFwiZjk2Njc1MGY0Mzg4NjdjM2M5ODI4ZGRjZGJlNjYwZTIxY2NkYmIzNmE5Mjc2OTU4ZjAxMWJhNDcyZjc1ZDRlN1wiXG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXZtLmlzc3VlVHgodHgpXG4gICAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgIHR4SUQ6IHR4aWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcGF5bG9hZFxuICAgICAgfVxuXG4gICAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKHR4aWQpXG4gICAgfSlcblxuICAgIHRlc3QoXCJidWlsZENyZWF0ZUFzc2V0VHggLSBGaXhlZCBDYXBcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXZtLnNldENyZWF0aW9uVHhGZWUobmV3IEJOKGZlZSkpXG4gICAgICBjb25zdCB0eHUxOiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQ3JlYXRlQXNzZXRUeChcbiAgICAgICAgc2V0LFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMixcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzeW1ib2wsXG4gICAgICAgIGRlbm9taW5hdGlvblxuICAgICAgKVxuXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkQ3JlYXRlQXNzZXRUeChcbiAgICAgICAgYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpLFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKGF2bS5nZXRCbG9ja2NoYWluSUQoKSksXG4gICAgICAgIGFkZHJzMS5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBhZGRyczIubWFwKChhKSA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzeW1ib2wsXG4gICAgICAgIGRlbm9taW5hdGlvbixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBDRU5USUFWQVgsXG4gICAgICAgIGFzc2V0SURcbiAgICAgIClcblxuICAgICAgZXhwZWN0KHR4dTIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgICAgdHh1MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICApXG4gICAgICBleHBlY3QodHh1Mi50b1N0cmluZygpKS50b0JlKHR4dTEudG9TdHJpbmcoKSlcblxuICAgICAgY29uc3QgdHgxOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IGNoZWNrVHg6IHN0cmluZyA9IHR4MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFvYmo6IG9iamVjdCA9IHR4MS5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MXN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgxb2JqKVxuICAgICAgY29uc3QgdHgybmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4MXN0cilcbiAgICAgIGNvbnN0IHR4MjogVHggPSBuZXcgVHgoKVxuICAgICAgdHgyLmRlc2VyaWFsaXplKHR4Mm5ld29iaiwgXCJoZXhcIilcblxuICAgICAgY29uc3QgdHgyb2JqOiBvYmplY3QgPSB0eDIuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDJzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFvYmopLnRvU3RyaWN0RXF1YWwodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MXN0cikudG9TdHJpY3RFcXVhbCh0eDJzdHIpXG4gICAgICBleHBlY3QodHgyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcblxuICAgICAgY29uc3QgdHgzOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IHR4M29iajogb2JqZWN0ID0gdHgzLnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHgzc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDNvYmopXG4gICAgICBjb25zdCB0eDRuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgzc3RyKVxuICAgICAgY29uc3QgdHg0OiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDQuZGVzZXJpYWxpemUodHg0bmV3b2JqLCBkaXNwbGF5KVxuXG4gICAgICBjb25zdCB0eDRvYmo6IG9iamVjdCA9IHR4NC5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4NHN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M29iaikudG9TdHJpY3RFcXVhbCh0eDRvYmopXG4gICAgICBleHBlY3QodHgzc3RyKS50b1N0cmljdEVxdWFsKHR4NHN0cilcbiAgICAgIGV4cGVjdCh0eDQudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuICAgICAgc2VyaWFsemVpdCh0eDEsIFwiQ3JlYXRlQXNzZXRUeFwiKVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiYnVpbGRDcmVhdGVBc3NldFR4IC0gVmFyaWFibGUgQ2FwXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF2bS5zZXRDcmVhdGlvblR4RmVlKG5ldyBCTihEZWZhdWx0cy5uZXR3b3JrWzEyMzQ1XS5QW1wiY3JlYXRpb25UeEZlZVwiXSkpXG4gICAgICBjb25zdCBtaW50T3V0cHV0czogU0VDUE1pbnRPdXRwdXRbXSA9IFtzZWNwTWludE91dDEsIHNlY3BNaW50T3V0Ml1cbiAgICAgIGNvbnN0IHR4dTE6IFVuc2lnbmVkVHggPSBhd2FpdCBhdm0uYnVpbGRDcmVhdGVBc3NldFR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIGFkZHJzMSxcbiAgICAgICAgYWRkcnMyLFxuICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHN5bWJvbCxcbiAgICAgICAgZGVub21pbmF0aW9uLFxuICAgICAgICBtaW50T3V0cHV0c1xuICAgICAgKVxuXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkQ3JlYXRlQXNzZXRUeChcbiAgICAgICAgYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpLFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKGF2bS5nZXRCbG9ja2NoYWluSUQoKSksXG4gICAgICAgIGFkZHJzMS5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBhZGRyczIubWFwKChhKSA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzeW1ib2wsXG4gICAgICAgIGRlbm9taW5hdGlvbixcbiAgICAgICAgbWludE91dHB1dHMsXG4gICAgICAgIGF2bS5nZXRDcmVhdGlvblR4RmVlKCksXG4gICAgICAgIGFzc2V0SURcbiAgICAgIClcblxuICAgICAgZXhwZWN0KHR4dTIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgICAgdHh1MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICApXG4gICAgICBleHBlY3QodHh1Mi50b1N0cmluZygpKS50b0JlKHR4dTEudG9TdHJpbmcoKSlcblxuICAgICAgY29uc3QgdHgxOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IGNoZWNrVHg6IHN0cmluZyA9IHR4MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFvYmo6IG9iamVjdCA9IHR4MS5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MXN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgxb2JqKVxuICAgICAgY29uc3QgdHgybmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4MXN0cilcbiAgICAgIGNvbnN0IHR4MjogVHggPSBuZXcgVHgoKVxuICAgICAgdHgyLmRlc2VyaWFsaXplKHR4Mm5ld29iaiwgXCJoZXhcIilcblxuICAgICAgY29uc3QgdHgyb2JqOiBvYmplY3QgPSB0eDIuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDJzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFvYmopLnRvU3RyaWN0RXF1YWwodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MXN0cikudG9TdHJpY3RFcXVhbCh0eDJzdHIpXG4gICAgICBleHBlY3QodHgyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcblxuICAgICAgY29uc3QgdHgzOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IHR4M29iajogb2JqZWN0ID0gdHgzLnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHgzc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDNvYmopXG4gICAgICBjb25zdCB0eDRuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgzc3RyKVxuICAgICAgY29uc3QgdHg0OiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDQuZGVzZXJpYWxpemUodHg0bmV3b2JqLCBkaXNwbGF5KVxuXG4gICAgICBjb25zdCB0eDRvYmo6IG9iamVjdCA9IHR4NC5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4NHN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M29iaikudG9TdHJpY3RFcXVhbCh0eDRvYmopXG4gICAgICBleHBlY3QodHgzc3RyKS50b1N0cmljdEVxdWFsKHR4NHN0cilcbiAgICAgIGV4cGVjdCh0eDQudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiYnVpbGRTRUNQTWludFR4XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF2bS5zZXRUeEZlZShuZXcgQk4oZmVlKSlcbiAgICAgIGNvbnN0IG5ld01pbnRlcjogU0VDUE1pbnRPdXRwdXQgPSBuZXcgU0VDUE1pbnRPdXRwdXQoXG4gICAgICAgIGFkZHJzMy5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBuZXcgQk4oMCksXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIGNvbnN0IHR4dTE6IFVuc2lnbmVkVHggPSBhd2FpdCBhdm0uYnVpbGRTRUNQTWludFR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIG5ld01pbnRlcixcbiAgICAgICAgc2VjcE1pbnRYZmVyT3V0MSxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczIsXG4gICAgICAgIHNlY3BNaW50VVRYTy5nZXRVVFhPSUQoKVxuICAgICAgKVxuXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkU0VDUE1pbnRUeChcbiAgICAgICAgYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpLFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKGF2bS5nZXRCbG9ja2NoYWluSUQoKSksXG4gICAgICAgIG5ld01pbnRlcixcbiAgICAgICAgc2VjcE1pbnRYZmVyT3V0MSxcbiAgICAgICAgYWRkcnMxLm1hcCgoYSkgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSksXG4gICAgICAgIGFkZHJzMi5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBzZWNwTWludFVUWE8uZ2V0VVRYT0lEKCksXG4gICAgICAgIE1JTExJQVZBWCxcbiAgICAgICAgYXNzZXRJRFxuICAgICAgKVxuXG4gICAgICBleHBlY3QodHh1Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAgICB0eHUxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIClcbiAgICAgIGV4cGVjdCh0eHUyLnRvU3RyaW5nKCkpLnRvQmUodHh1MS50b1N0cmluZygpKVxuXG4gICAgICBjb25zdCB0eDE6IFR4ID0gdHh1MS5zaWduKGF2bS5rZXlDaGFpbigpKVxuICAgICAgY29uc3QgY2hlY2tUeDogc3RyaW5nID0gdHgxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MW9iajogb2JqZWN0ID0gdHgxLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3QgdHgxc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDFvYmopXG4gICAgICBjb25zdCB0eDJuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgxc3RyKVxuICAgICAgY29uc3QgdHgyOiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDIuZGVzZXJpYWxpemUodHgybmV3b2JqLCBcImhleFwiKVxuXG4gICAgICBjb25zdCB0eDJvYmo6IG9iamVjdCA9IHR4Mi5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MnN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MW9iaikudG9TdHJpY3RFcXVhbCh0eDJvYmopXG4gICAgICBleHBlY3QodHgxc3RyKS50b1N0cmljdEVxdWFsKHR4MnN0cilcbiAgICAgIGV4cGVjdCh0eDIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuXG4gICAgICBjb25zdCB0eDM6IFR4ID0gdHh1MS5zaWduKGF2bS5rZXlDaGFpbigpKVxuICAgICAgY29uc3QgdHgzb2JqOiBvYmplY3QgPSB0eDMuc2VyaWFsaXplKGRpc3BsYXkpXG4gICAgICBjb25zdCB0eDNzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4M29iailcbiAgICAgIGNvbnN0IHR4NG5ld29iajogb2JqZWN0ID0gSlNPTi5wYXJzZSh0eDNzdHIpXG4gICAgICBjb25zdCB0eDQ6IFR4ID0gbmV3IFR4KClcbiAgICAgIHR4NC5kZXNlcmlhbGl6ZSh0eDRuZXdvYmosIGRpc3BsYXkpXG5cbiAgICAgIGNvbnN0IHR4NG9iajogb2JqZWN0ID0gdHg0LnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHg0c3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDRvYmopXG4gICAgICBleHBlY3QodHgzb2JqKS50b1N0cmljdEVxdWFsKHR4NG9iailcbiAgICAgIGV4cGVjdCh0eDNzdHIpLnRvU3RyaWN0RXF1YWwodHg0c3RyKVxuICAgICAgZXhwZWN0KHR4NC50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGNoZWNrVHgpXG4gICAgICBzZXJpYWx6ZWl0KHR4MSwgXCJTRUNQTWludFR4XCIpXG4gICAgfSlcblxuICAgIHRlc3QoXCJidWlsZENyZWF0ZU5GVEFzc2V0VHhcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXZtLnNldENyZWF0aW9uVHhGZWUobmV3IEJOKERlZmF1bHRzLm5ldHdvcmtbMTIzNDVdLlBbXCJjcmVhdGlvblR4RmVlXCJdKSlcbiAgICAgIGNvbnN0IG1pbnRlclNldHM6IE1pbnRlclNldFtdID0gW25ldyBNaW50ZXJTZXQoMSwgYWRkcnMxKV1cbiAgICAgIGNvbnN0IGxvY2t0aW1lOiBCTiA9IG5ldyBCTigwKVxuXG4gICAgICBjb25zdCB0eHUxOiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQ3JlYXRlTkZUQXNzZXRUeChcbiAgICAgICAgc2V0LFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMixcbiAgICAgICAgbWludGVyU2V0cyxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc3ltYm9sLFxuICAgICAgICBuZXcgVVRGOFBheWxvYWQoXCJoZWxsbyB3b3JsZFwiKSxcbiAgICAgICAgVW5peE5vdygpLFxuICAgICAgICBsb2NrdGltZVxuICAgICAgKVxuXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkQ3JlYXRlTkZUQXNzZXRUeChcbiAgICAgICAgYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpLFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKGF2bS5nZXRCbG9ja2NoYWluSUQoKSksXG4gICAgICAgIGFkZHJzMS5tYXAoKGE6IHN0cmluZyk6IEJ1ZmZlciA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKSxcbiAgICAgICAgYWRkcnMyLm1hcCgoYTogc3RyaW5nKTogQnVmZmVyID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpLFxuICAgICAgICBtaW50ZXJTZXRzLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzeW1ib2wsXG4gICAgICAgIGF2bS5nZXRDcmVhdGlvblR4RmVlKCksXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIG5ldyBVVEY4UGF5bG9hZChcImhlbGxvIHdvcmxkXCIpLmdldFBheWxvYWQoKSxcbiAgICAgICAgVW5peE5vdygpLFxuICAgICAgICBsb2NrdGltZVxuICAgICAgKVxuXG4gICAgICBleHBlY3QodHh1Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAgICB0eHUxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIClcbiAgICAgIGV4cGVjdCh0eHUyLnRvU3RyaW5nKCkpLnRvQmUodHh1MS50b1N0cmluZygpKVxuXG4gICAgICBjb25zdCB0eDE6IFR4ID0gdHh1MS5zaWduKGF2bS5rZXlDaGFpbigpKVxuICAgICAgY29uc3QgY2hlY2tUeDogc3RyaW5nID0gdHgxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MW9iajogb2JqZWN0ID0gdHgxLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3QgdHgxc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDFvYmopXG4gICAgICBjb25zdCB0eDJuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgxc3RyKVxuICAgICAgY29uc3QgdHgyOiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDIuZGVzZXJpYWxpemUodHgybmV3b2JqLCBcImhleFwiKVxuXG4gICAgICBjb25zdCB0eDJvYmo6IG9iamVjdCA9IHR4Mi5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MnN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MW9iaikudG9TdHJpY3RFcXVhbCh0eDJvYmopXG4gICAgICBleHBlY3QodHgxc3RyKS50b1N0cmljdEVxdWFsKHR4MnN0cilcbiAgICAgIGV4cGVjdCh0eDIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuXG4gICAgICBjb25zdCB0eDM6IFR4ID0gdHh1MS5zaWduKGF2bS5rZXlDaGFpbigpKVxuICAgICAgY29uc3QgdHgzb2JqOiBvYmplY3QgPSB0eDMuc2VyaWFsaXplKGRpc3BsYXkpXG4gICAgICBjb25zdCB0eDNzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4M29iailcbiAgICAgIGNvbnN0IHR4NG5ld29iajogb2JqZWN0ID0gSlNPTi5wYXJzZSh0eDNzdHIpXG4gICAgICBjb25zdCB0eDQ6IFR4ID0gbmV3IFR4KClcbiAgICAgIHR4NC5kZXNlcmlhbGl6ZSh0eDRuZXdvYmosIGRpc3BsYXkpXG5cbiAgICAgIGNvbnN0IHR4NG9iajogb2JqZWN0ID0gdHg0LnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHg0c3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDRvYmopXG4gICAgICBleHBlY3QodHgzb2JqKS50b1N0cmljdEVxdWFsKHR4NG9iailcbiAgICAgIGV4cGVjdCh0eDNzdHIpLnRvU3RyaWN0RXF1YWwodHg0c3RyKVxuICAgICAgZXhwZWN0KHR4NC50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGNoZWNrVHgpXG4gICAgICBzZXJpYWx6ZWl0KHR4MSwgXCJDcmVhdGVORlRBc3NldFR4XCIpXG4gICAgfSlcblxuICAgIHRlc3QoXCJidWlsZENyZWF0ZU5GVE1pbnRUeFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhdm0uc2V0VHhGZWUobmV3IEJOKGZlZSkpXG4gICAgICBjb25zdCBncm91cElEOiBudW1iZXIgPSAwXG4gICAgICBjb25zdCBsb2NrdGltZTogQk4gPSBuZXcgQk4oMClcbiAgICAgIGNvbnN0IHRocmVzaG9sZDogbnVtYmVyID0gMVxuICAgICAgY29uc3QgcGF5bG9hZDogQnVmZmVyID0gQnVmZmVyLmZyb20oXCJBdmFsYW5jaGVcIilcbiAgICAgIGNvbnN0IGFkZHJidWZmMTogQnVmZmVyW10gPSBhZGRyczEubWFwKFxuICAgICAgICAoYTogc3RyaW5nKTogQnVmZmVyID0+IGF2bS5wYXJzZUFkZHJlc3MoYSlcbiAgICAgIClcbiAgICAgIGNvbnN0IGFkZHJidWZmMjogQnVmZmVyW10gPSBhZGRyczIubWFwKFxuICAgICAgICAoYTogc3RyaW5nKTogQnVmZmVyID0+IGF2bS5wYXJzZUFkZHJlc3MoYSlcbiAgICAgIClcbiAgICAgIGNvbnN0IGFkZHJidWZmMzogQnVmZmVyW10gPSBhZGRyczMubWFwKFxuICAgICAgICAoYTogc3RyaW5nKTogQnVmZmVyID0+IGF2bS5wYXJzZUFkZHJlc3MoYSlcbiAgICAgIClcbiAgICAgIGNvbnN0IG91dHB1dE93bmVyczogT3V0cHV0T3duZXJzW10gPSBbXVxuICAgICAgY29uc3Qgb286IE91dHB1dE93bmVycyA9IG5ldyBPdXRwdXRPd25lcnMoYWRkcmJ1ZmYzLCBsb2NrdGltZSwgdGhyZXNob2xkKVxuICAgICAgb3V0cHV0T3duZXJzLnB1c2goKVxuXG4gICAgICBjb25zdCB0eHUxOiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQ3JlYXRlTkZUTWludFR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIG9vLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMixcbiAgICAgICAgbmZ0dXR4b2lkcyxcbiAgICAgICAgZ3JvdXBJRCxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBVbml4Tm93KClcbiAgICAgIClcblxuICAgICAgY29uc3QgdHh1MjogVW5zaWduZWRUeCA9IHNldC5idWlsZENyZWF0ZU5GVE1pbnRUeChcbiAgICAgICAgYXZhbGFuY2hlLmdldE5ldHdvcmtJRCgpLFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKGF2bS5nZXRCbG9ja2NoYWluSUQoKSksXG4gICAgICAgIFtvb10sXG4gICAgICAgIGFkZHJidWZmMSxcbiAgICAgICAgYWRkcmJ1ZmYyLFxuICAgICAgICBuZnR1dHhvaWRzLFxuICAgICAgICBncm91cElELFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBhdm0uZ2V0VHhGZWUoKSxcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBVbml4Tm93KClcbiAgICAgIClcblxuICAgICAgZXhwZWN0KHR4dTIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgICAgdHh1MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICApXG4gICAgICBleHBlY3QodHh1Mi50b1N0cmluZygpKS50b0JlKHR4dTEudG9TdHJpbmcoKSlcblxuICAgICAgb3V0cHV0T3duZXJzLnB1c2gob28pXG4gICAgICBvdXRwdXRPd25lcnMucHVzaChuZXcgT3V0cHV0T3duZXJzKGFkZHJidWZmMywgbG9ja3RpbWUsIHRocmVzaG9sZCArIDEpKVxuXG4gICAgICBjb25zdCB0eHUzOiBVbnNpZ25lZFR4ID0gYXdhaXQgYXZtLmJ1aWxkQ3JlYXRlTkZUTWludFR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIG91dHB1dE93bmVycyxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczIsXG4gICAgICAgIG5mdHV0eG9pZHMsXG4gICAgICAgIGdyb3VwSUQsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgVW5peE5vdygpXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHR4dTQ6IFVuc2lnbmVkVHggPSBzZXQuYnVpbGRDcmVhdGVORlRNaW50VHgoXG4gICAgICAgIGF2YWxhbmNoZS5nZXROZXR3b3JrSUQoKSxcbiAgICAgICAgYmludG9vbHMuY2I1OERlY29kZShhdm0uZ2V0QmxvY2tjaGFpbklEKCkpLFxuICAgICAgICBvdXRwdXRPd25lcnMsXG4gICAgICAgIGFkZHJidWZmMSxcbiAgICAgICAgYWRkcmJ1ZmYyLFxuICAgICAgICBuZnR1dHhvaWRzLFxuICAgICAgICBncm91cElELFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBhdm0uZ2V0VHhGZWUoKSxcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBVbml4Tm93KClcbiAgICAgIClcblxuICAgICAgZXhwZWN0KHR4dTQudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgICAgdHh1My50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICApXG4gICAgICBleHBlY3QodHh1NC50b1N0cmluZygpKS50b0JlKHR4dTMudG9TdHJpbmcoKSlcblxuICAgICAgY29uc3QgdHgxOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IGNoZWNrVHg6IHN0cmluZyA9IHR4MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFvYmo6IG9iamVjdCA9IHR4MS5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MXN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgxb2JqKVxuICAgICAgY29uc3QgdHgybmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4MXN0cilcbiAgICAgIGNvbnN0IHR4MjogVHggPSBuZXcgVHgoKVxuICAgICAgdHgyLmRlc2VyaWFsaXplKHR4Mm5ld29iaiwgXCJoZXhcIilcblxuICAgICAgY29uc3QgdHgyb2JqOiBvYmplY3QgPSB0eDIuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDJzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFvYmopLnRvU3RyaWN0RXF1YWwodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MXN0cikudG9TdHJpY3RFcXVhbCh0eDJzdHIpXG4gICAgICBleHBlY3QodHgyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcblxuICAgICAgY29uc3QgdHgzOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IHR4M29iajogb2JqZWN0ID0gdHgzLnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHgzc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDNvYmopXG4gICAgICBjb25zdCB0eDRuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgzc3RyKVxuICAgICAgY29uc3QgdHg0OiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDQuZGVzZXJpYWxpemUodHg0bmV3b2JqLCBkaXNwbGF5KVxuXG4gICAgICBjb25zdCB0eDRvYmo6IG9iamVjdCA9IHR4NC5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4NHN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M29iaikudG9TdHJpY3RFcXVhbCh0eDRvYmopXG4gICAgICBleHBlY3QodHgzc3RyKS50b1N0cmljdEVxdWFsKHR4NHN0cilcbiAgICAgIGV4cGVjdCh0eDQudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuICAgICAgc2VyaWFsemVpdCh0eDEsIFwiQ3JlYXRlTkZUTWludFR4XCIpXG4gICAgfSlcblxuICAgIHRlc3QoXCJidWlsZE5GVFRyYW5zZmVyVHhcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXZtLnNldFR4RmVlKG5ldyBCTihmZWUpKVxuICAgICAgY29uc3QgcGxvYWQ6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxMDI0KVxuICAgICAgcGxvYWQud3JpdGUoXG4gICAgICAgIFwiQWxsIHlvdSBUcmVra2llcyBhbmQgVFYgYWRkaWN0cywgRG9uJ3QgbWVhbiB0byBkaXNzIGRvbid0IG1lYW4gdG8gYnJpbmcgc3RhdGljLlwiLFxuICAgICAgICAwLFxuICAgICAgICAxMDI0LFxuICAgICAgICBcInV0ZjhcIlxuICAgICAgKVxuICAgICAgY29uc3QgYWRkcmJ1ZmYxID0gYWRkcnMxLm1hcCgoYTogc3RyaW5nKTogQnVmZmVyID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpXG4gICAgICBjb25zdCBhZGRyYnVmZjIgPSBhZGRyczIubWFwKChhOiBzdHJpbmcpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSlcbiAgICAgIGNvbnN0IGFkZHJidWZmMyA9IGFkZHJzMy5tYXAoKGE6IHN0cmluZyk6IEJ1ZmZlciA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKVxuICAgICAgY29uc3QgdHh1MTogVW5zaWduZWRUeCA9IGF3YWl0IGF2bS5idWlsZE5GVFRyYW5zZmVyVHgoXG4gICAgICAgIHNldCxcbiAgICAgICAgYWRkcnMzLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMixcbiAgICAgICAgbmZ0dXR4b2lkc1sxXSxcbiAgICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIiksXG4gICAgICAgIFVuaXhOb3coKSxcbiAgICAgICAgbmV3IEJOKDApLFxuICAgICAgICAxXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHR4dTI6IFVuc2lnbmVkVHggPSBzZXQuYnVpbGRORlRUcmFuc2ZlclR4KFxuICAgICAgICBuZXR3b3JrSUQsXG4gICAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoYmxvY2tjaGFpbklEKSxcbiAgICAgICAgYWRkcmJ1ZmYzLFxuICAgICAgICBhZGRyYnVmZjEsXG4gICAgICAgIGFkZHJidWZmMixcbiAgICAgICAgW25mdHV0eG9pZHNbMV1dLFxuICAgICAgICBhdm0uZ2V0VHhGZWUoKSxcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIikuZ2V0UGF5bG9hZCgpLFxuICAgICAgICBVbml4Tm93KCksXG4gICAgICAgIG5ldyBCTigwKSxcbiAgICAgICAgMVxuICAgICAgKVxuXG4gICAgICBleHBlY3QodHh1Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAgICB0eHUxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIClcbiAgICAgIGV4cGVjdCh0eHUyLnRvU3RyaW5nKCkpLnRvQmUodHh1MS50b1N0cmluZygpKVxuXG4gICAgICBjb25zdCB0eDE6IFR4ID0gdHh1MS5zaWduKGF2bS5rZXlDaGFpbigpKVxuICAgICAgY29uc3QgY2hlY2tUeDogc3RyaW5nID0gdHgxLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MW9iajogb2JqZWN0ID0gdHgxLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3QgdHgxc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDFvYmopXG4gICAgICBjb25zdCB0eDJuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgxc3RyKVxuICAgICAgY29uc3QgdHgyOiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDIuZGVzZXJpYWxpemUodHgybmV3b2JqLCBcImhleFwiKVxuXG4gICAgICBjb25zdCB0eDJvYmo6IG9iamVjdCA9IHR4Mi5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MnN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MW9iaikudG9TdHJpY3RFcXVhbCh0eDJvYmopXG4gICAgICBleHBlY3QodHgxc3RyKS50b1N0cmljdEVxdWFsKHR4MnN0cilcbiAgICAgIGV4cGVjdCh0eDIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuXG4gICAgICBjb25zdCB0eDM6IFR4ID0gdHh1MS5zaWduKGF2bS5rZXlDaGFpbigpKVxuICAgICAgY29uc3QgdHgzb2JqOiBvYmplY3QgPSB0eDMuc2VyaWFsaXplKGRpc3BsYXkpXG4gICAgICBjb25zdCB0eDNzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4M29iailcbiAgICAgIGNvbnN0IHR4NG5ld29iajogb2JqZWN0ID0gSlNPTi5wYXJzZSh0eDNzdHIpXG4gICAgICBjb25zdCB0eDQ6IFR4ID0gbmV3IFR4KClcbiAgICAgIHR4NC5kZXNlcmlhbGl6ZSh0eDRuZXdvYmosIGRpc3BsYXkpXG5cbiAgICAgIGNvbnN0IHR4NG9iajogb2JqZWN0ID0gdHg0LnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHg0c3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDRvYmopXG4gICAgICBleHBlY3QodHgzb2JqKS50b1N0cmljdEVxdWFsKHR4NG9iailcbiAgICAgIGV4cGVjdCh0eDNzdHIpLnRvU3RyaWN0RXF1YWwodHg0c3RyKVxuICAgICAgZXhwZWN0KHR4NC50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGNoZWNrVHgpXG4gICAgICBzZXJpYWx6ZWl0KHR4MSwgXCJORlRUcmFuc2ZlclR4XCIpXG4gICAgfSlcblxuICAgIHRlc3QoXCJidWlsZEltcG9ydFR4XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IGxvY2t0aW1lOiBCTiA9IG5ldyBCTigwKVxuICAgICAgY29uc3QgdGhyZXNob2xkOiBudW1iZXIgPSAxXG4gICAgICBhdm0uc2V0VHhGZWUobmV3IEJOKGZlZSkpXG4gICAgICBjb25zdCBhZGRyYnVmZjEgPSBhZGRyczEubWFwKChhKSA9PiBhdm0ucGFyc2VBZGRyZXNzKGEpKVxuICAgICAgY29uc3QgYWRkcmJ1ZmYyID0gYWRkcnMyLm1hcCgoYSkgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKSlcbiAgICAgIGNvbnN0IGFkZHJidWZmMyA9IGFkZHJzMy5tYXAoKGEpID0+IGF2bS5wYXJzZUFkZHJlc3MoYSkpXG4gICAgICBjb25zdCBmdW5ndXR4bzogVVRYTyA9IHNldC5nZXRVVFhPKGZ1bmd1dHhvaWRzWzFdKVxuICAgICAgY29uc3QgZnVuZ3V0eG9zdHI6IHN0cmluZyA9IGZ1bmd1dHhvLnRvU3RyaW5nKClcblxuICAgICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPFVuc2lnbmVkVHg+ID0gYXZtLmJ1aWxkSW1wb3J0VHgoXG4gICAgICAgIHNldCxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBQbGF0Zm9ybUNoYWluSUQsXG4gICAgICAgIGFkZHJzMyxcbiAgICAgICAgYWRkcnMxLFxuICAgICAgICBhZGRyczIsXG4gICAgICAgIG5ldyBVVEY4UGF5bG9hZChcImhlbGxvIHdvcmxkXCIpLFxuICAgICAgICBVbml4Tm93KCksXG4gICAgICAgIGxvY2t0aW1lLFxuICAgICAgICB0aHJlc2hvbGRcbiAgICAgIClcbiAgICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgdXR4b3M6IFtmdW5ndXR4b3N0cl1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcGF5bG9hZFxuICAgICAgfVxuXG4gICAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgICAgY29uc3QgdHh1MTogVW5zaWduZWRUeCA9IGF3YWl0IHJlc3VsdFxuXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkSW1wb3J0VHgoXG4gICAgICAgIG5ldHdvcmtJRCxcbiAgICAgICAgYmludG9vbHMuY2I1OERlY29kZShibG9ja2NoYWluSUQpLFxuICAgICAgICBhZGRyYnVmZjMsXG4gICAgICAgIGFkZHJidWZmMSxcbiAgICAgICAgYWRkcmJ1ZmYyLFxuICAgICAgICBbZnVuZ3V0eG9dLFxuICAgICAgICBiaW50b29scy5jYjU4RGVjb2RlKFBsYXRmb3JtQ2hhaW5JRCksXG4gICAgICAgIGF2bS5nZXRUeEZlZSgpLFxuICAgICAgICBhd2FpdCBhdm0uZ2V0QVZBWEFzc2V0SUQoKSxcbiAgICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIikuZ2V0UGF5bG9hZCgpLFxuICAgICAgICBVbml4Tm93KCksXG4gICAgICAgIGxvY2t0aW1lLFxuICAgICAgICB0aHJlc2hvbGRcbiAgICAgIClcblxuICAgICAgZXhwZWN0KHR4dTIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgICAgdHh1MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICApXG4gICAgICBleHBlY3QodHh1Mi50b1N0cmluZygpKS50b0JlKHR4dTEudG9TdHJpbmcoKSlcblxuICAgICAgY29uc3QgdHgxOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IGNoZWNrVHg6IHN0cmluZyA9IHR4MS50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFvYmo6IG9iamVjdCA9IHR4MS5zZXJpYWxpemUoXCJoZXhcIilcbiAgICAgIGNvbnN0IHR4MXN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgxb2JqKVxuICAgICAgY29uc3QgdHgybmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4MXN0cilcbiAgICAgIGNvbnN0IHR4MjogVHggPSBuZXcgVHgoKVxuICAgICAgdHgyLmRlc2VyaWFsaXplKHR4Mm5ld29iaiwgXCJoZXhcIilcblxuICAgICAgY29uc3QgdHgyb2JqOiBvYmplY3QgPSB0eDIuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDJzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFvYmopLnRvU3RyaWN0RXF1YWwodHgyb2JqKVxuICAgICAgZXhwZWN0KHR4MXN0cikudG9TdHJpY3RFcXVhbCh0eDJzdHIpXG4gICAgICBleHBlY3QodHgyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcblxuICAgICAgY29uc3QgdHgzOiBUeCA9IHR4dTEuc2lnbihhdm0ua2V5Q2hhaW4oKSlcbiAgICAgIGNvbnN0IHR4M29iajogb2JqZWN0ID0gdHgzLnNlcmlhbGl6ZShkaXNwbGF5KVxuICAgICAgY29uc3QgdHgzc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDNvYmopXG4gICAgICBjb25zdCB0eDRuZXdvYmo6IG9iamVjdCA9IEpTT04ucGFyc2UodHgzc3RyKVxuICAgICAgY29uc3QgdHg0OiBUeCA9IG5ldyBUeCgpXG4gICAgICB0eDQuZGVzZXJpYWxpemUodHg0bmV3b2JqLCBkaXNwbGF5KVxuXG4gICAgICBjb25zdCB0eDRvYmo6IG9iamVjdCA9IHR4NC5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4NHN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M29iaikudG9TdHJpY3RFcXVhbCh0eDRvYmopXG4gICAgICBleHBlY3QodHgzc3RyKS50b1N0cmljdEVxdWFsKHR4NHN0cilcbiAgICAgIGV4cGVjdCh0eDQudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShjaGVja1R4KVxuICAgICAgc2VyaWFsemVpdCh0eDEsIFwiSW1wb3J0VHhcIilcbiAgICB9KVxuXG4gICAgdGVzdChcImJ1aWxkRXhwb3J0VHhcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXZtLnNldFR4RmVlKG5ldyBCTihmZWUpKVxuICAgICAgY29uc3QgYWRkcmJ1ZmYxOiBCdWZmZXJbXSA9IGFkZHJzMS5tYXAoXG4gICAgICAgIChhOiBzdHJpbmcpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKVxuICAgICAgKVxuICAgICAgY29uc3QgYWRkcmJ1ZmYyOiBCdWZmZXJbXSA9IGFkZHJzMi5tYXAoXG4gICAgICAgIChhOiBzdHJpbmcpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKVxuICAgICAgKVxuICAgICAgY29uc3QgYWRkcmJ1ZmYzOiBCdWZmZXJbXSA9IGFkZHJzMy5tYXAoXG4gICAgICAgIChhOiBzdHJpbmcpOiBCdWZmZXIgPT4gYXZtLnBhcnNlQWRkcmVzcyhhKVxuICAgICAgKVxuICAgICAgY29uc3QgYW1vdW50OiBCTiA9IG5ldyBCTig5MClcbiAgICAgIGNvbnN0IHR5cGU6IFNlcmlhbGl6ZWRUeXBlID0gXCJiZWNoMzJcIlxuICAgICAgY29uc3QgdHh1MTogVW5zaWduZWRUeCA9IGF3YWl0IGF2bS5idWlsZEV4cG9ydFR4KFxuICAgICAgICBzZXQsXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgYmludG9vbHMuY2I1OERlY29kZShQbGF0Zm9ybUNoYWluSUQpLFxuICAgICAgICBhZGRyYnVmZjMubWFwKChhOiBCdWZmZXIpOiBhbnkgPT5cbiAgICAgICAgICBzZXJpYWxpemF0aW9uLmJ1ZmZlclRvVHlwZShhLCB0eXBlLCBhdmFsYW5jaGUuZ2V0SFJQKCksIFwiUFwiKVxuICAgICAgICApLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMixcbiAgICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIiksXG4gICAgICAgIFVuaXhOb3coKVxuICAgICAgKVxuXG4gICAgICBjb25zdCB0eHUyOiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkRXhwb3J0VHgoXG4gICAgICAgIG5ldHdvcmtJRCxcbiAgICAgICAgYmludG9vbHMuY2I1OERlY29kZShibG9ja2NoYWluSUQpLFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIGFkZHJidWZmMyxcbiAgICAgICAgYWRkcmJ1ZmYxLFxuICAgICAgICBhZGRyYnVmZjIsXG4gICAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoUGxhdGZvcm1DaGFpbklEKSxcbiAgICAgICAgYXZtLmdldFR4RmVlKCksXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIG5ldyBVVEY4UGF5bG9hZChcImhlbGxvIHdvcmxkXCIpLmdldFBheWxvYWQoKSxcbiAgICAgICAgVW5peE5vdygpXG4gICAgICApXG5cbiAgICAgIGV4cGVjdCh0eHUyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICAgIHR4dTEudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgKVxuICAgICAgZXhwZWN0KHR4dTIudG9TdHJpbmcoKSkudG9CZSh0eHUxLnRvU3RyaW5nKCkpXG5cbiAgICAgIGNvbnN0IHR4dTM6IFVuc2lnbmVkVHggPSBhd2FpdCBhdm0uYnVpbGRFeHBvcnRUeChcbiAgICAgICAgc2V0LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIFBsYXRmb3JtQ2hhaW5JRCxcbiAgICAgICAgYWRkcnMzLFxuICAgICAgICBhZGRyczEsXG4gICAgICAgIGFkZHJzMixcbiAgICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIiksXG4gICAgICAgIFVuaXhOb3coKVxuICAgICAgKVxuXG4gICAgICBjb25zdCB0eHU0OiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkRXhwb3J0VHgoXG4gICAgICAgIG5ldHdvcmtJRCxcbiAgICAgICAgYmludG9vbHMuY2I1OERlY29kZShibG9ja2NoYWluSUQpLFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIGFkZHJidWZmMyxcbiAgICAgICAgYWRkcmJ1ZmYxLFxuICAgICAgICBhZGRyYnVmZjIsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYXZtLmdldFR4RmVlKCksXG4gICAgICAgIGFzc2V0SUQsXG4gICAgICAgIG5ldyBVVEY4UGF5bG9hZChcImhlbGxvIHdvcmxkXCIpLmdldFBheWxvYWQoKSxcbiAgICAgICAgVW5peE5vdygpXG4gICAgICApXG5cbiAgICAgIGV4cGVjdCh0eHU0LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICAgIHR4dTMudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgKVxuICAgICAgZXhwZWN0KHR4dTQudG9TdHJpbmcoKSkudG9CZSh0eHUzLnRvU3RyaW5nKCkpXG5cbiAgICAgIGNvbnN0IHR4MTogVHggPSB0eHUxLnNpZ24oYXZtLmtleUNoYWluKCkpXG4gICAgICBjb25zdCBjaGVja1R4OiBzdHJpbmcgPSB0eDEudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgICAgY29uc3QgdHgxb2JqOiBvYmplY3QgPSB0eDEuc2VyaWFsaXplKFwiaGV4XCIpXG4gICAgICBjb25zdCB0eDFzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4MW9iailcbiAgICAgIGNvbnN0IHR4Mm5ld29iajogb2JqZWN0ID0gSlNPTi5wYXJzZSh0eDFzdHIpXG4gICAgICBjb25zdCB0eDI6IFR4ID0gbmV3IFR4KClcbiAgICAgIHR4Mi5kZXNlcmlhbGl6ZSh0eDJuZXdvYmosIFwiaGV4XCIpXG5cbiAgICAgIGNvbnN0IHR4Mm9iajogb2JqZWN0ID0gdHgyLnNlcmlhbGl6ZShcImhleFwiKVxuICAgICAgY29uc3QgdHgyc3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0eDJvYmopXG4gICAgICBleHBlY3QodHgxb2JqKS50b1N0cmljdEVxdWFsKHR4Mm9iailcbiAgICAgIGV4cGVjdCh0eDFzdHIpLnRvU3RyaWN0RXF1YWwodHgyc3RyKVxuICAgICAgZXhwZWN0KHR4Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGNoZWNrVHgpXG5cbiAgICAgIGNvbnN0IHR4MzogVHggPSB0eHUxLnNpZ24oYXZtLmtleUNoYWluKCkpXG4gICAgICBjb25zdCB0eDNvYmo6IG9iamVjdCA9IHR4My5zZXJpYWxpemUoZGlzcGxheSlcbiAgICAgIGNvbnN0IHR4M3N0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodHgzb2JqKVxuICAgICAgY29uc3QgdHg0bmV3b2JqOiBvYmplY3QgPSBKU09OLnBhcnNlKHR4M3N0cilcbiAgICAgIGNvbnN0IHR4NDogVHggPSBuZXcgVHgoKVxuICAgICAgdHg0LmRlc2VyaWFsaXplKHR4NG5ld29iaiwgZGlzcGxheSlcblxuICAgICAgY29uc3QgdHg0b2JqOiBvYmplY3QgPSB0eDQuc2VyaWFsaXplKGRpc3BsYXkpXG4gICAgICBjb25zdCB0eDRzdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHR4NG9iailcbiAgICAgIGV4cGVjdCh0eDNvYmopLnRvU3RyaWN0RXF1YWwodHg0b2JqKVxuICAgICAgZXhwZWN0KHR4M3N0cikudG9TdHJpY3RFcXVhbCh0eDRzdHIpXG4gICAgICBleHBlY3QodHg0LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tUeClcbiAgICAgIHNlcmlhbHplaXQodHgxLCBcIkV4cG9ydFR4XCIpXG4gICAgfSlcblxuICAgIHRlc3QoXCJidWlsZEdlbmVzaXNcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgZ2VuZXNpc0RhdGE6IG9iamVjdCA9IHtcbiAgICAgICAgZ2VuZXNpc0RhdGE6IHtcbiAgICAgICAgICBhc3NldEFsaWFzMToge1xuICAgICAgICAgICAgbmFtZTogXCJodW1hbiByZWFkYWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBzeW1ib2w6IFwiQVZBTFwiLFxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgICAgICAgIGZpeGVkQ2FwOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYW1vdW50OiAxMDAwLFxuICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJBXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFtb3VudDogNTAwMCxcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiQlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3NldEFsaWFzQ2FuQmVBbnl0aGluZ1VuaXF1ZToge1xuICAgICAgICAgICAgbmFtZTogXCJodW1hbiByZWFkYWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBzeW1ib2w6IFwiQVZBTFwiLFxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlQ2FwOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbWludGVyczogW1wiQVwiLCBcIkJcIl0sXG4gICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG1pbnRlcnM6IFtcIkFcIiwgXCJCXCIsIFwiQ1wiXSxcbiAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYnl0ZXM6IHN0cmluZyA9XG4gICAgICAgIFwiMTExVE5XelV0SEtvU3Z4b2hqeWZFd0UyWDIyOFpER0JuZ1o0bWRNVVZNblZuanRuYXdXMWIxemJBaHp5QU0xdjZkN0VDTmo2RFhzVDdxRG1oU0VmM0RXZ1hSajdFQ3dCWDM2WlhGYzl0V1ZCMnFIVVJvVWZkRHZGc0JlU1JxYXRDbWo3NmVaUU1HWkRnQkZSTmlqUmhQTktVYXA3YkNlS3BIRHR1Q1pjNFlwUGtkNG1SODRkTEwyQUwxYjRLNDZlaXJXS01hRlZqQTVidFlTNERueVV4NWNMcEFxM2QzNWtFZE5kVTV6SDNyVFUxOFM0VHhZVjh2b01QY0xDVFozaDR6UnNNNWpXMWNVempXVnZLZzd1WVMyb1I5cVhSRmNneTFnd05URlpHc3R5U3V2U0Y3TVplWkY0elNkTmdDNHJiWTlIOTRSVmhxZThyVzdNWHFNU1pCNnZCVEIyQnBnRjZ0TkZlaG1ZeEVYd2phS1JyaW1YOTF1dHZaZTlZamdHYkRyOFhIc1hDblhYZzRaRENqYXBDeTRIbW1SVXRVb0FkdUdOQmRHVk1pd0U5V3ZWYnBNRkZjTmZnRFhHejlOaWF0Z1Nua3hRQUxUSHZHWFhtOGJuNENvTEZ6S25BdHEzS3dpV3FIbVYzR2pGWWVVbTNtOFplZTlWRGZaQXZEc2hhNTFhY3hmdG8xaHRzdHhZdTY2RFdwVDM2WVQxOFdTYnhpYlpjS1hhN2dacnJzQ3d5emlkOENDV3c3OURiYUxDVWlxOXU0N1Zxb2ZHMWtneHd1dXlIYjhOVm5UZ1JUa1FBU1NiajIzMmZ5RzdZZVg0bUF2Wlk3YTdLN3lmU3l6SmFYZFVkUjdhTGVDZExQNm1iRkRxVU1yTjZZRWtVMlg4ZDRDazNUXCJcbiAgICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXBpLmJ1aWxkR2VuZXNpcyhnZW5lc2lzRGF0YSlcbiAgICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgYnl0ZXM6IGJ5dGVzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3BvbnNlT2JqOiB7XG4gICAgICAgIGRhdGE6IG9iamVjdFxuICAgICAgfSA9IHtcbiAgICAgICAgZGF0YTogcGF5bG9hZFxuICAgICAgfVxuXG4gICAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGJ5dGVzKVxuICAgIH0pXG4gIH0pXG59KVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!