@witnet/ethers
Version:
Wit/Oracle Ethers Framework package for EVM-compatible projects
314 lines • 43.5 kB
JavaScript
;
const fs = require("fs");
const merge = require("lodash.merge");
const framework = require("@witnet/solidity").default;
const DEFAULT_BATCH_SIZE = 64;
const DEFAULT_LIMIT = 64;
const DEFAULT_SINCE = -5000;
const commas = (number) => {
const parts = number?.toString().split(".") || [""];
const result = parts.length <= 1
? `${parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")}`
: `${parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")}.${parts[1]}`;
return result;
};
const blue = (str) => `\x1b[34m${str}\x1b[0m`;
const cyan = (str) => `\x1b[36m${str}\x1b[0m`;
const gray = (str) => `\x1b[90m${str}\x1b[0m`;
const green = (str) => `\x1b[32m${str}\x1b[0m`;
const magenta = (str) => `\x1b[0;35m${str}\x1b[0m`;
const red = (str) => `\x1b[31m${str}\x1b[0m`;
const yellow = (str) => `\x1b[33m${str}\x1b[0m`;
const white = (str) => `\x1b[0;38m${str}\x1b[0m`;
const lblue = (str) => `\x1b[1;94m${str}\x1b[0m`;
const lcyan = (str) => `\x1b[1;96m${str}\x1b[0m`;
const lgreen = (str) => `\x1b[1;92m${str}\x1b[0m`;
const lmagenta = (str) => `\x1b[1;95m${str}\x1b[0m`;
const lwhite = (str) => `\x1b[0;1;98m${str}\x1b[0m`;
const lyellow = (str) => `\x1b[1;93m${str}\x1b[0m`;
const mblue = (str) => `\x1b[94m${str}\x1b[0m`;
const mcyan = (str) => `\x1b[96m${str}\x1b[0m`;
const mgreen = (str) => `\x1b[92m${str}\x1b[0m`;
const mmagenta = (str) => `\x1b[0;95m${str}\x1b[0m`;
const mred = (str) => `\x1b[91m${str}\x1b[0m`;
const myellow = (str) => `\x1b[93m${str}\x1b[0m`;
const WITNET_SDK_RADON_ASSETS_PATH = process.env.WITNET_SDK_RADON_ASSETS_PATH || "../../../../witnet/assets";
const isModuleInitialized = fs.existsSync("./witnet/assets/index.js");
function readWitnetJsonFiles(...filenames) {
return Object.fromEntries(filenames.map(key => {
const filepath = `./witnet/${key}.json`;
return [
key,
fs.existsSync(filepath) ? JSON.parse(fs.readFileSync(filepath)) : {},
];
}));
}
function saveWitnetJsonFiles(data) {
Object.entries(data).forEach(([key, obj]) => {
const filepath = `./witnet/${key}.json`;
if (!fs.existsSync(filepath))
fs.writeFileSync(filepath, "{}");
const json = merge(JSON.parse(fs.readFileSync(filepath)), obj);
fs.writeFileSync(filepath, JSON.stringify(json, null, 4), { flag: "w+" });
});
}
function deleteExtraFlags(args) {
const deleted = [];
return [
args?.filter(arg => {
if (arg.startsWith("--")) {
deleted.push(arg.slice(2));
return false;
}
else {
return true;
}
}),
deleted,
];
}
function extractFlagsFromArgs(args, flags) {
const curated = {};
if (args && Array.isArray(args) && flags) {
flags.forEach(flag => {
const index = args.indexOf(`--${flag}`);
if (index >= 0) {
curated[flag] = true;
args.splice(index, 1);
}
});
}
return [args || [], curated];
}
function extractOptionsFromArgs(args, options) {
const curated = {};
if (args && Array.isArray(args) && options) {
options.forEach(option => {
const index = args.indexOf(`--${option}`);
if (index >= 0) {
curated[option] = args[index];
if (!args[index + 1] || args[index + 1].startsWith("--")) {
args.splice(index, 1);
curated[option] = undefined;
}
else {
curated[option] = args[index + 1];
args.splice(index, 2);
}
}
});
}
return [args || [], curated];
}
function flattenObject(ob) {
const toReturn = {};
for (const i in ob) {
if (!ob.hasOwnProperty(i))
continue;
if ((typeof ob[i]) === "object" && ob[i] !== null) {
const flatObject = flattenObject(ob[i]);
for (const x in flatObject) {
if (!flatObject.hasOwnProperty(x))
continue;
toReturn[i + "." + x] = flatObject[x];
}
}
else {
toReturn[i] = ob[i];
}
}
return toReturn;
}
function getNetworkAddresses(network) {
return merge(framework.getNetworkAddresses(network.toLowerCase()), fs.existsSync(`${WITNET_SDK_RADON_ASSETS_PATH}/../addresses.json`)
? require(`${WITNET_SDK_RADON_ASSETS_PATH}/../addresses.json`)[network.toLowerCase()]
: {});
}
function orderKeys(obj) {
const keys = Object.keys(obj).sort(function keyOrder(k1, k2) {
if (k1 < k2)
return -1;
else if (k1 > k2)
return +1;
else
return 0;
});
let i;
const after = {};
for (i = 0; i < keys.length; i++) {
after[keys[i]] = obj[keys[i]];
delete obj[keys[i]];
}
for (i = 0; i < keys.length; i++) {
obj[keys[i]] = after[keys[i]];
}
return obj;
}
function showVersion() {
console.info(`${lwhite(`Wit/Oracle Ethers CLI v${require("../../package.json").version}`)}`);
}
function traceHeader(header, color = white, indent = "") {
console.info(`${indent}┌─${"─".repeat(header.length)}─┐`);
console.info(`${indent}│ ${color(header)} │`);
console.info(`${indent}└─${"─".repeat(header.length)}─┘`);
}
function importRadonAssets(options) {
const { assets } = options?.legacy ? {} : require("@witnet/sdk");
return isModuleInitialized && fs.existsSync(`${WITNET_SDK_RADON_ASSETS_PATH}`)
? merge(assets, require(`${WITNET_SDK_RADON_ASSETS_PATH}`))
: assets;
}
function traceTable(records, options) {
const stringify = (data, humanizers, index) => humanizers && humanizers[index] ? humanizers[index](data).toString() : data?.toString() ?? "";
const reduceMax = (numbers) => numbers.reduce((curr, prev) => Math.max(curr, prev), 0);
if (!options)
options = {};
const indent = options?.indent || "";
const numColumns = reduceMax(records.map(record => record?.length || 1));
const maxColumnWidth = options?.maxColumnWidth || 80;
const table = transpose(records, numColumns);
options.widths = options?.widths || table.map((column, index) => {
let maxWidth = reduceMax(column.map(field => colorstrip(stringify(field, options?.humanizers, index)).length));
if (options?.headlines && options.headlines[index]) {
maxWidth = Math.max(maxWidth, colorstrip(options.headlines[index].replaceAll(":", "")).length);
}
return Math.min(maxWidth, maxColumnWidth);
});
let headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
console.info(`${indent}┌─${headline.join("─┬─")}─┐`);
if (options?.headlines) {
headline = options.widths.map((maxWidth, index) => {
const caption = options.headlines[index].replaceAll(":", "");
const captionLength = colorstrip(caption).length;
return `${white(caption)}${" ".repeat(maxWidth - captionLength)}`;
});
console.info(`${indent}│ ${headline.join(" │ ")} │`);
headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
console.info(`${indent}├─${headline.join("─┼─")}─┤`);
}
for (let i = 0; i < records.length; i++) {
let line = "";
for (let j = 0; j < numColumns; j++) {
let data = table[j][i];
let color;
if (options?.colors && options.colors[j]) {
color = options.colors[j];
}
else {
color = typeof data === "string"
? green
: (Number(data) === data && data % 1 !== 0 // is float number?
? yellow
: (x) => x);
}
data = stringify(data, options?.humanizers, j);
if (colorstrip(data).length > maxColumnWidth) {
while (colorstrip(data).length > maxColumnWidth - 3) {
data = data.slice(0, -1);
}
data += "...";
}
const dataLength = colorstrip(data).length;
if (options?.headlines && options.headlines[j][0] === ":") {
data = `${color(data)}${" ".repeat(options.widths[j] - dataLength)}`;
}
else {
data = `${" ".repeat(options.widths[j] - dataLength)}${color(data)}`;
}
line += `│ ${data} `;
}
console.info(`${indent}${line}│`);
}
headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
console.info(`${indent}└─${headline.join("─┴─")}─┘`);
}
function transpose(records, numColumns) {
const columns = [];
for (let index = 0; index < numColumns; index++) {
columns.push(records.map(row => row[index]));
}
return columns;
}
const colorstrip = (str) => str.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, "");
function prompter(promise) {
const loading = (() => {
const h = ["|", "/", "-", "\\"];
let i = 0;
return setInterval(() => {
i = (i > 3) ? 0 : i;
process.stdout.write(`\b\b${h[i]} `);
i++;
}, 50);
})();
return promise
.then(result => {
clearInterval(loading);
process.stdout.write("\b\b");
return result;
});
}
function traceData(header, data, width, color) {
process.stdout.write(header);
if (color)
process.stdout.write(color);
for (let ix = 0; ix < data.length / width; ix++) {
if (ix > 0)
process.stdout.write(" ".repeat(header.length));
process.stdout.write(data.slice(width * ix, width * (ix + 1)));
process.stdout.write("\n");
}
if (color)
process.stdout.write("\x1b[0m");
}
function* chunks(arr, n) {
for (let i = 0; i < arr.length; i += n) {
yield arr.slice(i, i + n);
}
}
module.exports = {
DEFAULT_BATCH_SIZE,
DEFAULT_LIMIT,
DEFAULT_SINCE,
colors: {
blue,
cyan,
gray,
green,
red,
yellow,
white,
magenta,
lblue,
lcyan,
lgreen,
lmagenta,
lwhite,
lyellow,
mblue,
mcyan,
mgreen,
mred,
myellow,
mmagenta,
},
chunks,
deleteExtraFlags,
extractFlagsFromArgs,
extractOptionsFromArgs,
flattenObject,
orderKeys,
showVersion,
traceData,
traceHeader,
getNetworkAddresses,
getNetworkArtifacts: framework.getNetworkArtifacts,
getNetworkConstructorArgs: framework.getNetworkConstructorArgs,
importRadonAssets,
readWitnetJsonFiles,
saveWitnetJsonFiles,
traceTable,
commas,
colorstrip,
prompter,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW4vaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQTtBQUNyQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLENBQUE7QUFFckQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFBO0FBQ3hCLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFBO0FBRTNCLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7SUFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ3JELENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDbkUsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUM3QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUM3QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUM3QyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUM5QyxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNsRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUM1QyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUMvQyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNoRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNqRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNuRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtBQUNuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUNsRCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUM5QyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxF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RUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUM1SSxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RGLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUMxQixNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4RSxNQUFNLGNBQWMsR0FBRyxPQUFPLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQTtJQUNwRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzVDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzlELElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENB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O0FBQzVDLENBQUM7QUFFRCxRQUFTLENBQUMsQ0FBQyxNQUFNLENBQUUsR0FBRyxFQUFFLENBQUM7SUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRztJQUNmLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsYUFBYTtJQUNiLE1BQU0sRUFBRTtRQUNOLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLEtBQUs7UUFDTCxHQUFHO1FBQ0gsTUFBTTtRQUNOLEtBQUs7UUFDTCxPQUFPO1FBQ1AsS0FBSztRQUNMLEtBQUs7UUFDTCxNQUFNO1FBQ04sUUFBUTtRQUNSLE1BQU07UUFDTixPQUFPO1FBQ1AsS0FBSztRQUNMLEtBQUs7UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLE9BQU87UUFDUCxRQUFRO0tBQ1Q7SUFDRCxNQUFNO0lBQ04sZ0JBQWdCO0lBQ2hCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsYUFBYTtJQUNiLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLG1CQUFtQjtJQUNsRCx5QkFBeUIsRUFBRSxTQUFTLENBQUMseUJBQXlCO0lBQzlELGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLFVBQVU7SUFDVixNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7Q0FDVCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIilcclxuY29uc3QgbWVyZ2UgPSByZXF1aXJlKFwibG9kYXNoLm1lcmdlXCIpXHJcbmNvbnN0IGZyYW1ld29yayA9IHJlcXVpcmUoXCJAd2l0bmV0L3NvbGlkaXR5XCIpLmRlZmF1bHRcclxuXHJcbmNvbnN0IERFRkFVTFRfQkFUQ0hfU0laRSA9IDY0XHJcbmNvbnN0IERFRkFVTFRfTElNSVQgPSA2NFxyXG5jb25zdCBERUZBVUxUX1NJTkNFID0gLTUwMDBcclxuXHJcbmNvbnN0IGNvbW1hcyA9IChudW1iZXIpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IG51bWJlcj8udG9TdHJpbmcoKS5zcGxpdChcIi5cIikgfHwgW1wiXCJdXHJcbiAgY29uc3QgcmVzdWx0ID0gcGFydHMubGVuZ3RoIDw9IDFcclxuICAgID8gYCR7cGFydHNbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgXCIsXCIpfWBcclxuICAgIDogYCR7cGFydHNbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgXCIsXCIpfS4ke3BhcnRzWzFdfWBcclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbmNvbnN0IGJsdWUgPSAoc3RyKSA9PiBgXFx4MWJbMzRtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbMzZtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGdyYXkgPSAoc3RyKSA9PiBgXFx4MWJbOTBtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGdyZWVuID0gKHN0cikgPT4gYFxceDFiWzMybSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBtYWdlbnRhID0gKHN0cikgPT4gYFxceDFiWzA7MzVtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IHJlZCA9IChzdHIpID0+IGBcXHgxYlszMW0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgeWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzMzbSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCB3aGl0ZSA9IChzdHIpID0+IGBcXHgxYlswOzM4bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBsYmx1ZSA9IChzdHIpID0+IGBcXHgxYlsxOzk0bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBsY3lhbiA9IChzdHIpID0+IGBcXHgxYlsxOzk2bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBsZ3JlZW4gPSAoc3RyKSA9PiBgXFx4MWJbMTs5Mm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbG1hZ2VudGEgPSAoc3RyKSA9PiBgXFx4MWJbMTs5NW0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbHdoaXRlID0gKHN0cikgPT4gYFxceDFiWzA7MTs5OG0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbHllbGxvdyA9IChzdHIpID0+IGBcXHgxYlsxOzkzbSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBtYmx1ZSA9IChzdHIpID0+IGBcXHgxYls5NG0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbWN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbOTZtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IG1ncmVlbiA9IChzdHIpID0+IGBcXHgxYls5Mm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbW1hZ2VudGEgPSAoc3RyKSA9PiBgXFx4MWJbMDs5NW0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbXJlZCA9IChzdHIpID0+IGBcXHgxYls5MW0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbXllbGxvdyA9IChzdHIpID0+IGBcXHgxYls5M20ke3N0cn1cXHgxYlswbWBcclxuXHJcbmNvbnN0IFdJVE5FVF9TREtfUkFET05fQVNTRVRTX1BBVEggPSBwcm9jZXNzLmVudi5XSVRORVRfU0RLX1JBRE9OX0FTU0VUU19QQVRIIHx8IFwiLi4vLi4vLi4vLi4vd2l0bmV0L2Fzc2V0c1wiXHJcbmNvbnN0IGlzTW9kdWxlSW5pdGlhbGl6ZWQgPSBmcy5leGlzdHNTeW5jKFwiLi93aXRuZXQvYXNzZXRzL2luZGV4LmpzXCIpXHJcblxyXG5mdW5jdGlvbiByZWFkV2l0bmV0SnNvbkZpbGVzICguLi5maWxlbmFtZXMpIHtcclxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVuYW1lcy5tYXAoa2V5ID0+IHtcclxuICAgIGNvbnN0IGZpbGVwYXRoID0gYC4vd2l0bmV0LyR7a2V5fS5qc29uYFxyXG4gICAgcmV0dXJuIFtcclxuICAgICAga2V5LFxyXG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVwYXRoKSA/IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoKSkgOiB7fSxcclxuICAgIF1cclxuICB9KSlcclxufVxyXG5cclxuZnVuY3Rpb24gc2F2ZVdpdG5ldEpzb25GaWxlcyAoZGF0YSkge1xyXG4gIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIG9ial0pID0+IHtcclxuICAgIGNvbnN0IGZpbGVwYXRoID0gYC4vd2l0bmV0LyR7a2V5fS5qc29uYFxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVwYXRoKSkgZnMud3JpdGVGaWxlU3luYyhmaWxlcGF0aCwgXCJ7fVwiKVxyXG4gICAgY29uc3QganNvbiA9IG1lcmdlKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoKSksIG9iailcclxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDQpLCB7IGZsYWc6IFwidytcIiB9KVxyXG4gIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlbGV0ZUV4dHJhRmxhZ3MgKGFyZ3MpIHtcclxuICBjb25zdCBkZWxldGVkID0gW11cclxuICByZXR1cm4gW1xyXG4gICAgYXJncz8uZmlsdGVyKGFyZyA9PiB7XHJcbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XHJcbiAgICAgICAgZGVsZXRlZC5wdXNoKGFyZy5zbGljZSgyKSlcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KSxcclxuICAgIGRlbGV0ZWQsXHJcbiAgXVxyXG59XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0RmxhZ3NGcm9tQXJncyAoYXJncywgZmxhZ3MpIHtcclxuICBjb25zdCBjdXJhdGVkID0ge31cclxuICBpZiAoYXJncyAmJiBBcnJheS5pc0FycmF5KGFyZ3MpICYmIGZsYWdzKSB7XHJcbiAgICBmbGFncy5mb3JFYWNoKGZsYWcgPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IGFyZ3MuaW5kZXhPZihgLS0ke2ZsYWd9YClcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICBjdXJhdGVkW2ZsYWddID0gdHJ1ZVxyXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICByZXR1cm4gW2FyZ3MgfHwgW10sIGN1cmF0ZWRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RPcHRpb25zRnJvbUFyZ3MgKGFyZ3MsIG9wdGlvbnMpIHtcclxuICBjb25zdCBjdXJhdGVkID0ge31cclxuICBpZiAoYXJncyAmJiBBcnJheS5pc0FycmF5KGFyZ3MpICYmIG9wdGlvbnMpIHtcclxuICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IGFyZ3MuaW5kZXhPZihgLS0ke29wdGlvbn1gKVxyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIGN1cmF0ZWRbb3B0aW9uXSA9IGFyZ3NbaW5kZXhdXHJcbiAgICAgICAgaWYgKCFhcmdzW2luZGV4ICsgMV0gfHwgYXJnc1tpbmRleCArIDFdLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xyXG4gICAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgICAgICBjdXJhdGVkW29wdGlvbl0gPSB1bmRlZmluZWRcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY3VyYXRlZFtvcHRpb25dID0gYXJnc1tpbmRleCArIDFdXHJcbiAgICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHJldHVybiBbYXJncyB8fCBbXSwgY3VyYXRlZF1cclxufVxyXG5cclxuZnVuY3Rpb24gZmxhdHRlbk9iamVjdCAob2IpIHtcclxuICBjb25zdCB0b1JldHVybiA9IHt9XHJcbiAgZm9yIChjb25zdCBpIGluIG9iKSB7XHJcbiAgICBpZiAoIW9iLmhhc093blByb3BlcnR5KGkpKSBjb250aW51ZVxyXG4gICAgaWYgKCh0eXBlb2Ygb2JbaV0pID09PSBcIm9iamVjdFwiICYmIG9iW2ldICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGZsYXRPYmplY3QgPSBmbGF0dGVuT2JqZWN0KG9iW2ldKVxyXG4gICAgICBmb3IgKGNvbnN0IHggaW4gZmxhdE9iamVjdCkge1xyXG4gICAgICAgIGlmICghZmxhdE9iamVjdC5oYXNPd25Qcm9wZXJ0eSh4KSkgY29udGludWVcclxuICAgICAgICB0b1JldHVybltpICsgXCIuXCIgKyB4XSA9IGZsYXRPYmplY3RbeF1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG9SZXR1cm5baV0gPSBvYltpXVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdG9SZXR1cm5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV0d29ya0FkZHJlc3NlcyAobmV0d29yaykge1xyXG4gIHJldHVybiBtZXJnZShcclxuICAgIGZyYW1ld29yay5nZXROZXR3b3JrQWRkcmVzc2VzKG5ldHdvcmsudG9Mb3dlckNhc2UoKSksXHJcbiAgICBmcy5leGlzdHNTeW5jKGAke1dJVE5FVF9TREtfUkFET05fQVNTRVRTX1BBVEh9Ly4uL2FkZHJlc3Nlcy5qc29uYClcclxuICAgICAgPyByZXF1aXJlKGAke1dJVE5FVF9TREtfUkFET05fQVNTRVRTX1BBVEh9Ly4uL2FkZHJlc3Nlcy5qc29uYClbbmV0d29yay50b0xvd2VyQ2FzZSgpXVxyXG4gICAgICA6IHt9LFxyXG4gIClcclxufVxyXG5cclxuZnVuY3Rpb24gb3JkZXJLZXlzIChvYmopIHtcclxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KGZ1bmN0aW9uIGtleU9yZGVyIChrMSwgazIpIHtcclxuICAgIGlmIChrMSA8IGsyKSByZXR1cm4gLTFcclxuICAgIGVsc2UgaWYgKGsxID4gazIpIHJldHVybiArMVxyXG4gICAgZWxzZSByZXR1cm4gMFxyXG4gIH0pXHJcbiAgbGV0IGk7IGNvbnN0IGFmdGVyID0ge31cclxuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgYWZ0ZXJba2V5c1tpXV0gPSBvYmpba2V5c1tpXV1cclxuICAgIGRlbGV0ZSBvYmpba2V5c1tpXV1cclxuICB9XHJcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgIG9ialtrZXlzW2ldXSA9IGFmdGVyW2tleXNbaV1dXHJcbiAgfVxyXG4gIHJldHVybiBvYmpcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1ZlcnNpb24gKCkge1xyXG4gIGNvbnNvbGUuaW5mbyhgJHtsd2hpdGUoYFdpdC9PcmFjbGUgRXRoZXJzIENMSSB2JHtyZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpLnZlcnNpb259YCl9YClcclxufVxyXG5cclxuZnVuY3Rpb24gdHJhY2VIZWFkZXIgKGhlYWRlciwgY29sb3IgPSB3aGl0ZSwgaW5kZW50ID0gXCJcIikge1xyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSM4pSAJHtcIuKUgFwiLnJlcGVhdChoZWFkZXIubGVuZ3RoKX3ilIDilJBgKVxyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSCICR7Y29sb3IoaGVhZGVyKX0g4pSCYClcclxuICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUlOKUgCR7XCLilIBcIi5yZXBlYXQoaGVhZGVyLmxlbmd0aCl94pSA4pSYYClcclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0UmFkb25Bc3NldHMgKG9wdGlvbnMpIHtcclxuICBjb25zdCB7IGFzc2V0cyB9ID0gb3B0aW9ucz8ubGVnYWN5ID8ge30gOiByZXF1aXJlKFwiQHdpdG5ldC9zZGtcIilcclxuICByZXR1cm4gaXNNb2R1bGVJbml0aWFsaXplZCAmJiBmcy5leGlzdHNTeW5jKGAke1dJVE5FVF9TREtfUkFET05fQVNTRVRTX1BBVEh9YClcclxuICAgID8gbWVyZ2UoYXNzZXRzLCByZXF1aXJlKGAke1dJVE5FVF9TREtfUkFET05fQVNTRVRTX1BBVEh9YCkpXHJcbiAgICA6IGFzc2V0c1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFjZVRhYmxlIChyZWNvcmRzLCBvcHRpb25zKSB7XHJcbiAgY29uc3Qgc3RyaW5naWZ5ID0gKGRhdGEsIGh1bWFuaXplcnMsIGluZGV4KSA9PiBodW1hbml6ZXJzICYmIGh1bWFuaXplcnNbaW5kZXhdID8gaHVtYW5pemVyc1tpbmRleF0oZGF0YSkudG9TdHJpbmcoKSA6IGRhdGE/LnRvU3RyaW5nKCkgPz8gXCJcIlxyXG4gIGNvbnN0IHJlZHVjZU1heCA9IChudW1iZXJzKSA9PiBudW1iZXJzLnJlZHVjZSgoY3VyciwgcHJldikgPT4gTWF0aC5tYXgoY3VyciwgcHJldiksIDApXHJcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge31cclxuICBjb25zdCBpbmRlbnQgPSBvcHRpb25zPy5pbmRlbnQgfHwgXCJcIlxyXG4gIGNvbnN0IG51bUNvbHVtbnMgPSByZWR1Y2VNYXgocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZD8ubGVuZ3RoIHx8IDEpKVxyXG4gIGNvbnN0IG1heENvbHVtbldpZHRoID0gb3B0aW9ucz8ubWF4Q29sdW1uV2lkdGggfHwgODBcclxuICBjb25zdCB0YWJsZSA9IHRyYW5zcG9zZShyZWNvcmRzLCBudW1Db2x1bW5zKVxyXG4gIG9wdGlvbnMud2lkdGhzID0gb3B0aW9ucz8ud2lkdGhzIHx8IHRhYmxlLm1hcCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgbGV0IG1heFdpZHRoID0gcmVkdWNlTWF4KGNvbHVtbi5tYXAoZmllbGQgPT4gY29sb3JzdHJpcChzdHJpbmdpZnkoZmllbGQsIG9wdGlvbnM/Lmh1bWFuaXplcnMsIGluZGV4KSkubGVuZ3RoKSlcclxuICAgIGlmIChvcHRpb25zPy5oZWFkbGluZXMgJiYgb3B0aW9ucy5oZWFkbGluZXNbaW5kZXhdKSB7XHJcbiAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGNvbG9yc3RyaXAob3B0aW9ucy5oZWFkbGluZXNbaW5kZXhdLnJlcGxhY2VBbGwoXCI6XCIsIFwiXCIpKS5sZW5ndGgpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5taW4obWF4V2lkdGgsIG1heENvbHVtbldpZHRoKVxyXG4gIH0pXHJcbiAgbGV0IGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKG1heFdpZHRoID0+IFwi4pSAXCIucmVwZWF0KG1heFdpZHRoKSlcclxuICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUjOKUgCR7aGVhZGxpbmUuam9pbihcIuKUgOKUrOKUgFwiKX3ilIDilJBgKVxyXG4gIGlmIChvcHRpb25zPy5oZWFkbGluZXMpIHtcclxuICAgIGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKChtYXhXaWR0aCwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgY2FwdGlvbiA9IG9wdGlvbnMuaGVhZGxpbmVzW2luZGV4XS5yZXBsYWNlQWxsKFwiOlwiLCBcIlwiKVxyXG4gICAgICBjb25zdCBjYXB0aW9uTGVuZ3RoID0gY29sb3JzdHJpcChjYXB0aW9uKS5sZW5ndGhcclxuICAgICAgcmV0dXJuIGAke3doaXRlKGNhcHRpb24pfSR7XCIgXCIucmVwZWF0KG1heFdpZHRoIC0gY2FwdGlvbkxlbmd0aCl9YFxyXG4gICAgfSlcclxuICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSCICR7aGVhZGxpbmUuam9pbihcIiDilIIgXCIpfSDilIJgKVxyXG4gICAgaGVhZGxpbmUgPSBvcHRpb25zLndpZHRocy5tYXAobWF4V2lkdGggPT4gXCLilIBcIi5yZXBlYXQobWF4V2lkdGgpKVxyXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilJzilIAke2hlYWRsaW5lLmpvaW4oXCLilIDilLzilIBcIil94pSA4pSkYClcclxuICB9XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBsZXQgbGluZSA9IFwiXCJcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7XHJcbiAgICAgIGxldCBkYXRhID0gdGFibGVbal1baV1cclxuICAgICAgbGV0IGNvbG9yXHJcbiAgICAgIGlmIChvcHRpb25zPy5jb2xvcnMgJiYgb3B0aW9ucy5jb2xvcnNbal0pIHtcclxuICAgICAgICBjb2xvciA9IG9wdGlvbnMuY29sb3JzW2pdXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29sb3IgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgICAgICAgPyBncmVlblxyXG4gICAgICAgICAgOiAoTnVtYmVyKGRhdGEpID09PSBkYXRhICYmIGRhdGEgJSAxICE9PSAwIC8vIGlzIGZsb2F0IG51bWJlcj9cclxuICAgICAgICAgICAgPyB5ZWxsb3dcclxuICAgICAgICAgICAgOiAoeCkgPT4geFxyXG4gICAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGRhdGEgPSBzdHJpbmdpZnkoZGF0YSwgb3B0aW9ucz8uaHVtYW5pemVycywgailcclxuICAgICAgaWYgKGNvbG9yc3RyaXAoZGF0YSkubGVuZ3RoID4gbWF4Q29sdW1uV2lkdGgpIHtcclxuICAgICAgICB3aGlsZSAoY29sb3JzdHJpcChkYXRhKS5sZW5ndGggPiBtYXhDb2x1bW5XaWR0aCAtIDMpIHtcclxuICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDAsIC0xKVxyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhICs9IFwiLi4uXCJcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkYXRhTGVuZ3RoID0gY29sb3JzdHJpcChkYXRhKS5sZW5ndGhcclxuICAgICAgaWYgKG9wdGlvbnM/LmhlYWRsaW5lcyAmJiBvcHRpb25zLmhlYWRsaW5lc1tqXVswXSA9PT0gXCI6XCIpIHtcclxuICAgICAgICBkYXRhID0gYCR7Y29sb3IoZGF0YSl9JHtcIiBcIi5yZXBlYXQob3B0aW9ucy53aWR0aHNbal0gLSBkYXRhTGVuZ3RoKX1gXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YSA9IGAke1wiIFwiLnJlcGVhdChvcHRpb25zLndpZHRoc1tqXSAtIGRhdGFMZW5ndGgpfSR7Y29sb3IoZGF0YSl9YFxyXG4gICAgICB9XHJcbiAgICAgIGxpbmUgKz0gYOKUgiAke2RhdGF9IGBcclxuICAgIH1cclxuICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR9JHtsaW5lfeKUgmApXHJcbiAgfVxyXG4gIGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKG1heFdpZHRoID0+IFwi4pSAXCIucmVwZWF0KG1heFdpZHRoKSlcclxuICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUlOKUgCR7aGVhZGxpbmUuam9pbihcIuKUgOKUtOKUgFwiKX3ilIDilJhgKVxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFuc3Bvc2UgKHJlY29yZHMsIG51bUNvbHVtbnMpIHtcclxuICBjb25zdCBjb2x1bW5zID0gW11cclxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbnVtQ29sdW1uczsgaW5kZXgrKykge1xyXG4gICAgY29sdW1ucy5wdXNoKHJlY29yZHMubWFwKHJvdyA9PiByb3dbaW5kZXhdKSlcclxuICB9XHJcbiAgcmV0dXJuIGNvbHVtbnNcclxufVxyXG5cclxuY29uc3QgY29sb3JzdHJpcCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKFxyXG4gIC9bXFx1MDAxYlxcdTAwOWJdW1soKSM7P10qKD86WzAtOV17MSw0fSg/OjtbMC05XXswLDR9KSopP1swLTlBLU9SWmNmLW5xcnk9PjxdL2csIFwiXCJcclxuKVxyXG5cclxuZnVuY3Rpb24gcHJvbXB0ZXIgKHByb21pc2UpIHtcclxuICBjb25zdCBsb2FkaW5nID0gKCgpID0+IHtcclxuICAgIGNvbnN0IGggPSBbXCJ8XCIsIFwiL1wiLCBcIi1cIiwgXCJcXFxcXCJdXHJcbiAgICBsZXQgaSA9IDBcclxuICAgIHJldHVybiBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGkgPSAoaSA+IDMpID8gMCA6IGlcclxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxcYlxcYiR7aFtpXX0gYClcclxuICAgICAgaSsrXHJcbiAgICB9LCA1MClcclxuICB9KSgpXHJcbiAgcmV0dXJuIHByb21pc2VcclxuICAgIC50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwobG9hZGluZylcclxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXGJcXGJcIilcclxuICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gdHJhY2VEYXRhIChoZWFkZXIsIGRhdGEsIHdpZHRoLCBjb2xvcikge1xyXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGhlYWRlcilcclxuICBpZiAoY29sb3IpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNvbG9yKVxyXG4gIGZvciAobGV0IGl4ID0gMDsgaXggPCBkYXRhLmxlbmd0aCAvIHdpZHRoOyBpeCsrKSB7XHJcbiAgICBpZiAoaXggPiAwKSBwcm9jZXNzLnN0ZG91dC53cml0ZShcIiBcIi5yZXBlYXQoaGVhZGVyLmxlbmd0aCkpXHJcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhLnNsaWNlKHdpZHRoICogaXgsIHdpZHRoICogKGl4ICsgMSkpKVxyXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXG5cIilcclxuICB9XHJcbiAgaWYgKGNvbG9yKSBwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxceDFiWzBtXCIpXHJcbn1cclxuXHJcbmZ1bmN0aW9uICogY2h1bmtzIChhcnIsIG4pIHtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gbikge1xyXG4gICAgeWllbGQgYXJyLnNsaWNlKGksIGkgKyBuKVxyXG4gIH1cclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgREVGQVVMVF9CQVRDSF9TSVpFLFxyXG4gIERFRkFVTFRfTElNSVQsXHJcbiAgREVGQVVMVF9TSU5DRSxcclxuICBjb2xvcnM6IHtcclxuICAgIGJsdWUsXHJcbiAgICBjeWFuLFxyXG4gICAgZ3JheSxcclxuICAgIGdyZWVuLFxyXG4gICAgcmVkLFxyXG4gICAgeWVsbG93LFxyXG4gICAgd2hpdGUsXHJcbiAgICBtYWdlbnRhLFxyXG4gICAgbGJsdWUsXHJcbiAgICBsY3lhbixcclxuICAgIGxncmVlbixcclxuICAgIGxtYWdlbnRhLFxyXG4gICAgbHdoaXRlLFxyXG4gICAgbHllbGxvdyxcclxuICAgIG1ibHVlLFxyXG4gICAgbWN5YW4sXHJcbiAgICBtZ3JlZW4sXHJcbiAgICBtcmVkLFxyXG4gICAgbXllbGxvdyxcclxuICAgIG1tYWdlbnRhLFxyXG4gIH0sXHJcbiAgY2h1bmtzLFxyXG4gIGRlbGV0ZUV4dHJhRmxhZ3MsXHJcbiAgZXh0cmFjdEZsYWdzRnJvbUFyZ3MsXHJcbiAgZXh0cmFjdE9wdGlvbnNGcm9tQXJncyxcclxuICBmbGF0dGVuT2JqZWN0LFxyXG4gIG9yZGVyS2V5cyxcclxuICBzaG93VmVyc2lvbixcclxuICB0cmFjZURhdGEsXHJcbiAgdHJhY2VIZWFkZXIsXHJcbiAgZ2V0TmV0d29ya0FkZHJlc3NlcyxcclxuICBnZXROZXR3b3JrQXJ0aWZhY3RzOiBmcmFtZXdvcmsuZ2V0TmV0d29ya0FydGlmYWN0cyxcclxuICBnZXROZXR3b3JrQ29uc3RydWN0b3JBcmdzOiBmcmFtZXdvcmsuZ2V0TmV0d29ya0NvbnN0cnVjdG9yQXJncyxcclxuICBpbXBvcnRSYWRvbkFzc2V0cyxcclxuICByZWFkV2l0bmV0SnNvbkZpbGVzLFxyXG4gIHNhdmVXaXRuZXRKc29uRmlsZXMsXHJcbiAgdHJhY2VUYWJsZSxcclxuICBjb21tYXMsXHJcbiAgY29sb3JzdHJpcCxcclxuICBwcm9tcHRlcixcclxufVxyXG4iXX0=