cdk-preflight 1.7.0 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2 -2
- package/lib/cli.js +12 -5
- package/lib/index.js +1 -1
- package/lib/private/enforce.d.ts +14 -0
- package/lib/private/enforce.js +46 -15
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -9847,6 +9847,6 @@
|
|
|
9847
9847
|
"symbolId": "src/index:PreflightOptions"
|
|
9848
9848
|
}
|
|
9849
9849
|
},
|
|
9850
|
-
"version": "1.7.
|
|
9851
|
-
"fingerprint": "
|
|
9850
|
+
"version": "1.7.2",
|
|
9851
|
+
"fingerprint": "Mtg22wcEjuY8Rz5KpbxakwT7yXP2wVti35iGV3JVZVs="
|
|
9852
9852
|
}
|
package/lib/cli.js
CHANGED
|
@@ -96,10 +96,17 @@ function runCli(args) {
|
|
|
96
96
|
const appLine = appLineMatch[0];
|
|
97
97
|
const varMatch = appLine.match(/(?:const|let|var)\s+(\w+)\s*=/);
|
|
98
98
|
const appVar = varMatch ? varMatch[1] : 'app';
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
// 置換を関数で渡すのは、文字列だと App の行に含まれる `$&` などが展開されてしまうから。
|
|
100
|
+
let updated = src.replace(appLine, () => `${appLine}\nPreflight.apply(${appVar});`);
|
|
101
|
+
// CommonJS(`cdk init --language javascript` の形)に import を入れると ESM と判定され、
|
|
102
|
+
// require が使えなくなってアプリが起動しない。
|
|
103
|
+
const commonJs = /\.cjs$/.test(entry) || (/\.js$/.test(entry) && /\brequire\s*\(/.test(src) && !/^\s*import\s/m.test(src));
|
|
104
|
+
const importLine = commonJs
|
|
105
|
+
? "const { Preflight } = require('cdk-preflight');"
|
|
106
|
+
: "import { Preflight } from 'cdk-preflight';";
|
|
107
|
+
// shebang は 1 行目、'use strict' は最初の文でなければ効かないので、その下に差し込む。
|
|
108
|
+
const head = updated.match(/^(?:#![^\n]*\n)?(?:\s*(['"])use strict\1;?[^\S\n]*\n)?/)?.[0] ?? '';
|
|
109
|
+
updated = `${head}${importLine}\n${updated.slice(head.length)}`;
|
|
103
110
|
if (dry) {
|
|
104
111
|
console.log(`--- ${entry} (dry run) ---\n${updated}`);
|
|
105
112
|
}
|
|
@@ -120,4 +127,4 @@ function runCli(args) {
|
|
|
120
127
|
if (require.main === module) {
|
|
121
128
|
process.exit(runCli(process.argv.slice(2)));
|
|
122
129
|
}
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsd0JBb0VDO0FBdEZEOzs7R0FHRztBQUNILHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsK0JBQStCO0FBRS9CLE1BQU0sS0FBSyxHQUFHO0lBQ1osc0RBQXNEO0lBQ3RELEVBQUU7SUFDRixpRkFBaUY7Q0FDbEYsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFYjs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxJQUFjO0lBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMs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LENBQUM7UUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNWLEVBQUU7UUFDRixhQUFhO1FBQ2Isc0RBQXNEO1FBQ3RELG9GQUFvRjtRQUNwRix5RkFBeUY7S0FDMUYsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBCQUEwQjtBQUMxQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIGBucHggY2RrLXByZWZsaWdodCBpbml0YCDigJQg5pei5a2YIENESyDjgqLjg5fjg6rjgasgUHJlZmxpZ2h0LmFwcGx5KGFwcCkg44KS5oy/5YWl44GZ44KLIGNvZGVtb2TjgIJcbiAqIOS6uumWk+OBq+OCgiBBSSDjgqjjg7zjgrjjgqfjg7Pjg4jjgavjgoLlkIzjgZjlhaXlj6PjgpLmj5DkvpvjgZnjgovjgIJcbiAqL1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5jb25zdCBVU0FHRSA9IFtcbiAgJ1VzYWdlOiBjZGstcHJlZmxpZ2h0IGluaXQgWy0tZHJ5LXJ1bl0gWy0tZGlyIDxwYXRoPl0nLFxuICAnJyxcbiAgJ0luc2VydHMgYFByZWZsaWdodC5hcHBseShhcHApYCBpbnRvIHRoZSBDREsgYXBwIGVudHJ5IHBvaW50IGZvdW5kIHZpYSBjZGsuanNvbi4nLFxuXS5qb2luKCdcXG4nKTtcblxuLyoqXG4gKiBDTEkg5pys5L2T44CC44OG44K544OI44GL44KJ55u05o6l5ZG844G544KL44KI44GGIGV4aXQg44Gb44Ga57WC5LqG44Kz44O844OJ44KS6L+U44GZ44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5DbGkoYXJnczogc3RyaW5nW10pOiBudW1iZXIge1xuICBjb25zdCBjbWQgPSBhcmdzWzBdO1xuICBpZiAoY21kID09PSB1bmRlZmluZWQgfHwgY21kID09PSAnLS1oZWxwJyB8fCBjbWQgPT09ICctaCcpIHtcbiAgICBjb25zb2xlLmxvZyhVU0FHRSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGNtZCAhPT0gJ2luaXQnKSB7XG4gICAgY29uc29sZS5lcnJvcihgY2RrLXByZWZsaWdodDogdW5rbm93biBjb21tYW5kIFwiJHtjbWR9XCJcXG5cXG4ke1VTQUdFfWApO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGRyeSA9IGFyZ3MuaW5jbHVkZXMoJy0tZHJ5LXJ1bicpO1xuICBjb25zdCBkaXJJZHggPSBhcmdzLmluZGV4T2YoJy0tZGlyJyk7XG4gIGNvbnN0IGN3ZCA9IGRpcklkeCA+PSAwICYmIGFyZ3NbZGlySWR4ICsgMV0gPyBwYXRoLnJlc29sdmUoYXJnc1tkaXJJZHggKyAxXSkgOiBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKGN3ZCwgJ2Nkay5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjZGtKc29uUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBjZGstcHJlZmxpZ2h0OiBubyBjZGsuanNvbiBmb3VuZCBpbiAke2N3ZH0gKHJ1biBpbnNpZGUgYSBDREsgYXBwLCBvciBwYXNzIC0tZGlyKWApO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGFwcENtZDogc3RyaW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY2RrSnNvblBhdGgsICd1dGY4JykpLmFwcCA/PyAnJztcbiAgY29uc3QgZW50cnlNYXRjaCA9IGFwcENtZC5tYXRjaCgvKFxcUytcXC4oPzp0c3xtdHN8Y3RzfGpzfG1qc3xjanMpKVxcYi8pO1xuICBpZiAoIWVudHJ5TWF0Y2gpIHtcbiAgICBjb25zb2xlLmVycm9yKGBjZGstcHJlZmxpZ2h0OiBjb3VsZCBub3QgbG9jYXRlIGFuIGVudHJ5IGZpbGUgaW4gY2RrLmpzb24gXCJhcHBcIjogJHthcHBDbWR9YCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgY29uc3QgZW50cnkgPSBwYXRoLmpvaW4oY3dkLCBlbnRyeU1hdGNoWzFdKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5KSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYGNkay1wcmVmbGlnaHQ6IGVudHJ5IGZpbGUgbm90IGZvdW5kOiAke2VudHJ5fWApO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3Qgc3JjID0gZnMucmVhZEZpbGVTeW5jKGVudHJ5LCAndXRmOCcpO1xuICBpZiAoc3JjLmluY2x1ZGVzKCdjZGstcHJlZmxpZ2h0JykpIHtcbiAgICBjb25zb2xlLmxvZyhgY2RrLXByZWZsaWdodDogJHtlbnRyeX0gYWxyZWFkeSByZWZlcmVuY2VzIGNkay1wcmVmbGlnaHQg4oCUIG5vdGhpbmcgdG8gZG9gKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBhcHBMaW5lTWF0Y2ggPSBzcmMubWF0Y2goL14uKlxcYm5ld1xccysoPzpjZGtcXC4pP0FwcFxccypcXChbXjtcXG5dKlxcKVxccyo7P1teXFxTXFxuXSokL20pO1xuICBpZiAoIWFwcExpbmVNYXRjaCkge1xuICAgIGNvbnNvbGUuZXJyb3IoW1xuICAgICAgYGNkay1wcmVmbGlnaHQ6IGNvdWxkIG5vdCBmaW5kIFxcYG5ldyBBcHAoLi4uKVxcYCBpbiAke2VudHJ5fS4gQWRkIG1hbnVhbGx5OmAsXG4gICAgICBcIiAgaW1wb3J0IHsgUHJlZmxpZ2h0IH0gZnJvbSAnY2RrLXByZWZsaWdodCc7XCIsXG4gICAgICAnICBQcmVmbGlnaHQuYXBwbHkoYXBwKTsnLFxuICAgIF0uam9pbignXFxuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGFwcExpbmUgPSBhcHBMaW5lTWF0Y2hbMF07XG4gIGNvbnN0IHZhck1hdGNoID0gYXBwTGluZS5tYXRjaCgvKD86Y29uc3R8bGV0fHZhcilcXHMrKFxcdyspXFxzKj0vKTtcbiAgY29uc3QgYXBwVmFyID0gdmFyTWF0Y2ggPyB2YXJNYXRjaFsxXSA6ICdhcHAnO1xuXG4gIGxldCB1cGRhdGVkID0gc3JjLnJlcGxhY2UoYXBwTGluZSwgYCR7YXBwTGluZX1cXG5QcmVmbGlnaHQuYXBwbHkoJHthcHBWYXJ9KTtgKTtcbiAgLy8gc2hlYmFuZyDjga/lv4XjgZogMSDooYznm67jgafjgarjgZHjgozjgbDjgarjgonjgarjgYTjga7jgafjgIHjgZ3jga7kuIvjgasgaW1wb3J0IOOCkuW3ruOBl+i+vOOCgOOAglxuICBjb25zdCBzaGViYW5nID0gdXBkYXRlZC5tYXRjaCgvXiMhW15cXG5dKlxcbi8pPy5bMF0gPz8gJyc7XG4gIHVwZGF0ZWQgPSBgJHtzaGViYW5nfWltcG9ydCB7IFByZWZsaWdodCB9IGZyb20gJ2Nkay1wcmVmbGlnaHQnO1xcbiR7dXBkYXRlZC5zbGljZShzaGViYW5nLmxlbmd0aCl9YDtcblxuICBpZiAoZHJ5KSB7XG4gICAgY29uc29sZS5sb2coYC0tLSAke2VudHJ5fSAoZHJ5IHJ1bikgLS0tXFxuJHt1cGRhdGVkfWApO1xuICB9IGVsc2Uge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZW50cnksIHVwZGF0ZWQpO1xuICAgIGNvbnNvbGUubG9nKGBjZGstcHJlZmxpZ2h0OiB1cGRhdGVkICR7ZW50cnl9YCk7XG4gIH1cbiAgY29uc29sZS5sb2coW1xuICAgICcnLFxuICAgICdOZXh0IHN0ZXBzOicsXG4gICAgJyAgMS4gbnBtIGkgLUQgY2RrLXByZWZsaWdodCAgIChpZiBub3QgaW5zdGFsbGVkIHlldCknLFxuICAgICcgIDIuIGNkayBzeW50aCAgICAgICAgICAgICAgICAodmlvbGF0aW9ucyBmYWlsIHRoZSBzeW50aCB3aXRoIGEgdmFsaWRhdGlvbiByZXBvcnQpJyxcbiAgICAnICAzLiBPcHRpb25hbDogUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBlbmZvcmNlOiBmYWxzZSB9KSB0byBvbmx5IHdhcm4gaW5zdGVhZCBvZiBmYWlsaW5nJyxcbiAgXS5qb2luKCdcXG4nKSk7XG4gIHJldHVybiAwO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIHByb2Nlc3MuZXhpdChydW5DbGkocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKSk7XG59XG4iXX0=
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsd0JBMkVDO0FBN0ZEOzs7R0FHRztBQUNILHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsK0JBQStCO0FBRS9CLE1BQU0sS0FBSyxHQUFHO0lBQ1osc0RBQXNEO0lBQ3RELEVBQUU7SUFDRixpRkFBaUY7Q0FDbEYsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFYjs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxJQUFjO0lBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMs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QUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEcsT0FBTyxHQUFHLEdBQUcsSUFBSSxHQUFHLFVBQVUsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBRWhFLElBQUksR0FBRyxFQUFFLENBQUM7UUFDUixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxtQkFBbUIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDVixFQUFFO1FBQ0YsYUFBYTtRQUNiLHNEQUFzRDtRQUN0RCxvRkFBb0Y7UUFDcEYseUZBQXlGO0tBQzFGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwQkFBMEI7QUFDMUIsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO0lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLyoqXG4gKiBgbnB4IGNkay1wcmVmbGlnaHQgaW5pdGAg4oCUIOaXouWtmCBDREsg44Ki44OX44Oq44GrIFByZWZsaWdodC5hcHBseShhcHApIOOCkuaMv+WFpeOBmeOCiyBjb2RlbW9k44CCXG4gKiDkurrplpPjgavjgoIgQUkg44Ko44O844K444Kn44Oz44OI44Gr44KC5ZCM44GY5YWl5Y+j44KS5o+Q5L6b44GZ44KL44CCXG4gKi9cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuY29uc3QgVVNBR0UgPSBbXG4gICdVc2FnZTogY2RrLXByZWZsaWdodCBpbml0IFstLWRyeS1ydW5dIFstLWRpciA8cGF0aD5dJyxcbiAgJycsXG4gICdJbnNlcnRzIGBQcmVmbGlnaHQuYXBwbHkoYXBwKWAgaW50byB0aGUgQ0RLIGFwcCBlbnRyeSBwb2ludCBmb3VuZCB2aWEgY2RrLmpzb24uJyxcbl0uam9pbignXFxuJyk7XG5cbi8qKlxuICogQ0xJIOacrOS9k+OAguODhuOCueODiOOBi+OCieebtOaOpeWRvOOBueOCi+OCiOOBhiBleGl0IOOBm+OBmue1guS6huOCs+ODvOODieOCkui/lOOBmeOAglxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2xpKGFyZ3M6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgY29uc3QgY21kID0gYXJnc1swXTtcbiAgaWYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IGNtZCA9PT0gJy0taGVscCcgfHwgY21kID09PSAnLWgnKSB7XG4gICAgY29uc29sZS5sb2coVVNBR0UpO1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChjbWQgIT09ICdpbml0Jykge1xuICAgIGNvbnNvbGUuZXJyb3IoYGNkay1wcmVmbGlnaHQ6IHVua25vd24gY29tbWFuZCBcIiR7Y21kfVwiXFxuXFxuJHtVU0FHRX1gKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBjb25zdCBkcnkgPSBhcmdzLmluY2x1ZGVzKCctLWRyeS1ydW4nKTtcbiAgY29uc3QgZGlySWR4ID0gYXJncy5pbmRleE9mKCctLWRpcicpO1xuICBjb25zdCBjd2QgPSBkaXJJZHggPj0gMCAmJiBhcmdzW2RpcklkeCArIDFdID8gcGF0aC5yZXNvbHZlKGFyZ3NbZGlySWR4ICsgMV0pIDogcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBjZGtKc29uUGF0aCA9IHBhdGguam9pbihjd2QsICdjZGsuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY2RrSnNvblBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgY2RrLXByZWZsaWdodDogbm8gY2RrLmpzb24gZm91bmQgaW4gJHtjd2R9IChydW4gaW5zaWRlIGEgQ0RLIGFwcCwgb3IgcGFzcyAtLWRpcilgKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBjb25zdCBhcHBDbWQ6IHN0cmluZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNka0pzb25QYXRoLCAndXRmOCcpKS5hcHAgPz8gJyc7XG4gIGNvbnN0IGVudHJ5TWF0Y2ggPSBhcHBDbWQubWF0Y2goLyhcXFMrXFwuKD86dHN8bXRzfGN0c3xqc3xtanN8Y2pzKSlcXGIvKTtcbiAgaWYgKCFlbnRyeU1hdGNoKSB7XG4gICAgY29uc29sZS5lcnJvcihgY2RrLXByZWZsaWdodDogY291bGQgbm90IGxvY2F0ZSBhbiBlbnRyeSBmaWxlIGluIGNkay5qc29uIFwiYXBwXCI6ICR7YXBwQ21kfWApO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGVudHJ5ID0gcGF0aC5qb2luKGN3ZCwgZW50cnlNYXRjaFsxXSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhlbnRyeSkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBjZGstcHJlZmxpZ2h0OiBlbnRyeSBmaWxlIG5vdCBmb3VuZDogJHtlbnRyeX1gKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHNyYyA9IGZzLnJlYWRGaWxlU3luYyhlbnRyeSwgJ3V0ZjgnKTtcbiAgaWYgKHNyYy5pbmNsdWRlcygnY2RrLXByZWZsaWdodCcpKSB7XG4gICAgY29uc29sZS5sb2coYGNkay1wcmVmbGlnaHQ6ICR7ZW50cnl9IGFscmVhZHkgcmVmZXJlbmNlcyBjZGstcHJlZmxpZ2h0IOKAlCBub3RoaW5nIHRvIGRvYCk7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgYXBwTGluZU1hdGNoID0gc3JjLm1hdGNoKC9eLipcXGJuZXdcXHMrKD86Y2RrXFwuKT9BcHBcXHMqXFwoW147XFxuXSpcXClcXHMqOz9bXlxcU1xcbl0qJC9tKTtcbiAgaWYgKCFhcHBMaW5lTWF0Y2gpIHtcbiAgICBjb25zb2xlLmVycm9yKFtcbiAgICAgIGBjZGstcHJlZmxpZ2h0OiBjb3VsZCBub3QgZmluZCBcXGBuZXcgQXBwKC4uLilcXGAgaW4gJHtlbnRyeX0uIEFkZCBtYW51YWxseTpgLFxuICAgICAgXCIgIGltcG9ydCB7IFByZWZsaWdodCB9IGZyb20gJ2Nkay1wcmVmbGlnaHQnO1wiLFxuICAgICAgJyAgUHJlZmxpZ2h0LmFwcGx5KGFwcCk7JyxcbiAgICBdLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBjb25zdCBhcHBMaW5lID0gYXBwTGluZU1hdGNoWzBdO1xuICBjb25zdCB2YXJNYXRjaCA9IGFwcExpbmUubWF0Y2goLyg/OmNvbnN0fGxldHx2YXIpXFxzKyhcXHcrKVxccyo9Lyk7XG4gIGNvbnN0IGFwcFZhciA9IHZhck1hdGNoID8gdmFyTWF0Y2hbMV0gOiAnYXBwJztcblxuICAvLyDnva7mj5vjgpLplqLmlbDjgafmuKHjgZnjga7jga/jgIHmloflrZfliJfjgaDjgaggQXBwIOOBruihjOOBq+WQq+OBvuOCjOOCiyBgJCZgIOOBquOBqeOBjOWxlemWi+OBleOCjOOBpuOBl+OBvuOBhuOBi+OCieOAglxuICBsZXQgdXBkYXRlZCA9IHNyYy5yZXBsYWNlKGFwcExpbmUsICgpID0+IGAke2FwcExpbmV9XFxuUHJlZmxpZ2h0LmFwcGx5KCR7YXBwVmFyfSk7YCk7XG4gIC8vIENvbW1vbkpT77yIYGNkayBpbml0IC0tbGFuZ3VhZ2UgamF2YXNjcmlwdGAg44Gu5b2i77yJ44GrIGltcG9ydCDjgpLlhaXjgozjgovjgaggRVNNIOOBqOWIpOWumuOBleOCjOOAgVxuICAvLyByZXF1aXJlIOOBjOS9v+OBiOOBquOBj+OBquOBo+OBpuOCouODl+ODquOBjOi1t+WLleOBl+OBquOBhOOAglxuICBjb25zdCBjb21tb25KcyA9IC9cXC5janMkLy50ZXN0KGVudHJ5KSB8fCAoL1xcLmpzJC8udGVzdChlbnRyeSkgJiYgL1xcYnJlcXVpcmVcXHMqXFwoLy50ZXN0KHNyYykgJiYgIS9eXFxzKmltcG9ydFxccy9tLnRlc3Qoc3JjKSk7XG4gIGNvbnN0IGltcG9ydExpbmUgPSBjb21tb25Kc1xuICAgID8gXCJjb25zdCB7IFByZWZsaWdodCB9ID0gcmVxdWlyZSgnY2RrLXByZWZsaWdodCcpO1wiXG4gICAgOiBcImltcG9ydCB7IFByZWZsaWdodCB9IGZyb20gJ2Nkay1wcmVmbGlnaHQnO1wiO1xuICAvLyBzaGViYW5nIOOBryAxIOihjOebruOAgSd1c2Ugc3RyaWN0JyDjga/mnIDliJ3jga7mlofjgafjgarjgZHjgozjgbDlirnjgYvjgarjgYTjga7jgafjgIHjgZ3jga7kuIvjgavlt67jgZfovrzjgoDjgIJcbiAgY29uc3QgaGVhZCA9IHVwZGF0ZWQubWF0Y2goL14oPzojIVteXFxuXSpcXG4pPyg/OlxccyooWydcIl0pdXNlIHN0cmljdFxcMTs/W15cXFNcXG5dKlxcbik/Lyk/LlswXSA/PyAnJztcbiAgdXBkYXRlZCA9IGAke2hlYWR9JHtpbXBvcnRMaW5lfVxcbiR7dXBkYXRlZC5zbGljZShoZWFkLmxlbmd0aCl9YDtcblxuICBpZiAoZHJ5KSB7XG4gICAgY29uc29sZS5sb2coYC0tLSAke2VudHJ5fSAoZHJ5IHJ1bikgLS0tXFxuJHt1cGRhdGVkfWApO1xuICB9IGVsc2Uge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZW50cnksIHVwZGF0ZWQpO1xuICAgIGNvbnNvbGUubG9nKGBjZGstcHJlZmxpZ2h0OiB1cGRhdGVkICR7ZW50cnl9YCk7XG4gIH1cbiAgY29uc29sZS5sb2coW1xuICAgICcnLFxuICAgICdOZXh0IHN0ZXBzOicsXG4gICAgJyAgMS4gbnBtIGkgLUQgY2RrLXByZWZsaWdodCAgIChpZiBub3QgaW5zdGFsbGVkIHlldCknLFxuICAgICcgIDIuIGNkayBzeW50aCAgICAgICAgICAgICAgICAodmlvbGF0aW9ucyBmYWlsIHRoZSBzeW50aCB3aXRoIGEgdmFsaWRhdGlvbiByZXBvcnQpJyxcbiAgICAnICAzLiBPcHRpb25hbDogUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBlbmZvcmNlOiBmYWxzZSB9KSB0byBvbmx5IHdhcm4gaW5zdGVhZCBvZiBmYWlsaW5nJyxcbiAgXS5qb2luKCdcXG4nKSk7XG4gIHJldHVybiAwO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIHByb2Nlc3MuZXhpdChydW5DbGkocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKSk7XG59XG4iXX0=
|
package/lib/index.js
CHANGED
|
@@ -18,7 +18,7 @@ const rules_generated_1 = require("./rules.generated");
|
|
|
18
18
|
* Preflight.apply(app);
|
|
19
19
|
*/
|
|
20
20
|
class Preflight {
|
|
21
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "1.7.
|
|
21
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "1.7.2" };
|
|
22
22
|
/**
|
|
23
23
|
* Register the cdk-preflight rules on an App or Stage.
|
|
24
24
|
*/
|
package/lib/private/enforce.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ export declare class PreflightEnforcePlugin implements IPolicyValidationPlugin {
|
|
|
47
47
|
quotas?: Omit<QuotaCheckOptions, "severity"> | undefined);
|
|
48
48
|
validate(context: IPolicyValidationContext): PolicyValidationPluginReport;
|
|
49
49
|
private validateRules;
|
|
50
|
+
private validateStacks;
|
|
50
51
|
}
|
|
51
52
|
/**
|
|
52
53
|
* `enforce: false` のときのクォータ検査。ルールは CDK 組み込みのプラグインに載せるが、
|
|
@@ -58,6 +59,19 @@ export declare class PreflightQuotaPlugin implements IPolicyValidationPlugin {
|
|
|
58
59
|
constructor(quotas: Omit<QuotaCheckOptions, 'severity'>);
|
|
59
60
|
validate(context: IPolicyValidationContext): PolicyValidationPluginReport;
|
|
60
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* スタックを (リージョン, アカウント) で束ねる。具体的でない値(未指定・トークン)は undefined に
|
|
64
|
+
* 寄せるので、環境非依存のスタックは deploy_region を注入しないエンジンで評価される。
|
|
65
|
+
* (テストからも利用するため export している)
|
|
66
|
+
*/
|
|
67
|
+
export declare function byEnvironment<T extends {
|
|
68
|
+
region?: string;
|
|
69
|
+
accountId?: string;
|
|
70
|
+
}>(stacks: readonly T[]): {
|
|
71
|
+
region?: string;
|
|
72
|
+
account?: string;
|
|
73
|
+
stacks: T[];
|
|
74
|
+
}[];
|
|
61
75
|
/**
|
|
62
76
|
* ルール評価そのものが失敗したことを表す violation の ruleName。
|
|
63
77
|
* バンドル済みルールの id ではないので `exclude` では消せない(消してよい状態ではない)。
|
package/lib/private/enforce.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.PLUGIN_NAME = exports.ENGINE_ERROR_RULE = exports.PreflightQuotaPlugin =
|
|
|
37
37
|
exports.deployEnvironmentModule = deployEnvironmentModule;
|
|
38
38
|
exports.isConcreteAccount = isConcreteAccount;
|
|
39
39
|
exports.isConcreteRegion = isConcreteRegion;
|
|
40
|
+
exports.byEnvironment = byEnvironment;
|
|
40
41
|
exports.installEnforceGate = installEnforceGate;
|
|
41
42
|
exports.fallbackFormat = fallbackFormat;
|
|
42
43
|
exports.loadFormatter = loadFormatter;
|
|
@@ -125,11 +126,9 @@ class PreflightEnforcePlugin {
|
|
|
125
126
|
// eslint-disable-next-line no-console
|
|
126
127
|
console.error('cdk-preflight: could not resolve @aws/cloudformation-validate; ' +
|
|
127
128
|
'enforce mode is unavailable and no preflight checks were run. ' +
|
|
128
|
-
'Install it as a devDependency or use
|
|
129
|
+
'Install it as a devDependency, or use Preflight.apply(app, { enforce: false }) to report through the CDK built-in validator.');
|
|
129
130
|
return [];
|
|
130
131
|
}
|
|
131
|
-
const region = isConcreteRegion(context.region) ? context.region : undefined;
|
|
132
|
-
const account = isConcreteAccount(context.accountId) ? context.accountId : undefined;
|
|
133
132
|
const ours = new Set(this.rules.map((r) => r.id));
|
|
134
133
|
const violations = [];
|
|
135
134
|
// 全テンプレートの和集合で刈り込む。テンプレートごとに刈るとエンジンを何度も
|
|
@@ -141,22 +140,35 @@ class PreflightEnforcePlugin {
|
|
|
141
140
|
if (rules.length === 0 && !this.strict) {
|
|
142
141
|
return [];
|
|
143
142
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
143
|
+
// deploy_region / deploy_account はエンジンに焼き込むので、環境ごとにスタックを束ねて
|
|
144
|
+
// 1 環境 1 回だけエンジンを組む。アプリ単位の context.region / accountId は全スタックが
|
|
145
|
+
// 同じ環境のときしか入らず、それを使うと環境の違うスタックが 1 つあるだけで
|
|
146
|
+
// リージョン依存のルールが全スタックで黙る。
|
|
147
|
+
for (const group of byEnvironment(context.stackTemplates)) {
|
|
148
|
+
let eng;
|
|
149
|
+
try {
|
|
150
|
+
eng = regoEngineCached(engine, rules, group.region, group.account);
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
// ルールパックがコンパイルできない = この環境のどのテンプレートも検査できないので、
|
|
154
|
+
// そのスタックすべてに violation を立てる(1 枚ずつの catch には到達しない)。
|
|
155
|
+
violations.push(...group.stacks.map((st) => engineErrorViolation(st, e)));
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
violations.push(...this.validateStacks(engine, eng, group.stacks, ours));
|
|
152
159
|
}
|
|
153
|
-
|
|
160
|
+
return violations;
|
|
161
|
+
}
|
|
162
|
+
validateStacks(engine, eng, stacks, ours) {
|
|
163
|
+
const violations = [];
|
|
164
|
+
for (const st of stacks) {
|
|
154
165
|
let report;
|
|
155
166
|
try {
|
|
156
167
|
report = validateTemplate(eng, new engine.TemplateFile(st.templatePath), {
|
|
168
|
+
// CDK 組み込みの CloudFormationValidatePlugin と同じく、スタック自身の値を渡す
|
|
157
169
|
pseudoParameterOverrides: {
|
|
158
|
-
accountId:
|
|
159
|
-
region:
|
|
170
|
+
accountId: st.accountId,
|
|
171
|
+
region: st.region,
|
|
160
172
|
},
|
|
161
173
|
// 組み込みルールは CDK 組み込みの CloudFormationValidatePlugin が同じテンプレートに
|
|
162
174
|
// 対して既に走らせている。strict でなければ結果も使わず捨てているので、丸ごと切る
|
|
@@ -212,6 +224,23 @@ class PreflightQuotaPlugin {
|
|
|
212
224
|
}
|
|
213
225
|
}
|
|
214
226
|
exports.PreflightQuotaPlugin = PreflightQuotaPlugin;
|
|
227
|
+
/**
|
|
228
|
+
* スタックを (リージョン, アカウント) で束ねる。具体的でない値(未指定・トークン)は undefined に
|
|
229
|
+
* 寄せるので、環境非依存のスタックは deploy_region を注入しないエンジンで評価される。
|
|
230
|
+
* (テストからも利用するため export している)
|
|
231
|
+
*/
|
|
232
|
+
function byEnvironment(stacks) {
|
|
233
|
+
const groups = new Map();
|
|
234
|
+
for (const st of stacks) {
|
|
235
|
+
const region = isConcreteRegion(st.region) ? st.region : undefined;
|
|
236
|
+
const account = isConcreteAccount(st.accountId) ? st.accountId : undefined;
|
|
237
|
+
const key = `${region ?? ''}|${account ?? ''}`;
|
|
238
|
+
if (!groups.has(key))
|
|
239
|
+
groups.set(key, { region, account, stacks: [] });
|
|
240
|
+
groups.get(key).stacks.push(st);
|
|
241
|
+
}
|
|
242
|
+
return [...groups.values()];
|
|
243
|
+
}
|
|
215
244
|
/** 合成を止める violation severity。 */
|
|
216
245
|
const BLOCKS_SYNTH = new Set(['error', 'fatal']);
|
|
217
246
|
/**
|
|
@@ -395,6 +424,8 @@ function loadEngineCached() {
|
|
|
395
424
|
// 積み上がり、2 個目以降の構築が超線形に遅くなる(実測: free 無しで 3.8s -> 11.2s -> 22.1s、
|
|
396
425
|
// 構築前に free すると 3.5s -> 0.4s)。ルールセットが変わる(Stage ごとに exclude が違う、
|
|
397
426
|
// テストで複数アプリを合成する)たびに作り直すので、キャッシュは 1 スロットで足りる。
|
|
427
|
+
// ponytail: 環境(リージョン × アカウント)が N 個あるアプリは synth のたびに N 回組み直す。
|
|
428
|
+
// 実アプリでは 1〜3 個。重くなったら deploy_region をモジュールではなく入力で渡す形にする。
|
|
398
429
|
let cachedRegoEngine;
|
|
399
430
|
function regoEngineCached(engineModule, rules, region, account) {
|
|
400
431
|
const key = `${region ?? ''}|${account ?? ''}|${rules.map((r) => r.id).join(',')}`;
|
|
@@ -603,4 +634,4 @@ function isSuperseded(rule, version) {
|
|
|
603
634
|
return false;
|
|
604
635
|
return (compareVersions(version, rule.supersededBy.engine) ?? -1) >= 0;
|
|
605
636
|
}
|
|
606
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQW9ORCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUEyQ0Qsa0RBY0M7QUFpQkQsNENBVUM7QUFRRCxzREFtQkM7QUFZRCxzQkFRQztBQWVELDRDQU1DO0FBRUQsZ0NBZUM7QUFNRCxzQ0FjQztBQU9ELDBDQWFDO0FBTUQsb0NBR0M7QUFqbEJELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkNBT3FCO0FBRXJCLG1DQUE4RDtBQUM5RCx3REFBd0U7QUFFeEUsMERBQTBEO0FBQzFEOzhEQUM4RDtBQUU5RDs7O0dBR0c7QUFDVSxRQUFBLHNCQUFzQixHQUFHLHdCQUF3QixDQUFDO0FBRS9EOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxTQUFrQjtJQUN4RSxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZHLE9BQU87UUFDTCxJQUFJLEVBQUUsOEJBQXNCO1FBQzVCLE9BQU8sRUFBRSwrREFBK0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPLEVBQUU7S0FDN0csQ0FBQztBQUNKLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBZ0IsaUJBQWlCLENBQUMsU0FBNkI7SUFDN0QsT0FBTyxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7OztH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QUMsSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBcHAsXG4gIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4sXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25Db250ZXh0LFxuICB0eXBlIElQb2xpY3lWYWxpZGF0aW9uUGx1Z2luLFxuICB0eXBlIFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQsXG4gIHR5cGUgUG9saWN5VmlvbGF0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGNoZWNrUXVvdGFzLCB0eXBlIFF1b3RhQ2hlY2tPcHRpb25zIH0gZnJvbSAnLi9xdW90YSc7XG5pbXBvcnQgeyBCVU5ETEVEX0xJQlMsIHR5cGUgQnVuZGxlZFJ1bGVEYXRhIH0gZnJvbSAnLi4vcnVsZXMuZ2VuZXJhdGVkJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzIC0tIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUg44GvXG4gICBhd3MtY2RrLWxpYiDlkIzmorHjgrPjg5Tjg7zjgpLli5XnmoTop6PmsbrjgZnjgovoqK3oqIjvvIjkvp3lrZjjgavjga/ovInjgZvjgarjgYTvvInjgIJSRUFETUUvQUdFTlRTLm1kIOWPgueFpyAqL1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgUmVnbyBtb2R1bGUgdGhhdCBjYXJyaWVzIHRoZSBkZXBsb3ltZW50XG4gKiBlbnZpcm9ubWVudCBpbnRvIHJ1bGUgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFUExPWV9FTlZfTU9EVUxFX05BTUUgPSAnX3BmX2RlcGxveV9lbnZpcm9ubWVudCc7XG5cbi8qKlxuICogQnVpbGQgdGhlIGdlbmVyYXRlZCBtb2R1bGUgZGVmaW5pbmcgYGRlcGxveV9yZWdpb25gIGZvciB0aGUgcnVsZSBwYWNrYWdlLlxuICpcbiAqIFJ1bGVzIG11c3QgcmVhZCBpdCBhcyBgZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb25gIChuZXZlciBhcyBhIGJhcmVcbiAqIHZhcmlhYmxlKTogdGhlIGRhdGEgcmVmZXJlbmNlIGlzIHNpbXBseSB1bmRlZmluZWQgd2hlbiB0aGUgbW9kdWxlIGlzIG5vdFxuICogaW5qZWN0ZWQg4oCUIHRoZSBydWxlIGJvZHkgZmFpbHMgYW5kIHRoZSBydWxlIHNraXBzIOKAlCB3aGlsZSBhIGJhcmUgdmFyaWFibGVcbiAqIHdvdWxkIGJlIGEgY29tcGlsZSBlcnJvci4gSW5qZWN0ZWQgYnkgdGhlIGVuZm9yY2UgcGx1Z2luIHdoZW4gdGhlIGFwcC1sZXZlbFxuICogcmVnaW9uIGlzIGNvbmNyZXRlOyB0aGUgd2FybiBtb2RlIChDREsgYnVpbHQtaW4gcGx1Z2luKSBuZXZlciBpbmplY3RzIGl0LFxuICogc28gcmVnaW9uLWRlcGVuZGVudCBydWxlcyBvbmx5IGZpcmUgaW4gZW5mb3JjZSBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uOiBzdHJpbmcsIGFjY291bnRJZD86IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGFjY291bnQgPSBpc0NvbmNyZXRlQWNjb3VudChhY2NvdW50SWQpID8gYGRlcGxveV9hY2NvdW50IDo9ICR7SlNPTi5zdHJpbmdpZnkoYWNjb3VudElkKX1cXG5gIDogJyc7XG4gIHJldHVybiB7XG4gICAgbmFtZTogREVQTE9ZX0VOVl9NT0RVTEVfTkFNRSxcbiAgICBjb250ZW50OiBgcGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5kZXBsb3lfcmVnaW9uIDo9ICR7SlNPTi5zdHJpbmdpZnkocmVnaW9uKX1cXG4ke2FjY291bnR9YCxcbiAgfTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGFjY291bnQgZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgMTItZGlnaXQgYWNjb3VudCBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlQWNjb3VudChhY2NvdW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGFjY291bnRJZCBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGFjY291bnRJZCA9PT0gJ3N0cmluZycgJiYgL15cXGR7MTJ9JC8udGVzdChhY2NvdW50SWQpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlZ2lvbiBmcm9tIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgaXMgYSBjb25jcmV0ZSByZWdpb24gbmFtZVxuICogKGFzIG9wcG9zZWQgdG8gdW5kZWZpbmVkLCBhbiB1bnJlc29sdmVkIHRva2VuLCBvciBhIHBsYWNlaG9sZGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uY3JldGVSZWdpb24ocmVnaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiByZWdpb24gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiByZWdpb24gPT09ICdzdHJpbmcnICYmIC9eW2Etel17Mn0oLVthLXpdKykrLVxcZCskLy50ZXN0KHJlZ2lvbik7XG59XG5cbmludGVyZmFjZSBFbmdpbmVEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgcnVsZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRpdHk/OiB7IHJlYWRvbmx5IGxvZ2ljYWxJZD86IHN0cmluZyB9O1xuICByZWFkb25seSBwcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvY3VtZW50YXRpb25Vcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogZW5mb3JjZSDjg6Ljg7zjg4nnlKjjga7lhoXpg6jjg5fjg6njgrDjgqTjg7PjgIJcbiAqXG4gKiBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Gv5YWoIGZpbmRpbmcg44KSIHdhcm5pbmcg44Gr5Li444KB44KL44Gf44KBXG4gKiDvvIhhd3MtY2RrLWxpYiAyLjI2Ny4wIOWun+a4rOOAgeaYh+agvOODleODqeOCsOOCgueEoeWKue+8ieOAgeWQjOOBmOOCqOODs+OCuOODs+OCkuebtOaOpeWRvOOBs+OAgVxuICogY2RrLXByZWZsaWdodCDjga7jg6vjg7zjg6vpgZXlj43vvIjjgYrjgojjgbMgc3RyaWN0IOaZguOBr+OCqOODs+OCuOODs+OBruOCqOODqeODvOOCr+ODqeOCue+8ieOCklxuICogcG9saWN5IHZhbGlkYXRpb24g44Gu5aSx5pWX44Go44GX44Gm5aCx5ZGK44GX44GmIHN5bnRoIOOCkuatouOCgeOCi+OAglxuICovXG5leHBvcnQgY2xhc3MgUHJlZmxpZ2h0RW5mb3JjZVBsdWdpbiBpbXBsZW1lbnRzIElQb2xpY3lWYWxpZGF0aW9uUGx1Z2luIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWUgPSBQTFVHSU5fTkFNRTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmljdDogYm9vbGVhbixcbiAgICAvKiogY2hlY2tRdW90YXMg44Gu44Go44GN44Gg44GR5rih44KLICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBxdW90YXM/OiBPbWl0PFF1b3RhQ2hlY2tPcHRpb25zLCAnc2V2ZXJpdHknPixcbiAgKSB7fVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250ZXh0OiBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQpOiBQb2xpY3lWYWxpZGF0aW9uUGx1Z2luUmVwb3J0IHtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gWy4uLnRoaXMudmFsaWRhdGVSdWxlcyhjb250ZXh0KV07XG4gICAgaWYgKHRoaXMucXVvdGFzKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2goLi4uY2hlY2tRdW90YXMoY29udGV4dCwgeyAuLi50aGlzLnF1b3Rhcywgc2V2ZXJpdHk6ICdlcnJvcicgfSkpO1xuICAgIH1cbiAgICAvLyBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM44GY5Yik5a6a44CCd2FybmluZyDjgaDjgZHjgarjgolcbiAgICAvLyDjg6zjg53jg7zjg4jjgavjga/ovInjgovjgYzlkIjmiJDjga/pgJrjgovvvIhDTEkg5YG044GvIHN1Y2Nlc3MvZmFpbHVyZSDjgavplqLjgo/jgonjgZrlv4XjgZrlh7rlipvjgZnjgovvvInjgIJcbiAgICByZXR1cm4geyBzdWNjZXNzOiB2aW9sYXRpb25zLmV2ZXJ5KCh2KSA9PiAhQkxPQ0tTX1NZTlRILmhhcyhTdHJpbmcodi5zZXZlcml0eSkpKSwgdmlvbGF0aW9ucyB9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJ1bGVzKGNvbnRleHQ6IElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCk6IFBvbGljeVZpb2xhdGlvbltdIHtcbiAgICBjb25zdCBlbmdpbmUgPSBsb2FkRW5naW5lQ2FjaGVkKCk7XG4gICAgaWYgKCFlbmdpbmUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnY2RrLXByZWZsaWdodDogY291bGQgbm90IHJlc29sdmUgQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZTsgJyArXG4gICAgICAgICdlbmZvcmNlIG1vZGUgaXMgdW5hdmFpbGFibGUgYW5kIG5vIHByZWZsaWdodCBjaGVja3Mgd2VyZSBydW4uICcgK1xuICAgICAgICAnSW5zdGFsbCBpdCBhcyBhIGRldkRlcGVuZGVuY3kgb3IgdXNlIHRoZSBkZWZhdWx0ICh3YXJuKSBtb2RlLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lvbiA9IGlzQ29uY3JldGVSZWdpb24oY29udGV4dC5yZWdpb24pID8gY29udGV4dC5yZWdpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWNjb3VudCA9IGlzQ29uY3JldGVBY2NvdW50KGNvbnRleHQuYWNjb3VudElkKSA/IGNvbnRleHQuYWNjb3VudElkIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91cnMgPSBuZXcgU2V0KHRoaXMucnVsZXMubWFwKChyKSA9PiByLmlkKSk7XG4gICAgY29uc3QgdmlvbGF0aW9uczogUG9saWN5VmlvbGF0aW9uW10gPSBbXTtcblxuICAgIC8vIOWFqOODhuODs+ODl+ODrOODvOODiOOBruWSjOmbhuWQiOOBp+WIiOOCiui+vOOCgOOAguODhuODs+ODl+ODrOODvOODiOOBlOOBqOOBq+WIiOOCi+OBqOOCqOODs+OCuOODs+OCkuS9leW6puOCglxuICAgIC8vIOS9nOOCiuebtOOBmeOBk+OBqOOBq+OBquOCiuOAgeOBneOBoeOCieOBruOCs+OCueODiOOBruaWueOBjOmrmOOBj+OBpOOBj++8iHJlZ29FbmdpbmVDYWNoZWQg44Gu44Kz44Oh44Oz44OI5Y+C54Wn77yJ44CCXG4gICAgY29uc3QgcnVsZXMgPSBwcnVuZSh0aGlzLnJ1bGVzLCB0ZW1wbGF0ZVJlc291cmNlVHlwZXMoY29udGV4dC5zdGFja1RlbXBsYXRlcy5tYXAoKHN0KSA9PiBzdC50ZW1wbGF0ZVBhdGgpKSk7XG5cbiAgICAvLyAxIOacrOOCguaui+OCieOBquOBhCA9IOOBk+OBruOCouODl+ODquOBruODquOCveODvOOCueOBq+mWouS/guOBmeOCi+ODq+ODvOODq+OBjOeEoeOBhOOAguOCqOODs+OCuOODs+OCkue1hOOCgOW/heimgeOCgueEoeOBhFxuICAgIC8vIO+8iGxpYnMg44Gg44GR44KS6LyJ44Gb44Gf44Ko44Oz44K444Oz44GvIHZpb2xhdGlvbiDjg6vjg7zjg6vjgpLmjIHjgZ/jgZrjgIHoqZXkvqHmmYLjgavokL3jgaHjgovvvInjgIJcbiAgICAvLyBzdHJpY3Qg44Gu44Go44GN44Gv57WE44G/6L6844G/44Ko44Oz44K444Oz44GuIGZpbmRpbmdzIOOCkuaLvuOBhuS7leS6i+OBjOaui+OCi+OBruOBp+mAmuW4uOOBqeOBiuOCiumAsuOCgOOAglxuICAgIGlmIChydWxlcy5sZW5ndGggPT09IDAgJiYgIXRoaXMuc3RyaWN0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IGVuZzogYW55O1xuICAgIHRyeSB7XG4gICAgICBlbmcgPSByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZSwgcnVsZXMsIHJlZ2lvbiwgYWNjb3VudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8g44Or44O844Or44OR44OD44Kv44GM44Kz44Oz44OR44Kk44Or44Gn44GN44Gq44GEID0g44Gp44Gu44OG44Oz44OX44Os44O844OI44KC5qSc5p+744Gn44GN44Gq44GE44Gu44Gn44CBXG4gICAgICAvLyDlhajjgrnjgr/jg4Pjgq/jgbbjgpMgdmlvbGF0aW9uIOOCkueri+OBpuOCi++8iDEg5p6a44Ga44Gk44GuIGNhdGNoIOOBq+OBr+WIsOmBlOOBl+OBquOBhO+8ieOAglxuICAgICAgcmV0dXJuIGNvbnRleHQuc3RhY2tUZW1wbGF0ZXMubWFwKChzdCkgPT4gZW5naW5lRXJyb3JWaW9sYXRpb24oc3QsIGUpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0IG9mIGNvbnRleHQuc3RhY2tUZW1wbGF0ZXMpIHtcbiAgICAgIGxldCByZXBvcnQ6IGFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcG9ydCA9IHZhbGlkYXRlVGVtcGxhdGUoZW5nLCBuZXcgZW5naW5lLlRlbXBsYXRlRmlsZShzdC50ZW1wbGF0ZVBhdGgpLCB7XG4gICAgICAgICAgcHNldWRvUGFyYW1ldGVyT3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGNvbnRleHQuYWNjb3VudElkLFxuICAgICAgICAgICAgcmVnaW9uOiBjb250ZXh0LnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIOe1hOOBv+i+vOOBv+ODq+ODvOODq+OBryBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44GM5ZCM44GY44OG44Oz44OX44Os44O844OI44GrXG4gICAgICAgICAgLy8g5a++44GX44Gm5pei44Gr6LWw44KJ44Gb44Gm44GE44KL44CCc3RyaWN0IOOBp+OBquOBkeOCjOOBsOe1kOaenOOCguS9v+OCj+OBmuaNqOOBpuOBpuOBhOOCi+OBruOBp+OAgeS4uOOBlOOBqOWIh+OCi1xuICAgICAgICAgIC8vIO+8iOWun+a4rCA3MCDjg6rjgr3jg7zjgrkgMSDmnprjgafliJ3lm54gMy4yN3MgLT4gMC4yMnPvvInjgIJzdHJpY3Qg44Gu44Go44GN44Gg44GR5b+F6KaB44Gr44Gq44KL44CCXG4gICAgICAgICAgZGlzYWJsZUJ1aWx0aW5SdWxlczogIXRoaXMuc3RyaWN0LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gdGhyb3cg44KS5aSW44Gr5Ye644GZ44GoIENESyDjga/jgZPjga7lkbzjgbPlh7rjgZfjgpIgcGx1Z2luIGZhaWx1cmXvvIh2aW9sYXRpb24g44K844Ot77yJ44Go44GX44GmXG4gICAgICAgIC8vIOiomOmMsuOBmeOCi+OBoOOBkeOBq+OBquOCiuOAgeOBk+OBk+OBvuOBp+OBq+mbhuOCgeOBn+mBleWPjeOCguW+jOe2muODhuODs+ODl+ODrOODvOODiOOBrumBleWPjeOCguS4uOOBlOOBqOa2iOOBiOOAgVxuICAgICAgICAvLyDmrovjgovjga7jga8gYGZhaWxlZDogdW5kZWZpbmVkYCDjgaDjgZHjgavjgarjgovvvIhpc3N1ZSAjMTUx77yJ44CCXG4gICAgICAgIC8vIHN5bnRoIOOCkuatouOCgeOCi+OBruOBryBpbnN0YWxsRW5mb3JjZUdhdGUg44Gu5b2555uu44CC44GT44GT44Gv44CM44Gp44Gu44K544K/44OD44Kv44Gn5L2V44GMXG4gICAgICAgIC8vIOi1t+OBjeOBn+OBi+OAjeOCkuODrOODneODvOODiOOBq+aui+OBl+OAgeS7luOCueOCv+ODg+OCr+OBruODq+ODvOODq+OCkui1sOOCieOBm+e2muOBkeOCi+OBn+OCgeOBruOCguOBruOAglxuICAgICAgICB2aW9sYXRpb25zLnB1c2goZW5naW5lRXJyb3JWaW9sYXRpb24oc3QsIGUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGQgb2YgKHJlcG9ydC5kaWFnbm9zdGljcyA/PyBbXSkgYXMgRW5naW5lRGlhZ25vc3RpY1tdKSB7XG4gICAgICAgIGNvbnN0IGlzT3VycyA9IGQuc291cmNlID09PSAnQ1VTVE9NJyAmJiBvdXJzLmhhcyhkLnJ1bGVJZCk7XG4gICAgICAgIGNvbnN0IGlzU3RyaWN0SGl0ID0gdGhpcy5zdHJpY3RcbiAgICAgICAgICAmJiBkLnNvdXJjZSAhPT0gJ0NVU1RPTSdcbiAgICAgICAgICAmJiAoZC5zZXZlcml0eSA9PT0gJ0VSUk9SJyB8fCBkLnNldmVyaXR5ID09PSAnRkFUQUwnKTtcbiAgICAgICAgaWYgKCFpc091cnMgJiYgIWlzU3RyaWN0SGl0KSBjb250aW51ZTtcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBydWxlTmFtZTogZC5ydWxlSWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGQubWVzc2FnZSxcbiAgICAgICAgICBzZXZlcml0eTogbWFwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgdmlvbGF0aW5nUmVzb3VyY2VzOiBbe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQ6IGQuZW50aXR5Py5sb2dpY2FsSWQgPz8gJyh1bmtub3duKScsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAgIGxvY2F0aW9uczogW2QucHJvcGVydHlQYXRoID8/ICcodGVtcGxhdGUpJ10sXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgLi4uKGQuZG9jdW1lbnRhdGlvblVybCA/IHsgcnVsZU1ldGFkYXRhOiB7IERvY3VtZW50YXRpb25Vcmw6IGQuZG9jdW1lbnRhdGlvblVybCB9IH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgfVxufVxuXG4vKipcbiAqIGBlbmZvcmNlOiBmYWxzZWAg44Gu44Go44GN44Gu44Kv44Kp44O844K/5qSc5p+744CC44Or44O844Or44GvIENESyDntYTjgb/ovrzjgb/jga7jg5fjg6njgrDjgqTjg7PjgavovInjgZvjgovjgYzjgIFcbiAqIOOCr+OCqeODvOOCv+OBr+ODhuODs+ODl+ODrOODvOODiOOBruWkluOBruipseOBquOBruOBp+WIpeODl+ODqeOCsOOCpOODs+OBq+OBl+OAgXdhcm5pbmcg44Go44GX44Gm5aCx5ZGK44Gg44GR44GZ44KL44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVmbGlnaHRRdW90YVBsdWdpbiBpbXBsZW1lbnRzIElQb2xpY3lWYWxpZGF0aW9uUGx1Z2luIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWUgPSBgJHtQTFVHSU5fTkFNRX0tcXVvdGFzYDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHF1b3RhczogT21pdDxRdW90YUNoZWNrT3B0aW9ucywgJ3NldmVyaXR5Jz4pIHt9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRleHQ6IElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCk6IFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZpb2xhdGlvbnM6IGNoZWNrUXVvdGFzKGNvbnRleHQsIHsgLi4udGhpcy5xdW90YXMsIHNldmVyaXR5OiAnd2FybmluZycgfSkgfTtcbiAgfVxufVxuXG4vKiog5ZCI5oiQ44KS5q2i44KB44KLIHZpb2xhdGlvbiBzZXZlcml0eeOAgiAqL1xuY29uc3QgQkxPQ0tTX1NZTlRIID0gbmV3IFNldChbJ2Vycm9yJywgJ2ZhdGFsJ10pO1xuXG4vKipcbiAqIOOCqOODs+OCuOODs+OBriBzZXZlcml0eSDjgpIgcG9saWN5IHZhbGlkYXRpb24g44GuIHNldmVyaXR5IOOBq+WGmeOBmeOAguihqOOBryBhd3MtY2RrLWxpYiAyLjI2Ny4wIOOBrlxuICogQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjgajlkIzkuIDjgIJgcmVwcm8ubWV0aG9kOiBkb2Mtb25seWAg44Gu44Or44O844Or44GvIFdBUk4g44KS5Ye644GZ44Gu44GnXG4gKiB3YXJuaW5nIOOBq+OBquOCiuOAgeWgseWRiuOBr+OBleOCjOOCi+OBjCBzeW50aCDjga/mraLjgoHjgarjgYTvvIjoqLzmi6DjgYzlrp/mqZ/jga7jg4fjg5fjg63jgqTlpLHmlZfjgafjga/jgarjgYTjgZ/jgoHvvInjgIJcbiAqL1xuZnVuY3Rpb24gbWFwU2V2ZXJpdHkoc2V2ZXJpdHk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICBjYXNlICdGQVRBTCc6XG4gICAgY2FzZSAnRVJST1InOlxuICAgICAgcmV0dXJuICdlcnJvcic7XG4gICAgY2FzZSAnV0FSTic6XG4gICAgICByZXR1cm4gJ3dhcm5pbmcnO1xuICAgIGNhc2UgJ0lORk8nOlxuICAgICAgcmV0dXJuICdpbmZvcm1hdGlvbmFsJztcbiAgICBjYXNlICdERUJVRyc6XG4gICAgICByZXR1cm4gJ2RlYnVnJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICd3YXJuaW5nJztcbiAgfVxufVxuXG4vKipcbiAqIOODq+ODvOODq+ipleS+oeOBneOBruOCguOBruOBjOWkseaVl+OBl+OBn+OBk+OBqOOCkuihqOOBmSB2aW9sYXRpb24g44GuIHJ1bGVOYW1l44CCXG4gKiDjg5Djg7Pjg4njg6vmuIjjgb/jg6vjg7zjg6vjga4gaWQg44Gn44Gv44Gq44GE44Gu44GnIGBleGNsdWRlYCDjgafjga/mtojjgZvjgarjgYTvvIjmtojjgZfjgabjgojjgYTnirbmhYvjgafjga/jgarjgYTvvInjgIJcbiAqL1xuZXhwb3J0IGNvbnN0IEVOR0lORV9FUlJPUl9SVUxFID0gJ3BmLWVuZ2luZS1lcnJvcic7XG5cbi8qKiDjgqjjg7Pjgrjjg7PjgYzmipXjgZLjgZ/lgKTjgpLjg6Hjg4Pjgrvjg7zjgrjjgavokL3jgajjgZnjgILjgqjjg7Pjgrjjg7Pjga8gRXJyb3Ig44Gn44Gv44Gq44GP57Sg44Gu5paH5a2X5YiX44KS5oqV44GS44KL44GT44Go44GM44GC44KL44CCICovXG5mdW5jdGlvbiBlbmdpbmVFcnJvclRleHQoZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSAoZSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlO1xuICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2UubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiBTdHJpbmcoZSk7XG59XG5cbi8qKiAxIOaemuOBruODhuODs+ODl+ODrOODvOODiOOCkuaknOafu+OBp+OBjeOBquOBi+OBo+OBn+OBk+OBqOOCkiB2aW9sYXRpb24g44Go44GX44Gm5aCx5ZGK44GZ44KL44CCICovXG5mdW5jdGlvbiBlbmdpbmVFcnJvclZpb2xhdGlvbihzdDogeyBzdGFja0NvbnN0cnVjdFBhdGg6IHN0cmluZzsgdGVtcGxhdGVQYXRoOiBzdHJpbmcgfSwgZTogdW5rbm93bik6IFBvbGljeVZpb2xhdGlvbiB7XG4gIHJldHVybiB7XG4gICAgcnVsZU5hbWU6IEVOR0lORV9FUlJPUl9SVUxFLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ2Nkay1wcmVmbGlnaHQgY291bGQgbm90IGV2YWx1YXRlIGl0cyBydWxlcyBmb3IgdGhpcyB0ZW1wbGF0ZSwgc28gbm8gcHJlZmxpZ2h0IHJ1bGUgcmFuIGZvciBpdDogJ1xuICAgICAgKyBlbmdpbmVFcnJvclRleHQoZSksXG4gICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgZml4OiAnUmVwb3J0IHRoaXMgYXQgaHR0cHM6Ly9naXRodWIuY29tL2JhZG1pbnRvbmNyeWVyL2Nkay1wcmVmbGlnaHQvaXNzdWVzOyAnXG4gICAgICArICd0byB1bmJsb2NrIHRoZSBidWlsZCBtZWFud2hpbGUsIHVzZSBQcmVmbGlnaHQuYXBwbHkoYXBwLCB7IGVuZm9yY2U6IGZhbHNlIH0pLicsXG4gICAgdmlvbGF0aW5nUmVzb3VyY2VzOiBbe1xuICAgICAgY29uc3RydWN0UGF0aDogc3Quc3RhY2tDb25zdHJ1Y3RQYXRoLFxuICAgICAgdGVtcGxhdGVQYXRoOiBzdC50ZW1wbGF0ZVBhdGgsXG4gICAgICBsb2NhdGlvbnM6IFsnKHRlbXBsYXRlKSddLFxuICAgIH1dLFxuICB9O1xufVxuXG4vKiogVGhlIHBsdWdpbiBuYW1lIHJlY29yZGVkIGluIGB2YWxpZGF0aW9uLXJlcG9ydC5qc29uYCBmb3Igb3VyIGZpbmRpbmdzLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9OQU1FID0gJ2Nkay1wcmVmbGlnaHQnO1xuXG4vKiogVGhlIGNsb3VkIGFzc2VtYmx5IGZpbGUgdGhlIENESyB3cml0ZXMgaXRzIHZhbGlkYXRpb24gcmVwb3J0IHRvLiAqL1xuY29uc3QgVkFMSURBVElPTl9SRVBPUlRfRklMRSA9ICd2YWxpZGF0aW9uLXJlcG9ydC5qc29uJztcblxuY29uc3QgR0FURV9JTlNUQUxMRUQgPSBTeW1ib2wuZm9yKCdjZGstcHJlZmxpZ2h0LmVuZm9yY2VHYXRlJyk7XG5cbi8qKlxuICogZW5mb3JjZSDjg6Ljg7zjg4njga7lj5bjgorjgZPjgbzjgZfjgpLloZ7jgZDjgrLjg7zjg4jjgpIgQXBwIOOBq+S7lei+vOOCgOOAglxuICpcbiAqIENESyBDTEkgMi4xMTI4LjEg5Lul6ZmN44GvIGFwcCDjgavjgIzjg6zjg53jg7zjg4jjga8gQ0xJIOOBjOWHpueQhuOBmeOCi+OAjeOBqOS8neOBiOOBn+OBhuOBiOOBp1xuICogYHZhbGlkYXRpb24tcmVwb3J0Lmpzb25gIOOCkuiHquWIhuOBp+iqreOCgOOBjOOAgeOBneOBrue1nuOCiui+vOOBv++8iHRvb2xraXQtbGliIOOBrlxuICogYGZpbHRlclJlcG9ydHNCeVN0YWNrc2DvvInjgYwgdmlvbGF0aW9uIOOBriBjb25zdHJ1Y3RQYXRoIOWFiOmgreOCu+OCsOODoeODs+ODiOOCklxuICog6YG45oqe44K544K/44OD44Kv44GuIGhpZXJhcmNoaWNhbElkIOOBqOeqgeOBjeWQiOOCj+OBm+OCi+OBn+OCgeOAgWBTdGFnZS9TdGFja2Ag5b2i5byP44Gr44Gq44KLXG4gKiBTdGFnZSDlhoXjgrnjgr/jg4Pjgq/jga7pgZXlj43jgYzjgZnjgbnjgabmjajjgabjgonjgozjgIFzeW50aCDjgYzpu5njgaPjgabmiJDlip/jgZnjgovvvIhpc3N1ZSAjMTEz77yJ44CCXG4gKlxuICog44Gd44GT44GnIHN5bnRoIOWujOS6huW+jOOBq+ODrOODneODvOODiOOCkuiqreOBv+ebtOOBl+OAgWNkay1wcmVmbGlnaHQg44Gu6YGV5Y+N44GM5q6L44Gj44Gm44GE44KM44GwXG4gKiDoh6rliIbjgafloLHlkYrjgZfjgaYgc3ludGgg44KS5q2i44KB44KL44CC44Op44Kk44OW44Op44Oq44GM6Ieq5Yqb44Gn5aCx5ZGK44GZ44KL57WM6Lev77yI57Sg44GuIG5vZGUg5a6f6KGM44CBXG4gKiBqZXN044CBQ0xJIDIuMTEyOC4xIOacqua6gO+8ieOBp+OBryBzeW50aCDjgYzkvovlpJbjgpLmipXjgZLjgovjgZ/jgoHjgZPjgZPjgavjga/liLDpgZTjgZvjgZrjgIFcbiAqIOS6jOmHjeWgseWRiuOBr+i1t+OBjeOBquOBhOOAglxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbEVuZm9yY2VHYXRlKHNjb3BlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gIGNvbnN0IHJvb3QgPSBzY29wZS5ub2RlLnJvb3Q7XG4gIGlmICghQXBwLmlzQXBwKHJvb3QpKSByZXR1cm47XG4gIGNvbnN0IGFwcCA9IHJvb3QgYXMgQXBwICYgeyBbR0FURV9JTlNUQUxMRURdPzogYm9vbGVhbiB9O1xuICBpZiAoYXBwW0dBVEVfSU5TVEFMTEVEXSkgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLCBHQVRFX0lOU1RBTExFRCwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG5cbiAgY29uc3Qgc3ludGggPSBhcHAuc3ludGguYmluZChhcHApO1xuICBsZXQgY2hlY2tlZCA9IGZhbHNlO1xuICBhcHAuc3ludGggPSAob3B0aW9ucz86IFBhcmFtZXRlcnM8QXBwWydzeW50aCddPlswXSkgPT4ge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gc3ludGgob3B0aW9ucyk7XG4gICAgaWYgKCFjaGVja2VkKSB7XG4gICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICAgIGZhaWxJZlJlcG9ydFVuaGFuZGxlZChhc3NlbWJseS5kaXJlY3RvcnkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNzZW1ibHk7XG4gIH07XG59XG5cbi8qKlxuICog44Os44Od44O844OI44GrIGNkay1wcmVmbGlnaHQg44Gu5aSx5pWX44GM5q6L44Gj44Gm44GE44KM44Gw44CBZmluZGluZ3Mg44KS5Ye65Yqb44GX44GmIHN5bnRoIOOCkuatouOCgeOCi+OAglxuICpcbiAqIOWIpOWumuOBryBjZGstcHJlZmxpZ2h0IOOBruODrOODneODvOODiOOBoOOBkeOCkuimi+OCi+OAgue1hOOBv+i+vOOBv+OCqOODs+OCuOODs+OChCBjb25zdHJ1Y3QgYW5ub3RhdGlvblxuICog44Gg44GR44GM5aSx5pWX44GX44Gm44GE44KL5aC05ZCI44GvIENMSSDjgYzmraPjgZfjgY/mibHjgYjjgovjga7jgafjgIHjgZPjgaHjgonjga/pu5njgaPjgaYgQ0xJIOOBq+S7u+OBm+OCi+OAglxuICog6YCG44Gr55m654Gr44GZ44KL44Go44GN44Gv44Os44Od44O844OI5YWo5L2T44KS5Ye644GZ44CC44GT44GT44GnIHN5bnRoIOOCkuatouOCgeOCi+OBqCBDTEkg5YG044Gu5Ye65Yqb44GMXG4gKiDkuIDliIfotbDjgonjgarjgYTjgZ/jgoHjgIHlkIzmmYLjgavlh7rjgabjgYTjgZ/jga/jgZrjga7ku5bjg5fjg6njgrDjgqTjg7Pjga4gZmluZGluZyDjgYzmtojjgYjjgabjgZfjgb7jgYbjgIJcbiAqL1xuZnVuY3Rpb24gZmFpbElmUmVwb3J0VW5oYW5kbGVkKGRpcmVjdG9yeTogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBwbHVnaW5SZXBvcnRzOiBhbnlbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvcnQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyZWN0b3J5LCBWQUxJREFUSU9OX1JFUE9SVF9GSUxFKSwgJ3V0ZjgnKSk7XG4gICAgcGx1Z2luUmVwb3J0cyA9IHJlcG9ydD8ucGx1Z2luUmVwb3J0cyA/PyBbXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g44Os44Od44O844OI44GM54Sh44GE77yI44OX44Op44Kw44Kk44Oz5pyq5a6f6KGM77yJ44G+44Gf44Gv5aOK44KM44Gm44GE44KL5aC05ZCI44Gv5L2V44KC44GX44Gq44GEXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGZhaWxlZCA9IHBsdWdpblJlcG9ydHMuc29tZShcbiAgICAocikgPT4gcj8ucGx1Z2luTmFtZSA9PT0gUExVR0lOX05BTUUgJiYgcj8uY29uY2x1c2lvbiA9PT0gJ2ZhaWx1cmUnLFxuICApO1xuICBpZiAoIWZhaWxlZCkgcmV0dXJuO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUuZXJyb3IoZm9ybWF0UmVwb3J0cyhwbHVnaW5SZXBvcnRzKSk7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnY2RrLXByZWZsaWdodDogdmFsaWRhdGlvbiBmYWlsZWQuIEZpeCB0aGUgZmluZGluZ3MgYWJvdmUsICcgK1xuICAgIFwiYWNrbm93bGVkZ2UgdGhlbSB3aXRoIFZhbGlkYXRpb25zLm9mKHNjb3BlKS5hY2tub3dsZWRnZSh7IGlkOiAnY2RrLXByZWZsaWdodDo6PHJ1bGUtaWQ+JyB9KSwgXCIgK1xuICAgICdvciBleGNsdWRlIHRoZSBydWxlIHZpYSBQcmVmbGlnaHQuYXBwbHkoYXBwLCB7IGV4Y2x1ZGU6IFsuLi5dIH0pLicsXG4gICk7XG59XG5cbi8qKlxuICogQ0RLIOacrOS9k+OBruODleOCqeODvOODnuODg+OCv+OBp+aVtOW9ouOBl+OAgUNMSSDjgajlkIzkuIDjga7opovjgZ/nm67jgavjgZnjgovjgIJcbiAqIOengeacieODkeOCueOBquOBruOBp+ino+axuuOBp+OBjeOBquOBhOOBk+OBqOOBjOOBguOCiuOAgeOBneOBruWgtOWQiOOBr+acgOWwj+mZkOOBruiHquWJjeaVtOW9ouOBq+iQveOBqOOBmVxuICog77yI6KaL44Gf55uu44KI44KK44CM6JC944Go44GZ44CN44GT44Go44KS5YSq5YWI44GZ44KL77yJ44CCXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFJlcG9ydHMocGx1Z2luUmVwb3J0czogYW55W10pOiBzdHJpbmcge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBsb2FkRm9ybWF0dGVyQ2FjaGVkKCk7XG4gIGlmIChmb3JtYXR0ZXIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRWYWxpZGF0aW9uUmVwb3J0cyhwcm9jZXNzLmN3ZCgpLCBwbHVnaW5SZXBvcnRzKS5qb2luKCdcXG5cXG4nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsbGJhY2tGb3JtYXQocGx1Z2luUmVwb3J0cyk7XG59XG5cbi8qKlxuICogQ0RLIOacrOS9k+OBruODleOCqeODvOODnuODg+OCv+OCkuino+axuuOBp+OBjeOBquOBhOOBqOOBjeOBruacgOWwj+mZkOOBruaVtOW9ouOAglxuICog6KaL44Gf55uu44Gv5Yqj44KL44GM44CBZmluZGluZ3Mg44KS5b+F44Ga6Kqt44KB44KL5b2i44Gn5Ye644GZ44Gf44KB44Gu5pyA5b6M44Gu56Cm44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFsbGJhY2tGb3JtYXQocGx1Z2luUmVwb3J0czogYW55W10pOiBzdHJpbmcge1xuICBjb25zdCBibG9ja3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVwb3J0IG9mIHBsdWdpblJlcG9ydHMpIHtcbiAgICBmb3IgKGNvbnN0IHZpb2xhdGlvbiBvZiByZXBvcnQ/LnZpb2xhdGlvbnMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGFja0lkID0gU3RyaW5nKHZpb2xhdGlvbi5ydWxlTmFtZSkuaW5jbHVkZXMoJzo6JylcbiAgICAgICAgPyB2aW9sYXRpb24ucnVsZU5hbWVcbiAgICAgICAgOiBgJHtyZXBvcnQucGx1Z2luTmFtZX06OiR7dmlvbGF0aW9uLnJ1bGVOYW1lfWA7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgdmlvbGF0aW9uLnZpb2xhdGluZ0NvbnN0cnVjdHMgPz8gW10pIHtcbiAgICAgICAgYmxvY2tzLnB1c2goXG4gICAgICAgICAgYCR7U3RyaW5nKHZpb2xhdGlvbi5zZXZlcml0eSA/PyAnRVJST1InKS50b1VwcGVyQ2FzZSgpfSAke3Zpb2xhdGlvbi5kZXNjcmlwdGlvbn0gKCR7cmVwb3J0LnBsdWdpbk5hbWV9KVxcbmAgK1xuICAgICAgICAgIGAgICAke2MuY29uc3RydWN0UGF0aH0gKCR7Yy5jbG91ZEZvcm1hdGlvblJlc291cmNlPy5sb2dpY2FsSWR9KSAke2MuY29uc3RydWN0RnFufVxcbmAgK1xuICAgICAgICAgIGAgICBBY2tub3dsZWRnZSB3aXRoICcke1N0cmluZyhhY2tJZCkucmVwbGFjZSgvIC9nLCAnLScpfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYmxvY2tzLmpvaW4oJ1xcblxcbicpO1xufVxuXG4vLyDjg5Xjgqnjg7zjg57jg4Pjgr/jga8gYXdzLWNkay1saWIg44Gu56eB5pyJ44OR44K544Gr44GC44KKIGBleHBvcnRzYCDjgYvjgonopovjgYjjgarjgYTjgZ/jgoHjgIFcbi8vIOOCqOODs+OCuOODs+ino+axuu+8iGxvYWRFbmdpbmXvvInjgajlkIzjgZjjgY/jg5Hjg4PjgrHjg7zjgrjjg6vjg7zjg4jjgYvjgonjga7ntbblr77jg5Hjgrnjgafoqq3jgb/ovrzjgoDjgIJcbmxldCBjYWNoZWRGb3JtYXR0ZXI6IGFueSB8IGZhbHNlIHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gbG9hZEZvcm1hdHRlckNhY2hlZCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICBpZiAoY2FjaGVkRm9ybWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWNoZWRGb3JtYXR0ZXIgPSBsb2FkRm9ybWF0dGVyKCkgPz8gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZEZvcm1hdHRlciA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBjYWNoZWRGb3JtYXR0ZXI7XG59XG5cbi8qKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGb3JtYXR0ZXIoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJSb290ID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZSgnYXdzLWNkay1saWIvcGFja2FnZS5qc29uJykpO1xuICAgIGNvbnN0IG1vZCA9IHJlcXVpcmUocGF0aC5qb2luKGxpYlJvb3QsICdjb3JlL2xpYi92YWxpZGF0aW9uL3ByaXZhdGUvbW9kZXJuLWZvcm1hdHRlci5qcycpKTtcbiAgICByZXR1cm4gdHlwZW9mIG1vZD8uZm9ybWF0VmFsaWRhdGlvblJlcG9ydHMgPT09ICdmdW5jdGlvbicgPyBtb2QgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLy8g44Ko44Oz44K444Oz77yIV0FTTe+8ieOBruWIneacn+WMluOBr+mHjeOBhOOBn+OCgeOAgeODouOCuOODpeODvOODq+ODrOODmeODq+OBp+OCreODo+ODg+OCt+ODpeOBmeOCi1xubGV0IGNhY2hlZEVuZ2luZU1vZHVsZTogYW55IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBsb2FkRW5naW5lQ2FjaGVkKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjYWNoZWRFbmdpbmVNb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhY2hlZEVuZ2luZU1vZHVsZSA9IGxvYWRFbmdpbmUoKSA/PyBmYWxzZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkRW5naW5lTW9kdWxlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGNhY2hlZEVuZ2luZU1vZHVsZTtcbn1cblxuLy8g44Ko44Oz44K444Oz77yIV0FTTe+8ieOBryAxIOODl+ODreOCu+OCueOBqyAxIOOBpOOBoOOBkeeUn+OBi+OBmeOAguS9nOOCiuebtOOBmeWJjeOBqyBmcmVlKCkg44GX44Gq44GE44Go44Kk44Oz44K544K/44Oz44K544GMXG4vLyDnqY3jgb/kuIrjgYzjgorjgIEyIOWAi+ebruS7pemZjeOBruani+evieOBjOi2hee3muW9ouOBq+mBheOBj+OBquOCi++8iOWun+a4rDogZnJlZSDnhKHjgZfjgacgMy44cyAtPiAxMS4ycyAtPiAyMi4xc+OAgVxuLy8g5qeL56+J5YmN44GrIGZyZWUg44GZ44KL44GoIDMuNXMgLT4gMC40c++8ieOAguODq+ODvOODq+OCu+ODg+ODiOOBjOWkieOCj+OCi++8iFN0YWdlIOOBlOOBqOOBqyBleGNsdWRlIOOBjOmBleOBhuOAgVxuLy8g44OG44K544OI44Gn6KSH5pWw44Ki44OX44Oq44KS5ZCI5oiQ44GZ44KL77yJ44Gf44Gz44Gr5L2c44KK55u044GZ44Gu44Gn44CB44Kt44Oj44OD44K344Ol44GvIDEg44K544Ot44OD44OI44Gn6Laz44KK44KL44CCXG5sZXQgY2FjaGVkUmVnb0VuZ2luZTogeyBrZXk6IHN0cmluZzsgZW5naW5lOiBhbnkgfSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHJlZ29FbmdpbmVDYWNoZWQoZW5naW5lTW9kdWxlOiBhbnksIHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSwgcmVnaW9uPzogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5ID0gYCR7cmVnaW9uID8/ICcnfXwke2FjY291bnQgPz8gJyd9fCR7cnVsZXMubWFwKChyKSA9PiByLmlkKS5qb2luKCcsJyl9YDtcbiAgaWYgKGNhY2hlZFJlZ29FbmdpbmU/LmtleSAhPT0ga2V5KSB7XG4gICAgY2FjaGVkUmVnb0VuZ2luZT8uZW5naW5lPy5mcmVlPy4oKTtcbiAgICBjYWNoZWRSZWdvRW5naW5lID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGN1c3RvbVJ1bGVzID0gW1xuICAgICAgLi4uQlVORExFRF9MSUJTLm1hcCgobCkgPT4gKHsgbmFtZTogbC5uYW1lLCBjb250ZW50OiBsLnJlZ28gfSkpLFxuICAgICAgLi4ubWVyZ2VSdWxlTW9kdWxlcyhydWxlcyksXG4gICAgXTtcbiAgICBpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1c3RvbVJ1bGVzLnB1c2goZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uLCBhY2NvdW50KSk7XG4gICAgfVxuICAgIGNhY2hlZFJlZ29FbmdpbmUgPSB7IGtleSwgZW5naW5lOiBuZXcgZW5naW5lTW9kdWxlLlJlZ29FbmdpbmUoeyBjdXN0b21SdWxlcyB9KSB9O1xuICB9XG4gIHJldHVybiBjYWNoZWRSZWdvRW5naW5lLmVuZ2luZTtcbn1cblxuLy8g6Kaz5ris44Oi44O844OJ77yIZW5mb3JjZTogZmFsc2XvvInjga8gQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBq+ebuOS5l+OCiuOBmeOCi+OAglxuLy8g44GC44Gh44KJ44Gv44Kz44Oz44K544OI44Op44Kv44K/44Gn44Ko44Oz44K444Oz44KSIDEg44Gk5L2c44Gj44GmIGZyZWUoKSDjgZfjgarjgYTjga7jgafjgIHlkIzjgZjjg5fjg63jgrvjgrnjgacgQXBwIOOCklxuLy8g5L2c44KK55u044GZ44Gf44Gz44Gr44Kk44Oz44K544K/44Oz44K544GM56mN44G/5LiK44GM44KK44CBcmVnb0VuZ2luZUNhY2hlZCDjgajlkIzjgZjotoXnt5rlvaLjga7mgqrljJbjgpLotbfjgZPjgZlcbi8vIO+8iOWun+a4rCAyMDI2LTA5LTEzOiDlkIzjgZjjg6vjg7zjg6vjgrvjg4Pjg4jjgacgNCDlm54gc3ludGgg44GX44GmIDM2cyAtPiA5NXMgLT4gMTMxcyAtPiAxNzhz77yJ44CCXG4vLyDjg6vjg7zjg6vjgrvjg4Pjg4jjgYzlpInjgo/jgonjgarjgYTpmZDjgorjg5fjg6njgrDjgqTjg7PjgZTjgajkvb/jgYTlm57jgZnjgIJcbi8vIHBvbnl0YWlsOiDjgq3jg7zjgYzlpInjgo/jgaPjgZ/jgajjgY3jgavlj6TjgYTjgqjjg7Pjgrjjg7Pjga8gZnJlZSgpIOOBl+OBquOBhO+8iOOCqOODs+OCuOODs+OBryBDREsg5YG044GuXG4vLyBwcml2YXRlIOODleOCo+ODvOODq+ODieOBp+OAgeinpuOCi+OBq+OBr+WGhemDqOWun+ijheOBq+aJi+OCkuWFpeOCjOOCi+OBk+OBqOOBq+OBquOCi++8ieOAguioreWumumBleOBhOOBriBTdGFnZSDjgYxcbi8vIE4g5YCL44GC44KM44GwIE4g5YCL56mN44KA44GM44CB5a6f44Ki44OX44Oq44Gn44GvIDHjgJwyIOWAi+OAguepjeOBv+S4iuOBjOOCiuOBjOWVj+mhjOOBq+OBquOCi+OBquOCieOAgeOBneOBruOBqOOBjeOBq1xuLy8g44Ki44OD44OX44K544OI44Oq44O844Og44G4IGZyZWUvZGlzcG9zZSDjgpLlhaXjgozjgabjgoLjgonjgYbjgIJcbmxldCBjYWNoZWRPYnNlcnZlUGx1Z2luOiB7IGtleTogc3RyaW5nOyBwbHVnaW46IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4gfSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlUGx1Z2luQ2FjaGVkKHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSk6IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4ge1xuICBjb25zdCBrZXkgPSBydWxlcy5tYXAoKHIpID0+IHIuaWQpLmpvaW4oJywnKTtcbiAgaWYgKGNhY2hlZE9ic2VydmVQbHVnaW4/LmtleSAhPT0ga2V5KSB7XG4gICAgY2FjaGVkT2JzZXJ2ZVBsdWdpbiA9IHtcbiAgICAgIGtleSxcbiAgICAgIHBsdWdpbjogbmV3IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4oe1xuICAgICAgICByZWdvUnVsZXM6IFtcbiAgICAgICAgICAuLi5CVU5ETEVEX0xJQlMubWFwKChsKSA9PiAoeyBuYW1lOiBsLm5hbWUsIGNvbnRlbnQ6IGwucmVnbyB9KSksXG4gICAgICAgICAgLi4ubWVyZ2VSdWxlTW9kdWxlcyhydWxlcyksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjYWNoZWRPYnNlcnZlUGx1Z2luLnBsdWdpbjtcbn1cblxuLyoqIOWFqOODq+ODvOODq+OBq+WFsemAmuOBriByZWdvIOODmOODg+ODgOOAgmJ1bmRsZS1ydWxlcyDjgYwgcGFja2FnZSDlkI3jgaggaW1wb3J0IOOCkiAxIOeorumhnuOBq+W8t+WItuOBl+OBpuOBhOOCi+OAgiAqL1xuY29uc3QgUkVHT19IRUFERVIgPSAncGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG4nO1xuXG4vKipcbiAqIOODq+ODvOODq+OCkiBzZXJ2aWNlIOOBlOOBqOOBqyAxIOODouOCuOODpeODvOODq+OBuOOBvuOBqOOCgeOCi+OAglxuICpcbiAqIOOCs+ODs+ODkeOCpOODq+aZgumWk+OBr+ODq+ODvOODq+acrOS9k+OBrumHj+OCiOOCiuODouOCuOODpeODvOODq+aVsOOBp+WKueOBhOOBpuOBj+OCi++8iOWun+a4rCAxODQ0IOODq+ODvOODq+OCklxuICogMSDjg6vjg7zjg6sgMSDjg6Ljgrjjg6Xjg7zjg6vjgafovInjgZvjgovjgajntIQgNi4yc+OAgXNlcnZpY2Ug5Y2Y5L2N44GuIDM5IOODouOCuOODpeODvOODq+OBq+eVs+OCgOOBqOe0hCAxLjBz77yJ44CCXG4gKiDjg6vjg7zjg6vjga/jgoLjgajjgoLjgajlhajpg6ggYHBhY2thZ2UgY2RrX3ByZWZsaWdodGAg44Gq44Gu44Gn44CBUmVnbyDjgYvjgonopovjgozjgbDntZDlkIjjgZfjgabjgoJcbiAqIOOBl+OBquOBj+OBpuOCguWQjOOBmCAxIOODkeODg+OCseODvOOCuOKAlOKAlOODouOCuOODpeODvOODq+Wig+eVjOOBq+aEj+WRs+irluOBr+eEoeOBhOOAguOBl+OBn+OBjOOBo+OBpueVs+OCgeOCi+OBruOBoOOBjOOAgVxuICog6KOP44KS6L+U44Gb44Gw44CM5Yil44Or44O844Or44GM5ZCM44GY5ZCN5YmN44Gu44OY44Or44OR44O844KS5a6a576p44GZ44KL44Go6buZ44Gj44GmIDEg44Gk44Gu6KaP5YmH44Gr5ZCI5rWB44GZ44KL44CNXG4gKiDjgajjgYTjgYbljbHpmbrjgoLntZDlkIjliY3jgYvjgonlrZjlnKjjgZnjgovjgIJidW5kbGUtcnVsZXMg44GM44Or44O844Or6ZaT44Gu44OI44OD44OX44Os44OZ44Or5ZCN6KGd56qB44KSXG4gKiDlvL7jgYTjgabjgYTjgovjga7jga/jgZ3jga7jgZ/jgoHvvIjlhbHmnInjgZfjgZ/jgYTlrprnvqnjga8gcnVsZXMvX2xpYi8g44Gr572u44GP77yJ44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSdWxlTW9kdWxlcyhydWxlczogQnVuZGxlZFJ1bGVEYXRhW10pOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IGJ5U2VydmljZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgYm9keSA9IHIucmVnby5yZXBsYWNlKC9eKD86cGFja2FnZXxpbXBvcnQpXFxzLipcXG4vZ20sICcnKTtcbiAgICBieVNlcnZpY2Uuc2V0KHIuc2VydmljZSwgWy4uLmJ5U2VydmljZS5nZXQoci5zZXJ2aWNlKSA/PyBbXSwgYm9keV0pO1xuICB9XG4gIHJldHVybiBbLi4uYnlTZXJ2aWNlXS5tYXAoKFtzZXJ2aWNlLCBib2RpZXNdKSA9PiAoe1xuICAgIG5hbWU6IGBfcGZfc2VydmljZV8ke3NlcnZpY2V9YCxcbiAgICBjb250ZW50OiBSRUdPX0hFQURFUiArIGJvZGllcy5qb2luKCdcXG4nKSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIOODhuODs+ODl+ODrOODvOODiOe+pOOBq+WHuuOBpuOBj+OCi+ODquOCveODvOOCueOCv+OCpOODl+OAguWIiOOCiui+vOOBv+OBq+S9v+OBiOOBquOBhOODhuODs+ODl+ODrOODvOODiOOBjCAxIOaemuOBp+OCguOBguOCjOOBsFxuICogdW5kZWZpbmVkIOOCkui/lOOBl+OAgeWIiOOCiui+vOOBv+OBneOBruOCguOBruOCkuirpuOCgeOCi++8iOS9leOBjOi8ieOBo+OBpuOBhOOCi+OBi+WIhuOBi+OCieOBquOBhOOBvuOBvuiQveOBqOOBmeOBqOOAgVxuICog44Or44O844Or44GM6buZ44Gj44Gm55m654Gr44GX44Gq44GP44Gq44KLID0gZW5mb3JjZSDjgavjgajjgaPjgabmnIDmgqrjga7lo4rjgozmlrnjgavjgarjgovjgZ/jgoHvvInjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZVJlc291cmNlVHlwZXModGVtcGxhdGVQYXRoczogc3RyaW5nW10pOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdGVtcGxhdGVQYXRoIG9mIHRlbXBsYXRlUGF0aHMpIHtcbiAgICBsZXQgdGVtcGxhdGU6IGFueTtcbiAgICB0cnkge1xuICAgICAgdGVtcGxhdGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gVHJhbnNmb3Jt77yIU0FNIOetie+8ieOBr+ODnuOCr+ODreWxlemWi+OBp+WIpeOBruODquOCveODvOOCueOBq+WMluOBkeOCi+OBruOBp+OAgeeUn+OBruODhuODs+ODl+ODrOODvOODiOOBi+OCiVxuICAgIC8vIOiqreOCgeOCi+ODquOCveODvOOCueOCv+OCpOODl+OBr+W9k+OBpuOBq+OBquOCieOBquOBhOOAglxuICAgIGlmICh0ZW1wbGF0ZT8uVHJhbnNmb3JtICE9PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBPYmplY3QudmFsdWVzKHRlbXBsYXRlPy5SZXNvdXJjZXMgPz8ge30pIGFzIGFueVtdKSB7XG4gICAgICAvLyBGbjo6Rm9yRWFjaCDjgarjganjgacgVHlwZSDjgYzpnZnnmoTjgavoqq3jgoHjgarjgYTjgqjjg7Pjg4jjg6rjgYzjgYLjgozjgbDoq6bjgoHjgovjgIJcbiAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2U/LlR5cGUgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdHlwZXMuYWRkKHJlc291cmNlLlR5cGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZXM7XG59XG5cbi8qKlxuICog44OG44Oz44OX44Os44O844OI44Gr5Ye644Gm44GP44KL44Oq44K944O844K544K/44Kk44OX44Gr6Zai5L+C44GZ44KL44Or44O844Or44Gg44GR44KS6YG444G244CCXG4gKlxuICog44Ko44Oz44K444Oz44Gu44Kz44Oz44OR44Kk44Or5pmC6ZaT44Gv44Or44O844Or5pWw44Gn44G744G85rG644G+44KL44Gu44Gn77yI5a6f5risIDE4NDQg44Or44O844Or44Gn57SEIDQuNnPjgIFcbiAqIOWFuOWei+eahOOBquOCouODl+ODquOBq+aui+OCiyAxMDAg44Or44O844Or5YmN5b6M44Gq44KJIDAuOHMg5YmN5b6M77yJ44CB44GT44KM44GM5Zu65a6a6LK744Gu5Li744Gq5YmK44KK44Gp44GT44KN44CCXG4gKiDlronlhajmgKfjga8gbWV0YS5yZXNvdXJjZVR5cGVzIOOBruWuo+iogOOBq+S5l+OBo+OBpuOBhOOCizog44Or44O844Or44GM6KaL44KL44Oq44K944O844K544K/44Kk44OX44GMXG4gKiDlrqPoqIDjgYvjgonmvI/jgozjgabjgYTjgovjgajliIjjgonjgozjgabnmbrngavjgZfjgarjgY/jgarjgovjgZ/jgoHjgIF0ZXN0L3J1bGVzLnRlc3QudHMg44GM5YWo44Or44O844Or44Gr44Gk44GE44GmXG4gKiDjgIzoh6rliIbjga4gZmFpbCDjg4bjg7Pjg5fjg6zjg7zjg4jjgafliIjjgormrovjgovjgZPjgajjgI3jgpLmpJzmn7vjgZfjgabjgYTjgovjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sIHR5cGVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCk6IEJ1bmRsZWRSdWxlRGF0YVtdIHtcbiAgaWYgKHR5cGVzID09PSB1bmRlZmluZWQpIHJldHVybiBydWxlcztcbiAgLy8g5YiI44KL5qC55oug44GM54Sh44GE44Or44O844Or44Gv5q6L44GZOiBcIipcIu+8iOWFqOODquOCveODvOOCueWei+OBq+WKueOBj+OCv+OCsOezu+ODq+ODvOODq++8ieOBqOOAgVxuICAvLyByZXNvdXJjZVR5cGVzIOOBjOepuuOBruOCguOBru+8iOODkOODs+ODieODq+a4iOOBv+ODq+ODvOODq+OBr+mdnuepuuOBjOS/neiovOOBleOCjOOBpuOBhOOCi+OBruOBp+OAgeipsuW9k+OBmeOCi+OBruOBr1xuICAvLyDmiYvjgafntYTjgb/nq4vjgabjgZ/jg6vjg7zjg6sgPSDjg4bjgrnjg4jjgoTlsIbmnaXjga7jg4bjg7Pjg5fjg6zjg7zjg4jlsaTjg6vjg7zjg6vjgaDjgZHvvInjgIJcbiAgcmV0dXJuIHJ1bGVzLmZpbHRlcigocikgPT4gci5yZXNvdXJjZVR5cGVzLmxlbmd0aCA9PT0gMFxuICAgIHx8IHIucmVzb3VyY2VUeXBlcy5pbmNsdWRlcygnKicpXG4gICAgfHwgci5yZXNvdXJjZVR5cGVzLnNvbWUoKHQpID0+IHR5cGVzLmhhcyh0KSkpO1xufVxuXG4vKipcbiAqIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUg44KS6Kej5rG644GZ44KL44CCXG4gKiDpgJrluLjjga8gYXdzLWNkay1saWIg44GMIGJ1bmRsZWREZXBlbmRlbmNpZXMg44Go44GX44Gm5ZCM5qKx44GX44Gm44GE44KL44Kz44OU44O844Gr5LmX44KL44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG4vKipcbiAqIOOCqOODs+OCuOODs+OBrueJiOOBq+S+neOCieOBmuODhuODs+ODl+ODrOODvOODiOOCkuipleS+oeOBmeOCi+OAgjEuNy4wLWJldGHjgJwxLjkuMC1iZXRh77yIYXdzLWNkay1saWIgMi4yNjfjgJwyLjI3MCDjga5cbiAqIOWQjOaiseeJiO+8ieOBryB2YWxpZGF0ZURldGFpbGVkIOOBoOOBkeOAgTEuMTAuMCDjga8gdmFsaWRhdGVUZW1wbGF0ZSDjgaDjgZHvvIjmlLnlkI3vvInjgIExLjExLjAg5Lul6ZmN44Gv5Lih5pa544KSXG4gKiDmjIHjgaHjgIExLjEyLjEg44GnIHZhbGlkYXRlRGV0YWlsZWQg44Gv6Z2e5o6o5aWo44Gu5Yil5ZCN44Gr44Gq44Gj44Gf44CC44Os44Od44O844OI44Gu5b2i77yIZGlhZ25vc3RpY3Mg44GuXG4gKiBydWxlSWQvc2V2ZXJpdHkvc291cmNlL3Byb3BlcnR5UGF0aC9lbnRpdHkubG9naWNhbElk77yJ44Gv5Lih6ICF44Gn5ZCM44GY77yI5a6f5risIDIwMjYtMDktMjjjgIFcbiAqIDEuNy4wLWJldGEgLyAxLjEwLjAgLyAxLjEyLjEg44GnIGZhaWwg44OG44Oz44OX44Os44O844OIIDQwMCDmnKzjga4gQ1VTVE9NIOiouuaWreOBjOWujOWFqOS4gOiHtO+8ieOAglxuICog5YWI44Gr5raI44GI44KL44Gu44Gv6Z2e5o6o5aWo44Gu5YG044Gq44Gu44GnIHZhbGlkYXRlVGVtcGxhdGUg44KS5YSq5YWI44GZ44KL44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlbXBsYXRlKGVuZzogYW55LCB0ZW1wbGF0ZTogdW5rbm93biwgY29uZmlnOiBvYmplY3QpOiBhbnkge1xuICBjb25zdCBmbiA9IGVuZy52YWxpZGF0ZVRlbXBsYXRlID8/IGVuZy52YWxpZGF0ZURldGFpbGVkO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIGhhcyBuZWl0aGVyIHZhbGlkYXRlVGVtcGxhdGUgbm9yIHZhbGlkYXRlRGV0YWlsZWQnKTtcbiAgfVxuICByZXR1cm4gZm4uY2FsbChlbmcsIHRlbXBsYXRlLCBjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEVuZ2luZSgpOiBhbnkgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgbGliUGtnID0gcmVxdWlyZS5yZXNvbHZlKCdhd3MtY2RrLWxpYi9wYWNrYWdlLmpzb24nKTtcbiAgICBjb25zdCBlbmdQa2cgPSByZXF1aXJlLnJlc29sdmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtwYXRoLmRpcm5hbWUobGliUGtnKV0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcXVpcmUocGF0aC5kaXJuYW1lKGVuZ1BrZykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogbG9hZEVuZ2luZSgpIOOBjOi8ieOBm+OCi+OBruOBqOWQjOOBmOOCqOODs+OCuOODs+OBrueJiOOAguino+axuumghuOCguWQjOOBmOOBq+OBl+OBpuOBguOCi+OAguiqreOCgeOBquOBkeOCjOOBsCB1bmRlZmluZWTjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmVWZXJzaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUvcGFja2FnZS5qc29uJykudmVyc2lvbjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJQa2cgPSByZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpO1xuICAgIHJldHVybiByZXF1aXJlKHJlcXVpcmUucmVzb2x2ZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZS9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3BhdGguZGlybmFtZShsaWJQa2cpXSxcbiAgICB9KSkudmVyc2lvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIHNlbXZlciDjga7lpKflsI/vvIhhIDwgYiDjgafosqDvvInjgILjg5fjg6zjg6rjg6rjg7zjgrnvvIhgMS45LjAtYmV0YWDvvInjga/lkIzjgZjniYjjga7mraPlvI/jg6rjg6rjg7zjgrnjgojjgorlsI/jgZXjgYTjgIJcbiAqIOiqreOCgeOBquOBhOW9ouOBquOCiSB1bmRlZmluZWTjgIJcbiAqIHBvbnl0YWlsOiDjg5fjg6zjg6rjg6rjg7zjgrnlkIzlo6vjga/mloflrZfliJfjgafmr5TjgbnjgovvvIjjgqjjg7Pjgrjjg7Pjga8gYC1iZXRhYCDjgZfjgYvlh7rjgZfjgabjgYTjgarjgYTvvInjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlID0gKHY6IHN0cmluZykgPT4gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzotKC4rKSk/JC8uZXhlYyh2KTtcbiAgY29uc3QgcGEgPSBwYXJzZShhKTtcbiAgY29uc3QgcGIgPSBwYXJzZShiKTtcbiAgaWYgKCFwYSB8fCAhcGIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgIGNvbnN0IGQgPSBOdW1iZXIocGFbaV0pIC0gTnVtYmVyKHBiW2ldKTtcbiAgICBpZiAoZCAhPT0gMCkgcmV0dXJuIGQ7XG4gIH1cbiAgaWYgKHBhWzRdID09PSBwYls0XSkgcmV0dXJuIDA7XG4gIGlmIChwYVs0XSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgaWYgKHBiWzRdID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgcmV0dXJuIHBhWzRdIDwgcGJbNF0gPyAtMSA6IDE7XG59XG5cbi8qKlxuICog44GT44Gu44Ko44Oz44K444Oz44GM6Ieq5Yqb44Gn5q2i44KB44KL5Yi257SE44Gu44Or44O844Or44GL77yIbWV0YS55YW1sI3N1cGVyc2VkZWRCee+8ieOAgueJiOOBjOiqreOCgeOBquOBkeOCjOOBsCBmYWxzZVxuICog77yd55yB44GL44Gq44GE77yI6YeN6KSH44GM5Ye644KL44Gg44GR44Gn44CB6KaL6YCD44GX44Gv6LW344GN44Gq44GE5YG044Gr5YCS44GZ77yJ44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1cGVyc2VkZWQocnVsZTogQnVuZGxlZFJ1bGVEYXRhLCB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFydWxlLnN1cGVyc2VkZWRCeSB8fCB2ZXJzaW9uID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIChjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgcnVsZS5zdXBlcnNlZGVkQnkuZW5naW5lKSA/PyAtMSkgPj0gMDtcbn1cbiJdfQ==
|
|
637
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQTZKRCxzQ0FZQztBQThFRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUE2Q0Qsa0RBY0M7QUFpQkQsNENBVUM7QUFRRCxzREFtQkM7QUFZRCxzQkFRQztBQWVELDRDQU1DO0FBRUQsZ0NBZUM7QUFNRCxzQ0FjQztBQU9ELDBDQWFDO0FBTUQsb0NBR0M7QUF0bkJELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkNBT3FCO0FBRXJCLG1DQUE4RDtBQUM5RCx3REFBd0U7QUFFeEUsMERBQTBEO0FBQzFEOzhEQUM4RDtBQUU5RDs7O0dBR0c7QUFDVSxRQUFBLHNCQUFzQixHQUFHLHdCQUF3QixDQUFDO0FBRS9EOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxTQUFrQjtJQUN4RSxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZHLE9BQU87UUFDTCxJQUFJLEVBQUUsOEJBQXNCO1FBQzVCLE9BQU8sRUFBRSwrREFBK0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPLEVBQUU7S0FDN0csQ0FBQztBQUNKLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBZ0IsaUJBQWlCLENBQUMsU0FBNkI7SUFDN0QsT0FBTyxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRSxD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LFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbixcbiAgdHlwZSBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQsXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4sXG4gIHR5cGUgUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCxcbiAgdHlwZSBQb2xpY3lWaW9sYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgY2hlY2tRdW90YXMsIHR5cGUgUXVvdGFDaGVja09wdGlvbnMgfSBmcm9tICcuL3F1b3RhJztcbmltcG9ydCB7IEJVTkRMRURfTElCUywgdHlwZSBCdW5kbGVkUnVsZURhdGEgfSBmcm9tICcuLi9ydWxlcy5nZW5lcmF0ZWQnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgLS0gQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSDjga9cbiAgIGF3cy1jZGstbGliIOWQjOaiseOCs+ODlOODvOOCkuWLleeahOino+axuuOBmeOCi+ioreioiO+8iOS+neWtmOOBq+OBr+i8ieOBm+OBquOBhO+8ieOAglJFQURNRS9BR0VOVFMubWQg5Y+C54WnICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBSZWdvIG1vZHVsZSB0aGF0IGNhcnJpZXMgdGhlIGRlcGxveW1lbnRcbiAqIGVudmlyb25tZW50IGludG8gcnVsZSBldmFsdWF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgREVQTE9ZX0VOVl9NT0RVTEVfTkFNRSA9ICdfcGZfZGVwbG95X2Vudmlyb25tZW50JztcblxuLyoqXG4gKiBCdWlsZCB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBkZWZpbmluZyBgZGVwbG95X3JlZ2lvbmAgZm9yIHRoZSBydWxlIHBhY2thZ2UuXG4gKlxuICogUnVsZXMgbXVzdCByZWFkIGl0IGFzIGBkYXRhLmNka19wcmVmbGlnaHQuZGVwbG95X3JlZ2lvbmAgKG5ldmVyIGFzIGEgYmFyZVxuICogdmFyaWFibGUpOiB0aGUgZGF0YSByZWZlcmVuY2UgaXMgc2ltcGx5IHVuZGVmaW5lZCB3aGVuIHRoZSBtb2R1bGUgaXMgbm90XG4gKiBpbmplY3RlZCDigJQgdGhlIHJ1bGUgYm9keSBmYWlscyBhbmQgdGhlIHJ1bGUgc2tpcHMg4oCUIHdoaWxlIGEgYmFyZSB2YXJpYWJsZVxuICogd291bGQgYmUgYSBjb21waWxlIGVycm9yLiBJbmplY3RlZCBieSB0aGUgZW5mb3JjZSBwbHVnaW4gd2hlbiB0aGUgYXBwLWxldmVsXG4gKiByZWdpb24gaXMgY29uY3JldGU7IHRoZSB3YXJuIG1vZGUgKENESyBidWlsdC1pbiBwbHVnaW4pIG5ldmVyIGluamVjdHMgaXQsXG4gKiBzbyByZWdpb24tZGVwZW5kZW50IHJ1bGVzIG9ubHkgZmlyZSBpbiBlbmZvcmNlIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3lFbnZpcm9ubWVudE1vZHVsZShyZWdpb246IHN0cmluZywgYWNjb3VudElkPzogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9IHtcbiAgY29uc3QgYWNjb3VudCA9IGlzQ29uY3JldGVBY2NvdW50KGFjY291bnRJZCkgPyBgZGVwbG95X2FjY291bnQgOj0gJHtKU09OLnN0cmluZ2lmeShhY2NvdW50SWQpfVxcbmAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBERVBMT1lfRU5WX01PRFVMRV9OQU1FLFxuICAgIGNvbnRlbnQ6IGBwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbmRlcGxveV9yZWdpb24gOj0gJHtKU09OLnN0cmluZ2lmeShyZWdpb24pfVxcbiR7YWNjb3VudH1gLFxuICB9O1xufVxuXG4vKiogV2hldGhlciB0aGUgYWNjb3VudCBmcm9tIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgaXMgYSBjb25jcmV0ZSAxMi1kaWdpdCBhY2NvdW50IGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uY3JldGVBY2NvdW50KGFjY291bnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYWNjb3VudElkIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYWNjb3VudElkID09PSAnc3RyaW5nJyAmJiAvXlxcZHsxMn0kLy50ZXN0KGFjY291bnRJZCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaW9uIGZyb20gdGhlIHZhbGlkYXRpb24gY29udGV4dCBpcyBhIGNvbmNyZXRlIHJlZ2lvbiBuYW1lXG4gKiAoYXMgb3Bwb3NlZCB0byB1bmRlZmluZWQsIGFuIHVucmVzb2x2ZWQgdG9rZW4sIG9yIGEgcGxhY2Vob2xkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jcmV0ZVJlZ2lvbihyZWdpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHJlZ2lvbiBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHJlZ2lvbiA9PT0gJ3N0cmluZycgJiYgL15bYS16XXsyfSgtW2Etel0rKSstXFxkKyQvLnRlc3QocmVnaW9uKTtcbn1cblxuaW50ZXJmYWNlIEVuZ2luZURpYWdub3N0aWMge1xuICByZWFkb25seSBydWxlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudGl0eT86IHsgcmVhZG9ubHkgbG9naWNhbElkPzogc3RyaW5nIH07XG4gIHJlYWRvbmx5IHByb3BlcnR5UGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgZG9jdW1lbnRhdGlvblVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBlbmZvcmNlIOODouODvOODieeUqOOBruWGhemDqOODl+ODqeOCsOOCpOODs+OAglxuICpcbiAqIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjga/lhaggZmluZGluZyDjgpIgd2FybmluZyDjgavkuLjjgoHjgovjgZ/jgoFcbiAqIO+8iGF3cy1jZGstbGliIDIuMjY3LjAg5a6f5ris44CB5piH5qC844OV44Op44Kw44KC54Sh5Yq577yJ44CB5ZCM44GY44Ko44Oz44K444Oz44KS55u05o6l5ZG844Gz44CBXG4gKiBjZGstcHJlZmxpZ2h0IOOBruODq+ODvOODq+mBleWPje+8iOOBiuOCiOOBsyBzdHJpY3Qg5pmC44Gv44Ko44Oz44K444Oz44Gu44Ko44Op44O844Kv44Op44K577yJ44KSXG4gKiBwb2xpY3kgdmFsaWRhdGlvbiDjga7lpLHmlZfjgajjgZfjgabloLHlkYrjgZfjgaYgc3ludGgg44KS5q2i44KB44KL44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVmbGlnaHRFbmZvcmNlUGx1Z2luIGltcGxlbWVudHMgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZSA9IFBMVUdJTl9OQU1FO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaWN0OiBib29sZWFuLFxuICAgIC8qKiBjaGVja1F1b3RhcyDjga7jgajjgY3jgaDjgZHmuKHjgosgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1b3Rhcz86IE9taXQ8UXVvdGFDaGVja09wdGlvbnMsICdzZXZlcml0eSc+LFxuICApIHt9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRleHQ6IElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCk6IFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQge1xuICAgIGNvbnN0IHZpb2xhdGlvbnMgPSBbLi4udGhpcy52YWxpZGF0ZVJ1bGVzKGNvbnRleHQpXTtcbiAgICBpZiAodGhpcy5xdW90YXMpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaCguLi5jaGVja1F1b3Rhcyhjb250ZXh0LCB7IC4uLnRoaXMucXVvdGFzLCBzZXZlcml0eTogJ2Vycm9yJyB9KSk7XG4gICAgfVxuICAgIC8vIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjgajlkIzjgZjliKTlrprjgIJ3YXJuaW5nIOOBoOOBkeOBquOCiVxuICAgIC8vIOODrOODneODvOODiOOBq+OBr+i8ieOCi+OBjOWQiOaIkOOBr+mAmuOCi++8iENMSSDlgbTjga8gc3VjY2Vzcy9mYWlsdXJlIOOBq+mWouOCj+OCieOBmuW/heOBmuWHuuWKm+OBmeOCi++8ieOAglxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHZpb2xhdGlvbnMuZXZlcnkoKHYpID0+ICFCTE9DS1NfU1lOVEguaGFzKFN0cmluZyh2LnNldmVyaXR5KSkpLCB2aW9sYXRpb25zIH07XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUnVsZXMoY29udGV4dDogSVBvbGljeVZhbGlkYXRpb25Db250ZXh0KTogUG9saWN5VmlvbGF0aW9uW10ge1xuICAgIGNvbnN0IGVuZ2luZSA9IGxvYWRFbmdpbmVDYWNoZWQoKTtcbiAgICBpZiAoIWVuZ2luZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdjZGstcHJlZmxpZ2h0OiBjb3VsZCBub3QgcmVzb2x2ZSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlOyAnICtcbiAgICAgICAgJ2VuZm9yY2UgbW9kZSBpcyB1bmF2YWlsYWJsZSBhbmQgbm8gcHJlZmxpZ2h0IGNoZWNrcyB3ZXJlIHJ1bi4gJyArXG4gICAgICAgICdJbnN0YWxsIGl0IGFzIGEgZGV2RGVwZW5kZW5jeSwgb3IgdXNlIFByZWZsaWdodC5hcHBseShhcHAsIHsgZW5mb3JjZTogZmFsc2UgfSkgdG8gcmVwb3J0IHRocm91Z2ggdGhlIENESyBidWlsdC1pbiB2YWxpZGF0b3IuJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgb3VycyA9IG5ldyBTZXQodGhpcy5ydWxlcy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQb2xpY3lWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgLy8g5YWo44OG44Oz44OX44Os44O844OI44Gu5ZKM6ZuG5ZCI44Gn5YiI44KK6L6844KA44CC44OG44Oz44OX44Os44O844OI44GU44Go44Gr5YiI44KL44Go44Ko44Oz44K444Oz44KS5L2V5bqm44KCXG4gICAgLy8g5L2c44KK55u044GZ44GT44Go44Gr44Gq44KK44CB44Gd44Gh44KJ44Gu44Kz44K544OI44Gu5pa544GM6auY44GP44Gk44GP77yIcmVnb0VuZ2luZUNhY2hlZCDjga7jgrPjg6Hjg7Pjg4jlj4LnhafvvInjgIJcbiAgICBjb25zdCBydWxlcyA9IHBydW5lKHRoaXMucnVsZXMsIHRlbXBsYXRlUmVzb3VyY2VUeXBlcyhjb250ZXh0LnN0YWNrVGVtcGxhdGVzLm1hcCgoc3QpID0+IHN0LnRlbXBsYXRlUGF0aCkpKTtcblxuICAgIC8vIDEg5pys44KC5q6L44KJ44Gq44GEID0g44GT44Gu44Ki44OX44Oq44Gu44Oq44K944O844K544Gr6Zai5L+C44GZ44KL44Or44O844Or44GM54Sh44GE44CC44Ko44Oz44K444Oz44KS57WE44KA5b+F6KaB44KC54Sh44GEXG4gICAgLy8g77yIbGlicyDjgaDjgZHjgpLovInjgZvjgZ/jgqjjg7Pjgrjjg7Pjga8gdmlvbGF0aW9uIOODq+ODvOODq+OCkuaMgeOBn+OBmuOAgeipleS+oeaZguOBq+iQveOBoeOCi++8ieOAglxuICAgIC8vIHN0cmljdCDjga7jgajjgY3jga/ntYTjgb/ovrzjgb/jgqjjg7Pjgrjjg7Pjga4gZmluZGluZ3Mg44KS5ou+44GG5LuV5LqL44GM5q6L44KL44Gu44Gn6YCa5bi444Gp44GK44KK6YCy44KA44CCXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5zdHJpY3QpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBkZXBsb3lfcmVnaW9uIC8gZGVwbG95X2FjY291bnQg44Gv44Ko44Oz44K444Oz44Gr54S844GN6L6844KA44Gu44Gn44CB55Kw5aKD44GU44Go44Gr44K544K/44OD44Kv44KS5p2f44Gt44GmXG4gICAgLy8gMSDnkrDlooMgMSDlm57jgaDjgZHjgqjjg7Pjgrjjg7PjgpLntYTjgoDjgILjgqLjg5fjg6rljZjkvY3jga4gY29udGV4dC5yZWdpb24gLyBhY2NvdW50SWQg44Gv5YWo44K544K/44OD44Kv44GMXG4gICAgLy8g5ZCM44GY55Kw5aKD44Gu44Go44GN44GX44GL5YWl44KJ44Ga44CB44Gd44KM44KS5L2/44GG44Go55Kw5aKD44Gu6YGV44GG44K544K/44OD44Kv44GMIDEg44Gk44GC44KL44Gg44GR44GnXG4gICAgLy8g44Oq44O844K444On44Oz5L6d5a2Y44Gu44Or44O844Or44GM5YWo44K544K/44OD44Kv44Gn6buZ44KL44CCXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBieUVudmlyb25tZW50KGNvbnRleHQuc3RhY2tUZW1wbGF0ZXMpKSB7XG4gICAgICBsZXQgZW5nOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBlbmcgPSByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZSwgcnVsZXMsIGdyb3VwLnJlZ2lvbiwgZ3JvdXAuYWNjb3VudCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIOODq+ODvOODq+ODkeODg+OCr+OBjOOCs+ODs+ODkeOCpOODq+OBp+OBjeOBquOBhCA9IOOBk+OBrueSsOWig+OBruOBqeOBruODhuODs+ODl+ODrOODvOODiOOCguaknOafu+OBp+OBjeOBquOBhOOBruOBp+OAgVxuICAgICAgICAvLyDjgZ3jga7jgrnjgr/jg4Pjgq/jgZnjgbnjgabjgasgdmlvbGF0aW9uIOOCkueri+OBpuOCi++8iDEg5p6a44Ga44Gk44GuIGNhdGNoIOOBq+OBr+WIsOmBlOOBl+OBquOBhO+8ieOAglxuICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4uZ3JvdXAuc3RhY2tzLm1hcCgoc3QpID0+IGVuZ2luZUVycm9yVmlvbGF0aW9uKHN0LCBlKSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZpb2xhdGlvbnMucHVzaCguLi50aGlzLnZhbGlkYXRlU3RhY2tzKGVuZ2luZSwgZW5nLCBncm91cC5zdGFja3MsIG91cnMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlU3RhY2tzKFxuICAgIGVuZ2luZTogYW55LFxuICAgIGVuZzogYW55LFxuICAgIHN0YWNrczogSVBvbGljeVZhbGlkYXRpb25Db250ZXh0WydzdGFja1RlbXBsYXRlcyddLFxuICAgIG91cnM6IFNldDxzdHJpbmc+LFxuICApOiBQb2xpY3lWaW9sYXRpb25bXSB7XG4gICAgY29uc3QgdmlvbGF0aW9uczogUG9saWN5VmlvbGF0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHN0IG9mIHN0YWNrcykge1xuICAgICAgbGV0IHJlcG9ydDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVwb3J0ID0gdmFsaWRhdGVUZW1wbGF0ZShlbmcsIG5ldyBlbmdpbmUuVGVtcGxhdGVGaWxlKHN0LnRlbXBsYXRlUGF0aCksIHtcbiAgICAgICAgICAvLyBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM44GY44GP44CB44K544K/44OD44Kv6Ieq6Lqr44Gu5YCk44KS5rih44GZXG4gICAgICAgICAgcHNldWRvUGFyYW1ldGVyT3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IHN0LmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3QucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8g57WE44G/6L6844G/44Or44O844Or44GvIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjgYzlkIzjgZjjg4bjg7Pjg5fjg6zjg7zjg4jjgatcbiAgICAgICAgICAvLyDlr77jgZfjgabml6LjgavotbDjgonjgZvjgabjgYTjgovjgIJzdHJpY3Qg44Gn44Gq44GR44KM44Gw57WQ5p6c44KC5L2/44KP44Ga5o2o44Gm44Gm44GE44KL44Gu44Gn44CB5Li444GU44Go5YiH44KLXG4gICAgICAgICAgLy8g77yI5a6f5risIDcwIOODquOCveODvOOCuSAxIOaemuOBp+WIneWbniAzLjI3cyAtPiAwLjIyc++8ieOAgnN0cmljdCDjga7jgajjgY3jgaDjgZHlv4XopoHjgavjgarjgovjgIJcbiAgICAgICAgICBkaXNhYmxlQnVpbHRpblJ1bGVzOiAhdGhpcy5zdHJpY3QsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB0aHJvdyDjgpLlpJbjgavlh7rjgZnjgaggQ0RLIOOBr+OBk+OBruWRvOOBs+WHuuOBl+OCkiBwbHVnaW4gZmFpbHVyZe+8iHZpb2xhdGlvbiDjgrzjg63vvInjgajjgZfjgaZcbiAgICAgICAgLy8g6KiY6Yyy44GZ44KL44Gg44GR44Gr44Gq44KK44CB44GT44GT44G+44Gn44Gr6ZuG44KB44Gf6YGV5Y+N44KC5b6M57aa44OG44Oz44OX44Os44O844OI44Gu6YGV5Y+N44KC5Li444GU44Go5raI44GI44CBXG4gICAgICAgIC8vIOaui+OCi+OBruOBryBgZmFpbGVkOiB1bmRlZmluZWRgIOOBoOOBkeOBq+OBquOCi++8iGlzc3VlICMxNTHvvInjgIJcbiAgICAgICAgLy8gc3ludGgg44KS5q2i44KB44KL44Gu44GvIGluc3RhbGxFbmZvcmNlR2F0ZSDjga7lvbnnm67jgILjgZPjgZPjga/jgIzjganjga7jgrnjgr/jg4Pjgq/jgafkvZXjgYxcbiAgICAgICAgLy8g6LW344GN44Gf44GL44CN44KS44Os44Od44O844OI44Gr5q6L44GX44CB5LuW44K544K/44OD44Kv44Gu44Or44O844Or44KS6LWw44KJ44Gb57aa44GR44KL44Gf44KB44Gu44KC44Gu44CCXG4gICAgICAgIHZpb2xhdGlvbnMucHVzaChlbmdpbmVFcnJvclZpb2xhdGlvbihzdCwgZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZCBvZiAocmVwb3J0LmRpYWdub3N0aWNzID8/IFtdKSBhcyBFbmdpbmVEaWFnbm9zdGljW10pIHtcbiAgICAgICAgY29uc3QgaXNPdXJzID0gZC5zb3VyY2UgPT09ICdDVVNUT00nICYmIG91cnMuaGFzKGQucnVsZUlkKTtcbiAgICAgICAgY29uc3QgaXNTdHJpY3RIaXQgPSB0aGlzLnN0cmljdFxuICAgICAgICAgICYmIGQuc291cmNlICE9PSAnQ1VTVE9NJ1xuICAgICAgICAgICYmIChkLnNldmVyaXR5ID09PSAnRVJST1InIHx8IGQuc2V2ZXJpdHkgPT09ICdGQVRBTCcpO1xuICAgICAgICBpZiAoIWlzT3VycyAmJiAhaXNTdHJpY3RIaXQpIGNvbnRpbnVlO1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgIHJ1bGVOYW1lOiBkLnJ1bGVJZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZC5tZXNzYWdlLFxuICAgICAgICAgIHNldmVyaXR5OiBtYXBTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICB2aW9sYXRpbmdSZXNvdXJjZXM6IFt7XG4gICAgICAgICAgICByZXNvdXJjZUxvZ2ljYWxJZDogZC5lbnRpdHk/LmxvZ2ljYWxJZCA/PyAnKHVua25vd24pJyxcbiAgICAgICAgICAgIHRlbXBsYXRlUGF0aDogc3QudGVtcGxhdGVQYXRoLFxuICAgICAgICAgICAgbG9jYXRpb25zOiBbZC5wcm9wZXJ0eVBhdGggPz8gJyh0ZW1wbGF0ZSknXSxcbiAgICAgICAgICB9XSxcbiAgICAgICAgICAuLi4oZC5kb2N1bWVudGF0aW9uVXJsID8geyBydWxlTWV0YWRhdGE6IHsgRG9jdW1lbnRhdGlvblVybDogZC5kb2N1bWVudGF0aW9uVXJsIH0gfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2aW9sYXRpb25zO1xuICB9XG59XG5cbi8qKlxuICogYGVuZm9yY2U6IGZhbHNlYCDjga7jgajjgY3jga7jgq/jgqnjg7zjgr/mpJzmn7vjgILjg6vjg7zjg6vjga8gQ0RLIOe1hOOBv+i+vOOBv+OBruODl+ODqeOCsOOCpOODs+OBq+i8ieOBm+OCi+OBjOOAgVxuICog44Kv44Kp44O844K/44Gv44OG44Oz44OX44Os44O844OI44Gu5aSW44Gu6Kmx44Gq44Gu44Gn5Yil44OX44Op44Kw44Kk44Oz44Gr44GX44CBd2FybmluZyDjgajjgZfjgabloLHlkYrjgaDjgZHjgZnjgovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodFF1b3RhUGx1Z2luIGltcGxlbWVudHMgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZSA9IGAke1BMVUdJTl9OQU1FfS1xdW90YXNgO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcXVvdGFzOiBPbWl0PFF1b3RhQ2hlY2tPcHRpb25zLCAnc2V2ZXJpdHknPikge31cblxuICBwdWJsaWMgdmFsaWRhdGUoY29udGV4dDogSVBvbGljeVZhbGlkYXRpb25Db250ZXh0KTogUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmlvbGF0aW9uczogY2hlY2tRdW90YXMoY29udGV4dCwgeyAuLi50aGlzLnF1b3Rhcywgc2V2ZXJpdHk6ICd3YXJuaW5nJyB9KSB9O1xuICB9XG59XG5cbi8qKlxuICog44K544K/44OD44Kv44KSICjjg6rjg7zjgrjjg6fjg7MsIOOCouOCq+OCpuODs+ODiCkg44Gn5p2f44Gt44KL44CC5YW35L2T55qE44Gn44Gq44GE5YCk77yI5pyq5oyH5a6a44O744OI44O844Kv44Oz77yJ44GvIHVuZGVmaW5lZCDjgatcbiAqIOWvhOOBm+OCi+OBruOBp+OAgeeSsOWig+mdnuS+neWtmOOBruOCueOCv+ODg+OCr+OBryBkZXBsb3lfcmVnaW9uIOOCkuazqOWFpeOBl+OBquOBhOOCqOODs+OCuOODs+OBp+ipleS+oeOBleOCjOOCi+OAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5RW52aXJvbm1lbnQ8VCBleHRlbmRzIHsgcmVnaW9uPzogc3RyaW5nOyBhY2NvdW50SWQ/OiBzdHJpbmcgfT4oXG4gIHN0YWNrczogcmVhZG9ubHkgVFtdLFxuKTogeyByZWdpb24/OiBzdHJpbmc7IGFjY291bnQ/OiBzdHJpbmc7IHN0YWNrczogVFtdIH1bXSB7XG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlZ2lvbj86IHN0cmluZzsgYWNjb3VudD86IHN0cmluZzsgc3RhY2tzOiBUW10gfT4oKTtcbiAgZm9yIChjb25zdCBzdCBvZiBzdGFja3MpIHtcbiAgICBjb25zdCByZWdpb24gPSBpc0NvbmNyZXRlUmVnaW9uKHN0LnJlZ2lvbikgPyBzdC5yZWdpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWNjb3VudCA9IGlzQ29uY3JldGVBY2NvdW50KHN0LmFjY291bnRJZCkgPyBzdC5hY2NvdW50SWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2V5ID0gYCR7cmVnaW9uID8/ICcnfXwke2FjY291bnQgPz8gJyd9YDtcbiAgICBpZiAoIWdyb3Vwcy5oYXMoa2V5KSkgZ3JvdXBzLnNldChrZXksIHsgcmVnaW9uLCBhY2NvdW50LCBzdGFja3M6IFtdIH0pO1xuICAgIGdyb3Vwcy5nZXQoa2V5KSEuc3RhY2tzLnB1c2goc3QpO1xuICB9XG4gIHJldHVybiBbLi4uZ3JvdXBzLnZhbHVlcygpXTtcbn1cblxuLyoqIOWQiOaIkOOCkuatouOCgeOCiyB2aW9sYXRpb24gc2V2ZXJpdHnjgIIgKi9cbmNvbnN0IEJMT0NLU19TWU5USCA9IG5ldyBTZXQoWydlcnJvcicsICdmYXRhbCddKTtcblxuLyoqXG4gKiDjgqjjg7Pjgrjjg7Pjga4gc2V2ZXJpdHkg44KSIHBvbGljeSB2YWxpZGF0aW9uIOOBriBzZXZlcml0eSDjgavlhpnjgZnjgILooajjga8gYXdzLWNkay1saWIgMi4yNjcuMCDjga5cbiAqIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM5LiA44CCYHJlcHJvLm1ldGhvZDogZG9jLW9ubHlgIOOBruODq+ODvOODq+OBryBXQVJOIOOCkuWHuuOBmeOBruOBp1xuICogd2FybmluZyDjgavjgarjgorjgIHloLHlkYrjga/jgZXjgozjgovjgYwgc3ludGgg44Gv5q2i44KB44Gq44GE77yI6Ki85oug44GM5a6f5qmf44Gu44OH44OX44Ot44Kk5aSx5pWX44Gn44Gv44Gq44GE44Gf44KB77yJ44CCXG4gKi9cbmZ1bmN0aW9uIG1hcFNldmVyaXR5KHNldmVyaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgY2FzZSAnRkFUQUwnOlxuICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgIHJldHVybiAnZXJyb3InO1xuICAgIGNhc2UgJ1dBUk4nOlxuICAgICAgcmV0dXJuICd3YXJuaW5nJztcbiAgICBjYXNlICdJTkZPJzpcbiAgICAgIHJldHVybiAnaW5mb3JtYXRpb25hbCc7XG4gICAgY2FzZSAnREVCVUcnOlxuICAgICAgcmV0dXJuICdkZWJ1Zyc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnd2FybmluZyc7XG4gIH1cbn1cblxuLyoqXG4gKiDjg6vjg7zjg6voqZXkvqHjgZ3jga7jgoLjga7jgYzlpLHmlZfjgZfjgZ/jgZPjgajjgpLooajjgZkgdmlvbGF0aW9uIOOBriBydWxlTmFtZeOAglxuICog44OQ44Oz44OJ44Or5riI44G/44Or44O844Or44GuIGlkIOOBp+OBr+OBquOBhOOBruOBpyBgZXhjbHVkZWAg44Gn44Gv5raI44Gb44Gq44GE77yI5raI44GX44Gm44KI44GE54q25oWL44Gn44Gv44Gq44GE77yJ44CCXG4gKi9cbmV4cG9ydCBjb25zdCBFTkdJTkVfRVJST1JfUlVMRSA9ICdwZi1lbmdpbmUtZXJyb3InO1xuXG4vKiog44Ko44Oz44K444Oz44GM5oqV44GS44Gf5YCk44KS44Oh44OD44K744O844K444Gr6JC944Go44GZ44CC44Ko44Oz44K444Oz44GvIEVycm9yIOOBp+OBr+OBquOBj+e0oOOBruaWh+Wtl+WIl+OCkuaKleOBkuOCi+OBk+OBqOOBjOOBguOCi+OAgiAqL1xuZnVuY3Rpb24gZW5naW5lRXJyb3JUZXh0KGU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gKGUgYXMgeyBtZXNzYWdlPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZTtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogU3RyaW5nKGUpO1xufVxuXG4vKiogMSDmnprjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgpLmpJzmn7vjgafjgY3jgarjgYvjgaPjgZ/jgZPjgajjgpIgdmlvbGF0aW9uIOOBqOOBl+OBpuWgseWRiuOBmeOCi+OAgiAqL1xuZnVuY3Rpb24gZW5naW5lRXJyb3JWaW9sYXRpb24oc3Q6IHsgc3RhY2tDb25zdHJ1Y3RQYXRoOiBzdHJpbmc7IHRlbXBsYXRlUGF0aDogc3RyaW5nIH0sIGU6IHVua25vd24pOiBQb2xpY3lWaW9sYXRpb24ge1xuICByZXR1cm4ge1xuICAgIHJ1bGVOYW1lOiBFTkdJTkVfRVJST1JfUlVMRSxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdjZGstcHJlZmxpZ2h0IGNvdWxkIG5vdCBldmFsdWF0ZSBpdHMgcnVsZXMgZm9yIHRoaXMgdGVtcGxhdGUsIHNvIG5vIHByZWZsaWdodCBydWxlIHJhbiBmb3IgaXQ6ICdcbiAgICAgICsgZW5naW5lRXJyb3JUZXh0KGUpLFxuICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgIGZpeDogJ1JlcG9ydCB0aGlzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWRtaW50b25jcnllci9jZGstcHJlZmxpZ2h0L2lzc3VlczsgJ1xuICAgICAgKyAndG8gdW5ibG9jayB0aGUgYnVpbGQgbWVhbndoaWxlLCB1c2UgUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBlbmZvcmNlOiBmYWxzZSB9KS4nLFxuICAgIHZpb2xhdGluZ1Jlc291cmNlczogW3tcbiAgICAgIGNvbnN0cnVjdFBhdGg6IHN0LnN0YWNrQ29uc3RydWN0UGF0aCxcbiAgICAgIHRlbXBsYXRlUGF0aDogc3QudGVtcGxhdGVQYXRoLFxuICAgICAgbG9jYXRpb25zOiBbJyh0ZW1wbGF0ZSknXSxcbiAgICB9XSxcbiAgfTtcbn1cblxuLyoqIFRoZSBwbHVnaW4gbmFtZSByZWNvcmRlZCBpbiBgdmFsaWRhdGlvbi1yZXBvcnQuanNvbmAgZm9yIG91ciBmaW5kaW5ncy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fTkFNRSA9ICdjZGstcHJlZmxpZ2h0JztcblxuLyoqIFRoZSBjbG91ZCBhc3NlbWJseSBmaWxlIHRoZSBDREsgd3JpdGVzIGl0cyB2YWxpZGF0aW9uIHJlcG9ydCB0by4gKi9cbmNvbnN0IFZBTElEQVRJT05fUkVQT1JUX0ZJTEUgPSAndmFsaWRhdGlvbi1yZXBvcnQuanNvbic7XG5cbmNvbnN0IEdBVEVfSU5TVEFMTEVEID0gU3ltYm9sLmZvcignY2RrLXByZWZsaWdodC5lbmZvcmNlR2F0ZScpO1xuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ44Gu5Y+W44KK44GT44G844GX44KS5aGe44GQ44Ky44O844OI44KSIEFwcCDjgavku5XovrzjgoDjgIJcbiAqXG4gKiBDREsgQ0xJIDIuMTEyOC4xIOS7pemZjeOBryBhcHAg44Gr44CM44Os44Od44O844OI44GvIENMSSDjgYzlh6bnkIbjgZnjgovjgI3jgajkvJ3jgYjjgZ/jgYbjgYjjgadcbiAqIGB2YWxpZGF0aW9uLXJlcG9ydC5qc29uYCDjgpLoh6rliIbjgafoqq3jgoDjgYzjgIHjgZ3jga7ntZ7jgorovrzjgb/vvIh0b29sa2l0LWxpYiDjga5cbiAqIGBmaWx0ZXJSZXBvcnRzQnlTdGFja3Ng77yJ44GMIHZpb2xhdGlvbiDjga4gY29uc3RydWN0UGF0aCDlhYjpoK3jgrvjgrDjg6Hjg7Pjg4jjgpJcbiAqIOmBuOaKnuOCueOCv+ODg+OCr+OBriBoaWVyYXJjaGljYWxJZCDjgajnqoHjgY3lkIjjgo/jgZvjgovjgZ/jgoHjgIFgU3RhZ2UvU3RhY2tgIOW9ouW8j+OBq+OBquOCi1xuICogU3RhZ2Ug5YaF44K544K/44OD44Kv44Gu6YGV5Y+N44GM44GZ44G544Gm5o2o44Gm44KJ44KM44CBc3ludGgg44GM6buZ44Gj44Gm5oiQ5Yqf44GZ44KL77yIaXNzdWUgIzExM++8ieOAglxuICpcbiAqIOOBneOBk+OBpyBzeW50aCDlrozkuoblvozjgavjg6zjg53jg7zjg4jjgpLoqq3jgb/nm7TjgZfjgIFjZGstcHJlZmxpZ2h0IOOBrumBleWPjeOBjOaui+OBo+OBpuOBhOOCjOOBsFxuICog6Ieq5YiG44Gn5aCx5ZGK44GX44GmIHN5bnRoIOOCkuatouOCgeOCi+OAguODqeOCpOODluODqeODquOBjOiHquWKm+OBp+WgseWRiuOBmeOCi+e1jOi3r++8iOe0oOOBriBub2RlIOWun+ihjOOAgVxuICogamVzdOOAgUNMSSAyLjExMjguMSDmnKrmuoDvvInjgafjga8gc3ludGgg44GM5L6L5aSW44KS5oqV44GS44KL44Gf44KB44GT44GT44Gr44Gv5Yiw6YGU44Gb44Ga44CBXG4gKiDkuozph43loLHlkYrjga/otbfjgY3jgarjgYTjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxFbmZvcmNlR2F0ZShzY29wZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICBjb25zdCByb290ID0gc2NvcGUubm9kZS5yb290O1xuICBpZiAoIUFwcC5pc0FwcChyb290KSkgcmV0dXJuO1xuICBjb25zdCBhcHAgPSByb290IGFzIEFwcCAmIHsgW0dBVEVfSU5TVEFMTEVEXT86IGJvb2xlYW4gfTtcbiAgaWYgKGFwcFtHQVRFX0lOU1RBTExFRF0pIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcCwgR0FURV9JTlNUQUxMRUQsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuXG4gIGNvbnN0IHN5bnRoID0gYXBwLnN5bnRoLmJpbmQoYXBwKTtcbiAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgYXBwLnN5bnRoID0gKG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFwcFsnc3ludGgnXT5bMF0pID0+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IHN5bnRoKG9wdGlvbnMpO1xuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICBmYWlsSWZSZXBvcnRVbmhhbmRsZWQoYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9O1xufVxuXG4vKipcbiAqIOODrOODneODvOODiOOBqyBjZGstcHJlZmxpZ2h0IOOBruWkseaVl+OBjOaui+OBo+OBpuOBhOOCjOOBsOOAgWZpbmRpbmdzIOOCkuWHuuWKm+OBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqXG4gKiDliKTlrprjga8gY2RrLXByZWZsaWdodCDjga7jg6zjg53jg7zjg4jjgaDjgZHjgpLopovjgovjgILntYTjgb/ovrzjgb/jgqjjg7Pjgrjjg7PjgoQgY29uc3RydWN0IGFubm90YXRpb25cbiAqIOOBoOOBkeOBjOWkseaVl+OBl+OBpuOBhOOCi+WgtOWQiOOBryBDTEkg44GM5q2j44GX44GP5omx44GI44KL44Gu44Gn44CB44GT44Gh44KJ44Gv6buZ44Gj44GmIENMSSDjgavku7vjgZvjgovjgIJcbiAqIOmAhuOBq+eZuueBq+OBmeOCi+OBqOOBjeOBr+ODrOODneODvOODiOWFqOS9k+OCkuWHuuOBmeOAguOBk+OBk+OBpyBzeW50aCDjgpLmraLjgoHjgovjgaggQ0xJIOWBtOOBruWHuuWKm+OBjFxuICog5LiA5YiH6LWw44KJ44Gq44GE44Gf44KB44CB5ZCM5pmC44Gr5Ye644Gm44GE44Gf44Gv44Ga44Gu5LuW44OX44Op44Kw44Kk44Oz44GuIGZpbmRpbmcg44GM5raI44GI44Gm44GX44G+44GG44CCXG4gKi9cbmZ1bmN0aW9uIGZhaWxJZlJlcG9ydFVuaGFuZGxlZChkaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgcGx1Z2luUmVwb3J0czogYW55W107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb3J0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpcmVjdG9yeSwgVkFMSURBVElPTl9SRVBPUlRfRklMRSksICd1dGY4JykpO1xuICAgIHBsdWdpblJlcG9ydHMgPSByZXBvcnQ/LnBsdWdpblJlcG9ydHMgPz8gW107XG4gIH0gY2F0Y2gge1xuICAgIC8vIOODrOODneODvOODiOOBjOeEoeOBhO+8iOODl+ODqeOCsOOCpOODs+acquWun+ihjO+8ieOBvuOBn+OBr+WjiuOCjOOBpuOBhOOCi+WgtOWQiOOBr+S9leOCguOBl+OBquOBhFxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmYWlsZWQgPSBwbHVnaW5SZXBvcnRzLnNvbWUoXG4gICAgKHIpID0+IHI/LnBsdWdpbk5hbWUgPT09IFBMVUdJTl9OQU1FICYmIHI/LmNvbmNsdXNpb24gPT09ICdmYWlsdXJlJyxcbiAgKTtcbiAgaWYgKCFmYWlsZWQpIHJldHVybjtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGZvcm1hdFJlcG9ydHMocGx1Z2luUmVwb3J0cykpO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ2Nkay1wcmVmbGlnaHQ6IHZhbGlkYXRpb24gZmFpbGVkLiBGaXggdGhlIGZpbmRpbmdzIGFib3ZlLCAnICtcbiAgICBcImFja25vd2xlZGdlIHRoZW0gd2l0aCBWYWxpZGF0aW9ucy5vZihzY29wZSkuYWNrbm93bGVkZ2UoeyBpZDogJ2Nkay1wcmVmbGlnaHQ6OjxydWxlLWlkPicgfSksIFwiICtcbiAgICAnb3IgZXhjbHVkZSB0aGUgcnVsZSB2aWEgUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBleGNsdWRlOiBbLi4uXSB9KS4nLFxuICApO1xufVxuXG4vKipcbiAqIENESyDmnKzkvZPjga7jg5Xjgqnjg7zjg57jg4Pjgr/jgafmlbTlvaLjgZfjgIFDTEkg44Go5ZCM5LiA44Gu6KaL44Gf55uu44Gr44GZ44KL44CCXG4gKiDnp4HmnInjg5Hjgrnjgarjga7jgafop6PmsbrjgafjgY3jgarjgYTjgZPjgajjgYzjgYLjgorjgIHjgZ3jga7loLTlkIjjga/mnIDlsI/pmZDjga7oh6rliY3mlbTlvaLjgavokL3jgajjgZlcbiAqIO+8iOimi+OBn+ebruOCiOOCiuOAjOiQveOBqOOBmeOAjeOBk+OBqOOCkuWEquWFiOOBmeOCi++8ieOAglxuICovXG5mdW5jdGlvbiBmb3JtYXRSZXBvcnRzKHBsdWdpblJlcG9ydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbG9hZEZvcm1hdHRlckNhY2hlZCgpO1xuICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0VmFsaWRhdGlvblJlcG9ydHMocHJvY2Vzcy5jd2QoKSwgcGx1Z2luUmVwb3J0cykuam9pbignXFxuXFxuJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrRm9ybWF0KHBsdWdpblJlcG9ydHMpO1xufVxuXG4vKipcbiAqIENESyDmnKzkvZPjga7jg5Xjgqnjg7zjg57jg4Pjgr/jgpLop6PmsbrjgafjgY3jgarjgYTjgajjgY3jga7mnIDlsI/pmZDjga7mlbTlvaLjgIJcbiAqIOimi+OBn+ebruOBr+WKo+OCi+OBjOOAgWZpbmRpbmdzIOOCkuW/heOBmuiqreOCgeOCi+W9ouOBp+WHuuOBmeOBn+OCgeOBruacgOW+jOOBruegpuOAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrRm9ybWF0KHBsdWdpblJlcG9ydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgYmxvY2tzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlcG9ydCBvZiBwbHVnaW5SZXBvcnRzKSB7XG4gICAgZm9yIChjb25zdCB2aW9sYXRpb24gb2YgcmVwb3J0Py52aW9sYXRpb25zID8/IFtdKSB7XG4gICAgICBjb25zdCBhY2tJZCA9IFN0cmluZyh2aW9sYXRpb24ucnVsZU5hbWUpLmluY2x1ZGVzKCc6OicpXG4gICAgICAgID8gdmlvbGF0aW9uLnJ1bGVOYW1lXG4gICAgICAgIDogYCR7cmVwb3J0LnBsdWdpbk5hbWV9Ojoke3Zpb2xhdGlvbi5ydWxlTmFtZX1gO1xuICAgICAgZm9yIChjb25zdCBjIG9mIHZpb2xhdGlvbi52aW9sYXRpbmdDb25zdHJ1Y3RzID8/IFtdKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKFxuICAgICAgICAgIGAke1N0cmluZyh2aW9sYXRpb24uc2V2ZXJpdHkgPz8gJ0VSUk9SJykudG9VcHBlckNhc2UoKX0gJHt2aW9sYXRpb24uZGVzY3JpcHRpb259ICgke3JlcG9ydC5wbHVnaW5OYW1lfSlcXG5gICtcbiAgICAgICAgICBgICAgJHtjLmNvbnN0cnVjdFBhdGh9ICgke2MuY2xvdWRGb3JtYXRpb25SZXNvdXJjZT8ubG9naWNhbElkfSkgJHtjLmNvbnN0cnVjdEZxbn1cXG5gICtcbiAgICAgICAgICBgICAgQWNrbm93bGVkZ2Ugd2l0aCAnJHtTdHJpbmcoYWNrSWQpLnJlcGxhY2UoLyAvZywgJy0nKX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJsb2Nrcy5qb2luKCdcXG5cXG4nKTtcbn1cblxuLy8g44OV44Kp44O844Oe44OD44K/44GvIGF3cy1jZGstbGliIOOBruengeacieODkeOCueOBq+OBguOCiiBgZXhwb3J0c2Ag44GL44KJ6KaL44GI44Gq44GE44Gf44KB44CBXG4vLyDjgqjjg7Pjgrjjg7Pop6PmsbrvvIhsb2FkRW5naW5l77yJ44Go5ZCM44GY44GP44OR44OD44Kx44O844K444Or44O844OI44GL44KJ44Gu57W25a++44OR44K544Gn6Kqt44G/6L6844KA44CCXG5sZXQgY2FjaGVkRm9ybWF0dGVyOiBhbnkgfCBmYWxzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGxvYWRGb3JtYXR0ZXJDYWNoZWQoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNhY2hlZEZvcm1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkRm9ybWF0dGVyID0gbG9hZEZvcm1hdHRlcigpID8/IGZhbHNlO1xuICB9XG4gIHJldHVybiBjYWNoZWRGb3JtYXR0ZXIgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogY2FjaGVkRm9ybWF0dGVyO1xufVxuXG4vKiog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIkgKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRm9ybWF0dGVyKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbGliUm9vdCA9IHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpKTtcbiAgICBjb25zdCBtb2QgPSByZXF1aXJlKHBhdGguam9pbihsaWJSb290LCAnY29yZS9saWIvdmFsaWRhdGlvbi9wcml2YXRlL21vZGVybi1mb3JtYXR0ZXIuanMnKSk7XG4gICAgcmV0dXJuIHR5cGVvZiBtb2Q/LmZvcm1hdFZhbGlkYXRpb25SZXBvcnRzID09PSAnZnVuY3Rpb24nID8gbW9kIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8vIOOCqOODs+OCuOODs++8iFdBU03vvInjga7liJ3mnJ/ljJbjga/ph43jgYTjgZ/jgoHjgIHjg6Ljgrjjg6Xjg7zjg6vjg6zjg5njg6vjgafjgq3jg6Pjg4Pjgrfjg6XjgZnjgotcbmxldCBjYWNoZWRFbmdpbmVNb2R1bGU6IGFueSB8IGZhbHNlIHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gbG9hZEVuZ2luZUNhY2hlZCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICBpZiAoY2FjaGVkRW5naW5lTW9kdWxlID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWNoZWRFbmdpbmVNb2R1bGUgPSBsb2FkRW5naW5lKCkgPz8gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZEVuZ2luZU1vZHVsZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBjYWNoZWRFbmdpbmVNb2R1bGU7XG59XG5cbi8vIOOCqOODs+OCuOODs++8iFdBU03vvInjga8gMSDjg5fjg63jgrvjgrnjgasgMSDjgaTjgaDjgZHnlJ/jgYvjgZnjgILkvZzjgornm7TjgZnliY3jgasgZnJlZSgpIOOBl+OBquOBhOOBqOOCpOODs+OCueOCv+ODs+OCueOBjFxuLy8g56mN44G/5LiK44GM44KK44CBMiDlgIvnm67ku6XpmY3jga7mp4vnr4njgYzotoXnt5rlvaLjgavpgYXjgY/jgarjgovvvIjlrp/muKw6IGZyZWUg54Sh44GX44GnIDMuOHMgLT4gMTEuMnMgLT4gMjIuMXPjgIFcbi8vIOani+evieWJjeOBqyBmcmVlIOOBmeOCi+OBqCAzLjVzIC0+IDAuNHPvvInjgILjg6vjg7zjg6vjgrvjg4Pjg4jjgYzlpInjgo/jgovvvIhTdGFnZSDjgZTjgajjgasgZXhjbHVkZSDjgYzpgZXjgYbjgIFcbi8vIOODhuOCueODiOOBp+ikh+aVsOOCouODl+ODquOCkuWQiOaIkOOBmeOCi++8ieOBn+OBs+OBq+S9nOOCiuebtOOBmeOBruOBp+OAgeOCreODo+ODg+OCt+ODpeOBryAxIOOCueODreODg+ODiOOBp+i2s+OCiuOCi+OAglxuLy8gcG9ueXRhaWw6IOeSsOWig++8iOODquODvOOCuOODp+ODsyDDlyDjgqLjgqvjgqbjg7Pjg4jvvInjgYwgTiDlgIvjgYLjgovjgqLjg5fjg6rjga8gc3ludGgg44Gu44Gf44Gz44GrIE4g5Zue57WE44G/55u044GZ44CCXG4vLyDlrp/jgqLjg5fjg6rjgafjga8gMeOAnDMg5YCL44CC6YeN44GP44Gq44Gj44Gf44KJIGRlcGxveV9yZWdpb24g44KS44Oi44K444Ol44O844Or44Gn44Gv44Gq44GP5YWl5Yqb44Gn5rih44GZ5b2i44Gr44GZ44KL44CCXG5sZXQgY2FjaGVkUmVnb0VuZ2luZTogeyBrZXk6IHN0cmluZzsgZW5naW5lOiBhbnkgfSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHJlZ29FbmdpbmVDYWNoZWQoZW5naW5lTW9kdWxlOiBhbnksIHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSwgcmVnaW9uPzogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5ID0gYCR7cmVnaW9uID8/ICcnfXwke2FjY291bnQgPz8gJyd9fCR7cnVsZXMubWFwKChyKSA9PiByLmlkKS5qb2luKCcsJyl9YDtcbiAgaWYgKGNhY2hlZFJlZ29FbmdpbmU/LmtleSAhPT0ga2V5KSB7XG4gICAgY2FjaGVkUmVnb0VuZ2luZT8uZW5naW5lPy5mcmVlPy4oKTtcbiAgICBjYWNoZWRSZWdvRW5naW5lID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGN1c3RvbVJ1bGVzID0gW1xuICAgICAgLi4uQlVORExFRF9MSUJTLm1hcCgobCkgPT4gKHsgbmFtZTogbC5uYW1lLCBjb250ZW50OiBsLnJlZ28gfSkpLFxuICAgICAgLi4ubWVyZ2VSdWxlTW9kdWxlcyhydWxlcyksXG4gICAgXTtcbiAgICBpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1c3RvbVJ1bGVzLnB1c2goZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uLCBhY2NvdW50KSk7XG4gICAgfVxuICAgIGNhY2hlZFJlZ29FbmdpbmUgPSB7IGtleSwgZW5naW5lOiBuZXcgZW5naW5lTW9kdWxlLlJlZ29FbmdpbmUoeyBjdXN0b21SdWxlcyB9KSB9O1xuICB9XG4gIHJldHVybiBjYWNoZWRSZWdvRW5naW5lLmVuZ2luZTtcbn1cblxuLy8g6Kaz5ris44Oi44O844OJ77yIZW5mb3JjZTogZmFsc2XvvInjga8gQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBq+ebuOS5l+OCiuOBmeOCi+OAglxuLy8g44GC44Gh44KJ44Gv44Kz44Oz44K544OI44Op44Kv44K/44Gn44Ko44Oz44K444Oz44KSIDEg44Gk5L2c44Gj44GmIGZyZWUoKSDjgZfjgarjgYTjga7jgafjgIHlkIzjgZjjg5fjg63jgrvjgrnjgacgQXBwIOOCklxuLy8g5L2c44KK55u044GZ44Gf44Gz44Gr44Kk44Oz44K544K/44Oz44K544GM56mN44G/5LiK44GM44KK44CBcmVnb0VuZ2luZUNhY2hlZCDjgajlkIzjgZjotoXnt5rlvaLjga7mgqrljJbjgpLotbfjgZPjgZlcbi8vIO+8iOWun+a4rCAyMDI2LTA5LTEzOiDlkIzjgZjjg6vjg7zjg6vjgrvjg4Pjg4jjgacgNCDlm54gc3ludGgg44GX44GmIDM2cyAtPiA5NXMgLT4gMTMxcyAtPiAxNzhz77yJ44CCXG4vLyDjg6vjg7zjg6vjgrvjg4Pjg4jjgYzlpInjgo/jgonjgarjgYTpmZDjgorjg5fjg6njgrDjgqTjg7PjgZTjgajkvb/jgYTlm57jgZnjgIJcbi8vIHBvbnl0YWlsOiDjgq3jg7zjgYzlpInjgo/jgaPjgZ/jgajjgY3jgavlj6TjgYTjgqjjg7Pjgrjjg7Pjga8gZnJlZSgpIOOBl+OBquOBhO+8iOOCqOODs+OCuOODs+OBryBDREsg5YG044GuXG4vLyBwcml2YXRlIOODleOCo+ODvOODq+ODieOBp+OAgeinpuOCi+OBq+OBr+WGhemDqOWun+ijheOBq+aJi+OCkuWFpeOCjOOCi+OBk+OBqOOBq+OBquOCi++8ieOAguioreWumumBleOBhOOBriBTdGFnZSDjgYxcbi8vIE4g5YCL44GC44KM44GwIE4g5YCL56mN44KA44GM44CB5a6f44Ki44OX44Oq44Gn44GvIDHjgJwyIOWAi+OAguepjeOBv+S4iuOBjOOCiuOBjOWVj+mhjOOBq+OBquOCi+OBquOCieOAgeOBneOBruOBqOOBjeOBq1xuLy8g44Ki44OD44OX44K544OI44Oq44O844Og44G4IGZyZWUvZGlzcG9zZSDjgpLlhaXjgozjgabjgoLjgonjgYbjgIJcbmxldCBjYWNoZWRPYnNlcnZlUGx1Z2luOiB7IGtleTogc3RyaW5nOyBwbHVnaW46IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4gfSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlUGx1Z2luQ2FjaGVkKHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSk6IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4ge1xuICBjb25zdCBrZXkgPSBydWxlcy5tYXAoKHIpID0+IHIuaWQpLmpvaW4oJywnKTtcbiAgaWYgKGNhY2hlZE9ic2VydmVQbHVnaW4/LmtleSAhPT0ga2V5KSB7XG4gICAgY2FjaGVkT2JzZXJ2ZVBsdWdpbiA9IHtcbiAgICAgIGtleSxcbiAgICAgIHBsdWdpbjogbmV3IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4oe1xuICAgICAgICByZWdvUnVsZXM6IFtcbiAgICAgICAgICAuLi5CVU5ETEVEX0xJQlMubWFwKChsKSA9PiAoeyBuYW1lOiBsLm5hbWUsIGNvbnRlbnQ6IGwucmVnbyB9KSksXG4gICAgICAgICAgLi4ubWVyZ2VSdWxlTW9kdWxlcyhydWxlcyksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjYWNoZWRPYnNlcnZlUGx1Z2luLnBsdWdpbjtcbn1cblxuLyoqIOWFqOODq+ODvOODq+OBq+WFsemAmuOBriByZWdvIOODmOODg+ODgOOAgmJ1bmRsZS1ydWxlcyDjgYwgcGFja2FnZSDlkI3jgaggaW1wb3J0IOOCkiAxIOeorumhnuOBq+W8t+WItuOBl+OBpuOBhOOCi+OAgiAqL1xuY29uc3QgUkVHT19IRUFERVIgPSAncGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG4nO1xuXG4vKipcbiAqIOODq+ODvOODq+OCkiBzZXJ2aWNlIOOBlOOBqOOBqyAxIOODouOCuOODpeODvOODq+OBuOOBvuOBqOOCgeOCi+OAglxuICpcbiAqIOOCs+ODs+ODkeOCpOODq+aZgumWk+OBr+ODq+ODvOODq+acrOS9k+OBrumHj+OCiOOCiuODouOCuOODpeODvOODq+aVsOOBp+WKueOBhOOBpuOBj+OCi++8iOWun+a4rCAxODQ0IOODq+ODvOODq+OCklxuICogMSDjg6vjg7zjg6sgMSDjg6Ljgrjjg6Xjg7zjg6vjgafovInjgZvjgovjgajntIQgNi4yc+OAgXNlcnZpY2Ug5Y2Y5L2N44GuIDM5IOODouOCuOODpeODvOODq+OBq+eVs+OCgOOBqOe0hCAxLjBz77yJ44CCXG4gKiDjg6vjg7zjg6vjga/jgoLjgajjgoLjgajlhajpg6ggYHBhY2thZ2UgY2RrX3ByZWZsaWdodGAg44Gq44Gu44Gn44CBUmVnbyDjgYvjgonopovjgozjgbDntZDlkIjjgZfjgabjgoJcbiAqIOOBl+OBquOBj+OBpuOCguWQjOOBmCAxIOODkeODg+OCseODvOOCuOKAlOKAlOODouOCuOODpeODvOODq+Wig+eVjOOBq+aEj+WRs+irluOBr+eEoeOBhOOAguOBl+OBn+OBjOOBo+OBpueVs+OCgeOCi+OBruOBoOOBjOOAgVxuICog6KOP44KS6L+U44Gb44Gw44CM5Yil44Or44O844Or44GM5ZCM44GY5ZCN5YmN44Gu44OY44Or44OR44O844KS5a6a576p44GZ44KL44Go6buZ44Gj44GmIDEg44Gk44Gu6KaP5YmH44Gr5ZCI5rWB44GZ44KL44CNXG4gKiDjgajjgYTjgYbljbHpmbrjgoLntZDlkIjliY3jgYvjgonlrZjlnKjjgZnjgovjgIJidW5kbGUtcnVsZXMg44GM44Or44O844Or6ZaT44Gu44OI44OD44OX44Os44OZ44Or5ZCN6KGd56qB44KSXG4gKiDlvL7jgYTjgabjgYTjgovjga7jga/jgZ3jga7jgZ/jgoHvvIjlhbHmnInjgZfjgZ/jgYTlrprnvqnjga8gcnVsZXMvX2xpYi8g44Gr572u44GP77yJ44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSdWxlTW9kdWxlcyhydWxlczogQnVuZGxlZFJ1bGVEYXRhW10pOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IGJ5U2VydmljZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgYm9keSA9IHIucmVnby5yZXBsYWNlKC9eKD86cGFja2FnZXxpbXBvcnQpXFxzLipcXG4vZ20sICcnKTtcbiAgICBieVNlcnZpY2Uuc2V0KHIuc2VydmljZSwgWy4uLmJ5U2VydmljZS5nZXQoci5zZXJ2aWNlKSA/PyBbXSwgYm9keV0pO1xuICB9XG4gIHJldHVybiBbLi4uYnlTZXJ2aWNlXS5tYXAoKFtzZXJ2aWNlLCBib2RpZXNdKSA9PiAoe1xuICAgIG5hbWU6IGBfcGZfc2VydmljZV8ke3NlcnZpY2V9YCxcbiAgICBjb250ZW50OiBSRUdPX0hFQURFUiArIGJvZGllcy5qb2luKCdcXG4nKSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIOODhuODs+ODl+ODrOODvOODiOe+pOOBq+WHuuOBpuOBj+OCi+ODquOCveODvOOCueOCv+OCpOODl+OAguWIiOOCiui+vOOBv+OBq+S9v+OBiOOBquOBhOODhuODs+ODl+ODrOODvOODiOOBjCAxIOaemuOBp+OCguOBguOCjOOBsFxuICogdW5kZWZpbmVkIOOCkui/lOOBl+OAgeWIiOOCiui+vOOBv+OBneOBruOCguOBruOCkuirpuOCgeOCi++8iOS9leOBjOi8ieOBo+OBpuOBhOOCi+OBi+WIhuOBi+OCieOBquOBhOOBvuOBvuiQveOBqOOBmeOBqOOAgVxuICog44Or44O844Or44GM6buZ44Gj44Gm55m654Gr44GX44Gq44GP44Gq44KLID0gZW5mb3JjZSDjgavjgajjgaPjgabmnIDmgqrjga7lo4rjgozmlrnjgavjgarjgovjgZ/jgoHvvInjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZVJlc291cmNlVHlwZXModGVtcGxhdGVQYXRoczogc3RyaW5nW10pOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdGVtcGxhdGVQYXRoIG9mIHRlbXBsYXRlUGF0aHMpIHtcbiAgICBsZXQgdGVtcGxhdGU6IGFueTtcbiAgICB0cnkge1xuICAgICAgdGVtcGxhdGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gVHJhbnNmb3Jt77yIU0FNIOetie+8ieOBr+ODnuOCr+ODreWxlemWi+OBp+WIpeOBruODquOCveODvOOCueOBq+WMluOBkeOCi+OBruOBp+OAgeeUn+OBruODhuODs+ODl+ODrOODvOODiOOBi+OCiVxuICAgIC8vIOiqreOCgeOCi+ODquOCveODvOOCueOCv+OCpOODl+OBr+W9k+OBpuOBq+OBquOCieOBquOBhOOAglxuICAgIGlmICh0ZW1wbGF0ZT8uVHJhbnNmb3JtICE9PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBPYmplY3QudmFsdWVzKHRlbXBsYXRlPy5SZXNvdXJjZXMgPz8ge30pIGFzIGFueVtdKSB7XG4gICAgICAvLyBGbjo6Rm9yRWFjaCDjgarjganjgacgVHlwZSDjgYzpnZnnmoTjgavoqq3jgoHjgarjgYTjgqjjg7Pjg4jjg6rjgYzjgYLjgozjgbDoq6bjgoHjgovjgIJcbiAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2U/LlR5cGUgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdHlwZXMuYWRkKHJlc291cmNlLlR5cGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZXM7XG59XG5cbi8qKlxuICog44OG44Oz44OX44Os44O844OI44Gr5Ye644Gm44GP44KL44Oq44K944O844K544K/44Kk44OX44Gr6Zai5L+C44GZ44KL44Or44O844Or44Gg44GR44KS6YG444G244CCXG4gKlxuICog44Ko44Oz44K444Oz44Gu44Kz44Oz44OR44Kk44Or5pmC6ZaT44Gv44Or44O844Or5pWw44Gn44G744G85rG644G+44KL44Gu44Gn77yI5a6f5risIDE4NDQg44Or44O844Or44Gn57SEIDQuNnPjgIFcbiAqIOWFuOWei+eahOOBquOCouODl+ODquOBq+aui+OCiyAxMDAg44Or44O844Or5YmN5b6M44Gq44KJIDAuOHMg5YmN5b6M77yJ44CB44GT44KM44GM5Zu65a6a6LK744Gu5Li744Gq5YmK44KK44Gp44GT44KN44CCXG4gKiDlronlhajmgKfjga8gbWV0YS5yZXNvdXJjZVR5cGVzIOOBruWuo+iogOOBq+S5l+OBo+OBpuOBhOOCizog44Or44O844Or44GM6KaL44KL44Oq44K944O844K544K/44Kk44OX44GMXG4gKiDlrqPoqIDjgYvjgonmvI/jgozjgabjgYTjgovjgajliIjjgonjgozjgabnmbrngavjgZfjgarjgY/jgarjgovjgZ/jgoHjgIF0ZXN0L3J1bGVzLnRlc3QudHMg44GM5YWo44Or44O844Or44Gr44Gk44GE44GmXG4gKiDjgIzoh6rliIbjga4gZmFpbCDjg4bjg7Pjg5fjg6zjg7zjg4jjgafliIjjgormrovjgovjgZPjgajjgI3jgpLmpJzmn7vjgZfjgabjgYTjgovjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sIHR5cGVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCk6IEJ1bmRsZWRSdWxlRGF0YVtdIHtcbiAgaWYgKHR5cGVzID09PSB1bmRlZmluZWQpIHJldHVybiBydWxlcztcbiAgLy8g5YiI44KL5qC55oug44GM54Sh44GE44Or44O844Or44Gv5q6L44GZOiBcIipcIu+8iOWFqOODquOCveODvOOCueWei+OBq+WKueOBj+OCv+OCsOezu+ODq+ODvOODq++8ieOBqOOAgVxuICAvLyByZXNvdXJjZVR5cGVzIOOBjOepuuOBruOCguOBru+8iOODkOODs+ODieODq+a4iOOBv+ODq+ODvOODq+OBr+mdnuepuuOBjOS/neiovOOBleOCjOOBpuOBhOOCi+OBruOBp+OAgeipsuW9k+OBmeOCi+OBruOBr1xuICAvLyDmiYvjgafntYTjgb/nq4vjgabjgZ/jg6vjg7zjg6sgPSDjg4bjgrnjg4jjgoTlsIbmnaXjga7jg4bjg7Pjg5fjg6zjg7zjg4jlsaTjg6vjg7zjg6vjgaDjgZHvvInjgIJcbiAgcmV0dXJuIHJ1bGVzLmZpbHRlcigocikgPT4gci5yZXNvdXJjZVR5cGVzLmxlbmd0aCA9PT0gMFxuICAgIHx8IHIucmVzb3VyY2VUeXBlcy5pbmNsdWRlcygnKicpXG4gICAgfHwgci5yZXNvdXJjZVR5cGVzLnNvbWUoKHQpID0+IHR5cGVzLmhhcyh0KSkpO1xufVxuXG4vKipcbiAqIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUg44KS6Kej5rG644GZ44KL44CCXG4gKiDpgJrluLjjga8gYXdzLWNkay1saWIg44GMIGJ1bmRsZWREZXBlbmRlbmNpZXMg44Go44GX44Gm5ZCM5qKx44GX44Gm44GE44KL44Kz44OU44O844Gr5LmX44KL44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG4vKipcbiAqIOOCqOODs+OCuOODs+OBrueJiOOBq+S+neOCieOBmuODhuODs+ODl+ODrOODvOODiOOCkuipleS+oeOBmeOCi+OAgjEuNy4wLWJldGHjgJwxLjkuMC1iZXRh77yIYXdzLWNkay1saWIgMi4yNjfjgJwyLjI3MCDjga5cbiAqIOWQjOaiseeJiO+8ieOBryB2YWxpZGF0ZURldGFpbGVkIOOBoOOBkeOAgTEuMTAuMCDjga8gdmFsaWRhdGVUZW1wbGF0ZSDjgaDjgZHvvIjmlLnlkI3vvInjgIExLjExLjAg5Lul6ZmN44Gv5Lih5pa544KSXG4gKiDmjIHjgaHjgIExLjEyLjEg44GnIHZhbGlkYXRlRGV0YWlsZWQg44Gv6Z2e5o6o5aWo44Gu5Yil5ZCN44Gr44Gq44Gj44Gf44CC44Os44Od44O844OI44Gu5b2i77yIZGlhZ25vc3RpY3Mg44GuXG4gKiBydWxlSWQvc2V2ZXJpdHkvc291cmNlL3Byb3BlcnR5UGF0aC9lbnRpdHkubG9naWNhbElk77yJ44Gv5Lih6ICF44Gn5ZCM44GY77yI5a6f5risIDIwMjYtMDktMjjjgIFcbiAqIDEuNy4wLWJldGEgLyAxLjEwLjAgLyAxLjEyLjEg44GnIGZhaWwg44OG44Oz44OX44Os44O844OIIDQwMCDmnKzjga4gQ1VTVE9NIOiouuaWreOBjOWujOWFqOS4gOiHtO+8ieOAglxuICog5YWI44Gr5raI44GI44KL44Gu44Gv6Z2e5o6o5aWo44Gu5YG044Gq44Gu44GnIHZhbGlkYXRlVGVtcGxhdGUg44KS5YSq5YWI44GZ44KL44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlbXBsYXRlKGVuZzogYW55LCB0ZW1wbGF0ZTogdW5rbm93biwgY29uZmlnOiBvYmplY3QpOiBhbnkge1xuICBjb25zdCBmbiA9IGVuZy52YWxpZGF0ZVRlbXBsYXRlID8/IGVuZy52YWxpZGF0ZURldGFpbGVkO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIGhhcyBuZWl0aGVyIHZhbGlkYXRlVGVtcGxhdGUgbm9yIHZhbGlkYXRlRGV0YWlsZWQnKTtcbiAgfVxuICByZXR1cm4gZm4uY2FsbChlbmcsIHRlbXBsYXRlLCBjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEVuZ2luZSgpOiBhbnkgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgbGliUGtnID0gcmVxdWlyZS5yZXNvbHZlKCdhd3MtY2RrLWxpYi9wYWNrYWdlLmpzb24nKTtcbiAgICBjb25zdCBlbmdQa2cgPSByZXF1aXJlLnJlc29sdmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtwYXRoLmRpcm5hbWUobGliUGtnKV0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcXVpcmUocGF0aC5kaXJuYW1lKGVuZ1BrZykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogbG9hZEVuZ2luZSgpIOOBjOi8ieOBm+OCi+OBruOBqOWQjOOBmOOCqOODs+OCuOODs+OBrueJiOOAguino+axuumghuOCguWQjOOBmOOBq+OBl+OBpuOBguOCi+OAguiqreOCgeOBquOBkeOCjOOBsCB1bmRlZmluZWTjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmVWZXJzaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUvcGFja2FnZS5qc29uJykudmVyc2lvbjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJQa2cgPSByZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpO1xuICAgIHJldHVybiByZXF1aXJlKHJlcXVpcmUucmVzb2x2ZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZS9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3BhdGguZGlybmFtZShsaWJQa2cpXSxcbiAgICB9KSkudmVyc2lvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIHNlbXZlciDjga7lpKflsI/vvIhhIDwgYiDjgafosqDvvInjgILjg5fjg6zjg6rjg6rjg7zjgrnvvIhgMS45LjAtYmV0YWDvvInjga/lkIzjgZjniYjjga7mraPlvI/jg6rjg6rjg7zjgrnjgojjgorlsI/jgZXjgYTjgIJcbiAqIOiqreOCgeOBquOBhOW9ouOBquOCiSB1bmRlZmluZWTjgIJcbiAqIHBvbnl0YWlsOiDjg5fjg6zjg6rjg6rjg7zjgrnlkIzlo6vjga/mloflrZfliJfjgafmr5TjgbnjgovvvIjjgqjjg7Pjgrjjg7Pjga8gYC1iZXRhYCDjgZfjgYvlh7rjgZfjgabjgYTjgarjgYTvvInjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlID0gKHY6IHN0cmluZykgPT4gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzotKC4rKSk/JC8uZXhlYyh2KTtcbiAgY29uc3QgcGEgPSBwYXJzZShhKTtcbiAgY29uc3QgcGIgPSBwYXJzZShiKTtcbiAgaWYgKCFwYSB8fCAhcGIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgIGNvbnN0IGQgPSBOdW1iZXIocGFbaV0pIC0gTnVtYmVyKHBiW2ldKTtcbiAgICBpZiAoZCAhPT0gMCkgcmV0dXJuIGQ7XG4gIH1cbiAgaWYgKHBhWzRdID09PSBwYls0XSkgcmV0dXJuIDA7XG4gIGlmIChwYVs0XSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgaWYgKHBiWzRdID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgcmV0dXJuIHBhWzRdIDwgcGJbNF0gPyAtMSA6IDE7XG59XG5cbi8qKlxuICog44GT44Gu44Ko44Oz44K444Oz44GM6Ieq5Yqb44Gn5q2i44KB44KL5Yi257SE44Gu44Or44O844Or44GL77yIbWV0YS55YW1sI3N1cGVyc2VkZWRCee+8ieOAgueJiOOBjOiqreOCgeOBquOBkeOCjOOBsCBmYWxzZVxuICog77yd55yB44GL44Gq44GE77yI6YeN6KSH44GM5Ye644KL44Gg44GR44Gn44CB6KaL6YCD44GX44Gv6LW344GN44Gq44GE5YG044Gr5YCS44GZ77yJ44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1cGVyc2VkZWQocnVsZTogQnVuZGxlZFJ1bGVEYXRhLCB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFydWxlLnN1cGVyc2VkZWRCeSB8fCB2ZXJzaW9uID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIChjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgcnVsZS5zdXBlcnNlZGVkQnkuZW5naW5lKSA/PyAtMSkgPj0gMDtcbn1cbiJdfQ==
|