@r5n/hydra 0.3.0
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/LICENSE +201 -0
- package/README.md +337 -0
- package/dist/cli.js +2443 -0
- package/package.json +44 -0
- package/schema.json +71 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,2443 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
19
|
+
|
|
20
|
+
// ../../node_modules/sisteransi/src/index.js
|
|
21
|
+
var require_src = __commonJS((exports, module) => {
|
|
22
|
+
var ESC = "\x1B";
|
|
23
|
+
var CSI = `${ESC}[`;
|
|
24
|
+
var beep = "\x07";
|
|
25
|
+
var cursor = {
|
|
26
|
+
to(x, y) {
|
|
27
|
+
if (!y)
|
|
28
|
+
return `${CSI}${x + 1}G`;
|
|
29
|
+
return `${CSI}${y + 1};${x + 1}H`;
|
|
30
|
+
},
|
|
31
|
+
move(x, y) {
|
|
32
|
+
let ret = "";
|
|
33
|
+
if (x < 0)
|
|
34
|
+
ret += `${CSI}${-x}D`;
|
|
35
|
+
else if (x > 0)
|
|
36
|
+
ret += `${CSI}${x}C`;
|
|
37
|
+
if (y < 0)
|
|
38
|
+
ret += `${CSI}${-y}A`;
|
|
39
|
+
else if (y > 0)
|
|
40
|
+
ret += `${CSI}${y}B`;
|
|
41
|
+
return ret;
|
|
42
|
+
},
|
|
43
|
+
up: (count = 1) => `${CSI}${count}A`,
|
|
44
|
+
down: (count = 1) => `${CSI}${count}B`,
|
|
45
|
+
forward: (count = 1) => `${CSI}${count}C`,
|
|
46
|
+
backward: (count = 1) => `${CSI}${count}D`,
|
|
47
|
+
nextLine: (count = 1) => `${CSI}E`.repeat(count),
|
|
48
|
+
prevLine: (count = 1) => `${CSI}F`.repeat(count),
|
|
49
|
+
left: `${CSI}G`,
|
|
50
|
+
hide: `${CSI}?25l`,
|
|
51
|
+
show: `${CSI}?25h`,
|
|
52
|
+
save: `${ESC}7`,
|
|
53
|
+
restore: `${ESC}8`
|
|
54
|
+
};
|
|
55
|
+
var scroll = {
|
|
56
|
+
up: (count = 1) => `${CSI}S`.repeat(count),
|
|
57
|
+
down: (count = 1) => `${CSI}T`.repeat(count)
|
|
58
|
+
};
|
|
59
|
+
var erase = {
|
|
60
|
+
screen: `${CSI}2J`,
|
|
61
|
+
up: (count = 1) => `${CSI}1J`.repeat(count),
|
|
62
|
+
down: (count = 1) => `${CSI}J`.repeat(count),
|
|
63
|
+
line: `${CSI}2K`,
|
|
64
|
+
lineEnd: `${CSI}K`,
|
|
65
|
+
lineStart: `${CSI}1K`,
|
|
66
|
+
lines(count) {
|
|
67
|
+
let clear = "";
|
|
68
|
+
for (let i = 0;i < count; i++)
|
|
69
|
+
clear += this.line + (i < count - 1 ? cursor.up() : "");
|
|
70
|
+
if (count)
|
|
71
|
+
clear += cursor.left;
|
|
72
|
+
return clear;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
module.exports = { cursor, scroll, erase, beep };
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// ../../node_modules/picocolors/picocolors.js
|
|
79
|
+
var require_picocolors = __commonJS((exports, module) => {
|
|
80
|
+
var p = process || {};
|
|
81
|
+
var argv = p.argv || [];
|
|
82
|
+
var env = p.env || {};
|
|
83
|
+
var isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
|
|
84
|
+
var formatter = (open, close, replace = open) => (input) => {
|
|
85
|
+
let string = "" + input, index = string.indexOf(close, open.length);
|
|
86
|
+
return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
|
|
87
|
+
};
|
|
88
|
+
var replaceClose = (string, close, replace, index) => {
|
|
89
|
+
let result = "", cursor = 0;
|
|
90
|
+
do {
|
|
91
|
+
result += string.substring(cursor, index) + replace;
|
|
92
|
+
cursor = index + close.length;
|
|
93
|
+
index = string.indexOf(close, cursor);
|
|
94
|
+
} while (~index);
|
|
95
|
+
return result + string.substring(cursor);
|
|
96
|
+
};
|
|
97
|
+
var createColors = (enabled = isColorSupported) => {
|
|
98
|
+
let f = enabled ? formatter : () => String;
|
|
99
|
+
return {
|
|
100
|
+
isColorSupported: enabled,
|
|
101
|
+
reset: f("\x1B[0m", "\x1B[0m"),
|
|
102
|
+
bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
|
|
103
|
+
dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
|
|
104
|
+
italic: f("\x1B[3m", "\x1B[23m"),
|
|
105
|
+
underline: f("\x1B[4m", "\x1B[24m"),
|
|
106
|
+
inverse: f("\x1B[7m", "\x1B[27m"),
|
|
107
|
+
hidden: f("\x1B[8m", "\x1B[28m"),
|
|
108
|
+
strikethrough: f("\x1B[9m", "\x1B[29m"),
|
|
109
|
+
black: f("\x1B[30m", "\x1B[39m"),
|
|
110
|
+
red: f("\x1B[31m", "\x1B[39m"),
|
|
111
|
+
green: f("\x1B[32m", "\x1B[39m"),
|
|
112
|
+
yellow: f("\x1B[33m", "\x1B[39m"),
|
|
113
|
+
blue: f("\x1B[34m", "\x1B[39m"),
|
|
114
|
+
magenta: f("\x1B[35m", "\x1B[39m"),
|
|
115
|
+
cyan: f("\x1B[36m", "\x1B[39m"),
|
|
116
|
+
white: f("\x1B[37m", "\x1B[39m"),
|
|
117
|
+
gray: f("\x1B[90m", "\x1B[39m"),
|
|
118
|
+
bgBlack: f("\x1B[40m", "\x1B[49m"),
|
|
119
|
+
bgRed: f("\x1B[41m", "\x1B[49m"),
|
|
120
|
+
bgGreen: f("\x1B[42m", "\x1B[49m"),
|
|
121
|
+
bgYellow: f("\x1B[43m", "\x1B[49m"),
|
|
122
|
+
bgBlue: f("\x1B[44m", "\x1B[49m"),
|
|
123
|
+
bgMagenta: f("\x1B[45m", "\x1B[49m"),
|
|
124
|
+
bgCyan: f("\x1B[46m", "\x1B[49m"),
|
|
125
|
+
bgWhite: f("\x1B[47m", "\x1B[49m"),
|
|
126
|
+
blackBright: f("\x1B[90m", "\x1B[39m"),
|
|
127
|
+
redBright: f("\x1B[91m", "\x1B[39m"),
|
|
128
|
+
greenBright: f("\x1B[92m", "\x1B[39m"),
|
|
129
|
+
yellowBright: f("\x1B[93m", "\x1B[39m"),
|
|
130
|
+
blueBright: f("\x1B[94m", "\x1B[39m"),
|
|
131
|
+
magentaBright: f("\x1B[95m", "\x1B[39m"),
|
|
132
|
+
cyanBright: f("\x1B[96m", "\x1B[39m"),
|
|
133
|
+
whiteBright: f("\x1B[97m", "\x1B[39m"),
|
|
134
|
+
bgBlackBright: f("\x1B[100m", "\x1B[49m"),
|
|
135
|
+
bgRedBright: f("\x1B[101m", "\x1B[49m"),
|
|
136
|
+
bgGreenBright: f("\x1B[102m", "\x1B[49m"),
|
|
137
|
+
bgYellowBright: f("\x1B[103m", "\x1B[49m"),
|
|
138
|
+
bgBlueBright: f("\x1B[104m", "\x1B[49m"),
|
|
139
|
+
bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
|
|
140
|
+
bgCyanBright: f("\x1B[106m", "\x1B[49m"),
|
|
141
|
+
bgWhiteBright: f("\x1B[107m", "\x1B[49m")
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
module.exports = createColors();
|
|
145
|
+
module.exports.createColors = createColors;
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// ../../node_modules/@clack/core/dist/index.mjs
|
|
149
|
+
var import_sisteransi = __toESM(require_src(), 1);
|
|
150
|
+
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
151
|
+
import { stdin as j, stdout as M } from "process";
|
|
152
|
+
import * as g from "readline";
|
|
153
|
+
import O from "readline";
|
|
154
|
+
import { Writable as X } from "stream";
|
|
155
|
+
function DD({ onlyFirst: e = false } = {}) {
|
|
156
|
+
const t = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");
|
|
157
|
+
return new RegExp(t, e ? undefined : "g");
|
|
158
|
+
}
|
|
159
|
+
var uD = DD();
|
|
160
|
+
function P(e) {
|
|
161
|
+
if (typeof e != "string")
|
|
162
|
+
throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);
|
|
163
|
+
return e.replace(uD, "");
|
|
164
|
+
}
|
|
165
|
+
function L(e) {
|
|
166
|
+
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
167
|
+
}
|
|
168
|
+
var W = { exports: {} };
|
|
169
|
+
(function(e) {
|
|
170
|
+
var u = {};
|
|
171
|
+
e.exports = u, u.eastAsianWidth = function(F) {
|
|
172
|
+
var s = F.charCodeAt(0), i = F.length == 2 ? F.charCodeAt(1) : 0, D = s;
|
|
173
|
+
return 55296 <= s && s <= 56319 && 56320 <= i && i <= 57343 && (s &= 1023, i &= 1023, D = s << 10 | i, D += 65536), D == 12288 || 65281 <= D && D <= 65376 || 65504 <= D && D <= 65510 ? "F" : D == 8361 || 65377 <= D && D <= 65470 || 65474 <= D && D <= 65479 || 65482 <= D && D <= 65487 || 65490 <= D && D <= 65495 || 65498 <= D && D <= 65500 || 65512 <= D && D <= 65518 ? "H" : 4352 <= D && D <= 4447 || 4515 <= D && D <= 4519 || 4602 <= D && D <= 4607 || 9001 <= D && D <= 9002 || 11904 <= D && D <= 11929 || 11931 <= D && D <= 12019 || 12032 <= D && D <= 12245 || 12272 <= D && D <= 12283 || 12289 <= D && D <= 12350 || 12353 <= D && D <= 12438 || 12441 <= D && D <= 12543 || 12549 <= D && D <= 12589 || 12593 <= D && D <= 12686 || 12688 <= D && D <= 12730 || 12736 <= D && D <= 12771 || 12784 <= D && D <= 12830 || 12832 <= D && D <= 12871 || 12880 <= D && D <= 13054 || 13056 <= D && D <= 19903 || 19968 <= D && D <= 42124 || 42128 <= D && D <= 42182 || 43360 <= D && D <= 43388 || 44032 <= D && D <= 55203 || 55216 <= D && D <= 55238 || 55243 <= D && D <= 55291 || 63744 <= D && D <= 64255 || 65040 <= D && D <= 65049 || 65072 <= D && D <= 65106 || 65108 <= D && D <= 65126 || 65128 <= D && D <= 65131 || 110592 <= D && D <= 110593 || 127488 <= D && D <= 127490 || 127504 <= D && D <= 127546 || 127552 <= D && D <= 127560 || 127568 <= D && D <= 127569 || 131072 <= D && D <= 194367 || 177984 <= D && D <= 196605 || 196608 <= D && D <= 262141 ? "W" : 32 <= D && D <= 126 || 162 <= D && D <= 163 || 165 <= D && D <= 166 || D == 172 || D == 175 || 10214 <= D && D <= 10221 || 10629 <= D && D <= 10630 ? "Na" : D == 161 || D == 164 || 167 <= D && D <= 168 || D == 170 || 173 <= D && D <= 174 || 176 <= D && D <= 180 || 182 <= D && D <= 186 || 188 <= D && D <= 191 || D == 198 || D == 208 || 215 <= D && D <= 216 || 222 <= D && D <= 225 || D == 230 || 232 <= D && D <= 234 || 236 <= D && D <= 237 || D == 240 || 242 <= D && D <= 243 || 247 <= D && D <= 250 || D == 252 || D == 254 || D == 257 || D == 273 || D == 275 || D == 283 || 294 <= D && D <= 295 || D == 299 || 305 <= D && D <= 307 || D == 312 || 319 <= D && D <= 322 || D == 324 || 328 <= D && D <= 331 || D == 333 || 338 <= D && D <= 339 || 358 <= D && D <= 359 || D == 363 || D == 462 || D == 464 || D == 466 || D == 468 || D == 470 || D == 472 || D == 474 || D == 476 || D == 593 || D == 609 || D == 708 || D == 711 || 713 <= D && D <= 715 || D == 717 || D == 720 || 728 <= D && D <= 731 || D == 733 || D == 735 || 768 <= D && D <= 879 || 913 <= D && D <= 929 || 931 <= D && D <= 937 || 945 <= D && D <= 961 || 963 <= D && D <= 969 || D == 1025 || 1040 <= D && D <= 1103 || D == 1105 || D == 8208 || 8211 <= D && D <= 8214 || 8216 <= D && D <= 8217 || 8220 <= D && D <= 8221 || 8224 <= D && D <= 8226 || 8228 <= D && D <= 8231 || D == 8240 || 8242 <= D && D <= 8243 || D == 8245 || D == 8251 || D == 8254 || D == 8308 || D == 8319 || 8321 <= D && D <= 8324 || D == 8364 || D == 8451 || D == 8453 || D == 8457 || D == 8467 || D == 8470 || 8481 <= D && D <= 8482 || D == 8486 || D == 8491 || 8531 <= D && D <= 8532 || 8539 <= D && D <= 8542 || 8544 <= D && D <= 8555 || 8560 <= D && D <= 8569 || D == 8585 || 8592 <= D && D <= 8601 || 8632 <= D && D <= 8633 || D == 8658 || D == 8660 || D == 8679 || D == 8704 || 8706 <= D && D <= 8707 || 8711 <= D && D <= 8712 || D == 8715 || D == 8719 || D == 8721 || D == 8725 || D == 8730 || 8733 <= D && D <= 8736 || D == 8739 || D == 8741 || 8743 <= D && D <= 8748 || D == 8750 || 8756 <= D && D <= 8759 || 8764 <= D && D <= 8765 || D == 8776 || D == 8780 || D == 8786 || 8800 <= D && D <= 8801 || 8804 <= D && D <= 8807 || 8810 <= D && D <= 8811 || 8814 <= D && D <= 8815 || 8834 <= D && D <= 8835 || 8838 <= D && D <= 8839 || D == 8853 || D == 8857 || D == 8869 || D == 8895 || D == 8978 || 9312 <= D && D <= 9449 || 9451 <= D && D <= 9547 || 9552 <= D && D <= 9587 || 9600 <= D && D <= 9615 || 9618 <= D && D <= 9621 || 9632 <= D && D <= 9633 || 9635 <= D && D <= 9641 || 9650 <= D && D <= 9651 || 9654 <= D && D <= 9655 || 9660 <= D && D <= 9661 || 9664 <= D && D <= 9665 || 9670 <= D && D <= 9672 || D == 9675 || 9678 <= D && D <= 9681 || 9698 <= D && D <= 9701 || D == 9711 || 9733 <= D && D <= 9734 || D == 9737 || 9742 <= D && D <= 9743 || 9748 <= D && D <= 9749 || D == 9756 || D == 9758 || D == 9792 || D == 9794 || 9824 <= D && D <= 9825 || 9827 <= D && D <= 9829 || 9831 <= D && D <= 9834 || 9836 <= D && D <= 9837 || D == 9839 || 9886 <= D && D <= 9887 || 9918 <= D && D <= 9919 || 9924 <= D && D <= 9933 || 9935 <= D && D <= 9953 || D == 9955 || 9960 <= D && D <= 9983 || D == 10045 || D == 10071 || 10102 <= D && D <= 10111 || 11093 <= D && D <= 11097 || 12872 <= D && D <= 12879 || 57344 <= D && D <= 63743 || 65024 <= D && D <= 65039 || D == 65533 || 127232 <= D && D <= 127242 || 127248 <= D && D <= 127277 || 127280 <= D && D <= 127337 || 127344 <= D && D <= 127386 || 917760 <= D && D <= 917999 || 983040 <= D && D <= 1048573 || 1048576 <= D && D <= 1114109 ? "A" : "N";
|
|
174
|
+
}, u.characterLength = function(F) {
|
|
175
|
+
var s = this.eastAsianWidth(F);
|
|
176
|
+
return s == "F" || s == "W" || s == "A" ? 2 : 1;
|
|
177
|
+
};
|
|
178
|
+
function t(F) {
|
|
179
|
+
return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
|
|
180
|
+
}
|
|
181
|
+
u.length = function(F) {
|
|
182
|
+
for (var s = t(F), i = 0, D = 0;D < s.length; D++)
|
|
183
|
+
i = i + this.characterLength(s[D]);
|
|
184
|
+
return i;
|
|
185
|
+
}, u.slice = function(F, s, i) {
|
|
186
|
+
textLen = u.length(F), s = s || 0, i = i || 1, s < 0 && (s = textLen + s), i < 0 && (i = textLen + i);
|
|
187
|
+
for (var D = "", C = 0, n = t(F), E = 0;E < n.length; E++) {
|
|
188
|
+
var a = n[E], o = u.length(a);
|
|
189
|
+
if (C >= s - (o == 2 ? 1 : 0))
|
|
190
|
+
if (C + o <= i)
|
|
191
|
+
D += a;
|
|
192
|
+
else
|
|
193
|
+
break;
|
|
194
|
+
C += o;
|
|
195
|
+
}
|
|
196
|
+
return D;
|
|
197
|
+
};
|
|
198
|
+
})(W);
|
|
199
|
+
var tD = W.exports;
|
|
200
|
+
var eD = L(tD);
|
|
201
|
+
var FD = function() {
|
|
202
|
+
return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
|
|
203
|
+
};
|
|
204
|
+
var sD = L(FD);
|
|
205
|
+
function p(e, u = {}) {
|
|
206
|
+
if (typeof e != "string" || e.length === 0 || (u = { ambiguousIsNarrow: true, ...u }, e = P(e), e.length === 0))
|
|
207
|
+
return 0;
|
|
208
|
+
e = e.replace(sD(), " ");
|
|
209
|
+
const t = u.ambiguousIsNarrow ? 1 : 2;
|
|
210
|
+
let F = 0;
|
|
211
|
+
for (const s of e) {
|
|
212
|
+
const i = s.codePointAt(0);
|
|
213
|
+
if (i <= 31 || i >= 127 && i <= 159 || i >= 768 && i <= 879)
|
|
214
|
+
continue;
|
|
215
|
+
switch (eD.eastAsianWidth(s)) {
|
|
216
|
+
case "F":
|
|
217
|
+
case "W":
|
|
218
|
+
F += 2;
|
|
219
|
+
break;
|
|
220
|
+
case "A":
|
|
221
|
+
F += t;
|
|
222
|
+
break;
|
|
223
|
+
default:
|
|
224
|
+
F += 1;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return F;
|
|
228
|
+
}
|
|
229
|
+
var w = 10;
|
|
230
|
+
var N = (e = 0) => (u) => `\x1B[${u + e}m`;
|
|
231
|
+
var I = (e = 0) => (u) => `\x1B[${38 + e};5;${u}m`;
|
|
232
|
+
var R = (e = 0) => (u, t, F) => `\x1B[${38 + e};2;${u};${t};${F}m`;
|
|
233
|
+
var r = { modifier: { reset: [0, 0], bold: [1, 22], dim: [2, 22], italic: [3, 23], underline: [4, 24], overline: [53, 55], inverse: [7, 27], hidden: [8, 28], strikethrough: [9, 29] }, color: { black: [30, 39], red: [31, 39], green: [32, 39], yellow: [33, 39], blue: [34, 39], magenta: [35, 39], cyan: [36, 39], white: [37, 39], blackBright: [90, 39], gray: [90, 39], grey: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], blueBright: [94, 39], magentaBright: [95, 39], cyanBright: [96, 39], whiteBright: [97, 39] }, bgColor: { bgBlack: [40, 49], bgRed: [41, 49], bgGreen: [42, 49], bgYellow: [43, 49], bgBlue: [44, 49], bgMagenta: [45, 49], bgCyan: [46, 49], bgWhite: [47, 49], bgBlackBright: [100, 49], bgGray: [100, 49], bgGrey: [100, 49], bgRedBright: [101, 49], bgGreenBright: [102, 49], bgYellowBright: [103, 49], bgBlueBright: [104, 49], bgMagentaBright: [105, 49], bgCyanBright: [106, 49], bgWhiteBright: [107, 49] } };
|
|
234
|
+
Object.keys(r.modifier);
|
|
235
|
+
var iD = Object.keys(r.color);
|
|
236
|
+
var CD = Object.keys(r.bgColor);
|
|
237
|
+
[...iD];
|
|
238
|
+
function rD() {
|
|
239
|
+
const e = new Map;
|
|
240
|
+
for (const [u, t] of Object.entries(r)) {
|
|
241
|
+
for (const [F, s] of Object.entries(t))
|
|
242
|
+
r[F] = { open: `\x1B[${s[0]}m`, close: `\x1B[${s[1]}m` }, t[F] = r[F], e.set(s[0], s[1]);
|
|
243
|
+
Object.defineProperty(r, u, { value: t, enumerable: false });
|
|
244
|
+
}
|
|
245
|
+
return Object.defineProperty(r, "codes", { value: e, enumerable: false }), r.color.close = "\x1B[39m", r.bgColor.close = "\x1B[49m", r.color.ansi = N(), r.color.ansi256 = I(), r.color.ansi16m = R(), r.bgColor.ansi = N(w), r.bgColor.ansi256 = I(w), r.bgColor.ansi16m = R(w), Object.defineProperties(r, { rgbToAnsi256: { value: (u, t, F) => u === t && t === F ? u < 8 ? 16 : u > 248 ? 231 : Math.round((u - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(u / 255 * 5) + 6 * Math.round(t / 255 * 5) + Math.round(F / 255 * 5), enumerable: false }, hexToRgb: { value: (u) => {
|
|
246
|
+
const t = /[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));
|
|
247
|
+
if (!t)
|
|
248
|
+
return [0, 0, 0];
|
|
249
|
+
let [F] = t;
|
|
250
|
+
F.length === 3 && (F = [...F].map((i) => i + i).join(""));
|
|
251
|
+
const s = Number.parseInt(F, 16);
|
|
252
|
+
return [s >> 16 & 255, s >> 8 & 255, s & 255];
|
|
253
|
+
}, enumerable: false }, hexToAnsi256: { value: (u) => r.rgbToAnsi256(...r.hexToRgb(u)), enumerable: false }, ansi256ToAnsi: { value: (u) => {
|
|
254
|
+
if (u < 8)
|
|
255
|
+
return 30 + u;
|
|
256
|
+
if (u < 16)
|
|
257
|
+
return 90 + (u - 8);
|
|
258
|
+
let t, F, s;
|
|
259
|
+
if (u >= 232)
|
|
260
|
+
t = ((u - 232) * 10 + 8) / 255, F = t, s = t;
|
|
261
|
+
else {
|
|
262
|
+
u -= 16;
|
|
263
|
+
const C = u % 36;
|
|
264
|
+
t = Math.floor(u / 36) / 5, F = Math.floor(C / 6) / 5, s = C % 6 / 5;
|
|
265
|
+
}
|
|
266
|
+
const i = Math.max(t, F, s) * 2;
|
|
267
|
+
if (i === 0)
|
|
268
|
+
return 30;
|
|
269
|
+
let D = 30 + (Math.round(s) << 2 | Math.round(F) << 1 | Math.round(t));
|
|
270
|
+
return i === 2 && (D += 60), D;
|
|
271
|
+
}, enumerable: false }, rgbToAnsi: { value: (u, t, F) => r.ansi256ToAnsi(r.rgbToAnsi256(u, t, F)), enumerable: false }, hexToAnsi: { value: (u) => r.ansi256ToAnsi(r.hexToAnsi256(u)), enumerable: false } }), r;
|
|
272
|
+
}
|
|
273
|
+
var ED = rD();
|
|
274
|
+
var d = new Set(["\x1B", "\x9B"]);
|
|
275
|
+
var oD = 39;
|
|
276
|
+
var y = "\x07";
|
|
277
|
+
var V = "[";
|
|
278
|
+
var nD = "]";
|
|
279
|
+
var G = "m";
|
|
280
|
+
var _ = `${nD}8;;`;
|
|
281
|
+
var z = (e) => `${d.values().next().value}${V}${e}${G}`;
|
|
282
|
+
var K = (e) => `${d.values().next().value}${_}${e}${y}`;
|
|
283
|
+
var aD = (e) => e.split(" ").map((u) => p(u));
|
|
284
|
+
var k = (e, u, t) => {
|
|
285
|
+
const F = [...u];
|
|
286
|
+
let s = false, i = false, D = p(P(e[e.length - 1]));
|
|
287
|
+
for (const [C, n] of F.entries()) {
|
|
288
|
+
const E = p(n);
|
|
289
|
+
if (D + E <= t ? e[e.length - 1] += n : (e.push(n), D = 0), d.has(n) && (s = true, i = F.slice(C + 1).join("").startsWith(_)), s) {
|
|
290
|
+
i ? n === y && (s = false, i = false) : n === G && (s = false);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
D += E, D === t && C < F.length - 1 && (e.push(""), D = 0);
|
|
294
|
+
}
|
|
295
|
+
!D && e[e.length - 1].length > 0 && e.length > 1 && (e[e.length - 2] += e.pop());
|
|
296
|
+
};
|
|
297
|
+
var hD = (e) => {
|
|
298
|
+
const u = e.split(" ");
|
|
299
|
+
let t = u.length;
|
|
300
|
+
for (;t > 0 && !(p(u[t - 1]) > 0); )
|
|
301
|
+
t--;
|
|
302
|
+
return t === u.length ? e : u.slice(0, t).join(" ") + u.slice(t).join("");
|
|
303
|
+
};
|
|
304
|
+
var lD = (e, u, t = {}) => {
|
|
305
|
+
if (t.trim !== false && e.trim() === "")
|
|
306
|
+
return "";
|
|
307
|
+
let F = "", s, i;
|
|
308
|
+
const D = aD(e);
|
|
309
|
+
let C = [""];
|
|
310
|
+
for (const [E, a] of e.split(" ").entries()) {
|
|
311
|
+
t.trim !== false && (C[C.length - 1] = C[C.length - 1].trimStart());
|
|
312
|
+
let o = p(C[C.length - 1]);
|
|
313
|
+
if (E !== 0 && (o >= u && (t.wordWrap === false || t.trim === false) && (C.push(""), o = 0), (o > 0 || t.trim === false) && (C[C.length - 1] += " ", o++)), t.hard && D[E] > u) {
|
|
314
|
+
const c = u - o, f = 1 + Math.floor((D[E] - c - 1) / u);
|
|
315
|
+
Math.floor((D[E] - 1) / u) < f && C.push(""), k(C, a, u);
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (o + D[E] > u && o > 0 && D[E] > 0) {
|
|
319
|
+
if (t.wordWrap === false && o < u) {
|
|
320
|
+
k(C, a, u);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
C.push("");
|
|
324
|
+
}
|
|
325
|
+
if (o + D[E] > u && t.wordWrap === false) {
|
|
326
|
+
k(C, a, u);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
C[C.length - 1] += a;
|
|
330
|
+
}
|
|
331
|
+
t.trim !== false && (C = C.map((E) => hD(E)));
|
|
332
|
+
const n = [...C.join(`
|
|
333
|
+
`)];
|
|
334
|
+
for (const [E, a] of n.entries()) {
|
|
335
|
+
if (F += a, d.has(a)) {
|
|
336
|
+
const { groups: c } = new RegExp(`(?:\\${V}(?<code>\\d+)m|\\${_}(?<uri>.*)${y})`).exec(n.slice(E).join("")) || { groups: {} };
|
|
337
|
+
if (c.code !== undefined) {
|
|
338
|
+
const f = Number.parseFloat(c.code);
|
|
339
|
+
s = f === oD ? undefined : f;
|
|
340
|
+
} else
|
|
341
|
+
c.uri !== undefined && (i = c.uri.length === 0 ? undefined : c.uri);
|
|
342
|
+
}
|
|
343
|
+
const o = ED.codes.get(Number(s));
|
|
344
|
+
n[E + 1] === `
|
|
345
|
+
` ? (i && (F += K("")), s && o && (F += z(o))) : a === `
|
|
346
|
+
` && (s && o && (F += z(s)), i && (F += K(i)));
|
|
347
|
+
}
|
|
348
|
+
return F;
|
|
349
|
+
};
|
|
350
|
+
function Y(e, u, t) {
|
|
351
|
+
return String(e).normalize().replace(/\r\n/g, `
|
|
352
|
+
`).split(`
|
|
353
|
+
`).map((F) => lD(F, u, t)).join(`
|
|
354
|
+
`);
|
|
355
|
+
}
|
|
356
|
+
var xD = ["up", "down", "left", "right", "space", "enter", "cancel"];
|
|
357
|
+
var B = { actions: new Set(xD), aliases: new Map([["k", "up"], ["j", "down"], ["h", "left"], ["l", "right"], ["\x03", "cancel"], ["escape", "cancel"]]) };
|
|
358
|
+
function $(e, u) {
|
|
359
|
+
if (typeof e == "string")
|
|
360
|
+
return B.aliases.get(e) === u;
|
|
361
|
+
for (const t of e)
|
|
362
|
+
if (t !== undefined && $(t, u))
|
|
363
|
+
return true;
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
function BD(e, u) {
|
|
367
|
+
if (e === u)
|
|
368
|
+
return;
|
|
369
|
+
const t = e.split(`
|
|
370
|
+
`), F = u.split(`
|
|
371
|
+
`), s = [];
|
|
372
|
+
for (let i = 0;i < Math.max(t.length, F.length); i++)
|
|
373
|
+
t[i] !== F[i] && s.push(i);
|
|
374
|
+
return s;
|
|
375
|
+
}
|
|
376
|
+
var AD = globalThis.process.platform.startsWith("win");
|
|
377
|
+
var S = Symbol("clack:cancel");
|
|
378
|
+
function pD(e) {
|
|
379
|
+
return e === S;
|
|
380
|
+
}
|
|
381
|
+
function m(e, u) {
|
|
382
|
+
const t = e;
|
|
383
|
+
t.isTTY && t.setRawMode(u);
|
|
384
|
+
}
|
|
385
|
+
function fD({ input: e = j, output: u = M, overwrite: t = true, hideCursor: F = true } = {}) {
|
|
386
|
+
const s = g.createInterface({ input: e, output: u, prompt: "", tabSize: 1 });
|
|
387
|
+
g.emitKeypressEvents(e, s), e.isTTY && e.setRawMode(true);
|
|
388
|
+
const i = (D, { name: C, sequence: n }) => {
|
|
389
|
+
const E = String(D);
|
|
390
|
+
if ($([E, C, n], "cancel")) {
|
|
391
|
+
F && u.write(import_sisteransi.cursor.show), process.exit(0);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
if (!t)
|
|
395
|
+
return;
|
|
396
|
+
const a = C === "return" ? 0 : -1, o = C === "return" ? -1 : 0;
|
|
397
|
+
g.moveCursor(u, a, o, () => {
|
|
398
|
+
g.clearLine(u, 1, () => {
|
|
399
|
+
e.once("keypress", i);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
};
|
|
403
|
+
return F && u.write(import_sisteransi.cursor.hide), e.once("keypress", i), () => {
|
|
404
|
+
e.off("keypress", i), F && u.write(import_sisteransi.cursor.show), e.isTTY && !AD && e.setRawMode(false), s.terminal = false, s.close();
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
var gD = Object.defineProperty;
|
|
408
|
+
var vD = (e, u, t) => (u in e) ? gD(e, u, { enumerable: true, configurable: true, writable: true, value: t }) : e[u] = t;
|
|
409
|
+
var h = (e, u, t) => (vD(e, typeof u != "symbol" ? u + "" : u, t), t);
|
|
410
|
+
|
|
411
|
+
class x {
|
|
412
|
+
constructor(u, t = true) {
|
|
413
|
+
h(this, "input"), h(this, "output"), h(this, "_abortSignal"), h(this, "rl"), h(this, "opts"), h(this, "_render"), h(this, "_track", false), h(this, "_prevFrame", ""), h(this, "_subscribers", new Map), h(this, "_cursor", 0), h(this, "state", "initial"), h(this, "error", ""), h(this, "value");
|
|
414
|
+
const { input: F = j, output: s = M, render: i, signal: D, ...C } = u;
|
|
415
|
+
this.opts = C, this.onKeypress = this.onKeypress.bind(this), this.close = this.close.bind(this), this.render = this.render.bind(this), this._render = i.bind(this), this._track = t, this._abortSignal = D, this.input = F, this.output = s;
|
|
416
|
+
}
|
|
417
|
+
unsubscribe() {
|
|
418
|
+
this._subscribers.clear();
|
|
419
|
+
}
|
|
420
|
+
setSubscriber(u, t) {
|
|
421
|
+
const F = this._subscribers.get(u) ?? [];
|
|
422
|
+
F.push(t), this._subscribers.set(u, F);
|
|
423
|
+
}
|
|
424
|
+
on(u, t) {
|
|
425
|
+
this.setSubscriber(u, { cb: t });
|
|
426
|
+
}
|
|
427
|
+
once(u, t) {
|
|
428
|
+
this.setSubscriber(u, { cb: t, once: true });
|
|
429
|
+
}
|
|
430
|
+
emit(u, ...t) {
|
|
431
|
+
const F = this._subscribers.get(u) ?? [], s = [];
|
|
432
|
+
for (const i of F)
|
|
433
|
+
i.cb(...t), i.once && s.push(() => F.splice(F.indexOf(i), 1));
|
|
434
|
+
for (const i of s)
|
|
435
|
+
i();
|
|
436
|
+
}
|
|
437
|
+
prompt() {
|
|
438
|
+
return new Promise((u, t) => {
|
|
439
|
+
if (this._abortSignal) {
|
|
440
|
+
if (this._abortSignal.aborted)
|
|
441
|
+
return this.state = "cancel", this.close(), u(S);
|
|
442
|
+
this._abortSignal.addEventListener("abort", () => {
|
|
443
|
+
this.state = "cancel", this.close();
|
|
444
|
+
}, { once: true });
|
|
445
|
+
}
|
|
446
|
+
const F = new X;
|
|
447
|
+
F._write = (s, i, D) => {
|
|
448
|
+
this._track && (this.value = this.rl?.line.replace(/\t/g, ""), this._cursor = this.rl?.cursor ?? 0, this.emit("value", this.value)), D();
|
|
449
|
+
}, this.input.pipe(F), this.rl = O.createInterface({ input: this.input, output: F, tabSize: 2, prompt: "", escapeCodeTimeout: 50, terminal: true }), O.emitKeypressEvents(this.input, this.rl), this.rl.prompt(), this.opts.initialValue !== undefined && this._track && this.rl.write(this.opts.initialValue), this.input.on("keypress", this.onKeypress), m(this.input, true), this.output.on("resize", this.render), this.render(), this.once("submit", () => {
|
|
450
|
+
this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(this.value);
|
|
451
|
+
}), this.once("cancel", () => {
|
|
452
|
+
this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(S);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
onKeypress(u, t) {
|
|
457
|
+
if (this.state === "error" && (this.state = "active"), t?.name && (!this._track && B.aliases.has(t.name) && this.emit("cursor", B.aliases.get(t.name)), B.actions.has(t.name) && this.emit("cursor", t.name)), u && (u.toLowerCase() === "y" || u.toLowerCase() === "n") && this.emit("confirm", u.toLowerCase() === "y"), u === "\t" && this.opts.placeholder && (this.value || (this.rl?.write(this.opts.placeholder), this.emit("value", this.opts.placeholder))), u && this.emit("key", u.toLowerCase()), t?.name === "return") {
|
|
458
|
+
if (this.opts.validate) {
|
|
459
|
+
const F = this.opts.validate(this.value);
|
|
460
|
+
F && (this.error = F instanceof Error ? F.message : F, this.state = "error", this.rl?.write(this.value));
|
|
461
|
+
}
|
|
462
|
+
this.state !== "error" && (this.state = "submit");
|
|
463
|
+
}
|
|
464
|
+
$([u, t?.name, t?.sequence], "cancel") && (this.state = "cancel"), (this.state === "submit" || this.state === "cancel") && this.emit("finalize"), this.render(), (this.state === "submit" || this.state === "cancel") && this.close();
|
|
465
|
+
}
|
|
466
|
+
close() {
|
|
467
|
+
this.input.unpipe(), this.input.removeListener("keypress", this.onKeypress), this.output.write(`
|
|
468
|
+
`), m(this.input, false), this.rl?.close(), this.rl = undefined, this.emit(`${this.state}`, this.value), this.unsubscribe();
|
|
469
|
+
}
|
|
470
|
+
restoreCursor() {
|
|
471
|
+
const u = Y(this._prevFrame, process.stdout.columns, { hard: true }).split(`
|
|
472
|
+
`).length - 1;
|
|
473
|
+
this.output.write(import_sisteransi.cursor.move(-999, u * -1));
|
|
474
|
+
}
|
|
475
|
+
render() {
|
|
476
|
+
const u = Y(this._render(this) ?? "", process.stdout.columns, { hard: true });
|
|
477
|
+
if (u !== this._prevFrame) {
|
|
478
|
+
if (this.state === "initial")
|
|
479
|
+
this.output.write(import_sisteransi.cursor.hide);
|
|
480
|
+
else {
|
|
481
|
+
const t = BD(this._prevFrame, u);
|
|
482
|
+
if (this.restoreCursor(), t && t?.length === 1) {
|
|
483
|
+
const F = t[0];
|
|
484
|
+
this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.lines(1));
|
|
485
|
+
const s = u.split(`
|
|
486
|
+
`);
|
|
487
|
+
this.output.write(s[F]), this._prevFrame = u, this.output.write(import_sisteransi.cursor.move(0, s.length - F - 1));
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
if (t && t?.length > 1) {
|
|
491
|
+
const F = t[0];
|
|
492
|
+
this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.down());
|
|
493
|
+
const s = u.split(`
|
|
494
|
+
`).slice(F);
|
|
495
|
+
this.output.write(s.join(`
|
|
496
|
+
`)), this._prevFrame = u;
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
this.output.write(import_sisteransi.erase.down());
|
|
500
|
+
}
|
|
501
|
+
this.output.write(u), this.state === "initial" && (this.state = "active"), this._prevFrame = u;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
class dD extends x {
|
|
507
|
+
get cursor() {
|
|
508
|
+
return this.value ? 0 : 1;
|
|
509
|
+
}
|
|
510
|
+
get _value() {
|
|
511
|
+
return this.cursor === 0;
|
|
512
|
+
}
|
|
513
|
+
constructor(u) {
|
|
514
|
+
super(u, false), this.value = !!u.initialValue, this.on("value", () => {
|
|
515
|
+
this.value = this._value;
|
|
516
|
+
}), this.on("confirm", (t) => {
|
|
517
|
+
this.output.write(import_sisteransi.cursor.move(0, -1)), this.value = t, this.state = "submit", this.close();
|
|
518
|
+
}), this.on("cursor", () => {
|
|
519
|
+
this.value = !this.value;
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
var A;
|
|
524
|
+
A = new WeakMap;
|
|
525
|
+
class RD extends x {
|
|
526
|
+
get valueWithCursor() {
|
|
527
|
+
if (this.state === "submit")
|
|
528
|
+
return this.value;
|
|
529
|
+
if (this.cursor >= this.value.length)
|
|
530
|
+
return `${this.value}\u2588`;
|
|
531
|
+
const u = this.value.slice(0, this.cursor), [t, ...F] = this.value.slice(this.cursor);
|
|
532
|
+
return `${u}${import_picocolors.default.inverse(t)}${F.join("")}`;
|
|
533
|
+
}
|
|
534
|
+
get cursor() {
|
|
535
|
+
return this._cursor;
|
|
536
|
+
}
|
|
537
|
+
constructor(u) {
|
|
538
|
+
super(u), this.on("finalize", () => {
|
|
539
|
+
this.value || (this.value = u.defaultValue);
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// ../../node_modules/@clack/prompts/dist/index.mjs
|
|
545
|
+
var import_picocolors2 = __toESM(require_picocolors(), 1);
|
|
546
|
+
var import_sisteransi2 = __toESM(require_src(), 1);
|
|
547
|
+
import y2 from "process";
|
|
548
|
+
function ce() {
|
|
549
|
+
return y2.platform !== "win32" ? y2.env.TERM !== "linux" : !!y2.env.CI || !!y2.env.WT_SESSION || !!y2.env.TERMINUS_SUBLIME || y2.env.ConEmuTask === "{cmd::Cmder}" || y2.env.TERM_PROGRAM === "Terminus-Sublime" || y2.env.TERM_PROGRAM === "vscode" || y2.env.TERM === "xterm-256color" || y2.env.TERM === "alacritty" || y2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
550
|
+
}
|
|
551
|
+
var V2 = ce();
|
|
552
|
+
var u = (t, n) => V2 ? t : n;
|
|
553
|
+
var le = u("\u25C6", "*");
|
|
554
|
+
var L2 = u("\u25A0", "x");
|
|
555
|
+
var W2 = u("\u25B2", "x");
|
|
556
|
+
var C = u("\u25C7", "o");
|
|
557
|
+
var ue = u("\u250C", "T");
|
|
558
|
+
var o = u("\u2502", "|");
|
|
559
|
+
var d2 = u("\u2514", "\u2014");
|
|
560
|
+
var k2 = u("\u25CF", ">");
|
|
561
|
+
var P2 = u("\u25CB", " ");
|
|
562
|
+
var A2 = u("\u25FB", "[\u2022]");
|
|
563
|
+
var T = u("\u25FC", "[+]");
|
|
564
|
+
var F = u("\u25FB", "[ ]");
|
|
565
|
+
var $e = u("\u25AA", "\u2022");
|
|
566
|
+
var _2 = u("\u2500", "-");
|
|
567
|
+
var me = u("\u256E", "+");
|
|
568
|
+
var de = u("\u251C", "+");
|
|
569
|
+
var pe = u("\u256F", "+");
|
|
570
|
+
var q = u("\u25CF", "\u2022");
|
|
571
|
+
var D = u("\u25C6", "*");
|
|
572
|
+
var U = u("\u25B2", "!");
|
|
573
|
+
var K2 = u("\u25A0", "x");
|
|
574
|
+
var b2 = (t) => {
|
|
575
|
+
switch (t) {
|
|
576
|
+
case "initial":
|
|
577
|
+
case "active":
|
|
578
|
+
return import_picocolors2.default.cyan(le);
|
|
579
|
+
case "cancel":
|
|
580
|
+
return import_picocolors2.default.red(L2);
|
|
581
|
+
case "error":
|
|
582
|
+
return import_picocolors2.default.yellow(W2);
|
|
583
|
+
case "submit":
|
|
584
|
+
return import_picocolors2.default.green(C);
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
var he = (t) => new RD({ validate: t.validate, placeholder: t.placeholder, defaultValue: t.defaultValue, initialValue: t.initialValue, render() {
|
|
588
|
+
const n = `${import_picocolors2.default.gray(o)}
|
|
589
|
+
${b2(this.state)} ${t.message}
|
|
590
|
+
`, r2 = t.placeholder ? import_picocolors2.default.inverse(t.placeholder[0]) + import_picocolors2.default.dim(t.placeholder.slice(1)) : import_picocolors2.default.inverse(import_picocolors2.default.hidden("_")), i = this.value ? this.valueWithCursor : r2;
|
|
591
|
+
switch (this.state) {
|
|
592
|
+
case "error":
|
|
593
|
+
return `${n.trim()}
|
|
594
|
+
${import_picocolors2.default.yellow(o)} ${i}
|
|
595
|
+
${import_picocolors2.default.yellow(d2)} ${import_picocolors2.default.yellow(this.error)}
|
|
596
|
+
`;
|
|
597
|
+
case "submit":
|
|
598
|
+
return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(this.value || t.placeholder)}`;
|
|
599
|
+
case "cancel":
|
|
600
|
+
return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(this.value ?? ""))}${this.value?.trim() ? `
|
|
601
|
+
${import_picocolors2.default.gray(o)}` : ""}`;
|
|
602
|
+
default:
|
|
603
|
+
return `${n}${import_picocolors2.default.cyan(o)} ${i}
|
|
604
|
+
${import_picocolors2.default.cyan(d2)}
|
|
605
|
+
`;
|
|
606
|
+
}
|
|
607
|
+
} }).prompt();
|
|
608
|
+
var ye = (t) => {
|
|
609
|
+
const n = t.active ?? "Yes", r2 = t.inactive ?? "No";
|
|
610
|
+
return new dD({ active: n, inactive: r2, initialValue: t.initialValue ?? true, render() {
|
|
611
|
+
const i = `${import_picocolors2.default.gray(o)}
|
|
612
|
+
${b2(this.state)} ${t.message}
|
|
613
|
+
`, s = this.value ? n : r2;
|
|
614
|
+
switch (this.state) {
|
|
615
|
+
case "submit":
|
|
616
|
+
return `${i}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(s)}`;
|
|
617
|
+
case "cancel":
|
|
618
|
+
return `${i}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(s))}
|
|
619
|
+
${import_picocolors2.default.gray(o)}`;
|
|
620
|
+
default:
|
|
621
|
+
return `${i}${import_picocolors2.default.cyan(o)} ${this.value ? `${import_picocolors2.default.green(k2)} ${n}` : `${import_picocolors2.default.dim(P2)} ${import_picocolors2.default.dim(n)}`} ${import_picocolors2.default.dim("/")} ${this.value ? `${import_picocolors2.default.dim(P2)} ${import_picocolors2.default.dim(r2)}` : `${import_picocolors2.default.green(k2)} ${r2}`}
|
|
622
|
+
${import_picocolors2.default.cyan(d2)}
|
|
623
|
+
`;
|
|
624
|
+
}
|
|
625
|
+
} }).prompt();
|
|
626
|
+
};
|
|
627
|
+
var xe = (t = "") => {
|
|
628
|
+
process.stdout.write(`${import_picocolors2.default.gray(d2)} ${import_picocolors2.default.red(t)}
|
|
629
|
+
|
|
630
|
+
`);
|
|
631
|
+
};
|
|
632
|
+
var Ie = (t = "") => {
|
|
633
|
+
process.stdout.write(`${import_picocolors2.default.gray(ue)} ${t}
|
|
634
|
+
`);
|
|
635
|
+
};
|
|
636
|
+
var Se = (t = "") => {
|
|
637
|
+
process.stdout.write(`${import_picocolors2.default.gray(o)}
|
|
638
|
+
${import_picocolors2.default.gray(d2)} ${t}
|
|
639
|
+
|
|
640
|
+
`);
|
|
641
|
+
};
|
|
642
|
+
var M2 = { message: (t = "", { symbol: n = import_picocolors2.default.gray(o) } = {}) => {
|
|
643
|
+
const r2 = [`${import_picocolors2.default.gray(o)}`];
|
|
644
|
+
if (t) {
|
|
645
|
+
const [i, ...s] = t.split(`
|
|
646
|
+
`);
|
|
647
|
+
r2.push(`${n} ${i}`, ...s.map((c) => `${import_picocolors2.default.gray(o)} ${c}`));
|
|
648
|
+
}
|
|
649
|
+
process.stdout.write(`${r2.join(`
|
|
650
|
+
`)}
|
|
651
|
+
`);
|
|
652
|
+
}, info: (t) => {
|
|
653
|
+
M2.message(t, { symbol: import_picocolors2.default.blue(q) });
|
|
654
|
+
}, success: (t) => {
|
|
655
|
+
M2.message(t, { symbol: import_picocolors2.default.green(D) });
|
|
656
|
+
}, step: (t) => {
|
|
657
|
+
M2.message(t, { symbol: import_picocolors2.default.green(C) });
|
|
658
|
+
}, warn: (t) => {
|
|
659
|
+
M2.message(t, { symbol: import_picocolors2.default.yellow(U) });
|
|
660
|
+
}, warning: (t) => {
|
|
661
|
+
M2.warn(t);
|
|
662
|
+
}, error: (t) => {
|
|
663
|
+
M2.message(t, { symbol: import_picocolors2.default.red(K2) });
|
|
664
|
+
} };
|
|
665
|
+
var J = `${import_picocolors2.default.gray(o)} `;
|
|
666
|
+
var Y2 = ({ indicator: t = "dots" } = {}) => {
|
|
667
|
+
const n = V2 ? ["\u25D2", "\u25D0", "\u25D3", "\u25D1"] : ["\u2022", "o", "O", "0"], r2 = V2 ? 80 : 120, i = process.env.CI === "true";
|
|
668
|
+
let s, c, a = false, l2 = "", $2, g2 = performance.now();
|
|
669
|
+
const p2 = (m2) => {
|
|
670
|
+
const h2 = m2 > 1 ? "Something went wrong" : "Canceled";
|
|
671
|
+
a && N2(h2, m2);
|
|
672
|
+
}, v2 = () => p2(2), f = () => p2(1), j2 = () => {
|
|
673
|
+
process.on("uncaughtExceptionMonitor", v2), process.on("unhandledRejection", v2), process.on("SIGINT", f), process.on("SIGTERM", f), process.on("exit", p2);
|
|
674
|
+
}, E = () => {
|
|
675
|
+
process.removeListener("uncaughtExceptionMonitor", v2), process.removeListener("unhandledRejection", v2), process.removeListener("SIGINT", f), process.removeListener("SIGTERM", f), process.removeListener("exit", p2);
|
|
676
|
+
}, B2 = () => {
|
|
677
|
+
if ($2 === undefined)
|
|
678
|
+
return;
|
|
679
|
+
i && process.stdout.write(`
|
|
680
|
+
`);
|
|
681
|
+
const m2 = $2.split(`
|
|
682
|
+
`);
|
|
683
|
+
process.stdout.write(import_sisteransi2.cursor.move(-999, m2.length - 1)), process.stdout.write(import_sisteransi2.erase.down(m2.length));
|
|
684
|
+
}, R2 = (m2) => m2.replace(/\.+$/, ""), O2 = (m2) => {
|
|
685
|
+
const h2 = (performance.now() - m2) / 1000, w2 = Math.floor(h2 / 60), I2 = Math.floor(h2 % 60);
|
|
686
|
+
return w2 > 0 ? `[${w2}m ${I2}s]` : `[${I2}s]`;
|
|
687
|
+
}, H = (m2 = "") => {
|
|
688
|
+
a = true, s = fD(), l2 = R2(m2), g2 = performance.now(), process.stdout.write(`${import_picocolors2.default.gray(o)}
|
|
689
|
+
`);
|
|
690
|
+
let h2 = 0, w2 = 0;
|
|
691
|
+
j2(), c = setInterval(() => {
|
|
692
|
+
if (i && l2 === $2)
|
|
693
|
+
return;
|
|
694
|
+
B2(), $2 = l2;
|
|
695
|
+
const I2 = import_picocolors2.default.magenta(n[h2]);
|
|
696
|
+
if (i)
|
|
697
|
+
process.stdout.write(`${I2} ${l2}...`);
|
|
698
|
+
else if (t === "timer")
|
|
699
|
+
process.stdout.write(`${I2} ${l2} ${O2(g2)}`);
|
|
700
|
+
else {
|
|
701
|
+
const z2 = ".".repeat(Math.floor(w2)).slice(0, 3);
|
|
702
|
+
process.stdout.write(`${I2} ${l2}${z2}`);
|
|
703
|
+
}
|
|
704
|
+
h2 = h2 + 1 < n.length ? h2 + 1 : 0, w2 = w2 < n.length ? w2 + 0.125 : 0;
|
|
705
|
+
}, r2);
|
|
706
|
+
}, N2 = (m2 = "", h2 = 0) => {
|
|
707
|
+
a = false, clearInterval(c), B2();
|
|
708
|
+
const w2 = h2 === 0 ? import_picocolors2.default.green(C) : h2 === 1 ? import_picocolors2.default.red(L2) : import_picocolors2.default.red(W2);
|
|
709
|
+
l2 = R2(m2 ?? l2), t === "timer" ? process.stdout.write(`${w2} ${l2} ${O2(g2)}
|
|
710
|
+
`) : process.stdout.write(`${w2} ${l2}
|
|
711
|
+
`), E(), s();
|
|
712
|
+
};
|
|
713
|
+
return { start: H, stop: N2, message: (m2 = "") => {
|
|
714
|
+
l2 = R2(m2 ?? l2);
|
|
715
|
+
} };
|
|
716
|
+
};
|
|
717
|
+
var Ce = async (t, n) => {
|
|
718
|
+
const r2 = {}, i = Object.keys(t);
|
|
719
|
+
for (const s of i) {
|
|
720
|
+
const c = t[s], a = await c({ results: r2 })?.catch((l2) => {
|
|
721
|
+
throw l2;
|
|
722
|
+
});
|
|
723
|
+
if (typeof n?.onCancel == "function" && pD(a)) {
|
|
724
|
+
r2[s] = "canceled", n.onCancel({ results: r2 });
|
|
725
|
+
continue;
|
|
726
|
+
}
|
|
727
|
+
r2[s] = a;
|
|
728
|
+
}
|
|
729
|
+
return r2;
|
|
730
|
+
};
|
|
731
|
+
// ../../tools/utils/colors.ts
|
|
732
|
+
var isColorEnabled = !process.env.NO_COLOR && (process.env.FORCE_COLOR || process.stdout.isTTY);
|
|
733
|
+
var baseColors = ["blue", "cyan", "gray", "green", "magenta", "red", "white", "yellow"];
|
|
734
|
+
var baseDecorations = ["bold", "dim", "italic", "underline", "reset"];
|
|
735
|
+
var ansiCodes = {
|
|
736
|
+
bold: "\x1B[1m",
|
|
737
|
+
dim: "\x1B[2m",
|
|
738
|
+
italic: "\x1B[3m",
|
|
739
|
+
reset: "\x1B[0m",
|
|
740
|
+
underline: "\x1B[4m"
|
|
741
|
+
};
|
|
742
|
+
var brightColorMap = {
|
|
743
|
+
"\x1B[30m": "\x1B[90m",
|
|
744
|
+
"\x1B[31m": "\x1B[91m",
|
|
745
|
+
"\x1B[32m": "\x1B[92m",
|
|
746
|
+
"\x1B[33m": "\x1B[93m",
|
|
747
|
+
"\x1B[34m": "\x1B[94m",
|
|
748
|
+
"\x1B[35m": "\x1B[95m",
|
|
749
|
+
"\x1B[36m": "\x1B[96m",
|
|
750
|
+
"\x1B[37m": "\x1B[97m"
|
|
751
|
+
};
|
|
752
|
+
function colorize(colorCode) {
|
|
753
|
+
return (text) => isColorEnabled ? `${colorCode}${text}${ansiCodes.reset}` : text;
|
|
754
|
+
}
|
|
755
|
+
function getColorCode({ bright = false, color }) {
|
|
756
|
+
const baseColor = Bun.color(color, "ansi");
|
|
757
|
+
if (!baseColor)
|
|
758
|
+
return "";
|
|
759
|
+
return bright ? brightColorMap[baseColor] || baseColor : baseColor;
|
|
760
|
+
}
|
|
761
|
+
var colorDecorations = baseColors.reduce((acc, color) => {
|
|
762
|
+
acc[color] = colorize(getColorCode({ color }));
|
|
763
|
+
acc[`${color}Bright`] = colorize(getColorCode({ bright: true, color }));
|
|
764
|
+
return acc;
|
|
765
|
+
}, {});
|
|
766
|
+
var decorations = baseDecorations.reduce((acc, decoration) => {
|
|
767
|
+
acc[decoration] = colorize(ansiCodes[decoration]);
|
|
768
|
+
return acc;
|
|
769
|
+
}, {});
|
|
770
|
+
var colors = { ...colorDecorations, ...decorations };
|
|
771
|
+
// ../../node_modules/fastest-levenshtein/esm/mod.js
|
|
772
|
+
var peq = new Uint32Array(65536);
|
|
773
|
+
var myers_32 = (a, b3) => {
|
|
774
|
+
const n = a.length;
|
|
775
|
+
const m2 = b3.length;
|
|
776
|
+
const lst = 1 << n - 1;
|
|
777
|
+
let pv = -1;
|
|
778
|
+
let mv = 0;
|
|
779
|
+
let sc = n;
|
|
780
|
+
let i = n;
|
|
781
|
+
while (i--) {
|
|
782
|
+
peq[a.charCodeAt(i)] |= 1 << i;
|
|
783
|
+
}
|
|
784
|
+
for (i = 0;i < m2; i++) {
|
|
785
|
+
let eq = peq[b3.charCodeAt(i)];
|
|
786
|
+
const xv = eq | mv;
|
|
787
|
+
eq |= (eq & pv) + pv ^ pv;
|
|
788
|
+
mv |= ~(eq | pv);
|
|
789
|
+
pv &= eq;
|
|
790
|
+
if (mv & lst) {
|
|
791
|
+
sc++;
|
|
792
|
+
}
|
|
793
|
+
if (pv & lst) {
|
|
794
|
+
sc--;
|
|
795
|
+
}
|
|
796
|
+
mv = mv << 1 | 1;
|
|
797
|
+
pv = pv << 1 | ~(xv | mv);
|
|
798
|
+
mv &= xv;
|
|
799
|
+
}
|
|
800
|
+
i = n;
|
|
801
|
+
while (i--) {
|
|
802
|
+
peq[a.charCodeAt(i)] = 0;
|
|
803
|
+
}
|
|
804
|
+
return sc;
|
|
805
|
+
};
|
|
806
|
+
var myers_x = (b3, a) => {
|
|
807
|
+
const n = a.length;
|
|
808
|
+
const m2 = b3.length;
|
|
809
|
+
const mhc = [];
|
|
810
|
+
const phc = [];
|
|
811
|
+
const hsize = Math.ceil(n / 32);
|
|
812
|
+
const vsize = Math.ceil(m2 / 32);
|
|
813
|
+
for (let i = 0;i < hsize; i++) {
|
|
814
|
+
phc[i] = -1;
|
|
815
|
+
mhc[i] = 0;
|
|
816
|
+
}
|
|
817
|
+
let j2 = 0;
|
|
818
|
+
for (;j2 < vsize - 1; j2++) {
|
|
819
|
+
let mv2 = 0;
|
|
820
|
+
let pv2 = -1;
|
|
821
|
+
const start2 = j2 * 32;
|
|
822
|
+
const vlen2 = Math.min(32, m2) + start2;
|
|
823
|
+
for (let k3 = start2;k3 < vlen2; k3++) {
|
|
824
|
+
peq[b3.charCodeAt(k3)] |= 1 << k3;
|
|
825
|
+
}
|
|
826
|
+
for (let i = 0;i < n; i++) {
|
|
827
|
+
const eq = peq[a.charCodeAt(i)];
|
|
828
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
829
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
830
|
+
const xv = eq | mv2;
|
|
831
|
+
const xh = ((eq | mb) & pv2) + pv2 ^ pv2 | eq | mb;
|
|
832
|
+
let ph = mv2 | ~(xh | pv2);
|
|
833
|
+
let mh = pv2 & xh;
|
|
834
|
+
if (ph >>> 31 ^ pb) {
|
|
835
|
+
phc[i / 32 | 0] ^= 1 << i;
|
|
836
|
+
}
|
|
837
|
+
if (mh >>> 31 ^ mb) {
|
|
838
|
+
mhc[i / 32 | 0] ^= 1 << i;
|
|
839
|
+
}
|
|
840
|
+
ph = ph << 1 | pb;
|
|
841
|
+
mh = mh << 1 | mb;
|
|
842
|
+
pv2 = mh | ~(xv | ph);
|
|
843
|
+
mv2 = ph & xv;
|
|
844
|
+
}
|
|
845
|
+
for (let k3 = start2;k3 < vlen2; k3++) {
|
|
846
|
+
peq[b3.charCodeAt(k3)] = 0;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
let mv = 0;
|
|
850
|
+
let pv = -1;
|
|
851
|
+
const start = j2 * 32;
|
|
852
|
+
const vlen = Math.min(32, m2 - start) + start;
|
|
853
|
+
for (let k3 = start;k3 < vlen; k3++) {
|
|
854
|
+
peq[b3.charCodeAt(k3)] |= 1 << k3;
|
|
855
|
+
}
|
|
856
|
+
let score = m2;
|
|
857
|
+
for (let i = 0;i < n; i++) {
|
|
858
|
+
const eq = peq[a.charCodeAt(i)];
|
|
859
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
860
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
861
|
+
const xv = eq | mv;
|
|
862
|
+
const xh = ((eq | mb) & pv) + pv ^ pv | eq | mb;
|
|
863
|
+
let ph = mv | ~(xh | pv);
|
|
864
|
+
let mh = pv & xh;
|
|
865
|
+
score += ph >>> m2 - 1 & 1;
|
|
866
|
+
score -= mh >>> m2 - 1 & 1;
|
|
867
|
+
if (ph >>> 31 ^ pb) {
|
|
868
|
+
phc[i / 32 | 0] ^= 1 << i;
|
|
869
|
+
}
|
|
870
|
+
if (mh >>> 31 ^ mb) {
|
|
871
|
+
mhc[i / 32 | 0] ^= 1 << i;
|
|
872
|
+
}
|
|
873
|
+
ph = ph << 1 | pb;
|
|
874
|
+
mh = mh << 1 | mb;
|
|
875
|
+
pv = mh | ~(xv | ph);
|
|
876
|
+
mv = ph & xv;
|
|
877
|
+
}
|
|
878
|
+
for (let k3 = start;k3 < vlen; k3++) {
|
|
879
|
+
peq[b3.charCodeAt(k3)] = 0;
|
|
880
|
+
}
|
|
881
|
+
return score;
|
|
882
|
+
};
|
|
883
|
+
var distance = (a, b3) => {
|
|
884
|
+
if (a.length < b3.length) {
|
|
885
|
+
const tmp = b3;
|
|
886
|
+
b3 = a;
|
|
887
|
+
a = tmp;
|
|
888
|
+
}
|
|
889
|
+
if (b3.length === 0) {
|
|
890
|
+
return a.length;
|
|
891
|
+
}
|
|
892
|
+
if (a.length <= 32) {
|
|
893
|
+
return myers_32(a, b3);
|
|
894
|
+
}
|
|
895
|
+
return myers_x(a, b3);
|
|
896
|
+
};
|
|
897
|
+
|
|
898
|
+
// ../core/src/fuzzy-match.ts
|
|
899
|
+
function getSuggestions(input, options, maxSuggestions = 3) {
|
|
900
|
+
const distances = options.map((option) => ({
|
|
901
|
+
distance: distance(input.toLowerCase(), option.toLowerCase()),
|
|
902
|
+
option
|
|
903
|
+
}));
|
|
904
|
+
const suggestions = distances.filter(({ distance: distance2 }) => distance2 <= Math.max(3, input.length / 2)).sort((a, b3) => a.distance - b3.distance).slice(0, maxSuggestions).map(({ option }) => option);
|
|
905
|
+
return suggestions;
|
|
906
|
+
}
|
|
907
|
+
function checkCommonMistakes(input, mistakesMap) {
|
|
908
|
+
return mistakesMap[input.toLowerCase()] || null;
|
|
909
|
+
}
|
|
910
|
+
// ../core/src/graceful.ts
|
|
911
|
+
async function gracefulTry(operation, options = {}) {
|
|
912
|
+
const { fallback, logLevel = "warn", message = "Operation failed gracefully" } = options;
|
|
913
|
+
try {
|
|
914
|
+
return await operation();
|
|
915
|
+
} catch (error) {
|
|
916
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
917
|
+
console[logLevel](`${message}: ${errorMessage}`);
|
|
918
|
+
if (fallback) {
|
|
919
|
+
try {
|
|
920
|
+
await fallback();
|
|
921
|
+
} catch (fallbackError) {
|
|
922
|
+
console.error(`Fallback also failed: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
// ../../tools/utils/logger.ts
|
|
929
|
+
var createLogger = ({
|
|
930
|
+
prefix = "",
|
|
931
|
+
level = process.env.DEBUG ? 0 /* DEBUG */ : 1 /* INFO */
|
|
932
|
+
} = {}) => {
|
|
933
|
+
function debug(...args) {
|
|
934
|
+
if (level <= 0 /* DEBUG */) {
|
|
935
|
+
const message = args.join(" ");
|
|
936
|
+
console.log(format({ level: colors.dim("DEBUG"), message, prefix }));
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
function info(...args) {
|
|
940
|
+
if (level <= 1 /* INFO */) {
|
|
941
|
+
const message = args.join(" ");
|
|
942
|
+
console.info(format({ level: colors.cyan("INFO "), message, prefix }));
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
function warn(...args) {
|
|
946
|
+
if (level <= 2 /* WARN */) {
|
|
947
|
+
const message = args.join(" ");
|
|
948
|
+
console.warn(format({ level: colors.yellow("WARN "), message, prefix }));
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
function error(...args) {
|
|
952
|
+
if (level <= 3 /* ERROR */) {
|
|
953
|
+
const message = args.join(" ");
|
|
954
|
+
console.error(format({ level: colors.red("ERROR"), message, prefix }));
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
function child(childPrefix) {
|
|
958
|
+
return createLogger({ level, prefix: `${prefix}:${childPrefix}` });
|
|
959
|
+
}
|
|
960
|
+
return { child, debug, error, info, warn };
|
|
961
|
+
};
|
|
962
|
+
var logger = createLogger();
|
|
963
|
+
function format({ prefix, level, message }) {
|
|
964
|
+
const timestamp = new Date().toISOString().split("T")[1]?.split(".")[0] || "";
|
|
965
|
+
const formatPrefix = prefix ? `[${prefix}] ` : "";
|
|
966
|
+
return `${colors.dim(timestamp || "")} ${level} ${formatPrefix}${message}`;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// ../core/src/retry.ts
|
|
970
|
+
var DEFAULT_OPTIONS = {
|
|
971
|
+
backoffMultiplier: 2,
|
|
972
|
+
initialDelay: 1000,
|
|
973
|
+
maxAttempts: 3,
|
|
974
|
+
maxDelay: 30000,
|
|
975
|
+
onRetry: (attempt, error) => {
|
|
976
|
+
logger.warn(`Retry attempt ${attempt}: ${error.message}`);
|
|
977
|
+
},
|
|
978
|
+
retryableErrors: [
|
|
979
|
+
"ECONNREFUSED",
|
|
980
|
+
"ECONNRESET",
|
|
981
|
+
"ETIMEDOUT",
|
|
982
|
+
"ENOTFOUND",
|
|
983
|
+
"rate limit",
|
|
984
|
+
"429",
|
|
985
|
+
"503",
|
|
986
|
+
"502",
|
|
987
|
+
"504",
|
|
988
|
+
"npm ERR!",
|
|
989
|
+
"EPUBLISHCONFLICT"
|
|
990
|
+
]
|
|
991
|
+
};
|
|
992
|
+
async function withRetry(operation, options = {}) {
|
|
993
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
994
|
+
let lastError = new Error("Operation failed");
|
|
995
|
+
for (let attempt = 1;attempt <= opts.maxAttempts; attempt++) {
|
|
996
|
+
try {
|
|
997
|
+
return await operation();
|
|
998
|
+
} catch (error) {
|
|
999
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
1000
|
+
const isRetryable = opts.retryableErrors.some((retryableError) => lastError.message.toLowerCase().includes(retryableError.toLowerCase()));
|
|
1001
|
+
if (!isRetryable || attempt === opts.maxAttempts) {
|
|
1002
|
+
throw lastError;
|
|
1003
|
+
}
|
|
1004
|
+
opts.onRetry(attempt, lastError);
|
|
1005
|
+
const delay = Math.min(opts.initialDelay * opts.backoffMultiplier ** (attempt - 1), opts.maxDelay);
|
|
1006
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
throw lastError;
|
|
1010
|
+
}
|
|
1011
|
+
// ../../node_modules/banditypes/dist/index.js
|
|
1012
|
+
var banditype = (cast) => {
|
|
1013
|
+
cast.map = (extra) => banditype((raw) => extra(cast(raw)));
|
|
1014
|
+
cast.or = (extra) => banditype((raw) => {
|
|
1015
|
+
try {
|
|
1016
|
+
return cast(raw);
|
|
1017
|
+
} catch (err) {
|
|
1018
|
+
return extra(raw);
|
|
1019
|
+
}
|
|
1020
|
+
});
|
|
1021
|
+
return cast;
|
|
1022
|
+
};
|
|
1023
|
+
var fail = () => "bad banditype"();
|
|
1024
|
+
var enums = (items) => banditype((raw) => items.includes(raw) ? raw : fail());
|
|
1025
|
+
var like = (tag) => banditype((raw) => typeof raw === typeof tag ? raw : fail());
|
|
1026
|
+
var string = () => like("");
|
|
1027
|
+
var number = () => like(0);
|
|
1028
|
+
var boolean = () => like(true);
|
|
1029
|
+
var optional = () => like();
|
|
1030
|
+
var instance = (proto) => banditype((raw) => raw instanceof proto ? raw : fail());
|
|
1031
|
+
var record = (castValue) => instance(Object).map((raw) => {
|
|
1032
|
+
const res = {};
|
|
1033
|
+
for (const key in raw) {
|
|
1034
|
+
const f = castValue(raw[key]);
|
|
1035
|
+
f !== undefined && (res[key] = f);
|
|
1036
|
+
}
|
|
1037
|
+
return res;
|
|
1038
|
+
});
|
|
1039
|
+
var object = (schema) => instance(Object).map((raw) => {
|
|
1040
|
+
const res = {};
|
|
1041
|
+
for (const key in schema) {
|
|
1042
|
+
const f = schema[key](raw[key]);
|
|
1043
|
+
f !== undefined && (res[key] = f);
|
|
1044
|
+
}
|
|
1045
|
+
return res;
|
|
1046
|
+
});
|
|
1047
|
+
|
|
1048
|
+
// ../core/src/validator.ts
|
|
1049
|
+
function union(schemaA, schemaB) {
|
|
1050
|
+
return banditype((data) => {
|
|
1051
|
+
try {
|
|
1052
|
+
return schemaA(data);
|
|
1053
|
+
} catch {
|
|
1054
|
+
try {
|
|
1055
|
+
return schemaB(data);
|
|
1056
|
+
} catch {
|
|
1057
|
+
throw new Error("No matching schema in union");
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
1062
|
+
function defaultTo(schema, defaultValue) {
|
|
1063
|
+
return (data) => {
|
|
1064
|
+
if (data === undefined)
|
|
1065
|
+
return defaultValue;
|
|
1066
|
+
return schema(data);
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
1069
|
+
function positiveInt() {
|
|
1070
|
+
return banditype((data) => {
|
|
1071
|
+
const n = number()(data);
|
|
1072
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
1073
|
+
throw new Error("Must be a positive integer");
|
|
1074
|
+
}
|
|
1075
|
+
return n;
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
function url() {
|
|
1079
|
+
return banditype((data) => {
|
|
1080
|
+
const s = string()(data);
|
|
1081
|
+
try {
|
|
1082
|
+
new URL(s);
|
|
1083
|
+
return s;
|
|
1084
|
+
} catch {
|
|
1085
|
+
throw new Error("Must be a valid URL");
|
|
1086
|
+
}
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
function regex(pattern, message) {
|
|
1090
|
+
return banditype((data) => {
|
|
1091
|
+
const s = string()(data);
|
|
1092
|
+
if (!pattern.test(s)) {
|
|
1093
|
+
throw new Error(message || `Must match pattern ${pattern}`);
|
|
1094
|
+
}
|
|
1095
|
+
return s;
|
|
1096
|
+
});
|
|
1097
|
+
}
|
|
1098
|
+
function createSchema(validator) {
|
|
1099
|
+
return {
|
|
1100
|
+
parse(value) {
|
|
1101
|
+
try {
|
|
1102
|
+
return validator(value);
|
|
1103
|
+
} catch (error) {
|
|
1104
|
+
throw new Error(error instanceof Error ? error.message : "Validation failed");
|
|
1105
|
+
}
|
|
1106
|
+
},
|
|
1107
|
+
safeParse(value) {
|
|
1108
|
+
try {
|
|
1109
|
+
return { data: validator(value), success: true };
|
|
1110
|
+
} catch (error) {
|
|
1111
|
+
return {
|
|
1112
|
+
error: error instanceof Error ? error : new Error("Validation failed"),
|
|
1113
|
+
success: false
|
|
1114
|
+
};
|
|
1115
|
+
}
|
|
1116
|
+
},
|
|
1117
|
+
validator
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
1120
|
+
// src/methods/createMachines.ts
|
|
1121
|
+
import { parseArgs } from "util";
|
|
1122
|
+
var {$: $3 } = globalThis.Bun;
|
|
1123
|
+
|
|
1124
|
+
// src/config.ts
|
|
1125
|
+
import { join } from "path";
|
|
1126
|
+
var {$: $2 } = globalThis.Bun;
|
|
1127
|
+
|
|
1128
|
+
// src/constants.ts
|
|
1129
|
+
import { tmpdir } from "os";
|
|
1130
|
+
var PATHS = { MACHINES_DIR: "machines", TEMP_DIR: tmpdir() };
|
|
1131
|
+
|
|
1132
|
+
// src/types.ts
|
|
1133
|
+
var profileValidator = object({
|
|
1134
|
+
directory: defaultTo(string(), "./gh-runners"),
|
|
1135
|
+
labels: union(optional(), string()),
|
|
1136
|
+
name: defaultTo(string(), "runner"),
|
|
1137
|
+
numberOfMachines: defaultTo(positiveInt(), 1),
|
|
1138
|
+
os: defaultTo(enums(["osx", "linux", "windows"]), "linux"),
|
|
1139
|
+
overwrite: defaultTo(boolean(), false),
|
|
1140
|
+
run: defaultTo(boolean(), false),
|
|
1141
|
+
runnerGroup: union(optional(), string()),
|
|
1142
|
+
url: union(optional(), string())
|
|
1143
|
+
});
|
|
1144
|
+
var ProfileSchema = createSchema(profileValidator);
|
|
1145
|
+
var ConfigSchema = createSchema(object({
|
|
1146
|
+
defaultProfile: union(optional(), string()),
|
|
1147
|
+
profiles: record(ProfileSchema.validator)
|
|
1148
|
+
}));
|
|
1149
|
+
|
|
1150
|
+
// src/config.ts
|
|
1151
|
+
var CONFIG_FILE_NAMES = ["hydra.json", ".hydra.json", "hydra.toml", ".hydra.toml"];
|
|
1152
|
+
async function findConfigFile(startPath = process.cwd()) {
|
|
1153
|
+
for (const fileName of CONFIG_FILE_NAMES) {
|
|
1154
|
+
const configPath = join(startPath, fileName);
|
|
1155
|
+
const file = Bun.file(configPath);
|
|
1156
|
+
if (await file.exists()) {
|
|
1157
|
+
return configPath;
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
return null;
|
|
1161
|
+
}
|
|
1162
|
+
async function loadConfig(options) {
|
|
1163
|
+
const configPath = options?.configPath || await findConfigFile();
|
|
1164
|
+
if (!configPath) {
|
|
1165
|
+
return null;
|
|
1166
|
+
}
|
|
1167
|
+
const file = Bun.file(configPath);
|
|
1168
|
+
if (!await file.exists()) {
|
|
1169
|
+
return null;
|
|
1170
|
+
}
|
|
1171
|
+
try {
|
|
1172
|
+
const content = await file.text();
|
|
1173
|
+
const data = configPath.endsWith(".toml") ? await parseToml(content) : JSON.parse(content);
|
|
1174
|
+
return ConfigSchema.parse(data);
|
|
1175
|
+
} catch (error2) {
|
|
1176
|
+
if (error2 instanceof Error) {
|
|
1177
|
+
throw new Error(`Invalid config file: ${error2.message}`);
|
|
1178
|
+
}
|
|
1179
|
+
throw error2;
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
async function getProfile(config, profileName) {
|
|
1183
|
+
if (!config)
|
|
1184
|
+
return null;
|
|
1185
|
+
const name = profileName || config.defaultProfile;
|
|
1186
|
+
if (!name)
|
|
1187
|
+
return null;
|
|
1188
|
+
return config.profiles[name] || null;
|
|
1189
|
+
}
|
|
1190
|
+
async function parseToml(content) {
|
|
1191
|
+
const tempFile = join(PATHS.TEMP_DIR, `hydra-config-${Date.now()}.toml`);
|
|
1192
|
+
await Bun.write(tempFile, content);
|
|
1193
|
+
try {
|
|
1194
|
+
const module = await import(tempFile);
|
|
1195
|
+
await $2`rm -f ${tempFile}`.quiet();
|
|
1196
|
+
return module.default;
|
|
1197
|
+
} catch (error2) {
|
|
1198
|
+
await $2`rm -f ${tempFile}`.quiet();
|
|
1199
|
+
throw new Error(`Failed to parse TOML configuration: ${error2}`);
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
// src/helpers.ts
|
|
1204
|
+
function getPackagePath() {
|
|
1205
|
+
const currentFilePath = import.meta.path;
|
|
1206
|
+
const currentDir = currentFilePath.substring(0, currentFilePath.lastIndexOf("/"));
|
|
1207
|
+
const srcDir = currentDir.substring(0, currentDir.lastIndexOf("/"));
|
|
1208
|
+
return srcDir;
|
|
1209
|
+
}
|
|
1210
|
+
var cliArgsValidator = object({
|
|
1211
|
+
directory: defaultTo(string(), `${process.cwd()}/gh-runners`),
|
|
1212
|
+
labels: union(string(), optional()),
|
|
1213
|
+
name: defaultTo(string(), "runner"),
|
|
1214
|
+
numberOfMachines: defaultTo(regex(/^\d+$/, "Number of machines must be a positive integer"), "1"),
|
|
1215
|
+
os: defaultTo(enums(["osx", "linux", "windows"]), "osx"),
|
|
1216
|
+
overwrite: defaultTo(boolean(), false),
|
|
1217
|
+
run: defaultTo(boolean(), false),
|
|
1218
|
+
token: defaultTo(string(), process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? ""),
|
|
1219
|
+
url: url()
|
|
1220
|
+
});
|
|
1221
|
+
var CliArgsSchema = createSchema(cliArgsValidator);
|
|
1222
|
+
|
|
1223
|
+
// src/lib/worker-manager.ts
|
|
1224
|
+
var logger2 = createLogger({ prefix: "WorkerManager" });
|
|
1225
|
+
|
|
1226
|
+
class WorkerManager {
|
|
1227
|
+
workers = new Set;
|
|
1228
|
+
cleanupRegistered = false;
|
|
1229
|
+
constructor() {
|
|
1230
|
+
this.registerCleanup();
|
|
1231
|
+
}
|
|
1232
|
+
registerCleanup() {
|
|
1233
|
+
if (this.cleanupRegistered)
|
|
1234
|
+
return;
|
|
1235
|
+
this.cleanupRegistered = true;
|
|
1236
|
+
const cleanup = () => {
|
|
1237
|
+
if (this.workers.size > 0) {
|
|
1238
|
+
logger2.info("Cleaning up workers...");
|
|
1239
|
+
}
|
|
1240
|
+
this.terminateAll();
|
|
1241
|
+
};
|
|
1242
|
+
process.on("exit", cleanup);
|
|
1243
|
+
process.on("SIGINT", cleanup);
|
|
1244
|
+
process.on("SIGTERM", cleanup);
|
|
1245
|
+
process.on("uncaughtException", (error2) => {
|
|
1246
|
+
logger2.error("Uncaught exception:", error2);
|
|
1247
|
+
cleanup();
|
|
1248
|
+
process.exit(1);
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
add(worker) {
|
|
1252
|
+
this.workers.add(worker);
|
|
1253
|
+
logger2.debug(`Worker added. Total workers: ${this.workers.size}`);
|
|
1254
|
+
worker.addEventListener("exit", () => {
|
|
1255
|
+
this.workers.delete(worker);
|
|
1256
|
+
logger2.debug(`Worker exited. Remaining workers: ${this.workers.size}`);
|
|
1257
|
+
});
|
|
1258
|
+
}
|
|
1259
|
+
remove(worker) {
|
|
1260
|
+
if (this.workers.has(worker)) {
|
|
1261
|
+
worker.terminate();
|
|
1262
|
+
this.workers.delete(worker);
|
|
1263
|
+
logger2.debug(`Worker removed. Remaining workers: ${this.workers.size}`);
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
terminateAll() {
|
|
1267
|
+
if (this.workers.size > 0) {
|
|
1268
|
+
logger2.info(`Terminating ${this.workers.size} workers...`);
|
|
1269
|
+
for (const worker of this.workers) {
|
|
1270
|
+
try {
|
|
1271
|
+
worker.terminate();
|
|
1272
|
+
} catch (error2) {
|
|
1273
|
+
logger2.error(`Failed to terminate worker:`, error2);
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
this.workers.clear();
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
get size() {
|
|
1280
|
+
return this.workers.size;
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
var workerManager = new WorkerManager;
|
|
1284
|
+
|
|
1285
|
+
// src/methods/createMachines.ts
|
|
1286
|
+
var logger3 = createLogger({ prefix: "createMachines" });
|
|
1287
|
+
async function createMachines() {
|
|
1288
|
+
const args = await getArgs();
|
|
1289
|
+
const { overwrite, directory, numberOfMachines, os, run, name, labels, runnerGroup } = args;
|
|
1290
|
+
let { token, url: url2 } = args;
|
|
1291
|
+
if (!url2) {
|
|
1292
|
+
throw new Error("URL (-u) parameter is required");
|
|
1293
|
+
}
|
|
1294
|
+
if (!token) {
|
|
1295
|
+
const settingsUrl = constructRunnerSettingsUrl(url2);
|
|
1296
|
+
const shouldOpen = await ye({
|
|
1297
|
+
message: `No token provided. Would you like to open GitHub to get a runner token?
|
|
1298
|
+
${settingsUrl}`
|
|
1299
|
+
});
|
|
1300
|
+
if (pD(shouldOpen) || !shouldOpen) {
|
|
1301
|
+
throw new Error("Token is required to create runners");
|
|
1302
|
+
}
|
|
1303
|
+
logger3.info("Opening GitHub runner settings...");
|
|
1304
|
+
await $3`open ${settingsUrl}`.quiet();
|
|
1305
|
+
const tokenInput = await he({
|
|
1306
|
+
message: "Enter the runner registration token:",
|
|
1307
|
+
placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
1308
|
+
validate: (value) => {
|
|
1309
|
+
if (!value || value.trim().length === 0) {
|
|
1310
|
+
return "Token is required";
|
|
1311
|
+
}
|
|
1312
|
+
return;
|
|
1313
|
+
}
|
|
1314
|
+
});
|
|
1315
|
+
if (pD(tokenInput)) {
|
|
1316
|
+
throw new Error("Token is required to create runners");
|
|
1317
|
+
}
|
|
1318
|
+
token = tokenInput.trim();
|
|
1319
|
+
}
|
|
1320
|
+
logger3.info(`Creating ${numberOfMachines} runners in ${directory}`);
|
|
1321
|
+
logger3.debug(`OS: ${os}, Name: ${name}, Labels: ${labels || "none"}`);
|
|
1322
|
+
const directoryExists = await Bun.file(directory).exists();
|
|
1323
|
+
if (directoryExists) {
|
|
1324
|
+
if (overwrite) {
|
|
1325
|
+
logger3.warn(`Directory ${directory} exists, removing...`);
|
|
1326
|
+
await $3`rm -rf ${directory}`;
|
|
1327
|
+
} else {
|
|
1328
|
+
throw new Error(`Directory ${directory} already exists`);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
const runnerBase = await downloadLatestRunnerImage({ directory, os });
|
|
1332
|
+
await extractAndCopyRunnerBase({ directory, numberOfMachines, overwrite, runnerBase });
|
|
1333
|
+
if (!run) {
|
|
1334
|
+
logger3.info("Runners created but not started");
|
|
1335
|
+
return;
|
|
1336
|
+
}
|
|
1337
|
+
startRunners({ directory, labels, name, numberOfMachines, runnerGroup, token, url: url2 });
|
|
1338
|
+
}
|
|
1339
|
+
function constructRunnerSettingsUrl(url2) {
|
|
1340
|
+
try {
|
|
1341
|
+
const parsedUrl = new URL(url2);
|
|
1342
|
+
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
1343
|
+
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
|
|
1344
|
+
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
1345
|
+
return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
1346
|
+
} else if (pathParts.length >= 2) {
|
|
1347
|
+
return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
1348
|
+
}
|
|
1349
|
+
} else {
|
|
1350
|
+
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
1351
|
+
return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
1352
|
+
} else if (pathParts.length >= 2) {
|
|
1353
|
+
return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
return url2;
|
|
1357
|
+
} catch {
|
|
1358
|
+
return url2;
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
async function getArgs() {
|
|
1362
|
+
const { values } = parseArgs({
|
|
1363
|
+
allowPositionals: true,
|
|
1364
|
+
args: Bun.argv,
|
|
1365
|
+
options: {
|
|
1366
|
+
config: { short: "c", type: "string" },
|
|
1367
|
+
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
1368
|
+
labels: { short: "l", type: "string" },
|
|
1369
|
+
name: { default: "runner", short: "n", type: "string" },
|
|
1370
|
+
numberOfMachines: { default: "1", short: "m", type: "string" },
|
|
1371
|
+
os: { default: "osx", short: "s", type: "string" },
|
|
1372
|
+
overwrite: { default: false, short: "f", type: "boolean" },
|
|
1373
|
+
profile: { short: "p", type: "string" },
|
|
1374
|
+
run: { default: false, short: "r", type: "boolean" },
|
|
1375
|
+
runnerGroup: { short: "g", type: "string" },
|
|
1376
|
+
token: { short: "t", type: "string" },
|
|
1377
|
+
url: { short: "u", type: "string" }
|
|
1378
|
+
},
|
|
1379
|
+
strict: true
|
|
1380
|
+
});
|
|
1381
|
+
const config = await loadConfig({ configPath: values.config });
|
|
1382
|
+
const profile = await getProfile(config, values.profile);
|
|
1383
|
+
const baseArgs = {
|
|
1384
|
+
directory: values.directory,
|
|
1385
|
+
labels: values.labels,
|
|
1386
|
+
name: values.name,
|
|
1387
|
+
numberOfMachines: values.numberOfMachines,
|
|
1388
|
+
os: values.os,
|
|
1389
|
+
overwrite: values.overwrite,
|
|
1390
|
+
run: values.run,
|
|
1391
|
+
runnerGroup: values.runnerGroup,
|
|
1392
|
+
token: values.token,
|
|
1393
|
+
url: values.url
|
|
1394
|
+
};
|
|
1395
|
+
if (profile) {
|
|
1396
|
+
return {
|
|
1397
|
+
directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
|
|
1398
|
+
labels: baseArgs.labels ?? profile.labels,
|
|
1399
|
+
name: baseArgs.name ?? profile.name ?? "runner",
|
|
1400
|
+
numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
|
|
1401
|
+
os: baseArgs.os ?? profile.os ?? "osx",
|
|
1402
|
+
overwrite: baseArgs.overwrite ?? profile.overwrite ?? false,
|
|
1403
|
+
run: baseArgs.run ?? profile.run ?? false,
|
|
1404
|
+
runnerGroup: baseArgs.runnerGroup ?? profile.runnerGroup,
|
|
1405
|
+
token: baseArgs.token,
|
|
1406
|
+
url: baseArgs.url ?? profile.url
|
|
1407
|
+
};
|
|
1408
|
+
}
|
|
1409
|
+
return {
|
|
1410
|
+
directory: baseArgs.directory,
|
|
1411
|
+
labels: baseArgs.labels,
|
|
1412
|
+
name: baseArgs.name,
|
|
1413
|
+
numberOfMachines: baseArgs.numberOfMachines,
|
|
1414
|
+
os: baseArgs.os,
|
|
1415
|
+
overwrite: baseArgs.overwrite,
|
|
1416
|
+
run: baseArgs.run,
|
|
1417
|
+
runnerGroup: baseArgs.runnerGroup,
|
|
1418
|
+
token: baseArgs.token,
|
|
1419
|
+
url: baseArgs.url
|
|
1420
|
+
};
|
|
1421
|
+
}
|
|
1422
|
+
async function downloadLatestRunnerImage({ directory, os }) {
|
|
1423
|
+
const log = logger3.child("download");
|
|
1424
|
+
log.info(`Fetching latest runner version for ${os}...`);
|
|
1425
|
+
const releaseInfo = await withRetry(async () => (await $3`curl -Ls -o /dev/null -w "%{url_effective}" https://github.com/actions/runner/releases/latest`).text(), {
|
|
1426
|
+
onRetry: (attempt, error2) => {
|
|
1427
|
+
log.warn(`Retrying GitHub API call (attempt ${attempt}): ${error2.message}`);
|
|
1428
|
+
}
|
|
1429
|
+
});
|
|
1430
|
+
const lastRelease = (await $3`basename ${releaseInfo}`).text();
|
|
1431
|
+
const version = lastRelease.trim().replace("v", "");
|
|
1432
|
+
const runnerBase = `actions-runner-${os}-x64-${version}.tar.gz`;
|
|
1433
|
+
const githubReleaseUrl = `https://github.com/actions/runner/releases/download/v${version}/${runnerBase}`;
|
|
1434
|
+
log.debug(`Runner version: ${version}`);
|
|
1435
|
+
log.debug(`Download URL: ${githubReleaseUrl}`);
|
|
1436
|
+
await $3`mkdir -p ${directory}`;
|
|
1437
|
+
await $3`mkdir -p ${directory}/machines`;
|
|
1438
|
+
const runnerFileExists = await Bun.file(`${directory}/${runnerBase}`).exists();
|
|
1439
|
+
if (!runnerFileExists) {
|
|
1440
|
+
log.info("Downloading runner image...");
|
|
1441
|
+
await withRetry(async () => await $3`curl -o ${directory}/${runnerBase} -L ${githubReleaseUrl}`, {
|
|
1442
|
+
maxAttempts: 5,
|
|
1443
|
+
onRetry: (attempt, error2) => {
|
|
1444
|
+
log.warn(`Retrying runner download (attempt ${attempt}): ${error2.message}`);
|
|
1445
|
+
}
|
|
1446
|
+
});
|
|
1447
|
+
log.info("Download complete");
|
|
1448
|
+
} else {
|
|
1449
|
+
log.info("Runner image already exists, skipping download");
|
|
1450
|
+
}
|
|
1451
|
+
return runnerBase;
|
|
1452
|
+
}
|
|
1453
|
+
async function extractAndCopyRunnerBase({
|
|
1454
|
+
overwrite,
|
|
1455
|
+
numberOfMachines,
|
|
1456
|
+
directory,
|
|
1457
|
+
runnerBase
|
|
1458
|
+
}) {
|
|
1459
|
+
const log = logger3.child("extract");
|
|
1460
|
+
const numMachines = Number(numberOfMachines);
|
|
1461
|
+
const cpuCount = (() => {
|
|
1462
|
+
try {
|
|
1463
|
+
const result = Bun.spawnSync(["nproc"]);
|
|
1464
|
+
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1465
|
+
} catch {
|
|
1466
|
+
try {
|
|
1467
|
+
const result = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"]);
|
|
1468
|
+
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1469
|
+
} catch {
|
|
1470
|
+
return 4;
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
})();
|
|
1474
|
+
const concurrency = Math.min(Math.max(2, Math.floor(cpuCount / 2)), numMachines, 8);
|
|
1475
|
+
log.info(`Extracting ${numMachines} runners with concurrency of ${concurrency}`);
|
|
1476
|
+
const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
|
|
1477
|
+
execute: async () => {
|
|
1478
|
+
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
1479
|
+
const machineExists = await Bun.file(machineDirectory).exists();
|
|
1480
|
+
if (machineExists) {
|
|
1481
|
+
if (overwrite) {
|
|
1482
|
+
log.debug(`Machine ${runnerIndex} already exists, removing...`);
|
|
1483
|
+
await $3`rm -rf ${machineDirectory}`;
|
|
1484
|
+
} else {
|
|
1485
|
+
log.debug(`Machine ${runnerIndex} already exists, skipping...`);
|
|
1486
|
+
return;
|
|
1487
|
+
}
|
|
1488
|
+
}
|
|
1489
|
+
await $3`mkdir -p ${machineDirectory}`;
|
|
1490
|
+
await $3`tar xzf ${runnerBase} -C ${machineDirectory.replace(`${directory}/`, "")}`.cwd(directory);
|
|
1491
|
+
const runnerPath = `${getPackagePath()}/src/runner`;
|
|
1492
|
+
await $3`cp -R ${runnerPath}/hooks ${machineDirectory}`;
|
|
1493
|
+
await $3`cp -R ${runnerPath}/.runner-env ${machineDirectory}/.runner-env`;
|
|
1494
|
+
log.debug(`Machine ${runnerIndex} extracted successfully`);
|
|
1495
|
+
},
|
|
1496
|
+
runnerIndex
|
|
1497
|
+
}));
|
|
1498
|
+
const results = [];
|
|
1499
|
+
for (let i = 0;i < tasks.length; i += concurrency) {
|
|
1500
|
+
const batch = tasks.slice(i, i + concurrency);
|
|
1501
|
+
const batchResults = await Promise.allSettled(batch.map((task) => task.execute()));
|
|
1502
|
+
for (const [index, result] of batchResults.entries()) {
|
|
1503
|
+
if (result.status === "rejected") {
|
|
1504
|
+
log.error(`Failed to extract runner ${batch[index]?.runnerIndex}: ${result.reason}`);
|
|
1505
|
+
throw result.reason;
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
results.push(...batchResults);
|
|
1509
|
+
}
|
|
1510
|
+
log.info(`Successfully extracted ${numMachines} runners`);
|
|
1511
|
+
}
|
|
1512
|
+
function startRunners({
|
|
1513
|
+
directory,
|
|
1514
|
+
numberOfMachines,
|
|
1515
|
+
token,
|
|
1516
|
+
url: url2,
|
|
1517
|
+
name,
|
|
1518
|
+
labels,
|
|
1519
|
+
runnerGroup
|
|
1520
|
+
}) {
|
|
1521
|
+
logger3.info(`Starting ${numberOfMachines} runners...`);
|
|
1522
|
+
for (let runnerIndex = 1;runnerIndex <= Number(numberOfMachines); runnerIndex++) {
|
|
1523
|
+
const workerPath = `${getPackagePath()}/src/runner-worker.ts`;
|
|
1524
|
+
const workerName = `${name}-${runnerIndex}`;
|
|
1525
|
+
const worker = new Worker(workerPath, { name: workerName, ref: true });
|
|
1526
|
+
worker.addEventListener("open", () => {
|
|
1527
|
+
logger3.info(`Worker ${workerName} started`);
|
|
1528
|
+
worker.postMessage({
|
|
1529
|
+
index: runnerIndex,
|
|
1530
|
+
labels,
|
|
1531
|
+
machineCwd: `${directory}/machines/${runnerIndex}`,
|
|
1532
|
+
name,
|
|
1533
|
+
runnerGroup,
|
|
1534
|
+
token,
|
|
1535
|
+
url: url2
|
|
1536
|
+
});
|
|
1537
|
+
});
|
|
1538
|
+
worker.addEventListener("message", ({ data }) => {
|
|
1539
|
+
const level = data.type === "error" ? "error" : "info";
|
|
1540
|
+
logger3[level](`${workerName}: ${data.message}`);
|
|
1541
|
+
});
|
|
1542
|
+
worker.addEventListener("error", (error2) => {
|
|
1543
|
+
logger3.error(`Worker ${workerName} error:`, error2);
|
|
1544
|
+
});
|
|
1545
|
+
worker.addEventListener("exit", (code) => {
|
|
1546
|
+
logger3.info(`Worker ${workerName} exited with code ${code}`);
|
|
1547
|
+
});
|
|
1548
|
+
workerManager.add(worker);
|
|
1549
|
+
}
|
|
1550
|
+
logger3.info("All workers started. Press Ctrl+C to stop all machines");
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
// src/methods/help.ts
|
|
1554
|
+
var COMMAND_HELP = {
|
|
1555
|
+
create: `
|
|
1556
|
+
hydra create - Create and register new GitHub runner machines
|
|
1557
|
+
|
|
1558
|
+
USAGE
|
|
1559
|
+
hydra create [options]
|
|
1560
|
+
|
|
1561
|
+
OPTIONS
|
|
1562
|
+
-t, --token GitHub Personal Access Token [string] (required)
|
|
1563
|
+
-u, --url GitHub repository or org URL [string] (required)
|
|
1564
|
+
-m, --numberOfMachines Number of machines [number] (default: 1)
|
|
1565
|
+
-n, --name Runner name prefix [string]
|
|
1566
|
+
-l, --labels Comma-separated runner labels [string]
|
|
1567
|
+
-o, --os Runner OS [string] (default: linux)
|
|
1568
|
+
-d, --directory Runners directory [string]
|
|
1569
|
+
-O, --overwrite Overwrite existing runners [boolean]
|
|
1570
|
+
-p, --profile Configuration profile [string]
|
|
1571
|
+
-c, --config Configuration file path [string]
|
|
1572
|
+
|
|
1573
|
+
EXAMPLES
|
|
1574
|
+
# Create a single runner
|
|
1575
|
+
hydra create -t TOKEN -u https://github.com/org/repo
|
|
1576
|
+
|
|
1577
|
+
# Create 3 runners with labels
|
|
1578
|
+
hydra create -m 3 -t TOKEN -u URL -l docker,gpu
|
|
1579
|
+
|
|
1580
|
+
# Create using profile
|
|
1581
|
+
hydra create -p production -t TOKEN
|
|
1582
|
+
`,
|
|
1583
|
+
init: `
|
|
1584
|
+
hydra init - Initialize a new Hydra configuration file
|
|
1585
|
+
|
|
1586
|
+
USAGE
|
|
1587
|
+
hydra init [options]
|
|
1588
|
+
|
|
1589
|
+
OPTIONS
|
|
1590
|
+
-t, --toml Use TOML format instead of JSON [boolean]
|
|
1591
|
+
|
|
1592
|
+
EXAMPLES
|
|
1593
|
+
# Initialize with interactive prompts
|
|
1594
|
+
hydra init
|
|
1595
|
+
|
|
1596
|
+
# Initialize with TOML format
|
|
1597
|
+
hydra init --toml
|
|
1598
|
+
`,
|
|
1599
|
+
remove: `
|
|
1600
|
+
hydra remove - Remove GitHub runner machines
|
|
1601
|
+
|
|
1602
|
+
USAGE
|
|
1603
|
+
hydra remove [options]
|
|
1604
|
+
|
|
1605
|
+
OPTIONS
|
|
1606
|
+
-t, --token GitHub Personal Access Token [string] (required)
|
|
1607
|
+
-u, --url GitHub repository or org URL [string] (required)
|
|
1608
|
+
-m, --numberOfMachines Number of machines [number] (default: 1)
|
|
1609
|
+
-n, --name Runner name prefix [string]
|
|
1610
|
+
-d, --directory Runners directory [string]
|
|
1611
|
+
-f, --force Force removal [boolean]
|
|
1612
|
+
-p, --profile Configuration profile [string]
|
|
1613
|
+
-c, --config Configuration file path [string]
|
|
1614
|
+
|
|
1615
|
+
EXAMPLES
|
|
1616
|
+
# Remove and unregister
|
|
1617
|
+
hydra remove -t TOKEN -u https://github.com/org/repo
|
|
1618
|
+
|
|
1619
|
+
# Force remove
|
|
1620
|
+
hydra remove -m 2 --force
|
|
1621
|
+
|
|
1622
|
+
# Remove specific runners
|
|
1623
|
+
hydra remove -n custom -m 3 -t TOKEN -u URL
|
|
1624
|
+
`,
|
|
1625
|
+
run: `
|
|
1626
|
+
hydra run - Start existing GitHub runner machines
|
|
1627
|
+
|
|
1628
|
+
USAGE
|
|
1629
|
+
hydra run [options]
|
|
1630
|
+
|
|
1631
|
+
OPTIONS
|
|
1632
|
+
-t, --token GitHub Personal Access Token [string] (required)
|
|
1633
|
+
-u, --url GitHub repository or org URL [string] (required)
|
|
1634
|
+
-m, --numberOfMachines Number of machines [number] (default: 1)
|
|
1635
|
+
-n, --name Runner name prefix [string]
|
|
1636
|
+
-d, --directory Runners directory [string]
|
|
1637
|
+
-p, --profile Configuration profile [string]
|
|
1638
|
+
-c, --config Configuration file path [string]
|
|
1639
|
+
|
|
1640
|
+
EXAMPLES
|
|
1641
|
+
# Run existing runners
|
|
1642
|
+
hydra run -t TOKEN -u https://github.com/org/repo
|
|
1643
|
+
|
|
1644
|
+
# Run specific runners
|
|
1645
|
+
hydra run -m 2 -n custom -t TOKEN -u URL
|
|
1646
|
+
`,
|
|
1647
|
+
status: `
|
|
1648
|
+
hydra status - Check the status of GitHub runner machines
|
|
1649
|
+
|
|
1650
|
+
USAGE
|
|
1651
|
+
hydra status [options]
|
|
1652
|
+
|
|
1653
|
+
OPTIONS
|
|
1654
|
+
-t, --token GitHub Personal Access Token [string] (required)
|
|
1655
|
+
-u, --url GitHub repository or org URL [string] (required)
|
|
1656
|
+
-d, --directory Runners directory [string]
|
|
1657
|
+
-j, --json Output status in JSON format [boolean]
|
|
1658
|
+
-p, --profile Configuration profile [string]
|
|
1659
|
+
-c, --config Configuration file path [string]
|
|
1660
|
+
|
|
1661
|
+
EXAMPLES
|
|
1662
|
+
# Check runner status
|
|
1663
|
+
hydra status -t TOKEN -u https://github.com/org/repo
|
|
1664
|
+
|
|
1665
|
+
# Output as JSON
|
|
1666
|
+
hydra status -t TOKEN -u URL --json
|
|
1667
|
+
|
|
1668
|
+
# Status using profile
|
|
1669
|
+
hydra status -p production
|
|
1670
|
+
`
|
|
1671
|
+
};
|
|
1672
|
+
function help(commandName) {
|
|
1673
|
+
if (commandName && COMMAND_HELP[commandName]) {
|
|
1674
|
+
const helpText = COMMAND_HELP[commandName];
|
|
1675
|
+
const coloredHelp = helpText.split(`
|
|
1676
|
+
`).map((line) => {
|
|
1677
|
+
if (line.startsWith("hydra"))
|
|
1678
|
+
return colors.bold(line);
|
|
1679
|
+
if (line === "USAGE" || line === "OPTIONS" || line === "EXAMPLES")
|
|
1680
|
+
return colors.bold(line);
|
|
1681
|
+
if (line.startsWith(" -")) {
|
|
1682
|
+
const match = line.match(/^(\s+-\w,\s--\w+)\s+(.+)$/);
|
|
1683
|
+
if (match) {
|
|
1684
|
+
const [, flags = "", description = ""] = match;
|
|
1685
|
+
const coloredDesc = description.replace("(required)", colors.red("(required)")).replace(/\(default: ([^)]+)\)/g, (_3, value) => colors.dim(`(default: ${value})`)).replace(/\[boolean\]/g, colors.cyan("[boolean]")).replace(/\[string\]/g, colors.green("[string]")).replace(/\[number\]/g, colors.magenta("[number]"));
|
|
1686
|
+
return ` ${colors.yellow(flags.padEnd(26))} ${coloredDesc}`;
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
if (line.startsWith(" # "))
|
|
1690
|
+
return colors.dim(line);
|
|
1691
|
+
if (line.startsWith(" hydra"))
|
|
1692
|
+
return ` ${colors.cyan(line.trim())}`;
|
|
1693
|
+
return line;
|
|
1694
|
+
}).join(`
|
|
1695
|
+
`);
|
|
1696
|
+
console.info(coloredHelp);
|
|
1697
|
+
return;
|
|
1698
|
+
}
|
|
1699
|
+
console.info(`
|
|
1700
|
+
${colors.bold("Hydra - GitHub self-hosted runner manager")}
|
|
1701
|
+
|
|
1702
|
+
${colors.bold("USAGE")}
|
|
1703
|
+
hydra <command> [options]
|
|
1704
|
+
|
|
1705
|
+
${colors.bold("COMMANDS")}
|
|
1706
|
+
${colors.green("init")} Initialize a new Hydra configuration file
|
|
1707
|
+
${colors.green("create")} Create and register new GitHub runner machines
|
|
1708
|
+
${colors.green("run")} Start existing GitHub runner machines
|
|
1709
|
+
${colors.green("remove")} Remove GitHub runner machines
|
|
1710
|
+
${colors.green("status")} Check the status of GitHub runner machines
|
|
1711
|
+
${colors.green("help")} Show this help message
|
|
1712
|
+
|
|
1713
|
+
Use ${colors.cyan("hydra <command> --help")} for more information about a command.
|
|
1714
|
+
`);
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
// src/methods/init.ts
|
|
1718
|
+
import { resolve } from "path";
|
|
1719
|
+
import { parseArgs as parseArgs2 } from "util";
|
|
1720
|
+
var {$: $4 } = globalThis.Bun;
|
|
1721
|
+
async function init() {
|
|
1722
|
+
const { toml } = getArgs2();
|
|
1723
|
+
const configFileName = toml ? "hydra.toml" : "hydra.json";
|
|
1724
|
+
const configPath = resolve(process.cwd(), configFileName);
|
|
1725
|
+
const file = Bun.file(configPath);
|
|
1726
|
+
if (await file.exists()) {
|
|
1727
|
+
const overwrite = await ye({
|
|
1728
|
+
initialValue: false,
|
|
1729
|
+
message: `Configuration file ${configFileName} already exists. Overwrite?`
|
|
1730
|
+
});
|
|
1731
|
+
if (pD(overwrite) || !overwrite) {
|
|
1732
|
+
xe("Configuration cancelled");
|
|
1733
|
+
process.exit(0);
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
Ie(colors.cyan("\uD83D\uDE80 Hydra Configuration Setup"));
|
|
1737
|
+
console.info(colors.dim("This will create a configuration file with your runner settings."));
|
|
1738
|
+
console.info(colors.dim(`You can always edit the file later or create additional profiles.
|
|
1739
|
+
`));
|
|
1740
|
+
const answers = await Ce({
|
|
1741
|
+
profileName: () => he({ message: "Profile name?", placeholder: "default" }),
|
|
1742
|
+
directory: () => he({
|
|
1743
|
+
defaultValue: "./gh-runners",
|
|
1744
|
+
message: "Directory to store runners?",
|
|
1745
|
+
placeholder: "./gh-runners"
|
|
1746
|
+
}),
|
|
1747
|
+
name: () => he({ defaultValue: "runner", message: "Runner name prefix?", placeholder: "runner" }),
|
|
1748
|
+
labels: ({ results }) => {
|
|
1749
|
+
const placeholder = results.name || "runner";
|
|
1750
|
+
return he({
|
|
1751
|
+
defaultValue: placeholder,
|
|
1752
|
+
message: "Runner labels (comma-separated)?",
|
|
1753
|
+
placeholder
|
|
1754
|
+
});
|
|
1755
|
+
},
|
|
1756
|
+
numberOfMachines: () => he({
|
|
1757
|
+
defaultValue: "1",
|
|
1758
|
+
message: "Number of runner machines?",
|
|
1759
|
+
placeholder: "1",
|
|
1760
|
+
validate: (value) => {
|
|
1761
|
+
const num = Number.parseInt(value, 10);
|
|
1762
|
+
if (Number.isNaN(num) || num < 1)
|
|
1763
|
+
return "Please enter a valid number greater than 0";
|
|
1764
|
+
return;
|
|
1765
|
+
}
|
|
1766
|
+
}),
|
|
1767
|
+
url: () => he({
|
|
1768
|
+
message: "GitHub repository or organization URL? (optional)",
|
|
1769
|
+
placeholder: "https://github.com/org/repo"
|
|
1770
|
+
})
|
|
1771
|
+
}, {
|
|
1772
|
+
onCancel: () => {
|
|
1773
|
+
xe("Configuration cancelled");
|
|
1774
|
+
process.exit(0);
|
|
1775
|
+
}
|
|
1776
|
+
});
|
|
1777
|
+
const { profileName, labels, numberOfMachines, ...profile } = answers;
|
|
1778
|
+
const config = {
|
|
1779
|
+
defaultProfile: profileName,
|
|
1780
|
+
profiles: {
|
|
1781
|
+
[profileName]: {
|
|
1782
|
+
...profile,
|
|
1783
|
+
labels,
|
|
1784
|
+
numberOfMachines: Number.parseInt(numberOfMachines, 10),
|
|
1785
|
+
os: "osx",
|
|
1786
|
+
overwrite: false,
|
|
1787
|
+
run: false
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
};
|
|
1791
|
+
const content = JSON.stringify(config, null, 2);
|
|
1792
|
+
await Bun.write(configPath, content);
|
|
1793
|
+
await gracefulTry(async () => {
|
|
1794
|
+
await $4`chmod 600 ${configPath}`.quiet();
|
|
1795
|
+
}, { logLevel: "warn", message: "Could not set secure file permissions" });
|
|
1796
|
+
Se(colors.green(`\u2713 Configuration saved to ${configFileName}`));
|
|
1797
|
+
console.info(`
|
|
1798
|
+
Example usage:`);
|
|
1799
|
+
console.info(colors.cyan(` hydra create -p ${profileName} --token YOUR_TOKEN${answers.url ? "" : " --url REPO_URL"}`));
|
|
1800
|
+
console.info(`
|
|
1801
|
+
You can add more profiles by editing the configuration file.`);
|
|
1802
|
+
if (answers.url) {
|
|
1803
|
+
await openGitHubSettings(answers.url);
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
async function openGitHubSettings(url2) {
|
|
1807
|
+
const githubRegex = /github\.com[:/]([^/]+)(?:\/([^/.]+))?/;
|
|
1808
|
+
const match = url2.match(githubRegex);
|
|
1809
|
+
if (!match)
|
|
1810
|
+
return;
|
|
1811
|
+
const [, orgOrOwner, repo] = match;
|
|
1812
|
+
const repoUrl = repo ? `${orgOrOwner}/${repo}` : `organizations/${orgOrOwner}`;
|
|
1813
|
+
const settingsUrl = `https://github.com/${repoUrl}/settings/actions/runners`;
|
|
1814
|
+
console.info(`
|
|
1815
|
+
Opening GitHub settings: ${colors.cyan(settingsUrl)}`);
|
|
1816
|
+
await gracefulTry(async () => {
|
|
1817
|
+
await $4`open ${settingsUrl}`.quiet();
|
|
1818
|
+
}, {
|
|
1819
|
+
fallback: async () => {
|
|
1820
|
+
await gracefulTry(async () => {
|
|
1821
|
+
await $4`xdg-open ${settingsUrl}`.quiet();
|
|
1822
|
+
}, {
|
|
1823
|
+
fallback: () => {
|
|
1824
|
+
console.info(`
|
|
1825
|
+
Please open the URL manually to add a new runner token.`);
|
|
1826
|
+
},
|
|
1827
|
+
logLevel: "info",
|
|
1828
|
+
message: "Alternative browser open method also failed"
|
|
1829
|
+
});
|
|
1830
|
+
},
|
|
1831
|
+
logLevel: "info",
|
|
1832
|
+
message: "Could not open browser automatically"
|
|
1833
|
+
});
|
|
1834
|
+
}
|
|
1835
|
+
function getArgs2() {
|
|
1836
|
+
const { values } = parseArgs2({
|
|
1837
|
+
allowPositionals: true,
|
|
1838
|
+
args: Bun.argv,
|
|
1839
|
+
options: { toml: { default: false, short: "t", type: "boolean" } },
|
|
1840
|
+
strict: true
|
|
1841
|
+
});
|
|
1842
|
+
return values;
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
// src/methods/removeMachines.ts
|
|
1846
|
+
import { parseArgs as parseArgs3 } from "util";
|
|
1847
|
+
var {$: $5 } = globalThis.Bun;
|
|
1848
|
+
var logger4 = createLogger({ prefix: "removeMachines" });
|
|
1849
|
+
async function removeMachines() {
|
|
1850
|
+
const args = await getArgs3();
|
|
1851
|
+
const { directory, numberOfMachines, force } = args;
|
|
1852
|
+
let { token, url: url2 } = args;
|
|
1853
|
+
const machinesDir = `${directory}/machines`;
|
|
1854
|
+
const directoryExists = await Bun.file(machinesDir).exists();
|
|
1855
|
+
if (!directoryExists) {
|
|
1856
|
+
throw new Error(`Machines directory not found at ${machinesDir}. Nothing to remove.`);
|
|
1857
|
+
}
|
|
1858
|
+
if (!token && !force) {
|
|
1859
|
+
if (!url2) {
|
|
1860
|
+
console.warn(colors.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub."));
|
|
1861
|
+
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1862
|
+
throw new Error("Token (-t) and URL (-u) parameters are required or use --force");
|
|
1863
|
+
}
|
|
1864
|
+
const settingsUrl = constructRunnerSettingsUrl2(url2);
|
|
1865
|
+
const shouldOpen = await ye({
|
|
1866
|
+
message: `No token provided. Would you like to open GitHub to get a runner token for unregistration?
|
|
1867
|
+
${settingsUrl}`
|
|
1868
|
+
});
|
|
1869
|
+
if (pD(shouldOpen) || !shouldOpen) {
|
|
1870
|
+
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1871
|
+
throw new Error("Token is required to unregister runners (or use --force)");
|
|
1872
|
+
}
|
|
1873
|
+
logger4.info("Opening GitHub runner settings...");
|
|
1874
|
+
await $5`open ${settingsUrl}`.quiet();
|
|
1875
|
+
const tokenInput = await he({
|
|
1876
|
+
message: "Enter the runner removal token:",
|
|
1877
|
+
placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
1878
|
+
validate: (value) => {
|
|
1879
|
+
if (!value || value.trim().length === 0) {
|
|
1880
|
+
return "Token is required";
|
|
1881
|
+
}
|
|
1882
|
+
return;
|
|
1883
|
+
}
|
|
1884
|
+
});
|
|
1885
|
+
if (pD(tokenInput)) {
|
|
1886
|
+
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1887
|
+
throw new Error("Token is required to unregister runners (or use --force)");
|
|
1888
|
+
}
|
|
1889
|
+
token = tokenInput.trim();
|
|
1890
|
+
}
|
|
1891
|
+
if (token && url2) {
|
|
1892
|
+
console.info(colors.cyan("Unregistering runners from GitHub..."));
|
|
1893
|
+
await unregisterRunners({ directory, numberOfMachines, token });
|
|
1894
|
+
} else if (!force) {
|
|
1895
|
+
console.warn(colors.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub."));
|
|
1896
|
+
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1897
|
+
throw new Error("Token (-t) and URL (-u) parameters are required or use --force");
|
|
1898
|
+
}
|
|
1899
|
+
await removeRunnerDirectories({ directory, numberOfMachines });
|
|
1900
|
+
console.info(colors.green("\u2713 Runners successfully removed"));
|
|
1901
|
+
}
|
|
1902
|
+
async function getArgs3() {
|
|
1903
|
+
const { values } = parseArgs3({
|
|
1904
|
+
allowPositionals: true,
|
|
1905
|
+
args: Bun.argv,
|
|
1906
|
+
options: {
|
|
1907
|
+
config: { short: "c", type: "string" },
|
|
1908
|
+
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
1909
|
+
force: { default: false, short: "f", type: "boolean" },
|
|
1910
|
+
numberOfMachines: { default: "1", short: "m", type: "string" },
|
|
1911
|
+
profile: { short: "p", type: "string" },
|
|
1912
|
+
token: { short: "t", type: "string" },
|
|
1913
|
+
url: { short: "u", type: "string" }
|
|
1914
|
+
},
|
|
1915
|
+
strict: true
|
|
1916
|
+
});
|
|
1917
|
+
const config = await loadConfig({ configPath: values.config });
|
|
1918
|
+
const profile = await getProfile(config, values.profile);
|
|
1919
|
+
const baseArgs = {
|
|
1920
|
+
directory: values.directory,
|
|
1921
|
+
force: values.force,
|
|
1922
|
+
numberOfMachines: values.numberOfMachines,
|
|
1923
|
+
token: values.token,
|
|
1924
|
+
url: values.url
|
|
1925
|
+
};
|
|
1926
|
+
if (profile) {
|
|
1927
|
+
return {
|
|
1928
|
+
directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
|
|
1929
|
+
force: baseArgs.force,
|
|
1930
|
+
numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
|
|
1931
|
+
token: baseArgs.token,
|
|
1932
|
+
url: baseArgs.url ?? profile.url
|
|
1933
|
+
};
|
|
1934
|
+
}
|
|
1935
|
+
return baseArgs;
|
|
1936
|
+
}
|
|
1937
|
+
async function unregisterRunners({
|
|
1938
|
+
directory,
|
|
1939
|
+
numberOfMachines,
|
|
1940
|
+
token
|
|
1941
|
+
}) {
|
|
1942
|
+
const log = logger4.child("unregister");
|
|
1943
|
+
const numMachines = Number(numberOfMachines);
|
|
1944
|
+
const cpuCount = (() => {
|
|
1945
|
+
try {
|
|
1946
|
+
const result = Bun.spawnSync(["nproc"]);
|
|
1947
|
+
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1948
|
+
} catch {
|
|
1949
|
+
try {
|
|
1950
|
+
const result = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"]);
|
|
1951
|
+
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1952
|
+
} catch {
|
|
1953
|
+
return 4;
|
|
1954
|
+
}
|
|
1955
|
+
}
|
|
1956
|
+
})();
|
|
1957
|
+
const concurrency = Math.min(Math.max(2, Math.floor(cpuCount / 2)), numMachines, 8);
|
|
1958
|
+
log.info(`Unregistering ${numMachines} runners with concurrency of ${concurrency}`);
|
|
1959
|
+
const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
|
|
1960
|
+
execute: async () => {
|
|
1961
|
+
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
1962
|
+
const machineExists = await Bun.file(machineDirectory).exists();
|
|
1963
|
+
if (!machineExists) {
|
|
1964
|
+
log.debug(`Machine ${runnerIndex} doesn't exist, skipping...`);
|
|
1965
|
+
return { runnerIndex, status: "skipped" };
|
|
1966
|
+
}
|
|
1967
|
+
try {
|
|
1968
|
+
log.debug(`Unregistering machine ${runnerIndex}...`);
|
|
1969
|
+
await $5`${machineDirectory}/config.sh remove --token ${token}`.quiet();
|
|
1970
|
+
log.info(`Successfully unregistered machine ${runnerIndex} from GitHub`);
|
|
1971
|
+
return { runnerIndex, status: "success" };
|
|
1972
|
+
} catch (error2) {
|
|
1973
|
+
log.warn(`Unable to unregister machine ${runnerIndex}: ${error2}`);
|
|
1974
|
+
return { error: error2, runnerIndex, status: "failed" };
|
|
1975
|
+
}
|
|
1976
|
+
},
|
|
1977
|
+
runnerIndex
|
|
1978
|
+
}));
|
|
1979
|
+
const results = [];
|
|
1980
|
+
for (let i = 0;i < tasks.length; i += concurrency) {
|
|
1981
|
+
const batch = tasks.slice(i, i + concurrency);
|
|
1982
|
+
const batchResults = await Promise.allSettled(batch.map((task) => task.execute()));
|
|
1983
|
+
results.push(...batchResults);
|
|
1984
|
+
}
|
|
1985
|
+
const successful = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "success").length;
|
|
1986
|
+
const failed = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "failed").length;
|
|
1987
|
+
const skipped = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "skipped").length;
|
|
1988
|
+
log.info(`Unregistration complete: ${successful} successful, ${failed} failed, ${skipped} skipped`);
|
|
1989
|
+
}
|
|
1990
|
+
async function removeRunnerDirectories({
|
|
1991
|
+
directory,
|
|
1992
|
+
numberOfMachines
|
|
1993
|
+
}) {
|
|
1994
|
+
const log = logger4.child("removeDirectories");
|
|
1995
|
+
const numMachines = Number(numberOfMachines);
|
|
1996
|
+
const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
|
|
1997
|
+
execute: async () => {
|
|
1998
|
+
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
1999
|
+
const machineExists = await Bun.file(machineDirectory).exists();
|
|
2000
|
+
if (!machineExists) {
|
|
2001
|
+
return { runnerIndex, status: "skipped" };
|
|
2002
|
+
}
|
|
2003
|
+
try {
|
|
2004
|
+
await $5`rm -rf ${machineDirectory}`.quiet();
|
|
2005
|
+
log.debug(`Removed machine ${runnerIndex} directory`);
|
|
2006
|
+
return { runnerIndex, status: "success" };
|
|
2007
|
+
} catch (error2) {
|
|
2008
|
+
log.error(`Error removing machine ${runnerIndex} directory: ${error2}`);
|
|
2009
|
+
return { error: error2, runnerIndex, status: "failed" };
|
|
2010
|
+
}
|
|
2011
|
+
},
|
|
2012
|
+
runnerIndex
|
|
2013
|
+
}));
|
|
2014
|
+
const results = await Promise.allSettled(tasks.map((task) => task.execute()));
|
|
2015
|
+
const successful = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "success").length;
|
|
2016
|
+
const failed = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "failed").length;
|
|
2017
|
+
log.info(`Directory removal complete: ${successful} removed, ${failed} failed`);
|
|
2018
|
+
if (failed > 0) {
|
|
2019
|
+
throw new Error(`Failed to remove ${failed} runner directories`);
|
|
2020
|
+
}
|
|
2021
|
+
try {
|
|
2022
|
+
const machinesDir = `${directory}/machines`;
|
|
2023
|
+
const files = (await $5`ls -A ${machinesDir}`.text()).trim();
|
|
2024
|
+
if (!files) {
|
|
2025
|
+
await $5`rm -rf ${machinesDir}`.quiet();
|
|
2026
|
+
const parentFiles = (await $5`ls -A ${directory}`.text()).trim();
|
|
2027
|
+
if (!parentFiles) {
|
|
2028
|
+
await $5`rm -rf ${directory}`.quiet();
|
|
2029
|
+
}
|
|
2030
|
+
console.info(colors.green(`\u2713 Removed empty directories`));
|
|
2031
|
+
}
|
|
2032
|
+
} catch (_error) {}
|
|
2033
|
+
}
|
|
2034
|
+
function constructRunnerSettingsUrl2(url2) {
|
|
2035
|
+
try {
|
|
2036
|
+
const parsedUrl = new URL(url2);
|
|
2037
|
+
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
2038
|
+
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
|
|
2039
|
+
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2040
|
+
return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners`;
|
|
2041
|
+
} else if (pathParts.length >= 2) {
|
|
2042
|
+
return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners`;
|
|
2043
|
+
}
|
|
2044
|
+
} else {
|
|
2045
|
+
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2046
|
+
return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners`;
|
|
2047
|
+
} else if (pathParts.length >= 2) {
|
|
2048
|
+
return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners`;
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
return url2;
|
|
2052
|
+
} catch {
|
|
2053
|
+
return url2;
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
// src/methods/runMachines.ts
|
|
2058
|
+
import { parseArgs as parseArgs4 } from "util";
|
|
2059
|
+
var {$: $6 } = globalThis.Bun;
|
|
2060
|
+
var logger5 = createLogger({ prefix: "runMachines" });
|
|
2061
|
+
async function runMachines() {
|
|
2062
|
+
const args = await getArgs4();
|
|
2063
|
+
const { directory, numberOfMachines, name, labels, runnerGroup } = args;
|
|
2064
|
+
let { token, url: url2 } = args;
|
|
2065
|
+
if (!url2) {
|
|
2066
|
+
throw new Error("URL (-u) parameter is required");
|
|
2067
|
+
}
|
|
2068
|
+
if (!token) {
|
|
2069
|
+
const settingsUrl = constructRunnerSettingsUrl3(url2);
|
|
2070
|
+
const shouldOpen = await ye({
|
|
2071
|
+
message: `No token provided. Would you like to open GitHub to get a runner token?
|
|
2072
|
+
${settingsUrl}`
|
|
2073
|
+
});
|
|
2074
|
+
if (pD(shouldOpen) || !shouldOpen) {
|
|
2075
|
+
throw new Error("Token is required to run machines");
|
|
2076
|
+
}
|
|
2077
|
+
logger5.info("Opening GitHub runner settings...");
|
|
2078
|
+
await $6`open ${settingsUrl}`.quiet();
|
|
2079
|
+
const tokenInput = await he({
|
|
2080
|
+
message: "Enter the runner registration token:",
|
|
2081
|
+
placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
2082
|
+
validate: (value) => {
|
|
2083
|
+
if (!value || value.trim().length === 0) {
|
|
2084
|
+
return "Token is required";
|
|
2085
|
+
}
|
|
2086
|
+
return;
|
|
2087
|
+
}
|
|
2088
|
+
});
|
|
2089
|
+
if (pD(tokenInput)) {
|
|
2090
|
+
throw new Error("Token is required to run machines");
|
|
2091
|
+
}
|
|
2092
|
+
token = tokenInput.trim();
|
|
2093
|
+
}
|
|
2094
|
+
logger5.info(`Starting ${numberOfMachines} runners from ${directory}`);
|
|
2095
|
+
logger5.debug(`Name: ${name}, Labels: ${labels || "none"}`);
|
|
2096
|
+
const directoryExists = await Bun.file(`${directory}/machines`).exists();
|
|
2097
|
+
if (!directoryExists) {
|
|
2098
|
+
throw new Error(`Machines directory not found at ${directory}/machines. Run 'hydra create' first.`);
|
|
2099
|
+
}
|
|
2100
|
+
await startRunners2({ directory, labels, name, numberOfMachines, runnerGroup, token, url: url2 });
|
|
2101
|
+
}
|
|
2102
|
+
async function getArgs4() {
|
|
2103
|
+
const { values } = parseArgs4({
|
|
2104
|
+
allowPositionals: true,
|
|
2105
|
+
args: Bun.argv,
|
|
2106
|
+
options: {
|
|
2107
|
+
config: { short: "c", type: "string" },
|
|
2108
|
+
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
2109
|
+
labels: { short: "l", type: "string" },
|
|
2110
|
+
name: { default: "runner", short: "n", type: "string" },
|
|
2111
|
+
numberOfMachines: { default: "1", short: "m", type: "string" },
|
|
2112
|
+
profile: { short: "p", type: "string" },
|
|
2113
|
+
runnerGroup: { short: "g", type: "string" },
|
|
2114
|
+
token: { short: "t", type: "string" },
|
|
2115
|
+
url: { short: "u", type: "string" }
|
|
2116
|
+
},
|
|
2117
|
+
strict: true
|
|
2118
|
+
});
|
|
2119
|
+
const config = await loadConfig({ configPath: values.config });
|
|
2120
|
+
const profile = await getProfile(config, values.profile);
|
|
2121
|
+
const baseArgs = {
|
|
2122
|
+
directory: values.directory,
|
|
2123
|
+
labels: values.labels,
|
|
2124
|
+
name: values.name,
|
|
2125
|
+
numberOfMachines: values.numberOfMachines,
|
|
2126
|
+
runnerGroup: values.runnerGroup,
|
|
2127
|
+
token: values.token,
|
|
2128
|
+
url: values.url
|
|
2129
|
+
};
|
|
2130
|
+
if (profile) {
|
|
2131
|
+
return {
|
|
2132
|
+
directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
|
|
2133
|
+
labels: baseArgs.labels ?? profile.labels,
|
|
2134
|
+
name: baseArgs.name ?? profile.name ?? "runner",
|
|
2135
|
+
numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
|
|
2136
|
+
runnerGroup: baseArgs.runnerGroup ?? profile.runnerGroup,
|
|
2137
|
+
token: baseArgs.token,
|
|
2138
|
+
url: baseArgs.url ?? profile.url
|
|
2139
|
+
};
|
|
2140
|
+
}
|
|
2141
|
+
return baseArgs;
|
|
2142
|
+
}
|
|
2143
|
+
async function startRunners2({
|
|
2144
|
+
directory,
|
|
2145
|
+
numberOfMachines,
|
|
2146
|
+
token,
|
|
2147
|
+
url: url2,
|
|
2148
|
+
name,
|
|
2149
|
+
labels,
|
|
2150
|
+
runnerGroup
|
|
2151
|
+
}) {
|
|
2152
|
+
logger5.info(`Starting ${numberOfMachines} workers...`);
|
|
2153
|
+
for (let runnerIndex = 1;runnerIndex <= Number(numberOfMachines); runnerIndex++) {
|
|
2154
|
+
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
2155
|
+
const machineExists = await Bun.file(machineDirectory).exists();
|
|
2156
|
+
if (!machineExists) {
|
|
2157
|
+
logger5.warn(`Machine ${runnerIndex} doesn't exist, skipping...`);
|
|
2158
|
+
continue;
|
|
2159
|
+
}
|
|
2160
|
+
const workerPath = `${getPackagePath()}/src/runner-worker.ts`;
|
|
2161
|
+
const workerName = `${name}-${runnerIndex}`;
|
|
2162
|
+
const worker = new Worker(workerPath, { name: workerName, ref: true });
|
|
2163
|
+
worker.addEventListener("message", ({ data }) => {
|
|
2164
|
+
const level = data.type === "error" ? "error" : "info";
|
|
2165
|
+
logger5[level](`${workerName}: ${data.message}`);
|
|
2166
|
+
});
|
|
2167
|
+
worker.addEventListener("error", (error2) => {
|
|
2168
|
+
logger5.error(`Worker ${workerName} error:`, error2);
|
|
2169
|
+
});
|
|
2170
|
+
worker.addEventListener("exit", (code) => {
|
|
2171
|
+
logger5.info(`Worker ${workerName} exited with code ${code}`);
|
|
2172
|
+
});
|
|
2173
|
+
worker.postMessage({
|
|
2174
|
+
index: runnerIndex,
|
|
2175
|
+
labels,
|
|
2176
|
+
machineCwd: machineDirectory,
|
|
2177
|
+
name,
|
|
2178
|
+
runnerGroup,
|
|
2179
|
+
token,
|
|
2180
|
+
url: url2
|
|
2181
|
+
});
|
|
2182
|
+
logger5.info(`Worker ${workerName} starting...`);
|
|
2183
|
+
workerManager.add(worker);
|
|
2184
|
+
}
|
|
2185
|
+
logger5.info("All workers started. Press Ctrl+C to stop all machines");
|
|
2186
|
+
}
|
|
2187
|
+
function constructRunnerSettingsUrl3(url2) {
|
|
2188
|
+
try {
|
|
2189
|
+
const parsedUrl = new URL(url2);
|
|
2190
|
+
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
2191
|
+
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
|
|
2192
|
+
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2193
|
+
return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
2194
|
+
} else if (pathParts.length >= 2) {
|
|
2195
|
+
return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
2196
|
+
}
|
|
2197
|
+
} else {
|
|
2198
|
+
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2199
|
+
return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
2200
|
+
} else if (pathParts.length >= 2) {
|
|
2201
|
+
return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
2202
|
+
}
|
|
2203
|
+
}
|
|
2204
|
+
return url2;
|
|
2205
|
+
} catch {
|
|
2206
|
+
return url2;
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
// src/methods/status.ts
|
|
2211
|
+
import { parseArgs as parseArgs5 } from "util";
|
|
2212
|
+
var {$: $7 } = globalThis.Bun;
|
|
2213
|
+
async function status() {
|
|
2214
|
+
const args = await getArgs5();
|
|
2215
|
+
const { directory, token, url: url2, json } = args;
|
|
2216
|
+
if (!token || !url2) {
|
|
2217
|
+
throw new Error("Token (-t) and URL (-u) parameters are required");
|
|
2218
|
+
}
|
|
2219
|
+
const statusSpinner = Y2();
|
|
2220
|
+
statusSpinner.start("Fetching runner status...");
|
|
2221
|
+
try {
|
|
2222
|
+
const localRunners = await getLocalRunners(directory);
|
|
2223
|
+
const githubRunners = await fetchGitHubRunners(url2, token);
|
|
2224
|
+
const runnerStatuses = combineRunnerStatus(localRunners, githubRunners);
|
|
2225
|
+
statusSpinner.stop("Runner status fetched");
|
|
2226
|
+
if (json) {
|
|
2227
|
+
console.log(JSON.stringify(runnerStatuses, null, 2));
|
|
2228
|
+
} else {
|
|
2229
|
+
displayRunnerStatus(runnerStatuses);
|
|
2230
|
+
}
|
|
2231
|
+
} catch (error2) {
|
|
2232
|
+
statusSpinner.stop("Failed to fetch runner status");
|
|
2233
|
+
throw error2;
|
|
2234
|
+
}
|
|
2235
|
+
}
|
|
2236
|
+
async function getArgs5() {
|
|
2237
|
+
const { values } = parseArgs5({
|
|
2238
|
+
allowPositionals: true,
|
|
2239
|
+
args: Bun.argv,
|
|
2240
|
+
options: {
|
|
2241
|
+
config: { short: "c", type: "string" },
|
|
2242
|
+
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
2243
|
+
json: { default: false, short: "j", type: "boolean" },
|
|
2244
|
+
profile: { short: "p", type: "string" },
|
|
2245
|
+
token: { short: "t", type: "string" },
|
|
2246
|
+
url: { short: "u", type: "string" }
|
|
2247
|
+
},
|
|
2248
|
+
strict: true
|
|
2249
|
+
});
|
|
2250
|
+
const config = await loadConfig({ configPath: values.config });
|
|
2251
|
+
const profile = await getProfile(config, values.profile);
|
|
2252
|
+
return {
|
|
2253
|
+
directory: values.directory || profile?.directory || `${process.cwd()}/gh-runners`,
|
|
2254
|
+
json: values.json,
|
|
2255
|
+
token: values.token,
|
|
2256
|
+
url: values.url || profile?.url
|
|
2257
|
+
};
|
|
2258
|
+
}
|
|
2259
|
+
async function getLocalRunners(directory) {
|
|
2260
|
+
const machinesDir = `${directory}/machines`;
|
|
2261
|
+
const result = await gracefulTry(async () => {
|
|
2262
|
+
const output = await $7`ls ${machinesDir} 2>/dev/null || true`.quiet();
|
|
2263
|
+
return output.stdout.toString().trim().split(`
|
|
2264
|
+
`).filter(Boolean);
|
|
2265
|
+
}, { fallback: () => {}, logLevel: "debug", message: "No local runners found" });
|
|
2266
|
+
return result || [];
|
|
2267
|
+
}
|
|
2268
|
+
async function fetchGitHubRunners(url2, token) {
|
|
2269
|
+
const match = url2.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);
|
|
2270
|
+
if (!match) {
|
|
2271
|
+
throw new Error("Invalid GitHub URL");
|
|
2272
|
+
}
|
|
2273
|
+
const [, orgOrOwner, repo] = match;
|
|
2274
|
+
const apiUrl = repo ? `https://api.github.com/repos/${orgOrOwner}/${repo}/actions/runners` : `https://api.github.com/orgs/${orgOrOwner}/actions/runners`;
|
|
2275
|
+
return withRetry(async () => {
|
|
2276
|
+
const headers = {
|
|
2277
|
+
Accept: "application/vnd.github.v3+json",
|
|
2278
|
+
Authorization: `Bearer ${token}`
|
|
2279
|
+
};
|
|
2280
|
+
const response = await fetch(apiUrl, { headers });
|
|
2281
|
+
if (!response.ok) {
|
|
2282
|
+
throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
|
|
2283
|
+
}
|
|
2284
|
+
const data = await response.json();
|
|
2285
|
+
return data;
|
|
2286
|
+
}, {
|
|
2287
|
+
onRetry: (attempt, error2) => {
|
|
2288
|
+
M2.warn(`Retrying GitHub API call (attempt ${attempt}): ${error2.message}`);
|
|
2289
|
+
}
|
|
2290
|
+
});
|
|
2291
|
+
}
|
|
2292
|
+
function combineRunnerStatus(localRunners, githubData) {
|
|
2293
|
+
const statuses = [];
|
|
2294
|
+
const githubRunnerMap = new Map(githubData.runners.map((runner) => [runner.name, runner]));
|
|
2295
|
+
for (const runnerDir of localRunners) {
|
|
2296
|
+
const runnerName = `runner-${runnerDir}`;
|
|
2297
|
+
const githubRunner = githubRunnerMap.get(runnerName);
|
|
2298
|
+
if (githubRunner) {
|
|
2299
|
+
statuses.push({
|
|
2300
|
+
busy: githubRunner.busy,
|
|
2301
|
+
labels: githubRunner.labels.map((l2) => l2.name),
|
|
2302
|
+
name: runnerName,
|
|
2303
|
+
os: githubRunner.os,
|
|
2304
|
+
status: githubRunner.busy ? "busy" : githubRunner.status === "online" ? "online" : "offline"
|
|
2305
|
+
});
|
|
2306
|
+
} else {
|
|
2307
|
+
statuses.push({
|
|
2308
|
+
busy: false,
|
|
2309
|
+
labels: [],
|
|
2310
|
+
name: runnerName,
|
|
2311
|
+
os: "unknown",
|
|
2312
|
+
status: "offline"
|
|
2313
|
+
});
|
|
2314
|
+
}
|
|
2315
|
+
}
|
|
2316
|
+
return statuses;
|
|
2317
|
+
}
|
|
2318
|
+
function displayRunnerStatus(statuses) {
|
|
2319
|
+
if (statuses.length === 0) {
|
|
2320
|
+
M2.info("No runners found");
|
|
2321
|
+
return;
|
|
2322
|
+
}
|
|
2323
|
+
console.log(`
|
|
2324
|
+
${colors.bold("Runner Status:")}`);
|
|
2325
|
+
console.log("\u2500".repeat(80));
|
|
2326
|
+
const statusColors = { busy: colors.yellow, offline: colors.red, online: colors.green };
|
|
2327
|
+
for (const runner of statuses) {
|
|
2328
|
+
const statusColor = statusColors[runner.status];
|
|
2329
|
+
const statusText = runner.status.toUpperCase().padEnd(7);
|
|
2330
|
+
console.log(`${statusColor("\u25CF")} ${statusColor(statusText)} ${colors.cyan(runner.name.padEnd(20))} ` + `${colors.dim(`OS: ${runner.os.padEnd(10)}`)} ` + `${runner.labels.length > 0 ? colors.dim(`Labels: ${runner.labels.join(", ")}`) : ""}`);
|
|
2331
|
+
}
|
|
2332
|
+
console.log("\u2500".repeat(80));
|
|
2333
|
+
const summary = {
|
|
2334
|
+
busy: statuses.filter((r2) => r2.status === "busy").length,
|
|
2335
|
+
offline: statuses.filter((r2) => r2.status === "offline").length,
|
|
2336
|
+
online: statuses.filter((r2) => r2.status === "online").length,
|
|
2337
|
+
total: statuses.length
|
|
2338
|
+
};
|
|
2339
|
+
console.log(`
|
|
2340
|
+
${colors.bold("Summary:")} ` + `Total: ${summary.total} | ` + `${colors.green(`Online: ${summary.online}`)} | ` + `${colors.yellow(`Busy: ${summary.busy}`)} | ` + `${colors.red(`Offline: ${summary.offline}`)}
|
|
2341
|
+
`);
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
// src/cli.ts
|
|
2345
|
+
var COMMANDS = ["init", "create", "run", "remove", "status", "help"];
|
|
2346
|
+
var COMMON_MISTAKES = {
|
|
2347
|
+
c: "create",
|
|
2348
|
+
ceate: "create",
|
|
2349
|
+
craete: "create",
|
|
2350
|
+
cretae: "create",
|
|
2351
|
+
del: "remove",
|
|
2352
|
+
delete: "remove",
|
|
2353
|
+
h: "help",
|
|
2354
|
+
i: "init",
|
|
2355
|
+
info: "status",
|
|
2356
|
+
initialise: "init",
|
|
2357
|
+
inti: "init",
|
|
2358
|
+
intialize: "init",
|
|
2359
|
+
list: "status",
|
|
2360
|
+
ls: "status",
|
|
2361
|
+
new: "create",
|
|
2362
|
+
r: "run",
|
|
2363
|
+
remvoe: "remove",
|
|
2364
|
+
rm: "remove",
|
|
2365
|
+
rmove: "remove",
|
|
2366
|
+
rnu: "run",
|
|
2367
|
+
runn: "run",
|
|
2368
|
+
s: "status",
|
|
2369
|
+
start: "run",
|
|
2370
|
+
stat: "status",
|
|
2371
|
+
stop: "remove",
|
|
2372
|
+
sttaus: "status",
|
|
2373
|
+
t: "troubleshoot"
|
|
2374
|
+
};
|
|
2375
|
+
async function main() {
|
|
2376
|
+
try {
|
|
2377
|
+
const [, , commandName, ...args] = process.argv;
|
|
2378
|
+
if (!commandName || commandName === "--help" || commandName === "-h") {
|
|
2379
|
+
help();
|
|
2380
|
+
process.exit(0);
|
|
2381
|
+
}
|
|
2382
|
+
let actualCommand = commandName;
|
|
2383
|
+
if (!COMMANDS.includes(commandName)) {
|
|
2384
|
+
const corrected = checkCommonMistakes(commandName, COMMON_MISTAKES);
|
|
2385
|
+
if (corrected && COMMANDS.includes(corrected)) {
|
|
2386
|
+
actualCommand = corrected;
|
|
2387
|
+
console.log(colors.yellow(`Assuming you meant '${corrected}'
|
|
2388
|
+
`));
|
|
2389
|
+
}
|
|
2390
|
+
}
|
|
2391
|
+
if (!COMMANDS.includes(actualCommand)) {
|
|
2392
|
+
console.error(colors.red(`Unknown command: ${commandName}`));
|
|
2393
|
+
const suggestions = getSuggestions(commandName, COMMANDS);
|
|
2394
|
+
if (suggestions.length > 0) {
|
|
2395
|
+
console.error(`
|
|
2396
|
+
Did you mean one of these?`);
|
|
2397
|
+
for (const suggestion of suggestions) {
|
|
2398
|
+
console.error(` ${colors.cyan(suggestion)}`);
|
|
2399
|
+
}
|
|
2400
|
+
console.error();
|
|
2401
|
+
}
|
|
2402
|
+
help();
|
|
2403
|
+
process.exit(1);
|
|
2404
|
+
}
|
|
2405
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
2406
|
+
help(actualCommand);
|
|
2407
|
+
process.exit(0);
|
|
2408
|
+
}
|
|
2409
|
+
switch (actualCommand) {
|
|
2410
|
+
case "init":
|
|
2411
|
+
await init();
|
|
2412
|
+
break;
|
|
2413
|
+
case "create":
|
|
2414
|
+
await createMachines();
|
|
2415
|
+
break;
|
|
2416
|
+
case "run":
|
|
2417
|
+
await runMachines();
|
|
2418
|
+
break;
|
|
2419
|
+
case "remove":
|
|
2420
|
+
await removeMachines();
|
|
2421
|
+
break;
|
|
2422
|
+
case "status":
|
|
2423
|
+
await status();
|
|
2424
|
+
break;
|
|
2425
|
+
case "help": {
|
|
2426
|
+
const targetCommand = args[0];
|
|
2427
|
+
help(targetCommand);
|
|
2428
|
+
break;
|
|
2429
|
+
}
|
|
2430
|
+
default:
|
|
2431
|
+
throw new Error(`Unknown command: ${actualCommand}`);
|
|
2432
|
+
}
|
|
2433
|
+
process.exit(0);
|
|
2434
|
+
} catch (error2) {
|
|
2435
|
+
const errorObj = error2 instanceof Error ? error2 : new Error(String(error2));
|
|
2436
|
+
M2.error(errorObj.message);
|
|
2437
|
+
process.exit(1);
|
|
2438
|
+
}
|
|
2439
|
+
}
|
|
2440
|
+
await main();
|
|
2441
|
+
|
|
2442
|
+
//# debugId=172319766803FBE064756E2164756E21
|
|
2443
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Npc3RlcmFuc2kvc3JjL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvY29sb3JzL3BpY29jb2xvcnMuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BjbGFjay9jb3JlL2Rpc3QvaW5kZXgubWpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AY2xhY2svcHJvbXB0cy9kaXN0L2luZGV4Lm1qcyIsICIuLi8uLi8uLi90b29scy91dGlscy9jb2xvcnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3Rlc3QtbGV2ZW5zaHRlaW4vZXNtL21vZC5qcyIsICIuLi8uLi9jb3JlL3NyYy9mdXp6eS1tYXRjaC50cyIsICIuLi8uLi9jb3JlL3NyYy9ncmFjZWZ1bC50cyIsICIuLi8uLi8uLi90b29scy91dGlscy9sb2dnZXIudHMiLCAiLi4vLi4vY29yZS9zcmMvcmV0cnkudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhbmRpdHlwZXMvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9jb3JlL3NyYy92YWxpZGF0b3IudHMiLCAiLi4vc3JjL21ldGhvZHMvY3JlYXRlTWFjaGluZXMudHMiLCAiLi4vc3JjL2NvbmZpZy50cyIsICIuLi9zcmMvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy90eXBlcy50cyIsICIuLi9zcmMvaGVscGVycy50cyIsICIuLi9zcmMvbGliL3dvcmtlci1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9tZXRob2RzL2hlbHAudHMiLCAiLi4vc3JjL21ldGhvZHMvaW5pdC50cyIsICIuLi9zcmMvbWV0aG9kcy9yZW1vdmVNYWNoaW5lcy50cyIsICIuLi9zcmMvbWV0aG9kcy9ydW5NYWNoaW5lcy50cyIsICIuLi9zcmMvbWV0aG9kcy9zdGF0dXMudHMiLCAiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEVTQyA9ICdcXHgxQic7XG5jb25zdCBDU0kgPSBgJHtFU0N9W2A7XG5jb25zdCBiZWVwID0gJ1xcdTAwMDcnO1xuXG5jb25zdCBjdXJzb3IgPSB7XG4gIHRvKHgsIHkpIHtcbiAgICBpZiAoIXkpIHJldHVybiBgJHtDU0l9JHt4ICsgMX1HYDtcbiAgICByZXR1cm4gYCR7Q1NJfSR7eSArIDF9OyR7eCArIDF9SGA7XG4gIH0sXG4gIG1vdmUoeCwgeSkge1xuICAgIGxldCByZXQgPSAnJztcblxuICAgIGlmICh4IDwgMCkgcmV0ICs9IGAke0NTSX0key14fURgO1xuICAgIGVsc2UgaWYgKHggPiAwKSByZXQgKz0gYCR7Q1NJfSR7eH1DYDtcblxuICAgIGlmICh5IDwgMCkgcmV0ICs9IGAke0NTSX0key15fUFgO1xuICAgIGVsc2UgaWYgKHkgPiAwKSByZXQgKz0gYCR7Q1NJfSR7eX1CYDtcblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIHVwOiAoY291bnQgPSAxKSA9PiBgJHtDU0l9JHtjb3VudH1BYCxcbiAgZG93bjogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfSR7Y291bnR9QmAsXG4gIGZvcndhcmQ6IChjb3VudCA9IDEpID0+IGAke0NTSX0ke2NvdW50fUNgLFxuICBiYWNrd2FyZDogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfSR7Y291bnR9RGAsXG4gIG5leHRMaW5lOiAoY291bnQgPSAxKSA9PiBgJHtDU0l9RWAucmVwZWF0KGNvdW50KSxcbiAgcHJldkxpbmU6IChjb3VudCA9IDEpID0+IGAke0NTSX1GYC5yZXBlYXQoY291bnQpLFxuICBsZWZ0OiBgJHtDU0l9R2AsXG4gIGhpZGU6IGAke0NTSX0/MjVsYCxcbiAgc2hvdzogYCR7Q1NJfT8yNWhgLFxuICBzYXZlOiBgJHtFU0N9N2AsXG4gIHJlc3RvcmU6IGAke0VTQ304YFxufVxuXG5jb25zdCBzY3JvbGwgPSB7XG4gIHVwOiAoY291bnQgPSAxKSA9PiBgJHtDU0l9U2AucmVwZWF0KGNvdW50KSxcbiAgZG93bjogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfVRgLnJlcGVhdChjb3VudClcbn1cblxuY29uc3QgZXJhc2UgPSB7XG4gIHNjcmVlbjogYCR7Q1NJfTJKYCxcbiAgdXA6IChjb3VudCA9IDEpID0+IGAke0NTSX0xSmAucmVwZWF0KGNvdW50KSxcbiAgZG93bjogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfUpgLnJlcGVhdChjb3VudCksXG4gIGxpbmU6IGAke0NTSX0yS2AsXG4gIGxpbmVFbmQ6IGAke0NTSX1LYCxcbiAgbGluZVN0YXJ0OiBgJHtDU0l9MUtgLFxuICBsaW5lcyhjb3VudCkge1xuICAgIGxldCBjbGVhciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKylcbiAgICAgIGNsZWFyICs9IHRoaXMubGluZSArIChpIDwgY291bnQgLSAxID8gY3Vyc29yLnVwKCkgOiAnJyk7XG4gICAgaWYgKGNvdW50KVxuICAgICAgY2xlYXIgKz0gY3Vyc29yLmxlZnQ7XG4gICAgcmV0dXJuIGNsZWFyO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBjdXJzb3IsIHNjcm9sbCwgZXJhc2UsIGJlZXAgfTtcbiIsCiAgICAibGV0IHAgPSBwcm9jZXNzIHx8IHt9LCBhcmd2ID0gcC5hcmd2IHx8IFtdLCBlbnYgPSBwLmVudiB8fCB7fVxubGV0IGlzQ29sb3JTdXBwb3J0ZWQgPVxuXHQhKCEhZW52Lk5PX0NPTE9SIHx8IGFyZ3YuaW5jbHVkZXMoXCItLW5vLWNvbG9yXCIpKSAmJlxuXHQoISFlbnYuRk9SQ0VfQ09MT1IgfHwgYXJndi5pbmNsdWRlcyhcIi0tY29sb3JcIikgfHwgcC5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiIHx8ICgocC5zdGRvdXQgfHwge30pLmlzVFRZICYmIGVudi5URVJNICE9PSBcImR1bWJcIikgfHwgISFlbnYuQ0kpXG5cbmxldCBmb3JtYXR0ZXIgPSAob3BlbiwgY2xvc2UsIHJlcGxhY2UgPSBvcGVuKSA9PlxuXHRpbnB1dCA9PiB7XG5cdFx0bGV0IHN0cmluZyA9IFwiXCIgKyBpbnB1dCwgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjbG9zZSwgb3Blbi5sZW5ndGgpXG5cdFx0cmV0dXJuIH5pbmRleCA/IG9wZW4gKyByZXBsYWNlQ2xvc2Uoc3RyaW5nLCBjbG9zZSwgcmVwbGFjZSwgaW5kZXgpICsgY2xvc2UgOiBvcGVuICsgc3RyaW5nICsgY2xvc2Vcblx0fVxuXG5sZXQgcmVwbGFjZUNsb3NlID0gKHN0cmluZywgY2xvc2UsIHJlcGxhY2UsIGluZGV4KSA9PiB7XG5cdGxldCByZXN1bHQgPSBcIlwiLCBjdXJzb3IgPSAwXG5cdGRvIHtcblx0XHRyZXN1bHQgKz0gc3RyaW5nLnN1YnN0cmluZyhjdXJzb3IsIGluZGV4KSArIHJlcGxhY2Vcblx0XHRjdXJzb3IgPSBpbmRleCArIGNsb3NlLmxlbmd0aFxuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoY2xvc2UsIGN1cnNvcilcblx0fSB3aGlsZSAofmluZGV4KVxuXHRyZXR1cm4gcmVzdWx0ICsgc3RyaW5nLnN1YnN0cmluZyhjdXJzb3IpXG59XG5cbmxldCBjcmVhdGVDb2xvcnMgPSAoZW5hYmxlZCA9IGlzQ29sb3JTdXBwb3J0ZWQpID0+IHtcblx0bGV0IGYgPSBlbmFibGVkID8gZm9ybWF0dGVyIDogKCkgPT4gU3RyaW5nXG5cdHJldHVybiB7XG5cdFx0aXNDb2xvclN1cHBvcnRlZDogZW5hYmxlZCxcblx0XHRyZXNldDogZihcIlxceDFiWzBtXCIsIFwiXFx4MWJbMG1cIiksXG5cdFx0Ym9sZDogZihcIlxceDFiWzFtXCIsIFwiXFx4MWJbMjJtXCIsIFwiXFx4MWJbMjJtXFx4MWJbMW1cIiksXG5cdFx0ZGltOiBmKFwiXFx4MWJbMm1cIiwgXCJcXHgxYlsyMm1cIiwgXCJcXHgxYlsyMm1cXHgxYlsybVwiKSxcblx0XHRpdGFsaWM6IGYoXCJcXHgxYlszbVwiLCBcIlxceDFiWzIzbVwiKSxcblx0XHR1bmRlcmxpbmU6IGYoXCJcXHgxYls0bVwiLCBcIlxceDFiWzI0bVwiKSxcblx0XHRpbnZlcnNlOiBmKFwiXFx4MWJbN21cIiwgXCJcXHgxYlsyN21cIiksXG5cdFx0aGlkZGVuOiBmKFwiXFx4MWJbOG1cIiwgXCJcXHgxYlsyOG1cIiksXG5cdFx0c3RyaWtldGhyb3VnaDogZihcIlxceDFiWzltXCIsIFwiXFx4MWJbMjltXCIpLFxuXG5cdFx0YmxhY2s6IGYoXCJcXHgxYlszMG1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0cmVkOiBmKFwiXFx4MWJbMzFtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdGdyZWVuOiBmKFwiXFx4MWJbMzJtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdHllbGxvdzogZihcIlxceDFiWzMzbVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRibHVlOiBmKFwiXFx4MWJbMzRtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdG1hZ2VudGE6IGYoXCJcXHgxYlszNW1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0Y3lhbjogZihcIlxceDFiWzM2bVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHR3aGl0ZTogZihcIlxceDFiWzM3bVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRncmF5OiBmKFwiXFx4MWJbOTBtXCIsIFwiXFx4MWJbMzltXCIpLFxuXG5cdFx0YmdCbGFjazogZihcIlxceDFiWzQwbVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ1JlZDogZihcIlxceDFiWzQxbVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ0dyZWVuOiBmKFwiXFx4MWJbNDJtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnWWVsbG93OiBmKFwiXFx4MWJbNDNtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnQmx1ZTogZihcIlxceDFiWzQ0bVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ01hZ2VudGE6IGYoXCJcXHgxYls0NW1cIiwgXCJcXHgxYls0OW1cIiksXG5cdFx0YmdDeWFuOiBmKFwiXFx4MWJbNDZtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnV2hpdGU6IGYoXCJcXHgxYls0N21cIiwgXCJcXHgxYls0OW1cIiksXG5cblx0XHRibGFja0JyaWdodDogZihcIlxceDFiWzkwbVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRyZWRCcmlnaHQ6IGYoXCJcXHgxYls5MW1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0Z3JlZW5CcmlnaHQ6IGYoXCJcXHgxYls5Mm1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0eWVsbG93QnJpZ2h0OiBmKFwiXFx4MWJbOTNtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdGJsdWVCcmlnaHQ6IGYoXCJcXHgxYls5NG1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0bWFnZW50YUJyaWdodDogZihcIlxceDFiWzk1bVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRjeWFuQnJpZ2h0OiBmKFwiXFx4MWJbOTZtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdHdoaXRlQnJpZ2h0OiBmKFwiXFx4MWJbOTdtXCIsIFwiXFx4MWJbMzltXCIpLFxuXG5cdFx0YmdCbGFja0JyaWdodDogZihcIlxceDFiWzEwMG1cIiwgXCJcXHgxYls0OW1cIiksXG5cdFx0YmdSZWRCcmlnaHQ6IGYoXCJcXHgxYlsxMDFtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnR3JlZW5CcmlnaHQ6IGYoXCJcXHgxYlsxMDJtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnWWVsbG93QnJpZ2h0OiBmKFwiXFx4MWJbMTAzbVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ0JsdWVCcmlnaHQ6IGYoXCJcXHgxYlsxMDRtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnTWFnZW50YUJyaWdodDogZihcIlxceDFiWzEwNW1cIiwgXCJcXHgxYls0OW1cIiksXG5cdFx0YmdDeWFuQnJpZ2h0OiBmKFwiXFx4MWJbMTA2bVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ1doaXRlQnJpZ2h0OiBmKFwiXFx4MWJbMTA3bVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbG9ycygpXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVDb2xvcnMgPSBjcmVhdGVDb2xvcnNcbiIsCiAgICAiaW1wb3J0e2N1cnNvciBhcyBsLGVyYXNlIGFzIGJ9ZnJvbVwic2lzdGVyYW5zaVwiO2ltcG9ydHtzdGRpbiBhcyBqLHN0ZG91dCBhcyBNfWZyb21cIm5vZGU6cHJvY2Vzc1wiO2ltcG9ydCphcyBnIGZyb21cIm5vZGU6cmVhZGxpbmVcIjtpbXBvcnQgTyBmcm9tXCJub2RlOnJlYWRsaW5lXCI7aW1wb3J0e1dyaXRhYmxlIGFzIFh9ZnJvbVwibm9kZTpzdHJlYW1cIjtpbXBvcnQgdiBmcm9tXCJwaWNvY29sb3JzXCI7ZnVuY3Rpb24gREQoe29ubHlGaXJzdDplPSExfT17fSl7Y29uc3QgdD1bXCJbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT8oPzpcXFxcdTAwMDd8XFxcXHUwMDFCXFxcXHUwMDVDfFxcXFx1MDA5QykpXCIsXCIoPzooPzpcXFxcZHsxLDR9KD86O1xcXFxkezAsNH0pKik/W1xcXFxkQS1QUi1UWmNmLW5xLXV5PT48fl0pKVwiXS5qb2luKFwifFwiKTtyZXR1cm4gbmV3IFJlZ0V4cCh0LGU/dm9pZCAwOlwiZ1wiKX1jb25zdCB1RD1ERCgpO2Z1bmN0aW9uIFAoZSl7aWYodHlwZW9mIGUhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBcXGBzdHJpbmdcXGAsIGdvdCBcXGAke3R5cGVvZiBlfVxcYGApO3JldHVybiBlLnJlcGxhY2UodUQsXCJcIil9ZnVuY3Rpb24gTChlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxcImRlZmF1bHRcIik/ZS5kZWZhdWx0OmV9dmFyIFc9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlKXt2YXIgdT17fTtlLmV4cG9ydHM9dSx1LmVhc3RBc2lhbldpZHRoPWZ1bmN0aW9uKEYpe3ZhciBzPUYuY2hhckNvZGVBdCgwKSxpPUYubGVuZ3RoPT0yP0YuY2hhckNvZGVBdCgxKTowLEQ9cztyZXR1cm4gNTUyOTY8PXMmJnM8PTU2MzE5JiY1NjMyMDw9aSYmaTw9NTczNDMmJihzJj0xMDIzLGkmPTEwMjMsRD1zPDwxMHxpLEQrPTY1NTM2KSxEPT0xMjI4OHx8NjUyODE8PUQmJkQ8PTY1Mzc2fHw2NTUwNDw9RCYmRDw9NjU1MTA/XCJGXCI6RD09ODM2MXx8NjUzNzc8PUQmJkQ8PTY1NDcwfHw2NTQ3NDw9RCYmRDw9NjU0Nzl8fDY1NDgyPD1EJiZEPD02NTQ4N3x8NjU0OTA8PUQmJkQ8PTY1NDk1fHw2NTQ5ODw9RCYmRDw9NjU1MDB8fDY1NTEyPD1EJiZEPD02NTUxOD9cIkhcIjo0MzUyPD1EJiZEPD00NDQ3fHw0NTE1PD1EJiZEPD00NTE5fHw0NjAyPD1EJiZEPD00NjA3fHw5MDAxPD1EJiZEPD05MDAyfHwxMTkwNDw9RCYmRDw9MTE5Mjl8fDExOTMxPD1EJiZEPD0xMjAxOXx8MTIwMzI8PUQmJkQ8PTEyMjQ1fHwxMjI3Mjw9RCYmRDw9MTIyODN8fDEyMjg5PD1EJiZEPD0xMjM1MHx8MTIzNTM8PUQmJkQ8PTEyNDM4fHwxMjQ0MTw9RCYmRDw9MTI1NDN8fDEyNTQ5PD1EJiZEPD0xMjU4OXx8MTI1OTM8PUQmJkQ8PTEyNjg2fHwxMjY4ODw9RCYmRDw9MTI3MzB8fDEyNzM2PD1EJiZEPD0xMjc3MXx8MTI3ODQ8PUQmJkQ8PTEyODMwfHwxMjgzMjw9RCYmRDw9MTI4NzF8fDEyODgwPD1EJiZEPD0xMzA1NHx8MTMwNTY8PUQmJkQ8PTE5OTAzfHwxOTk2ODw9RCYmRDw9NDIxMjR8fDQyMTI4PD1EJiZEPD00MjE4Mnx8NDMzNjA8PUQmJkQ8PTQzMzg4fHw0NDAzMjw9RCYmRDw9NTUyMDN8fDU1MjE2PD1EJiZEPD01NTIzOHx8NTUyNDM8PUQmJkQ8PTU1MjkxfHw2Mzc0NDw9RCYmRDw9NjQyNTV8fDY1MDQwPD1EJiZEPD02NTA0OXx8NjUwNzI8PUQmJkQ8PTY1MTA2fHw2NTEwODw9RCYmRDw9NjUxMjZ8fDY1MTI4PD1EJiZEPD02NTEzMXx8MTEwNTkyPD1EJiZEPD0xMTA1OTN8fDEyNzQ4ODw9RCYmRDw9MTI3NDkwfHwxMjc1MDQ8PUQmJkQ8PTEyNzU0Nnx8MTI3NTUyPD1EJiZEPD0xMjc1NjB8fDEyNzU2ODw9RCYmRDw9MTI3NTY5fHwxMzEwNzI8PUQmJkQ8PTE5NDM2N3x8MTc3OTg0PD1EJiZEPD0xOTY2MDV8fDE5NjYwODw9RCYmRDw9MjYyMTQxP1wiV1wiOjMyPD1EJiZEPD0xMjZ8fDE2Mjw9RCYmRDw9MTYzfHwxNjU8PUQmJkQ8PTE2Nnx8RD09MTcyfHxEPT0xNzV8fDEwMjE0PD1EJiZEPD0xMDIyMXx8MTA2Mjk8PUQmJkQ8PTEwNjMwP1wiTmFcIjpEPT0xNjF8fEQ9PTE2NHx8MTY3PD1EJiZEPD0xNjh8fEQ9PTE3MHx8MTczPD1EJiZEPD0xNzR8fDE3Njw9RCYmRDw9MTgwfHwxODI8PUQmJkQ8PTE4Nnx8MTg4PD1EJiZEPD0xOTF8fEQ9PTE5OHx8RD09MjA4fHwyMTU8PUQmJkQ8PTIxNnx8MjIyPD1EJiZEPD0yMjV8fEQ9PTIzMHx8MjMyPD1EJiZEPD0yMzR8fDIzNjw9RCYmRDw9MjM3fHxEPT0yNDB8fDI0Mjw9RCYmRDw9MjQzfHwyNDc8PUQmJkQ8PTI1MHx8RD09MjUyfHxEPT0yNTR8fEQ9PTI1N3x8RD09MjczfHxEPT0yNzV8fEQ9PTI4M3x8Mjk0PD1EJiZEPD0yOTV8fEQ9PTI5OXx8MzA1PD1EJiZEPD0zMDd8fEQ9PTMxMnx8MzE5PD1EJiZEPD0zMjJ8fEQ9PTMyNHx8MzI4PD1EJiZEPD0zMzF8fEQ9PTMzM3x8MzM4PD1EJiZEPD0zMzl8fDM1ODw9RCYmRDw9MzU5fHxEPT0zNjN8fEQ9PTQ2Mnx8RD09NDY0fHxEPT00NjZ8fEQ9PTQ2OHx8RD09NDcwfHxEPT00NzJ8fEQ9PTQ3NHx8RD09NDc2fHxEPT01OTN8fEQ9PTYwOXx8RD09NzA4fHxEPT03MTF8fDcxMzw9RCYmRDw9NzE1fHxEPT03MTd8fEQ9PTcyMHx8NzI4PD1EJiZEPD03MzF8fEQ9PTczM3x8RD09NzM1fHw3Njg8PUQmJkQ8PTg3OXx8OTEzPD1EJiZEPD05Mjl8fDkzMTw9RCYmRDw9OTM3fHw5NDU8PUQmJkQ8PTk2MXx8OTYzPD1EJiZEPD05Njl8fEQ9PTEwMjV8fDEwNDA8PUQmJkQ8PTExMDN8fEQ9PTExMDV8fEQ9PTgyMDh8fDgyMTE8PUQmJkQ8PTgyMTR8fDgyMTY8PUQmJkQ8PTgyMTd8fDgyMjA8PUQmJkQ8PTgyMjF8fDgyMjQ8PUQmJkQ8PTgyMjZ8fDgyMjg8PUQmJkQ8PTgyMzF8fEQ9PTgyNDB8fDgyNDI8PUQmJkQ8PTgyNDN8fEQ9PTgyNDV8fEQ9PTgyNTF8fEQ9PTgyNTR8fEQ9PTgzMDh8fEQ9PTgzMTl8fDgzMjE8PUQmJkQ8PTgzMjR8fEQ9PTgzNjR8fEQ9PTg0NTF8fEQ9PTg0NTN8fEQ9PTg0NTd8fEQ9PTg0Njd8fEQ9PTg0NzB8fDg0ODE8PUQmJkQ8PTg0ODJ8fEQ9PTg0ODZ8fEQ9PTg0OTF8fDg1MzE8PUQmJkQ8PTg1MzJ8fDg1Mzk8PUQmJkQ8PTg1NDJ8fDg1NDQ8PUQmJkQ8PTg1NTV8fDg1NjA8PUQmJkQ8PTg1Njl8fEQ9PTg1ODV8fDg1OTI8PUQmJkQ8PTg2MDF8fDg2MzI8PUQmJkQ8PTg2MzN8fEQ9PTg2NTh8fEQ9PTg2NjB8fEQ9PTg2Nzl8fEQ9PTg3MDR8fDg3MDY8PUQmJkQ8PTg3MDd8fDg3MTE8PUQmJkQ8PTg3MTJ8fEQ9PTg3MTV8fEQ9PTg3MTl8fEQ9PTg3MjF8fEQ9PTg3MjV8fEQ9PTg3MzB8fDg3MzM8PUQmJkQ8PTg3MzZ8fEQ9PTg3Mzl8fEQ9PTg3NDF8fDg3NDM8PUQmJkQ8PTg3NDh8fEQ9PTg3NTB8fDg3NTY8PUQmJkQ8PTg3NTl8fDg3NjQ8PUQmJkQ8PTg3NjV8fEQ9PTg3NzZ8fEQ9PTg3ODB8fEQ9PTg3ODZ8fDg4MDA8PUQmJkQ8PTg4MDF8fDg4MDQ8PUQmJkQ8PTg4MDd8fDg4MTA8PUQmJkQ8PTg4MTF8fDg4MTQ8PUQmJkQ8PTg4MTV8fDg4MzQ8PUQmJkQ8PTg4MzV8fDg4Mzg8PUQmJkQ8PTg4Mzl8fEQ9PTg4NTN8fEQ9PTg4NTd8fEQ9PTg4Njl8fEQ9PTg4OTV8fEQ9PTg5Nzh8fDkzMTI8PUQmJkQ8PTk0NDl8fDk0NTE8PUQmJkQ8PTk1NDd8fDk1NTI8PUQmJkQ8PTk1ODd8fDk2MDA8PUQmJkQ8PTk2MTV8fDk2MTg8PUQmJkQ8PTk2MjF8fDk2MzI8PUQmJkQ8PTk2MzN8fDk2MzU8PUQmJkQ8PTk2NDF8fDk2NTA8PUQmJkQ8PTk2NTF8fDk2NTQ8PUQmJkQ8PTk2NTV8fDk2NjA8PUQmJkQ8PTk2NjF8fDk2NjQ8PUQmJkQ8PTk2NjV8fDk2NzA8PUQmJkQ8PTk2NzJ8fEQ9PTk2NzV8fDk2Nzg8PUQmJkQ8PTk2ODF8fDk2OTg8PUQmJkQ8PTk3MDF8fEQ9PTk3MTF8fDk3MzM8PUQmJkQ8PTk3MzR8fEQ9PTk3Mzd8fDk3NDI8PUQmJkQ8PTk3NDN8fDk3NDg8PUQmJkQ8PTk3NDl8fEQ9PTk3NTZ8fEQ9PTk3NTh8fEQ9PTk3OTJ8fEQ9PTk3OTR8fDk4MjQ8PUQmJkQ8PTk4MjV8fDk4Mjc8PUQmJkQ8PTk4Mjl8fDk4MzE8PUQmJkQ8PTk4MzR8fDk4MzY8PUQmJkQ8PTk4Mzd8fEQ9PTk4Mzl8fDk4ODY8PUQmJkQ8PTk4ODd8fDk5MTg8PUQmJkQ8PTk5MTl8fDk5MjQ8PUQmJkQ8PTk5MzN8fDk5MzU8PUQmJkQ8PTk5NTN8fEQ9PTk5NTV8fDk5NjA8PUQmJkQ8PTk5ODN8fEQ9PTEwMDQ1fHxEPT0xMDA3MXx8MTAxMDI8PUQmJkQ8PTEwMTExfHwxMTA5Mzw9RCYmRDw9MTEwOTd8fDEyODcyPD1EJiZEPD0xMjg3OXx8NTczNDQ8PUQmJkQ8PTYzNzQzfHw2NTAyNDw9RCYmRDw9NjUwMzl8fEQ9PTY1NTMzfHwxMjcyMzI8PUQmJkQ8PTEyNzI0Mnx8MTI3MjQ4PD1EJiZEPD0xMjcyNzd8fDEyNzI4MDw9RCYmRDw9MTI3MzM3fHwxMjczNDQ8PUQmJkQ8PTEyNzM4Nnx8OTE3NzYwPD1EJiZEPD05MTc5OTl8fDk4MzA0MDw9RCYmRDw9MTA0ODU3M3x8MTA0ODU3Njw9RCYmRDw9MTExNDEwOT9cIkFcIjpcIk5cIn0sdS5jaGFyYWN0ZXJMZW5ndGg9ZnVuY3Rpb24oRil7dmFyIHM9dGhpcy5lYXN0QXNpYW5XaWR0aChGKTtyZXR1cm4gcz09XCJGXCJ8fHM9PVwiV1wifHxzPT1cIkFcIj8yOjF9O2Z1bmN0aW9uIHQoRil7cmV0dXJuIEYubWF0Y2goL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W15cXHVEODAwLVxcdURGRkZdL2cpfHxbXX11Lmxlbmd0aD1mdW5jdGlvbihGKXtmb3IodmFyIHM9dChGKSxpPTAsRD0wO0Q8cy5sZW5ndGg7RCsrKWk9aSt0aGlzLmNoYXJhY3Rlckxlbmd0aChzW0RdKTtyZXR1cm4gaX0sdS5zbGljZT1mdW5jdGlvbihGLHMsaSl7dGV4dExlbj11Lmxlbmd0aChGKSxzPXN8fDAsaT1pfHwxLHM8MCYmKHM9dGV4dExlbitzKSxpPDAmJihpPXRleHRMZW4raSk7Zm9yKHZhciBEPVwiXCIsQz0wLG49dChGKSxFPTA7RTxuLmxlbmd0aDtFKyspe3ZhciBhPW5bRV0sbz11Lmxlbmd0aChhKTtpZihDPj1zLShvPT0yPzE6MCkpaWYoQytvPD1pKUQrPWE7ZWxzZSBicmVhaztDKz1vfXJldHVybiBEfX0pKFcpO3ZhciB0RD1XLmV4cG9ydHM7Y29uc3QgZUQ9TCh0RCk7dmFyIEZEPWZ1bmN0aW9uKCl7cmV0dXJuL1xcdUQ4M0NcXHVERkY0XFx1REI0MFxcdURDNjdcXHVEQjQwXFx1REM2Mig/OlxcdURCNDBcXHVEQzc3XFx1REI0MFxcdURDNkNcXHVEQjQwXFx1REM3M3xcXHVEQjQwXFx1REM3M1xcdURCNDBcXHVEQzYzXFx1REI0MFxcdURDNzR8XFx1REI0MFxcdURDNjVcXHVEQjQwXFx1REM2RVxcdURCNDBcXHVEQzY3KVxcdURCNDBcXHVEQzdGfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkZcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZGXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRV0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZFXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRFxcdURGRkZdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRFxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGQ1xcdURGRkVcXHVERkZGXSl8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGQ1xcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkNcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkQtXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZCXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1xcdURGRkIoPzpcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKSl8XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdXFx1RkUwRnxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKT98KD86XFx1RDgzQ1tcXHVERkZDLVxcdURGRkZdKVxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pKXxcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNEXFx1REM2OHwoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSlcXHUyMDBEKD86XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pKXxcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRlxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRVxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZEXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXFx1REZGRVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCXFx1REZGRC1cXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXwoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pXFx1RkUwRnxcXHUyMDBEKD86KD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXxcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1xcdURGRkZ8XFx1RDgzQ1xcdURGRkV8XFx1RDgzQ1xcdURGRkR8XFx1RDgzQ1xcdURGRkMpP3woPzpcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZCXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8KD86XFx1RDgzQ1tcXHVERkZDLVxcdURGRkZdKVxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKXxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSlcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDEpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfFxcdUQ4M0RcXHVEQzY5KD86XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRlxcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGQ1xcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSkpfFxcdUQ4M0VcXHVEREQxKD86XFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZEXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfCg/OlxcdUQ4M0RcXHVEQzQxXFx1RkUwRlxcdTIwMERcXHVEODNEXFx1RERFOHxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZFXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZEXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZDXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZCXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSl8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pfFxcdUQ4M0RcXHVERTM2XFx1MjAwRFxcdUQ4M0NcXHVERjJCfFxcdUQ4M0NcXHVERkYzXFx1RkUwRlxcdTIwMERcXHUyNkE3fFxcdUQ4M0RcXHVEQzNCXFx1MjAwRFxcdTI3NDR8KD86KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzBcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNVxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ0XFx1RERENi1cXHVEREREXSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzZGfFxcdUQ4M0VbXFx1REQzQ1xcdUREREVcXHVERERGXSlcXHUyMDBEW1xcdTI2NDBcXHUyNjQyXXwoPzpcXHUyNkY5fFxcdUQ4M0NbXFx1REZDQlxcdURGQ0NdfFxcdUQ4M0RcXHVERDc1KSg/OlxcdUZFMEZ8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfFxcdUQ4M0NcXHVERkY0XFx1MjAwRFxcdTI2MjB8KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzBcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNVxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ0XFx1RERENi1cXHVEREREXSlcXHUyMDBEW1xcdTI2NDBcXHUyNjQyXXxbXFx4QTlcXHhBRVxcdTIwM0NcXHUyMDQ5XFx1MjEyMlxcdTIxMzlcXHUyMTk0LVxcdTIxOTlcXHUyMUE5XFx1MjFBQVxcdTIzMjhcXHUyM0NGXFx1MjNFRC1cXHUyM0VGXFx1MjNGMVxcdTIzRjJcXHUyM0Y4LVxcdTIzRkFcXHUyNEMyXFx1MjVBQVxcdTI1QUJcXHUyNUI2XFx1MjVDMFxcdTI1RkJcXHUyNUZDXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE4XFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjkyXFx1MjY5NC1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTdcXHUyNkIwXFx1MjZCMVxcdTI2QzhcXHUyNkNGXFx1MjZEMVxcdTI2RDNcXHUyNkU5XFx1MjZGMFxcdTI2RjFcXHUyNkY0XFx1MjZGN1xcdTI2RjhcXHUyNzAyXFx1MjcwOFxcdTI3MDlcXHUyNzBGXFx1MjcxMlxcdTI3MTRcXHUyNzE2XFx1MjcxRFxcdTI3MjFcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc2M1xcdTI3QTFcXHUyOTM0XFx1MjkzNVxcdTJCMDUtXFx1MkIwN1xcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REQ3MFxcdURENzFcXHVERDdFXFx1REQ3RlxcdURFMDJcXHVERTM3XFx1REYyMVxcdURGMjQtXFx1REYyQ1xcdURGMzZcXHVERjdEXFx1REY5NlxcdURGOTdcXHVERjk5LVxcdURGOUJcXHVERjlFXFx1REY5RlxcdURGQ0RcXHVERkNFXFx1REZENC1cXHVERkRGXFx1REZGNVxcdURGRjddfFxcdUQ4M0RbXFx1REMzRlxcdURDRkRcXHVERDQ5XFx1REQ0QVxcdURENkZcXHVERDcwXFx1REQ3M1xcdURENzYtXFx1REQ3OVxcdUREODdcXHVERDhBLVxcdUREOERcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQVxcdURFQ0JcXHVERUNELVxcdURFQ0ZcXHVERUUwLVxcdURFRTVcXHVERUU5XFx1REVGMFxcdURFRjNdKVxcdUZFMEZ8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdUQ4M0NcXHVERjA4fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY3fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVERTM1XFx1MjAwRFxcdUQ4M0RcXHVEQ0FCfFxcdUQ4M0RcXHVERTJFXFx1MjAwRFxcdUQ4M0RcXHVEQ0E4fFxcdUQ4M0RcXHVEQzE1XFx1MjAwRFxcdUQ4M0VcXHVEREJBfFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1xcdURGRkZ8XFx1RDgzQ1xcdURGRkV8XFx1RDgzQ1xcdURGRkR8XFx1RDgzQ1xcdURGRkN8XFx1RDgzQ1xcdURGRkIpP3xcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZGfFxcdUQ4M0NcXHVERkZFfFxcdUQ4M0NcXHVERkZEfFxcdUQ4M0NcXHVERkZDfFxcdUQ4M0NcXHVERkZCKT98XFx1RDgzQ1xcdURERkRcXHVEODNDXFx1RERGMHxcXHVEODNDXFx1RERGNlxcdUQ4M0NcXHVEREU2fFxcdUQ4M0NcXHVEREY0XFx1RDgzQ1xcdURERjJ8XFx1RDgzRFxcdURDMDhcXHUyMDBEXFx1MkIxQnxcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REQyNXxcXHVEODNFXFx1REU3OSl8XFx1RDgzRFxcdURDNDFcXHVGRTBGfFxcdUQ4M0NcXHVERkYzXFx1RkUwRnxcXHVEODNDXFx1RERGRig/OlxcdUQ4M0NbXFx1RERFNlxcdURERjJcXHVEREZDXSl8XFx1RDgzQ1xcdURERkUoPzpcXHVEODNDW1xcdURERUFcXHVEREY5XSl8XFx1RDgzQ1xcdURERkMoPzpcXHVEODNDW1xcdURERUJcXHVEREY4XSl8XFx1RDgzQ1xcdURERkIoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVFXFx1RERGM1xcdURERkFdKXxcXHVEODNDXFx1RERGQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERUNcXHVEREYyXFx1RERGM1xcdURERjhcXHVEREZFXFx1RERGRl0pfFxcdUQ4M0NcXHVEREY5KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERTlcXHVEREVCLVxcdURERURcXHVEREVGLVxcdURERjRcXHVEREY3XFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRl0pfFxcdUQ4M0NcXHVEREY4KD86XFx1RDgzQ1tcXHVEREU2LVxcdURERUFcXHVEREVDLVxcdURERjRcXHVEREY3LVxcdURERjlcXHVEREZCXFx1RERGRC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERjcoPzpcXHVEODNDW1xcdURERUFcXHVEREY0XFx1RERGOFxcdURERkFcXHVEREZDXSl8XFx1RDgzQ1xcdURERjUoPzpcXHVEODNDW1xcdURERTZcXHVEREVBLVxcdURERURcXHVEREYwLVxcdURERjNcXHVEREY3LVxcdURERjlcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREYzKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdKXxcXHVEODNDXFx1RERGMig/OlxcdUQ4M0NbXFx1RERFNlxcdURERTgtXFx1RERFRFxcdURERjAtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYxKD86XFx1RDgzQ1tcXHVEREU2LVxcdURERThcXHVEREVFXFx1RERGMFxcdURERjctXFx1RERGQlxcdURERkVdKXxcXHVEODNDXFx1RERGMCg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRig/OlxcdUQ4M0NbXFx1RERFQVxcdURERjJcXHVEREY0XFx1RERGNV0pfFxcdUQ4M0NcXHVEREVFKD86XFx1RDgzQ1tcXHVEREU4LVxcdURERUFcXHVEREYxLVxcdURERjRcXHVEREY2LVxcdURERjldKXxcXHVEODNDXFx1RERFRCg/OlxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXSl8XFx1RDgzQ1xcdURERUMoPzpcXHVEODNDW1xcdURERTZcXHVEREU3XFx1RERFOS1cXHVEREVFXFx1RERGMS1cXHVEREYzXFx1RERGNS1cXHVEREZBXFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERFQig/OlxcdUQ4M0NbXFx1RERFRS1cXHVEREYwXFx1RERGMlxcdURERjRcXHVEREY3XSl8XFx1RDgzQ1xcdURERUEoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVEXFx1RERGNy1cXHVEREZBXSl8XFx1RDgzQ1xcdURERTkoPzpcXHVEODNDW1xcdURERUFcXHVEREVDXFx1RERFRlxcdURERjBcXHVEREYyXFx1RERGNFxcdURERkZdKXxcXHVEODNDXFx1RERFOCg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVFXFx1RERGMC1cXHVEREY1XFx1RERGN1xcdURERkEtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREU3KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFNig/OlxcdUQ4M0NbXFx1RERFOC1cXHVEREVDXFx1RERFRVxcdURERjFcXHVEREYyXFx1RERGNFxcdURERjYtXFx1RERGQVxcdURERkNcXHVEREZEXFx1RERGRl0pfFsjXFwqMC05XVxcdUZFMEZcXHUyMEUzfFxcdTI3NjRcXHVGRTBGfCg/OlxcdUQ4M0NbXFx1REZDM1xcdURGQzRcXHVERkNBXXxcXHVEODNEW1xcdURDNkVcXHVEQzcwXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzVcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENFxcdURERDYtXFx1RERERF0pKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXwoPzpcXHUyNkY5fFxcdUQ4M0NbXFx1REZDQlxcdURGQ0NdfFxcdUQ4M0RcXHVERDc1KSg/OlxcdUZFMEZ8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNDXFx1REZGNHwoPzpbXFx1MjcwQVxcdTI3MEJdfFxcdUQ4M0NbXFx1REY4NVxcdURGQzJcXHVERkM3XXxcXHVEODNEW1xcdURDNDJcXHVEQzQzXFx1REM0Ni1cXHVEQzUwXFx1REM2NlxcdURDNjdcXHVEQzZCLVxcdURDNkRcXHVEQzcyXFx1REM3NC1cXHVEQzc2XFx1REM3OFxcdURDN0NcXHVEQzgzXFx1REM4NVxcdURDOEZcXHVEQzkxXFx1RENBQVxcdUREN0FcXHVERDk1XFx1REQ5NlxcdURFNENcXHVERTRGXFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwQ1xcdUREMEZcXHVERDE4LVxcdUREMUNcXHVERDFFXFx1REQxRlxcdUREMzAtXFx1REQzNFxcdUREMzZcXHVERDc3XFx1RERCNVxcdUREQjZcXHVEREJCXFx1REREMlxcdURERDNcXHVEREQ1XSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyNjFEXFx1MjcwQ1xcdTI3MERdfFxcdUQ4M0RbXFx1REQ3NFxcdUREOTBdKSg/OlxcdUZFMEZ8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxbXFx1MjcwQVxcdTI3MEJdfFxcdUQ4M0NbXFx1REY4NVxcdURGQzJcXHVERkM3XXxcXHVEODNEW1xcdURDMDhcXHVEQzE1XFx1REMzQlxcdURDNDJcXHVEQzQzXFx1REM0Ni1cXHVEQzUwXFx1REM2NlxcdURDNjdcXHVEQzZCLVxcdURDNkRcXHVEQzcyXFx1REM3NC1cXHVEQzc2XFx1REM3OFxcdURDN0NcXHVEQzgzXFx1REM4NVxcdURDOEZcXHVEQzkxXFx1RENBQVxcdUREN0FcXHVERDk1XFx1REQ5NlxcdURFMkVcXHVERTM1XFx1REUzNlxcdURFNENcXHVERTRGXFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwQ1xcdUREMEZcXHVERDE4LVxcdUREMUNcXHVERDFFXFx1REQxRlxcdUREMzAtXFx1REQzNFxcdUREMzZcXHVERDc3XFx1RERCNVxcdUREQjZcXHVEREJCXFx1REREMlxcdURERDNcXHVEREQ1XXxcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MFxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM1XFx1REQzNy1cXHVERDM5XFx1REQzRFxcdUREM0VcXHVEREI4XFx1RERCOVxcdUREQ0QtXFx1RERDRlxcdURERDRcXHVEREQ2LVxcdURERERdfFxcdUQ4M0RcXHVEQzZGfFxcdUQ4M0VbXFx1REQzQ1xcdUREREVcXHVERERGXXxbXFx1MjMxQVxcdTIzMUJcXHUyM0U5LVxcdTIzRUNcXHUyM0YwXFx1MjNGM1xcdTI1RkRcXHUyNUZFXFx1MjYxNFxcdTI2MTVcXHUyNjQ4LVxcdTI2NTNcXHUyNjdGXFx1MjY5M1xcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkNFXFx1MjZENFxcdTI2RUFcXHUyNkYyXFx1MjZGM1xcdTI2RjVcXHUyNkZBXFx1MjZGRFxcdTI3MDVcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjg0XFx1REY4Ni1cXHVERjkzXFx1REZBMC1cXHVERkMxXFx1REZDNVxcdURGQzZcXHVERkM4XFx1REZDOVxcdURGQ0YtXFx1REZEM1xcdURGRTAtXFx1REZGMFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDMDdcXHVEQzA5LVxcdURDMTRcXHVEQzE2LVxcdURDM0FcXHVEQzNDLVxcdURDM0VcXHVEQzQwXFx1REM0NFxcdURDNDVcXHVEQzUxLVxcdURDNjVcXHVEQzZBXFx1REM3OS1cXHVEQzdCXFx1REM3RC1cXHVEQzgwXFx1REM4NFxcdURDODgtXFx1REM4RVxcdURDOTBcXHVEQzkyLVxcdURDQTlcXHVEQ0FCLVxcdURDRkNcXHVEQ0ZGLVxcdUREM0RcXHVERDRCLVxcdURENEVcXHVERDUwLVxcdURENjdcXHVEREE0XFx1RERGQi1cXHVERTJEXFx1REUyRi1cXHVERTM0XFx1REUzNy1cXHVERTQ0XFx1REU0OC1cXHVERTRBXFx1REU4MC1cXHVERUEyXFx1REVBNC1cXHVERUIzXFx1REVCNy1cXHVERUJGXFx1REVDMS1cXHVERUM1XFx1REVEMC1cXHVERUQyXFx1REVENS1cXHVERUQ3XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkNcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRFxcdUREMEVcXHVERDEwLVxcdUREMTdcXHVERDFEXFx1REQyMC1cXHVERDI1XFx1REQyNy1cXHVERDJGXFx1REQzQVxcdUREM0YtXFx1REQ0NVxcdURENDctXFx1REQ3NlxcdURENzhcXHVERDdBLVxcdUREQjRcXHVEREI3XFx1RERCQVxcdUREQkMtXFx1RERDQlxcdURERDBcXHVEREUwLVxcdURERkZcXHVERTcwLVxcdURFNzRcXHVERTc4LVxcdURFN0FcXHVERTgwLVxcdURFODZcXHVERTkwLVxcdURFQThcXHVERUIwLVxcdURFQjZcXHVERUMwLVxcdURFQzJcXHVERUQwLVxcdURFRDZdfCg/OltcXHUyMzFBXFx1MjMxQlxcdTIzRTktXFx1MjNFQ1xcdTIzRjBcXHUyM0YzXFx1MjVGRFxcdTI1RkVcXHUyNjE0XFx1MjYxNVxcdTI2NDgtXFx1MjY1M1xcdTI2N0ZcXHUyNjkzXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2Q0VcXHUyNkQ0XFx1MjZFQVxcdTI2RjJcXHUyNkYzXFx1MjZGNVxcdTI2RkFcXHUyNkZEXFx1MjcwNVxcdTI3MEFcXHUyNzBCXFx1MjcyOFxcdTI3NENcXHUyNzRFXFx1Mjc1My1cXHUyNzU1XFx1Mjc1N1xcdTI3OTUtXFx1Mjc5N1xcdTI3QjBcXHUyN0JGXFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NV18XFx1RDgzQ1tcXHVEQzA0XFx1RENDRlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFMzZcXHVERTM4LVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMFxcdURGMkQtXFx1REYzNVxcdURGMzctXFx1REY3Q1xcdURGN0UtXFx1REY5M1xcdURGQTAtXFx1REZDQVxcdURGQ0YtXFx1REZEM1xcdURGRTAtXFx1REZGMFxcdURGRjRcXHVERkY4LVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVEQzNFXFx1REM0MFxcdURDNDItXFx1RENGQ1xcdURDRkYtXFx1REQzRFxcdURENEItXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdUREN0FcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREZCLVxcdURFNEZcXHVERTgwLVxcdURFQzVcXHVERUNDXFx1REVEMC1cXHVERUQyXFx1REVENS1cXHVERUQ3XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkNcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwQy1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDc4XFx1REQ3QS1cXHVERENCXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTc0XFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTg2XFx1REU5MC1cXHVERUE4XFx1REVCMC1cXHVERUI2XFx1REVDMC1cXHVERUMyXFx1REVEMC1cXHVERUQ2XSl8KD86WyNcXCowLTlcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMxQVxcdTIzMUJcXHUyMzI4XFx1MjNDRlxcdTIzRTktXFx1MjNGM1xcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQi1cXHUyNUZFXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE0XFx1MjYxNVxcdTI2MThcXHUyNjFEXFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY0OC1cXHUyNjUzXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjdGXFx1MjY5Mi1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTFcXHUyNkE3XFx1MjZBQVxcdTI2QUJcXHUyNkIwXFx1MjZCMVxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkM4XFx1MjZDRVxcdTI2Q0ZcXHUyNkQxXFx1MjZEM1xcdTI2RDRcXHUyNkU5XFx1MjZFQVxcdTI2RjAtXFx1MjZGNVxcdTI2RjctXFx1MjZGQVxcdTI2RkRcXHUyNzAyXFx1MjcwNVxcdTI3MDgtXFx1MjcwRFxcdTI3MEZcXHUyNzEyXFx1MjcxNFxcdTI3MTZcXHUyNzFEXFx1MjcyMVxcdTI3MjhcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc2M1xcdTI3NjRcXHUyNzk1LVxcdTI3OTdcXHUyN0ExXFx1MjdCMFxcdTI3QkZcXHUyOTM0XFx1MjkzNVxcdTJCMDUtXFx1MkIwN1xcdTJCMUJcXHUyQjFDXFx1MkI1MFxcdTJCNTVcXHUzMDMwXFx1MzAzRFxcdTMyOTdcXHUzMjk5XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ3MFxcdURENzFcXHVERDdFXFx1REQ3RlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUwMlxcdURFMUFcXHVERTJGXFx1REUzMi1cXHVERTNBXFx1REU1MFxcdURFNTFcXHVERjAwLVxcdURGMjFcXHVERjI0LVxcdURGOTNcXHVERjk2XFx1REY5N1xcdURGOTktXFx1REY5QlxcdURGOUUtXFx1REZGMFxcdURGRjMtXFx1REZGNVxcdURGRjctXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDRkRcXHVEQ0ZGLVxcdUREM0RcXHVERDQ5LVxcdURENEVcXHVERDUwLVxcdURENjdcXHVERDZGXFx1REQ3MFxcdURENzMtXFx1REQ3QVxcdUREODdcXHVERDhBLVxcdUREOERcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVEREE0XFx1RERBNVxcdUREQThcXHVEREIxXFx1RERCMlxcdUREQkNcXHVEREMyLVxcdUREQzRcXHVEREQxLVxcdURERDNcXHVERERDLVxcdUREREVcXHVEREUxXFx1RERFM1xcdURERThcXHVEREVGXFx1RERGM1xcdURERkEtXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0ItXFx1REVEMlxcdURFRDUtXFx1REVEN1xcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUVCXFx1REVFQ1xcdURFRjBcXHVERUYzLVxcdURFRkNcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwQy1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDc4XFx1REQ3QS1cXHVERENCXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTc0XFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTg2XFx1REU5MC1cXHVERUE4XFx1REVCMC1cXHVERUI2XFx1REVDMC1cXHVERUMyXFx1REVEMC1cXHVERUQ2XSlcXHVGRTBGfCg/OltcXHUyNjFEXFx1MjZGOVxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMi1cXHVERkM0XFx1REZDN1xcdURGQ0EtXFx1REZDQ118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjYtXFx1REM3OFxcdURDN0NcXHVEQzgxLVxcdURDODNcXHVEQzg1LVxcdURDODdcXHVEQzhGXFx1REM5MVxcdURDQUFcXHVERDc0XFx1REQ3NVxcdUREN0FcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVERTQ1LVxcdURFNDdcXHVERTRCLVxcdURFNEZcXHVERUEzXFx1REVCNC1cXHVERUI2XFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwQ1xcdUREMEZcXHVERDE4LVxcdUREMUZcXHVERDI2XFx1REQzMC1cXHVERDM5XFx1REQzQy1cXHVERDNFXFx1REQ3N1xcdUREQjVcXHVEREI2XFx1RERCOFxcdUREQjlcXHVEREJCXFx1RERDRC1cXHVERENGXFx1REREMS1cXHVEREREXSkvZ307Y29uc3Qgc0Q9TChGRCk7ZnVuY3Rpb24gcChlLHU9e30pe2lmKHR5cGVvZiBlIT1cInN0cmluZ1wifHxlLmxlbmd0aD09PTB8fCh1PXthbWJpZ3VvdXNJc05hcnJvdzohMCwuLi51fSxlPVAoZSksZS5sZW5ndGg9PT0wKSlyZXR1cm4gMDtlPWUucmVwbGFjZShzRCgpLFwiICBcIik7Y29uc3QgdD11LmFtYmlndW91c0lzTmFycm93PzE6MjtsZXQgRj0wO2Zvcihjb25zdCBzIG9mIGUpe2NvbnN0IGk9cy5jb2RlUG9pbnRBdCgwKTtpZihpPD0zMXx8aT49MTI3JiZpPD0xNTl8fGk+PTc2OCYmaTw9ODc5KWNvbnRpbnVlO3N3aXRjaChlRC5lYXN0QXNpYW5XaWR0aChzKSl7Y2FzZVwiRlwiOmNhc2VcIldcIjpGKz0yO2JyZWFrO2Nhc2VcIkFcIjpGKz10O2JyZWFrO2RlZmF1bHQ6Ris9MX19cmV0dXJuIEZ9Y29uc3Qgdz0xMCxOPShlPTApPT51PT5gXFx4MUJbJHt1K2V9bWAsST0oZT0wKT0+dT0+YFxceDFCWyR7MzgrZX07NTske3V9bWAsUj0oZT0wKT0+KHUsdCxGKT0+YFxceDFCWyR7MzgrZX07Mjske3V9OyR7dH07JHtGfW1gLHI9e21vZGlmaWVyOntyZXNldDpbMCwwXSxib2xkOlsxLDIyXSxkaW06WzIsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxvdmVybGluZTpbNTMsNTVdLGludmVyc2U6WzcsMjddLGhpZGRlbjpbOCwyOF0sc3RyaWtldGhyb3VnaDpbOSwyOV19LGNvbG9yOntibGFjazpbMzAsMzldLHJlZDpbMzEsMzldLGdyZWVuOlszMiwzOV0seWVsbG93OlszMywzOV0sYmx1ZTpbMzQsMzldLG1hZ2VudGE6WzM1LDM5XSxjeWFuOlszNiwzOV0sd2hpdGU6WzM3LDM5XSxibGFja0JyaWdodDpbOTAsMzldLGdyYXk6WzkwLDM5XSxncmV5Ols5MCwzOV0scmVkQnJpZ2h0Ols5MSwzOV0sZ3JlZW5CcmlnaHQ6WzkyLDM5XSx5ZWxsb3dCcmlnaHQ6WzkzLDM5XSxibHVlQnJpZ2h0Ols5NCwzOV0sbWFnZW50YUJyaWdodDpbOTUsMzldLGN5YW5CcmlnaHQ6Wzk2LDM5XSx3aGl0ZUJyaWdodDpbOTcsMzldfSxiZ0NvbG9yOntiZ0JsYWNrOls0MCw0OV0sYmdSZWQ6WzQxLDQ5XSxiZ0dyZWVuOls0Miw0OV0sYmdZZWxsb3c6WzQzLDQ5XSxiZ0JsdWU6WzQ0LDQ5XSxiZ01hZ2VudGE6WzQ1LDQ5XSxiZ0N5YW46WzQ2LDQ5XSxiZ1doaXRlOls0Nyw0OV0sYmdCbGFja0JyaWdodDpbMTAwLDQ5XSxiZ0dyYXk6WzEwMCw0OV0sYmdHcmV5OlsxMDAsNDldLGJnUmVkQnJpZ2h0OlsxMDEsNDldLGJnR3JlZW5CcmlnaHQ6WzEwMiw0OV0sYmdZZWxsb3dCcmlnaHQ6WzEwMyw0OV0sYmdCbHVlQnJpZ2h0OlsxMDQsNDldLGJnTWFnZW50YUJyaWdodDpbMTA1LDQ5XSxiZ0N5YW5CcmlnaHQ6WzEwNiw0OV0sYmdXaGl0ZUJyaWdodDpbMTA3LDQ5XX19O09iamVjdC5rZXlzKHIubW9kaWZpZXIpO2NvbnN0IGlEPU9iamVjdC5rZXlzKHIuY29sb3IpLENEPU9iamVjdC5rZXlzKHIuYmdDb2xvcik7Wy4uLmlELC4uLkNEXTtmdW5jdGlvbiByRCgpe2NvbnN0IGU9bmV3IE1hcDtmb3IoY29uc3RbdSx0XW9mIE9iamVjdC5lbnRyaWVzKHIpKXtmb3IoY29uc3RbRixzXW9mIE9iamVjdC5lbnRyaWVzKHQpKXJbRl09e29wZW46YFxceDFCWyR7c1swXX1tYCxjbG9zZTpgXFx4MUJbJHtzWzFdfW1gfSx0W0ZdPXJbRl0sZS5zZXQoc1swXSxzWzFdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocix1LHt2YWx1ZTp0LGVudW1lcmFibGU6ITF9KX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJjb2Rlc1wiLHt2YWx1ZTplLGVudW1lcmFibGU6ITF9KSxyLmNvbG9yLmNsb3NlPVwiXFx4MUJbMzltXCIsci5iZ0NvbG9yLmNsb3NlPVwiXFx4MUJbNDltXCIsci5jb2xvci5hbnNpPU4oKSxyLmNvbG9yLmFuc2kyNTY9SSgpLHIuY29sb3IuYW5zaTE2bT1SKCksci5iZ0NvbG9yLmFuc2k9Tih3KSxyLmJnQ29sb3IuYW5zaTI1Nj1JKHcpLHIuYmdDb2xvci5hbnNpMTZtPVIodyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocix7cmdiVG9BbnNpMjU2Ont2YWx1ZToodSx0LEYpPT51PT09dCYmdD09PUY/dTw4PzE2OnU+MjQ4PzIzMTpNYXRoLnJvdW5kKCh1LTgpLzI0NyoyNCkrMjMyOjE2KzM2Kk1hdGgucm91bmQodS8yNTUqNSkrNipNYXRoLnJvdW5kKHQvMjU1KjUpK01hdGgucm91bmQoRi8yNTUqNSksZW51bWVyYWJsZTohMX0saGV4VG9SZ2I6e3ZhbHVlOnU9Pntjb25zdCB0PS9bYS1mXFxkXXs2fXxbYS1mXFxkXXszfS9pLmV4ZWModS50b1N0cmluZygxNikpO2lmKCF0KXJldHVyblswLDAsMF07bGV0W0ZdPXQ7Ri5sZW5ndGg9PT0zJiYoRj1bLi4uRl0ubWFwKGk9PmkraSkuam9pbihcIlwiKSk7Y29uc3Qgcz1OdW1iZXIucGFyc2VJbnQoRiwxNik7cmV0dXJuW3M+PjE2JjI1NSxzPj44JjI1NSxzJjI1NV19LGVudW1lcmFibGU6ITF9LGhleFRvQW5zaTI1Njp7dmFsdWU6dT0+ci5yZ2JUb0Fuc2kyNTYoLi4uci5oZXhUb1JnYih1KSksZW51bWVyYWJsZTohMX0sYW5zaTI1NlRvQW5zaTp7dmFsdWU6dT0+e2lmKHU8OClyZXR1cm4gMzArdTtpZih1PDE2KXJldHVybiA5MCsodS04KTtsZXQgdCxGLHM7aWYodT49MjMyKXQ9KCh1LTIzMikqMTArOCkvMjU1LEY9dCxzPXQ7ZWxzZXt1LT0xNjtjb25zdCBDPXUlMzY7dD1NYXRoLmZsb29yKHUvMzYpLzUsRj1NYXRoLmZsb29yKEMvNikvNSxzPUMlNi81fWNvbnN0IGk9TWF0aC5tYXgodCxGLHMpKjI7aWYoaT09PTApcmV0dXJuIDMwO2xldCBEPTMwKyhNYXRoLnJvdW5kKHMpPDwyfE1hdGgucm91bmQoRik8PDF8TWF0aC5yb3VuZCh0KSk7cmV0dXJuIGk9PT0yJiYoRCs9NjApLER9LGVudW1lcmFibGU6ITF9LHJnYlRvQW5zaTp7dmFsdWU6KHUsdCxGKT0+ci5hbnNpMjU2VG9BbnNpKHIucmdiVG9BbnNpMjU2KHUsdCxGKSksZW51bWVyYWJsZTohMX0saGV4VG9BbnNpOnt2YWx1ZTp1PT5yLmFuc2kyNTZUb0Fuc2koci5oZXhUb0Fuc2kyNTYodSkpLGVudW1lcmFibGU6ITF9fSkscn1jb25zdCBFRD1yRCgpLGQ9bmV3IFNldChbXCJcXHgxQlwiLFwiXFx4OUJcIl0pLG9EPTM5LHk9XCJcXHgwN1wiLFY9XCJbXCIsbkQ9XCJdXCIsRz1cIm1cIixfPWAke25EfTg7O2Asej1lPT5gJHtkLnZhbHVlcygpLm5leHQoKS52YWx1ZX0ke1Z9JHtlfSR7R31gLEs9ZT0+YCR7ZC52YWx1ZXMoKS5uZXh0KCkudmFsdWV9JHtffSR7ZX0ke3l9YCxhRD1lPT5lLnNwbGl0KFwiIFwiKS5tYXAodT0+cCh1KSksaz0oZSx1LHQpPT57Y29uc3QgRj1bLi4udV07bGV0IHM9ITEsaT0hMSxEPXAoUChlW2UubGVuZ3RoLTFdKSk7Zm9yKGNvbnN0W0Msbl1vZiBGLmVudHJpZXMoKSl7Y29uc3QgRT1wKG4pO2lmKEQrRTw9dD9lW2UubGVuZ3RoLTFdKz1uOihlLnB1c2gobiksRD0wKSxkLmhhcyhuKSYmKHM9ITAsaT1GLnNsaWNlKEMrMSkuam9pbihcIlwiKS5zdGFydHNXaXRoKF8pKSxzKXtpP249PT15JiYocz0hMSxpPSExKTpuPT09RyYmKHM9ITEpO2NvbnRpbnVlfUQrPUUsRD09PXQmJkM8Ri5sZW5ndGgtMSYmKGUucHVzaChcIlwiKSxEPTApfSFEJiZlW2UubGVuZ3RoLTFdLmxlbmd0aD4wJiZlLmxlbmd0aD4xJiYoZVtlLmxlbmd0aC0yXSs9ZS5wb3AoKSl9LGhEPWU9Pntjb25zdCB1PWUuc3BsaXQoXCIgXCIpO2xldCB0PXUubGVuZ3RoO2Zvcig7dD4wJiYhKHAodVt0LTFdKT4wKTspdC0tO3JldHVybiB0PT09dS5sZW5ndGg/ZTp1LnNsaWNlKDAsdCkuam9pbihcIiBcIikrdS5zbGljZSh0KS5qb2luKFwiXCIpfSxsRD0oZSx1LHQ9e30pPT57aWYodC50cmltIT09ITEmJmUudHJpbSgpPT09XCJcIilyZXR1cm5cIlwiO2xldCBGPVwiXCIscyxpO2NvbnN0IEQ9YUQoZSk7bGV0IEM9W1wiXCJdO2Zvcihjb25zdFtFLGFdb2YgZS5zcGxpdChcIiBcIikuZW50cmllcygpKXt0LnRyaW0hPT0hMSYmKENbQy5sZW5ndGgtMV09Q1tDLmxlbmd0aC0xXS50cmltU3RhcnQoKSk7bGV0IG89cChDW0MubGVuZ3RoLTFdKTtpZihFIT09MCYmKG8+PXUmJih0LndvcmRXcmFwPT09ITF8fHQudHJpbT09PSExKSYmKEMucHVzaChcIlwiKSxvPTApLChvPjB8fHQudHJpbT09PSExKSYmKENbQy5sZW5ndGgtMV0rPVwiIFwiLG8rKykpLHQuaGFyZCYmRFtFXT51KXtjb25zdCBjPXUtbyxmPTErTWF0aC5mbG9vcigoRFtFXS1jLTEpL3UpO01hdGguZmxvb3IoKERbRV0tMSkvdSk8ZiYmQy5wdXNoKFwiXCIpLGsoQyxhLHUpO2NvbnRpbnVlfWlmKG8rRFtFXT51JiZvPjAmJkRbRV0+MCl7aWYodC53b3JkV3JhcD09PSExJiZvPHUpe2soQyxhLHUpO2NvbnRpbnVlfUMucHVzaChcIlwiKX1pZihvK0RbRV0+dSYmdC53b3JkV3JhcD09PSExKXtrKEMsYSx1KTtjb250aW51ZX1DW0MubGVuZ3RoLTFdKz1hfXQudHJpbSE9PSExJiYoQz1DLm1hcChFPT5oRChFKSkpO2NvbnN0IG49Wy4uLkMuam9pbihgXG5gKV07Zm9yKGNvbnN0W0UsYV1vZiBuLmVudHJpZXMoKSl7aWYoRis9YSxkLmhhcyhhKSl7Y29uc3R7Z3JvdXBzOmN9PW5ldyBSZWdFeHAoYCg/OlxcXFwke1Z9KD88Y29kZT5cXFxcZCspbXxcXFxcJHtffSg/PHVyaT4uKikke3l9KWApLmV4ZWMobi5zbGljZShFKS5qb2luKFwiXCIpKXx8e2dyb3Vwczp7fX07aWYoYy5jb2RlIT09dm9pZCAwKXtjb25zdCBmPU51bWJlci5wYXJzZUZsb2F0KGMuY29kZSk7cz1mPT09b0Q/dm9pZCAwOmZ9ZWxzZSBjLnVyaSE9PXZvaWQgMCYmKGk9Yy51cmkubGVuZ3RoPT09MD92b2lkIDA6Yy51cmkpfWNvbnN0IG89RUQuY29kZXMuZ2V0KE51bWJlcihzKSk7bltFKzFdPT09YFxuYD8oaSYmKEYrPUsoXCJcIikpLHMmJm8mJihGKz16KG8pKSk6YT09PWBcbmAmJihzJiZvJiYoRis9eihzKSksaSYmKEYrPUsoaSkpKX1yZXR1cm4gRn07ZnVuY3Rpb24gWShlLHUsdCl7cmV0dXJuIFN0cmluZyhlKS5ub3JtYWxpemUoKS5yZXBsYWNlKC9cXHJcXG4vZyxgXG5gKS5zcGxpdChgXG5gKS5tYXAoRj0+bEQoRix1LHQpKS5qb2luKGBcbmApfWNvbnN0IHhEPVtcInVwXCIsXCJkb3duXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwic3BhY2VcIixcImVudGVyXCIsXCJjYW5jZWxcIl0sQj17YWN0aW9uczpuZXcgU2V0KHhEKSxhbGlhc2VzOm5ldyBNYXAoW1tcImtcIixcInVwXCJdLFtcImpcIixcImRvd25cIl0sW1wiaFwiLFwibGVmdFwiXSxbXCJsXCIsXCJyaWdodFwiXSxbXCJcdTAwMDNcIixcImNhbmNlbFwiXSxbXCJlc2NhcGVcIixcImNhbmNlbFwiXV0pfTtmdW5jdGlvbiBjRChlKXtmb3IoY29uc3QgdSBpbiBlKXtjb25zdCB0PXU7aWYoIU9iamVjdC5oYXNPd24oZSx0KSljb250aW51ZTtjb25zdCBGPWVbdF07c3dpdGNoKHQpe2Nhc2VcImFsaWFzZXNcIjp7Zm9yKGNvbnN0IHMgaW4gRilPYmplY3QuaGFzT3duKEYscykmJihCLmFsaWFzZXMuaGFzKHMpfHxCLmFsaWFzZXMuc2V0KHMsRltzXSkpO2JyZWFrfX19fWZ1bmN0aW9uICQoZSx1KXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIilyZXR1cm4gQi5hbGlhc2VzLmdldChlKT09PXU7Zm9yKGNvbnN0IHQgb2YgZSlpZih0IT09dm9pZCAwJiYkKHQsdSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gQkQoZSx1KXtpZihlPT09dSlyZXR1cm47Y29uc3QgdD1lLnNwbGl0KGBcbmApLEY9dS5zcGxpdChgXG5gKSxzPVtdO2ZvcihsZXQgaT0wO2k8TWF0aC5tYXgodC5sZW5ndGgsRi5sZW5ndGgpO2krKyl0W2ldIT09RltpXSYmcy5wdXNoKGkpO3JldHVybiBzfWNvbnN0IEFEPWdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybS5zdGFydHNXaXRoKFwid2luXCIpLFM9U3ltYm9sKFwiY2xhY2s6Y2FuY2VsXCIpO2Z1bmN0aW9uIHBEKGUpe3JldHVybiBlPT09U31mdW5jdGlvbiBtKGUsdSl7Y29uc3QgdD1lO3QuaXNUVFkmJnQuc2V0UmF3TW9kZSh1KX1mdW5jdGlvbiBmRCh7aW5wdXQ6ZT1qLG91dHB1dDp1PU0sb3ZlcndyaXRlOnQ9ITAsaGlkZUN1cnNvcjpGPSEwfT17fSl7Y29uc3Qgcz1nLmNyZWF0ZUludGVyZmFjZSh7aW5wdXQ6ZSxvdXRwdXQ6dSxwcm9tcHQ6XCJcIix0YWJTaXplOjF9KTtnLmVtaXRLZXlwcmVzc0V2ZW50cyhlLHMpLGUuaXNUVFkmJmUuc2V0UmF3TW9kZSghMCk7Y29uc3QgaT0oRCx7bmFtZTpDLHNlcXVlbmNlOm59KT0+e2NvbnN0IEU9U3RyaW5nKEQpO2lmKCQoW0UsQyxuXSxcImNhbmNlbFwiKSl7RiYmdS53cml0ZShsLnNob3cpLHByb2Nlc3MuZXhpdCgwKTtyZXR1cm59aWYoIXQpcmV0dXJuO2NvbnN0IGE9Qz09PVwicmV0dXJuXCI/MDotMSxvPUM9PT1cInJldHVyblwiPy0xOjA7Zy5tb3ZlQ3Vyc29yKHUsYSxvLCgpPT57Zy5jbGVhckxpbmUodSwxLCgpPT57ZS5vbmNlKFwia2V5cHJlc3NcIixpKX0pfSl9O3JldHVybiBGJiZ1LndyaXRlKGwuaGlkZSksZS5vbmNlKFwia2V5cHJlc3NcIixpKSwoKT0+e2Uub2ZmKFwia2V5cHJlc3NcIixpKSxGJiZ1LndyaXRlKGwuc2hvdyksZS5pc1RUWSYmIUFEJiZlLnNldFJhd01vZGUoITEpLHMudGVybWluYWw9ITEscy5jbG9zZSgpfX12YXIgZ0Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LHZEPShlLHUsdCk9PnUgaW4gZT9nRChlLHUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTplW3VdPXQsaD0oZSx1LHQpPT4odkQoZSx0eXBlb2YgdSE9XCJzeW1ib2xcIj91K1wiXCI6dSx0KSx0KTtjbGFzcyB4e2NvbnN0cnVjdG9yKHUsdD0hMCl7aCh0aGlzLFwiaW5wdXRcIiksaCh0aGlzLFwib3V0cHV0XCIpLGgodGhpcyxcIl9hYm9ydFNpZ25hbFwiKSxoKHRoaXMsXCJybFwiKSxoKHRoaXMsXCJvcHRzXCIpLGgodGhpcyxcIl9yZW5kZXJcIiksaCh0aGlzLFwiX3RyYWNrXCIsITEpLGgodGhpcyxcIl9wcmV2RnJhbWVcIixcIlwiKSxoKHRoaXMsXCJfc3Vic2NyaWJlcnNcIixuZXcgTWFwKSxoKHRoaXMsXCJfY3Vyc29yXCIsMCksaCh0aGlzLFwic3RhdGVcIixcImluaXRpYWxcIiksaCh0aGlzLFwiZXJyb3JcIixcIlwiKSxoKHRoaXMsXCJ2YWx1ZVwiKTtjb25zdHtpbnB1dDpGPWosb3V0cHV0OnM9TSxyZW5kZXI6aSxzaWduYWw6RCwuLi5DfT11O3RoaXMub3B0cz1DLHRoaXMub25LZXlwcmVzcz10aGlzLm9uS2V5cHJlc3MuYmluZCh0aGlzKSx0aGlzLmNsb3NlPXRoaXMuY2xvc2UuYmluZCh0aGlzKSx0aGlzLnJlbmRlcj10aGlzLnJlbmRlci5iaW5kKHRoaXMpLHRoaXMuX3JlbmRlcj1pLmJpbmQodGhpcyksdGhpcy5fdHJhY2s9dCx0aGlzLl9hYm9ydFNpZ25hbD1ELHRoaXMuaW5wdXQ9Rix0aGlzLm91dHB1dD1zfXVuc3Vic2NyaWJlKCl7dGhpcy5fc3Vic2NyaWJlcnMuY2xlYXIoKX1zZXRTdWJzY3JpYmVyKHUsdCl7Y29uc3QgRj10aGlzLl9zdWJzY3JpYmVycy5nZXQodSk/P1tdO0YucHVzaCh0KSx0aGlzLl9zdWJzY3JpYmVycy5zZXQodSxGKX1vbih1LHQpe3RoaXMuc2V0U3Vic2NyaWJlcih1LHtjYjp0fSl9b25jZSh1LHQpe3RoaXMuc2V0U3Vic2NyaWJlcih1LHtjYjp0LG9uY2U6ITB9KX1lbWl0KHUsLi4udCl7Y29uc3QgRj10aGlzLl9zdWJzY3JpYmVycy5nZXQodSk/P1tdLHM9W107Zm9yKGNvbnN0IGkgb2YgRilpLmNiKC4uLnQpLGkub25jZSYmcy5wdXNoKCgpPT5GLnNwbGljZShGLmluZGV4T2YoaSksMSkpO2Zvcihjb25zdCBpIG9mIHMpaSgpfXByb21wdCgpe3JldHVybiBuZXcgUHJvbWlzZSgodSx0KT0+e2lmKHRoaXMuX2Fib3J0U2lnbmFsKXtpZih0aGlzLl9hYm9ydFNpZ25hbC5hYm9ydGVkKXJldHVybiB0aGlzLnN0YXRlPVwiY2FuY2VsXCIsdGhpcy5jbG9zZSgpLHUoUyk7dGhpcy5fYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsKCk9Pnt0aGlzLnN0YXRlPVwiY2FuY2VsXCIsdGhpcy5jbG9zZSgpfSx7b25jZTohMH0pfWNvbnN0IEY9bmV3IFg7Ri5fd3JpdGU9KHMsaSxEKT0+e3RoaXMuX3RyYWNrJiYodGhpcy52YWx1ZT10aGlzLnJsPy5saW5lLnJlcGxhY2UoL1xcdC9nLFwiXCIpLHRoaXMuX2N1cnNvcj10aGlzLnJsPy5jdXJzb3I/PzAsdGhpcy5lbWl0KFwidmFsdWVcIix0aGlzLnZhbHVlKSksRCgpfSx0aGlzLmlucHV0LnBpcGUoRiksdGhpcy5ybD1PLmNyZWF0ZUludGVyZmFjZSh7aW5wdXQ6dGhpcy5pbnB1dCxvdXRwdXQ6Rix0YWJTaXplOjIscHJvbXB0OlwiXCIsZXNjYXBlQ29kZVRpbWVvdXQ6NTAsdGVybWluYWw6ITB9KSxPLmVtaXRLZXlwcmVzc0V2ZW50cyh0aGlzLmlucHV0LHRoaXMucmwpLHRoaXMucmwucHJvbXB0KCksdGhpcy5vcHRzLmluaXRpYWxWYWx1ZSE9PXZvaWQgMCYmdGhpcy5fdHJhY2smJnRoaXMucmwud3JpdGUodGhpcy5vcHRzLmluaXRpYWxWYWx1ZSksdGhpcy5pbnB1dC5vbihcImtleXByZXNzXCIsdGhpcy5vbktleXByZXNzKSxtKHRoaXMuaW5wdXQsITApLHRoaXMub3V0cHV0Lm9uKFwicmVzaXplXCIsdGhpcy5yZW5kZXIpLHRoaXMucmVuZGVyKCksdGhpcy5vbmNlKFwic3VibWl0XCIsKCk9Pnt0aGlzLm91dHB1dC53cml0ZShsLnNob3cpLHRoaXMub3V0cHV0Lm9mZihcInJlc2l6ZVwiLHRoaXMucmVuZGVyKSxtKHRoaXMuaW5wdXQsITEpLHUodGhpcy52YWx1ZSl9KSx0aGlzLm9uY2UoXCJjYW5jZWxcIiwoKT0+e3RoaXMub3V0cHV0LndyaXRlKGwuc2hvdyksdGhpcy5vdXRwdXQub2ZmKFwicmVzaXplXCIsdGhpcy5yZW5kZXIpLG0odGhpcy5pbnB1dCwhMSksdShTKX0pfSl9b25LZXlwcmVzcyh1LHQpe2lmKHRoaXMuc3RhdGU9PT1cImVycm9yXCImJih0aGlzLnN0YXRlPVwiYWN0aXZlXCIpLHQ/Lm5hbWUmJighdGhpcy5fdHJhY2smJkIuYWxpYXNlcy5oYXModC5uYW1lKSYmdGhpcy5lbWl0KFwiY3Vyc29yXCIsQi5hbGlhc2VzLmdldCh0Lm5hbWUpKSxCLmFjdGlvbnMuaGFzKHQubmFtZSkmJnRoaXMuZW1pdChcImN1cnNvclwiLHQubmFtZSkpLHUmJih1LnRvTG93ZXJDYXNlKCk9PT1cInlcInx8dS50b0xvd2VyQ2FzZSgpPT09XCJuXCIpJiZ0aGlzLmVtaXQoXCJjb25maXJtXCIsdS50b0xvd2VyQ2FzZSgpPT09XCJ5XCIpLHU9PT1cIlx0XCImJnRoaXMub3B0cy5wbGFjZWhvbGRlciYmKHRoaXMudmFsdWV8fCh0aGlzLnJsPy53cml0ZSh0aGlzLm9wdHMucGxhY2Vob2xkZXIpLHRoaXMuZW1pdChcInZhbHVlXCIsdGhpcy5vcHRzLnBsYWNlaG9sZGVyKSkpLHUmJnRoaXMuZW1pdChcImtleVwiLHUudG9Mb3dlckNhc2UoKSksdD8ubmFtZT09PVwicmV0dXJuXCIpe2lmKHRoaXMub3B0cy52YWxpZGF0ZSl7Y29uc3QgRj10aGlzLm9wdHMudmFsaWRhdGUodGhpcy52YWx1ZSk7RiYmKHRoaXMuZXJyb3I9RiBpbnN0YW5jZW9mIEVycm9yP0YubWVzc2FnZTpGLHRoaXMuc3RhdGU9XCJlcnJvclwiLHRoaXMucmw/LndyaXRlKHRoaXMudmFsdWUpKX10aGlzLnN0YXRlIT09XCJlcnJvclwiJiYodGhpcy5zdGF0ZT1cInN1Ym1pdFwiKX0kKFt1LHQ/Lm5hbWUsdD8uc2VxdWVuY2VdLFwiY2FuY2VsXCIpJiYodGhpcy5zdGF0ZT1cImNhbmNlbFwiKSwodGhpcy5zdGF0ZT09PVwic3VibWl0XCJ8fHRoaXMuc3RhdGU9PT1cImNhbmNlbFwiKSYmdGhpcy5lbWl0KFwiZmluYWxpemVcIiksdGhpcy5yZW5kZXIoKSwodGhpcy5zdGF0ZT09PVwic3VibWl0XCJ8fHRoaXMuc3RhdGU9PT1cImNhbmNlbFwiKSYmdGhpcy5jbG9zZSgpfWNsb3NlKCl7dGhpcy5pbnB1dC51bnBpcGUoKSx0aGlzLmlucHV0LnJlbW92ZUxpc3RlbmVyKFwia2V5cHJlc3NcIix0aGlzLm9uS2V5cHJlc3MpLHRoaXMub3V0cHV0LndyaXRlKGBcbmApLG0odGhpcy5pbnB1dCwhMSksdGhpcy5ybD8uY2xvc2UoKSx0aGlzLnJsPXZvaWQgMCx0aGlzLmVtaXQoYCR7dGhpcy5zdGF0ZX1gLHRoaXMudmFsdWUpLHRoaXMudW5zdWJzY3JpYmUoKX1yZXN0b3JlQ3Vyc29yKCl7Y29uc3QgdT1ZKHRoaXMuX3ByZXZGcmFtZSxwcm9jZXNzLnN0ZG91dC5jb2x1bW5zLHtoYXJkOiEwfSkuc3BsaXQoYFxuYCkubGVuZ3RoLTE7dGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKC05OTksdSotMSkpfXJlbmRlcigpe2NvbnN0IHU9WSh0aGlzLl9yZW5kZXIodGhpcyk/P1wiXCIscHJvY2Vzcy5zdGRvdXQuY29sdW1ucyx7aGFyZDohMH0pO2lmKHUhPT10aGlzLl9wcmV2RnJhbWUpe2lmKHRoaXMuc3RhdGU9PT1cImluaXRpYWxcIil0aGlzLm91dHB1dC53cml0ZShsLmhpZGUpO2Vsc2V7Y29uc3QgdD1CRCh0aGlzLl9wcmV2RnJhbWUsdSk7aWYodGhpcy5yZXN0b3JlQ3Vyc29yKCksdCYmdD8ubGVuZ3RoPT09MSl7Y29uc3QgRj10WzBdO3RoaXMub3V0cHV0LndyaXRlKGwubW92ZSgwLEYpKSx0aGlzLm91dHB1dC53cml0ZShiLmxpbmVzKDEpKTtjb25zdCBzPXUuc3BsaXQoYFxuYCk7dGhpcy5vdXRwdXQud3JpdGUoc1tGXSksdGhpcy5fcHJldkZyYW1lPXUsdGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKDAscy5sZW5ndGgtRi0xKSk7cmV0dXJufWlmKHQmJnQ/Lmxlbmd0aD4xKXtjb25zdCBGPXRbMF07dGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKDAsRikpLHRoaXMub3V0cHV0LndyaXRlKGIuZG93bigpKTtjb25zdCBzPXUuc3BsaXQoYFxuYCkuc2xpY2UoRik7dGhpcy5vdXRwdXQud3JpdGUocy5qb2luKGBcbmApKSx0aGlzLl9wcmV2RnJhbWU9dTtyZXR1cm59dGhpcy5vdXRwdXQud3JpdGUoYi5kb3duKCkpfXRoaXMub3V0cHV0LndyaXRlKHUpLHRoaXMuc3RhdGU9PT1cImluaXRpYWxcIiYmKHRoaXMuc3RhdGU9XCJhY3RpdmVcIiksdGhpcy5fcHJldkZyYW1lPXV9fX1jbGFzcyBkRCBleHRlbmRzIHh7Z2V0IGN1cnNvcigpe3JldHVybiB0aGlzLnZhbHVlPzA6MX1nZXQgX3ZhbHVlKCl7cmV0dXJuIHRoaXMuY3Vyc29yPT09MH1jb25zdHJ1Y3Rvcih1KXtzdXBlcih1LCExKSx0aGlzLnZhbHVlPSEhdS5pbml0aWFsVmFsdWUsdGhpcy5vbihcInZhbHVlXCIsKCk9Pnt0aGlzLnZhbHVlPXRoaXMuX3ZhbHVlfSksdGhpcy5vbihcImNvbmZpcm1cIix0PT57dGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKDAsLTEpKSx0aGlzLnZhbHVlPXQsdGhpcy5zdGF0ZT1cInN1Ym1pdFwiLHRoaXMuY2xvc2UoKX0pLHRoaXMub24oXCJjdXJzb3JcIiwoKT0+e3RoaXMudmFsdWU9IXRoaXMudmFsdWV9KX19dmFyIG1EPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxiRD0oZSx1LHQpPT51IGluIGU/bUQoZSx1LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6ZVt1XT10LFo9KGUsdSx0KT0+KGJEKGUsdHlwZW9mIHUhPVwic3ltYm9sXCI/dStcIlwiOnUsdCksdCkscT0oZSx1LHQpPT57aWYoIXUuaGFzKGUpKXRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBcIit0KX0sVD0oZSx1LHQpPT4ocShlLHUsXCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZFwiKSx0P3QuY2FsbChlKTp1LmdldChlKSksd0Q9KGUsdSx0KT0+e2lmKHUuaGFzKGUpKXRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2VcIik7dSBpbnN0YW5jZW9mIFdlYWtTZXQ/dS5hZGQoZSk6dS5zZXQoZSx0KX0seUQ9KGUsdSx0LEYpPT4ocShlLHUsXCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkXCIpLEY/Ri5jYWxsKGUsdCk6dS5zZXQoZSx0KSx0KSxBO2xldCBfRD1jbGFzcyBleHRlbmRzIHh7Y29uc3RydWN0b3IodSl7c3VwZXIodSwhMSksWih0aGlzLFwib3B0aW9uc1wiKSxaKHRoaXMsXCJjdXJzb3JcIiwwKSx3RCh0aGlzLEEsdm9pZCAwKTtjb25zdHtvcHRpb25zOnR9PXU7eUQodGhpcyxBLHUuc2VsZWN0YWJsZUdyb3VwcyE9PSExKSx0aGlzLm9wdGlvbnM9T2JqZWN0LmVudHJpZXModCkuZmxhdE1hcCgoW0Ysc10pPT5be3ZhbHVlOkYsZ3JvdXA6ITAsbGFiZWw6Rn0sLi4ucy5tYXAoaT0+KHsuLi5pLGdyb3VwOkZ9KSldKSx0aGlzLnZhbHVlPVsuLi51LmluaXRpYWxWYWx1ZXM/P1tdXSx0aGlzLmN1cnNvcj1NYXRoLm1heCh0aGlzLm9wdGlvbnMuZmluZEluZGV4KCh7dmFsdWU6Rn0pPT5GPT09dS5jdXJzb3JBdCksVCh0aGlzLEEpPzA6MSksdGhpcy5vbihcImN1cnNvclwiLEY9Pntzd2l0Y2goRil7Y2FzZVwibGVmdFwiOmNhc2VcInVwXCI6e3RoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09MD90aGlzLm9wdGlvbnMubGVuZ3RoLTE6dGhpcy5jdXJzb3ItMTtjb25zdCBzPXRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl0/Lmdyb3VwPT09ITA7IVQodGhpcyxBKSYmcyYmKHRoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09MD90aGlzLm9wdGlvbnMubGVuZ3RoLTE6dGhpcy5jdXJzb3ItMSk7YnJlYWt9Y2FzZVwiZG93blwiOmNhc2VcInJpZ2h0XCI6e3RoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09dGhpcy5vcHRpb25zLmxlbmd0aC0xPzA6dGhpcy5jdXJzb3IrMTtjb25zdCBzPXRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl0/Lmdyb3VwPT09ITA7IVQodGhpcyxBKSYmcyYmKHRoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09dGhpcy5vcHRpb25zLmxlbmd0aC0xPzA6dGhpcy5jdXJzb3IrMSk7YnJlYWt9Y2FzZVwic3BhY2VcIjp0aGlzLnRvZ2dsZVZhbHVlKCk7YnJlYWt9fSl9Z2V0R3JvdXBJdGVtcyh1KXtyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcih0PT50Lmdyb3VwPT09dSl9aXNHcm91cFNlbGVjdGVkKHUpe3JldHVybiB0aGlzLmdldEdyb3VwSXRlbXModSkuZXZlcnkodD0+dGhpcy52YWx1ZS5pbmNsdWRlcyh0LnZhbHVlKSl9dG9nZ2xlVmFsdWUoKXtjb25zdCB1PXRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl07aWYodS5ncm91cD09PSEwKXtjb25zdCB0PXUudmFsdWUsRj10aGlzLmdldEdyb3VwSXRlbXModCk7dGhpcy5pc0dyb3VwU2VsZWN0ZWQodCk/dGhpcy52YWx1ZT10aGlzLnZhbHVlLmZpbHRlcihzPT5GLmZpbmRJbmRleChpPT5pLnZhbHVlPT09cyk9PT0tMSk6dGhpcy52YWx1ZT1bLi4udGhpcy52YWx1ZSwuLi5GLm1hcChzPT5zLnZhbHVlKV0sdGhpcy52YWx1ZT1BcnJheS5mcm9tKG5ldyBTZXQodGhpcy52YWx1ZSkpfWVsc2V7Y29uc3QgdD10aGlzLnZhbHVlLmluY2x1ZGVzKHUudmFsdWUpO3RoaXMudmFsdWU9dD90aGlzLnZhbHVlLmZpbHRlcihGPT5GIT09dS52YWx1ZSk6Wy4uLnRoaXMudmFsdWUsdS52YWx1ZV19fX07QT1uZXcgV2Vha01hcDt2YXIga0Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LCREPShlLHUsdCk9PnUgaW4gZT9rRChlLHUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTplW3VdPXQsSD0oZSx1LHQpPT4oJEQoZSx0eXBlb2YgdSE9XCJzeW1ib2xcIj91K1wiXCI6dSx0KSx0KTtsZXQgU0Q9Y2xhc3MgZXh0ZW5kcyB4e2NvbnN0cnVjdG9yKHUpe3N1cGVyKHUsITEpLEgodGhpcyxcIm9wdGlvbnNcIiksSCh0aGlzLFwiY3Vyc29yXCIsMCksdGhpcy5vcHRpb25zPXUub3B0aW9ucyx0aGlzLnZhbHVlPVsuLi51LmluaXRpYWxWYWx1ZXM/P1tdXSx0aGlzLmN1cnNvcj1NYXRoLm1heCh0aGlzLm9wdGlvbnMuZmluZEluZGV4KCh7dmFsdWU6dH0pPT50PT09dS5jdXJzb3JBdCksMCksdGhpcy5vbihcImtleVwiLHQ9Pnt0PT09XCJhXCImJnRoaXMudG9nZ2xlQWxsKCl9KSx0aGlzLm9uKFwiY3Vyc29yXCIsdD0+e3N3aXRjaCh0KXtjYXNlXCJsZWZ0XCI6Y2FzZVwidXBcIjp0aGlzLmN1cnNvcj10aGlzLmN1cnNvcj09PTA/dGhpcy5vcHRpb25zLmxlbmd0aC0xOnRoaXMuY3Vyc29yLTE7YnJlYWs7Y2FzZVwiZG93blwiOmNhc2VcInJpZ2h0XCI6dGhpcy5jdXJzb3I9dGhpcy5jdXJzb3I9PT10aGlzLm9wdGlvbnMubGVuZ3RoLTE/MDp0aGlzLmN1cnNvcisxO2JyZWFrO2Nhc2VcInNwYWNlXCI6dGhpcy50b2dnbGVWYWx1ZSgpO2JyZWFrfX0pfWdldCBfdmFsdWUoKXtyZXR1cm4gdGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXS52YWx1ZX10b2dnbGVBbGwoKXtjb25zdCB1PXRoaXMudmFsdWUubGVuZ3RoPT09dGhpcy5vcHRpb25zLmxlbmd0aDt0aGlzLnZhbHVlPXU/W106dGhpcy5vcHRpb25zLm1hcCh0PT50LnZhbHVlKX10b2dnbGVWYWx1ZSgpe2NvbnN0IHU9dGhpcy52YWx1ZS5pbmNsdWRlcyh0aGlzLl92YWx1ZSk7dGhpcy52YWx1ZT11P3RoaXMudmFsdWUuZmlsdGVyKHQ9PnQhPT10aGlzLl92YWx1ZSk6Wy4uLnRoaXMudmFsdWUsdGhpcy5fdmFsdWVdfX07dmFyIFREPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqRD0oZSx1LHQpPT51IGluIGU/VEQoZSx1LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6ZVt1XT10LFU9KGUsdSx0KT0+KGpEKGUsdHlwZW9mIHUhPVwic3ltYm9sXCI/dStcIlwiOnUsdCksdCk7Y2xhc3MgTUQgZXh0ZW5kcyB4e2NvbnN0cnVjdG9yKHttYXNrOnUsLi4udH0pe3N1cGVyKHQpLFUodGhpcyxcInZhbHVlV2l0aEN1cnNvclwiLFwiXCIpLFUodGhpcyxcIl9tYXNrXCIsXCJcXHUyMDIyXCIpLHRoaXMuX21hc2s9dT8/XCJcXHUyMDIyXCIsdGhpcy5vbihcImZpbmFsaXplXCIsKCk9Pnt0aGlzLnZhbHVlV2l0aEN1cnNvcj10aGlzLm1hc2tlZH0pLHRoaXMub24oXCJ2YWx1ZVwiLCgpPT57aWYodGhpcy5jdXJzb3I+PXRoaXMudmFsdWUubGVuZ3RoKXRoaXMudmFsdWVXaXRoQ3Vyc29yPWAke3RoaXMubWFza2VkfSR7di5pbnZlcnNlKHYuaGlkZGVuKFwiX1wiKSl9YDtlbHNle2NvbnN0IEY9dGhpcy5tYXNrZWQuc2xpY2UoMCx0aGlzLmN1cnNvcikscz10aGlzLm1hc2tlZC5zbGljZSh0aGlzLmN1cnNvcik7dGhpcy52YWx1ZVdpdGhDdXJzb3I9YCR7Rn0ke3YuaW52ZXJzZShzWzBdKX0ke3Muc2xpY2UoMSl9YH19KX1nZXQgY3Vyc29yKCl7cmV0dXJuIHRoaXMuX2N1cnNvcn1nZXQgbWFza2VkKCl7cmV0dXJuIHRoaXMudmFsdWUucmVwbGFjZUFsbCgvLi9nLHRoaXMuX21hc2spfX12YXIgT0Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LFBEPShlLHUsdCk9PnUgaW4gZT9PRChlLHUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTplW3VdPXQsSj0oZSx1LHQpPT4oUEQoZSx0eXBlb2YgdSE9XCJzeW1ib2xcIj91K1wiXCI6dSx0KSx0KTtjbGFzcyBMRCBleHRlbmRzIHh7Y29uc3RydWN0b3IodSl7c3VwZXIodSwhMSksSih0aGlzLFwib3B0aW9uc1wiKSxKKHRoaXMsXCJjdXJzb3JcIiwwKSx0aGlzLm9wdGlvbnM9dS5vcHRpb25zLHRoaXMuY3Vyc29yPXRoaXMub3B0aW9ucy5maW5kSW5kZXgoKHt2YWx1ZTp0fSk9PnQ9PT11LmluaXRpYWxWYWx1ZSksdGhpcy5jdXJzb3I9PT0tMSYmKHRoaXMuY3Vyc29yPTApLHRoaXMuY2hhbmdlVmFsdWUoKSx0aGlzLm9uKFwiY3Vyc29yXCIsdD0+e3N3aXRjaCh0KXtjYXNlXCJsZWZ0XCI6Y2FzZVwidXBcIjp0aGlzLmN1cnNvcj10aGlzLmN1cnNvcj09PTA/dGhpcy5vcHRpb25zLmxlbmd0aC0xOnRoaXMuY3Vyc29yLTE7YnJlYWs7Y2FzZVwiZG93blwiOmNhc2VcInJpZ2h0XCI6dGhpcy5jdXJzb3I9dGhpcy5jdXJzb3I9PT10aGlzLm9wdGlvbnMubGVuZ3RoLTE/MDp0aGlzLmN1cnNvcisxO2JyZWFrfXRoaXMuY2hhbmdlVmFsdWUoKX0pfWdldCBfdmFsdWUoKXtyZXR1cm4gdGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXX1jaGFuZ2VWYWx1ZSgpe3RoaXMudmFsdWU9dGhpcy5fdmFsdWUudmFsdWV9fXZhciBXRD1PYmplY3QuZGVmaW5lUHJvcGVydHksTkQ9KGUsdSx0KT0+dSBpbiBlP1dEKGUsdSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dH0pOmVbdV09dCxRPShlLHUsdCk9PihORChlLHR5cGVvZiB1IT1cInN5bWJvbFwiP3UrXCJcIjp1LHQpLHQpO2NsYXNzIElEIGV4dGVuZHMgeHtjb25zdHJ1Y3Rvcih1KXtzdXBlcih1LCExKSxRKHRoaXMsXCJvcHRpb25zXCIpLFEodGhpcyxcImN1cnNvclwiLDApLHRoaXMub3B0aW9ucz11Lm9wdGlvbnM7Y29uc3QgdD10aGlzLm9wdGlvbnMubWFwKCh7dmFsdWU6W0ZdfSk9PkY/LnRvTG93ZXJDYXNlKCkpO3RoaXMuY3Vyc29yPU1hdGgubWF4KHQuaW5kZXhPZih1LmluaXRpYWxWYWx1ZSksMCksdGhpcy5vbihcImtleVwiLEY9PntpZighdC5pbmNsdWRlcyhGKSlyZXR1cm47Y29uc3Qgcz10aGlzLm9wdGlvbnMuZmluZCgoe3ZhbHVlOltpXX0pPT5pPy50b0xvd2VyQ2FzZSgpPT09Rik7cyYmKHRoaXMudmFsdWU9cy52YWx1ZSx0aGlzLnN0YXRlPVwic3VibWl0XCIsdGhpcy5lbWl0KFwic3VibWl0XCIpKX0pfX1jbGFzcyBSRCBleHRlbmRzIHh7Z2V0IHZhbHVlV2l0aEN1cnNvcigpe2lmKHRoaXMuc3RhdGU9PT1cInN1Ym1pdFwiKXJldHVybiB0aGlzLnZhbHVlO2lmKHRoaXMuY3Vyc29yPj10aGlzLnZhbHVlLmxlbmd0aClyZXR1cm5gJHt0aGlzLnZhbHVlfVxcdTI1ODhgO2NvbnN0IHU9dGhpcy52YWx1ZS5zbGljZSgwLHRoaXMuY3Vyc29yKSxbdCwuLi5GXT10aGlzLnZhbHVlLnNsaWNlKHRoaXMuY3Vyc29yKTtyZXR1cm5gJHt1fSR7di5pbnZlcnNlKHQpfSR7Ri5qb2luKFwiXCIpfWB9Z2V0IGN1cnNvcigpe3JldHVybiB0aGlzLl9jdXJzb3J9Y29uc3RydWN0b3IodSl7c3VwZXIodSksdGhpcy5vbihcImZpbmFsaXplXCIsKCk9Pnt0aGlzLnZhbHVlfHwodGhpcy52YWx1ZT11LmRlZmF1bHRWYWx1ZSl9KX19ZXhwb3J0e2REIGFzIENvbmZpcm1Qcm9tcHQsX0QgYXMgR3JvdXBNdWx0aVNlbGVjdFByb21wdCxTRCBhcyBNdWx0aVNlbGVjdFByb21wdCxNRCBhcyBQYXNzd29yZFByb21wdCx4IGFzIFByb21wdCxJRCBhcyBTZWxlY3RLZXlQcm9tcHQsTEQgYXMgU2VsZWN0UHJvbXB0LFJEIGFzIFRleHRQcm9tcHQsZkQgYXMgYmxvY2sscEQgYXMgaXNDYW5jZWwsY0QgYXMgdXBkYXRlU2V0dGluZ3N9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwKICAgICJpbXBvcnR7c3RyaXBWVENvbnRyb2xDaGFyYWN0ZXJzIGFzIFN9ZnJvbVwibm9kZTp1dGlsXCI7aW1wb3J0e1RleHRQcm9tcHQgYXMgUSxQYXNzd29yZFByb21wdCBhcyBYLENvbmZpcm1Qcm9tcHQgYXMgWixTZWxlY3RQcm9tcHQgYXMgZWUsU2VsZWN0S2V5UHJvbXB0IGFzIHRlLE11bHRpU2VsZWN0UHJvbXB0IGFzIHJlLEdyb3VwTXVsdGlTZWxlY3RQcm9tcHQgYXMgc2UsaXNDYW5jZWwgYXMgaWUsYmxvY2sgYXMgbmV9ZnJvbVwiQGNsYWNrL2NvcmVcIjtleHBvcnR7aXNDYW5jZWwsdXBkYXRlU2V0dGluZ3N9ZnJvbVwiQGNsYWNrL2NvcmVcIjtpbXBvcnQgeSBmcm9tXCJub2RlOnByb2Nlc3NcIjtpbXBvcnQgZSBmcm9tXCJwaWNvY29sb3JzXCI7aW1wb3J0e2N1cnNvciBhcyBvZSxlcmFzZSBhcyBhZX1mcm9tXCJzaXN0ZXJhbnNpXCI7ZnVuY3Rpb24gY2UoKXtyZXR1cm4geS5wbGF0Zm9ybSE9PVwid2luMzJcIj95LmVudi5URVJNIT09XCJsaW51eFwiOiEheS5lbnYuQ0l8fCEheS5lbnYuV1RfU0VTU0lPTnx8ISF5LmVudi5URVJNSU5VU19TVUJMSU1FfHx5LmVudi5Db25FbXVUYXNrPT09XCJ7Y21kOjpDbWRlcn1cInx8eS5lbnYuVEVSTV9QUk9HUkFNPT09XCJUZXJtaW51cy1TdWJsaW1lXCJ8fHkuZW52LlRFUk1fUFJPR1JBTT09PVwidnNjb2RlXCJ8fHkuZW52LlRFUk09PT1cInh0ZXJtLTI1NmNvbG9yXCJ8fHkuZW52LlRFUk09PT1cImFsYWNyaXR0eVwifHx5LmVudi5URVJNSU5BTF9FTVVMQVRPUj09PVwiSmV0QnJhaW5zLUplZGlUZXJtXCJ9Y29uc3QgVj1jZSgpLHU9KHQsbik9PlY/dDpuLGxlPXUoXCJcXHUyNUM2XCIsXCIqXCIpLEw9dShcIlxcdTI1QTBcIixcInhcIiksVz11KFwiXFx1MjVCMlwiLFwieFwiKSxDPXUoXCJcXHUyNUM3XCIsXCJvXCIpLHVlPXUoXCJcXHUyNTBDXCIsXCJUXCIpLG89dShcIlxcdTI1MDJcIixcInxcIiksZD11KFwiXFx1MjUxNFwiLFwiXFx1MjAxNFwiKSxrPXUoXCJcXHUyNUNGXCIsXCI+XCIpLFA9dShcIlxcdTI1Q0JcIixcIiBcIiksQT11KFwiXFx1MjVGQlwiLFwiW1xcdTIwMjJdXCIpLFQ9dShcIlxcdTI1RkNcIixcIlsrXVwiKSxGPXUoXCJcXHUyNUZCXCIsXCJbIF1cIiksJGU9dShcIlxcdTI1QUFcIixcIlxcdTIwMjJcIiksXz11KFwiXFx1MjUwMFwiLFwiLVwiKSxtZT11KFwiXFx1MjU2RVwiLFwiK1wiKSxkZT11KFwiXFx1MjUxQ1wiLFwiK1wiKSxwZT11KFwiXFx1MjU2RlwiLFwiK1wiKSxxPXUoXCJcXHUyNUNGXCIsXCJcXHUyMDIyXCIpLEQ9dShcIlxcdTI1QzZcIixcIipcIiksVT11KFwiXFx1MjVCMlwiLFwiIVwiKSxLPXUoXCJcXHUyNUEwXCIsXCJ4XCIpLGI9dD0+e3N3aXRjaCh0KXtjYXNlXCJpbml0aWFsXCI6Y2FzZVwiYWN0aXZlXCI6cmV0dXJuIGUuY3lhbihsZSk7Y2FzZVwiY2FuY2VsXCI6cmV0dXJuIGUucmVkKEwpO2Nhc2VcImVycm9yXCI6cmV0dXJuIGUueWVsbG93KFcpO2Nhc2VcInN1Ym1pdFwiOnJldHVybiBlLmdyZWVuKEMpfX0sRz10PT57Y29uc3R7Y3Vyc29yOm4sb3B0aW9uczpyLHN0eWxlOml9PXQscz10Lm1heEl0ZW1zPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYz1NYXRoLm1heChwcm9jZXNzLnN0ZG91dC5yb3dzLTQsMCksYT1NYXRoLm1pbihjLE1hdGgubWF4KHMsNSkpO2xldCBsPTA7bj49bCthLTM/bD1NYXRoLm1heChNYXRoLm1pbihuLWErMyxyLmxlbmd0aC1hKSwwKTpuPGwrMiYmKGw9TWF0aC5tYXgobi0yLDApKTtjb25zdCAkPWE8ci5sZW5ndGgmJmw+MCxnPWE8ci5sZW5ndGgmJmwrYTxyLmxlbmd0aDtyZXR1cm4gci5zbGljZShsLGwrYSkubWFwKChwLHYsZik9Pntjb25zdCBqPXY9PT0wJiYkLEU9dj09PWYubGVuZ3RoLTEmJmc7cmV0dXJuIGp8fEU/ZS5kaW0oXCIuLi5cIik6aShwLHYrbD09PW4pfSl9LGhlPXQ9Pm5ldyBRKHt2YWxpZGF0ZTp0LnZhbGlkYXRlLHBsYWNlaG9sZGVyOnQucGxhY2Vob2xkZXIsZGVmYXVsdFZhbHVlOnQuZGVmYXVsdFZhbHVlLGluaXRpYWxWYWx1ZTp0LmluaXRpYWxWYWx1ZSxyZW5kZXIoKXtjb25zdCBuPWAke2UuZ3JheShvKX1cbiR7Yih0aGlzLnN0YXRlKX0gICR7dC5tZXNzYWdlfVxuYCxyPXQucGxhY2Vob2xkZXI/ZS5pbnZlcnNlKHQucGxhY2Vob2xkZXJbMF0pK2UuZGltKHQucGxhY2Vob2xkZXIuc2xpY2UoMSkpOmUuaW52ZXJzZShlLmhpZGRlbihcIl9cIikpLGk9dGhpcy52YWx1ZT90aGlzLnZhbHVlV2l0aEN1cnNvcjpyO3N3aXRjaCh0aGlzLnN0YXRlKXtjYXNlXCJlcnJvclwiOnJldHVybmAke24udHJpbSgpfVxuJHtlLnllbGxvdyhvKX0gICR7aX1cbiR7ZS55ZWxsb3coZCl9ICAke2UueWVsbG93KHRoaXMuZXJyb3IpfVxuYDtjYXNlXCJzdWJtaXRcIjpyZXR1cm5gJHtufSR7ZS5ncmF5KG8pfSAgJHtlLmRpbSh0aGlzLnZhbHVlfHx0LnBsYWNlaG9sZGVyKX1gO2Nhc2VcImNhbmNlbFwiOnJldHVybmAke259JHtlLmdyYXkobyl9ICAke2Uuc3RyaWtldGhyb3VnaChlLmRpbSh0aGlzLnZhbHVlPz9cIlwiKSl9JHt0aGlzLnZhbHVlPy50cmltKCk/YFxuJHtlLmdyYXkobyl9YDpcIlwifWA7ZGVmYXVsdDpyZXR1cm5gJHtufSR7ZS5jeWFuKG8pfSAgJHtpfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKSxnZT10PT5uZXcgWCh7dmFsaWRhdGU6dC52YWxpZGF0ZSxtYXNrOnQubWFzaz8/JGUscmVuZGVyKCl7Y29uc3Qgbj1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmAscj10aGlzLnZhbHVlV2l0aEN1cnNvcixpPXRoaXMubWFza2VkO3N3aXRjaCh0aGlzLnN0YXRlKXtjYXNlXCJlcnJvclwiOnJldHVybmAke24udHJpbSgpfVxuJHtlLnllbGxvdyhvKX0gICR7aX1cbiR7ZS55ZWxsb3coZCl9ICAke2UueWVsbG93KHRoaXMuZXJyb3IpfVxuYDtjYXNlXCJzdWJtaXRcIjpyZXR1cm5gJHtufSR7ZS5ncmF5KG8pfSAgJHtlLmRpbShpKX1gO2Nhc2VcImNhbmNlbFwiOnJldHVybmAke259JHtlLmdyYXkobyl9ICAke2Uuc3RyaWtldGhyb3VnaChlLmRpbShpPz9cIlwiKSl9JHtpP2BcbiR7ZS5ncmF5KG8pfWA6XCJcIn1gO2RlZmF1bHQ6cmV0dXJuYCR7bn0ke2UuY3lhbihvKX0gICR7cn1cbiR7ZS5jeWFuKGQpfVxuYH19fSkucHJvbXB0KCkseWU9dD0+e2NvbnN0IG49dC5hY3RpdmU/P1wiWWVzXCIscj10LmluYWN0aXZlPz9cIk5vXCI7cmV0dXJuIG5ldyBaKHthY3RpdmU6bixpbmFjdGl2ZTpyLGluaXRpYWxWYWx1ZTp0LmluaXRpYWxWYWx1ZT8/ITAscmVuZGVyKCl7Y29uc3QgaT1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmAscz10aGlzLnZhbHVlP246cjtzd2l0Y2godGhpcy5zdGF0ZSl7Y2FzZVwic3VibWl0XCI6cmV0dXJuYCR7aX0ke2UuZ3JheShvKX0gICR7ZS5kaW0ocyl9YDtjYXNlXCJjYW5jZWxcIjpyZXR1cm5gJHtpfSR7ZS5ncmF5KG8pfSAgJHtlLnN0cmlrZXRocm91Z2goZS5kaW0ocykpfVxuJHtlLmdyYXkobyl9YDtkZWZhdWx0OnJldHVybmAke2l9JHtlLmN5YW4obyl9ICAke3RoaXMudmFsdWU/YCR7ZS5ncmVlbihrKX0gJHtufWA6YCR7ZS5kaW0oUCl9ICR7ZS5kaW0obil9YH0gJHtlLmRpbShcIi9cIil9ICR7dGhpcy52YWx1ZT9gJHtlLmRpbShQKX0gJHtlLmRpbShyKX1gOmAke2UuZ3JlZW4oayl9ICR7cn1gfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKX0sdmU9dD0+e2NvbnN0IG49KHIsaSk9Pntjb25zdCBzPXIubGFiZWw/P1N0cmluZyhyLnZhbHVlKTtzd2l0Y2goaSl7Y2FzZVwic2VsZWN0ZWRcIjpyZXR1cm5gJHtlLmRpbShzKX1gO2Nhc2VcImFjdGl2ZVwiOnJldHVybmAke2UuZ3JlZW4oayl9ICR7c30gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gO2Nhc2VcImNhbmNlbGxlZFwiOnJldHVybmAke2Uuc3RyaWtldGhyb3VnaChlLmRpbShzKSl9YDtkZWZhdWx0OnJldHVybmAke2UuZGltKFApfSAke2UuZGltKHMpfWB9fTtyZXR1cm4gbmV3IGVlKHtvcHRpb25zOnQub3B0aW9ucyxpbml0aWFsVmFsdWU6dC5pbml0aWFsVmFsdWUscmVuZGVyKCl7Y29uc3Qgcj1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmA7c3dpdGNoKHRoaXMuc3RhdGUpe2Nhc2VcInN1Ym1pdFwiOnJldHVybmAke3J9JHtlLmdyYXkobyl9ICAke24odGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXSxcInNlbGVjdGVkXCIpfWA7Y2FzZVwiY2FuY2VsXCI6cmV0dXJuYCR7cn0ke2UuZ3JheShvKX0gICR7bih0aGlzLm9wdGlvbnNbdGhpcy5jdXJzb3JdLFwiY2FuY2VsbGVkXCIpfVxuJHtlLmdyYXkobyl9YDtkZWZhdWx0OnJldHVybmAke3J9JHtlLmN5YW4obyl9ICAke0coe2N1cnNvcjp0aGlzLmN1cnNvcixvcHRpb25zOnRoaXMub3B0aW9ucyxtYXhJdGVtczp0Lm1heEl0ZW1zLHN0eWxlOihpLHMpPT5uKGkscz9cImFjdGl2ZVwiOlwiaW5hY3RpdmVcIil9KS5qb2luKGBcbiR7ZS5jeWFuKG8pfSAgYCl9XG4ke2UuY3lhbihkKX1cbmB9fX0pLnByb21wdCgpfSx3ZT10PT57Y29uc3Qgbj0ocixpPVwiaW5hY3RpdmVcIik9Pntjb25zdCBzPXIubGFiZWw/P1N0cmluZyhyLnZhbHVlKTtyZXR1cm4gaT09PVwic2VsZWN0ZWRcIj9gJHtlLmRpbShzKX1gOmk9PT1cImNhbmNlbGxlZFwiP2Ake2Uuc3RyaWtldGhyb3VnaChlLmRpbShzKSl9YDppPT09XCJhY3RpdmVcIj9gJHtlLmJnQ3lhbihlLmdyYXkoYCAke3IudmFsdWV9IGApKX0gJHtzfSAke3IuaGludD9lLmRpbShgKCR7ci5oaW50fSlgKTpcIlwifWA6YCR7ZS5ncmF5KGUuYmdXaGl0ZShlLmludmVyc2UoYCAke3IudmFsdWV9IGApKSl9ICR7c30gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gfTtyZXR1cm4gbmV3IHRlKHtvcHRpb25zOnQub3B0aW9ucyxpbml0aWFsVmFsdWU6dC5pbml0aWFsVmFsdWUscmVuZGVyKCl7Y29uc3Qgcj1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmA7c3dpdGNoKHRoaXMuc3RhdGUpe2Nhc2VcInN1Ym1pdFwiOnJldHVybmAke3J9JHtlLmdyYXkobyl9ICAke24odGhpcy5vcHRpb25zLmZpbmQoaT0+aS52YWx1ZT09PXRoaXMudmFsdWUpPz90Lm9wdGlvbnNbMF0sXCJzZWxlY3RlZFwiKX1gO2Nhc2VcImNhbmNlbFwiOnJldHVybmAke3J9JHtlLmdyYXkobyl9ICAke24odGhpcy5vcHRpb25zWzBdLFwiY2FuY2VsbGVkXCIpfVxuJHtlLmdyYXkobyl9YDtkZWZhdWx0OnJldHVybmAke3J9JHtlLmN5YW4obyl9ICAke3RoaXMub3B0aW9ucy5tYXAoKGkscyk9Pm4oaSxzPT09dGhpcy5jdXJzb3I/XCJhY3RpdmVcIjpcImluYWN0aXZlXCIpKS5qb2luKGBcbiR7ZS5jeWFuKG8pfSAgYCl9XG4ke2UuY3lhbihkKX1cbmB9fX0pLnByb21wdCgpfSxmZT10PT57Y29uc3Qgbj0ocixpKT0+e2NvbnN0IHM9ci5sYWJlbD8/U3RyaW5nKHIudmFsdWUpO3JldHVybiBpPT09XCJhY3RpdmVcIj9gJHtlLmN5YW4oQSl9ICR7c30gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gOmk9PT1cInNlbGVjdGVkXCI/YCR7ZS5ncmVlbihUKX0gJHtlLmRpbShzKX0gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gOmk9PT1cImNhbmNlbGxlZFwiP2Ake2Uuc3RyaWtldGhyb3VnaChlLmRpbShzKSl9YDppPT09XCJhY3RpdmUtc2VsZWN0ZWRcIj9gJHtlLmdyZWVuKFQpfSAke3N9ICR7ci5oaW50P2UuZGltKGAoJHtyLmhpbnR9KWApOlwiXCJ9YDppPT09XCJzdWJtaXR0ZWRcIj9gJHtlLmRpbShzKX1gOmAke2UuZGltKEYpfSAke2UuZGltKHMpfWB9O3JldHVybiBuZXcgcmUoe29wdGlvbnM6dC5vcHRpb25zLGluaXRpYWxWYWx1ZXM6dC5pbml0aWFsVmFsdWVzLHJlcXVpcmVkOnQucmVxdWlyZWQ/PyEwLGN1cnNvckF0OnQuY3Vyc29yQXQsdmFsaWRhdGUocil7aWYodGhpcy5yZXF1aXJlZCYmci5sZW5ndGg9PT0wKXJldHVybmBQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBvcHRpb24uXG4ke2UucmVzZXQoZS5kaW0oYFByZXNzICR7ZS5ncmF5KGUuYmdXaGl0ZShlLmludmVyc2UoXCIgc3BhY2UgXCIpKSl9IHRvIHNlbGVjdCwgJHtlLmdyYXkoZS5iZ1doaXRlKGUuaW52ZXJzZShcIiBlbnRlciBcIikpKX0gdG8gc3VibWl0YCkpfWB9LHJlbmRlcigpe2NvbnN0IHI9YCR7ZS5ncmF5KG8pfVxuJHtiKHRoaXMuc3RhdGUpfSAgJHt0Lm1lc3NhZ2V9XG5gLGk9KHMsYyk9Pntjb25zdCBhPXRoaXMudmFsdWUuaW5jbHVkZXMocy52YWx1ZSk7cmV0dXJuIGMmJmE/bihzLFwiYWN0aXZlLXNlbGVjdGVkXCIpOmE/bihzLFwic2VsZWN0ZWRcIik6bihzLGM/XCJhY3RpdmVcIjpcImluYWN0aXZlXCIpfTtzd2l0Y2godGhpcy5zdGF0ZSl7Y2FzZVwic3VibWl0XCI6cmV0dXJuYCR7cn0ke2UuZ3JheShvKX0gICR7dGhpcy5vcHRpb25zLmZpbHRlcigoe3ZhbHVlOnN9KT0+dGhpcy52YWx1ZS5pbmNsdWRlcyhzKSkubWFwKHM9Pm4ocyxcInN1Ym1pdHRlZFwiKSkuam9pbihlLmRpbShcIiwgXCIpKXx8ZS5kaW0oXCJub25lXCIpfWA7Y2FzZVwiY2FuY2VsXCI6e2NvbnN0IHM9dGhpcy5vcHRpb25zLmZpbHRlcigoe3ZhbHVlOmN9KT0+dGhpcy52YWx1ZS5pbmNsdWRlcyhjKSkubWFwKGM9Pm4oYyxcImNhbmNlbGxlZFwiKSkuam9pbihlLmRpbShcIiwgXCIpKTtyZXR1cm5gJHtyfSR7ZS5ncmF5KG8pfSAgJHtzLnRyaW0oKT9gJHtzfVxuJHtlLmdyYXkobyl9YDpcIlwifWB9Y2FzZVwiZXJyb3JcIjp7Y29uc3Qgcz10aGlzLmVycm9yLnNwbGl0KGBcbmApLm1hcCgoYyxhKT0+YT09PTA/YCR7ZS55ZWxsb3coZCl9ICAke2UueWVsbG93KGMpfWA6YCAgICR7Y31gKS5qb2luKGBcbmApO3JldHVybmAke3IrZS55ZWxsb3cobyl9ICAke0coe29wdGlvbnM6dGhpcy5vcHRpb25zLGN1cnNvcjp0aGlzLmN1cnNvcixtYXhJdGVtczp0Lm1heEl0ZW1zLHN0eWxlOml9KS5qb2luKGBcbiR7ZS55ZWxsb3cobyl9ICBgKX1cbiR7c31cbmB9ZGVmYXVsdDpyZXR1cm5gJHtyfSR7ZS5jeWFuKG8pfSAgJHtHKHtvcHRpb25zOnRoaXMub3B0aW9ucyxjdXJzb3I6dGhpcy5jdXJzb3IsbWF4SXRlbXM6dC5tYXhJdGVtcyxzdHlsZTppfSkuam9pbihgXG4ke2UuY3lhbihvKX0gIGApfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKX0sYmU9dD0+e2NvbnN0e3NlbGVjdGFibGVHcm91cHM6bj0hMH09dCxyPShpLHMsYz1bXSk9Pntjb25zdCBhPWkubGFiZWw/P1N0cmluZyhpLnZhbHVlKSxsPXR5cGVvZiBpLmdyb3VwPT1cInN0cmluZ1wiLCQ9bCYmKGNbYy5pbmRleE9mKGkpKzFdPz97Z3JvdXA6ITB9KSxnPWwmJiQuZ3JvdXA9PT0hMCxwPWw/bj9gJHtnP2Q6b30gYDpcIiAgXCI6XCJcIjtpZihzPT09XCJhY3RpdmVcIilyZXR1cm5gJHtlLmRpbShwKX0ke2UuY3lhbihBKX0gJHthfSAke2kuaGludD9lLmRpbShgKCR7aS5oaW50fSlgKTpcIlwifWA7aWYocz09PVwiZ3JvdXAtYWN0aXZlXCIpcmV0dXJuYCR7cH0ke2UuY3lhbihBKX0gJHtlLmRpbShhKX1gO2lmKHM9PT1cImdyb3VwLWFjdGl2ZS1zZWxlY3RlZFwiKXJldHVybmAke3B9JHtlLmdyZWVuKFQpfSAke2UuZGltKGEpfWA7aWYocz09PVwic2VsZWN0ZWRcIil7Y29uc3QgZj1sfHxuP2UuZ3JlZW4oVCk6XCJcIjtyZXR1cm5gJHtlLmRpbShwKX0ke2Z9ICR7ZS5kaW0oYSl9ICR7aS5oaW50P2UuZGltKGAoJHtpLmhpbnR9KWApOlwiXCJ9YH1pZihzPT09XCJjYW5jZWxsZWRcIilyZXR1cm5gJHtlLnN0cmlrZXRocm91Z2goZS5kaW0oYSkpfWA7aWYocz09PVwiYWN0aXZlLXNlbGVjdGVkXCIpcmV0dXJuYCR7ZS5kaW0ocCl9JHtlLmdyZWVuKFQpfSAke2F9ICR7aS5oaW50P2UuZGltKGAoJHtpLmhpbnR9KWApOlwiXCJ9YDtpZihzPT09XCJzdWJtaXR0ZWRcIilyZXR1cm5gJHtlLmRpbShhKX1gO2NvbnN0IHY9bHx8bj9lLmRpbShGKTpcIlwiO3JldHVybmAke2UuZGltKHApfSR7dn0gJHtlLmRpbShhKX1gfTtyZXR1cm4gbmV3IHNlKHtvcHRpb25zOnQub3B0aW9ucyxpbml0aWFsVmFsdWVzOnQuaW5pdGlhbFZhbHVlcyxyZXF1aXJlZDp0LnJlcXVpcmVkPz8hMCxjdXJzb3JBdDp0LmN1cnNvckF0LHNlbGVjdGFibGVHcm91cHM6bix2YWxpZGF0ZShpKXtpZih0aGlzLnJlcXVpcmVkJiZpLmxlbmd0aD09PTApcmV0dXJuYFBsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIG9wdGlvbi5cbiR7ZS5yZXNldChlLmRpbShgUHJlc3MgJHtlLmdyYXkoZS5iZ1doaXRlKGUuaW52ZXJzZShcIiBzcGFjZSBcIikpKX0gdG8gc2VsZWN0LCAke2UuZ3JheShlLmJnV2hpdGUoZS5pbnZlcnNlKFwiIGVudGVyIFwiKSkpfSB0byBzdWJtaXRgKSl9YH0scmVuZGVyKCl7Y29uc3QgaT1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmA7c3dpdGNoKHRoaXMuc3RhdGUpe2Nhc2VcInN1Ym1pdFwiOnJldHVybmAke2l9JHtlLmdyYXkobyl9ICAke3RoaXMub3B0aW9ucy5maWx0ZXIoKHt2YWx1ZTpzfSk9PnRoaXMudmFsdWUuaW5jbHVkZXMocykpLm1hcChzPT5yKHMsXCJzdWJtaXR0ZWRcIikpLmpvaW4oZS5kaW0oXCIsIFwiKSl9YDtjYXNlXCJjYW5jZWxcIjp7Y29uc3Qgcz10aGlzLm9wdGlvbnMuZmlsdGVyKCh7dmFsdWU6Y30pPT50aGlzLnZhbHVlLmluY2x1ZGVzKGMpKS5tYXAoYz0+cihjLFwiY2FuY2VsbGVkXCIpKS5qb2luKGUuZGltKFwiLCBcIikpO3JldHVybmAke2l9JHtlLmdyYXkobyl9ICAke3MudHJpbSgpP2Ake3N9XG4ke2UuZ3JheShvKX1gOlwiXCJ9YH1jYXNlXCJlcnJvclwiOntjb25zdCBzPXRoaXMuZXJyb3Iuc3BsaXQoYFxuYCkubWFwKChjLGEpPT5hPT09MD9gJHtlLnllbGxvdyhkKX0gICR7ZS55ZWxsb3coYyl9YDpgICAgJHtjfWApLmpvaW4oYFxuYCk7cmV0dXJuYCR7aX0ke2UueWVsbG93KG8pfSAgJHt0aGlzLm9wdGlvbnMubWFwKChjLGEsbCk9Pntjb25zdCAkPXRoaXMudmFsdWUuaW5jbHVkZXMoYy52YWx1ZSl8fGMuZ3JvdXA9PT0hMCYmdGhpcy5pc0dyb3VwU2VsZWN0ZWQoYCR7Yy52YWx1ZX1gKSxnPWE9PT10aGlzLmN1cnNvcjtyZXR1cm4hZyYmdHlwZW9mIGMuZ3JvdXA9PVwic3RyaW5nXCImJnRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl0udmFsdWU9PT1jLmdyb3VwP3IoYywkP1wiZ3JvdXAtYWN0aXZlLXNlbGVjdGVkXCI6XCJncm91cC1hY3RpdmVcIixsKTpnJiYkP3IoYyxcImFjdGl2ZS1zZWxlY3RlZFwiLGwpOiQ/cihjLFwic2VsZWN0ZWRcIixsKTpyKGMsZz9cImFjdGl2ZVwiOlwiaW5hY3RpdmVcIixsKX0pLmpvaW4oYFxuJHtlLnllbGxvdyhvKX0gIGApfVxuJHtzfVxuYH1kZWZhdWx0OnJldHVybmAke2l9JHtlLmN5YW4obyl9ICAke3RoaXMub3B0aW9ucy5tYXAoKHMsYyxhKT0+e2NvbnN0IGw9dGhpcy52YWx1ZS5pbmNsdWRlcyhzLnZhbHVlKXx8cy5ncm91cD09PSEwJiZ0aGlzLmlzR3JvdXBTZWxlY3RlZChgJHtzLnZhbHVlfWApLCQ9Yz09PXRoaXMuY3Vyc29yO3JldHVybiEkJiZ0eXBlb2Ygcy5ncm91cD09XCJzdHJpbmdcIiYmdGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXS52YWx1ZT09PXMuZ3JvdXA/cihzLGw/XCJncm91cC1hY3RpdmUtc2VsZWN0ZWRcIjpcImdyb3VwLWFjdGl2ZVwiLGEpOiQmJmw/cihzLFwiYWN0aXZlLXNlbGVjdGVkXCIsYSk6bD9yKHMsXCJzZWxlY3RlZFwiLGEpOnIocywkP1wiYWN0aXZlXCI6XCJpbmFjdGl2ZVwiLGEpfSkuam9pbihgXG4ke2UuY3lhbihvKX0gIGApfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKX0sTWU9KHQ9XCJcIixuPVwiXCIpPT57Y29uc3Qgcj1gXG4ke3R9XG5gLnNwbGl0KGBcbmApLGk9UyhuKS5sZW5ndGgscz1NYXRoLm1heChyLnJlZHVjZSgoYSxsKT0+e2NvbnN0ICQ9UyhsKTtyZXR1cm4gJC5sZW5ndGg+YT8kLmxlbmd0aDphfSwwKSxpKSsyLGM9ci5tYXAoYT0+YCR7ZS5ncmF5KG8pfSAgJHtlLmRpbShhKX0ke1wiIFwiLnJlcGVhdChzLVMoYSkubGVuZ3RoKX0ke2UuZ3JheShvKX1gKS5qb2luKGBcbmApO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2UuZ3JheShvKX1cbiR7ZS5ncmVlbihDKX0gICR7ZS5yZXNldChuKX0gJHtlLmdyYXkoXy5yZXBlYXQoTWF0aC5tYXgocy1pLTEsMSkpK21lKX1cbiR7Y31cbiR7ZS5ncmF5KGRlK18ucmVwZWF0KHMrMikrcGUpfVxuYCl9LHhlPSh0PVwiXCIpPT57cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7ZS5ncmF5KGQpfSAgJHtlLnJlZCh0KX1cblxuYCl9LEllPSh0PVwiXCIpPT57cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7ZS5ncmF5KHVlKX0gICR7dH1cbmApfSxTZT0odD1cIlwiKT0+e3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2UuZ3JheShvKX1cbiR7ZS5ncmF5KGQpfSAgJHt0fVxuXG5gKX0sTT17bWVzc2FnZToodD1cIlwiLHtzeW1ib2w6bj1lLmdyYXkobyl9PXt9KT0+e2NvbnN0IHI9W2Ake2UuZ3JheShvKX1gXTtpZih0KXtjb25zdFtpLC4uLnNdPXQuc3BsaXQoYFxuYCk7ci5wdXNoKGAke259ICAke2l9YCwuLi5zLm1hcChjPT5gJHtlLmdyYXkobyl9ICAke2N9YCkpfXByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3Iuam9pbihgXG5gKX1cbmApfSxpbmZvOnQ9PntNLm1lc3NhZ2UodCx7c3ltYm9sOmUuYmx1ZShxKX0pfSxzdWNjZXNzOnQ9PntNLm1lc3NhZ2UodCx7c3ltYm9sOmUuZ3JlZW4oRCl9KX0sc3RlcDp0PT57TS5tZXNzYWdlKHQse3N5bWJvbDplLmdyZWVuKEMpfSl9LHdhcm46dD0+e00ubWVzc2FnZSh0LHtzeW1ib2w6ZS55ZWxsb3coVSl9KX0sd2FybmluZzp0PT57TS53YXJuKHQpfSxlcnJvcjp0PT57TS5tZXNzYWdlKHQse3N5bWJvbDplLnJlZChLKX0pfX0sSj1gJHtlLmdyYXkobyl9ICBgLHg9e21lc3NhZ2U6YXN5bmModCx7c3ltYm9sOm49ZS5ncmF5KG8pfT17fSk9Pntwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtlLmdyYXkobyl9XG4ke259ICBgKTtsZXQgcj0zO2ZvciBhd2FpdChsZXQgaSBvZiB0KXtpPWkucmVwbGFjZSgvXFxuL2csYFxuJHtKfWApLGkuaW5jbHVkZXMoYFxuYCkmJihyPTMrUyhpLnNsaWNlKGkubGFzdEluZGV4T2YoYFxuYCkpKS5sZW5ndGgpO2NvbnN0IHM9UyhpKS5sZW5ndGg7citzPHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM/KHIrPXMscHJvY2Vzcy5zdGRvdXQud3JpdGUoaSkpOihwcm9jZXNzLnN0ZG91dC53cml0ZShgXG4ke0p9JHtpLnRyaW1TdGFydCgpfWApLHI9MytTKGkudHJpbVN0YXJ0KCkpLmxlbmd0aCl9cHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxuYCl9LGluZm86dD0+eC5tZXNzYWdlKHQse3N5bWJvbDplLmJsdWUocSl9KSxzdWNjZXNzOnQ9PngubWVzc2FnZSh0LHtzeW1ib2w6ZS5ncmVlbihEKX0pLHN0ZXA6dD0+eC5tZXNzYWdlKHQse3N5bWJvbDplLmdyZWVuKEMpfSksd2Fybjp0PT54Lm1lc3NhZ2UodCx7c3ltYm9sOmUueWVsbG93KFUpfSksd2FybmluZzp0PT54Lndhcm4odCksZXJyb3I6dD0+eC5tZXNzYWdlKHQse3N5bWJvbDplLnJlZChLKX0pfSxZPSh7aW5kaWNhdG9yOnQ9XCJkb3RzXCJ9PXt9KT0+e2NvbnN0IG49Vj9bXCJcXHUyNUQyXCIsXCJcXHUyNUQwXCIsXCJcXHUyNUQzXCIsXCJcXHUyNUQxXCJdOltcIlxcdTIwMjJcIixcIm9cIixcIk9cIixcIjBcIl0scj1WPzgwOjEyMCxpPXByb2Nlc3MuZW52LkNJPT09XCJ0cnVlXCI7bGV0IHMsYyxhPSExLGw9XCJcIiwkLGc9cGVyZm9ybWFuY2Uubm93KCk7Y29uc3QgcD1tPT57Y29uc3QgaD1tPjE/XCJTb21ldGhpbmcgd2VudCB3cm9uZ1wiOlwiQ2FuY2VsZWRcIjthJiZOKGgsbSl9LHY9KCk9PnAoMiksZj0oKT0+cCgxKSxqPSgpPT57cHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvclwiLHYpLHByb2Nlc3Mub24oXCJ1bmhhbmRsZWRSZWplY3Rpb25cIix2KSxwcm9jZXNzLm9uKFwiU0lHSU5UXCIsZikscHJvY2Vzcy5vbihcIlNJR1RFUk1cIixmKSxwcm9jZXNzLm9uKFwiZXhpdFwiLHApfSxFPSgpPT57cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihcInVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvclwiLHYpLHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoXCJ1bmhhbmRsZWRSZWplY3Rpb25cIix2KSxwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKFwiU0lHSU5UXCIsZikscHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihcIlNJR1RFUk1cIixmKSxwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKFwiZXhpdFwiLHApfSxCPSgpPT57aWYoJD09PXZvaWQgMClyZXR1cm47aSYmcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxuYCk7Y29uc3QgbT0kLnNwbGl0KGBcbmApO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKG9lLm1vdmUoLTk5OSxtLmxlbmd0aC0xKSkscHJvY2Vzcy5zdGRvdXQud3JpdGUoYWUuZG93bihtLmxlbmd0aCkpfSxSPW09Pm0ucmVwbGFjZSgvXFwuKyQvLFwiXCIpLE89bT0+e2NvbnN0IGg9KHBlcmZvcm1hbmNlLm5vdygpLW0pLzFlMyx3PU1hdGguZmxvb3IoaC82MCksST1NYXRoLmZsb29yKGglNjApO3JldHVybiB3PjA/YFske3d9bSAke0l9c11gOmBbJHtJfXNdYH0sSD0obT1cIlwiKT0+e2E9ITAscz1uZSgpLGw9UihtKSxnPXBlcmZvcm1hbmNlLm5vdygpLHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2UuZ3JheShvKX1cbmApO2xldCBoPTAsdz0wO2ooKSxjPXNldEludGVydmFsKCgpPT57aWYoaSYmbD09PSQpcmV0dXJuO0IoKSwkPWw7Y29uc3QgST1lLm1hZ2VudGEobltoXSk7aWYoaSlwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtJfSAgJHtsfS4uLmApO2Vsc2UgaWYodD09PVwidGltZXJcIilwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtJfSAgJHtsfSAke08oZyl9YCk7ZWxzZXtjb25zdCB6PVwiLlwiLnJlcGVhdChNYXRoLmZsb29yKHcpKS5zbGljZSgwLDMpO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0l9ICAke2x9JHt6fWApfWg9aCsxPG4ubGVuZ3RoP2grMTowLHc9dzxuLmxlbmd0aD93Ky4xMjU6MH0scil9LE49KG09XCJcIixoPTApPT57YT0hMSxjbGVhckludGVydmFsKGMpLEIoKTtjb25zdCB3PWg9PT0wP2UuZ3JlZW4oQyk6aD09PTE/ZS5yZWQoTCk6ZS5yZWQoVyk7bD1SKG0/P2wpLHQ9PT1cInRpbWVyXCI/cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7d30gICR7bH0gJHtPKGcpfVxuYCk6cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7d30gICR7bH1cbmApLEUoKSxzKCl9O3JldHVybntzdGFydDpILHN0b3A6TixtZXNzYWdlOihtPVwiXCIpPT57bD1SKG0/P2wpfX19LENlPWFzeW5jKHQsbik9Pntjb25zdCByPXt9LGk9T2JqZWN0LmtleXModCk7Zm9yKGNvbnN0IHMgb2YgaSl7Y29uc3QgYz10W3NdLGE9YXdhaXQgYyh7cmVzdWx0czpyfSk/LmNhdGNoKGw9Pnt0aHJvdyBsfSk7aWYodHlwZW9mIG4/Lm9uQ2FuY2VsPT1cImZ1bmN0aW9uXCImJmllKGEpKXtyW3NdPVwiY2FuY2VsZWRcIixuLm9uQ2FuY2VsKHtyZXN1bHRzOnJ9KTtjb250aW51ZX1yW3NdPWF9cmV0dXJuIHJ9LFRlPWFzeW5jIHQ9Pntmb3IoY29uc3QgbiBvZiB0KXtpZihuLmVuYWJsZWQ9PT0hMSljb250aW51ZTtjb25zdCByPVkoKTtyLnN0YXJ0KG4udGl0bGUpO2NvbnN0IGk9YXdhaXQgbi50YXNrKHIubWVzc2FnZSk7ci5zdG9wKGl8fG4udGl0bGUpfX07ZXhwb3J0e3hlIGFzIGNhbmNlbCx5ZSBhcyBjb25maXJtLENlIGFzIGdyb3VwLGJlIGFzIGdyb3VwTXVsdGlzZWxlY3QsSWUgYXMgaW50cm8sTSBhcyBsb2csZmUgYXMgbXVsdGlzZWxlY3QsTWUgYXMgbm90ZSxTZSBhcyBvdXRybyxnZSBhcyBwYXNzd29yZCx2ZSBhcyBzZWxlY3Qsd2UgYXMgc2VsZWN0S2V5LFkgYXMgc3Bpbm5lcix4IGFzIHN0cmVhbSxUZSBhcyB0YXNrcyxoZSBhcyB0ZXh0fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsCiAgICAiY29uc3QgaXNDb2xvckVuYWJsZWQgPSAhcHJvY2Vzcy5lbnYuTk9fQ09MT1IgJiYgKHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8IHByb2Nlc3Muc3Rkb3V0LmlzVFRZKTtcblxuY29uc3QgYmFzZUNvbG9ycyA9IFtcImJsdWVcIiwgXCJjeWFuXCIsIFwiZ3JheVwiLCBcImdyZWVuXCIsIFwibWFnZW50YVwiLCBcInJlZFwiLCBcIndoaXRlXCIsIFwieWVsbG93XCJdIGFzIGNvbnN0O1xuY29uc3QgYmFzZURlY29yYXRpb25zID0gW1wiYm9sZFwiLCBcImRpbVwiLCBcIml0YWxpY1wiLCBcInVuZGVybGluZVwiLCBcInJlc2V0XCJdIGFzIGNvbnN0O1xuY29uc3QgYW5zaUNvZGVzID0ge1xuICBib2xkOiBcIlxceDFiWzFtXCIsXG4gIGRpbTogXCJcXHgxYlsybVwiLFxuICBpdGFsaWM6IFwiXFx4MWJbM21cIixcbiAgcmVzZXQ6IFwiXFx4MWJbMG1cIixcbiAgdW5kZXJsaW5lOiBcIlxceDFiWzRtXCIsXG59O1xuXG5jb25zdCBicmlnaHRDb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgXCJcXHgxYlszMG1cIjogXCJcXHgxYls5MG1cIixcbiAgXCJcXHgxYlszMW1cIjogXCJcXHgxYls5MW1cIixcbiAgXCJcXHgxYlszMm1cIjogXCJcXHgxYls5Mm1cIixcbiAgXCJcXHgxYlszM21cIjogXCJcXHgxYls5M21cIixcbiAgXCJcXHgxYlszNG1cIjogXCJcXHgxYls5NG1cIixcbiAgXCJcXHgxYlszNW1cIjogXCJcXHgxYls5NW1cIixcbiAgXCJcXHgxYlszNm1cIjogXCJcXHgxYls5Nm1cIixcbiAgXCJcXHgxYlszN21cIjogXCJcXHgxYls5N21cIixcbn07XG5cbmZ1bmN0aW9uIGNvbG9yaXplKGNvbG9yQ29kZTogc3RyaW5nKSB7XG4gIHJldHVybiAodGV4dDogc3RyaW5nKSA9PiAoaXNDb2xvckVuYWJsZWQgPyBgJHtjb2xvckNvZGV9JHt0ZXh0fSR7YW5zaUNvZGVzLnJlc2V0fWAgOiB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29sb3JDb2RlKHsgYnJpZ2h0ID0gZmFsc2UsIGNvbG9yIH06IHsgYnJpZ2h0PzogYm9vbGVhbjsgY29sb3I6IHN0cmluZyB9KSB7XG4gIGNvbnN0IGJhc2VDb2xvciA9IEJ1bi5jb2xvcihjb2xvciwgXCJhbnNpXCIpO1xuICBpZiAoIWJhc2VDb2xvcikgcmV0dXJuIFwiXCI7XG5cbiAgcmV0dXJuIGJyaWdodCA/IGJyaWdodENvbG9yTWFwW2Jhc2VDb2xvcl0gfHwgYmFzZUNvbG9yIDogYmFzZUNvbG9yO1xufVxuXG5jb25zdCBjb2xvckRlY29yYXRpb25zID0gYmFzZUNvbG9ycy5yZWR1Y2UoXG4gIChhY2MsIGNvbG9yKSA9PiB7XG4gICAgYWNjW2NvbG9yXSA9IGNvbG9yaXplKGdldENvbG9yQ29kZSh7IGNvbG9yIH0pKTtcbiAgICBhY2NbYCR7Y29sb3J9QnJpZ2h0YF0gPSBjb2xvcml6ZShnZXRDb2xvckNvZGUoeyBicmlnaHQ6IHRydWUsIGNvbG9yIH0pKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LFxuICB7fSBhcyBSZWNvcmQ8XG4gICAgKHR5cGVvZiBiYXNlQ29sb3JzKVtudW1iZXJdIHwgYCR7KHR5cGVvZiBiYXNlQ29sb3JzKVtudW1iZXJdfUJyaWdodGAsXG4gICAgKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nXG4gID4sXG4pO1xuXG5jb25zdCBkZWNvcmF0aW9ucyA9IGJhc2VEZWNvcmF0aW9ucy5yZWR1Y2UoXG4gIChhY2MsIGRlY29yYXRpb24pID0+IHtcbiAgICBhY2NbZGVjb3JhdGlvbl0gPSBjb2xvcml6ZShhbnNpQ29kZXNbZGVjb3JhdGlvbl0pO1xuICAgIHJldHVybiBhY2M7XG4gIH0sXG4gIHt9IGFzIFJlY29yZDwodHlwZW9mIGJhc2VEZWNvcmF0aW9ucylbbnVtYmVyXSwgKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nPixcbik7XG5cbmV4cG9ydCBjb25zdCBjb2xvcnMgPSB7IC4uLmNvbG9yRGVjb3JhdGlvbnMsIC4uLmRlY29yYXRpb25zIH07XG4iLAogICAgImNvbnN0IHBlcSA9IG5ldyBVaW50MzJBcnJheSgweDEwMDAwKTtcbmNvbnN0IG15ZXJzXzMyID0gKGEsIGIpID0+IHtcbiAgICBjb25zdCBuID0gYS5sZW5ndGg7XG4gICAgY29uc3QgbSA9IGIubGVuZ3RoO1xuICAgIGNvbnN0IGxzdCA9IDEgPDwgKG4gLSAxKTtcbiAgICBsZXQgcHYgPSAtMTtcbiAgICBsZXQgbXYgPSAwO1xuICAgIGxldCBzYyA9IG47XG4gICAgbGV0IGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgcGVxW2EuY2hhckNvZGVBdChpKV0gfD0gMSA8PCBpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgIGxldCBlcSA9IHBlcVtiLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBjb25zdCB4diA9IGVxIHwgbXY7XG4gICAgICAgIGVxIHw9ICgoZXEgJiBwdikgKyBwdikgXiBwdjtcbiAgICAgICAgbXYgfD0gfihlcSB8IHB2KTtcbiAgICAgICAgcHYgJj0gZXE7XG4gICAgICAgIGlmIChtdiAmIGxzdCkge1xuICAgICAgICAgICAgc2MrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHYgJiBsc3QpIHtcbiAgICAgICAgICAgIHNjLS07XG4gICAgICAgIH1cbiAgICAgICAgbXYgPSAobXYgPDwgMSkgfCAxO1xuICAgICAgICBwdiA9IChwdiA8PCAxKSB8IH4oeHYgfCBtdik7XG4gICAgICAgIG12ICY9IHh2O1xuICAgIH1cbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHBlcVthLmNoYXJDb2RlQXQoaSldID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHNjO1xufTtcbmNvbnN0IG15ZXJzX3ggPSAoYiwgYSkgPT4ge1xuICAgIGNvbnN0IG4gPSBhLmxlbmd0aDtcbiAgICBjb25zdCBtID0gYi5sZW5ndGg7XG4gICAgY29uc3QgbWhjID0gW107XG4gICAgY29uc3QgcGhjID0gW107XG4gICAgY29uc3QgaHNpemUgPSBNYXRoLmNlaWwobiAvIDMyKTtcbiAgICBjb25zdCB2c2l6ZSA9IE1hdGguY2VpbChtIC8gMzIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaHNpemU7IGkrKykge1xuICAgICAgICBwaGNbaV0gPSAtMTtcbiAgICAgICAgbWhjW2ldID0gMDtcbiAgICB9XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAoOyBqIDwgdnNpemUgLSAxOyBqKyspIHtcbiAgICAgICAgbGV0IG12ID0gMDtcbiAgICAgICAgbGV0IHB2ID0gLTE7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gaiAqIDMyO1xuICAgICAgICBjb25zdCB2bGVuID0gTWF0aC5taW4oMzIsIG0pICsgc3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGsgPSBzdGFydDsgayA8IHZsZW47IGsrKykge1xuICAgICAgICAgICAgcGVxW2IuY2hhckNvZGVBdChrKV0gfD0gMSA8PCBrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcSA9IHBlcVthLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICAgICAgY29uc3QgcGIgPSAocGhjWyhpIC8gMzIpIHwgMF0gPj4+IGkpICYgMTtcbiAgICAgICAgICAgIGNvbnN0IG1iID0gKG1oY1soaSAvIDMyKSB8IDBdID4+PiBpKSAmIDE7XG4gICAgICAgICAgICBjb25zdCB4diA9IGVxIHwgbXY7XG4gICAgICAgICAgICBjb25zdCB4aCA9ICgoKChlcSB8IG1iKSAmIHB2KSArIHB2KSBeIHB2KSB8IGVxIHwgbWI7XG4gICAgICAgICAgICBsZXQgcGggPSBtdiB8IH4oeGggfCBwdik7XG4gICAgICAgICAgICBsZXQgbWggPSBwdiAmIHhoO1xuICAgICAgICAgICAgaWYgKChwaCA+Pj4gMzEpIF4gcGIpIHtcbiAgICAgICAgICAgICAgICBwaGNbKGkgLyAzMikgfCAwXSBePSAxIDw8IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1oID4+PiAzMSkgXiBtYikge1xuICAgICAgICAgICAgICAgIG1oY1soaSAvIDMyKSB8IDBdIF49IDEgPDwgaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBoID0gKHBoIDw8IDEpIHwgcGI7XG4gICAgICAgICAgICBtaCA9IChtaCA8PCAxKSB8IG1iO1xuICAgICAgICAgICAgcHYgPSBtaCB8IH4oeHYgfCBwaCk7XG4gICAgICAgICAgICBtdiA9IHBoICYgeHY7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IHN0YXJ0OyBrIDwgdmxlbjsgaysrKSB7XG4gICAgICAgICAgICBwZXFbYi5jaGFyQ29kZUF0KGspXSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG12ID0gMDtcbiAgICBsZXQgcHYgPSAtMTtcbiAgICBjb25zdCBzdGFydCA9IGogKiAzMjtcbiAgICBjb25zdCB2bGVuID0gTWF0aC5taW4oMzIsIG0gLSBzdGFydCkgKyBzdGFydDtcbiAgICBmb3IgKGxldCBrID0gc3RhcnQ7IGsgPCB2bGVuOyBrKyspIHtcbiAgICAgICAgcGVxW2IuY2hhckNvZGVBdChrKV0gfD0gMSA8PCBrO1xuICAgIH1cbiAgICBsZXQgc2NvcmUgPSBtO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVxID0gcGVxW2EuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGNvbnN0IHBiID0gKHBoY1soaSAvIDMyKSB8IDBdID4+PiBpKSAmIDE7XG4gICAgICAgIGNvbnN0IG1iID0gKG1oY1soaSAvIDMyKSB8IDBdID4+PiBpKSAmIDE7XG4gICAgICAgIGNvbnN0IHh2ID0gZXEgfCBtdjtcbiAgICAgICAgY29uc3QgeGggPSAoKCgoZXEgfCBtYikgJiBwdikgKyBwdikgXiBwdikgfCBlcSB8IG1iO1xuICAgICAgICBsZXQgcGggPSBtdiB8IH4oeGggfCBwdik7XG4gICAgICAgIGxldCBtaCA9IHB2ICYgeGg7XG4gICAgICAgIHNjb3JlICs9IChwaCA+Pj4gKG0gLSAxKSkgJiAxO1xuICAgICAgICBzY29yZSAtPSAobWggPj4+IChtIC0gMSkpICYgMTtcbiAgICAgICAgaWYgKChwaCA+Pj4gMzEpIF4gcGIpIHtcbiAgICAgICAgICAgIHBoY1soaSAvIDMyKSB8IDBdIF49IDEgPDwgaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKG1oID4+PiAzMSkgXiBtYikge1xuICAgICAgICAgICAgbWhjWyhpIC8gMzIpIHwgMF0gXj0gMSA8PCBpO1xuICAgICAgICB9XG4gICAgICAgIHBoID0gKHBoIDw8IDEpIHwgcGI7XG4gICAgICAgIG1oID0gKG1oIDw8IDEpIHwgbWI7XG4gICAgICAgIHB2ID0gbWggfCB+KHh2IHwgcGgpO1xuICAgICAgICBtdiA9IHBoICYgeHY7XG4gICAgfVxuICAgIGZvciAobGV0IGsgPSBzdGFydDsgayA8IHZsZW47IGsrKykge1xuICAgICAgICBwZXFbYi5jaGFyQ29kZUF0KGspXSA9IDA7XG4gICAgfVxuICAgIHJldHVybiBzY29yZTtcbn07XG5jb25zdCBkaXN0YW5jZSA9IChhLCBiKSA9PiB7XG4gICAgaWYgKGEubGVuZ3RoIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG1wID0gYjtcbiAgICAgICAgYiA9IGE7XG4gICAgICAgIGEgPSB0bXA7XG4gICAgfVxuICAgIGlmIChiLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCA8PSAzMikge1xuICAgICAgICByZXR1cm4gbXllcnNfMzIoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBteWVyc194KGEsIGIpO1xufTtcbmNvbnN0IGNsb3Nlc3QgPSAoc3RyLCBhcnIpID0+IHtcbiAgICBsZXQgbWluX2Rpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgbGV0IG1pbl9pbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGlzdCA9IGRpc3RhbmNlKHN0ciwgYXJyW2ldKTtcbiAgICAgICAgaWYgKGRpc3QgPCBtaW5fZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIG1pbl9kaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICBtaW5faW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJbbWluX2luZGV4XTtcbn07XG5leHBvcnQgeyBjbG9zZXN0LCBkaXN0YW5jZSB9O1xuIiwKICAgICJpbXBvcnQgeyBjbG9zZXN0LCBkaXN0YW5jZSB9IGZyb20gXCJmYXN0ZXN0LWxldmVuc2h0ZWluXCI7XG5cbi8qKlxuICogRmluZCB0aGUgY2xvc2VzdCBtYXRjaCBmcm9tIGEgbGlzdCBvZiBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2VzdE1hdGNoKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzdWx0ID0gY2xvc2VzdChcbiAgICBpbnB1dC50b0xvd2VyQ2FzZSgpLFxuICAgIG9wdGlvbnMubWFwKChvKSA9PiBvLnRvTG93ZXJDYXNlKCkpLFxuICApO1xuICBjb25zdCBpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLnRvTG93ZXJDYXNlKCkgPT09IHJlc3VsdCk7XG4gIGNvbnN0IG1hdGNoID0gaW5kZXggIT09IC0xID8gb3B0aW9uc1tpbmRleF0gOiBudWxsO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIC8vIE9ubHkgc3VnZ2VzdCBpZiB0aGUgZGlzdGFuY2UgaXMgcmVhc29uYWJsZSAobGVzcyB0aGFuIGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQpXG4gIGNvbnN0IG1hdGNoRGlzdGFuY2UgPSBkaXN0YW5jZShpbnB1dC50b0xvd2VyQ2FzZSgpLCBtYXRjaC50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKG1hdGNoRGlzdGFuY2UgPiBNYXRoLm1heCgzLCBpbnB1dC5sZW5ndGggLyAyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIEdldCBzdWdnZXN0aW9ucyBmb3IgYSBtaXN0eXBlZCBjb21tYW5kXG4gKiBSZXR1cm5zIHVwIHRvIDMgY2xvc2VzdCBtYXRjaGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWdnZXN0aW9ucyhpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBzdHJpbmdbXSwgbWF4U3VnZ2VzdGlvbnMgPSAzKTogc3RyaW5nW10ge1xuICBjb25zdCBkaXN0YW5jZXMgPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgIGRpc3RhbmNlOiBkaXN0YW5jZShpbnB1dC50b0xvd2VyQ2FzZSgpLCBvcHRpb24udG9Mb3dlckNhc2UoKSksXG4gICAgb3B0aW9uLFxuICB9KSk7XG5cbiAgLy8gU29ydCBieSBkaXN0YW5jZSBhbmQgZmlsdGVyIHJlYXNvbmFibGUgbWF0Y2hlc1xuICBjb25zdCBzdWdnZXN0aW9ucyA9IGRpc3RhbmNlc1xuICAgIC5maWx0ZXIoKHsgZGlzdGFuY2UgfSkgPT4gZGlzdGFuY2UgPD0gTWF0aC5tYXgoMywgaW5wdXQubGVuZ3RoIC8gMikpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlKVxuICAgIC5zbGljZSgwLCBtYXhTdWdnZXN0aW9ucylcbiAgICAubWFwKCh7IG9wdGlvbiB9KSA9PiBvcHRpb24pO1xuXG4gIHJldHVybiBzdWdnZXN0aW9ucztcbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgY29tbW9uIHR5cG9zIGFuZCBhYmJyZXZpYXRpb25zIHVzaW5nIGEgcHJvdmlkZWQgbWFwcGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDb21tb25NaXN0YWtlcyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgbWlzdGFrZXNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIG1pc3Rha2VzTWFwW2lucHV0LnRvTG93ZXJDYXNlKCldIHx8IG51bGw7XG59XG4iLAogICAgImV4cG9ydCBpbnRlcmZhY2UgR3JhY2VmdWxPcHRpb25zIHtcbiAgZmFsbGJhY2s/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgbG9nTGV2ZWw/OiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ3JhY2VmdWxUcnk8VD4oXG4gIG9wZXJhdGlvbjogKCkgPT4gVCB8IFByb21pc2U8VD4sXG4gIG9wdGlvbnM6IEdyYWNlZnVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgZmFsbGJhY2ssIGxvZ0xldmVsID0gXCJ3YXJuXCIsIG1lc3NhZ2UgPSBcIk9wZXJhdGlvbiBmYWlsZWQgZ3JhY2VmdWxseVwiIH0gPSBvcHRpb25zO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBjb25zb2xlW2xvZ0xldmVsXShgJHttZXNzYWdlfTogJHtlcnJvck1lc3NhZ2V9YCk7XG5cbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICB9IGNhdGNoIChmYWxsYmFja0Vycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYEZhbGxiYWNrIGFsc28gZmFpbGVkOiAke2ZhbGxiYWNrRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhbGxiYWNrRXJyb3IubWVzc2FnZSA6IFN0cmluZyhmYWxsYmFja0Vycm9yKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyYWNlZnVsV3JhcHBlcjxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICBmbjogVCxcbiAgb3B0aW9uczogR3JhY2VmdWxPcHRpb25zID0ge30sXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPFQ+IHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4ge1xuICAgIHJldHVybiBncmFjZWZ1bFRyeSgoKSA9PiBmbiguLi5hcmdzKSwgb3B0aW9ucyk7XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGNvbG9ycyB9IGZyb20gXCIuL2NvbG9yc1wiO1xuXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIERFQlVHID0gMCxcbiAgSU5GTyA9IDEsXG4gIFdBUk4gPSAyLFxuICBFUlJPUiA9IDMsXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoe1xuICBwcmVmaXggPSBcIlwiLFxuICBsZXZlbCA9IHByb2Nlc3MuZW52LkRFQlVHID8gTG9nTGV2ZWwuREVCVUcgOiBMb2dMZXZlbC5JTkZPLFxufToge1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIGxldmVsPzogTG9nTGV2ZWw7XG59ID0ge30pID0+IHtcbiAgZnVuY3Rpb24gZGVidWcoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgaWYgKGxldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXJncy5qb2luKFwiIFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKGZvcm1hdCh7IGxldmVsOiBjb2xvcnMuZGltKFwiREVCVUdcIiksIG1lc3NhZ2UsIHByZWZpeCB9KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5mbyguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwuSU5GTykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3Muam9pbihcIiBcIik7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0KHsgbGV2ZWw6IGNvbG9ycy5jeWFuKFwiSU5GTyBcIiksIG1lc3NhZ2UsIHByZWZpeCB9KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd2FybiguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwuV0FSTikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3Muam9pbihcIiBcIik7XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0KHsgbGV2ZWw6IGNvbG9ycy55ZWxsb3coXCJXQVJOIFwiKSwgbWVzc2FnZSwgcHJlZml4IH0pKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwuRVJST1IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLmpvaW4oXCIgXCIpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoeyBsZXZlbDogY29sb3JzLnJlZChcIkVSUk9SXCIpLCBtZXNzYWdlLCBwcmVmaXggfSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoaWxkKGNoaWxkUHJlZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9nZ2VyKHsgbGV2ZWwsIHByZWZpeDogYCR7cHJlZml4fToke2NoaWxkUHJlZml4fWAgfSk7XG4gIH1cblxuICByZXR1cm4geyBjaGlsZCwgZGVidWcsIGVycm9yLCBpbmZvLCB3YXJuIH07XG59O1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCk7XG5cbmZ1bmN0aW9uIGZvcm1hdCh7IHByZWZpeCwgbGV2ZWwsIG1lc3NhZ2UgfTogeyBwcmVmaXg6IHN0cmluZzsgbGV2ZWw6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0pIHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVsxXT8uc3BsaXQoXCIuXCIpWzBdIHx8IFwiXCI7XG4gIGNvbnN0IGZvcm1hdFByZWZpeCA9IHByZWZpeCA/IGBbJHtwcmVmaXh9XSBgIDogXCJcIjtcbiAgcmV0dXJuIGAke2NvbG9ycy5kaW0odGltZXN0YW1wIHx8IFwiXCIpfSAke2xldmVsfSAke2Zvcm1hdFByZWZpeH0ke21lc3NhZ2V9YDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIkByNW4vdG9vbHMvdXRpbHMvbG9nZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIGluaXRpYWxEZWxheT86IG51bWJlcjtcbiAgbWF4RGVsYXk/OiBudW1iZXI7XG4gIGJhY2tvZmZNdWx0aXBsaWVyPzogbnVtYmVyO1xuICByZXRyeWFibGVFcnJvcnM/OiBzdHJpbmdbXTtcbiAgb25SZXRyeT86IChhdHRlbXB0OiBudW1iZXIsIGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9PUFRJT05TOiBSZXF1aXJlZDxSZXRyeU9wdGlvbnM+ID0ge1xuICBiYWNrb2ZmTXVsdGlwbGllcjogMixcbiAgaW5pdGlhbERlbGF5OiAxMDAwLFxuICBtYXhBdHRlbXB0czogMyxcbiAgbWF4RGVsYXk6IDMwMDAwLFxuICBvblJldHJ5OiAoYXR0ZW1wdCwgZXJyb3IpID0+IHtcbiAgICBsb2dnZXIud2FybihgUmV0cnkgYXR0ZW1wdCAke2F0dGVtcHR9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gIH0sXG4gIHJldHJ5YWJsZUVycm9yczogW1xuICAgIFwiRUNPTk5SRUZVU0VEXCIsXG4gICAgXCJFQ09OTlJFU0VUXCIsXG4gICAgXCJFVElNRURPVVRcIixcbiAgICBcIkVOT1RGT1VORFwiLFxuICAgIFwicmF0ZSBsaW1pdFwiLFxuICAgIFwiNDI5XCIsXG4gICAgXCI1MDNcIixcbiAgICBcIjUwMlwiLFxuICAgIFwiNTA0XCIsXG4gICAgXCJucG0gRVJSIVwiLFxuICAgIFwiRVBVQkxJU0hDT05GTElDVFwiLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgb3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBvcHRpb25zOiBSZXRyeU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvcHRzID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcbiAgbGV0IGxhc3RFcnJvcjogRXJyb3IgPSBuZXcgRXJyb3IoXCJPcGVyYXRpb24gZmFpbGVkXCIpO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG9wdHMubWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcblxuICAgICAgY29uc3QgaXNSZXRyeWFibGUgPSBvcHRzLnJldHJ5YWJsZUVycm9ycy5zb21lKChyZXRyeWFibGVFcnJvcikgPT5cbiAgICAgICAgbGFzdEVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhyZXRyeWFibGVFcnJvci50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNSZXRyeWFibGUgfHwgYXR0ZW1wdCA9PT0gb3B0cy5tYXhBdHRlbXB0cykge1xuICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICB9XG5cbiAgICAgIG9wdHMub25SZXRyeShhdHRlbXB0LCBsYXN0RXJyb3IpO1xuXG4gICAgICBjb25zdCBkZWxheSA9IE1hdGgubWluKFxuICAgICAgICBvcHRzLmluaXRpYWxEZWxheSAqIG9wdHMuYmFja29mZk11bHRpcGxpZXIgKiogKGF0dGVtcHQgLSAxKSxcbiAgICAgICAgb3B0cy5tYXhEZWxheSxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbGFzdEVycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmV0cnlhYmxlT3BlcmF0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55Pj4oXG4gIG9wZXJhdGlvbjogVCxcbiAgb3B0aW9uczogUmV0cnlPcHRpb25zID0ge30sXG4pOiBUIHtcbiAgcmV0dXJuIChhc3luYyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4ge1xuICAgIHJldHVybiB3aXRoUmV0cnkoKCkgPT4gb3BlcmF0aW9uKC4uLmFyZ3MpLCBvcHRpb25zKTtcbiAgfSkgYXMgVDtcbn1cbiIsCiAgICAiLy8gQ29yZVxuZXhwb3J0IGNvbnN0IGJhbmRpdHlwZSA9IChjYXN0KSA9PiB7XG4gICAgY2FzdC5tYXAgPSAoZXh0cmEpID0+IGJhbmRpdHlwZSgocmF3KSA9PiBleHRyYShjYXN0KHJhdykpKTtcbiAgICBjYXN0Lm9yID0gKGV4dHJhKSA9PiBiYW5kaXR5cGUoKHJhdykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNhc3QocmF3KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0cmEocmF3KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjYXN0O1xufTtcbi8vIEVycm9yIGhlbHBlclxuZXhwb3J0IGNvbnN0IGZhaWwgPSAoKSA9PiBcImJhZCBiYW5kaXR5cGVcIigpO1xuZXhwb3J0IGNvbnN0IG5ldmVyID0gKCkgPT4gYmFuZGl0eXBlKCgpID0+IGZhaWwoKSk7XG5leHBvcnQgY29uc3QgdW5rbm93biA9ICgpID0+IGJhbmRpdHlwZSgocmF3KSA9PiByYXcpO1xuZXhwb3J0IGNvbnN0IGVudW1zID0gKGl0ZW1zKSA9PiBiYW5kaXR5cGUoKHJhdykgPT4gaXRlbXMuaW5jbHVkZXMocmF3KSA/IHJhdyA6IGZhaWwoKSk7XG5leHBvcnQgY29uc3QgbGlrZSA9ICgodGFnKSA9PiBiYW5kaXR5cGUoKHJhdykgPT4gKHR5cGVvZiByYXcgPT09IHR5cGVvZiB0YWcgPyByYXcgOiBmYWlsKCkpKSk7XG5leHBvcnQgY29uc3Qgc3RyaW5nID0gKCkgPT4gbGlrZShcIlwiKTtcbmV4cG9ydCBjb25zdCBudW1iZXIgPSAoKSA9PiBsaWtlKDApO1xuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiBsaWtlKHRydWUpO1xuZXhwb3J0IGNvbnN0IGZ1bmMgPSAoKSA9PiBsaWtlKGZhaWwpO1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsID0gKCkgPT4gbGlrZSgpO1xuZXhwb3J0IGNvbnN0IG51bGxhYmxlID0gKCkgPT4gYmFuZGl0eXBlKChyYXcpID0+IChyYXcgPT09IG51bGwgPyByYXcgOiBmYWlsKCkpKTtcbi8vIENsYXNzZXNcbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IChwcm90bykgPT4gYmFuZGl0eXBlKChyYXcpID0+IChyYXcgaW5zdGFuY2VvZiBwcm90byA/IHJhdyA6IGZhaWwoKSkpO1xuLy8gb2JqZWN0c1xuZXhwb3J0IGNvbnN0IHJlY29yZCA9IChjYXN0VmFsdWUpID0+IGluc3RhbmNlKE9iamVjdCkubWFwKChyYXcpID0+IHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgICAgY29uc3QgZiA9IGNhc3RWYWx1ZShyYXdba2V5XSk7XG4gICAgICAgIGYgIT09IHVuZGVmaW5lZCAmJiAocmVzW2tleV0gPSBmKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn0pO1xuZXhwb3J0IGNvbnN0IG9iamVjdCA9IChzY2hlbWEpID0+IGluc3RhbmNlKE9iamVjdCkubWFwKChyYXcpID0+IHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgZiA9IHNjaGVtYVtrZXldKHJhd1trZXldKTtcbiAgICAgICAgZiAhPT0gdW5kZWZpbmVkICYmIChyZXNba2V5XSA9IGYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufSk7XG5leHBvcnQgY29uc3Qgb2JqZWN0TG9vc2UgPSAoc2NoZW1hKSA9PiBpbnN0YW5jZShPYmplY3QpLm1hcCgocmF3KSA9PiB7XG4gICAgY29uc3QgcmVzID0geyAuLi5yYXcgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgZiA9IHNjaGVtYVtrZXldKHJhd1trZXldKTtcbiAgICAgICAgZiAhPT0gdW5kZWZpbmVkICYmIChyZXNba2V5XSA9IGYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufSk7XG4vLyBhcnJheXNcbmV4cG9ydCBjb25zdCBhcnJheSA9IChjYXN0SXRlbSkgPT4gaW5zdGFuY2UoQXJyYXkpLm1hcCgoYXJyKSA9PiBhcnIubWFwKGNhc3RJdGVtKSk7XG5leHBvcnQgY29uc3QgdHVwbGUgPSAoc2NoZW1hKSA9PiBpbnN0YW5jZShBcnJheSkubWFwKChhcnIpID0+IHtcbiAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2FzdCwgaSkgPT4gY2FzdChhcnJbaV0pKTtcbn0pO1xuZXhwb3J0IGNvbnN0IHNldCA9IChjYXN0SXRlbSkgPT4gaW5zdGFuY2UoU2V0KS5tYXAoKHNldCkgPT4gbmV3IFNldChbLi4uc2V0XS5tYXAoY2FzdEl0ZW0pKSk7XG5leHBvcnQgY29uc3QgbWFwID0gKGNhc3RLZXksIGNhc3RWYWx1ZSkgPT4gaW5zdGFuY2UoTWFwKS5tYXAoKG1hcCkgPT4ge1xuICAgIHJldHVybiBuZXcgTWFwKFsuLi5tYXBdLm1hcCgoW2ssIHZdKSA9PiBbY2FzdEtleShrKSwgY2FzdFZhbHVlKHYpXSkpO1xufSk7XG5leHBvcnQgY29uc3QgbGF6eSA9IChjYXN0KSA9PiBiYW5kaXR5cGUoKHJhdykgPT4gY2FzdCgpKHJhdykpO1xuIiwKICAgICJpbXBvcnQge1xuICBhcnJheSxcbiAgdHlwZSBJbmZlciBhcyBCVEluZmVyLFxuICBib29sZWFuLFxuICB0eXBlIENhc3QsXG4gIGVudW1zLFxuICBmYWlsLFxuICBudW1iZXIsXG4gIG9iamVjdCxcbiAgb3B0aW9uYWwsXG4gIHJlY29yZCxcbiAgc3RyaW5nLFxuICBiYW5kaXR5cGUgYXMgdmFsaWRhdG9yLFxufSBmcm9tIFwiYmFuZGl0eXBlc1wiO1xuXG5leHBvcnQgeyBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgb2JqZWN0LCBhcnJheSwgb3B0aW9uYWwsIHJlY29yZCwgZW51bXMsIGZhaWwgfTtcblxuZXhwb3J0IHR5cGUgSW5mZXI8VCBleHRlbmRzIENhc3Q8dW5rbm93bj4+ID0gQlRJbmZlcjxUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uPEEsIEI+KHNjaGVtYUE6IENhc3Q8QT4sIHNjaGVtYUI6IENhc3Q8Qj4pOiBDYXN0PEEgfCBCPiB7XG4gIHJldHVybiB2YWxpZGF0b3IoKGRhdGE6IHVua25vd24pOiBBIHwgQiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzY2hlbWFBKGRhdGEpIGFzIEE7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2NoZW1hQihkYXRhKSBhcyBCO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHNjaGVtYSBpbiB1bmlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFRvPFQ+KHNjaGVtYTogQ2FzdDxUPiwgZGVmYXVsdFZhbHVlOiBUKSB7XG4gIHJldHVybiAoZGF0YTogdW5rbm93bikgPT4ge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgcmV0dXJuIHNjaGVtYShkYXRhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aXZlSW50KCkge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbiA9IG51bWJlcigpKGRhdGEpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBuIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmwoKSB7XG4gIHJldHVybiB2YWxpZGF0b3IoKGRhdGE6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzID0gc3RyaW5nKCkoZGF0YSk7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwocyk7XG4gICAgICByZXR1cm4gcztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgYmUgYSB2YWxpZCBVUkxcIik7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKCkge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0cmluZygpKGRhdGEpO1xuICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBiZSBhIHZhbGlkIGVtYWlsXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfSk7XG59XG5cbi8vIE1pbi9tYXggaGVscGVyc1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihtaW5WYWw6IG51bWJlcikge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbiA9IG51bWJlcigpKGRhdGEpO1xuICAgIGlmIChuIDwgbWluVmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE11c3QgYmUgYXQgbGVhc3QgJHttaW5WYWx9YCk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbkxlbmd0aChtaW5MZW46IG51bWJlcikge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0cmluZygpKGRhdGEpO1xuICAgIGlmIChzLmxlbmd0aCA8IG1pbkxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdXN0IGJlIGF0IGxlYXN0ICR7bWluTGVufSBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4KHBhdHRlcm46IFJlZ0V4cCwgbWVzc2FnZT86IHN0cmluZykge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0cmluZygpKGRhdGEpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCBgTXVzdCBtYXRjaCBwYXR0ZXJuICR7cGF0dGVybn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH0pO1xufVxuXG4vLyBIZWxwZXIgdG8gY3JlYXRlIHNjaGVtYXMgd2l0aCBiZXR0ZXIgZXJyb3IgaGFuZGxpbmdcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdG9yOiBDYXN0PFQ+KSB7XG4gIHJldHVybiB7XG4gICAgcGFyc2UodmFsdWU6IHVua25vd24pOiBUIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJWYWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNhZmVQYXJzZSh2YWx1ZTogdW5rbm93bik6IHsgc3VjY2VzczogdHJ1ZTsgZGF0YTogVCB9IHwgeyBzdWNjZXNzOiBmYWxzZTsgZXJyb3I6IEVycm9yIH0ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogdmFsaWRhdG9yKHZhbHVlKSwgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIiksXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0b3IsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maWdWYWxpZGF0b3I8VD4oc2NoZW1hOiBDYXN0PFQ+KSB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IGNyZWF0ZVNjaGVtYShzY2hlbWEpO1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHZhbGlkYXRvci5wYXJzZSxcbiAgICBwYXJzZUpTT04oanNvbjogc3RyaW5nKTogVCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNhZmVQYXJzZTogdmFsaWRhdG9yLnNhZmVQYXJzZSxcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHsgY29uZmlybSwgaXNDYW5jZWwsIHRleHQgfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gXCJAcjVuL2NsaS1jb3JlXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBnZXRQcm9maWxlLCBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVBhdGggfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgd29ya2VyTWFuYWdlciB9IGZyb20gXCIuLi9saWIvd29ya2VyLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3JlYXRlQXJncyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoeyBwcmVmaXg6IFwiY3JlYXRlTWFjaGluZXNcIiB9KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1hY2hpbmVzKCkge1xuICBjb25zdCBhcmdzID0gYXdhaXQgZ2V0QXJncygpO1xuICBjb25zdCB7IG92ZXJ3cml0ZSwgZGlyZWN0b3J5LCBudW1iZXJPZk1hY2hpbmVzLCBvcywgcnVuLCBuYW1lLCBsYWJlbHMsIHJ1bm5lckdyb3VwIH0gPSBhcmdzO1xuICBsZXQgeyB0b2tlbiwgdXJsIH0gPSBhcmdzO1xuXG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVVJMICgtdSkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIGNvbnN0IHNldHRpbmdzVXJsID0gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsKTtcblxuICAgIGNvbnN0IHNob3VsZE9wZW4gPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6IGBObyB0b2tlbiBwcm92aWRlZC4gV291bGQgeW91IGxpa2UgdG8gb3BlbiBHaXRIdWIgdG8gZ2V0IGEgcnVubmVyIHRva2VuP1xcbiAgJHtzZXR0aW5nc1VybH1gLFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHNob3VsZE9wZW4pIHx8ICFzaG91bGRPcGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgcnVubmVyc1wiKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcIk9wZW5pbmcgR2l0SHViIHJ1bm5lciBzZXR0aW5ncy4uLlwiKTtcbiAgICBhd2FpdCAkYG9wZW4gJHtzZXR0aW5nc1VybH1gLnF1aWV0KCk7XG5cbiAgICBjb25zdCB0b2tlbklucHV0ID0gYXdhaXQgdGV4dCh7XG4gICAgICBtZXNzYWdlOiBcIkVudGVyIHRoZSBydW5uZXIgcmVnaXN0cmF0aW9uIHRva2VuOlwiLFxuICAgICAgcGxhY2Vob2xkZXI6IFwiQVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcIixcbiAgICAgIHZhbGlkYXRlOiAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFwiVG9rZW4gaXMgcmVxdWlyZWRcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChpc0NhbmNlbCh0b2tlbklucHV0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIHJ1bm5lcnNcIik7XG4gICAgfVxuXG4gICAgdG9rZW4gPSB0b2tlbklucHV0LnRyaW0oKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGBDcmVhdGluZyAke251bWJlck9mTWFjaGluZXN9IHJ1bm5lcnMgaW4gJHtkaXJlY3Rvcnl9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgT1M6ICR7b3N9LCBOYW1lOiAke25hbWV9LCBMYWJlbHM6ICR7bGFiZWxzIHx8IFwibm9uZVwifWApO1xuXG4gIGNvbnN0IGRpcmVjdG9yeUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKGRpcmVjdG9yeSkuZXhpc3RzKCk7XG4gIGlmIChkaXJlY3RvcnlFeGlzdHMpIHtcbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICBsb2dnZXIud2FybihgRGlyZWN0b3J5ICR7ZGlyZWN0b3J5fSBleGlzdHMsIHJlbW92aW5nLi4uYCk7XG4gICAgICBhd2FpdCAkYHJtIC1yZiAke2RpcmVjdG9yeX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERpcmVjdG9yeSAke2RpcmVjdG9yeX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBydW5uZXJCYXNlID0gYXdhaXQgZG93bmxvYWRMYXRlc3RSdW5uZXJJbWFnZSh7IGRpcmVjdG9yeSwgb3MgfSk7XG4gIGF3YWl0IGV4dHJhY3RBbmRDb3B5UnVubmVyQmFzZSh7IGRpcmVjdG9yeSwgbnVtYmVyT2ZNYWNoaW5lcywgb3ZlcndyaXRlLCBydW5uZXJCYXNlIH0pO1xuXG4gIGlmICghcnVuKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJSdW5uZXJzIGNyZWF0ZWQgYnV0IG5vdCBzdGFydGVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXJ0UnVubmVycyh7IGRpcmVjdG9yeSwgbGFiZWxzLCBuYW1lLCBudW1iZXJPZk1hY2hpbmVzLCBydW5uZXJHcm91cCwgdG9rZW4sIHVybCB9KTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgR2l0SHViIFVSTCBmb3JtYXRzXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSA9PT0gXCJnaXRodWIuY29tXCIgfHwgcGFyc2VkVXJsLmhvc3RuYW1lID09PSBcInd3dy5naXRodWIuY29tXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICAvLyBPcmdhbml6YXRpb24gVVJMOiBodHRwczovL2dpdGh1Yi5jb20vb3Jncy9teW9yZ1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIC8vIFJlcG9zaXRvcnkgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwb1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3BhdGhQYXJ0c1swXX0vJHtwYXRoUGFydHNbMV19L3NldHRpbmdzL2FjdGlvbnMvcnVubmVycy9uZXdgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHaXRIdWIgRW50ZXJwcmlzZSBVUkxcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vb3JnYW5pemF0aW9ucy8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBVUkwgaWYgd2UgY2FuJ3QgcGFyc2UgaXRcbiAgICByZXR1cm4gdXJsO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBVUkwgcGFyc2luZyBmYWlscywgcmV0dXJuIHRoZSBvcmlnaW5hbFxuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXJncygpOiBQcm9taXNlPENyZWF0ZUFyZ3M+IHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzOiBCdW4uYXJndixcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb25maWc6IHsgc2hvcnQ6IFwiY1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkaXJlY3Rvcnk6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsIHNob3J0OiBcImRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbmFtZTogeyBkZWZhdWx0OiBcInJ1bm5lclwiLCBzaG9ydDogXCJuXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIG51bWJlck9mTWFjaGluZXM6IHsgZGVmYXVsdDogXCIxXCIsIHNob3J0OiBcIm1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgb3M6IHsgZGVmYXVsdDogXCJvc3hcIiwgc2hvcnQ6IFwic1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBvdmVyd3JpdGU6IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcImZcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgIHByb2ZpbGU6IHsgc2hvcnQ6IFwicFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBydW46IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcInJcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgIHJ1bm5lckdyb3VwOiB7IHNob3J0OiBcImdcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB1cmw6IHsgc2hvcnQ6IFwidVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoeyBjb25maWdQYXRoOiB2YWx1ZXMuY29uZmlnIGFzIHN0cmluZyB9KTtcbiAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoY29uZmlnLCB2YWx1ZXMucHJvZmlsZSBhcyBzdHJpbmcpO1xuXG4gIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgIGRpcmVjdG9yeTogdmFsdWVzLmRpcmVjdG9yeSBhcyBzdHJpbmcsXG4gICAgbGFiZWxzOiB2YWx1ZXMubGFiZWxzIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBuYW1lOiB2YWx1ZXMubmFtZSBhcyBzdHJpbmcsXG4gICAgbnVtYmVyT2ZNYWNoaW5lczogdmFsdWVzLm51bWJlck9mTWFjaGluZXMgYXMgc3RyaW5nLFxuICAgIG9zOiB2YWx1ZXMub3MgYXMgc3RyaW5nLFxuICAgIG92ZXJ3cml0ZTogdmFsdWVzLm92ZXJ3cml0ZSBhcyBib29sZWFuLFxuICAgIHJ1bjogdmFsdWVzLnJ1biBhcyBib29sZWFuLFxuICAgIHJ1bm5lckdyb3VwOiB2YWx1ZXMucnVubmVyR3JvdXAgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRva2VuOiB2YWx1ZXMudG9rZW4gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHVybDogdmFsdWVzLnVybCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIH07XG5cbiAgLy8gTWVyZ2Ugd2l0aCBwcm9maWxlXG4gIGlmIChwcm9maWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdG9yeTogYmFzZUFyZ3MuZGlyZWN0b3J5ID8/IHByb2ZpbGUuZGlyZWN0b3J5ID8/IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLFxuICAgICAgbGFiZWxzOiBiYXNlQXJncy5sYWJlbHMgPz8gcHJvZmlsZS5sYWJlbHMsXG4gICAgICBuYW1lOiBiYXNlQXJncy5uYW1lID8/IHByb2ZpbGUubmFtZSA/PyBcInJ1bm5lclwiLFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogYmFzZUFyZ3MubnVtYmVyT2ZNYWNoaW5lcyA/PyBTdHJpbmcocHJvZmlsZS5udW1iZXJPZk1hY2hpbmVzKSA/PyBcIjFcIixcbiAgICAgIG9zOiAoYmFzZUFyZ3Mub3MgPz8gcHJvZmlsZS5vcyA/PyBcIm9zeFwiKSBhcyBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCIsXG4gICAgICBvdmVyd3JpdGU6IGJhc2VBcmdzLm92ZXJ3cml0ZSA/PyBwcm9maWxlLm92ZXJ3cml0ZSA/PyBmYWxzZSxcbiAgICAgIHJ1bjogYmFzZUFyZ3MucnVuID8/IHByb2ZpbGUucnVuID8/IGZhbHNlLFxuICAgICAgcnVubmVyR3JvdXA6IGJhc2VBcmdzLnJ1bm5lckdyb3VwID8/IHByb2ZpbGUucnVubmVyR3JvdXAsXG4gICAgICB0b2tlbjogYmFzZUFyZ3MudG9rZW4sXG4gICAgICB1cmw6IGJhc2VBcmdzLnVybCA/PyBwcm9maWxlLnVybCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkaXJlY3Rvcnk6IGJhc2VBcmdzLmRpcmVjdG9yeSxcbiAgICBsYWJlbHM6IGJhc2VBcmdzLmxhYmVscyxcbiAgICBuYW1lOiBiYXNlQXJncy5uYW1lLFxuICAgIG51bWJlck9mTWFjaGluZXM6IGJhc2VBcmdzLm51bWJlck9mTWFjaGluZXMsXG4gICAgb3M6IGJhc2VBcmdzLm9zIGFzIFwib3N4XCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIixcbiAgICBvdmVyd3JpdGU6IGJhc2VBcmdzLm92ZXJ3cml0ZSxcbiAgICBydW46IGJhc2VBcmdzLnJ1bixcbiAgICBydW5uZXJHcm91cDogYmFzZUFyZ3MucnVubmVyR3JvdXAsXG4gICAgdG9rZW46IGJhc2VBcmdzLnRva2VuLFxuICAgIHVybDogYmFzZUFyZ3MudXJsLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZExhdGVzdFJ1bm5lckltYWdlKHsgZGlyZWN0b3J5LCBvcyB9OiB7IGRpcmVjdG9yeTogc3RyaW5nOyBvczogc3RyaW5nIH0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmNoaWxkKFwiZG93bmxvYWRcIik7XG5cbiAgbG9nLmluZm8oYEZldGNoaW5nIGxhdGVzdCBydW5uZXIgdmVyc2lvbiBmb3IgJHtvc30uLi5gKTtcbiAgY29uc3QgcmVsZWFzZUluZm8gPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT5cbiAgICAgIChcbiAgICAgICAgYXdhaXQgJGBjdXJsIC1McyAtbyAvZGV2L251bGwgLXcgXCIle3VybF9lZmZlY3RpdmV9XCIgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzL2xhdGVzdGBcbiAgICAgICkudGV4dCgpLFxuICAgIHtcbiAgICAgIG9uUmV0cnk6IChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICBsb2cud2FybihgUmV0cnlpbmcgR2l0SHViIEFQSSBjYWxsIChhdHRlbXB0ICR7YXR0ZW1wdH0pOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIGNvbnN0IGxhc3RSZWxlYXNlID0gKGF3YWl0ICRgYmFzZW5hbWUgJHtyZWxlYXNlSW5mb31gKS50ZXh0KCk7XG5cbiAgY29uc3QgdmVyc2lvbiA9IGxhc3RSZWxlYXNlLnRyaW0oKS5yZXBsYWNlKFwidlwiLCBcIlwiKTtcbiAgY29uc3QgcnVubmVyQmFzZSA9IGBhY3Rpb25zLXJ1bm5lci0ke29zfS14NjQtJHt2ZXJzaW9ufS50YXIuZ3pgO1xuICBjb25zdCBnaXRodWJSZWxlYXNlVXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3J1bm5lci9yZWxlYXNlcy9kb3dubG9hZC92JHt2ZXJzaW9ufS8ke3J1bm5lckJhc2V9YDtcblxuICBsb2cuZGVidWcoYFJ1bm5lciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG4gIGxvZy5kZWJ1ZyhgRG93bmxvYWQgVVJMOiAke2dpdGh1YlJlbGVhc2VVcmx9YCk7XG5cbiAgYXdhaXQgJGBta2RpciAtcCAke2RpcmVjdG9yeX1gO1xuICBhd2FpdCAkYG1rZGlyIC1wICR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG5cbiAgY29uc3QgcnVubmVyRmlsZUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKGAke2RpcmVjdG9yeX0vJHtydW5uZXJCYXNlfWApLmV4aXN0cygpO1xuICBpZiAoIXJ1bm5lckZpbGVFeGlzdHMpIHtcbiAgICBsb2cuaW5mbyhcIkRvd25sb2FkaW5nIHJ1bm5lciBpbWFnZS4uLlwiKTtcbiAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCAkYGN1cmwgLW8gJHtkaXJlY3Rvcnl9LyR7cnVubmVyQmFzZX0gLUwgJHtnaXRodWJSZWxlYXNlVXJsfWAsXG4gICAgICB7XG4gICAgICAgIG1heEF0dGVtcHRzOiA1LFxuICAgICAgICBvblJldHJ5OiAoYXR0ZW1wdCwgZXJyb3IpID0+IHtcbiAgICAgICAgICBsb2cud2FybihgUmV0cnlpbmcgcnVubmVyIGRvd25sb2FkIChhdHRlbXB0ICR7YXR0ZW1wdH0pOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgbG9nLmluZm8oXCJEb3dubG9hZCBjb21wbGV0ZVwiKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhcIlJ1bm5lciBpbWFnZSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgZG93bmxvYWRcIik7XG4gIH1cblxuICByZXR1cm4gcnVubmVyQmFzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdEFuZENvcHlSdW5uZXJCYXNlKHtcbiAgb3ZlcndyaXRlLFxuICBudW1iZXJPZk1hY2hpbmVzLFxuICBkaXJlY3RvcnksXG4gIHJ1bm5lckJhc2UsXG59OiB7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgbnVtYmVyT2ZNYWNoaW5lczogc3RyaW5nO1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgcnVubmVyQmFzZTogc3RyaW5nO1xufSkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuY2hpbGQoXCJleHRyYWN0XCIpO1xuICBjb25zdCBudW1NYWNoaW5lcyA9IE51bWJlcihudW1iZXJPZk1hY2hpbmVzKTtcblxuICBjb25zdCBjcHVDb3VudCA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1bi5zcGF3blN5bmMoW1wibnByb2NcIl0pO1xuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChyZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpLCAxMCkgfHwgNDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1bi5zcGF3blN5bmMoW1wic3lzY3RsXCIsIFwiLW5cIiwgXCJody5uY3B1XCJdKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChyZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpLCAxMCkgfHwgNDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gNDtcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gTWF0aC5taW4oTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihjcHVDb3VudCAvIDIpKSwgbnVtTWFjaGluZXMsIDgpO1xuXG4gIGxvZy5pbmZvKGBFeHRyYWN0aW5nICR7bnVtTWFjaGluZXN9IHJ1bm5lcnMgd2l0aCBjb25jdXJyZW5jeSBvZiAke2NvbmN1cnJlbmN5fWApO1xuXG4gIGNvbnN0IHRhc2tzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtTWFjaGluZXMgfSwgKF8sIGkpID0+IGkgKyAxKS5tYXAoKHJ1bm5lckluZGV4KSA9PiAoe1xuICAgIGV4ZWN1dGU6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hY2hpbmVEaXJlY3RvcnkgPSBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YDtcbiAgICAgIGNvbnN0IG1hY2hpbmVFeGlzdHMgPSBhd2FpdCBCdW4uZmlsZShtYWNoaW5lRGlyZWN0b3J5KS5leGlzdHMoKTtcblxuICAgICAgaWYgKG1hY2hpbmVFeGlzdHMpIHtcbiAgICAgICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgTWFjaGluZSAke3J1bm5lckluZGV4fSBhbHJlYWR5IGV4aXN0cywgcmVtb3ZpbmcuLi5gKTtcbiAgICAgICAgICBhd2FpdCAkYHJtIC1yZiAke21hY2hpbmVEaXJlY3Rvcnl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZGVidWcoYE1hY2hpbmUgJHtydW5uZXJJbmRleH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nLi4uYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0ICRgbWtkaXIgLXAgJHttYWNoaW5lRGlyZWN0b3J5fWA7XG5cbiAgICAgIGF3YWl0ICRgdGFyIHh6ZiAke3J1bm5lckJhc2V9IC1DICR7bWFjaGluZURpcmVjdG9yeS5yZXBsYWNlKGAke2RpcmVjdG9yeX0vYCwgXCJcIil9YC5jd2QoXG4gICAgICAgIGRpcmVjdG9yeSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJ1bm5lclBhdGggPSBgJHtnZXRQYWNrYWdlUGF0aCgpfS9zcmMvcnVubmVyYDtcblxuICAgICAgYXdhaXQgJGBjcCAtUiAke3J1bm5lclBhdGh9L2hvb2tzICR7bWFjaGluZURpcmVjdG9yeX1gO1xuICAgICAgYXdhaXQgJGBjcCAtUiAke3J1bm5lclBhdGh9Ly5ydW5uZXItZW52ICR7bWFjaGluZURpcmVjdG9yeX0vLnJ1bm5lci1lbnZgO1xuXG4gICAgICBsb2cuZGVidWcoYE1hY2hpbmUgJHtydW5uZXJJbmRleH0gZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseWApO1xuICAgIH0sXG4gICAgcnVubmVySW5kZXgsXG4gIH0pKTtcblxuICBjb25zdCByZXN1bHRzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpICs9IGNvbmN1cnJlbmN5KSB7XG4gICAgY29uc3QgYmF0Y2ggPSB0YXNrcy5zbGljZShpLCBpICsgY29uY3VycmVuY3kpO1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaC5tYXAoKHRhc2spID0+IHRhc2suZXhlY3V0ZSgpKSk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzdWx0XSBvZiBiYXRjaFJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgcnVubmVyICR7YmF0Y2hbaW5kZXhdPy5ydW5uZXJJbmRleH06ICR7cmVzdWx0LnJlYXNvbn1gKTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LnJlYXNvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgZXh0cmFjdGVkICR7bnVtTWFjaGluZXN9IHJ1bm5lcnNgKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRSdW5uZXJzKHtcbiAgZGlyZWN0b3J5LFxuICBudW1iZXJPZk1hY2hpbmVzLFxuICB0b2tlbixcbiAgdXJsLFxuICBuYW1lLFxuICBsYWJlbHMsXG4gIHJ1bm5lckdyb3VwLFxufToge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgbnVtYmVyT2ZNYWNoaW5lczogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbHM/OiBzdHJpbmc7XG4gIHJ1bm5lckdyb3VwPzogc3RyaW5nO1xufSkge1xuICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgJHtudW1iZXJPZk1hY2hpbmVzfSBydW5uZXJzLi4uYCk7XG5cbiAgZm9yIChsZXQgcnVubmVySW5kZXggPSAxOyBydW5uZXJJbmRleCA8PSBOdW1iZXIobnVtYmVyT2ZNYWNoaW5lcyk7IHJ1bm5lckluZGV4KyspIHtcbiAgICBjb25zdCB3b3JrZXJQYXRoID0gYCR7Z2V0UGFja2FnZVBhdGgoKX0vc3JjL3J1bm5lci13b3JrZXIudHNgO1xuICAgIGNvbnN0IHdvcmtlck5hbWUgPSBgJHtuYW1lfS0ke3J1bm5lckluZGV4fWA7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJQYXRoLCB7IG5hbWU6IHdvcmtlck5hbWUsIHJlZjogdHJ1ZSB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7d29ya2VyTmFtZX0gc3RhcnRlZGApO1xuXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBpbmRleDogcnVubmVySW5kZXgsXG4gICAgICAgIGxhYmVscyxcbiAgICAgICAgbWFjaGluZUN3ZDogYCR7ZGlyZWN0b3J5fS9tYWNoaW5lcy8ke3J1bm5lckluZGV4fWAsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJ1bm5lckdyb3VwLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgdXJsLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHsgZGF0YSB9KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGRhdGEudHlwZSA9PT0gXCJlcnJvclwiID8gXCJlcnJvclwiIDogXCJpbmZvXCI7XG4gICAgICBsb2dnZXJbbGV2ZWxdKGAke3dvcmtlck5hbWV9OiAke2RhdGEubWVzc2FnZX1gKTtcbiAgICB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFdvcmtlciAke3dvcmtlck5hbWV9IGVycm9yOmAsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYFdvcmtlciAke3dvcmtlck5hbWV9IGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApO1xuICAgIH0pO1xuXG4gICAgd29ya2VyTWFuYWdlci5hZGQod29ya2VyKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKFwiQWxsIHdvcmtlcnMgc3RhcnRlZC4gUHJlc3MgQ3RybCtDIHRvIHN0b3AgYWxsIG1hY2hpbmVzXCIpO1xufVxuIiwKICAgICJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IFBBVEhTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZywgQ29uZmlnRmlsZU9wdGlvbnMsIFByb2ZpbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uZmlnU2NoZW1hIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ09ORklHX0ZJTEVfTkFNRVMgPSBbXCJoeWRyYS5qc29uXCIsIFwiLmh5ZHJhLmpzb25cIiwgXCJoeWRyYS50b21sXCIsIFwiLmh5ZHJhLnRvbWxcIl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShzdGFydFBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBDT05GSUdfRklMRV9OQU1FUykge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHN0YXJ0UGF0aCwgZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGUgPSBCdW4uZmlsZShjb25maWdQYXRoKTtcbiAgICBpZiAoYXdhaXQgZmlsZS5leGlzdHMoKSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ1BhdGg7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhvcHRpb25zPzogQ29uZmlnRmlsZU9wdGlvbnMpOiBQcm9taXNlPENvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IG9wdGlvbnM/LmNvbmZpZ1BhdGggfHwgKGF3YWl0IGZpbmRDb25maWdGaWxlKCkpO1xuXG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IEJ1bi5maWxlKGNvbmZpZ1BhdGgpO1xuICBpZiAoIShhd2FpdCBmaWxlLmV4aXN0cygpKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG4gICAgY29uc3QgZGF0YSA9IGNvbmZpZ1BhdGguZW5kc1dpdGgoXCIudG9tbFwiKSA/IGF3YWl0IHBhcnNlVG9tbChjb250ZW50KSA6IEpTT04ucGFyc2UoY29udGVudCk7XG5cbiAgICByZXR1cm4gQ29uZmlnU2NoZW1hLnBhcnNlKGRhdGEpIGFzIENvbmZpZztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmZpZyBmaWxlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9maWxlKFxuICBjb25maWc6IENvbmZpZyB8IG51bGwsXG4gIHByb2ZpbGVOYW1lPzogc3RyaW5nLFxuKTogUHJvbWlzZTxQcm9maWxlIHwgbnVsbD4ge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgbmFtZSA9IHByb2ZpbGVOYW1lIHx8IGNvbmZpZy5kZWZhdWx0UHJvZmlsZTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gY29uZmlnLnByb2ZpbGVzW25hbWVdIHx8IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByb2ZpbGVXaXRoQXJnczxUIGV4dGVuZHMgUGFydGlhbDxQcm9maWxlPj4oXG4gIHByb2ZpbGU6IFByb2ZpbGUgfCBudWxsLFxuICBhcmdzOiBULFxuKTogVCB7XG4gIGlmICghcHJvZmlsZSkgcmV0dXJuIGFyZ3M7XG5cbiAgY29uc3QgbWVyZ2VkID0geyAuLi5hcmdzIH0gYXMgVDtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9maWxlKSkge1xuICAgIGlmICgobWVyZ2VkIGFzIGFueSlba2V5XSA9PT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIChtZXJnZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VUb21sKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgdGVtcEZpbGUgPSBqb2luKFBBVEhTLlRFTVBfRElSLCBgaHlkcmEtY29uZmlnLSR7RGF0ZS5ub3coKX0udG9tbGApO1xuICBhd2FpdCBCdW4ud3JpdGUodGVtcEZpbGUsIGNvbnRlbnQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHRlbXBGaWxlKTtcbiAgICBhd2FpdCAkYHJtIC1mICR7dGVtcEZpbGV9YC5xdWlldCgpO1xuICAgIHJldHVybiBtb2R1bGUuZGVmYXVsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhd2FpdCAkYHJtIC1mICR7dGVtcEZpbGV9YC5xdWlldCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIFRPTUwgY29uZmlndXJhdGlvbjogJHtlcnJvcn1gKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVFMgPSB7XG4gIERJUkVDVE9SWTogXCIuL2doLXJ1bm5lcnNcIixcbiAgTkFNRTogXCJydW5uZXJcIixcbiAgTlVNQkVSX09GX01BQ0hJTkVTOiAxLFxuICBPUzogXCJvc3hcIiBhcyBjb25zdCxcbiAgUFJPRklMRTogXCJkZWZhdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgRklMRV9FWFRFTlNJT05TID0geyBKU09OOiBcIi5qc29uXCIsIFRPTUw6IFwiLnRvbWxcIiB9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgV09SS0VSX01FU1NBR0VTID0geyBFUlJPUjogXCJlcnJvclwiLCBTVUNDRVNTOiBcInN1Y2Nlc3NcIiB9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUEFUSFMgPSB7IE1BQ0hJTkVTX0RJUjogXCJtYWNoaW5lc1wiLCBURU1QX0RJUjogdG1wZGlyKCkgfSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFRJTUVPVVRTID0geyBET1dOTE9BRDogMzAwMDAwLCBXT1JLRVJfUkVTUE9OU0U6IDUwMDAgfSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9PUyA9IFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luXCJdIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU3VwcG9ydGVkT1MgPSAodHlwZW9mIFNVUFBPUlRFRF9PUylbbnVtYmVyXTtcbiIsCiAgICAiaW1wb3J0IHtcbiAgYm9vbGVhbixcbiAgY3JlYXRlU2NoZW1hLFxuICBkZWZhdWx0VG8sXG4gIGVudW1zLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsLFxuICBwb3NpdGl2ZUludCxcbiAgcmVjb3JkLFxuICBzdHJpbmcsXG4gIHVuaW9uLFxufSBmcm9tIFwiQHI1bi9jbGktY29yZVwiO1xuXG5jb25zdCBwcm9maWxlVmFsaWRhdG9yID0gb2JqZWN0KHtcbiAgZGlyZWN0b3J5OiBkZWZhdWx0VG8oc3RyaW5nKCksIFwiLi9naC1ydW5uZXJzXCIpLFxuICBsYWJlbHM6IHVuaW9uKG9wdGlvbmFsKCksIHN0cmluZygpKSxcbiAgbmFtZTogZGVmYXVsdFRvKHN0cmluZygpLCBcInJ1bm5lclwiKSxcbiAgbnVtYmVyT2ZNYWNoaW5lczogZGVmYXVsdFRvKHBvc2l0aXZlSW50KCksIDEpLFxuICBvczogZGVmYXVsdFRvKGVudW1zKFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luZG93c1wiXSksIFwibGludXhcIiksXG4gIG92ZXJ3cml0ZTogZGVmYXVsdFRvKGJvb2xlYW4oKSwgZmFsc2UpLFxuICBydW46IGRlZmF1bHRUbyhib29sZWFuKCksIGZhbHNlKSxcbiAgcnVubmVyR3JvdXA6IHVuaW9uKG9wdGlvbmFsKCksIHN0cmluZygpKSxcbiAgdXJsOiB1bmlvbihvcHRpb25hbCgpLCBzdHJpbmcoKSksXG59KTtcblxuZXhwb3J0IGNvbnN0IFByb2ZpbGVTY2hlbWEgPSBjcmVhdGVTY2hlbWEocHJvZmlsZVZhbGlkYXRvcik7XG5cbmV4cG9ydCBjb25zdCBDb25maWdTY2hlbWEgPSBjcmVhdGVTY2hlbWEoXG4gIG9iamVjdCh7XG4gICAgZGVmYXVsdFByb2ZpbGU6IHVuaW9uKG9wdGlvbmFsKCksIHN0cmluZygpKSxcbiAgICBwcm9maWxlczogcmVjb3JkKFByb2ZpbGVTY2hlbWEudmFsaWRhdG9yKSxcbiAgfSksXG4pO1xuXG4vLyBNYW51YWxseSBkZWZpbmUgdHlwZXMgZm9yIGJldHRlciB0cmVlLXNoYWtpbmdcbmV4cG9ydCB0eXBlIFByb2ZpbGUgPSB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBsYWJlbHM/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVtYmVyT2ZNYWNoaW5lczogbnVtYmVyO1xuICBvczogXCJvc3hcIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiO1xuICBvdmVyd3JpdGU6IGJvb2xlYW47XG4gIHJ1bjogYm9vbGVhbjtcbiAgcnVubmVyR3JvdXA/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHsgZGVmYXVsdFByb2ZpbGU/OiBzdHJpbmc7IHByb2ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9maWxlPiB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZpbGVPcHRpb25zIHtcbiAgY29uZmlnUGF0aD86IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmdzIHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIG9zOiBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCI7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgcnVuOiBib29sZWFuO1xuICBydW5uZXJHcm91cD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5BcmdzIHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIHJ1bm5lckdyb3VwPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZUFyZ3Mge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgZm9yY2U6IGJvb2xlYW47XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHtcbiAgYm9vbGVhbixcbiAgY3JlYXRlU2NoZW1hLFxuICBkZWZhdWx0VG8sXG4gIGVudW1zLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsLFxuICByZWdleCxcbiAgc3RyaW5nLFxuICB1bmlvbixcbiAgdXJsLFxufSBmcm9tIFwiQHI1bi9jbGktY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVBhdGgoKSB7XG4gIGNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGltcG9ydC5tZXRhLnBhdGg7XG5cbiAgY29uc3QgY3VycmVudERpciA9IGN1cnJlbnRGaWxlUGF0aC5zdWJzdHJpbmcoMCwgY3VycmVudEZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cbiAgY29uc3Qgc3JjRGlyID0gY3VycmVudERpci5zdWJzdHJpbmcoMCwgY3VycmVudERpci5sYXN0SW5kZXhPZihcIi9cIikpO1xuXG4gIHJldHVybiBzcmNEaXI7XG59XG5cbmNvbnN0IGNsaUFyZ3NWYWxpZGF0b3IgPSBvYmplY3Qoe1xuICBkaXJlY3Rvcnk6IGRlZmF1bHRUbyhzdHJpbmcoKSwgYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2ApLFxuICBsYWJlbHM6IHVuaW9uKHN0cmluZygpLCBvcHRpb25hbCgpKSxcbiAgbmFtZTogZGVmYXVsdFRvKHN0cmluZygpLCBcInJ1bm5lclwiKSxcbiAgbnVtYmVyT2ZNYWNoaW5lczogZGVmYXVsdFRvKHJlZ2V4KC9eXFxkKyQvLCBcIk51bWJlciBvZiBtYWNoaW5lcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlclwiKSwgXCIxXCIpLFxuICBvczogZGVmYXVsdFRvKGVudW1zKFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luZG93c1wiXSksIFwib3N4XCIpLFxuICBvdmVyd3JpdGU6IGRlZmF1bHRUbyhib29sZWFuKCksIGZhbHNlKSxcbiAgcnVuOiBkZWZhdWx0VG8oYm9vbGVhbigpLCBmYWxzZSksXG4gIHRva2VuOiBkZWZhdWx0VG8oc3RyaW5nKCksIHByb2Nlc3MuZW52LkdJVEhVQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU4gPz8gXCJcIiksXG4gIHVybDogdXJsKCksXG59KTtcblxuY29uc3QgQ2xpQXJnc1NjaGVtYSA9IGNyZWF0ZVNjaGVtYShjbGlBcmdzVmFsaWRhdG9yKTtcblxuZXhwb3J0IHR5cGUgQ2xpQXJncyA9IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIG9zOiBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCI7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgcnVuOiBib29sZWFuO1xuICB0b2tlbjogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGlBcmdzKCk6IENsaUFyZ3Mge1xuICB0cnkge1xuICAgIGNvbnN0IHsgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAgIGFyZ3M6IEJ1bi5hcmd2LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBjb25maWc6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vLmh5ZHJhLmpzb25gLCBzaG9ydDogXCJjXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZGlyZWN0b3J5OiB7IGRlZmF1bHQ6IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLCBzaG9ydDogXCJkXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBuYW1lOiB7IGRlZmF1bHQ6IFwicnVubmVyXCIsIHNob3J0OiBcIm5cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBudW1iZXJPZk1hY2hpbmVzOiB7IGRlZmF1bHQ6IFwiMVwiLCBzaG9ydDogXCJtXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgb3M6IHsgZGVmYXVsdDogXCJvc3hcIiwgc2hvcnQ6IFwic1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIG92ZXJ3cml0ZTogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiZlwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICBydW46IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcInJcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHVybDogeyBzaG9ydDogXCJ1XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIH0sXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBDbGlBcmdzU2NoZW1hLnNhZmVQYXJzZSh2YWx1ZXMpO1xuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50czogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkZhaWxlZCB0byBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXCIsXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9sb2dnZXJcIjtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHsgcHJlZml4OiBcIldvcmtlck1hbmFnZXJcIiB9KTtcblxuZXhwb3J0IGNsYXNzIFdvcmtlck1hbmFnZXIge1xuICBwcml2YXRlIHdvcmtlcnM6IFNldDxXb3JrZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGNsZWFudXBSZWdpc3RlcmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RlckNsZWFudXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsZWFudXBSZWdpc3RlcmVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNsZWFudXBSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy53b3JrZXJzLnNpemUgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiQ2xlYW5pbmcgdXAgd29ya2Vycy4uLlwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVybWluYXRlQWxsKCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJleGl0XCIsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIChlcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKFwiVW5jYXVnaHQgZXhjZXB0aW9uOlwiLCBlcnJvcik7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGQod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtlcnMuYWRkKHdvcmtlcik7XG4gICAgbG9nZ2VyLmRlYnVnKGBXb3JrZXIgYWRkZWQuIFRvdGFsIHdvcmtlcnM6ICR7dGhpcy53b3JrZXJzLnNpemV9YCk7XG5cbiAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy53b3JrZXJzLmRlbGV0ZSh3b3JrZXIpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBXb3JrZXIgZXhpdGVkLiBSZW1haW5pbmcgd29ya2VyczogJHt0aGlzLndvcmtlcnMuc2l6ZX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZSh3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtlcnMuaGFzKHdvcmtlcikpIHtcbiAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgIHRoaXMud29ya2Vycy5kZWxldGUod29ya2VyKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgV29ya2VyIHJlbW92ZWQuIFJlbWFpbmluZyB3b3JrZXJzOiAke3RoaXMud29ya2Vycy5zaXplfWApO1xuICAgIH1cbiAgfVxuXG4gIHRlcm1pbmF0ZUFsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZXJzLnNpemUgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVGVybWluYXRpbmcgJHt0aGlzLndvcmtlcnMuc2l6ZX0gd29ya2Vycy4uLmApO1xuICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy53b3JrZXJzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHRlcm1pbmF0ZSB3b3JrZXI6YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLndvcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndvcmtlcnMuc2l6ZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2VyTWFuYWdlciA9IG5ldyBXb3JrZXJNYW5hZ2VyKCk7XG4iLAogICAgImltcG9ydCB7IGNvbG9ycyB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2NvbG9yc1wiO1xuXG5jb25zdCBDT01NQU5EX0hFTFA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGNyZWF0ZTogYFxuaHlkcmEgY3JlYXRlIC0gQ3JlYXRlIGFuZCByZWdpc3RlciBuZXcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuXG5VU0FHRVxuICBoeWRyYSBjcmVhdGUgW29wdGlvbnNdXG5cbk9QVElPTlNcbiAgLXQsIC0tdG9rZW4gICAgICAgICAgICAgR2l0SHViIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLXUsIC0tdXJsICAgICAgICAgICAgICAgR2l0SHViIHJlcG9zaXRvcnkgb3Igb3JnIFVSTCAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLW0sIC0tbnVtYmVyT2ZNYWNoaW5lcyAgTnVtYmVyIG9mIG1hY2hpbmVzICAgICAgICAgICAgICAgIFtudW1iZXJdIChkZWZhdWx0OiAxKVxuICAtbiwgLS1uYW1lICAgICAgICAgICAgICBSdW5uZXIgbmFtZSBwcmVmaXggICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWwsIC0tbGFiZWxzICAgICAgICAgICAgQ29tbWEtc2VwYXJhdGVkIHJ1bm5lciBsYWJlbHMgICAgIFtzdHJpbmddXG4gIC1vLCAtLW9zICAgICAgICAgICAgICAgIFJ1bm5lciBPUyAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyaW5nXSAoZGVmYXVsdDogbGludXgpXG4gIC1kLCAtLWRpcmVjdG9yeSAgICAgICAgIFJ1bm5lcnMgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtTywgLS1vdmVyd3JpdGUgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgcnVubmVycyAgICAgICAgW2Jvb2xlYW5dXG4gIC1wLCAtLXByb2ZpbGUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvZmlsZSAgICAgICAgICAgICBbc3RyaW5nXVxuICAtYywgLS1jb25maWcgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgcGF0aCAgICAgICAgICAgW3N0cmluZ11cblxuRVhBTVBMRVNcbiAgIyBDcmVhdGUgYSBzaW5nbGUgcnVubmVyXG4gIGh5ZHJhIGNyZWF0ZSAtdCBUT0tFTiAtdSBodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cblxuICAjIENyZWF0ZSAzIHJ1bm5lcnMgd2l0aCBsYWJlbHNcbiAgaHlkcmEgY3JlYXRlIC1tIDMgLXQgVE9LRU4gLXUgVVJMIC1sIGRvY2tlcixncHVcblxuICAjIENyZWF0ZSB1c2luZyBwcm9maWxlXG4gIGh5ZHJhIGNyZWF0ZSAtcCBwcm9kdWN0aW9uIC10IFRPS0VOXG5gLFxuICBpbml0OiBgXG5oeWRyYSBpbml0IC0gSW5pdGlhbGl6ZSBhIG5ldyBIeWRyYSBjb25maWd1cmF0aW9uIGZpbGVcblxuVVNBR0VcbiAgaHlkcmEgaW5pdCBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b21sICAgICAgVXNlIFRPTUwgZm9ybWF0IGluc3RlYWQgb2YgSlNPTiAgICAgICAgIFtib29sZWFuXVxuXG5FWEFNUExFU1xuICAjIEluaXRpYWxpemUgd2l0aCBpbnRlcmFjdGl2ZSBwcm9tcHRzXG4gIGh5ZHJhIGluaXRcblxuICAjIEluaXRpYWxpemUgd2l0aCBUT01MIGZvcm1hdFxuICBoeWRyYSBpbml0IC0tdG9tbFxuYCxcblxuICByZW1vdmU6IGBcbmh5ZHJhIHJlbW92ZSAtIFJlbW92ZSBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIHJlbW92ZSBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtbSwgLS1udW1iZXJPZk1hY2hpbmVzICBOdW1iZXIgb2YgbWFjaGluZXMgICAgICAgICAgICAgICAgW251bWJlcl0gKGRlZmF1bHQ6IDEpXG4gIC1uLCAtLW5hbWUgICAgICAgICAgICAgIFJ1bm5lciBuYW1lIHByZWZpeCAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtZCwgLS1kaXJlY3RvcnkgICAgICAgICBSdW5uZXJzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWYsIC0tZm9yY2UgICAgICAgICAgICAgRm9yY2UgcmVtb3ZhbCAgICAgICAgICAgICAgICAgICAgIFtib29sZWFuXVxuICAtcCwgLS1wcm9maWxlICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb2ZpbGUgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWMsIC0tY29uZmlnICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhdGggICAgICAgICAgIFtzdHJpbmddXG5cbkVYQU1QTEVTXG4gICMgUmVtb3ZlIGFuZCB1bnJlZ2lzdGVyXG4gIGh5ZHJhIHJlbW92ZSAtdCBUT0tFTiAtdSBodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cblxuICAjIEZvcmNlIHJlbW92ZVxuICBoeWRyYSByZW1vdmUgLW0gMiAtLWZvcmNlXG5cbiAgIyBSZW1vdmUgc3BlY2lmaWMgcnVubmVyc1xuICBoeWRyYSByZW1vdmUgLW4gY3VzdG9tIC1tIDMgLXQgVE9LRU4gLXUgVVJMXG5gLFxuXG4gIHJ1bjogYFxuaHlkcmEgcnVuIC0gU3RhcnQgZXhpc3RpbmcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuXG5VU0FHRVxuICBoeWRyYSBydW4gW29wdGlvbnNdXG5cbk9QVElPTlNcbiAgLXQsIC0tdG9rZW4gICAgICAgICAgICAgR2l0SHViIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLXUsIC0tdXJsICAgICAgICAgICAgICAgR2l0SHViIHJlcG9zaXRvcnkgb3Igb3JnIFVSTCAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLW0sIC0tbnVtYmVyT2ZNYWNoaW5lcyAgTnVtYmVyIG9mIG1hY2hpbmVzICAgICAgICAgICAgICAgIFtudW1iZXJdIChkZWZhdWx0OiAxKVxuICAtbiwgLS1uYW1lICAgICAgICAgICAgICBSdW5uZXIgbmFtZSBwcmVmaXggICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWQsIC0tZGlyZWN0b3J5ICAgICAgICAgUnVubmVycyBkaXJlY3RvcnkgICAgICAgICAgICAgICAgIFtzdHJpbmddXG4gIC1wLCAtLXByb2ZpbGUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvZmlsZSAgICAgICAgICAgICBbc3RyaW5nXVxuICAtYywgLS1jb25maWcgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgcGF0aCAgICAgICAgICAgW3N0cmluZ11cblxuRVhBTVBMRVNcbiAgIyBSdW4gZXhpc3RpbmcgcnVubmVyc1xuICBoeWRyYSBydW4gLXQgVE9LRU4gLXUgaHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvXG5cbiAgIyBSdW4gc3BlY2lmaWMgcnVubmVyc1xuICBoeWRyYSBydW4gLW0gMiAtbiBjdXN0b20gLXQgVE9LRU4gLXUgVVJMXG5gLFxuXG4gIHN0YXR1czogYFxuaHlkcmEgc3RhdHVzIC0gQ2hlY2sgdGhlIHN0YXR1cyBvZiBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIHN0YXR1cyBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtZCwgLS1kaXJlY3RvcnkgICAgICAgICBSdW5uZXJzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWosIC0tanNvbiAgICAgICAgICAgICAgT3V0cHV0IHN0YXR1cyBpbiBKU09OIGZvcm1hdCAgICAgIFtib29sZWFuXVxuICAtcCwgLS1wcm9maWxlICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb2ZpbGUgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWMsIC0tY29uZmlnICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhdGggICAgICAgICAgIFtzdHJpbmddXG5cbkVYQU1QTEVTXG4gICMgQ2hlY2sgcnVubmVyIHN0YXR1c1xuICBoeWRyYSBzdGF0dXMgLXQgVE9LRU4gLXUgaHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvXG5cbiAgIyBPdXRwdXQgYXMgSlNPTlxuICBoeWRyYSBzdGF0dXMgLXQgVE9LRU4gLXUgVVJMIC0tanNvblxuXG4gICMgU3RhdHVzIHVzaW5nIHByb2ZpbGVcbiAgaHlkcmEgc3RhdHVzIC1wIHByb2R1Y3Rpb25cbmAsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaGVscChjb21tYW5kTmFtZT86IHN0cmluZykge1xuICBpZiAoY29tbWFuZE5hbWUgJiYgQ09NTUFORF9IRUxQW2NvbW1hbmROYW1lXSkge1xuICAgIGNvbnN0IGhlbHBUZXh0ID0gQ09NTUFORF9IRUxQW2NvbW1hbmROYW1lXTtcbiAgICBjb25zdCBjb2xvcmVkSGVscCA9IGhlbHBUZXh0XG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcImh5ZHJhXCIpKSByZXR1cm4gY29sb3JzLmJvbGQobGluZSk7XG4gICAgICAgIGlmIChsaW5lID09PSBcIlVTQUdFXCIgfHwgbGluZSA9PT0gXCJPUFRJT05TXCIgfHwgbGluZSA9PT0gXCJFWEFNUExFU1wiKSByZXR1cm4gY29sb3JzLmJvbGQobGluZSk7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCIgIC1cIikpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oXFxzKy1cXHcsXFxzLS1cXHcrKVxccysoLispJC8pO1xuICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgWywgZmxhZ3MgPSBcIlwiLCBkZXNjcmlwdGlvbiA9IFwiXCJdID0gbWF0Y2g7XG4gICAgICAgICAgICBjb25zdCBjb2xvcmVkRGVzYyA9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgIC5yZXBsYWNlKFwiKHJlcXVpcmVkKVwiLCBjb2xvcnMucmVkKFwiKHJlcXVpcmVkKVwiKSlcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKGRlZmF1bHQ6IChbXildKylcXCkvZywgKF8sIHZhbHVlKSA9PiBjb2xvcnMuZGltKGAoZGVmYXVsdDogJHt2YWx1ZX0pYCkpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFtib29sZWFuXFxdL2csIGNvbG9ycy5jeWFuKFwiW2Jvb2xlYW5dXCIpKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbc3RyaW5nXFxdL2csIGNvbG9ycy5ncmVlbihcIltzdHJpbmddXCIpKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbbnVtYmVyXFxdL2csIGNvbG9ycy5tYWdlbnRhKFwiW251bWJlcl1cIikpO1xuXG4gICAgICAgICAgICByZXR1cm4gYCAgJHtjb2xvcnMueWVsbG93KGZsYWdzLnBhZEVuZCgyNikpfSAke2NvbG9yZWREZXNjfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCIgICMgXCIpKSByZXR1cm4gY29sb3JzLmRpbShsaW5lKTtcbiAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcIiAgaHlkcmFcIikpIHJldHVybiBgICAke2NvbG9ycy5jeWFuKGxpbmUudHJpbSgpKX1gO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIGNvbnNvbGUuaW5mbyhjb2xvcmVkSGVscCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBcbiR7Y29sb3JzLmJvbGQoXCJIeWRyYSAtIEdpdEh1YiBzZWxmLWhvc3RlZCBydW5uZXIgbWFuYWdlclwiKX1cblxuJHtjb2xvcnMuYm9sZChcIlVTQUdFXCIpfVxuICBoeWRyYSA8Y29tbWFuZD4gW29wdGlvbnNdXG5cbiR7Y29sb3JzLmJvbGQoXCJDT01NQU5EU1wiKX1cbiAgJHtjb2xvcnMuZ3JlZW4oXCJpbml0XCIpfSAgICAgICAgICAgSW5pdGlhbGl6ZSBhIG5ldyBIeWRyYSBjb25maWd1cmF0aW9uIGZpbGVcbiAgJHtjb2xvcnMuZ3JlZW4oXCJjcmVhdGVcIil9ICAgICAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuICAke2NvbG9ycy5ncmVlbihcInJ1blwiKX0gICAgICAgICAgICBTdGFydCBleGlzdGluZyBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG4gICR7Y29sb3JzLmdyZWVuKFwicmVtb3ZlXCIpfSAgICAgICAgIFJlbW92ZSBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG4gICR7Y29sb3JzLmdyZWVuKFwic3RhdHVzXCIpfSAgICAgICAgIENoZWNrIHRoZSBzdGF0dXMgb2YgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuICAke2NvbG9ycy5ncmVlbihcImhlbHBcIil9ICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXG5cblVzZSAke2NvbG9ycy5jeWFuKFwiaHlkcmEgPGNvbW1hbmQ+IC0taGVscFwiKX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21tYW5kLlxuYCk7XG59XG4iLAogICAgImltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5pbXBvcnQgeyBjYW5jZWwsIGNvbmZpcm0sIGdyb3VwLCBpbnRybywgaXNDYW5jZWwsIG91dHJvLCB0ZXh0IH0gZnJvbSBcIkBjbGFjay9wcm9tcHRzXCI7XG5pbXBvcnQgeyBncmFjZWZ1bFRyeSB9IGZyb20gXCJAcjVuL2NsaS1jb3JlXCI7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9jb2xvcnNcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgY29uc3QgeyB0b21sIH0gPSBnZXRBcmdzKCk7XG5cbiAgY29uc3QgY29uZmlnRmlsZU5hbWUgPSB0b21sID8gXCJoeWRyYS50b21sXCIgOiBcImh5ZHJhLmpzb25cIjtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnRmlsZU5hbWUpO1xuXG4gIGNvbnN0IGZpbGUgPSBCdW4uZmlsZShjb25maWdQYXRoKTtcbiAgaWYgKGF3YWl0IGZpbGUuZXhpc3RzKCkpIHtcbiAgICBjb25zdCBvdmVyd3JpdGUgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIGluaXRpYWxWYWx1ZTogZmFsc2UsXG4gICAgICBtZXNzYWdlOiBgQ29uZmlndXJhdGlvbiBmaWxlICR7Y29uZmlnRmlsZU5hbWV9IGFscmVhZHkgZXhpc3RzLiBPdmVyd3JpdGU/YCxcbiAgICB9KTtcbiAgICBpZiAoaXNDYW5jZWwob3ZlcndyaXRlKSB8fCAhb3ZlcndyaXRlKSB7XG4gICAgICBjYW5jZWwoXCJDb25maWd1cmF0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH1cblxuICBpbnRybyhjb2xvcnMuY3lhbihcIvCfmoAgSHlkcmEgQ29uZmlndXJhdGlvbiBTZXR1cFwiKSk7XG4gIGNvbnNvbGUuaW5mbyhjb2xvcnMuZGltKFwiVGhpcyB3aWxsIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHlvdXIgcnVubmVyIHNldHRpbmdzLlwiKSk7XG4gIGNvbnNvbGUuaW5mbyhjb2xvcnMuZGltKFwiWW91IGNhbiBhbHdheXMgZWRpdCB0aGUgZmlsZSBsYXRlciBvciBjcmVhdGUgYWRkaXRpb25hbCBwcm9maWxlcy5cXG5cIikpO1xuXG4gIGNvbnN0IGFuc3dlcnMgPSBhd2FpdCBncm91cChcbiAgICAvLyBiaW9tZS1pZ25vcmUgYXNzaXN0L3NvdXJjZS91c2VTb3J0ZWRLZXlzOiBTa2lwIGxpbnQgdGhlcmVcbiAgICB7XG4gICAgICBwcm9maWxlTmFtZTogKCkgPT4gdGV4dCh7IG1lc3NhZ2U6IFwiUHJvZmlsZSBuYW1lP1wiLCBwbGFjZWhvbGRlcjogXCJkZWZhdWx0XCIgfSksXG4gICAgICBkaXJlY3Rvcnk6ICgpID0+XG4gICAgICAgIHRleHQoe1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXCIuL2doLXJ1bm5lcnNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIkRpcmVjdG9yeSB0byBzdG9yZSBydW5uZXJzP1wiLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIi4vZ2gtcnVubmVyc1wiLFxuICAgICAgICB9KSxcbiAgICAgIG5hbWU6ICgpID0+XG4gICAgICAgIHRleHQoeyBkZWZhdWx0VmFsdWU6IFwicnVubmVyXCIsIG1lc3NhZ2U6IFwiUnVubmVyIG5hbWUgcHJlZml4P1wiLCBwbGFjZWhvbGRlcjogXCJydW5uZXJcIiB9KSxcbiAgICAgIGxhYmVsczogKHsgcmVzdWx0cyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gKHJlc3VsdHMubmFtZSB8fCBcInJ1bm5lclwiKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgcmV0dXJuIHRleHQoe1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcGxhY2Vob2xkZXIsXG4gICAgICAgICAgbWVzc2FnZTogXCJSdW5uZXIgbGFiZWxzIChjb21tYS1zZXBhcmF0ZWQpP1wiLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBudW1iZXJPZk1hY2hpbmVzOiAoKSA9PlxuICAgICAgICB0ZXh0KHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IFwiMVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiTnVtYmVyIG9mIHJ1bm5lciBtYWNoaW5lcz9cIixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogXCIxXCIsXG4gICAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bSkgfHwgbnVtIDwgMSkgcmV0dXJuIFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwXCI7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgdXJsOiAoKSA9PlxuICAgICAgICB0ZXh0KHtcbiAgICAgICAgICBtZXNzYWdlOiBcIkdpdEh1YiByZXBvc2l0b3J5IG9yIG9yZ2FuaXphdGlvbiBVUkw/IChvcHRpb25hbClcIixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogXCJodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cIixcbiAgICAgICAgfSksXG4gICAgfSxcbiAgICB7XG4gICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICBjYW5jZWwoXCJDb25maWd1cmF0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHsgcHJvZmlsZU5hbWUsIGxhYmVscywgbnVtYmVyT2ZNYWNoaW5lcywgLi4ucHJvZmlsZSB9ID0gYW5zd2VycztcbiAgY29uc3QgY29uZmlnOiBDb25maWcgPSB7XG4gICAgZGVmYXVsdFByb2ZpbGU6IHByb2ZpbGVOYW1lLFxuICAgIHByb2ZpbGVzOiB7XG4gICAgICBbcHJvZmlsZU5hbWVdOiB7XG4gICAgICAgIC4uLnByb2ZpbGUsXG4gICAgICAgIGxhYmVsczogbGFiZWxzIGFzIHN0cmluZyxcbiAgICAgICAgbnVtYmVyT2ZNYWNoaW5lczogTnVtYmVyLnBhcnNlSW50KG51bWJlck9mTWFjaGluZXMsIDEwKSxcbiAgICAgICAgb3M6IFwib3N4XCIgYXMgY29uc3QsXG4gICAgICAgIG92ZXJ3cml0ZTogZmFsc2UsXG4gICAgICAgIHJ1bjogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMik7XG5cbiAgYXdhaXQgQnVuLndyaXRlKGNvbmZpZ1BhdGgsIGNvbnRlbnQpO1xuXG4gIGF3YWl0IGdyYWNlZnVsVHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0ICRgY2htb2QgNjAwICR7Y29uZmlnUGF0aH1gLnF1aWV0KCk7XG4gICAgfSxcbiAgICB7IGxvZ0xldmVsOiBcIndhcm5cIiwgbWVzc2FnZTogXCJDb3VsZCBub3Qgc2V0IHNlY3VyZSBmaWxlIHBlcm1pc3Npb25zXCIgfSxcbiAgKTtcblxuICBvdXRybyhjb2xvcnMuZ3JlZW4oYOKckyBDb25maWd1cmF0aW9uIHNhdmVkIHRvICR7Y29uZmlnRmlsZU5hbWV9YCkpO1xuXG4gIGNvbnNvbGUuaW5mbyhcIlxcbkV4YW1wbGUgdXNhZ2U6XCIpO1xuICBjb25zb2xlLmluZm8oXG4gICAgY29sb3JzLmN5YW4oXG4gICAgICBgICBoeWRyYSBjcmVhdGUgLXAgJHtwcm9maWxlTmFtZX0gLS10b2tlbiBZT1VSX1RPS0VOJHthbnN3ZXJzLnVybCA/IFwiXCIgOiBcIiAtLXVybCBSRVBPX1VSTFwifWAsXG4gICAgKSxcbiAgKTtcbiAgY29uc29sZS5pbmZvKFwiXFxuWW91IGNhbiBhZGQgbW9yZSBwcm9maWxlcyBieSBlZGl0aW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuXCIpO1xuXG4gIGlmIChhbnN3ZXJzLnVybCkge1xuICAgIGF3YWl0IG9wZW5HaXRIdWJTZXR0aW5ncyhhbnN3ZXJzLnVybCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb3BlbkdpdEh1YlNldHRpbmdzKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IGdpdGh1YlJlZ2V4ID0gL2dpdGh1YlxcLmNvbVs6L10oW14vXSspKD86XFwvKFteLy5dKykpPy87XG4gIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKGdpdGh1YlJlZ2V4KTtcblxuICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3JnT3JPd25lciwgcmVwb10gPSBtYXRjaDtcblxuICBjb25zdCByZXBvVXJsID0gcmVwbyA/IGAke29yZ09yT3duZXJ9LyR7cmVwb31gIDogYG9yZ2FuaXphdGlvbnMvJHtvcmdPck93bmVyfWA7XG4gIGNvbnN0IHNldHRpbmdzVXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9Vcmx9L3NldHRpbmdzL2FjdGlvbnMvcnVubmVyc2A7XG5cbiAgY29uc29sZS5pbmZvKGBcXG5PcGVuaW5nIEdpdEh1YiBzZXR0aW5nczogJHtjb2xvcnMuY3lhbihzZXR0aW5nc1VybCl9YCk7XG5cbiAgYXdhaXQgZ3JhY2VmdWxUcnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgJGBvcGVuICR7c2V0dGluZ3NVcmx9YC5xdWlldCgpO1xuICAgIH0sXG4gICAge1xuICAgICAgZmFsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZ3JhY2VmdWxUcnkoXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgJGB4ZGctb3BlbiAke3NldHRpbmdzVXJsfWAucXVpZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlxcblBsZWFzZSBvcGVuIHRoZSBVUkwgbWFudWFsbHkgdG8gYWRkIGEgbmV3IHJ1bm5lciB0b2tlbi5cIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nTGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJBbHRlcm5hdGl2ZSBicm93c2VyIG9wZW4gbWV0aG9kIGFsc28gZmFpbGVkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBsb2dMZXZlbDogXCJpbmZvXCIsXG4gICAgICBtZXNzYWdlOiBcIkNvdWxkIG5vdCBvcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseVwiLFxuICAgIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEFyZ3MoKSB7XG4gIGNvbnN0IHsgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgIGFsbG93UG9zaXRpb25hbHM6IHRydWUsXG4gICAgYXJnczogQnVuLmFyZ3YsXG4gICAgb3B0aW9uczogeyB0b21sOiB7IGRlZmF1bHQ6IGZhbHNlLCBzaG9ydDogXCJ0XCIsIHR5cGU6IFwiYm9vbGVhblwiIH0gfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZXM7XG59XG4iLAogICAgImltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7IGNvbmZpcm0sIGlzQ2FuY2VsLCB0ZXh0IH0gZnJvbSBcIkBjbGFjay9wcm9tcHRzXCI7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9jb2xvcnNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGdldFByb2ZpbGUsIGxvYWRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IFJlbW92ZUFyZ3MgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHsgcHJlZml4OiBcInJlbW92ZU1hY2hpbmVzXCIgfSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVNYWNoaW5lcygpIHtcbiAgY29uc3QgYXJncyA9IGF3YWl0IGdldEFyZ3MoKTtcbiAgY29uc3QgeyBkaXJlY3RvcnksIG51bWJlck9mTWFjaGluZXMsIGZvcmNlIH0gPSBhcmdzO1xuICBsZXQgeyB0b2tlbiwgdXJsIH0gPSBhcmdzO1xuXG4gIGNvbnN0IG1hY2hpbmVzRGlyID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG4gIGNvbnN0IGRpcmVjdG9yeUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKG1hY2hpbmVzRGlyKS5leGlzdHMoKTtcbiAgaWYgKCFkaXJlY3RvcnlFeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1hY2hpbmVzIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJHttYWNoaW5lc0Rpcn0uIE5vdGhpbmcgdG8gcmVtb3ZlLmApO1xuICB9XG5cbiAgaWYgKCF0b2tlbiAmJiAhZm9yY2UpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjb2xvcnMueWVsbG93KFwi4pqg77iPIE5vIHRva2VuIG9yIFVSTCBwcm92aWRlZC4gUnVubmVycyB3aWxsIG5vdCBiZSB1bnJlZ2lzdGVyZWQgZnJvbSBHaXRIdWIuXCIpLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUud2Fybihjb2xvcnMueWVsbG93KFwiVXNlIC0tZm9yY2UgdG8gcmVtb3ZlIHJ1bm5lcnMgd2l0aG91dCB1bnJlZ2lzdGVyaW5nIHRoZW0uXCIpKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuICgtdCkgYW5kIFVSTCAoLXUpIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkIG9yIHVzZSAtLWZvcmNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzVXJsID0gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsKTtcblxuICAgIGNvbnN0IHNob3VsZE9wZW4gPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6IGBObyB0b2tlbiBwcm92aWRlZC4gV291bGQgeW91IGxpa2UgdG8gb3BlbiBHaXRIdWIgdG8gZ2V0IGEgcnVubmVyIHRva2VuIGZvciB1bnJlZ2lzdHJhdGlvbj9cXG4gICR7c2V0dGluZ3NVcmx9YCxcbiAgICB9KTtcblxuICAgIGlmIChpc0NhbmNlbChzaG91bGRPcGVuKSB8fCAhc2hvdWxkT3Blbikge1xuICAgICAgY29uc29sZS53YXJuKGNvbG9ycy55ZWxsb3coXCJVc2UgLS1mb3JjZSB0byByZW1vdmUgcnVubmVycyB3aXRob3V0IHVucmVnaXN0ZXJpbmcgdGhlbS5cIikpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gaXMgcmVxdWlyZWQgdG8gdW5yZWdpc3RlciBydW5uZXJzIChvciB1c2UgLS1mb3JjZSlcIik7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJPcGVuaW5nIEdpdEh1YiBydW5uZXIgc2V0dGluZ3MuLi5cIik7XG4gICAgYXdhaXQgJGBvcGVuICR7c2V0dGluZ3NVcmx9YC5xdWlldCgpO1xuXG4gICAgY29uc3QgdG9rZW5JbnB1dCA9IGF3YWl0IHRleHQoe1xuICAgICAgbWVzc2FnZTogXCJFbnRlciB0aGUgcnVubmVyIHJlbW92YWwgdG9rZW46XCIsXG4gICAgICBwbGFjZWhvbGRlcjogXCJBWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFwiLFxuICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gXCJUb2tlbiBpcyByZXF1aXJlZFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHRva2VuSW5wdXQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oY29sb3JzLnllbGxvdyhcIlVzZSAtLWZvcmNlIHRvIHJlbW92ZSBydW5uZXJzIHdpdGhvdXQgdW5yZWdpc3RlcmluZyB0aGVtLlwiKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byB1bnJlZ2lzdGVyIHJ1bm5lcnMgKG9yIHVzZSAtLWZvcmNlKVwiKTtcbiAgICB9XG5cbiAgICB0b2tlbiA9IHRva2VuSW5wdXQudHJpbSgpO1xuICB9XG5cbiAgaWYgKHRva2VuICYmIHVybCkge1xuICAgIGNvbnNvbGUuaW5mbyhjb2xvcnMuY3lhbihcIlVucmVnaXN0ZXJpbmcgcnVubmVycyBmcm9tIEdpdEh1Yi4uLlwiKSk7XG4gICAgYXdhaXQgdW5yZWdpc3RlclJ1bm5lcnMoeyBkaXJlY3RvcnksIG51bWJlck9mTWFjaGluZXMsIHRva2VuIH0pO1xuICB9IGVsc2UgaWYgKCFmb3JjZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNvbG9ycy55ZWxsb3coXCLimqDvuI8gTm8gdG9rZW4gb3IgVVJMIHByb3ZpZGVkLiBSdW5uZXJzIHdpbGwgbm90IGJlIHVucmVnaXN0ZXJlZCBmcm9tIEdpdEh1Yi5cIiksXG4gICAgKTtcbiAgICBjb25zb2xlLndhcm4oY29sb3JzLnllbGxvdyhcIlVzZSAtLWZvcmNlIHRvIHJlbW92ZSBydW5uZXJzIHdpdGhvdXQgdW5yZWdpc3RlcmluZyB0aGVtLlwiKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gKC10KSBhbmQgVVJMICgtdSkgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQgb3IgdXNlIC0tZm9yY2VcIik7XG4gIH1cblxuICBhd2FpdCByZW1vdmVSdW5uZXJEaXJlY3Rvcmllcyh7IGRpcmVjdG9yeSwgbnVtYmVyT2ZNYWNoaW5lcyB9KTtcblxuICBjb25zb2xlLmluZm8oY29sb3JzLmdyZWVuKFwi4pyTIFJ1bm5lcnMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWRcIikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcmdzKCk6IFByb21pc2U8UmVtb3ZlQXJncz4ge1xuICBjb25zdCB7IHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcbiAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIGFyZ3M6IEJ1bi5hcmd2LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNvbmZpZzogeyBzaG9ydDogXCJjXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRpcmVjdG9yeTogeyBkZWZhdWx0OiBgJHtwcm9jZXNzLmN3ZCgpfS9naC1ydW5uZXJzYCwgc2hvcnQ6IFwiZFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBmb3JjZTogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiZlwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogeyBkZWZhdWx0OiBcIjFcIiwgc2hvcnQ6IFwibVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBwcm9maWxlOiB7IHNob3J0OiBcInBcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB1cmw6IHsgc2hvcnQ6IFwidVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoeyBjb25maWdQYXRoOiB2YWx1ZXMuY29uZmlnIGFzIHN0cmluZyB9KTtcbiAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoY29uZmlnLCB2YWx1ZXMucHJvZmlsZSBhcyBzdHJpbmcpO1xuXG4gIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgIGRpcmVjdG9yeTogdmFsdWVzLmRpcmVjdG9yeSBhcyBzdHJpbmcsXG4gICAgZm9yY2U6IHZhbHVlcy5mb3JjZSBhcyBib29sZWFuLFxuICAgIG51bWJlck9mTWFjaGluZXM6IHZhbHVlcy5udW1iZXJPZk1hY2hpbmVzIGFzIHN0cmluZyxcbiAgICB0b2tlbjogdmFsdWVzLnRva2VuIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB1cmw6IHZhbHVlcy51cmwgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB9O1xuXG4gIGlmIChwcm9maWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdG9yeTogYmFzZUFyZ3MuZGlyZWN0b3J5ID8/IHByb2ZpbGUuZGlyZWN0b3J5ID8/IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLFxuICAgICAgZm9yY2U6IGJhc2VBcmdzLmZvcmNlLFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogYmFzZUFyZ3MubnVtYmVyT2ZNYWNoaW5lcyA/PyBTdHJpbmcocHJvZmlsZS5udW1iZXJPZk1hY2hpbmVzKSA/PyBcIjFcIixcbiAgICAgIHRva2VuOiBiYXNlQXJncy50b2tlbixcbiAgICAgIHVybDogYmFzZUFyZ3MudXJsID8/IHByb2ZpbGUudXJsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gYmFzZUFyZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVucmVnaXN0ZXJSdW5uZXJzKHtcbiAgZGlyZWN0b3J5LFxuICBudW1iZXJPZk1hY2hpbmVzLFxuICB0b2tlbixcbn06IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmNoaWxkKFwidW5yZWdpc3RlclwiKTtcbiAgY29uc3QgbnVtTWFjaGluZXMgPSBOdW1iZXIobnVtYmVyT2ZNYWNoaW5lcyk7XG5cbiAgY29uc3QgY3B1Q291bnQgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBCdW4uc3Bhd25TeW5jKFtcIm5wcm9jXCJdKTtcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQocmVzdWx0LnN0ZG91dC50b1N0cmluZygpLnRyaW0oKSwgMTApIHx8IDQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBCdW4uc3Bhd25TeW5jKFtcInN5c2N0bFwiLCBcIi1uXCIsIFwiaHcubmNwdVwiXSk7XG4gICAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQocmVzdWx0LnN0ZG91dC50b1N0cmluZygpLnRyaW0oKSwgMTApIHx8IDQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWluKE1hdGgubWF4KDIsIE1hdGguZmxvb3IoY3B1Q291bnQgLyAyKSksIG51bU1hY2hpbmVzLCA4KTtcblxuICBsb2cuaW5mbyhgVW5yZWdpc3RlcmluZyAke251bU1hY2hpbmVzfSBydW5uZXJzIHdpdGggY29uY3VycmVuY3kgb2YgJHtjb25jdXJyZW5jeX1gKTtcblxuICBjb25zdCB0YXNrcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG51bU1hY2hpbmVzIH0sIChfLCBpKSA9PiBpICsgMSkubWFwKChydW5uZXJJbmRleCkgPT4gKHtcbiAgICBleGVjdXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtYWNoaW5lRGlyZWN0b3J5ID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lcy8ke3J1bm5lckluZGV4fWA7XG4gICAgICBjb25zdCBtYWNoaW5lRXhpc3RzID0gYXdhaXQgQnVuLmZpbGUobWFjaGluZURpcmVjdG9yeSkuZXhpc3RzKCk7XG5cbiAgICAgIGlmICghbWFjaGluZUV4aXN0cykge1xuICAgICAgICBsb2cuZGVidWcoYE1hY2hpbmUgJHtydW5uZXJJbmRleH0gZG9lc24ndCBleGlzdCwgc2tpcHBpbmcuLi5gKTtcbiAgICAgICAgcmV0dXJuIHsgcnVubmVySW5kZXgsIHN0YXR1czogXCJza2lwcGVkXCIgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBVbnJlZ2lzdGVyaW5nIG1hY2hpbmUgJHtydW5uZXJJbmRleH0uLi5gKTtcbiAgICAgICAgYXdhaXQgJGAke21hY2hpbmVEaXJlY3Rvcnl9L2NvbmZpZy5zaCByZW1vdmUgLS10b2tlbiAke3Rva2VufWAucXVpZXQoKTtcbiAgICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQgbWFjaGluZSAke3J1bm5lckluZGV4fSBmcm9tIEdpdEh1YmApO1xuICAgICAgICByZXR1cm4geyBydW5uZXJJbmRleCwgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byB1bnJlZ2lzdGVyIG1hY2hpbmUgJHtydW5uZXJJbmRleH06ICR7ZXJyb3J9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yLCBydW5uZXJJbmRleCwgc3RhdHVzOiBcImZhaWxlZFwiIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBydW5uZXJJbmRleCxcbiAgfSkpO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkgKz0gY29uY3VycmVuY3kpIHtcbiAgICBjb25zdCBiYXRjaCA9IHRhc2tzLnNsaWNlKGksIGkgKyBjb25jdXJyZW5jeSk7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGJhdGNoLm1hcCgodGFzaykgPT4gdGFzay5leGVjdXRlKCkpKTtcbiAgICByZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgfVxuXG4gIGNvbnN0IHN1Y2Nlc3NmdWwgPSByZXN1bHRzLmZpbHRlcihcbiAgICAocikgPT4gci5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgci52YWx1ZT8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIixcbiAgKS5sZW5ndGg7XG4gIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKFxuICAgIChyKSA9PiByLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByLnZhbHVlPy5zdGF0dXMgPT09IFwiZmFpbGVkXCIsXG4gICkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkID0gcmVzdWx0cy5maWx0ZXIoXG4gICAgKHIpID0+IHIuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHIudmFsdWU/LnN0YXR1cyA9PT0gXCJza2lwcGVkXCIsXG4gICkubGVuZ3RoO1xuXG4gIGxvZy5pbmZvKFxuICAgIGBVbnJlZ2lzdHJhdGlvbiBjb21wbGV0ZTogJHtzdWNjZXNzZnVsfSBzdWNjZXNzZnVsLCAke2ZhaWxlZH0gZmFpbGVkLCAke3NraXBwZWR9IHNraXBwZWRgLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVSdW5uZXJEaXJlY3Rvcmllcyh7XG4gIGRpcmVjdG9yeSxcbiAgbnVtYmVyT2ZNYWNoaW5lcyxcbn06IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmNoaWxkKFwicmVtb3ZlRGlyZWN0b3JpZXNcIik7XG4gIGNvbnN0IG51bU1hY2hpbmVzID0gTnVtYmVyKG51bWJlck9mTWFjaGluZXMpO1xuXG4gIGNvbnN0IHRhc2tzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtTWFjaGluZXMgfSwgKF8sIGkpID0+IGkgKyAxKS5tYXAoKHJ1bm5lckluZGV4KSA9PiAoe1xuICAgIGV4ZWN1dGU6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hY2hpbmVEaXJlY3RvcnkgPSBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YDtcbiAgICAgIGNvbnN0IG1hY2hpbmVFeGlzdHMgPSBhd2FpdCBCdW4uZmlsZShtYWNoaW5lRGlyZWN0b3J5KS5leGlzdHMoKTtcblxuICAgICAgaWYgKCFtYWNoaW5lRXhpc3RzKSB7XG4gICAgICAgIHJldHVybiB7IHJ1bm5lckluZGV4LCBzdGF0dXM6IFwic2tpcHBlZFwiIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0ICRgcm0gLXJmICR7bWFjaGluZURpcmVjdG9yeX1gLnF1aWV0KCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVtb3ZlZCBtYWNoaW5lICR7cnVubmVySW5kZXh9IGRpcmVjdG9yeWApO1xuICAgICAgICByZXR1cm4geyBydW5uZXJJbmRleCwgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nLmVycm9yKGBFcnJvciByZW1vdmluZyBtYWNoaW5lICR7cnVubmVySW5kZXh9IGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3IsIHJ1bm5lckluZGV4LCBzdGF0dXM6IFwiZmFpbGVkXCIgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJ1bm5lckluZGV4LFxuICB9KSk7XG5cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0YXNrcy5tYXAoKHRhc2spID0+IHRhc2suZXhlY3V0ZSgpKSk7XG5cbiAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKFxuICAgIChyKSA9PiByLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByLnZhbHVlPy5zdGF0dXMgPT09IFwic3VjY2Vzc1wiLFxuICApLmxlbmd0aDtcbiAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoXG4gICAgKHIpID0+IHIuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHIudmFsdWU/LnN0YXR1cyA9PT0gXCJmYWlsZWRcIixcbiAgKS5sZW5ndGg7XG5cbiAgbG9nLmluZm8oYERpcmVjdG9yeSByZW1vdmFsIGNvbXBsZXRlOiAke3N1Y2Nlc3NmdWx9IHJlbW92ZWQsICR7ZmFpbGVkfSBmYWlsZWRgKTtcblxuICBpZiAoZmFpbGVkID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlbW92ZSAke2ZhaWxlZH0gcnVubmVyIGRpcmVjdG9yaWVzYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG1hY2hpbmVzRGlyID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG4gICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgJGBscyAtQSAke21hY2hpbmVzRGlyfWAudGV4dCgpKS50cmltKCk7XG5cbiAgICBpZiAoIWZpbGVzKSB7XG4gICAgICBhd2FpdCAkYHJtIC1yZiAke21hY2hpbmVzRGlyfWAucXVpZXQoKTtcblxuICAgICAgY29uc3QgcGFyZW50RmlsZXMgPSAoYXdhaXQgJGBscyAtQSAke2RpcmVjdG9yeX1gLnRleHQoKSkudHJpbSgpO1xuICAgICAgaWYgKCFwYXJlbnRGaWxlcykge1xuICAgICAgICBhd2FpdCAkYHJtIC1yZiAke2RpcmVjdG9yeX1gLnF1aWV0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuaW5mbyhjb2xvcnMuZ3JlZW4oYOKckyBSZW1vdmVkIGVtcHR5IGRpcmVjdG9yaWVzYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoX2Vycm9yKSB7fVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSdW5uZXJTZXR0aW5nc1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSA9PT0gXCJnaXRodWIuY29tXCIgfHwgcGFyc2VkVXJsLmhvc3RuYW1lID09PSBcInd3dy5naXRodWIuY29tXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnNgO1xuICAgICAgfSBlbHNlIGlmIChwYXRoUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnNgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGF0aFBhcnRzWzBdID09PSBcIm9yZ3NcIiAmJiBwYXRoUGFydHNbMV0pIHtcbiAgICAgICAgcmV0dXJuIGAke3BhcnNlZFVybC5vcmlnaW59L29yZ2FuaXphdGlvbnMvJHtwYXRoUGFydHNbMV19L3NldHRpbmdzL2FjdGlvbnMvcnVubmVyc2A7XG4gICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnNgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHsgY29uZmlybSwgaXNDYW5jZWwsIHRleHQgfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGdldFByb2ZpbGUsIGxvYWRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRQYWNrYWdlUGF0aCB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyB3b3JrZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL2xpYi93b3JrZXItbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBSdW5BcmdzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih7IHByZWZpeDogXCJydW5NYWNoaW5lc1wiIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWFjaGluZXMoKSB7XG4gIGNvbnN0IGFyZ3MgPSBhd2FpdCBnZXRBcmdzKCk7XG4gIGNvbnN0IHsgZGlyZWN0b3J5LCBudW1iZXJPZk1hY2hpbmVzLCBuYW1lLCBsYWJlbHMsIHJ1bm5lckdyb3VwIH0gPSBhcmdzO1xuICBsZXQgeyB0b2tlbiwgdXJsIH0gPSBhcmdzO1xuXG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVVJMICgtdSkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIGNvbnN0IHNldHRpbmdzVXJsID0gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsKTtcblxuICAgIGNvbnN0IHNob3VsZE9wZW4gPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6IGBObyB0b2tlbiBwcm92aWRlZC4gV291bGQgeW91IGxpa2UgdG8gb3BlbiBHaXRIdWIgdG8gZ2V0IGEgcnVubmVyIHRva2VuP1xcbiAgJHtzZXR0aW5nc1VybH1gLFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHNob3VsZE9wZW4pIHx8ICFzaG91bGRPcGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byBydW4gbWFjaGluZXNcIik7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJPcGVuaW5nIEdpdEh1YiBydW5uZXIgc2V0dGluZ3MuLi5cIik7XG4gICAgYXdhaXQgJGBvcGVuICR7c2V0dGluZ3NVcmx9YC5xdWlldCgpO1xuXG4gICAgY29uc3QgdG9rZW5JbnB1dCA9IGF3YWl0IHRleHQoe1xuICAgICAgbWVzc2FnZTogXCJFbnRlciB0aGUgcnVubmVyIHJlZ2lzdHJhdGlvbiB0b2tlbjpcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBcIkFYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXCIsXG4gICAgICB2YWxpZGF0ZTogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBcIlRva2VuIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoaXNDYW5jZWwodG9rZW5JbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuIGlzIHJlcXVpcmVkIHRvIHJ1biBtYWNoaW5lc1wiKTtcbiAgICB9XG5cbiAgICB0b2tlbiA9IHRva2VuSW5wdXQudHJpbSgpO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICR7bnVtYmVyT2ZNYWNoaW5lc30gcnVubmVycyBmcm9tICR7ZGlyZWN0b3J5fWApO1xuICBsb2dnZXIuZGVidWcoYE5hbWU6ICR7bmFtZX0sIExhYmVsczogJHtsYWJlbHMgfHwgXCJub25lXCJ9YCk7XG5cbiAgY29uc3QgZGlyZWN0b3J5RXhpc3RzID0gYXdhaXQgQnVuLmZpbGUoYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2ApLmV4aXN0cygpO1xuICBpZiAoIWRpcmVjdG9yeUV4aXN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNYWNoaW5lcyBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0ICR7ZGlyZWN0b3J5fS9tYWNoaW5lcy4gUnVuICdoeWRyYSBjcmVhdGUnIGZpcnN0LmAsXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHN0YXJ0UnVubmVycyh7IGRpcmVjdG9yeSwgbGFiZWxzLCBuYW1lLCBudW1iZXJPZk1hY2hpbmVzLCBydW5uZXJHcm91cCwgdG9rZW4sIHVybCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXJncygpOiBQcm9taXNlPFJ1bkFyZ3M+IHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzOiBCdW4uYXJndixcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb25maWc6IHsgc2hvcnQ6IFwiY1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkaXJlY3Rvcnk6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsIHNob3J0OiBcImRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbmFtZTogeyBkZWZhdWx0OiBcInJ1bm5lclwiLCBzaG9ydDogXCJuXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIG51bWJlck9mTWFjaGluZXM6IHsgZGVmYXVsdDogXCIxXCIsIHNob3J0OiBcIm1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgcHJvZmlsZTogeyBzaG9ydDogXCJwXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIHJ1bm5lckdyb3VwOiB7IHNob3J0OiBcImdcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB1cmw6IHsgc2hvcnQ6IFwidVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoeyBjb25maWdQYXRoOiB2YWx1ZXMuY29uZmlnIGFzIHN0cmluZyB9KTtcbiAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoY29uZmlnLCB2YWx1ZXMucHJvZmlsZSBhcyBzdHJpbmcpO1xuXG4gIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgIGRpcmVjdG9yeTogdmFsdWVzLmRpcmVjdG9yeSBhcyBzdHJpbmcsXG4gICAgbGFiZWxzOiB2YWx1ZXMubGFiZWxzIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBuYW1lOiB2YWx1ZXMubmFtZSBhcyBzdHJpbmcsXG4gICAgbnVtYmVyT2ZNYWNoaW5lczogdmFsdWVzLm51bWJlck9mTWFjaGluZXMgYXMgc3RyaW5nLFxuICAgIHJ1bm5lckdyb3VwOiB2YWx1ZXMucnVubmVyR3JvdXAgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRva2VuOiB2YWx1ZXMudG9rZW4gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHVybDogdmFsdWVzLnVybCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIH07XG5cbiAgaWYgKHByb2ZpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlyZWN0b3J5OiBiYXNlQXJncy5kaXJlY3RvcnkgPz8gcHJvZmlsZS5kaXJlY3RvcnkgPz8gYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsXG4gICAgICBsYWJlbHM6IGJhc2VBcmdzLmxhYmVscyA/PyBwcm9maWxlLmxhYmVscyxcbiAgICAgIG5hbWU6IGJhc2VBcmdzLm5hbWUgPz8gcHJvZmlsZS5uYW1lID8/IFwicnVubmVyXCIsXG4gICAgICBudW1iZXJPZk1hY2hpbmVzOiBiYXNlQXJncy5udW1iZXJPZk1hY2hpbmVzID8/IFN0cmluZyhwcm9maWxlLm51bWJlck9mTWFjaGluZXMpID8/IFwiMVwiLFxuICAgICAgcnVubmVyR3JvdXA6IGJhc2VBcmdzLnJ1bm5lckdyb3VwID8/IHByb2ZpbGUucnVubmVyR3JvdXAsXG4gICAgICB0b2tlbjogYmFzZUFyZ3MudG9rZW4sXG4gICAgICB1cmw6IGJhc2VBcmdzLnVybCA/PyBwcm9maWxlLnVybCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGJhc2VBcmdzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydFJ1bm5lcnMoe1xuICBkaXJlY3RvcnksXG4gIG51bWJlck9mTWFjaGluZXMsXG4gIHRva2VuLFxuICB1cmwsXG4gIG5hbWUsXG4gIGxhYmVscyxcbiAgcnVubmVyR3JvdXAsXG59OiB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgcnVubmVyR3JvdXA/OiBzdHJpbmc7XG59KSB7XG4gIGxvZ2dlci5pbmZvKGBTdGFydGluZyAke251bWJlck9mTWFjaGluZXN9IHdvcmtlcnMuLi5gKTtcblxuICBmb3IgKGxldCBydW5uZXJJbmRleCA9IDE7IHJ1bm5lckluZGV4IDw9IE51bWJlcihudW1iZXJPZk1hY2hpbmVzKTsgcnVubmVySW5kZXgrKykge1xuICAgIGNvbnN0IG1hY2hpbmVEaXJlY3RvcnkgPSBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YDtcbiAgICBjb25zdCBtYWNoaW5lRXhpc3RzID0gYXdhaXQgQnVuLmZpbGUobWFjaGluZURpcmVjdG9yeSkuZXhpc3RzKCk7XG5cbiAgICBpZiAoIW1hY2hpbmVFeGlzdHMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBNYWNoaW5lICR7cnVubmVySW5kZXh9IGRvZXNuJ3QgZXhpc3QsIHNraXBwaW5nLi4uYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXJQYXRoID0gYCR7Z2V0UGFja2FnZVBhdGgoKX0vc3JjL3J1bm5lci13b3JrZXIudHNgO1xuICAgIGNvbnN0IHdvcmtlck5hbWUgPSBgJHtuYW1lfS0ke3J1bm5lckluZGV4fWA7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJQYXRoLCB7IG5hbWU6IHdvcmtlck5hbWUsIHJlZjogdHJ1ZSB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoeyBkYXRhIH0pID0+IHtcbiAgICAgIGNvbnN0IGxldmVsID0gZGF0YS50eXBlID09PSBcImVycm9yXCIgPyBcImVycm9yXCIgOiBcImluZm9cIjtcbiAgICAgIGxvZ2dlcltsZXZlbF0oYCR7d29ya2VyTmFtZX06ICR7ZGF0YS5tZXNzYWdlfWApO1xuICAgIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgV29ya2VyICR7d29ya2VyTmFtZX0gZXJyb3I6YCwgZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7d29ya2VyTmFtZX0gZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgfSk7XG5cbiAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgaW5kZXg6IHJ1bm5lckluZGV4LFxuICAgICAgbGFiZWxzLFxuICAgICAgbWFjaGluZUN3ZDogbWFjaGluZURpcmVjdG9yeSxcbiAgICAgIG5hbWUsXG4gICAgICBydW5uZXJHcm91cCxcbiAgICAgIHRva2VuLFxuICAgICAgdXJsLFxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYFdvcmtlciAke3dvcmtlck5hbWV9IHN0YXJ0aW5nLi4uYCk7XG4gICAgd29ya2VyTWFuYWdlci5hZGQod29ya2VyKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKFwiQWxsIHdvcmtlcnMgc3RhcnRlZC4gUHJlc3MgQ3RybCtDIHRvIHN0b3AgYWxsIG1hY2hpbmVzXCIpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSdW5uZXJTZXR0aW5nc1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSA9PT0gXCJnaXRodWIuY29tXCIgfHwgcGFyc2VkVXJsLmhvc3RuYW1lID09PSBcInd3dy5naXRodWIuY29tXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7cGF0aFBhcnRzWzBdfS8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vb3JnYW5pemF0aW9ucy8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXJsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7IGxvZywgc3Bpbm5lciB9IGZyb20gXCJAY2xhY2svcHJvbXB0c1wiO1xuaW1wb3J0IHsgZ3JhY2VmdWxUcnksIHdpdGhSZXRyeSB9IGZyb20gXCJAcjVuL2NsaS1jb3JlXCI7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9jb2xvcnNcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBnZXRQcm9maWxlLCBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG5pbnRlcmZhY2UgUnVubmVyU3RhdHVzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzdGF0dXM6IFwib25saW5lXCIgfCBcIm9mZmxpbmVcIiB8IFwiYnVzeVwiO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBidXN5OiBib29sZWFuO1xuICBvczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2l0SHViUnVubmVyUmVzcG9uc2Uge1xuICBydW5uZXJzOiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgb3M6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBidXN5OiBib29sZWFuO1xuICAgIGxhYmVsczogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT47XG4gIH0+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhdHVzKCkge1xuICBjb25zdCBhcmdzID0gYXdhaXQgZ2V0QXJncygpO1xuICBjb25zdCB7IGRpcmVjdG9yeSwgdG9rZW4sIHVybCwganNvbiB9ID0gYXJncztcblxuICBpZiAoIXRva2VuIHx8ICF1cmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiAoLXQpIGFuZCBVUkwgKC11KSBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c1NwaW5uZXIgPSBzcGlubmVyKCk7XG4gIHN0YXR1c1NwaW5uZXIuc3RhcnQoXCJGZXRjaGluZyBydW5uZXIgc3RhdHVzLi4uXCIpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbG9jYWxSdW5uZXJzID0gYXdhaXQgZ2V0TG9jYWxSdW5uZXJzKGRpcmVjdG9yeSk7XG4gICAgY29uc3QgZ2l0aHViUnVubmVycyA9IGF3YWl0IGZldGNoR2l0SHViUnVubmVycyh1cmwsIHRva2VuKTtcbiAgICBjb25zdCBydW5uZXJTdGF0dXNlcyA9IGNvbWJpbmVSdW5uZXJTdGF0dXMobG9jYWxSdW5uZXJzLCBnaXRodWJSdW5uZXJzKTtcblxuICAgIHN0YXR1c1NwaW5uZXIuc3RvcChcIlJ1bm5lciBzdGF0dXMgZmV0Y2hlZFwiKTtcblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShydW5uZXJTdGF0dXNlcywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5UnVubmVyU3RhdHVzKHJ1bm5lclN0YXR1c2VzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3RhdHVzU3Bpbm5lci5zdG9wKFwiRmFpbGVkIHRvIGZldGNoIHJ1bm5lciBzdGF0dXNcIik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXJncygpIHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzOiBCdW4uYXJndixcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb25maWc6IHsgc2hvcnQ6IFwiY1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkaXJlY3Rvcnk6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsIHNob3J0OiBcImRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAganNvbjogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwialwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgcHJvZmlsZTogeyBzaG9ydDogXCJwXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIHRva2VuOiB7IHNob3J0OiBcInRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdXJsOiB7IHNob3J0OiBcInVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgIH0sXG4gICAgc3RyaWN0OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHsgY29uZmlnUGF0aDogdmFsdWVzLmNvbmZpZyBhcyBzdHJpbmcgfSk7XG4gIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQcm9maWxlKGNvbmZpZywgdmFsdWVzLnByb2ZpbGUgYXMgc3RyaW5nKTtcblxuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeTogKHZhbHVlcy5kaXJlY3RvcnkgYXMgc3RyaW5nKSB8fCBwcm9maWxlPy5kaXJlY3RvcnkgfHwgYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsXG4gICAganNvbjogdmFsdWVzLmpzb24gYXMgYm9vbGVhbixcbiAgICB0b2tlbjogdmFsdWVzLnRva2VuIGFzIHN0cmluZyxcbiAgICB1cmw6ICh2YWx1ZXMudXJsIGFzIHN0cmluZykgfHwgcHJvZmlsZT8udXJsLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMb2NhbFJ1bm5lcnMoZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IG1hY2hpbmVzRGlyID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ3JhY2VmdWxUcnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgJGBscyAke21hY2hpbmVzRGlyfSAyPi9kZXYvbnVsbCB8fCB0cnVlYC5xdWlldCgpO1xuICAgICAgcmV0dXJuIG91dHB1dC5zdGRvdXQudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoXCJcXG5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH0sXG4gICAgeyBmYWxsYmFjazogKCkgPT4ge30sIGxvZ0xldmVsOiBcImRlYnVnXCIsIG1lc3NhZ2U6IFwiTm8gbG9jYWwgcnVubmVycyBmb3VuZFwiIH0sXG4gICk7XG5cbiAgcmV0dXJuIHJlc3VsdCB8fCBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hHaXRIdWJSdW5uZXJzKHVybDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxHaXRIdWJSdW5uZXJSZXNwb25zZT4ge1xuICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvZ2l0aHViXFwuY29tWzovXShbXi9dKykoPzpcXC8oW14vLl0rKSk/Lyk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEdpdEh1YiBVUkxcIik7XG4gIH1cblxuICBjb25zdCBbLCBvcmdPck93bmVyLCByZXBvXSA9IG1hdGNoO1xuICBjb25zdCBhcGlVcmwgPSByZXBvXG4gICAgPyBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke29yZ09yT3duZXJ9LyR7cmVwb30vYWN0aW9ucy9ydW5uZXJzYFxuICAgIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8ke29yZ09yT3duZXJ9L2FjdGlvbnMvcnVubmVyc2A7XG5cbiAgcmV0dXJuIHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhcGlVcmwsIHsgaGVhZGVycyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIHtcbiAgICAgIG9uUmV0cnk6IChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICBsb2cud2FybihgUmV0cnlpbmcgR2l0SHViIEFQSSBjYWxsIChhdHRlbXB0ICR7YXR0ZW1wdH0pOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVSdW5uZXJTdGF0dXMoXG4gIGxvY2FsUnVubmVyczogc3RyaW5nW10sXG4gIGdpdGh1YkRhdGE6IEdpdEh1YlJ1bm5lclJlc3BvbnNlLFxuKTogUnVubmVyU3RhdHVzW10ge1xuICBjb25zdCBzdGF0dXNlczogUnVubmVyU3RhdHVzW10gPSBbXTtcbiAgY29uc3QgZ2l0aHViUnVubmVyTWFwID0gbmV3IE1hcChnaXRodWJEYXRhLnJ1bm5lcnMubWFwKChydW5uZXIpID0+IFtydW5uZXIubmFtZSwgcnVubmVyXSkpO1xuXG4gIGZvciAoY29uc3QgcnVubmVyRGlyIG9mIGxvY2FsUnVubmVycykge1xuICAgIGNvbnN0IHJ1bm5lck5hbWUgPSBgcnVubmVyLSR7cnVubmVyRGlyfWA7XG4gICAgY29uc3QgZ2l0aHViUnVubmVyID0gZ2l0aHViUnVubmVyTWFwLmdldChydW5uZXJOYW1lKTtcblxuICAgIGlmIChnaXRodWJSdW5uZXIpIHtcbiAgICAgIHN0YXR1c2VzLnB1c2goe1xuICAgICAgICBidXN5OiBnaXRodWJSdW5uZXIuYnVzeSxcbiAgICAgICAgbGFiZWxzOiBnaXRodWJSdW5uZXIubGFiZWxzLm1hcCgobCkgPT4gbC5uYW1lKSxcbiAgICAgICAgbmFtZTogcnVubmVyTmFtZSxcbiAgICAgICAgb3M6IGdpdGh1YlJ1bm5lci5vcyxcbiAgICAgICAgc3RhdHVzOiBnaXRodWJSdW5uZXIuYnVzeVxuICAgICAgICAgID8gXCJidXN5XCJcbiAgICAgICAgICA6IGdpdGh1YlJ1bm5lci5zdGF0dXMgPT09IFwib25saW5lXCJcbiAgICAgICAgICAgID8gXCJvbmxpbmVcIlxuICAgICAgICAgICAgOiBcIm9mZmxpbmVcIixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNlcy5wdXNoKHtcbiAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgIGxhYmVsczogW10sXG4gICAgICAgIG5hbWU6IHJ1bm5lck5hbWUsXG4gICAgICAgIG9zOiBcInVua25vd25cIixcbiAgICAgICAgc3RhdHVzOiBcIm9mZmxpbmVcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZGlzcGxheVJ1bm5lclN0YXR1cyhzdGF0dXNlczogUnVubmVyU3RhdHVzW10pIHtcbiAgaWYgKHN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZy5pbmZvKFwiTm8gcnVubmVycyBmb3VuZFwiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmxvZyhgXFxuJHtjb2xvcnMuYm9sZChcIlJ1bm5lciBTdGF0dXM6XCIpfWApO1xuICBjb25zb2xlLmxvZyhcIuKUgFwiLnJlcGVhdCg4MCkpO1xuXG4gIGNvbnN0IHN0YXR1c0NvbG9ycyA9IHsgYnVzeTogY29sb3JzLnllbGxvdywgb2ZmbGluZTogY29sb3JzLnJlZCwgb25saW5lOiBjb2xvcnMuZ3JlZW4gfTtcblxuICBmb3IgKGNvbnN0IHJ1bm5lciBvZiBzdGF0dXNlcykge1xuICAgIGNvbnN0IHN0YXR1c0NvbG9yID0gc3RhdHVzQ29sb3JzW3J1bm5lci5zdGF0dXNdO1xuICAgIGNvbnN0IHN0YXR1c1RleHQgPSBydW5uZXIuc3RhdHVzLnRvVXBwZXJDYXNlKCkucGFkRW5kKDcpO1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGF0dXNDb2xvcihcIuKXj1wiKX0gJHtzdGF0dXNDb2xvcihzdGF0dXNUZXh0KX0gJHtjb2xvcnMuY3lhbihydW5uZXIubmFtZS5wYWRFbmQoMjApKX0gYCArXG4gICAgICAgIGAke2NvbG9ycy5kaW0oYE9TOiAke3J1bm5lci5vcy5wYWRFbmQoMTApfWApfSBgICtcbiAgICAgICAgYCR7cnVubmVyLmxhYmVscy5sZW5ndGggPiAwID8gY29sb3JzLmRpbShgTGFiZWxzOiAke3J1bm5lci5sYWJlbHMuam9pbihcIiwgXCIpfWApIDogXCJcIn1gLFxuICAgICk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhcIuKUgFwiLnJlcGVhdCg4MCkpO1xuXG4gIGNvbnN0IHN1bW1hcnkgPSB7XG4gICAgYnVzeTogc3RhdHVzZXMuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gXCJidXN5XCIpLmxlbmd0aCxcbiAgICBvZmZsaW5lOiBzdGF0dXNlcy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBcIm9mZmxpbmVcIikubGVuZ3RoLFxuICAgIG9ubGluZTogc3RhdHVzZXMuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gXCJvbmxpbmVcIikubGVuZ3RoLFxuICAgIHRvdGFsOiBzdGF0dXNlcy5sZW5ndGgsXG4gIH07XG5cbiAgY29uc29sZS5sb2coXG4gICAgYFxcbiR7Y29sb3JzLmJvbGQoXCJTdW1tYXJ5OlwiKX0gYCArXG4gICAgICBgVG90YWw6ICR7c3VtbWFyeS50b3RhbH0gfCBgICtcbiAgICAgIGAke2NvbG9ycy5ncmVlbihgT25saW5lOiAke3N1bW1hcnkub25saW5lfWApfSB8IGAgK1xuICAgICAgYCR7Y29sb3JzLnllbGxvdyhgQnVzeTogJHtzdW1tYXJ5LmJ1c3l9YCl9IHwgYCArXG4gICAgICBgJHtjb2xvcnMucmVkKGBPZmZsaW5lOiAke3N1bW1hcnkub2ZmbGluZX1gKX1cXG5gLFxuICApO1xufVxuIiwKICAgICJpbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGNoZWNrQ29tbW9uTWlzdGFrZXMsIGdldFN1Z2dlc3Rpb25zIH0gZnJvbSBcIkByNW4vY2xpLWNvcmVcIjtcbmltcG9ydCB7IGNvbG9ycyB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2NvbG9yc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWFjaGluZXMgfSBmcm9tIFwiLi9tZXRob2RzL2NyZWF0ZU1hY2hpbmVzXCI7XG5pbXBvcnQgeyBoZWxwIH0gZnJvbSBcIi4vbWV0aG9kcy9oZWxwXCI7XG5pbXBvcnQgeyBpbml0IH0gZnJvbSBcIi4vbWV0aG9kcy9pbml0XCI7XG5pbXBvcnQgeyByZW1vdmVNYWNoaW5lcyB9IGZyb20gXCIuL21ldGhvZHMvcmVtb3ZlTWFjaGluZXNcIjtcbmltcG9ydCB7IHJ1bk1hY2hpbmVzIH0gZnJvbSBcIi4vbWV0aG9kcy9ydW5NYWNoaW5lc1wiO1xuaW1wb3J0IHsgc3RhdHVzIH0gZnJvbSBcIi4vbWV0aG9kcy9zdGF0dXNcIjtcblxuY29uc3QgQ09NTUFORFMgPSBbXCJpbml0XCIsIFwiY3JlYXRlXCIsIFwicnVuXCIsIFwicmVtb3ZlXCIsIFwic3RhdHVzXCIsIFwiaGVscFwiXTtcblxuY29uc3QgQ09NTU9OX01JU1RBS0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBjOiBcImNyZWF0ZVwiLFxuICBjZWF0ZTogXCJjcmVhdGVcIixcbiAgY3JhZXRlOiBcImNyZWF0ZVwiLFxuICBjcmV0YWU6IFwiY3JlYXRlXCIsXG4gIGRlbDogXCJyZW1vdmVcIixcbiAgZGVsZXRlOiBcInJlbW92ZVwiLFxuICBoOiBcImhlbHBcIixcbiAgaTogXCJpbml0XCIsXG4gIGluZm86IFwic3RhdHVzXCIsXG4gIGluaXRpYWxpc2U6IFwiaW5pdFwiLFxuICBpbnRpOiBcImluaXRcIixcbiAgaW50aWFsaXplOiBcImluaXRcIixcbiAgbGlzdDogXCJzdGF0dXNcIixcbiAgbHM6IFwic3RhdHVzXCIsXG4gIG5ldzogXCJjcmVhdGVcIixcbiAgcjogXCJydW5cIixcbiAgcmVtdm9lOiBcInJlbW92ZVwiLFxuICBybTogXCJyZW1vdmVcIixcbiAgcm1vdmU6IFwicmVtb3ZlXCIsXG4gIHJudTogXCJydW5cIixcbiAgcnVubjogXCJydW5cIixcbiAgczogXCJzdGF0dXNcIixcbiAgc3RhcnQ6IFwicnVuXCIsXG4gIHN0YXQ6IFwic3RhdHVzXCIsXG4gIHN0b3A6IFwicmVtb3ZlXCIsXG4gIHN0dGF1czogXCJzdGF0dXNcIixcbiAgdDogXCJ0cm91Ymxlc2hvb3RcIixcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgWywgLCBjb21tYW5kTmFtZSwgLi4uYXJnc10gPSBwcm9jZXNzLmFyZ3Y7XG5cbiAgICBpZiAoIWNvbW1hbmROYW1lIHx8IGNvbW1hbmROYW1lID09PSBcIi0taGVscFwiIHx8IGNvbW1hbmROYW1lID09PSBcIi1oXCIpIHtcbiAgICAgIGhlbHAoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsQ29tbWFuZCA9IGNvbW1hbmROYW1lO1xuXG4gICAgaWYgKCFDT01NQU5EUy5pbmNsdWRlcyhjb21tYW5kTmFtZSkpIHtcbiAgICAgIGNvbnN0IGNvcnJlY3RlZCA9IGNoZWNrQ29tbW9uTWlzdGFrZXMoY29tbWFuZE5hbWUsIENPTU1PTl9NSVNUQUtFUyk7XG4gICAgICBpZiAoY29ycmVjdGVkICYmIENPTU1BTkRTLmluY2x1ZGVzKGNvcnJlY3RlZCkpIHtcbiAgICAgICAgYWN0dWFsQ29tbWFuZCA9IGNvcnJlY3RlZDtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLnllbGxvdyhgQXNzdW1pbmcgeW91IG1lYW50ICcke2NvcnJlY3RlZH0nXFxuYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghQ09NTUFORFMuaW5jbHVkZXMoYWN0dWFsQ29tbWFuZCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY29sb3JzLnJlZChgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmROYW1lfWApKTtcblxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBnZXRTdWdnZXN0aW9ucyhjb21tYW5kTmFtZSwgQ09NTUFORFMpO1xuICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlxcbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgICR7Y29sb3JzLmN5YW4oc3VnZ2VzdGlvbil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBoZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoXCItLWhlbHBcIikgfHwgYXJncy5pbmNsdWRlcyhcIi1oXCIpKSB7XG4gICAgICBoZWxwKGFjdHVhbENvbW1hbmQpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYWN0dWFsQ29tbWFuZCkge1xuICAgICAgY2FzZSBcImluaXRcIjpcbiAgICAgICAgYXdhaXQgaW5pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJjcmVhdGVcIjpcbiAgICAgICAgYXdhaXQgY3JlYXRlTWFjaGluZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicnVuXCI6XG4gICAgICAgIGF3YWl0IHJ1bk1hY2hpbmVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbW92ZVwiOlxuICAgICAgICBhd2FpdCByZW1vdmVNYWNoaW5lcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzdGF0dXNcIjpcbiAgICAgICAgYXdhaXQgc3RhdHVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImhlbHBcIjoge1xuICAgICAgICBjb25zdCB0YXJnZXRDb21tYW5kID0gYXJnc1swXTtcbiAgICAgICAgaGVscCh0YXJnZXRDb21tYW5kKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHthY3R1YWxDb21tYW5kfWApO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck9iaiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICBsb2cuZXJyb3IoZXJyb3JPYmoubWVzc2FnZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVBLElBQU0sTUFBTTtBQUFBLEVBQ1osSUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNmLElBQU0sT0FBTztBQUFBLEVBRWIsSUFBTSxTQUFTO0FBQUEsSUFDYixFQUFFLENBQUMsR0FBRyxHQUFHO0FBQUEsTUFDUCxLQUFLO0FBQUEsUUFBRyxPQUFPLEdBQUcsTUFBTSxJQUFJO0FBQUEsTUFDNUIsT0FBTyxHQUFHLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFBQTtBQUFBLElBRS9CLElBQUksQ0FBQyxHQUFHLEdBQUc7QUFBQSxNQUNULElBQUksTUFBTTtBQUFBLE1BRVYsSUFBSSxJQUFJO0FBQUEsUUFBRyxPQUFPLEdBQUcsT0FBTztBQUFBLE1BQ3ZCLFNBQUksSUFBSTtBQUFBLFFBQUcsT0FBTyxHQUFHLE1BQU07QUFBQSxNQUVoQyxJQUFJLElB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RUFBQyxPQUFPLEtBQUcsRUFBRSxjQUFZLE9BQU8sVUFBVSxlQUFlLEtBQUssR0FBRSxTQUFTLElBQUUsRUFBRSxVQUFRO0FBQUE7QUFBRSxJQUFJLElBQUUsRUFBQyxTQUFRLENBQUMsRUFBQztBQUFBLENBQUcsUUFBUSxDQUFDLEdBQUU7QUFBQSxFQUFDLElBQUksSUFBRSxDQUFDO0FBQUEsRUFBRSxFQUFFLFVBQVEsR0FBRSxFQUFFLGlCQUFlLFFBQVEsQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsRUFBRSxXQUFXLENBQUMsR0FBRSxJQUFFLEVBQUUsVUFBUSxJQUFFLEVBQUUsV0FBVyxDQUFDLElBQUUsR0FBRSxJQUFFO0FBQUEsSUFBRSxPQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsVUFBUSxLQUFHLE1BQUssS0FBRyxNQUFLLElBQUUsS0FBRyxLQUFHLEdBQUUsS0FBRyxRQUFPLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFFBQU0sTUFBSSxLQUFHLFFBQU0sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFFBQU0sTUFBSSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFNBQU8sTUFBSSxNQUFJLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsUUFBTSxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFNBQU8sS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxLQUFHLFNBQU8sVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFdBQVMsV0FBUyxLQUFHLEtBQUcsVUFBUSxNQUFJO0FBQUEsS0FBSyxFQUFFLGtCQUFnQixRQUFRLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssZUFBZSxDQUFDO0FBQUEsSUFBRSxPQUFPLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxNQUFJLElBQUU7QUFBQTtBQUFBLEVBQUcsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLElBQUMsT0FBTyxFQUFFLE1BQU0sa0RBQWtELEtBQUcsQ0FBQztBQUFBO0FBQUEsRUFBRSxFQUFFLFNBQU8sUUFBUSxDQUFDLEdBQUU7QUFBQSxJQUFDLFNBQVEsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEdBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxRQUFPO0FBQUEsTUFBSSxJQUFFLElBQUUsS0FBSyxnQkFBZ0IsRUFBRSxFQUFFO0FBQUEsSUFBRSxPQUFPO0FBQUEsS0FBRyxFQUFFLFFBQU0sUUFBUSxDQUFDLEdBQUUsR0FBRSxHQUFFO0FBQUEsSUFBQyxVQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBRSxNQUFJLElBQUUsVUFBUSxJQUFHLElBQUUsTUFBSSxJQUFFLFVBQVE7QUFBQSxJQUFHLFNBQVEsSUFBRSxJQUFHLElBQUUsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxJQUFHLElBQUUsRUFBRSxPQUFPLENBQUM7QUFBQSxNQUFFLElBQUcsS0FBRyxLQUFHLEtBQUcsSUFBRSxJQUFFO0FBQUEsUUFBRyxJQUFHLElBQUUsS0FBRztBQUFBLFVBQUUsS0FBRztBQUFBLFFBQU87QUFBQTtBQUFBLE1BQU0sS0FBRztBQUFBLElBQUM7QUFBQSxJQUFDLE9BQU87QUFBQTtBQUFBLEdBQUssQ0FBQztBQUFFLElBQUksS0FBRyxFQUFFO0FBQVEsSUFBTSxLQUFHLEVBQUUsRUFBRTtBQUFFLElBQUksS0FBRyxRQUFRLEdBQUU7QUFBQSxFQUFDLE9BQU07QUFBQTtBQUFreWUsSUFBTSxLQUFHLEVBQUUsRUFBRTtBQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUU7QUFBQSxFQUFDLElBQUcsT0FBTyxLQUFHLFlBQVUsRUFBRSxXQUFTLE1BQUksSUFBRSxFQUFDLG1CQUFrQixTQUFNLEVBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsV0FBUztBQUFBLElBQUcsT0FBTztBQUFBLEVBQUUsSUFBRSxFQUFFLFFBQVEsR0FBRyxHQUFFLElBQUk7QUFBQSxFQUFFLE1BQU0sSUFBRSxFQUFFLG9CQUFrQixJQUFFO0FBQUEsRUFBRSxJQUFJLElBQUU7QUFBQSxFQUFFLFdBQVUsS0FBSyxHQUFFO0FBQUEsSUFBQyxNQUFNLElBQUUsRUFBRSxZQUFZLENBQUM7QUFBQSxJQUFFLElBQUcsS0FBRyxNQUFJLEtBQUcsT0FBSyxLQUFHLE9B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QUEsSUFBRSxFQUFFLFdBQVMsTUFBSSxJQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxPQUFHLElBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUFBLElBQUcsTUFBTSxJQUFFLE9BQU8sU0FBUyxHQUFFLEVBQUU7QUFBQSxJQUFFLE9BQU0sQ0FBQyxLQUFHLEtBQUcsS0FBSSxLQUFHLElBQUUsS0FBSSxJQUFFLEdBQUc7QUFBQSxLQUFHLFlBQVcsTUFBRSxHQUFFLGNBQWEsRUFBQyxPQUFNLE9BQUcsRUFBRSxhQUFhLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFLFlBQVcsTUFBRSxHQUFFLGVBQWMsRUFBQyxPQUFNLE9BQUc7QUFBQSxJQUFDLElBQUcsSUFBRTtBQUFBLE1BQUUsT0FBTyxLQUFHO0FBQUEsSUFBRSxJQUFHLElBQUU7QUFBQSxNQUFHLE9BQU8sTUFBSSxJQUFFO0FBQUEsSUFBRyxJQUFJLEdBQUUsR0FBRTtBQUFBLElBQUUsSUFBRyxLQUFHO0FBQUEsTUFBSSxNQUFJLElBQUUsT0FBSyxLQUFHLEtBQUcsS0FBSSxJQUFFLEdBQUUsSUFBRTtBQUFBLElBQU07QUFBQSxNQUFDLEtBQUc7QUFBQSxNQUFHLE1BQU0sSUFBRSxJQUFFO0FBQUEsTUFBRyxJQUFFLEtBQUssTUFBTSxJQUFFLEVBQUUsSUFBRSxHQUFFLElBQUUsS0FBSyxNQUFNLElBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUU7QUFBQTtBQUFBLElBQUUsTUFBTSxJQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxJQUFFO0FBQUEsSUFBRSxJQUFHLE1BQUk7QUFBQSxNQUFFLE9BQU87QUFBQSxJQUFHLElBQUksSUFBRSxNQUFJLEtBQUssTUFBTSxDQUFDLEtBQUcsSUFBRSxLQUFLLE1BQU0sQ0FBQyxLQUFHLElBQUUsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUFHLE9BQU8sTUFBSSxNQUFJLEtBQUcsS0FBSTtBQUFBLEtBQUcsWUFBVyxNQUFFLEdBQUUsV0FBVSxFQUFDLE9BQU0sQ0FBQyxHQUFFLEdBQUUsTUFBSSxFQUFFLGNBQWMsRUFBRSxhQUFhLEdBQUUsR0FBRSxDQUFDLENBQUMsR0FBRSxZQUFXLE1BQUUsR0FBRSxXQUFVLEVBQUMsT0FBTSxPQUFHLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUUsWUFBVyxNQUFFLEVBQUMsQ0FBQyxHQUFFO0FBQUE7QUFBRSxJQUFNLEtBQUcsR0FBRztBQUFaLElBQWMsSUFBRSxJQUFJLElBQUksQ0FBQyxRQUFPLE1BQU0sQ0FBQztBQUF2QyxJQUF5QyxLQUFHO0FBQTVDLElBQStDLElBQUU7QUFBakQsSUFBd0QsSUFBRTtBQUExRCxJQUE4RCxLQUFHO0FBQWpFLElBQXFFLElBQUU7QUFBdkUsSUFBMkUsSUFBRSxHQUFHO0FBQWhGLElBQXdGLElBQUUsT0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksSUFBSTtBQUFsSSxJQUFzSSxJQUFFLE9BQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLElBQUk7QUFBaEwsSUFBb0wsS0FBRyxPQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQWxOLElBQW9OLElBQUUsQ0FBQyxHQUFFLEdBQUUsTUFBSTtBQUFBLEVBQUMsTUFBTSxJQUFFLENBQUMsR0FBRyxDQUFDO0FBQUEsRUFBRSxJQUFJLElBQUUsT0FBRyxJQUFFLE9BQUcsSUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQU8sRUFBRSxDQUFDO0FBQUEsRUFBRSxZQUFVLEdBQUUsTUFBSyxFQUFFLFFBQVEsR0FBRTtBQUFBLElBQUMsTUFBTSxJQUFFLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRyxJQUFFLEtBQUcsSUFBRSxFQUFFLEVBQUUsU0FBTyxNQUFJLEtBQUcsRUFBRSxLQUFLLENBQUMsR0FBRSxJQUFFLElBQUcsRUFBRSxJQUFJLENBQUMsTUFBSSxJQUFFLE1BQUcsSUFBRSxFQUFFLE1BQU0sSUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUcsR0FBRTtBQUFBLE1BQUMsSUFBRSxNQUFJLE1BQUksSUFBRSxPQUFHLElBQUUsU0FBSSxNQUFJLE1BQUksSUFBRTtBQUFBLE1BQUk7QUFBQSxJQUFRO0FBQUEsSUFBQyxLQUFHLEdBQUUsTUFBSSxLQUFHLElBQUUsRUFBRSxTQUFPLE1BQUksRUFBRSxLQUFLLEVBQUUsR0FBRSxJQUFFO0FBQUEsRUFBRTtBQUFBLEdBQUUsS0FBRyxFQUFFLEVBQUUsU0FBTyxHQUFHLFNBQU8sS0FBRyxFQUFFLFNBQU8sTUFBSSxFQUFFLEVBQUUsU0FBTyxNQUFJLEVBQUUsSUFBSTtBQUFBO0FBQXhqQixJQUE0akIsS0FBRyxPQUFHO0FBQUEsRUFBQyxNQUFNLElBQUUsRUFBRSxNQUFNLEdBQUc7QUFBQSxFQUFFLElBQUksSUFBRSxFQUFFO0FBQUEsRUFBTyxNQUFLLElBQUUsT0FBSyxFQUFFLEVBQUUsSUFBRSxFQUFFLElBQUU7QUFBQSxJQUFJO0FBQUEsRUFBSSxPQUFPLE1BQUksRUFBRSxTQUFPLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUE7QUFBcHNCLElBQXVzQixLQUFHLENBQUMsR0FBRSxHQUFFLElBQUUsQ0FBQyxNQUFJO0FBQUEsRUFBQyxJQUFHLEVBQUUsU0FBTyxTQUFJLEVBQUUsS0FBSyxNQUFJO0FBQUEsSUFBRyxPQUFNO0FBQUEsRUFBRyxJQUFJLElBQUUsSUFBRyxHQUFFO0FBQUEsRUFBRSxNQUFNLElBQUUsR0FBRyxDQUFDO0FBQUEsRUFBRSxJQUFJLElBQUUsQ0FBQyxFQUFFO0FBQUEsRUFBRSxZQUFVLEdBQUUsTUFBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLFFBQVEsR0FBRTtBQUFBLElBQUMsRUFBRSxTQUFPLFVBQUssRUFBRSxFQUFFLFNBQU8sS0FBRyxFQUFFLEVBQUUsU0FBTyxHQUFHLFVBQVU7QUFBQSxJQUFHLElBQUksSUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFPLEVBQUU7QUFBQSxJQUFFLElBQUcsTUFBSSxNQUFJLEtBQUcsTUFBSSxFQUFFLGFBQVcsU0FBSSxFQUFFLFNBQU8sV0FBTSxFQUFFLEtBQUssRUFBRSxHQUFFLElBQUUsS0FBSSxJQUFFLEtBQUcsRUFBRSxTQUFPLFdBQU0sRUFBRSxFQUFFLFNBQU8sTUFBSSxLQUFJLE9BQU0sRUFBRSxRQUFNLEVBQUUsS0FBRyxHQUFFO0FBQUEsTUFBQyxNQUFNLElBQUUsSUFBRSxHQUFFLElBQUUsSUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFHLElBQUUsS0FBRyxDQUFDO0FBQUEsTUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFHLEtBQUcsQ0FBQyxJQUFFLEtBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQVE7QUFBQSxJQUFDLElBQUcsSUFBRSxFQUFFLEtBQUcsS0FBRyxJQUFFLEtBQUcsRUFBRSxLQUFHLEdBQUU7QUFBQSxNQUFDLElBQUcsRUFBRSxhQUFXLFNBQUksSUFBRSxHQUFFO0FBQUEsUUFBQyxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUEsSUFBQztBQUFBLElBQUMsSUFBRyxJQUFFLEVBQUUsS0FBRyxLQUFHLEVBQUUsYUFBVyxPQUFHO0FBQUEsTUFBQyxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQVE7QUFBQSxJQUFDLEVBQUUsRUFBRSxTQUFPLE1BQUk7QUFBQSxFQUFDO0FBQUEsRUFBQyxFQUFFLFNBQU8sVUFBSyxJQUFFLEVBQUUsSUFBSSxPQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsRUFBRyxNQUFNLElBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSztBQUFBLENBQzV0d0IsQ0FBQztBQUFBLEVBQUUsWUFBVSxHQUFFLE1BQUssRUFBRSxRQUFRLEdBQUU7QUFBQSxJQUFDLElBQUcsS0FBRyxHQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUU7QUFBQSxN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QUFRLEVBQUMsQ0FBQztBQUFBLEVBQUkscUJBQW1CLEdBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBTyxFQUFFLFdBQVcsSUFBRTtBQUFBLEVBQUUsTUFBTSxJQUFFLENBQUMsS0FBRyxNQUFLLEdBQUUsVUFBUyxRQUFLO0FBQUEsSUFBQyxNQUFNLElBQUUsT0FBTyxDQUFDO0FBQUEsSUFBRSxJQUFHLEVBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLFFBQVEsR0FBRTtBQUFBLE1BQUMsS0FBRyxFQUFFLE1BQU0seUJBQUUsSUFBSSxHQUFFLFFBQVEsS0FBSyxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQU07QUFBQSxJQUFDLEtBQUk7QUFBQSxNQUFFO0FBQUEsSUFBTyxNQUFNLElBQUUsTUFBSSxXQUFTLElBQUUsSUFBRyxJQUFFLE1BQUksV0FBUyxLQUFHO0FBQUEsSUFBSSxhQUFXLEdBQUUsR0FBRSxHQUFFLE1BQUk7QUFBQSxNQUFHLFlBQVUsR0FBRSxHQUFFLE1BQUk7QUFBQSxRQUFDLEVBQUUsS0FBSyxZQUFXLENBQUM7QUFBQSxPQUFFO0FBQUEsS0FBRTtBQUFBO0FBQUEsRUFBRyxPQUFPLEtBQUcsRUFBRSxNQUFNLHlCQUFFLElBQUksR0FBRSxFQUFFLEtBQUssWUFBVyxDQUFDLEdBQUUsTUFBSTtBQUFBLElBQUMsRUFBRSxJQUFJLFlBQVcsQ0FBQyxHQUFFLEtBQUcsRUFBRSxNQUFNLHlCQUFFLElBQUksR0FBRSxFQUFFLFVBQVEsTUFBSSxFQUFFLFdBQVcsS0FBRSxHQUFFLEVBQUUsV0FBUyxPQUFHLEVBQUUsTUFBTTtBQUFBO0FBQUE7QUFBRyxJQUFJLEtBQUcsT0FBTztBQUFkLElBQTZCLEtBQUcsQ0FBQyxHQUFFLEdBQUUsT0FBSSxLQUFLLEtBQUUsR0FBRyxHQUFFLEdBQUUsRUFBQyxZQUFXLE1BQUcsY0FBYSxNQUFHLFVBQVMsTUFBRyxPQUFNLEVBQUMsQ0FBQyxJQUFFLEVBQUUsS0FBRztBQUFqSCxJQUFtSCxJQUFFLENBQUMsR0FBRSxHQUFFLE9BQUssR0FBRyxHQUFFLE9BQU8sS0FBRyxXQUFTLElBQUUsS0FBRyxHQUFFLENBQUMsR0FBRTtBQUFBO0FBQUcsTUFBTSxFQUFDO0FBQUEsRUFBQyxXQUFXLENBQUMsR0FBRSxJQUFFLE1BQUc7QUFBQSxJQUFDLEVBQUUsTUFBSyxPQUFPLEdBQUUsRUFBRSxNQUFLLFFBQVEsR0FBRSxFQUFFLE1BQUssY0FBYyxHQUFFLEVBQUUsTUFBSyxJQUFJLEdBQUUsRUFBRSxNQUFLLE1BQU0sR0FBRSxFQUFFLE1BQUssU0FBUyxHQUFFLEVBQUUsTUFBSyxVQUFTLEtBQUUsR0FBRSxFQUFFLE1BQUssY0FBYSxFQUFFLEdBQUUsRUFBRSxNQUFLLGdCQUFlLElBQUksR0FBRyxHQUFFLEVBQUUsTUFBSyxXQUFVLENBQUMsR0FBRSxFQUFFLE1BQUssU0FBUSxTQUFTLEdBQUUsRUFBRSxNQUFLLFNBQVEsRUFBRSxHQUFFLEVBQUUsTUFBSyxPQUFPO0FBQUEsSUFBRSxRQUFNLE9BQU0sSUFBRSxHQUFFLFFBQU8sSUFBRSxHQUFFLFFBQU8sR0FBRSxRQUFPLE1BQUssTUFBRztBQUFBLElBQUUsS0FBSyxPQUFLLEdBQUUsS0FBSyxhQUFXLEtBQUssV0FBVyxLQUFLLElBQUksR0FBRSxLQUFLLFFBQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFFLEtBQUssU0FBTyxLQUFLLE9BQU8sS0FBSyxJQUFJLEdBQUUsS0FBSyxVQUFRLEVBQUUsS0FBSyxJQUFJLEdBQUUsS0FBSyxTQUFPLEdBQUUsS0FBSyxlQUFhLEdBQUUsS0FBSyxRQUFNLEdBQUUsS0FBSyxTQUFPO0FBQUE7QUFBQSxFQUFFLFdBQVcsR0FBRTtBQUFBLElBQUMsS0FBSyxhQUFhLE1BQU07QUFBQTtBQUFBLEVBQUUsYUFBYSxDQUFDLEdBQUUsR0FBRTtBQUFBLElBQUMsTUFBTSxJQUFFLEtBQUssYUFBYSxJQUFJLENBQUMsS0FBRyxDQUFDO0FBQUEsSUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFFLEtBQUssYUFBYSxJQUFJLEdBQUUsQ0FBQztBQUFBO0FBQUEsRUFBRSxFQUFFLENBQUMsR0FBRSxHQUFFO0FBQUEsSUFBQyxLQUFLLGNBQWMsR0FBRSxFQUFDLElBQUcsRUFBQyxDQUFDO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFDLEtBQUssY0FBYyxHQUFFLEVBQUMsSUFBRyxHQUFFLE1BQUssS0FBRSxDQUFDO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxNQUFLLEdBQUU7QUFBQSxJQUFDLE1BQU0sSUFBRSxLQUFLLGFBQWEsSUFBSSxDQUFDLEtBQUcsQ0FBQyxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUUsV0FBVSxLQUFLO0FBQUEsTUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUUsRUFBRSxRQUFNLEVBQUUsS0FBSyxNQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFFLENBQUMsQ0FBQztBQUFBLElBQUUsV0FBVSxLQUFLO0FBQUEsTUFBRSxFQUFFO0FBQUE7QUFBQSxFQUFFLE1BQU0sR0FBRTtBQUFBLElBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFFLE1BQUk7QUFBQSxNQUFDLElBQUcsS0FBSyxjQUFhO0FBQUEsUUFBQyxJQUFHLEtBQUssYUFBYTtBQUFBLFVBQVEsT0FBTyxLQUFLLFFBQU0sVUFBUyxLQUFLLE1BQU0sR0FBRSxFQUFFLENBQUM7QUFBQSxRQUFFLEtBQUssYUFBYSxpQkFBaUIsU0FBUSxNQUFJO0FBQUEsVUFBQyxLQUFLLFFBQU0sVUFBUyxLQUFLLE1BQU07QUFBQSxXQUFHLEVBQUMsTUFBSyxLQUFFLENBQUM7QUFBQSxNQUFDO0FBQUEsTUFBQyxNQUFNLElBQUUsSUFBSTtBQUFBLE1BQUUsRUFBRSxTQUFPLENBQUMsR0FBRSxHQUFFLE1BQUk7QUFBQSxRQUFDLEtBQUssV0FBUyxLQUFLLFFBQU0sS0FBSyxJQUFJLEtBQUssUUFBUSxPQUFNLEVBQUUsR0FBRSxLQUFLLFVBQVEsS0FBSyxJQUFJLFVBQVEsR0FBRSxLQUFLLEtBQUssU0FBUSxLQUFLLEtBQUssSUFBRyxFQUFFO0FBQUEsU0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUUs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RSxNQUFNO0FBQUEsQ0FDeE0sRUFBRSxNQUFNLENBQUM7QUFBQSxVQUFFLEtBQUssT0FBTyxNQUFNLEVBQUUsS0FBSztBQUFBLENBQ3BDLENBQUMsR0FBRSxLQUFLLGFBQVc7QUFBQSxVQUFFO0FBQUEsUUFBTTtBQUFBLFFBQUMsS0FBSyxPQUFPLE1BQU0sd0JBQUUsS0FBSyxDQUFDO0FBQUE7QUFBQSxNQUFFLEtBQUssT0FBTyxNQUFNLENBQUMsR0FBRSxLQUFLLFVBQVEsY0FBWSxLQUFLLFFBQU0sV0FBVSxLQUFLLGFBQVc7QUFBQSxJQUFDO0FBQUE7QUFBRTtBQUFBO0FBQUMsTUFBTSxXQUFXLEVBQUM7QUFBQSxNQUFLLE1BQU0sR0FBRTtBQUFBLElBQUMsT0FBTyxLQUFLLFFBQU0sSUFBRTtBQUFBO0FBQUEsTUFBTSxNQUFNLEdBQUU7QUFBQSxJQUFDLE9BQU8sS0FBSyxXQUFTO0FBQUE7QUFBQSxFQUFFLFdBQVcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxNQUFNLEdBQUUsS0FBRSxHQUFFLEtBQUssVUFBUSxFQUFFLGNBQWEsS0FBSyxHQUFHLFNBQVEsTUFBSTtBQUFBLE1BQUMsS0FBSyxRQUFNLEtBQUs7QUFBQSxLQUFPLEdBQUUsS0FBSyxHQUFHLFdBQVUsT0FBRztBQUFBLE1BQUMsS0FBSyxPQUFPLE1BQU0seUJBQUUsS0FBSyxHQUFFLEVBQUUsQ0FBQyxHQUFFLEtBQUssUUFBTSxHQUFFLEtBQUssUUFBTSxVQUFTLEtBQUssTUFBTTtBQUFBLEtBQUUsR0FBRSxLQUFLLEdBQUcsVUFBUyxNQUFJO0FBQUEsTUFBQyxLQUFLLFNBQU8sS0FBSztBQUFBLEtBQU07QUFBQTtBQUFFO0FBQUMsSUFBaWY7QUFBNDZDLElBQUUsSUFBSTtBQUFtNUYsTUFBTSxXQUFXLEVBQUM7QUFBQSxNQUFLLGVBQWUsR0FBRTtBQUFBLElBQUMsSUFBRyxLQUFLLFVBQVE7QUFBQSxNQUFTLE9BQU8sS0FBSztBQUFBLElBQU0sSUFBRyxLQUFLLFVBQVEsS0FBSyxNQUFNO0FBQUEsTUFBTyxPQUFNLEdBQUcsS0FBSztBQUFB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QUMsTUFBTSxNQUFHLFlBQVksSUFBSSxJQUFFLE1BQUcsTUFBSSxLQUFFLEtBQUssTUFBTSxLQUFFLEVBQUUsR0FBRSxLQUFFLEtBQUssTUFBTSxLQUFFLEVBQUU7QUFBQSxJQUFFLE9BQU8sS0FBRSxJQUFFLElBQUksT0FBTSxTQUFNLElBQUk7QUFBQSxLQUFPLElBQUUsQ0FBQyxLQUFFLE9BQUs7QUFBQSxJQUFDLElBQUUsTUFBRyxJQUFFLEdBQUcsR0FBRSxLQUFFLEdBQUUsRUFBQyxHQUFFLEtBQUUsWUFBWSxJQUFJLEdBQUUsUUFBUSxPQUFPLE1BQU0sR0FBRywyQkFBRSxLQUFLLENBQUM7QUFBQSxDQUMxVDtBQUFBLElBQUUsSUFBSSxLQUFFLEdBQUUsS0FBRTtBQUFBLElBQUUsR0FBRSxHQUFFLElBQUUsWUFBWSxNQUFJO0FBQUEsTUFBQyxJQUFHLEtBQUcsT0FBSTtBQUFBLFFBQUU7QUFBQSxNQUFPLEdBQUUsR0FBRSxLQUFFO0FBQUEsTUFBRSxNQUFNLEtBQUUsMkJBQUUsUUFBUSxFQUFFLEdBQUU7QUFBQSxNQUFFLElBQUc7QUFBQSxRQUFFLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxPQUFNO0FBQUEsTUFBTyxTQUFHLE1BQUk7QUFBQSxRQUFRLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxNQUFLLEdBQUUsRUFBQyxHQUFHO0FBQUEsTUFBTTtBQUFBLFFBQUMsTUFBTSxLQUFFLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBQSxRQUFFLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxLQUFJLElBQUc7QUFBQTtBQUFBLE1BQUUsS0FBRSxLQUFFLElBQUUsRUFBRSxTQUFPLEtBQUUsSUFBRSxHQUFFLEtBQUUsS0FBRSxFQUFFLFNBQU8sS0FBRSxRQUFLO0FBQUEsT0FBRyxFQUFDO0FBQUEsS0FBRyxLQUFFLENBQUMsS0FBRSxJQUFHLEtBQUUsTUFBSTtBQUFBLElBQUMsSUFBRSxPQUFHLGNBQWMsQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFF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QUNHO0FBQUEsUUFDSCxNQUFNLFlBQVk7QUFBQSxRQUNsQjtBQUFBLFdBQ0c7QUFBQSxRQUNILE1BQU0sZUFBZTtBQUFBLFFBQ3JCO0FBQUEsV0FDRztBQUFBLFFBQ0gsTUFBTSxPQUFPO0FBQUEsUUFDYjtBQUFBLFdBQ0csUUFBUTtBQUFBLFFBQ1gsTUFBTSxnQkFBZ0IsS0FBSztBQUFBLFFBQzNCLEtBQUssYUFBYTtBQUFBLFFBQ2xCO0FBQUEsTUFDRjtBQUFBO0FBQUEsUUFFRSxNQUFNLElBQUksTUFBTSxvQkFBb0IsZUFBZTtBQUFBO0FBQUEsSUFHdkQsUUFBUSxLQUFLLENBQUM7QUFBQSxJQUNkLE9BQU8sUUFBTztBQUFBLElBQ2QsTUFBTSxXQUFXLGtCQUFpQixRQUFRLFNBQVEsSUFBSSxNQUFNLE9BQU8sTUFBSyxDQUFDO0FBQUEsSUFDekUsR0FBSSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQzFCLFFBQVEsS0FBSyxDQUFDO0FBQUE7QUFBQTtBQUlsQixNQUFNLEtBQUs7IiwKICAiZGVidWdJZCI6ICIxNzIzMTk3NjY4MDNGQkUwNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|