@r5n/hydra 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +72 -2339
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,1566 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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, `
|
|
2
|
+
var zt=Object.create;var{getPrototypeOf:Kt,defineProperty:Wn,getOwnPropertyNames:Jt}=Object;var Yt=Object.prototype.hasOwnProperty;var mn=(t,r,o)=>{o=t!=null?zt(Kt(t)):{};let e=r||!t||!t.__esModule?Wn(o,"default",{value:t,enumerable:!0}):o;for(let s of Jt(t))if(!Yt.call(e,s))Wn(e,s,{get:()=>t[s],enumerable:!0});return e};var zn=(t,r)=>()=>(r||t((r={exports:{}}).exports,r),r.exports);var On=zn((Co,Kn)=>{var Rn={to(t,r){if(!r)return`\x1B[${t+1}G`;return`\x1B[${r+1};${t+1}H`},move(t,r){let o="";if(t<0)o+=`\x1B[${-t}D`;else if(t>0)o+=`\x1B[${t}C`;if(r<0)o+=`\x1B[${-r}A`;else if(r>0)o+=`\x1B[${r}B`;return o},up:(t=1)=>`\x1B[${t}A`,down:(t=1)=>`\x1B[${t}B`,forward:(t=1)=>`\x1B[${t}C`,backward:(t=1)=>`\x1B[${t}D`,nextLine:(t=1)=>"\x1B[E".repeat(t),prevLine:(t=1)=>"\x1B[F".repeat(t),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},Qt={up:(t=1)=>"\x1B[S".repeat(t),down:(t=1)=>"\x1B[T".repeat(t)},Zt={screen:"\x1B[2J",up:(t=1)=>"\x1B[1J".repeat(t),down:(t=1)=>"\x1B[J".repeat(t),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(t){let r="";for(let o=0;o<t;o++)r+=this.line+(o<t-1?Rn.up():"");if(t)r+=Rn.left;return r}};Kn.exports={cursor:Rn,scroll:Qt,erase:Zt,beep:"\x07"}});var Tn=zn((No,Sn)=>{var gn=process||{},Jn=gn.argv||[],ln=gn.env||{},Vt=!(!!ln.NO_COLOR||Jn.includes("--no-color"))&&(!!ln.FORCE_COLOR||Jn.includes("--color")||gn.platform==="win32"||(gn.stdout||{}).isTTY&&ln.TERM!=="dumb"||!!ln.CI),Ft=(t,r,o=t)=>(e)=>{let s=""+e,i=s.indexOf(r,t.length);return~i?t+Dt(s,r,o,i)+r:t+s+r},Dt=(t,r,o,e)=>{let s="",i=0;do s+=t.substring(i,e)+o,i=e+r.length,e=t.indexOf(r,i);while(~e);return s+t.substring(i)},Yn=(t=Vt)=>{let r=t?Ft:()=>String;return{isColorSupported:t,reset:r("\x1B[0m","\x1B[0m"),bold:r("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:r("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:r("\x1B[3m","\x1B[23m"),underline:r("\x1B[4m","\x1B[24m"),inverse:r("\x1B[7m","\x1B[27m"),hidden:r("\x1B[8m","\x1B[28m"),strikethrough:r("\x1B[9m","\x1B[29m"),black:r("\x1B[30m","\x1B[39m"),red:r("\x1B[31m","\x1B[39m"),green:r("\x1B[32m","\x1B[39m"),yellow:r("\x1B[33m","\x1B[39m"),blue:r("\x1B[34m","\x1B[39m"),magenta:r("\x1B[35m","\x1B[39m"),cyan:r("\x1B[36m","\x1B[39m"),white:r("\x1B[37m","\x1B[39m"),gray:r("\x1B[90m","\x1B[39m"),bgBlack:r("\x1B[40m","\x1B[49m"),bgRed:r("\x1B[41m","\x1B[49m"),bgGreen:r("\x1B[42m","\x1B[49m"),bgYellow:r("\x1B[43m","\x1B[49m"),bgBlue:r("\x1B[44m","\x1B[49m"),bgMagenta:r("\x1B[45m","\x1B[49m"),bgCyan:r("\x1B[46m","\x1B[49m"),bgWhite:r("\x1B[47m","\x1B[49m"),blackBright:r("\x1B[90m","\x1B[39m"),redBright:r("\x1B[91m","\x1B[39m"),greenBright:r("\x1B[92m","\x1B[39m"),yellowBright:r("\x1B[93m","\x1B[39m"),blueBright:r("\x1B[94m","\x1B[39m"),magentaBright:r("\x1B[95m","\x1B[39m"),cyanBright:r("\x1B[96m","\x1B[39m"),whiteBright:r("\x1B[97m","\x1B[39m"),bgBlackBright:r("\x1B[100m","\x1B[49m"),bgRedBright:r("\x1B[101m","\x1B[49m"),bgGreenBright:r("\x1B[102m","\x1B[49m"),bgYellowBright:r("\x1B[103m","\x1B[49m"),bgBlueBright:r("\x1B[104m","\x1B[49m"),bgMagentaBright:r("\x1B[105m","\x1B[49m"),bgCyanBright:r("\x1B[106m","\x1B[49m"),bgWhiteBright:r("\x1B[107m","\x1B[49m")}};Sn.exports=Yn();Sn.exports.createColors=Yn});var O=mn(On(),1),et=mn(Tn(),1);import{stdin as rt,stdout as ot}from"process";import*as I from"readline";import Qn from"readline";import{Writable as nr}from"stream";function tr({onlyFirst:t=!1}={}){let r=["[\\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("|");return new RegExp(r,t?void 0:"g")}var rr=tr();function st(t){if(typeof t!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof t}\``);return t.replace(rr,"")}function it(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var at={exports:{}};(function(t){var r={};t.exports=r,r.eastAsianWidth=function(e){var s=e.charCodeAt(0),i=e.length==2?e.charCodeAt(1):0,n=s;return 55296<=s&&s<=56319&&56320<=i&&i<=57343&&(s&=1023,i&=1023,n=s<<10|i,n+=65536),n==12288||65281<=n&&n<=65376||65504<=n&&n<=65510?"F":n==8361||65377<=n&&n<=65470||65474<=n&&n<=65479||65482<=n&&n<=65487||65490<=n&&n<=65495||65498<=n&&n<=65500||65512<=n&&n<=65518?"H":4352<=n&&n<=4447||4515<=n&&n<=4519||4602<=n&&n<=4607||9001<=n&&n<=9002||11904<=n&&n<=11929||11931<=n&&n<=12019||12032<=n&&n<=12245||12272<=n&&n<=12283||12289<=n&&n<=12350||12353<=n&&n<=12438||12441<=n&&n<=12543||12549<=n&&n<=12589||12593<=n&&n<=12686||12688<=n&&n<=12730||12736<=n&&n<=12771||12784<=n&&n<=12830||12832<=n&&n<=12871||12880<=n&&n<=13054||13056<=n&&n<=19903||19968<=n&&n<=42124||42128<=n&&n<=42182||43360<=n&&n<=43388||44032<=n&&n<=55203||55216<=n&&n<=55238||55243<=n&&n<=55291||63744<=n&&n<=64255||65040<=n&&n<=65049||65072<=n&&n<=65106||65108<=n&&n<=65126||65128<=n&&n<=65131||110592<=n&&n<=110593||127488<=n&&n<=127490||127504<=n&&n<=127546||127552<=n&&n<=127560||127568<=n&&n<=127569||131072<=n&&n<=194367||177984<=n&&n<=196605||196608<=n&&n<=262141?"W":32<=n&&n<=126||162<=n&&n<=163||165<=n&&n<=166||n==172||n==175||10214<=n&&n<=10221||10629<=n&&n<=10630?"Na":n==161||n==164||167<=n&&n<=168||n==170||173<=n&&n<=174||176<=n&&n<=180||182<=n&&n<=186||188<=n&&n<=191||n==198||n==208||215<=n&&n<=216||222<=n&&n<=225||n==230||232<=n&&n<=234||236<=n&&n<=237||n==240||242<=n&&n<=243||247<=n&&n<=250||n==252||n==254||n==257||n==273||n==275||n==283||294<=n&&n<=295||n==299||305<=n&&n<=307||n==312||319<=n&&n<=322||n==324||328<=n&&n<=331||n==333||338<=n&&n<=339||358<=n&&n<=359||n==363||n==462||n==464||n==466||n==468||n==470||n==472||n==474||n==476||n==593||n==609||n==708||n==711||713<=n&&n<=715||n==717||n==720||728<=n&&n<=731||n==733||n==735||768<=n&&n<=879||913<=n&&n<=929||931<=n&&n<=937||945<=n&&n<=961||963<=n&&n<=969||n==1025||1040<=n&&n<=1103||n==1105||n==8208||8211<=n&&n<=8214||8216<=n&&n<=8217||8220<=n&&n<=8221||8224<=n&&n<=8226||8228<=n&&n<=8231||n==8240||8242<=n&&n<=8243||n==8245||n==8251||n==8254||n==8308||n==8319||8321<=n&&n<=8324||n==8364||n==8451||n==8453||n==8457||n==8467||n==8470||8481<=n&&n<=8482||n==8486||n==8491||8531<=n&&n<=8532||8539<=n&&n<=8542||8544<=n&&n<=8555||8560<=n&&n<=8569||n==8585||8592<=n&&n<=8601||8632<=n&&n<=8633||n==8658||n==8660||n==8679||n==8704||8706<=n&&n<=8707||8711<=n&&n<=8712||n==8715||n==8719||n==8721||n==8725||n==8730||8733<=n&&n<=8736||n==8739||n==8741||8743<=n&&n<=8748||n==8750||8756<=n&&n<=8759||8764<=n&&n<=8765||n==8776||n==8780||n==8786||8800<=n&&n<=8801||8804<=n&&n<=8807||8810<=n&&n<=8811||8814<=n&&n<=8815||8834<=n&&n<=8835||8838<=n&&n<=8839||n==8853||n==8857||n==8869||n==8895||n==8978||9312<=n&&n<=9449||9451<=n&&n<=9547||9552<=n&&n<=9587||9600<=n&&n<=9615||9618<=n&&n<=9621||9632<=n&&n<=9633||9635<=n&&n<=9641||9650<=n&&n<=9651||9654<=n&&n<=9655||9660<=n&&n<=9661||9664<=n&&n<=9665||9670<=n&&n<=9672||n==9675||9678<=n&&n<=9681||9698<=n&&n<=9701||n==9711||9733<=n&&n<=9734||n==9737||9742<=n&&n<=9743||9748<=n&&n<=9749||n==9756||n==9758||n==9792||n==9794||9824<=n&&n<=9825||9827<=n&&n<=9829||9831<=n&&n<=9834||9836<=n&&n<=9837||n==9839||9886<=n&&n<=9887||9918<=n&&n<=9919||9924<=n&&n<=9933||9935<=n&&n<=9953||n==9955||9960<=n&&n<=9983||n==10045||n==10071||10102<=n&&n<=10111||11093<=n&&n<=11097||12872<=n&&n<=12879||57344<=n&&n<=63743||65024<=n&&n<=65039||n==65533||127232<=n&&n<=127242||127248<=n&&n<=127277||127280<=n&&n<=127337||127344<=n&&n<=127386||917760<=n&&n<=917999||983040<=n&&n<=1048573||1048576<=n&&n<=1114109?"A":"N"},r.characterLength=function(e){var s=this.eastAsianWidth(e);return s=="F"||s=="W"||s=="A"?2:1};function o(e){return e.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}r.length=function(e){for(var s=o(e),i=0,n=0;n<s.length;n++)i=i+this.characterLength(s[n]);return i},r.slice=function(e,s,i){textLen=r.length(e),s=s||0,i=i||1,s<0&&(s=textLen+s),i<0&&(i=textLen+i);for(var n="",a=0,c=o(e),l=0;l<c.length;l++){var f=c[l],m=r.length(f);if(a>=s-(m==2?1:0))if(a+m<=i)n+=f;else break;a+=m}return n}})(at);var or=at.exports,er=it(or),sr=function(){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},ir=it(sr);function tn(t,r={}){if(typeof t!="string"||t.length===0||(r={ambiguousIsNarrow:!0,...r},t=st(t),t.length===0))return 0;t=t.replace(ir()," ");let o=r.ambiguousIsNarrow?1:2,e=0;for(let s of t){let i=s.codePointAt(0);if(i<=31||i>=127&&i<=159||i>=768&&i<=879)continue;switch(er.eastAsianWidth(s)){case"F":case"W":e+=2;break;case"A":e+=o;break;default:e+=1}}return e}var Cn=10,Zn=(t=0)=>(r)=>`\x1B[${r+t}m`,Vn=(t=0)=>(r)=>`\x1B[${38+t};5;${r}m`,Fn=(t=0)=>(r,o,e)=>`\x1B[${38+t};2;${r};${o};${e}m`,x={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]}};Object.keys(x.modifier);var ar=Object.keys(x.color),cr=Object.keys(x.bgColor);[...ar];function fr(){let t=new Map;for(let[r,o]of Object.entries(x)){for(let[e,s]of Object.entries(o))x[e]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},o[e]=x[e],t.set(s[0],s[1]);Object.defineProperty(x,r,{value:o,enumerable:!1})}return Object.defineProperty(x,"codes",{value:t,enumerable:!1}),x.color.close="\x1B[39m",x.bgColor.close="\x1B[49m",x.color.ansi=Zn(),x.color.ansi256=Vn(),x.color.ansi16m=Fn(),x.bgColor.ansi=Zn(Cn),x.bgColor.ansi256=Vn(Cn),x.bgColor.ansi16m=Fn(Cn),Object.defineProperties(x,{rgbToAnsi256:{value:(r,o,e)=>r===o&&o===e?r<8?16:r>248?231:Math.round((r-8)/247*24)+232:16+36*Math.round(r/255*5)+6*Math.round(o/255*5)+Math.round(e/255*5),enumerable:!1},hexToRgb:{value:(r)=>{let o=/[a-f\d]{6}|[a-f\d]{3}/i.exec(r.toString(16));if(!o)return[0,0,0];let[e]=o;e.length===3&&(e=[...e].map((i)=>i+i).join(""));let s=Number.parseInt(e,16);return[s>>16&255,s>>8&255,s&255]},enumerable:!1},hexToAnsi256:{value:(r)=>x.rgbToAnsi256(...x.hexToRgb(r)),enumerable:!1},ansi256ToAnsi:{value:(r)=>{if(r<8)return 30+r;if(r<16)return 90+(r-8);let o,e,s;if(r>=232)o=((r-232)*10+8)/255,e=o,s=o;else{r-=16;let a=r%36;o=Math.floor(r/36)/5,e=Math.floor(a/6)/5,s=a%6/5}let i=Math.max(o,e,s)*2;if(i===0)return 30;let n=30+(Math.round(s)<<2|Math.round(e)<<1|Math.round(o));return i===2&&(n+=60),n},enumerable:!1},rgbToAnsi:{value:(r,o,e)=>x.ansi256ToAnsi(x.rgbToAnsi256(r,o,e)),enumerable:!1},hexToAnsi:{value:(r)=>x.ansi256ToAnsi(x.hexToAnsi256(r)),enumerable:!1}}),x}var mr=fr(),hn=new Set(["\x1B","\x9B"]),lr=39,kn="\x07",ct="[",gr="]",ft="m",Mn=`${gr}8;;`,Dn=(t)=>`${hn.values().next().value}${ct}${t}${ft}`,nt=(t)=>`${hn.values().next().value}${Mn}${t}${kn}`,pr=(t)=>t.split(" ").map((r)=>tn(r)),Nn=(t,r,o)=>{let e=[...r],s=!1,i=!1,n=tn(st(t[t.length-1]));for(let[a,c]of e.entries()){let l=tn(c);if(n+l<=o?t[t.length-1]+=c:(t.push(c),n=0),hn.has(c)&&(s=!0,i=e.slice(a+1).join("").startsWith(Mn)),s){i?c===kn&&(s=!1,i=!1):c===ft&&(s=!1);continue}n+=l,n===o&&a<e.length-1&&(t.push(""),n=0)}!n&&t[t.length-1].length>0&&t.length>1&&(t[t.length-2]+=t.pop())},ur=(t)=>{let r=t.split(" "),o=r.length;for(;o>0&&!(tn(r[o-1])>0);)o--;return o===r.length?t:r.slice(0,o).join(" ")+r.slice(o).join("")},hr=(t,r,o={})=>{if(o.trim!==!1&&t.trim()==="")return"";let e="",s,i,n=pr(t),a=[""];for(let[l,f]of t.split(" ").entries()){o.trim!==!1&&(a[a.length-1]=a[a.length-1].trimStart());let m=tn(a[a.length-1]);if(l!==0&&(m>=r&&(o.wordWrap===!1||o.trim===!1)&&(a.push(""),m=0),(m>0||o.trim===!1)&&(a[a.length-1]+=" ",m++)),o.hard&&n[l]>r){let g=r-m,d=1+Math.floor((n[l]-g-1)/r);Math.floor((n[l]-1)/r)<d&&a.push(""),Nn(a,f,r);continue}if(m+n[l]>r&&m>0&&n[l]>0){if(o.wordWrap===!1&&m<r){Nn(a,f,r);continue}a.push("")}if(m+n[l]>r&&o.wordWrap===!1){Nn(a,f,r);continue}a[a.length-1]+=f}o.trim!==!1&&(a=a.map((l)=>ur(l)));let c=[...a.join(`
|
|
3
|
+
`)];for(let[l,f]of c.entries()){if(e+=f,hn.has(f)){let{groups:g}=new RegExp(`(?:\\${ct}(?<code>\\d+)m|\\${Mn}(?<uri>.*)${kn})`).exec(c.slice(l).join(""))||{groups:{}};if(g.code!==void 0){let d=Number.parseFloat(g.code);s=d===lr?void 0:d}else g.uri!==void 0&&(i=g.uri.length===0?void 0:g.uri)}let m=mr.codes.get(Number(s));c[l+1]===`
|
|
4
|
+
`?(i&&(e+=nt("")),s&&m&&(e+=Dn(m))):f===`
|
|
5
|
+
`&&(s&&m&&(e+=Dn(s)),i&&(e+=nt(i)))}return e};function tt(t,r,o){return String(t).normalize().replace(/\r\n/g,`
|
|
352
6
|
`).split(`
|
|
353
|
-
`).map((
|
|
354
|
-
`);
|
|
355
|
-
|
|
356
|
-
var
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
}
|
|
381
|
-
|
|
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(`
|
|
7
|
+
`).map((e)=>hr(e,r,o)).join(`
|
|
8
|
+
`)}var dr=["up","down","left","right","space","enter","cancel"],un={actions:new Set(dr),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]])};function vn(t,r){if(typeof t=="string")return un.aliases.get(t)===r;for(let o of t)if(o!==void 0&&vn(o,r))return!0;return!1}function br(t,r){if(t===r)return;let o=t.split(`
|
|
9
|
+
`),e=r.split(`
|
|
10
|
+
`),s=[];for(let i=0;i<Math.max(o.length,e.length);i++)o[i]!==e[i]&&s.push(i);return s}var yr=globalThis.process.platform.startsWith("win"),Pn=Symbol("clack:cancel");function S(t){return t===Pn}function pn(t,r){let o=t;o.isTTY&&o.setRawMode(r)}function mt({input:t=rt,output:r=ot,overwrite:o=!0,hideCursor:e=!0}={}){let s=I.createInterface({input:t,output:r,prompt:"",tabSize:1});I.emitKeypressEvents(t,s),t.isTTY&&t.setRawMode(!0);let i=(n,{name:a,sequence:c})=>{let l=String(n);if(vn([l,a,c],"cancel")){e&&r.write(O.cursor.show),process.exit(0);return}if(!o)return;I.moveCursor(r,a==="return"?0:-1,a==="return"?-1:0,()=>{I.clearLine(r,1,()=>{t.once("keypress",i)})})};return e&&r.write(O.cursor.hide),t.once("keypress",i),()=>{t.off("keypress",i),e&&r.write(O.cursor.show),t.isTTY&&!yr&&t.setRawMode(!1),s.terminal=!1,s.close()}}var xr=Object.defineProperty,$r=(t,r,o)=>(r in t)?xr(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o,N=(t,r,o)=>($r(t,typeof r!="symbol"?r+"":r,o),o);class Gn{constructor(t,r=!0){N(this,"input"),N(this,"output"),N(this,"_abortSignal"),N(this,"rl"),N(this,"opts"),N(this,"_render"),N(this,"_track",!1),N(this,"_prevFrame",""),N(this,"_subscribers",new Map),N(this,"_cursor",0),N(this,"state","initial"),N(this,"error",""),N(this,"value");let{input:o=rt,output:e=ot,render:s,signal:i,...n}=t;this.opts=n,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=s.bind(this),this._track=r,this._abortSignal=i,this.input=o,this.output=e}unsubscribe(){this._subscribers.clear()}setSubscriber(t,r){let o=this._subscribers.get(t)??[];o.push(r),this._subscribers.set(t,o)}on(t,r){this.setSubscriber(t,{cb:r})}once(t,r){this.setSubscriber(t,{cb:r,once:!0})}emit(t,...r){let o=this._subscribers.get(t)??[],e=[];for(let s of o)s.cb(...r),s.once&&e.push(()=>o.splice(o.indexOf(s),1));for(let s of e)s()}prompt(){return new Promise((t,r)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),t(Pn);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}let o=new nr;o._write=(e,s,i)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),i()},this.input.pipe(o),this.rl=Qn.createInterface({input:this.input,output:o,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),Qn.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),pn(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(O.cursor.show),this.output.off("resize",this.render),pn(this.input,!1),t(this.value)}),this.once("cancel",()=>{this.output.write(O.cursor.show),this.output.off("resize",this.render),pn(this.input,!1),t(Pn)})})}onKeypress(t,r){if(this.state==="error"&&(this.state="active"),r?.name&&(!this._track&&un.aliases.has(r.name)&&this.emit("cursor",un.aliases.get(r.name)),un.actions.has(r.name)&&this.emit("cursor",r.name)),t&&(t.toLowerCase()==="y"||t.toLowerCase()==="n")&&this.emit("confirm",t.toLowerCase()==="y"),t==="\t"&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),t&&this.emit("key",t.toLowerCase()),r?.name==="return"){if(this.opts.validate){let o=this.opts.validate(this.value);o&&(this.error=o instanceof Error?o.message:o,this.state="error",this.rl?.write(this.value))}this.state!=="error"&&(this.state="submit")}vn([t,r?.name,r?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
11
|
+
`),pn(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let t=tt(this._prevFrame,process.stdout.columns,{hard:!0}).split(`
|
|
12
|
+
`).length-1;this.output.write(O.cursor.move(-999,t*-1))}render(){let t=tt(this._render(this)??"",process.stdout.columns,{hard:!0});if(t!==this._prevFrame){if(this.state==="initial")this.output.write(O.cursor.hide);else{let r=br(this._prevFrame,t);if(this.restoreCursor(),r&&r?.length===1){let o=r[0];this.output.write(O.cursor.move(0,o)),this.output.write(O.erase.lines(1));let e=t.split(`
|
|
13
|
+
`);this.output.write(e[o]),this._prevFrame=t,this.output.write(O.cursor.move(0,e.length-o-1));return}if(r&&r?.length>1){let o=r[0];this.output.write(O.cursor.move(0,o)),this.output.write(O.erase.down());let e=t.split(`
|
|
14
|
+
`).slice(o);this.output.write(e.join(`
|
|
15
|
+
`)),this._prevFrame=t;return}this.output.write(O.erase.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}}class Xn extends Gn{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("value",()=>{this.value=this._value}),this.on("confirm",(r)=>{this.output.write(O.cursor.move(0,-1)),this.value=r,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}var wr;wr=new WeakMap;class _n extends Gn{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return`${this.value}\u2588`;let t=this.value.slice(0,this.cursor),[r,...o]=this.value.slice(this.cursor);return`${t}${et.default.inverse(r)}${o.join("")}`}get cursor(){return this._cursor}constructor(t){super(t),this.on("finalize",()=>{this.value||(this.value=t.defaultValue)})}}var u=mn(Tn(),1),dn=mn(On(),1);import G from"process";function Er(){return G.platform!=="win32"?G.env.TERM!=="linux":!!G.env.CI||!!G.env.WT_SESSION||!!G.env.TERMINUS_SUBLIME||G.env.ConEmuTask==="{cmd::Cmder}"||G.env.TERM_PROGRAM==="Terminus-Sublime"||G.env.TERM_PROGRAM==="vscode"||G.env.TERM==="xterm-256color"||G.env.TERM==="alacritty"||G.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var An=Er(),E=(t,r)=>An?t:r,Rr=E("\u25C6","*"),pt=E("\u25A0","x"),ut=E("\u25B2","x"),Un=E("\u25C7","o"),Or=E("\u250C","T"),R=E("\u2502","|"),rn=E("\u2514","\u2014"),lt=E("\u25CF",">"),gt=E("\u25CB"," "),Bo=E("\u25FB","[\u2022]"),Io=E("\u25FC","[+]"),jo=E("\u25FB","[ ]"),Wo=E("\u25AA","\u2022"),zo=E("\u2500","-"),Ko=E("\u256E","+"),Jo=E("\u251C","+"),Yo=E("\u256F","+"),Sr=E("\u25CF","\u2022"),Tr=E("\u25C6","*"),Cr=E("\u25B2","!"),Nr=E("\u25A0","x"),ht=(t)=>{switch(t){case"initial":case"active":return u.default.cyan(Rr);case"cancel":return u.default.red(pt);case"error":return u.default.yellow(ut);case"submit":return u.default.green(Un)}};var P=(t)=>new _n({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,render(){let r=`${u.default.gray(R)}
|
|
16
|
+
${ht(this.state)} ${t.message}
|
|
17
|
+
`,o=t.placeholder?u.default.inverse(t.placeholder[0])+u.default.dim(t.placeholder.slice(1)):u.default.inverse(u.default.hidden("_")),e=this.value?this.valueWithCursor:o;switch(this.state){case"error":return`${r.trim()}
|
|
18
|
+
${u.default.yellow(R)} ${e}
|
|
19
|
+
${u.default.yellow(rn)} ${u.default.yellow(this.error)}
|
|
20
|
+
`;case"submit":return`${r}${u.default.gray(R)} ${u.default.dim(this.value||t.placeholder)}`;case"cancel":return`${r}${u.default.gray(R)} ${u.default.strikethrough(u.default.dim(this.value??""))}${this.value?.trim()?`
|
|
21
|
+
${u.default.gray(R)}`:""}`;default:return`${r}${u.default.cyan(R)} ${e}
|
|
22
|
+
${u.default.cyan(rn)}
|
|
23
|
+
`}}}).prompt();var j=(t)=>{let r=t.active??"Yes",o=t.inactive??"No";return new Xn({active:r,inactive:o,initialValue:t.initialValue??!0,render(){let e=`${u.default.gray(R)}
|
|
24
|
+
${ht(this.state)} ${t.message}
|
|
25
|
+
`,s=this.value?r:o;switch(this.state){case"submit":return`${e}${u.default.gray(R)} ${u.default.dim(s)}`;case"cancel":return`${e}${u.default.gray(R)} ${u.default.strikethrough(u.default.dim(s))}
|
|
26
|
+
${u.default.gray(R)}`;default:return`${e}${u.default.cyan(R)} ${this.value?`${u.default.green(lt)} ${r}`:`${u.default.dim(gt)} ${u.default.dim(r)}`} ${u.default.dim("/")} ${this.value?`${u.default.dim(gt)} ${u.default.dim(o)}`:`${u.default.green(lt)} ${o}`}
|
|
27
|
+
${u.default.cyan(rn)}
|
|
28
|
+
`}}}).prompt()};var qn=(t="")=>{process.stdout.write(`${u.default.gray(rn)} ${u.default.red(t)}
|
|
29
|
+
|
|
30
|
+
`)},dt=(t="")=>{process.stdout.write(`${u.default.gray(Or)} ${t}
|
|
31
|
+
`)},bt=(t="")=>{process.stdout.write(`${u.default.gray(R)}
|
|
32
|
+
${u.default.gray(rn)} ${t}
|
|
33
|
+
|
|
34
|
+
`)},X={message:(t="",{symbol:r=u.default.gray(R)}={})=>{let o=[`${u.default.gray(R)}`];if(t){let[e,...s]=t.split(`
|
|
35
|
+
`);o.push(`${r} ${e}`,...s.map((i)=>`${u.default.gray(R)} ${i}`))}process.stdout.write(`${o.join(`
|
|
650
36
|
`)}
|
|
651
|
-
`);
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
},
|
|
657
|
-
|
|
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
|
-
function optionalString() {
|
|
1121
|
-
return union(optional(), string());
|
|
1122
|
-
}
|
|
1123
|
-
function defaultString(defaultValue) {
|
|
1124
|
-
return defaultTo(string(), defaultValue);
|
|
1125
|
-
}
|
|
1126
|
-
function defaultBoolean(defaultValue) {
|
|
1127
|
-
return defaultTo(boolean(), defaultValue);
|
|
1128
|
-
}
|
|
1129
|
-
// src/methods/createMachines.ts
|
|
1130
|
-
import { parseArgs } from "util";
|
|
1131
|
-
var {$: $3 } = globalThis.Bun;
|
|
1132
|
-
|
|
1133
|
-
// src/config.ts
|
|
1134
|
-
import { join } from "path";
|
|
1135
|
-
var {$: $2 } = globalThis.Bun;
|
|
1136
|
-
|
|
1137
|
-
// src/constants.ts
|
|
1138
|
-
import { tmpdir } from "os";
|
|
1139
|
-
var PATHS = { MACHINES_DIR: "machines", TEMP_DIR: tmpdir() };
|
|
1140
|
-
|
|
1141
|
-
// src/types.ts
|
|
1142
|
-
var profileValidator = object({
|
|
1143
|
-
directory: defaultString("./gh-runners"),
|
|
1144
|
-
labels: optionalString(),
|
|
1145
|
-
name: defaultString("runner"),
|
|
1146
|
-
numberOfMachines: defaultTo(positiveInt(), 1),
|
|
1147
|
-
os: defaultTo(enums(["osx", "linux", "windows"]), "osx"),
|
|
1148
|
-
overwrite: defaultBoolean(false),
|
|
1149
|
-
run: defaultBoolean(false),
|
|
1150
|
-
runnerGroup: optionalString(),
|
|
1151
|
-
url: optionalString()
|
|
1152
|
-
});
|
|
1153
|
-
var ProfileSchema = createSchema(profileValidator);
|
|
1154
|
-
var ConfigSchema = createSchema(object({ defaultProfile: optionalString(), profiles: record(ProfileSchema.validator) }));
|
|
1155
|
-
|
|
1156
|
-
// src/config.ts
|
|
1157
|
-
var CONFIG_FILE_NAMES = ["hydra.json", ".hydra.json", "hydra.toml", ".hydra.toml"];
|
|
1158
|
-
async function findConfigFile(startPath = process.cwd()) {
|
|
1159
|
-
for (const fileName of CONFIG_FILE_NAMES) {
|
|
1160
|
-
const configPath = join(startPath, fileName);
|
|
1161
|
-
const file = Bun.file(configPath);
|
|
1162
|
-
if (await file.exists()) {
|
|
1163
|
-
return configPath;
|
|
1164
|
-
}
|
|
1165
|
-
}
|
|
1166
|
-
return null;
|
|
1167
|
-
}
|
|
1168
|
-
async function loadConfig(options) {
|
|
1169
|
-
const configPath = options?.configPath || await findConfigFile();
|
|
1170
|
-
if (!configPath) {
|
|
1171
|
-
return null;
|
|
1172
|
-
}
|
|
1173
|
-
const file = Bun.file(configPath);
|
|
1174
|
-
if (!await file.exists()) {
|
|
1175
|
-
return null;
|
|
1176
|
-
}
|
|
1177
|
-
try {
|
|
1178
|
-
const content = await file.text();
|
|
1179
|
-
const data = configPath.endsWith(".toml") ? await parseToml(content) : JSON.parse(content);
|
|
1180
|
-
return ConfigSchema.parse(data);
|
|
1181
|
-
} catch (error2) {
|
|
1182
|
-
if (error2 instanceof Error) {
|
|
1183
|
-
throw new Error(`Invalid config file: ${error2.message}`);
|
|
1184
|
-
}
|
|
1185
|
-
throw error2;
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
async function getProfile(config, profileName) {
|
|
1189
|
-
if (!config)
|
|
1190
|
-
return null;
|
|
1191
|
-
const name = profileName || config.defaultProfile;
|
|
1192
|
-
if (!name)
|
|
1193
|
-
return null;
|
|
1194
|
-
return config.profiles[name] || null;
|
|
1195
|
-
}
|
|
1196
|
-
async function parseToml(content) {
|
|
1197
|
-
const tempFile = join(PATHS.TEMP_DIR, `hydra-config-${Date.now()}.toml`);
|
|
1198
|
-
await Bun.write(tempFile, content);
|
|
1199
|
-
try {
|
|
1200
|
-
const module = await import(tempFile);
|
|
1201
|
-
await $2`rm -f ${tempFile}`.quiet();
|
|
1202
|
-
return module.default;
|
|
1203
|
-
} catch (error2) {
|
|
1204
|
-
await $2`rm -f ${tempFile}`.quiet();
|
|
1205
|
-
throw new Error(`Failed to parse TOML configuration: ${error2}`);
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
// src/helpers.ts
|
|
1210
|
-
function getPackagePath() {
|
|
1211
|
-
const currentFilePath = import.meta.path;
|
|
1212
|
-
const currentDir = currentFilePath.substring(0, currentFilePath.lastIndexOf("/"));
|
|
1213
|
-
const srcDir = currentDir.substring(0, currentDir.lastIndexOf("/"));
|
|
1214
|
-
return srcDir;
|
|
1215
|
-
}
|
|
1216
|
-
var cliArgsValidator = object({
|
|
1217
|
-
directory: defaultTo(string(), `${process.cwd()}/gh-runners`),
|
|
1218
|
-
labels: union(string(), optional()),
|
|
1219
|
-
name: defaultTo(string(), "runner"),
|
|
1220
|
-
numberOfMachines: defaultTo(regex(/^\d+$/, "Number of machines must be a positive integer"), "1"),
|
|
1221
|
-
os: defaultTo(enums(["osx", "linux", "windows"]), "osx"),
|
|
1222
|
-
overwrite: defaultTo(boolean(), false),
|
|
1223
|
-
run: defaultTo(boolean(), false),
|
|
1224
|
-
token: defaultTo(string(), process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? ""),
|
|
1225
|
-
url: url()
|
|
1226
|
-
});
|
|
1227
|
-
var CliArgsSchema = createSchema(cliArgsValidator);
|
|
1228
|
-
|
|
1229
|
-
// src/lib/worker-manager.ts
|
|
1230
|
-
var logger2 = createLogger({ prefix: "WorkerManager" });
|
|
1231
|
-
var workers = new Set;
|
|
1232
|
-
var cleanupRegistered = false;
|
|
1233
|
-
function registerCleanup() {
|
|
1234
|
-
if (cleanupRegistered)
|
|
1235
|
-
return;
|
|
1236
|
-
cleanupRegistered = true;
|
|
1237
|
-
const cleanup = () => {
|
|
1238
|
-
if (workers.size > 0) {
|
|
1239
|
-
logger2.info("Cleaning up workers...");
|
|
1240
|
-
}
|
|
1241
|
-
terminateAll();
|
|
1242
|
-
};
|
|
1243
|
-
process.on("exit", cleanup);
|
|
1244
|
-
process.on("SIGINT", cleanup);
|
|
1245
|
-
process.on("SIGTERM", cleanup);
|
|
1246
|
-
process.on("uncaughtException", (error2) => {
|
|
1247
|
-
logger2.error("Uncaught exception:", error2);
|
|
1248
|
-
cleanup();
|
|
1249
|
-
process.exit(1);
|
|
1250
|
-
});
|
|
1251
|
-
}
|
|
1252
|
-
function addWorker(worker) {
|
|
1253
|
-
workers.add(worker);
|
|
1254
|
-
logger2.debug(`Worker added. Total workers: ${workers.size}`);
|
|
1255
|
-
worker.addEventListener("exit", () => {
|
|
1256
|
-
workers.delete(worker);
|
|
1257
|
-
logger2.debug(`Worker exited. Remaining workers: ${workers.size}`);
|
|
1258
|
-
});
|
|
1259
|
-
}
|
|
1260
|
-
function removeWorker(worker) {
|
|
1261
|
-
if (workers.has(worker)) {
|
|
1262
|
-
worker.terminate();
|
|
1263
|
-
workers.delete(worker);
|
|
1264
|
-
logger2.debug(`Worker removed. Remaining workers: ${workers.size}`);
|
|
1265
|
-
}
|
|
1266
|
-
}
|
|
1267
|
-
function terminateAll() {
|
|
1268
|
-
if (workers.size > 0) {
|
|
1269
|
-
logger2.info(`Terminating ${workers.size} workers...`);
|
|
1270
|
-
for (const worker of workers) {
|
|
1271
|
-
try {
|
|
1272
|
-
worker.terminate();
|
|
1273
|
-
} catch (error2) {
|
|
1274
|
-
logger2.error(`Failed to terminate worker:`, error2);
|
|
1275
|
-
}
|
|
1276
|
-
}
|
|
1277
|
-
workers.clear();
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
function getWorkerCount() {
|
|
1281
|
-
return workers.size;
|
|
1282
|
-
}
|
|
1283
|
-
registerCleanup();
|
|
1284
|
-
var workerManager = {
|
|
1285
|
-
add: addWorker,
|
|
1286
|
-
remove: removeWorker,
|
|
1287
|
-
get size() {
|
|
1288
|
-
return getWorkerCount();
|
|
1289
|
-
},
|
|
1290
|
-
terminateAll
|
|
1291
|
-
};
|
|
1292
|
-
|
|
1293
|
-
// src/methods/createMachines.ts
|
|
1294
|
-
var logger3 = createLogger({ prefix: "createMachines" });
|
|
1295
|
-
async function createMachines() {
|
|
1296
|
-
const args = await getArgs();
|
|
1297
|
-
const { overwrite, directory, numberOfMachines, os, run, name, labels, runnerGroup } = args;
|
|
1298
|
-
let { token, url: url2 } = args;
|
|
1299
|
-
if (!url2) {
|
|
1300
|
-
throw new Error("URL (-u) parameter is required");
|
|
1301
|
-
}
|
|
1302
|
-
if (!token) {
|
|
1303
|
-
const settingsUrl = constructRunnerSettingsUrl(url2);
|
|
1304
|
-
const shouldOpen = await ye({
|
|
1305
|
-
message: `No token provided. Would you like to open GitHub to get a runner token?
|
|
1306
|
-
${settingsUrl}`
|
|
1307
|
-
});
|
|
1308
|
-
if (pD(shouldOpen) || !shouldOpen) {
|
|
1309
|
-
throw new Error("Token is required to create runners");
|
|
1310
|
-
}
|
|
1311
|
-
logger3.info("Opening GitHub runner settings...");
|
|
1312
|
-
await $3`open ${settingsUrl}`.quiet();
|
|
1313
|
-
const tokenInput = await he({
|
|
1314
|
-
message: "Enter the runner registration token:",
|
|
1315
|
-
placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
1316
|
-
validate: (value) => {
|
|
1317
|
-
if (!value || value.trim().length === 0) {
|
|
1318
|
-
return "Token is required";
|
|
1319
|
-
}
|
|
1320
|
-
return;
|
|
1321
|
-
}
|
|
1322
|
-
});
|
|
1323
|
-
if (pD(tokenInput)) {
|
|
1324
|
-
throw new Error("Token is required to create runners");
|
|
1325
|
-
}
|
|
1326
|
-
token = tokenInput.trim();
|
|
1327
|
-
}
|
|
1328
|
-
logger3.info(`Creating ${numberOfMachines} runners in ${directory}`);
|
|
1329
|
-
logger3.debug(`OS: ${os}, Name: ${name}, Labels: ${labels || "none"}`);
|
|
1330
|
-
const directoryExists = await Bun.file(directory).exists();
|
|
1331
|
-
if (directoryExists) {
|
|
1332
|
-
if (overwrite) {
|
|
1333
|
-
logger3.warn(`Directory ${directory} exists, removing...`);
|
|
1334
|
-
await $3`rm -rf ${directory}`;
|
|
1335
|
-
} else {
|
|
1336
|
-
throw new Error(`Directory ${directory} already exists`);
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
const runnerBase = await downloadLatestRunnerImage({ directory, os });
|
|
1340
|
-
await extractAndCopyRunnerBase({ directory, numberOfMachines, overwrite, runnerBase });
|
|
1341
|
-
if (!run) {
|
|
1342
|
-
logger3.info("Runners created but not started");
|
|
1343
|
-
return;
|
|
1344
|
-
}
|
|
1345
|
-
startRunners({ directory, labels, name, numberOfMachines, runnerGroup, token, url: url2 });
|
|
1346
|
-
}
|
|
1347
|
-
function constructRunnerSettingsUrl(url2) {
|
|
1348
|
-
try {
|
|
1349
|
-
const parsedUrl = new URL(url2);
|
|
1350
|
-
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
1351
|
-
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
|
|
1352
|
-
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
1353
|
-
return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
1354
|
-
} else if (pathParts.length >= 2) {
|
|
1355
|
-
return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
1356
|
-
}
|
|
1357
|
-
} else {
|
|
1358
|
-
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
1359
|
-
return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
1360
|
-
} else if (pathParts.length >= 2) {
|
|
1361
|
-
return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
1362
|
-
}
|
|
1363
|
-
}
|
|
1364
|
-
return url2;
|
|
1365
|
-
} catch {
|
|
1366
|
-
return url2;
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
async function getArgs() {
|
|
1370
|
-
const { values } = parseArgs({
|
|
1371
|
-
allowPositionals: true,
|
|
1372
|
-
args: Bun.argv,
|
|
1373
|
-
options: {
|
|
1374
|
-
config: { short: "c", type: "string" },
|
|
1375
|
-
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
1376
|
-
labels: { short: "l", type: "string" },
|
|
1377
|
-
name: { default: "runner", short: "n", type: "string" },
|
|
1378
|
-
numberOfMachines: { default: "1", short: "m", type: "string" },
|
|
1379
|
-
os: { default: "osx", short: "s", type: "string" },
|
|
1380
|
-
overwrite: { default: false, short: "f", type: "boolean" },
|
|
1381
|
-
profile: { short: "p", type: "string" },
|
|
1382
|
-
run: { default: false, short: "r", type: "boolean" },
|
|
1383
|
-
runnerGroup: { short: "g", type: "string" },
|
|
1384
|
-
token: { short: "t", type: "string" },
|
|
1385
|
-
url: { short: "u", type: "string" }
|
|
1386
|
-
},
|
|
1387
|
-
strict: true
|
|
1388
|
-
});
|
|
1389
|
-
const config = await loadConfig({ configPath: values.config });
|
|
1390
|
-
const profile = await getProfile(config, values.profile);
|
|
1391
|
-
const baseArgs = {
|
|
1392
|
-
directory: values.directory,
|
|
1393
|
-
labels: values.labels,
|
|
1394
|
-
name: values.name,
|
|
1395
|
-
numberOfMachines: values.numberOfMachines,
|
|
1396
|
-
os: values.os,
|
|
1397
|
-
overwrite: values.overwrite,
|
|
1398
|
-
run: values.run,
|
|
1399
|
-
runnerGroup: values.runnerGroup,
|
|
1400
|
-
token: values.token,
|
|
1401
|
-
url: values.url
|
|
1402
|
-
};
|
|
1403
|
-
if (profile) {
|
|
1404
|
-
return {
|
|
1405
|
-
directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
|
|
1406
|
-
labels: baseArgs.labels ?? profile.labels,
|
|
1407
|
-
name: baseArgs.name ?? profile.name ?? "runner",
|
|
1408
|
-
numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
|
|
1409
|
-
os: baseArgs.os ?? profile.os ?? "osx",
|
|
1410
|
-
overwrite: baseArgs.overwrite ?? profile.overwrite ?? false,
|
|
1411
|
-
run: baseArgs.run ?? profile.run ?? false,
|
|
1412
|
-
runnerGroup: baseArgs.runnerGroup ?? profile.runnerGroup,
|
|
1413
|
-
token: baseArgs.token,
|
|
1414
|
-
url: baseArgs.url ?? profile.url
|
|
1415
|
-
};
|
|
1416
|
-
}
|
|
1417
|
-
return {
|
|
1418
|
-
directory: baseArgs.directory,
|
|
1419
|
-
labels: baseArgs.labels,
|
|
1420
|
-
name: baseArgs.name,
|
|
1421
|
-
numberOfMachines: baseArgs.numberOfMachines,
|
|
1422
|
-
os: baseArgs.os,
|
|
1423
|
-
overwrite: baseArgs.overwrite,
|
|
1424
|
-
run: baseArgs.run,
|
|
1425
|
-
runnerGroup: baseArgs.runnerGroup,
|
|
1426
|
-
token: baseArgs.token,
|
|
1427
|
-
url: baseArgs.url
|
|
1428
|
-
};
|
|
1429
|
-
}
|
|
1430
|
-
async function downloadLatestRunnerImage({ directory, os }) {
|
|
1431
|
-
const log = logger3.child("download");
|
|
1432
|
-
log.info(`Fetching latest runner version for ${os}...`);
|
|
1433
|
-
const releaseInfo = await withRetry(async () => (await $3`curl -Ls -o /dev/null -w "%{url_effective}" https://github.com/actions/runner/releases/latest`).text(), {
|
|
1434
|
-
onRetry: (attempt, error2) => {
|
|
1435
|
-
log.warn(`Retrying GitHub API call (attempt ${attempt}): ${error2.message}`);
|
|
1436
|
-
}
|
|
1437
|
-
});
|
|
1438
|
-
const lastRelease = (await $3`basename ${releaseInfo}`).text();
|
|
1439
|
-
const version = lastRelease.trim().replace("v", "");
|
|
1440
|
-
const runnerBase = `actions-runner-${os}-x64-${version}.tar.gz`;
|
|
1441
|
-
const githubReleaseUrl = `https://github.com/actions/runner/releases/download/v${version}/${runnerBase}`;
|
|
1442
|
-
log.debug(`Runner version: ${version}`);
|
|
1443
|
-
log.debug(`Download URL: ${githubReleaseUrl}`);
|
|
1444
|
-
await $3`mkdir -p ${directory}`;
|
|
1445
|
-
await $3`mkdir -p ${directory}/machines`;
|
|
1446
|
-
const runnerFileExists = await Bun.file(`${directory}/${runnerBase}`).exists();
|
|
1447
|
-
if (!runnerFileExists) {
|
|
1448
|
-
log.info("Downloading runner image...");
|
|
1449
|
-
await withRetry(async () => await $3`curl -o ${directory}/${runnerBase} -L ${githubReleaseUrl}`, {
|
|
1450
|
-
maxAttempts: 5,
|
|
1451
|
-
onRetry: (attempt, error2) => {
|
|
1452
|
-
log.warn(`Retrying runner download (attempt ${attempt}): ${error2.message}`);
|
|
1453
|
-
}
|
|
1454
|
-
});
|
|
1455
|
-
log.info("Download complete");
|
|
1456
|
-
} else {
|
|
1457
|
-
log.info("Runner image already exists, skipping download");
|
|
1458
|
-
}
|
|
1459
|
-
return runnerBase;
|
|
1460
|
-
}
|
|
1461
|
-
async function extractAndCopyRunnerBase({
|
|
1462
|
-
overwrite,
|
|
1463
|
-
numberOfMachines,
|
|
1464
|
-
directory,
|
|
1465
|
-
runnerBase
|
|
1466
|
-
}) {
|
|
1467
|
-
const log = logger3.child("extract");
|
|
1468
|
-
const numMachines = Number(numberOfMachines);
|
|
1469
|
-
const cpuCount = (() => {
|
|
1470
|
-
try {
|
|
1471
|
-
const result = Bun.spawnSync(["nproc"]);
|
|
1472
|
-
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1473
|
-
} catch {
|
|
1474
|
-
try {
|
|
1475
|
-
const result = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"]);
|
|
1476
|
-
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1477
|
-
} catch {
|
|
1478
|
-
return 4;
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
})();
|
|
1482
|
-
const concurrency = Math.min(Math.max(2, Math.floor(cpuCount / 2)), numMachines, 8);
|
|
1483
|
-
log.info(`Extracting ${numMachines} runners with concurrency of ${concurrency}`);
|
|
1484
|
-
const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
|
|
1485
|
-
execute: async () => {
|
|
1486
|
-
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
1487
|
-
const machineExists = await Bun.file(machineDirectory).exists();
|
|
1488
|
-
if (machineExists) {
|
|
1489
|
-
if (overwrite) {
|
|
1490
|
-
log.debug(`Machine ${runnerIndex} already exists, removing...`);
|
|
1491
|
-
await $3`rm -rf ${machineDirectory}`;
|
|
1492
|
-
} else {
|
|
1493
|
-
log.debug(`Machine ${runnerIndex} already exists, skipping...`);
|
|
1494
|
-
return;
|
|
1495
|
-
}
|
|
1496
|
-
}
|
|
1497
|
-
await $3`mkdir -p ${machineDirectory}`;
|
|
1498
|
-
await $3`tar xzf ${runnerBase} -C ${machineDirectory.replace(`${directory}/`, "")}`.cwd(directory);
|
|
1499
|
-
const runnerPath = `${getPackagePath()}/src/runner`;
|
|
1500
|
-
await $3`cp -R ${runnerPath}/hooks ${machineDirectory}`;
|
|
1501
|
-
await $3`cp -R ${runnerPath}/.runner-env ${machineDirectory}/.runner-env`;
|
|
1502
|
-
log.debug(`Machine ${runnerIndex} extracted successfully`);
|
|
1503
|
-
},
|
|
1504
|
-
runnerIndex
|
|
1505
|
-
}));
|
|
1506
|
-
const results = [];
|
|
1507
|
-
for (let i = 0;i < tasks.length; i += concurrency) {
|
|
1508
|
-
const batch = tasks.slice(i, i + concurrency);
|
|
1509
|
-
const batchResults = await Promise.allSettled(batch.map((task) => task.execute()));
|
|
1510
|
-
for (const [index, result] of batchResults.entries()) {
|
|
1511
|
-
if (result.status === "rejected") {
|
|
1512
|
-
log.error(`Failed to extract runner ${batch[index]?.runnerIndex}: ${result.reason}`);
|
|
1513
|
-
throw result.reason;
|
|
1514
|
-
}
|
|
1515
|
-
}
|
|
1516
|
-
results.push(...batchResults);
|
|
1517
|
-
}
|
|
1518
|
-
log.info(`Successfully extracted ${numMachines} runners`);
|
|
1519
|
-
}
|
|
1520
|
-
function startRunners({
|
|
1521
|
-
directory,
|
|
1522
|
-
numberOfMachines,
|
|
1523
|
-
token,
|
|
1524
|
-
url: url2,
|
|
1525
|
-
name,
|
|
1526
|
-
labels,
|
|
1527
|
-
runnerGroup
|
|
1528
|
-
}) {
|
|
1529
|
-
logger3.info(`Starting ${numberOfMachines} runners...`);
|
|
1530
|
-
for (let runnerIndex = 1;runnerIndex <= Number(numberOfMachines); runnerIndex++) {
|
|
1531
|
-
const workerPath = `${getPackagePath()}/src/runner-worker.ts`;
|
|
1532
|
-
const workerName = `${name}-${runnerIndex}`;
|
|
1533
|
-
const worker = new Worker(workerPath, { name: workerName, ref: true });
|
|
1534
|
-
worker.addEventListener("open", () => {
|
|
1535
|
-
logger3.info(`Worker ${workerName} started`);
|
|
1536
|
-
worker.postMessage({
|
|
1537
|
-
index: runnerIndex,
|
|
1538
|
-
labels,
|
|
1539
|
-
machineCwd: `${directory}/machines/${runnerIndex}`,
|
|
1540
|
-
name,
|
|
1541
|
-
runnerGroup,
|
|
1542
|
-
token,
|
|
1543
|
-
url: url2
|
|
1544
|
-
});
|
|
1545
|
-
});
|
|
1546
|
-
worker.addEventListener("message", ({ data }) => {
|
|
1547
|
-
const level = data.type === "error" ? "error" : "info";
|
|
1548
|
-
logger3[level](`${workerName}: ${data.message}`);
|
|
1549
|
-
});
|
|
1550
|
-
worker.addEventListener("error", (error2) => {
|
|
1551
|
-
logger3.error(`Worker ${workerName} error:`, error2);
|
|
1552
|
-
});
|
|
1553
|
-
worker.addEventListener("exit", (code) => {
|
|
1554
|
-
logger3.info(`Worker ${workerName} exited with code ${code}`);
|
|
1555
|
-
});
|
|
1556
|
-
workerManager.add(worker);
|
|
1557
|
-
}
|
|
1558
|
-
logger3.info("All workers started. Press Ctrl+C to stop all machines");
|
|
1559
|
-
}
|
|
1560
|
-
|
|
1561
|
-
// src/methods/help.ts
|
|
1562
|
-
var COMMAND_HELP = {
|
|
1563
|
-
create: `
|
|
37
|
+
`)},info:(t)=>{X.message(t,{symbol:u.default.blue(Sr)})},success:(t)=>{X.message(t,{symbol:u.default.green(Tr)})},step:(t)=>{X.message(t,{symbol:u.default.green(Un)})},warn:(t)=>{X.message(t,{symbol:u.default.yellow(Cr)})},warning:(t)=>{X.warn(t)},error:(t)=>{X.message(t,{symbol:u.default.red(Nr)})}},Qo=`${u.default.gray(R)} `;var yt=({indicator:t="dots"}={})=>{let r=An?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],o=An?80:120,e=process.env.CI==="true",s,i,n=!1,a="",c,l=performance.now(),f=(y)=>{let $=y>1?"Something went wrong":"Canceled";n&&H($,y)},m=()=>f(2),g=()=>f(1),d=()=>{process.on("uncaughtExceptionMonitor",m),process.on("unhandledRejection",m),process.on("SIGINT",g),process.on("SIGTERM",g),process.on("exit",f)},h=()=>{process.removeListener("uncaughtExceptionMonitor",m),process.removeListener("unhandledRejection",m),process.removeListener("SIGINT",g),process.removeListener("SIGTERM",g),process.removeListener("exit",f)},w=()=>{if(c===void 0)return;e&&process.stdout.write(`
|
|
38
|
+
`);let y=c.split(`
|
|
39
|
+
`);process.stdout.write(dn.cursor.move(-999,y.length-1)),process.stdout.write(dn.erase.down(y.length))},T=(y)=>y.replace(/\.+$/,""),A=(y)=>{let $=(performance.now()-y)/1000,C=Math.floor($/60),L=Math.floor($%60);return C>0?`[${C}m ${L}s]`:`[${L}s]`},b=(y="")=>{n=!0,s=mt(),a=T(y),l=performance.now(),process.stdout.write(`${u.default.gray(R)}
|
|
40
|
+
`);let $=0,C=0;d(),i=setInterval(()=>{if(e&&a===c)return;w(),c=a;let L=u.default.magenta(r[$]);if(e)process.stdout.write(`${L} ${a}...`);else if(t==="timer")process.stdout.write(`${L} ${a} ${A(l)}`);else{let K=".".repeat(Math.floor(C)).slice(0,3);process.stdout.write(`${L} ${a}${K}`)}$=$+1<r.length?$+1:0,C=C<r.length?C+0.125:0},o)},H=(y="",$=0)=>{n=!1,clearInterval(i),w();let C=$===0?u.default.green(Un):$===1?u.default.red(pt):u.default.red(ut);a=T(y??a),t==="timer"?process.stdout.write(`${C} ${a} ${A(l)}
|
|
41
|
+
`):process.stdout.write(`${C} ${a}
|
|
42
|
+
`),h(),s()};return{start:b,stop:H,message:(y="")=>{a=T(y??a)}}},xt=async(t,r)=>{let o={},e=Object.keys(t);for(let s of e){let i=t[s],n=await i({results:o})?.catch((a)=>{throw a});if(typeof r?.onCancel=="function"&&S(n)){o[s]="canceled",r.onCancel({results:o});continue}o[s]=n}return o};var Pr=!process.env.NO_COLOR&&(process.env.FORCE_COLOR||process.stdout.isTTY),kr=["blue","cyan","gray","green","magenta","red","white","yellow"],Mr=["bold","dim","italic","underline","reset"],wt={bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",reset:"\x1B[0m",underline:"\x1B[4m"},vr={"\x1B[30m":"\x1B[90m","\x1B[31m":"\x1B[91m","\x1B[32m":"\x1B[92m","\x1B[33m":"\x1B[93m","\x1B[34m":"\x1B[94m","\x1B[35m":"\x1B[95m","\x1B[36m":"\x1B[96m","\x1B[37m":"\x1B[97m"};function Hn(t){return(r)=>Pr?`${t}${r}${wt.reset}`:r}function $t({bright:t=!1,color:r}){let o=Bun.color(r,"ansi");if(!o)return"";return t?vr[o]||o:o}var Gr=kr.reduce((t,r)=>{return t[r]=Hn($t({color:r})),t[`${r}Bright`]=Hn($t({bright:!0,color:r})),t},{}),Xr=Mr.reduce((t,r)=>{return t[r]=Hn(wt[r]),t},{}),p={...Gr,...Xr};var _=({prefix:t="",level:r=process.env.DEBUG?0:1}={})=>{function o(...a){if(r<=0){let c=a.join(" ");console.log(bn({level:p.dim("DEBUG"),message:c,prefix:t}))}}function e(...a){if(r<=1){let c=a.join(" ");console.info(bn({level:p.cyan("INFO "),message:c,prefix:t}))}}function s(...a){if(r<=2){let c=a.join(" ");console.warn(bn({level:p.yellow("WARN "),message:c,prefix:t}))}}function i(...a){if(r<=3){let c=a.join(" ");console.error(bn({level:p.red("ERROR"),message:c,prefix:t}))}}function n(a){return _({level:r,prefix:`${t}:${a}`})}return{child:n,debug:o,error:i,info:e,warn:s}},Ln=_();function bn({prefix:t,level:r,message:o}){let e=new Date().toISOString().split("T")[1]?.split(".")[0]||"",s=t?`[${t}] `:"";return`${p.dim(e||"")} ${r} ${s}${o}`}var B=new Uint32Array(65536),_r=(t,r)=>{let o=t.length,e=r.length,s=1<<o-1,i=-1,n=0,a=o,c=o;while(c--)B[t.charCodeAt(c)]|=1<<c;for(c=0;c<e;c++){let l=B[r.charCodeAt(c)],f=l|n;if(l|=(l&i)+i^i,n|=~(l|i),i&=l,n&s)a++;if(i&s)a--;n=n<<1|1,i=i<<1|~(f|n),n&=f}c=o;while(c--)B[t.charCodeAt(c)]=0;return a},Ar=(t,r)=>{let o=r.length,e=t.length,s=[],i=[],n=Math.ceil(o/32),a=Math.ceil(e/32);for(let h=0;h<n;h++)i[h]=-1,s[h]=0;let c=0;for(;c<a-1;c++){let h=0,w=-1,T=c*32,A=Math.min(32,e)+T;for(let b=T;b<A;b++)B[t.charCodeAt(b)]|=1<<b;for(let b=0;b<o;b++){let H=B[r.charCodeAt(b)],y=i[b/32|0]>>>b&1,$=s[b/32|0]>>>b&1,C=H|h,L=((H|$)&w)+w^w|H|$,K=h|~(L|w),fn=w&L;if(K>>>31^y)i[b/32|0]^=1<<b;if(fn>>>31^$)s[b/32|0]^=1<<b;K=K<<1|y,fn=fn<<1|$,w=fn|~(C|K),h=K&C}for(let b=T;b<A;b++)B[t.charCodeAt(b)]=0}let l=0,f=-1,m=c*32,g=Math.min(32,e-m)+m;for(let h=m;h<g;h++)B[t.charCodeAt(h)]|=1<<h;let d=e;for(let h=0;h<o;h++){let w=B[r.charCodeAt(h)],T=i[h/32|0]>>>h&1,A=s[h/32|0]>>>h&1,b=w|l,H=((w|A)&f)+f^f|w|A,y=l|~(H|f),$=f&H;if(d+=y>>>e-1&1,d-=$>>>e-1&1,y>>>31^T)i[h/32|0]^=1<<h;if($>>>31^A)s[h/32|0]^=1<<h;y=y<<1|T,$=$<<1|A,f=$|~(b|y),l=y&b}for(let h=m;h<g;h++)B[t.charCodeAt(h)]=0;return d},Et=(t,r)=>{if(t.length<r.length){let o=r;r=t,t=o}if(r.length===0)return t.length;if(t.length<=32)return _r(t,r);return Ar(t,r)};function Rt(t,r,o=3){return r.map((i)=>({distance:Et(t.toLowerCase(),i.toLowerCase()),option:i})).filter(({distance:i})=>i<=Math.max(3,t.length/2)).sort((i,n)=>i.distance-n.distance).slice(0,o).map(({option:i})=>i)}function Ot(t,r){return r[t.toLowerCase()]||null}async function F(t,r={}){let{fallback:o,logLevel:e="warn",message:s="Operation failed gracefully"}=r;try{return await t()}catch(i){let n=i instanceof Error?i.message:String(i);if(console[e](`${s}: ${n}`),o)try{await o()}catch(a){console.error(`Fallback also failed: ${a instanceof Error?a.message:String(a)}`)}return}}var Ur={backoffMultiplier:2,initialDelay:1000,maxAttempts:3,maxDelay:30000,onRetry:(t,r)=>{Ln.warn(`Retry attempt ${t}: ${r.message}`)},retryableErrors:["ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENOTFOUND","rate limit","429","503","502","504","npm ERR!","EPUBLISHCONFLICT"]};async function on(t,r={}){let o={...Ur,...r},e=new Error("Operation failed");for(let s=1;s<=o.maxAttempts;s++)try{return await t()}catch(i){if(e=i instanceof Error?i:new Error(String(i)),!o.retryableErrors.some((c)=>e.message.toLowerCase().includes(c.toLowerCase()))||s===o.maxAttempts)throw e;o.onRetry(s,e);let a=Math.min(o.initialDelay*o.backoffMultiplier**(s-1),o.maxDelay);await new Promise((c)=>setTimeout(c,a))}throw e}var U=(t)=>{return t.map=(r)=>U((o)=>r(t(o))),t.or=(r)=>U((o)=>{try{return t(o)}catch(e){return r(o)}}),t},yn=()=>"bad banditype"();var St=(t)=>U((r)=>t.includes(r)?r:yn()),xn=(t)=>U((r)=>typeof r===typeof t?r:yn()),en=()=>xn(""),Tt=()=>xn(0),Ct=()=>xn(!0);var Nt=()=>xn();var Pt=(t)=>U((r)=>r instanceof t?r:yn()),Bn=(t)=>Pt(Object).map((r)=>{let o={};for(let e in r){let s=t(r[e]);s!==void 0&&(o[e]=s)}return o}),D=(t)=>Pt(Object).map((r)=>{let o={};for(let e in t){let s=t[e](r[e]);s!==void 0&&(o[e]=s)}return o});function qr(t,r){return U((o)=>{try{return t(o)}catch{try{return r(o)}catch{throw new Error("No matching schema in union")}}})}function J(t,r){return(o)=>{if(o===void 0)return r;return t(o)}}function kt(){return U((t)=>{let r=Tt()(t);if(!Number.isInteger(r)||r<=0)throw new Error("Must be a positive integer");return r})}function Mt(){return U((t)=>{let r=en()(t);try{return new URL(r),r}catch{throw new Error("Must be a valid URL")}})}function vt(t,r){return U((o)=>{let e=en()(o);if(!t.test(e))throw new Error(r||`Must match pattern ${t}`);return e})}function sn(t){return{parse(r){try{return t(r)}catch(o){throw new Error(o instanceof Error?o.message:"Validation failed")}},safeParse(r){try{return{data:t(r),success:!0}}catch(o){return{error:o instanceof Error?o:new Error("Validation failed"),success:!1}}},validator:t}}function Y(){return qr(Nt(),en())}function Q(t){return J(en(),t)}function nn(t){return J(Ct(),t)}function $n(t,r){return J(St(t),r)}import{parseArgs as Zr}from"util";var{$:v}=globalThis.Bun;import{join as At}from"path";var{$:_t}=globalThis.Bun;import{tmpdir as Hr}from"os";var Gt={MACHINES_DIR:"machines",TEMP_DIR:Hr()};var Lr=D({directory:Q("./gh-runners"),labels:Y(),name:Q("runner"),numberOfMachines:J(kt(),1),os:$n(["osx","linux","windows"],"osx"),overwrite:nn(!1),run:nn(!1),runnerGroup:Y(),url:Y()}),Br=sn(Lr),Xt=sn(D({defaultProfile:Y(),profiles:Bn(Br.validator)}));var Ir=["hydra.json",".hydra.json","hydra.toml",".hydra.toml"];async function jr(t=process.cwd()){for(let r of Ir){let o=At(t,r);if(await Bun.file(o).exists())return o}return null}async function W(t){let r=t?.configPath||await jr();if(!r)return null;let o=Bun.file(r);if(!await o.exists())return null;try{let e=await o.text(),s=r.endsWith(".toml")?await Wr(e):JSON.parse(e);return Xt.parse(s)}catch(e){if(e instanceof Error)throw new Error(`Invalid config file: ${e.message}`);throw e}}async function z(t,r){if(!t)return null;let o=r||t.defaultProfile;if(!o)return null;return t.profiles[o]||null}async function Wr(t){let r=At(Gt.TEMP_DIR,`hydra-config-${Date.now()}.toml`);await Bun.write(r,t);try{let o=await import(r);return await _t`rm -f ${r}`.quiet(),o.default}catch(o){throw await _t`rm -f ${r}`.quiet(),new Error(`Failed to parse TOML configuration: ${o}`)}}function an(){let t=import.meta.path,r=t.substring(0,t.lastIndexOf("/"));return r.substring(0,r.lastIndexOf("/"))}var zr=D({directory:Q(`${process.cwd()}/gh-runners`),labels:Y(),name:Q("runner"),numberOfMachines:J(vt(/^\d+$/,"Number of machines must be a positive integer"),"1"),os:$n(["osx","linux","windows"],"osx"),overwrite:nn(!1),run:nn(!1),token:Q(process.env.GITHUB_PERSONAL_ACCESS_TOKEN??""),url:Mt()}),Le=sn(zr);var Z=_({prefix:"WorkerManager"}),k=new Set,Ut=!1;function Kr(){if(Ut)return;Ut=!0;let t=()=>{if(k.size>0)Z.info("Cleaning up workers...");qt()};process.on("exit",t),process.on("SIGINT",t),process.on("SIGTERM",t),process.on("uncaughtException",(r)=>{Z.error("Uncaught exception:",r),t(),process.exit(1)})}function Jr(t){k.add(t),Z.debug(`Worker added. Total workers: ${k.size}`),t.addEventListener("exit",()=>{k.delete(t),Z.debug(`Worker exited. Remaining workers: ${k.size}`)})}function Yr(t){if(k.has(t))t.terminate(),k.delete(t),Z.debug(`Worker removed. Remaining workers: ${k.size}`)}function qt(){if(k.size>0){Z.info(`Terminating ${k.size} workers...`);for(let t of k)try{t.terminate()}catch(r){Z.error("Failed to terminate worker:",r)}k.clear()}}function Qr(){return k.size}Kr();var wn={add:Jr,remove:Yr,get size(){return Qr()},terminateAll:qt};var M=_({prefix:"createMachines"});async function Ht(){let t=await Fr(),{overwrite:r,directory:o,numberOfMachines:e,os:s,run:i,name:n,labels:a,runnerGroup:c}=t,{token:l,url:f}=t;if(!f)throw new Error("URL (-u) parameter is required");if(!l){let d=Vr(f),h=await j({message:`No token provided. Would you like to open GitHub to get a runner token?
|
|
43
|
+
${d}`});if(S(h)||!h)throw new Error("Token is required to create runners");M.info("Opening GitHub runner settings..."),await v`open ${d}`.quiet();let w=await P({message:"Enter the runner registration token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(T)=>{if(!T||T.trim().length===0)return"Token is required";return}});if(S(w))throw new Error("Token is required to create runners");l=w.trim()}if(M.info(`Creating ${e} runners in ${o}`),M.debug(`OS: ${s}, Name: ${n}, Labels: ${a||"none"}`),await Bun.file(o).exists())if(r)M.warn(`Directory ${o} exists, removing...`),await v`rm -rf ${o}`;else throw new Error(`Directory ${o} already exists`);let g=await Dr({directory:o,os:s});if(await no({directory:o,numberOfMachines:e,overwrite:r,runnerBase:g}),!i){M.info("Runners created but not started");return}to({directory:o,labels:a,name:n,numberOfMachines:e,runnerGroup:c,token:l,url:f})}function Vr(t){try{let r=new URL(t),o=r.pathname.split("/").filter(Boolean);if(r.hostname==="github.com"||r.hostname==="www.github.com"){if(o[0]==="orgs"&&o[1])return`https://github.com/organizations/${o[1]}/settings/actions/runners/new`;else if(o.length>=2)return`https://github.com/${o[0]}/${o[1]}/settings/actions/runners/new`}else if(o[0]==="orgs"&&o[1])return`${r.origin}/organizations/${o[1]}/settings/actions/runners/new`;else if(o.length>=2)return`${r.origin}/${o[0]}/${o[1]}/settings/actions/runners/new`;return t}catch{return t}}async function Fr(){let{values:t}=Zr({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},labels:{short:"l",type:"string"},name:{default:"runner",short:"n",type:"string"},numberOfMachines:{default:"1",short:"m",type:"string"},os:{default:"osx",short:"s",type:"string"},overwrite:{default:!1,short:"f",type:"boolean"},profile:{short:"p",type:"string"},run:{default:!1,short:"r",type:"boolean"},runnerGroup:{short:"g",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),r=await W({configPath:t.config}),o=await z(r,t.profile),e={directory:t.directory,labels:t.labels,name:t.name,numberOfMachines:t.numberOfMachines,os:t.os,overwrite:t.overwrite,run:t.run,runnerGroup:t.runnerGroup,token:t.token,url:t.url};if(o)return{directory:e.directory??o.directory??`${process.cwd()}/gh-runners`,labels:e.labels??o.labels,name:e.name??o.name??"runner",numberOfMachines:e.numberOfMachines??String(o.numberOfMachines)??"1",os:e.os??o.os??"osx",overwrite:e.overwrite??o.overwrite??!1,run:e.run??o.run??!1,runnerGroup:e.runnerGroup??o.runnerGroup,token:e.token,url:e.url??o.url};return{directory:e.directory,labels:e.labels,name:e.name,numberOfMachines:e.numberOfMachines,os:e.os,overwrite:e.overwrite,run:e.run,runnerGroup:e.runnerGroup,token:e.token,url:e.url}}async function Dr({directory:t,os:r}){let o=M.child("download");o.info(`Fetching latest runner version for ${r}...`);let e=await on(async()=>(await v`curl -Ls -o /dev/null -w "%{url_effective}" https://github.com/actions/runner/releases/latest`).text(),{onRetry:(l,f)=>{o.warn(`Retrying GitHub API call (attempt ${l}): ${f.message}`)}}),i=(await v`basename ${e}`).text().trim().replace("v",""),n=`actions-runner-${r}-x64-${i}.tar.gz`,a=`https://github.com/actions/runner/releases/download/v${i}/${n}`;if(o.debug(`Runner version: ${i}`),o.debug(`Download URL: ${a}`),await v`mkdir -p ${t}`,await v`mkdir -p ${t}/machines`,!await Bun.file(`${t}/${n}`).exists())o.info("Downloading runner image..."),await on(async()=>await v`curl -o ${t}/${n} -L ${a}`,{maxAttempts:5,onRetry:(l,f)=>{o.warn(`Retrying runner download (attempt ${l}): ${f.message}`)}}),o.info("Download complete");else o.info("Runner image already exists, skipping download");return n}async function no({overwrite:t,numberOfMachines:r,directory:o,runnerBase:e}){let s=M.child("extract"),i=Number(r),n=(()=>{try{let f=Bun.spawnSync(["nproc"]);return Number.parseInt(f.stdout.toString().trim(),10)||4}catch{try{let f=Bun.spawnSync(["sysctl","-n","hw.ncpu"]);return Number.parseInt(f.stdout.toString().trim(),10)||4}catch{return 4}}})(),a=Math.min(Math.max(2,Math.floor(n/2)),i,8);s.info(`Extracting ${i} runners with concurrency of ${a}`);let c=Array.from({length:i},(f,m)=>m+1).map((f)=>({execute:async()=>{let m=`${o}/machines/${f}`;if(await Bun.file(m).exists())if(t)s.debug(`Machine ${f} already exists, removing...`),await v`rm -rf ${m}`;else{s.debug(`Machine ${f} already exists, skipping...`);return}await v`mkdir -p ${m}`,await v`tar xzf ${e} -C ${m.replace(`${o}/`,"")}`.cwd(o);let d=`${an()}/src/runner`;await v`cp -R ${d}/hooks ${m}`,await v`cp -R ${d}/.runner-env ${m}/.runner-env`,s.debug(`Machine ${f} extracted successfully`)},runnerIndex:f})),l=[];for(let f=0;f<c.length;f+=a){let m=c.slice(f,f+a),g=await Promise.allSettled(m.map((d)=>d.execute()));for(let[d,h]of g.entries())if(h.status==="rejected")throw s.error(`Failed to extract runner ${m[d]?.runnerIndex}: ${h.reason}`),h.reason;l.push(...g)}s.info(`Successfully extracted ${i} runners`)}function to({directory:t,numberOfMachines:r,token:o,url:e,name:s,labels:i,runnerGroup:n}){M.info(`Starting ${r} runners...`);for(let a=1;a<=Number(r);a++){let c=`${an()}/src/runner-worker.ts`,l=`${s}-${a}`,f=new Worker(c,{name:l,ref:!0});f.addEventListener("open",()=>{M.info(`Worker ${l} started`),f.postMessage({index:a,labels:i,machineCwd:`${t}/machines/${a}`,name:s,runnerGroup:n,token:o,url:e})}),f.addEventListener("message",({data:m})=>{let g=m.type==="error"?"error":"info";M[g](`${l}: ${m.message}`)}),f.addEventListener("error",(m)=>{M.error(`Worker ${l} error:`,m)}),f.addEventListener("exit",(m)=>{M.info(`Worker ${l} exited with code ${m}`)}),wn.add(f)}M.info("All workers started. Press Ctrl+C to stop all machines")}var Lt={create:`
|
|
1564
44
|
hydra create - Create and register new GitHub runner machines
|
|
1565
45
|
|
|
1566
46
|
USAGE
|
|
@@ -1587,8 +67,7 @@ EXAMPLES
|
|
|
1587
67
|
|
|
1588
68
|
# Create using profile
|
|
1589
69
|
hydra create -p production -t TOKEN
|
|
1590
|
-
`,
|
|
1591
|
-
init: `
|
|
70
|
+
`,init:`
|
|
1592
71
|
hydra init - Initialize a new Hydra configuration file
|
|
1593
72
|
|
|
1594
73
|
USAGE
|
|
@@ -1603,8 +82,7 @@ EXAMPLES
|
|
|
1603
82
|
|
|
1604
83
|
# Initialize with TOML format
|
|
1605
84
|
hydra init --toml
|
|
1606
|
-
`,
|
|
1607
|
-
remove: `
|
|
85
|
+
`,remove:`
|
|
1608
86
|
hydra remove - Remove GitHub runner machines
|
|
1609
87
|
|
|
1610
88
|
USAGE
|
|
@@ -1629,8 +107,7 @@ EXAMPLES
|
|
|
1629
107
|
|
|
1630
108
|
# Remove specific runners
|
|
1631
109
|
hydra remove -n custom -m 3 -t TOKEN -u URL
|
|
1632
|
-
`,
|
|
1633
|
-
run: `
|
|
110
|
+
`,run:`
|
|
1634
111
|
hydra run - Start existing GitHub runner machines
|
|
1635
112
|
|
|
1636
113
|
USAGE
|
|
@@ -1651,8 +128,7 @@ EXAMPLES
|
|
|
1651
128
|
|
|
1652
129
|
# Run specific runners
|
|
1653
130
|
hydra run -m 2 -n custom -t TOKEN -u URL
|
|
1654
|
-
`,
|
|
1655
|
-
status: `
|
|
131
|
+
`,status:`
|
|
1656
132
|
hydra status - Check the status of GitHub runner machines
|
|
1657
133
|
|
|
1658
134
|
USAGE
|
|
@@ -1675,777 +151,34 @@ EXAMPLES
|
|
|
1675
151
|
|
|
1676
152
|
# Status using profile
|
|
1677
153
|
hydra status -p production
|
|
1678
|
-
`
|
|
1679
|
-
};
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
const helpText = COMMAND_HELP[commandName];
|
|
1683
|
-
const coloredHelp = helpText.split(`
|
|
1684
|
-
`).map((line) => {
|
|
1685
|
-
if (line.startsWith("hydra"))
|
|
1686
|
-
return colors.bold(line);
|
|
1687
|
-
if (line === "USAGE" || line === "OPTIONS" || line === "EXAMPLES")
|
|
1688
|
-
return colors.bold(line);
|
|
1689
|
-
if (line.startsWith(" -")) {
|
|
1690
|
-
const match = line.match(/^(\s+-\w,\s--\w+)\s+(.+)$/);
|
|
1691
|
-
if (match) {
|
|
1692
|
-
const [, flags = "", description = ""] = match;
|
|
1693
|
-
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]"));
|
|
1694
|
-
return ` ${colors.yellow(flags.padEnd(26))} ${coloredDesc}`;
|
|
1695
|
-
}
|
|
1696
|
-
}
|
|
1697
|
-
if (line.startsWith(" # "))
|
|
1698
|
-
return colors.dim(line);
|
|
1699
|
-
if (line.startsWith(" hydra"))
|
|
1700
|
-
return ` ${colors.cyan(line.trim())}`;
|
|
1701
|
-
return line;
|
|
1702
|
-
}).join(`
|
|
1703
|
-
`);
|
|
1704
|
-
console.info(coloredHelp);
|
|
1705
|
-
return;
|
|
1706
|
-
}
|
|
1707
|
-
console.info(`
|
|
1708
|
-
${colors.bold("Hydra - GitHub self-hosted runner manager")}
|
|
154
|
+
`};function cn(t){if(t&&Lt[t]){let o=Lt[t].split(`
|
|
155
|
+
`).map((e)=>{if(e.startsWith("hydra"))return p.bold(e);if(e==="USAGE"||e==="OPTIONS"||e==="EXAMPLES")return p.bold(e);if(e.startsWith(" -")){let s=e.match(/^(\s+-\w,\s--\w+)\s+(.+)$/);if(s){let[,i="",n=""]=s,a=n.replace("(required)",p.red("(required)")).replace(/\(default: ([^)]+)\)/g,(c,l)=>p.dim(`(default: ${l})`)).replace(/\[boolean\]/g,p.cyan("[boolean]")).replace(/\[string\]/g,p.green("[string]")).replace(/\[number\]/g,p.magenta("[number]"));return` ${p.yellow(i.padEnd(26))} ${a}`}}if(e.startsWith(" # "))return p.dim(e);if(e.startsWith(" hydra"))return` ${p.cyan(e.trim())}`;return e}).join(`
|
|
156
|
+
`);console.info(o);return}console.info(`
|
|
157
|
+
${p.bold("Hydra - GitHub self-hosted runner manager")}
|
|
1709
158
|
|
|
1710
|
-
${
|
|
159
|
+
${p.bold("USAGE")}
|
|
1711
160
|
hydra <command> [options]
|
|
1712
161
|
|
|
1713
|
-
${
|
|
1714
|
-
${
|
|
1715
|
-
${
|
|
1716
|
-
${
|
|
1717
|
-
${
|
|
1718
|
-
${
|
|
1719
|
-
${
|
|
1720
|
-
|
|
1721
|
-
Use ${
|
|
1722
|
-
`);
|
|
1723
|
-
}
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
async function
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
initialValue: false,
|
|
1737
|
-
message: `Configuration file ${configFileName} already exists. Overwrite?`
|
|
1738
|
-
});
|
|
1739
|
-
if (pD(overwrite) || !overwrite) {
|
|
1740
|
-
xe("Configuration cancelled");
|
|
1741
|
-
process.exit(0);
|
|
1742
|
-
}
|
|
1743
|
-
}
|
|
1744
|
-
Ie(colors.cyan("\uD83D\uDE80 Hydra Configuration Setup"));
|
|
1745
|
-
console.info(colors.dim("This will create a configuration file with your runner settings."));
|
|
1746
|
-
console.info(colors.dim(`You can always edit the file later or create additional profiles.
|
|
1747
|
-
`));
|
|
1748
|
-
const answers = await Ce({
|
|
1749
|
-
profileName: () => he({ message: "Profile name?", placeholder: "default" }),
|
|
1750
|
-
directory: () => he({
|
|
1751
|
-
defaultValue: "./gh-runners",
|
|
1752
|
-
message: "Directory to store runners?",
|
|
1753
|
-
placeholder: "./gh-runners"
|
|
1754
|
-
}),
|
|
1755
|
-
name: () => he({ defaultValue: "runner", message: "Runner name prefix?", placeholder: "runner" }),
|
|
1756
|
-
labels: ({ results }) => {
|
|
1757
|
-
const placeholder = results.name || "runner";
|
|
1758
|
-
return he({
|
|
1759
|
-
defaultValue: placeholder,
|
|
1760
|
-
message: "Runner labels (comma-separated)?",
|
|
1761
|
-
placeholder
|
|
1762
|
-
});
|
|
1763
|
-
},
|
|
1764
|
-
numberOfMachines: () => he({
|
|
1765
|
-
defaultValue: "1",
|
|
1766
|
-
message: "Number of runner machines?",
|
|
1767
|
-
placeholder: "1",
|
|
1768
|
-
validate: (value) => {
|
|
1769
|
-
const num = Number.parseInt(value, 10);
|
|
1770
|
-
if (Number.isNaN(num) || num < 1)
|
|
1771
|
-
return "Please enter a valid number greater than 0";
|
|
1772
|
-
return;
|
|
1773
|
-
}
|
|
1774
|
-
}),
|
|
1775
|
-
url: () => he({
|
|
1776
|
-
message: "GitHub repository or organization URL? (optional)",
|
|
1777
|
-
placeholder: "https://github.com/org/repo"
|
|
1778
|
-
})
|
|
1779
|
-
}, {
|
|
1780
|
-
onCancel: () => {
|
|
1781
|
-
xe("Configuration cancelled");
|
|
1782
|
-
process.exit(0);
|
|
1783
|
-
}
|
|
1784
|
-
});
|
|
1785
|
-
const { profileName, labels, numberOfMachines, ...profile } = answers;
|
|
1786
|
-
const config = {
|
|
1787
|
-
defaultProfile: profileName,
|
|
1788
|
-
profiles: {
|
|
1789
|
-
[profileName]: {
|
|
1790
|
-
...profile,
|
|
1791
|
-
labels,
|
|
1792
|
-
numberOfMachines: Number.parseInt(numberOfMachines, 10),
|
|
1793
|
-
os: "osx",
|
|
1794
|
-
overwrite: false,
|
|
1795
|
-
run: false
|
|
1796
|
-
}
|
|
1797
|
-
}
|
|
1798
|
-
};
|
|
1799
|
-
const content = JSON.stringify(config, null, 2);
|
|
1800
|
-
await Bun.write(configPath, content);
|
|
1801
|
-
await gracefulTry(async () => {
|
|
1802
|
-
await $4`chmod 600 ${configPath}`.quiet();
|
|
1803
|
-
}, { logLevel: "warn", message: "Could not set secure file permissions" });
|
|
1804
|
-
Se(colors.green(`\u2713 Configuration saved to ${configFileName}`));
|
|
1805
|
-
console.info(`
|
|
1806
|
-
Example usage:`);
|
|
1807
|
-
console.info(colors.cyan(` hydra create -p ${profileName} --token YOUR_TOKEN${answers.url ? "" : " --url REPO_URL"}`));
|
|
1808
|
-
console.info(`
|
|
1809
|
-
You can add more profiles by editing the configuration file.`);
|
|
1810
|
-
if (answers.url) {
|
|
1811
|
-
await openGitHubSettings(answers.url);
|
|
1812
|
-
}
|
|
1813
|
-
}
|
|
1814
|
-
async function openGitHubSettings(url2) {
|
|
1815
|
-
const githubRegex = /github\.com[:/]([^/]+)(?:\/([^/.]+))?/;
|
|
1816
|
-
const match = url2.match(githubRegex);
|
|
1817
|
-
if (!match)
|
|
1818
|
-
return;
|
|
1819
|
-
const [, orgOrOwner, repo] = match;
|
|
1820
|
-
const repoUrl = repo ? `${orgOrOwner}/${repo}` : `organizations/${orgOrOwner}`;
|
|
1821
|
-
const settingsUrl = `https://github.com/${repoUrl}/settings/actions/runners`;
|
|
1822
|
-
console.info(`
|
|
1823
|
-
Opening GitHub settings: ${colors.cyan(settingsUrl)}`);
|
|
1824
|
-
await gracefulTry(async () => {
|
|
1825
|
-
await $4`open ${settingsUrl}`.quiet();
|
|
1826
|
-
}, {
|
|
1827
|
-
fallback: async () => {
|
|
1828
|
-
await gracefulTry(async () => {
|
|
1829
|
-
await $4`xdg-open ${settingsUrl}`.quiet();
|
|
1830
|
-
}, {
|
|
1831
|
-
fallback: () => {
|
|
1832
|
-
console.info(`
|
|
1833
|
-
Please open the URL manually to add a new runner token.`);
|
|
1834
|
-
},
|
|
1835
|
-
logLevel: "info",
|
|
1836
|
-
message: "Alternative browser open method also failed"
|
|
1837
|
-
});
|
|
1838
|
-
},
|
|
1839
|
-
logLevel: "info",
|
|
1840
|
-
message: "Could not open browser automatically"
|
|
1841
|
-
});
|
|
1842
|
-
}
|
|
1843
|
-
function getArgs2() {
|
|
1844
|
-
const { values } = parseArgs2({
|
|
1845
|
-
allowPositionals: true,
|
|
1846
|
-
args: Bun.argv,
|
|
1847
|
-
options: { toml: { default: false, short: "t", type: "boolean" } },
|
|
1848
|
-
strict: true
|
|
1849
|
-
});
|
|
1850
|
-
return values;
|
|
1851
|
-
}
|
|
1852
|
-
|
|
1853
|
-
// src/methods/removeMachines.ts
|
|
1854
|
-
import { parseArgs as parseArgs3 } from "util";
|
|
1855
|
-
var {$: $5 } = globalThis.Bun;
|
|
1856
|
-
var logger4 = createLogger({ prefix: "removeMachines" });
|
|
1857
|
-
async function removeMachines() {
|
|
1858
|
-
const args = await getArgs3();
|
|
1859
|
-
const { directory, numberOfMachines, force } = args;
|
|
1860
|
-
let { token, url: url2 } = args;
|
|
1861
|
-
const machinesDir = `${directory}/machines`;
|
|
1862
|
-
const directoryExists = await Bun.file(machinesDir).exists();
|
|
1863
|
-
if (!directoryExists) {
|
|
1864
|
-
throw new Error(`Machines directory not found at ${machinesDir}. Nothing to remove.`);
|
|
1865
|
-
}
|
|
1866
|
-
if (!token && !force) {
|
|
1867
|
-
if (!url2) {
|
|
1868
|
-
console.warn(colors.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub."));
|
|
1869
|
-
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1870
|
-
throw new Error("Token (-t) and URL (-u) parameters are required or use --force");
|
|
1871
|
-
}
|
|
1872
|
-
const settingsUrl = constructRunnerSettingsUrl2(url2);
|
|
1873
|
-
const shouldOpen = await ye({
|
|
1874
|
-
message: `No token provided. Would you like to open GitHub to get a runner token for unregistration?
|
|
1875
|
-
${settingsUrl}`
|
|
1876
|
-
});
|
|
1877
|
-
if (pD(shouldOpen) || !shouldOpen) {
|
|
1878
|
-
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1879
|
-
throw new Error("Token is required to unregister runners (or use --force)");
|
|
1880
|
-
}
|
|
1881
|
-
logger4.info("Opening GitHub runner settings...");
|
|
1882
|
-
await $5`open ${settingsUrl}`.quiet();
|
|
1883
|
-
const tokenInput = await he({
|
|
1884
|
-
message: "Enter the runner removal token:",
|
|
1885
|
-
placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
1886
|
-
validate: (value) => {
|
|
1887
|
-
if (!value || value.trim().length === 0) {
|
|
1888
|
-
return "Token is required";
|
|
1889
|
-
}
|
|
1890
|
-
return;
|
|
1891
|
-
}
|
|
1892
|
-
});
|
|
1893
|
-
if (pD(tokenInput)) {
|
|
1894
|
-
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1895
|
-
throw new Error("Token is required to unregister runners (or use --force)");
|
|
1896
|
-
}
|
|
1897
|
-
token = tokenInput.trim();
|
|
1898
|
-
}
|
|
1899
|
-
if (token && url2) {
|
|
1900
|
-
console.info(colors.cyan("Unregistering runners from GitHub..."));
|
|
1901
|
-
await unregisterRunners({ directory, numberOfMachines, token });
|
|
1902
|
-
} else if (!force) {
|
|
1903
|
-
console.warn(colors.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub."));
|
|
1904
|
-
console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
|
|
1905
|
-
throw new Error("Token (-t) and URL (-u) parameters are required or use --force");
|
|
1906
|
-
}
|
|
1907
|
-
await removeRunnerDirectories({ directory, numberOfMachines });
|
|
1908
|
-
console.info(colors.green("\u2713 Runners successfully removed"));
|
|
1909
|
-
}
|
|
1910
|
-
async function getArgs3() {
|
|
1911
|
-
const { values } = parseArgs3({
|
|
1912
|
-
allowPositionals: true,
|
|
1913
|
-
args: Bun.argv,
|
|
1914
|
-
options: {
|
|
1915
|
-
config: { short: "c", type: "string" },
|
|
1916
|
-
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
1917
|
-
force: { default: false, short: "f", type: "boolean" },
|
|
1918
|
-
numberOfMachines: { default: "1", short: "m", type: "string" },
|
|
1919
|
-
profile: { short: "p", type: "string" },
|
|
1920
|
-
token: { short: "t", type: "string" },
|
|
1921
|
-
url: { short: "u", type: "string" }
|
|
1922
|
-
},
|
|
1923
|
-
strict: true
|
|
1924
|
-
});
|
|
1925
|
-
const config = await loadConfig({ configPath: values.config });
|
|
1926
|
-
const profile = await getProfile(config, values.profile);
|
|
1927
|
-
const baseArgs = {
|
|
1928
|
-
directory: values.directory,
|
|
1929
|
-
force: values.force,
|
|
1930
|
-
numberOfMachines: values.numberOfMachines,
|
|
1931
|
-
token: values.token,
|
|
1932
|
-
url: values.url
|
|
1933
|
-
};
|
|
1934
|
-
if (profile) {
|
|
1935
|
-
return {
|
|
1936
|
-
directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
|
|
1937
|
-
force: baseArgs.force,
|
|
1938
|
-
numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
|
|
1939
|
-
token: baseArgs.token,
|
|
1940
|
-
url: baseArgs.url ?? profile.url
|
|
1941
|
-
};
|
|
1942
|
-
}
|
|
1943
|
-
return baseArgs;
|
|
1944
|
-
}
|
|
1945
|
-
async function unregisterRunners({
|
|
1946
|
-
directory,
|
|
1947
|
-
numberOfMachines,
|
|
1948
|
-
token
|
|
1949
|
-
}) {
|
|
1950
|
-
const log = logger4.child("unregister");
|
|
1951
|
-
const numMachines = Number(numberOfMachines);
|
|
1952
|
-
const cpuCount = (() => {
|
|
1953
|
-
try {
|
|
1954
|
-
const result = Bun.spawnSync(["nproc"]);
|
|
1955
|
-
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1956
|
-
} catch {
|
|
1957
|
-
try {
|
|
1958
|
-
const result = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"]);
|
|
1959
|
-
return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
|
|
1960
|
-
} catch {
|
|
1961
|
-
return 4;
|
|
1962
|
-
}
|
|
1963
|
-
}
|
|
1964
|
-
})();
|
|
1965
|
-
const concurrency = Math.min(Math.max(2, Math.floor(cpuCount / 2)), numMachines, 8);
|
|
1966
|
-
log.info(`Unregistering ${numMachines} runners with concurrency of ${concurrency}`);
|
|
1967
|
-
const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
|
|
1968
|
-
execute: async () => {
|
|
1969
|
-
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
1970
|
-
const machineExists = await Bun.file(machineDirectory).exists();
|
|
1971
|
-
if (!machineExists) {
|
|
1972
|
-
log.debug(`Machine ${runnerIndex} doesn't exist, skipping...`);
|
|
1973
|
-
return { runnerIndex, status: "skipped" };
|
|
1974
|
-
}
|
|
1975
|
-
try {
|
|
1976
|
-
log.debug(`Unregistering machine ${runnerIndex}...`);
|
|
1977
|
-
await $5`${machineDirectory}/config.sh remove --token ${token}`.quiet();
|
|
1978
|
-
log.info(`Successfully unregistered machine ${runnerIndex} from GitHub`);
|
|
1979
|
-
return { runnerIndex, status: "success" };
|
|
1980
|
-
} catch (error2) {
|
|
1981
|
-
log.warn(`Unable to unregister machine ${runnerIndex}: ${error2}`);
|
|
1982
|
-
return { error: error2, runnerIndex, status: "failed" };
|
|
1983
|
-
}
|
|
1984
|
-
},
|
|
1985
|
-
runnerIndex
|
|
1986
|
-
}));
|
|
1987
|
-
const results = [];
|
|
1988
|
-
for (let i = 0;i < tasks.length; i += concurrency) {
|
|
1989
|
-
const batch = tasks.slice(i, i + concurrency);
|
|
1990
|
-
const batchResults = await Promise.allSettled(batch.map((task) => task.execute()));
|
|
1991
|
-
results.push(...batchResults);
|
|
1992
|
-
}
|
|
1993
|
-
const successful = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "success").length;
|
|
1994
|
-
const failed = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "failed").length;
|
|
1995
|
-
const skipped = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "skipped").length;
|
|
1996
|
-
log.info(`Unregistration complete: ${successful} successful, ${failed} failed, ${skipped} skipped`);
|
|
1997
|
-
}
|
|
1998
|
-
async function removeRunnerDirectories({
|
|
1999
|
-
directory,
|
|
2000
|
-
numberOfMachines
|
|
2001
|
-
}) {
|
|
2002
|
-
const log = logger4.child("removeDirectories");
|
|
2003
|
-
const numMachines = Number(numberOfMachines);
|
|
2004
|
-
const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
|
|
2005
|
-
execute: async () => {
|
|
2006
|
-
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
2007
|
-
const machineExists = await Bun.file(machineDirectory).exists();
|
|
2008
|
-
if (!machineExists) {
|
|
2009
|
-
return { runnerIndex, status: "skipped" };
|
|
2010
|
-
}
|
|
2011
|
-
try {
|
|
2012
|
-
await $5`rm -rf ${machineDirectory}`.quiet();
|
|
2013
|
-
log.debug(`Removed machine ${runnerIndex} directory`);
|
|
2014
|
-
return { runnerIndex, status: "success" };
|
|
2015
|
-
} catch (error2) {
|
|
2016
|
-
log.error(`Error removing machine ${runnerIndex} directory: ${error2}`);
|
|
2017
|
-
return { error: error2, runnerIndex, status: "failed" };
|
|
2018
|
-
}
|
|
2019
|
-
},
|
|
2020
|
-
runnerIndex
|
|
2021
|
-
}));
|
|
2022
|
-
const results = await Promise.allSettled(tasks.map((task) => task.execute()));
|
|
2023
|
-
const successful = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "success").length;
|
|
2024
|
-
const failed = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "failed").length;
|
|
2025
|
-
log.info(`Directory removal complete: ${successful} removed, ${failed} failed`);
|
|
2026
|
-
if (failed > 0) {
|
|
2027
|
-
throw new Error(`Failed to remove ${failed} runner directories`);
|
|
2028
|
-
}
|
|
2029
|
-
try {
|
|
2030
|
-
const machinesDir = `${directory}/machines`;
|
|
2031
|
-
const files = (await $5`ls -A ${machinesDir}`.text()).trim();
|
|
2032
|
-
if (!files) {
|
|
2033
|
-
await $5`rm -rf ${machinesDir}`.quiet();
|
|
2034
|
-
const parentFiles = (await $5`ls -A ${directory}`.text()).trim();
|
|
2035
|
-
if (!parentFiles) {
|
|
2036
|
-
await $5`rm -rf ${directory}`.quiet();
|
|
2037
|
-
}
|
|
2038
|
-
console.info(colors.green(`\u2713 Removed empty directories`));
|
|
2039
|
-
}
|
|
2040
|
-
} catch (_error) {}
|
|
2041
|
-
}
|
|
2042
|
-
function constructRunnerSettingsUrl2(url2) {
|
|
2043
|
-
try {
|
|
2044
|
-
const parsedUrl = new URL(url2);
|
|
2045
|
-
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
2046
|
-
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
|
|
2047
|
-
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2048
|
-
return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners`;
|
|
2049
|
-
} else if (pathParts.length >= 2) {
|
|
2050
|
-
return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners`;
|
|
2051
|
-
}
|
|
2052
|
-
} else {
|
|
2053
|
-
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2054
|
-
return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners`;
|
|
2055
|
-
} else if (pathParts.length >= 2) {
|
|
2056
|
-
return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners`;
|
|
2057
|
-
}
|
|
2058
|
-
}
|
|
2059
|
-
return url2;
|
|
2060
|
-
} catch {
|
|
2061
|
-
return url2;
|
|
2062
|
-
}
|
|
2063
|
-
}
|
|
2064
|
-
|
|
2065
|
-
// src/methods/runMachines.ts
|
|
2066
|
-
import { parseArgs as parseArgs4 } from "util";
|
|
2067
|
-
var {$: $6 } = globalThis.Bun;
|
|
2068
|
-
var logger5 = createLogger({ prefix: "runMachines" });
|
|
2069
|
-
async function runMachines() {
|
|
2070
|
-
const args = await getArgs4();
|
|
2071
|
-
const { directory, numberOfMachines, name, labels, runnerGroup } = args;
|
|
2072
|
-
let { token, url: url2 } = args;
|
|
2073
|
-
if (!url2) {
|
|
2074
|
-
throw new Error("URL (-u) parameter is required");
|
|
2075
|
-
}
|
|
2076
|
-
if (!token) {
|
|
2077
|
-
const settingsUrl = constructRunnerSettingsUrl3(url2);
|
|
2078
|
-
const shouldOpen = await ye({
|
|
2079
|
-
message: `No token provided. Would you like to open GitHub to get a runner token?
|
|
2080
|
-
${settingsUrl}`
|
|
2081
|
-
});
|
|
2082
|
-
if (pD(shouldOpen) || !shouldOpen) {
|
|
2083
|
-
throw new Error("Token is required to run machines");
|
|
2084
|
-
}
|
|
2085
|
-
logger5.info("Opening GitHub runner settings...");
|
|
2086
|
-
await $6`open ${settingsUrl}`.quiet();
|
|
2087
|
-
const tokenInput = await he({
|
|
2088
|
-
message: "Enter the runner registration token:",
|
|
2089
|
-
placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
2090
|
-
validate: (value) => {
|
|
2091
|
-
if (!value || value.trim().length === 0) {
|
|
2092
|
-
return "Token is required";
|
|
2093
|
-
}
|
|
2094
|
-
return;
|
|
2095
|
-
}
|
|
2096
|
-
});
|
|
2097
|
-
if (pD(tokenInput)) {
|
|
2098
|
-
throw new Error("Token is required to run machines");
|
|
2099
|
-
}
|
|
2100
|
-
token = tokenInput.trim();
|
|
2101
|
-
}
|
|
2102
|
-
logger5.info(`Starting ${numberOfMachines} runners from ${directory}`);
|
|
2103
|
-
logger5.debug(`Name: ${name}, Labels: ${labels || "none"}`);
|
|
2104
|
-
const directoryExists = await Bun.file(`${directory}/machines`).exists();
|
|
2105
|
-
if (!directoryExists) {
|
|
2106
|
-
throw new Error(`Machines directory not found at ${directory}/machines. Run 'hydra create' first.`);
|
|
2107
|
-
}
|
|
2108
|
-
await startRunners2({ directory, labels, name, numberOfMachines, runnerGroup, token, url: url2 });
|
|
2109
|
-
}
|
|
2110
|
-
async function getArgs4() {
|
|
2111
|
-
const { values } = parseArgs4({
|
|
2112
|
-
allowPositionals: true,
|
|
2113
|
-
args: Bun.argv,
|
|
2114
|
-
options: {
|
|
2115
|
-
config: { short: "c", type: "string" },
|
|
2116
|
-
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
2117
|
-
labels: { short: "l", type: "string" },
|
|
2118
|
-
name: { default: "runner", short: "n", type: "string" },
|
|
2119
|
-
numberOfMachines: { default: "1", short: "m", type: "string" },
|
|
2120
|
-
profile: { short: "p", type: "string" },
|
|
2121
|
-
runnerGroup: { short: "g", type: "string" },
|
|
2122
|
-
token: { short: "t", type: "string" },
|
|
2123
|
-
url: { short: "u", type: "string" }
|
|
2124
|
-
},
|
|
2125
|
-
strict: true
|
|
2126
|
-
});
|
|
2127
|
-
const config = await loadConfig({ configPath: values.config });
|
|
2128
|
-
const profile = await getProfile(config, values.profile);
|
|
2129
|
-
const baseArgs = {
|
|
2130
|
-
directory: values.directory,
|
|
2131
|
-
labels: values.labels,
|
|
2132
|
-
name: values.name,
|
|
2133
|
-
numberOfMachines: values.numberOfMachines,
|
|
2134
|
-
runnerGroup: values.runnerGroup,
|
|
2135
|
-
token: values.token,
|
|
2136
|
-
url: values.url
|
|
2137
|
-
};
|
|
2138
|
-
if (profile) {
|
|
2139
|
-
return {
|
|
2140
|
-
directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
|
|
2141
|
-
labels: baseArgs.labels ?? profile.labels,
|
|
2142
|
-
name: baseArgs.name ?? profile.name ?? "runner",
|
|
2143
|
-
numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
|
|
2144
|
-
runnerGroup: baseArgs.runnerGroup ?? profile.runnerGroup,
|
|
2145
|
-
token: baseArgs.token,
|
|
2146
|
-
url: baseArgs.url ?? profile.url
|
|
2147
|
-
};
|
|
2148
|
-
}
|
|
2149
|
-
return baseArgs;
|
|
2150
|
-
}
|
|
2151
|
-
async function startRunners2({
|
|
2152
|
-
directory,
|
|
2153
|
-
numberOfMachines,
|
|
2154
|
-
token,
|
|
2155
|
-
url: url2,
|
|
2156
|
-
name,
|
|
2157
|
-
labels,
|
|
2158
|
-
runnerGroup
|
|
2159
|
-
}) {
|
|
2160
|
-
logger5.info(`Starting ${numberOfMachines} workers...`);
|
|
2161
|
-
for (let runnerIndex = 1;runnerIndex <= Number(numberOfMachines); runnerIndex++) {
|
|
2162
|
-
const machineDirectory = `${directory}/machines/${runnerIndex}`;
|
|
2163
|
-
const machineExists = await Bun.file(machineDirectory).exists();
|
|
2164
|
-
if (!machineExists) {
|
|
2165
|
-
logger5.warn(`Machine ${runnerIndex} doesn't exist, skipping...`);
|
|
2166
|
-
continue;
|
|
2167
|
-
}
|
|
2168
|
-
const workerPath = `${getPackagePath()}/src/runner-worker.ts`;
|
|
2169
|
-
const workerName = `${name}-${runnerIndex}`;
|
|
2170
|
-
const worker = new Worker(workerPath, { name: workerName, ref: true });
|
|
2171
|
-
worker.addEventListener("message", ({ data }) => {
|
|
2172
|
-
const level = data.type === "error" ? "error" : "info";
|
|
2173
|
-
logger5[level](`${workerName}: ${data.message}`);
|
|
2174
|
-
});
|
|
2175
|
-
worker.addEventListener("error", (error2) => {
|
|
2176
|
-
logger5.error(`Worker ${workerName} error:`, error2);
|
|
2177
|
-
});
|
|
2178
|
-
worker.addEventListener("exit", (code) => {
|
|
2179
|
-
logger5.info(`Worker ${workerName} exited with code ${code}`);
|
|
2180
|
-
});
|
|
2181
|
-
worker.postMessage({
|
|
2182
|
-
index: runnerIndex,
|
|
2183
|
-
labels,
|
|
2184
|
-
machineCwd: machineDirectory,
|
|
2185
|
-
name,
|
|
2186
|
-
runnerGroup,
|
|
2187
|
-
token,
|
|
2188
|
-
url: url2
|
|
2189
|
-
});
|
|
2190
|
-
logger5.info(`Worker ${workerName} starting...`);
|
|
2191
|
-
workerManager.add(worker);
|
|
2192
|
-
}
|
|
2193
|
-
logger5.info("All workers started. Press Ctrl+C to stop all machines");
|
|
2194
|
-
}
|
|
2195
|
-
function constructRunnerSettingsUrl3(url2) {
|
|
2196
|
-
try {
|
|
2197
|
-
const parsedUrl = new URL(url2);
|
|
2198
|
-
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
2199
|
-
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
|
|
2200
|
-
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2201
|
-
return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
2202
|
-
} else if (pathParts.length >= 2) {
|
|
2203
|
-
return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
2204
|
-
}
|
|
2205
|
-
} else {
|
|
2206
|
-
if (pathParts[0] === "orgs" && pathParts[1]) {
|
|
2207
|
-
return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners/new`;
|
|
2208
|
-
} else if (pathParts.length >= 2) {
|
|
2209
|
-
return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
|
|
2210
|
-
}
|
|
2211
|
-
}
|
|
2212
|
-
return url2;
|
|
2213
|
-
} catch {
|
|
2214
|
-
return url2;
|
|
2215
|
-
}
|
|
2216
|
-
}
|
|
2217
|
-
|
|
2218
|
-
// src/methods/status.ts
|
|
2219
|
-
import { parseArgs as parseArgs5 } from "util";
|
|
2220
|
-
var {$: $7 } = globalThis.Bun;
|
|
2221
|
-
async function status() {
|
|
2222
|
-
const args = await getArgs5();
|
|
2223
|
-
const { directory, token, url: url2, json } = args;
|
|
2224
|
-
if (!token || !url2) {
|
|
2225
|
-
throw new Error("Token (-t) and URL (-u) parameters are required");
|
|
2226
|
-
}
|
|
2227
|
-
const statusSpinner = Y2();
|
|
2228
|
-
statusSpinner.start("Fetching runner status...");
|
|
2229
|
-
try {
|
|
2230
|
-
const localRunners = await getLocalRunners(directory);
|
|
2231
|
-
const githubRunners = await fetchGitHubRunners(url2, token);
|
|
2232
|
-
const runnerStatuses = combineRunnerStatus(localRunners, githubRunners);
|
|
2233
|
-
statusSpinner.stop("Runner status fetched");
|
|
2234
|
-
if (json) {
|
|
2235
|
-
console.log(JSON.stringify(runnerStatuses, null, 2));
|
|
2236
|
-
} else {
|
|
2237
|
-
displayRunnerStatus(runnerStatuses);
|
|
2238
|
-
}
|
|
2239
|
-
} catch (error2) {
|
|
2240
|
-
statusSpinner.stop("Failed to fetch runner status");
|
|
2241
|
-
throw error2;
|
|
2242
|
-
}
|
|
2243
|
-
}
|
|
2244
|
-
async function getArgs5() {
|
|
2245
|
-
const { values } = parseArgs5({
|
|
2246
|
-
allowPositionals: true,
|
|
2247
|
-
args: Bun.argv,
|
|
2248
|
-
options: {
|
|
2249
|
-
config: { short: "c", type: "string" },
|
|
2250
|
-
directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
|
|
2251
|
-
json: { default: false, short: "j", type: "boolean" },
|
|
2252
|
-
profile: { short: "p", type: "string" },
|
|
2253
|
-
token: { short: "t", type: "string" },
|
|
2254
|
-
url: { short: "u", type: "string" }
|
|
2255
|
-
},
|
|
2256
|
-
strict: true
|
|
2257
|
-
});
|
|
2258
|
-
const config = await loadConfig({ configPath: values.config });
|
|
2259
|
-
const profile = await getProfile(config, values.profile);
|
|
2260
|
-
return {
|
|
2261
|
-
directory: values.directory || profile?.directory || `${process.cwd()}/gh-runners`,
|
|
2262
|
-
json: values.json,
|
|
2263
|
-
token: values.token,
|
|
2264
|
-
url: values.url || profile?.url
|
|
2265
|
-
};
|
|
2266
|
-
}
|
|
2267
|
-
async function getLocalRunners(directory) {
|
|
2268
|
-
const machinesDir = `${directory}/machines`;
|
|
2269
|
-
const result = await gracefulTry(async () => {
|
|
2270
|
-
const output = await $7`ls ${machinesDir} 2>/dev/null || true`.quiet();
|
|
2271
|
-
return output.stdout.toString().trim().split(`
|
|
2272
|
-
`).filter(Boolean);
|
|
2273
|
-
}, { fallback: () => {}, logLevel: "debug", message: "No local runners found" });
|
|
2274
|
-
return result || [];
|
|
2275
|
-
}
|
|
2276
|
-
async function fetchGitHubRunners(url2, token) {
|
|
2277
|
-
const match = url2.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);
|
|
2278
|
-
if (!match) {
|
|
2279
|
-
throw new Error("Invalid GitHub URL");
|
|
2280
|
-
}
|
|
2281
|
-
const [, orgOrOwner, repo] = match;
|
|
2282
|
-
const apiUrl = repo ? `https://api.github.com/repos/${orgOrOwner}/${repo}/actions/runners` : `https://api.github.com/orgs/${orgOrOwner}/actions/runners`;
|
|
2283
|
-
return withRetry(async () => {
|
|
2284
|
-
const headers = {
|
|
2285
|
-
Accept: "application/vnd.github.v3+json",
|
|
2286
|
-
Authorization: `Bearer ${token}`
|
|
2287
|
-
};
|
|
2288
|
-
const response = await fetch(apiUrl, { headers });
|
|
2289
|
-
if (!response.ok) {
|
|
2290
|
-
throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
|
|
2291
|
-
}
|
|
2292
|
-
const data = await response.json();
|
|
2293
|
-
return data;
|
|
2294
|
-
}, {
|
|
2295
|
-
onRetry: (attempt, error2) => {
|
|
2296
|
-
M2.warn(`Retrying GitHub API call (attempt ${attempt}): ${error2.message}`);
|
|
2297
|
-
}
|
|
2298
|
-
});
|
|
2299
|
-
}
|
|
2300
|
-
function combineRunnerStatus(localRunners, githubData) {
|
|
2301
|
-
const statuses = [];
|
|
2302
|
-
const githubRunnerMap = new Map(githubData.runners.map((runner) => [runner.name, runner]));
|
|
2303
|
-
for (const runnerDir of localRunners) {
|
|
2304
|
-
const runnerName = `runner-${runnerDir}`;
|
|
2305
|
-
const githubRunner = githubRunnerMap.get(runnerName);
|
|
2306
|
-
if (githubRunner) {
|
|
2307
|
-
statuses.push({
|
|
2308
|
-
busy: githubRunner.busy,
|
|
2309
|
-
labels: githubRunner.labels.map((l2) => l2.name),
|
|
2310
|
-
name: runnerName,
|
|
2311
|
-
os: githubRunner.os,
|
|
2312
|
-
status: githubRunner.busy ? "busy" : githubRunner.status === "online" ? "online" : "offline"
|
|
2313
|
-
});
|
|
2314
|
-
} else {
|
|
2315
|
-
statuses.push({
|
|
2316
|
-
busy: false,
|
|
2317
|
-
labels: [],
|
|
2318
|
-
name: runnerName,
|
|
2319
|
-
os: "unknown",
|
|
2320
|
-
status: "offline"
|
|
2321
|
-
});
|
|
2322
|
-
}
|
|
2323
|
-
}
|
|
2324
|
-
return statuses;
|
|
2325
|
-
}
|
|
2326
|
-
function displayRunnerStatus(statuses) {
|
|
2327
|
-
if (statuses.length === 0) {
|
|
2328
|
-
M2.info("No runners found");
|
|
2329
|
-
return;
|
|
2330
|
-
}
|
|
2331
|
-
console.log(`
|
|
2332
|
-
${colors.bold("Runner Status:")}`);
|
|
2333
|
-
console.log("\u2500".repeat(80));
|
|
2334
|
-
const statusColors = { busy: colors.yellow, offline: colors.red, online: colors.green };
|
|
2335
|
-
for (const runner of statuses) {
|
|
2336
|
-
const statusColor = statusColors[runner.status];
|
|
2337
|
-
const statusText = runner.status.toUpperCase().padEnd(7);
|
|
2338
|
-
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(", ")}`) : ""}`);
|
|
2339
|
-
}
|
|
2340
|
-
console.log("\u2500".repeat(80));
|
|
2341
|
-
const summary = {
|
|
2342
|
-
busy: statuses.filter((r2) => r2.status === "busy").length,
|
|
2343
|
-
offline: statuses.filter((r2) => r2.status === "offline").length,
|
|
2344
|
-
online: statuses.filter((r2) => r2.status === "online").length,
|
|
2345
|
-
total: statuses.length
|
|
2346
|
-
};
|
|
2347
|
-
console.log(`
|
|
2348
|
-
${colors.bold("Summary:")} ` + `Total: ${summary.total} | ` + `${colors.green(`Online: ${summary.online}`)} | ` + `${colors.yellow(`Busy: ${summary.busy}`)} | ` + `${colors.red(`Offline: ${summary.offline}`)}
|
|
2349
|
-
`);
|
|
2350
|
-
}
|
|
2351
|
-
|
|
2352
|
-
// src/cli.ts
|
|
2353
|
-
var COMMANDS = ["init", "create", "run", "remove", "status", "help"];
|
|
2354
|
-
var COMMON_MISTAKES = {
|
|
2355
|
-
c: "create",
|
|
2356
|
-
ceate: "create",
|
|
2357
|
-
craete: "create",
|
|
2358
|
-
cretae: "create",
|
|
2359
|
-
del: "remove",
|
|
2360
|
-
delete: "remove",
|
|
2361
|
-
h: "help",
|
|
2362
|
-
i: "init",
|
|
2363
|
-
info: "status",
|
|
2364
|
-
initialise: "init",
|
|
2365
|
-
inti: "init",
|
|
2366
|
-
intialize: "init",
|
|
2367
|
-
list: "status",
|
|
2368
|
-
ls: "status",
|
|
2369
|
-
new: "create",
|
|
2370
|
-
r: "run",
|
|
2371
|
-
remvoe: "remove",
|
|
2372
|
-
rm: "remove",
|
|
2373
|
-
rmove: "remove",
|
|
2374
|
-
rnu: "run",
|
|
2375
|
-
runn: "run",
|
|
2376
|
-
s: "status",
|
|
2377
|
-
start: "run",
|
|
2378
|
-
stat: "status",
|
|
2379
|
-
stop: "remove",
|
|
2380
|
-
sttaus: "status",
|
|
2381
|
-
t: "troubleshoot"
|
|
2382
|
-
};
|
|
2383
|
-
async function main() {
|
|
2384
|
-
try {
|
|
2385
|
-
const [, , commandName, ...args] = process.argv;
|
|
2386
|
-
if (!commandName || commandName === "--help" || commandName === "-h") {
|
|
2387
|
-
help();
|
|
2388
|
-
process.exit(0);
|
|
2389
|
-
}
|
|
2390
|
-
let actualCommand = commandName;
|
|
2391
|
-
if (!COMMANDS.includes(commandName)) {
|
|
2392
|
-
const corrected = checkCommonMistakes(commandName, COMMON_MISTAKES);
|
|
2393
|
-
if (corrected && COMMANDS.includes(corrected)) {
|
|
2394
|
-
actualCommand = corrected;
|
|
2395
|
-
console.log(colors.yellow(`Assuming you meant '${corrected}'
|
|
2396
|
-
`));
|
|
2397
|
-
}
|
|
2398
|
-
}
|
|
2399
|
-
if (!COMMANDS.includes(actualCommand)) {
|
|
2400
|
-
console.error(colors.red(`Unknown command: ${commandName}`));
|
|
2401
|
-
const suggestions = getSuggestions(commandName, COMMANDS);
|
|
2402
|
-
if (suggestions.length > 0) {
|
|
2403
|
-
console.error(`
|
|
2404
|
-
Did you mean one of these?`);
|
|
2405
|
-
for (const suggestion of suggestions) {
|
|
2406
|
-
console.error(` ${colors.cyan(suggestion)}`);
|
|
2407
|
-
}
|
|
2408
|
-
console.error();
|
|
2409
|
-
}
|
|
2410
|
-
help();
|
|
2411
|
-
process.exit(1);
|
|
2412
|
-
}
|
|
2413
|
-
if (args.includes("--help") || args.includes("-h")) {
|
|
2414
|
-
help(actualCommand);
|
|
2415
|
-
process.exit(0);
|
|
2416
|
-
}
|
|
2417
|
-
switch (actualCommand) {
|
|
2418
|
-
case "init":
|
|
2419
|
-
await init();
|
|
2420
|
-
break;
|
|
2421
|
-
case "create":
|
|
2422
|
-
await createMachines();
|
|
2423
|
-
break;
|
|
2424
|
-
case "run":
|
|
2425
|
-
await runMachines();
|
|
2426
|
-
break;
|
|
2427
|
-
case "remove":
|
|
2428
|
-
await removeMachines();
|
|
2429
|
-
break;
|
|
2430
|
-
case "status":
|
|
2431
|
-
await status();
|
|
2432
|
-
break;
|
|
2433
|
-
case "help": {
|
|
2434
|
-
const targetCommand = args[0];
|
|
2435
|
-
help(targetCommand);
|
|
2436
|
-
break;
|
|
2437
|
-
}
|
|
2438
|
-
default:
|
|
2439
|
-
throw new Error(`Unknown command: ${actualCommand}`);
|
|
2440
|
-
}
|
|
2441
|
-
process.exit(0);
|
|
2442
|
-
} catch (error2) {
|
|
2443
|
-
const errorObj = error2 instanceof Error ? error2 : new Error(String(error2));
|
|
2444
|
-
M2.error(errorObj.message);
|
|
2445
|
-
process.exit(1);
|
|
2446
|
-
}
|
|
2447
|
-
}
|
|
2448
|
-
await main();
|
|
2449
|
-
|
|
2450
|
-
//# debugId=B3D0294CB2540FFF64756E2164756E21
|
|
2451
|
-
//# 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+KSB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IGNyZWF0ZVNjaGVtYShzY2hlbWEpO1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHZhbGlkYXRvci5wYXJzZSxcbiAgICBwYXJzZUpTT04oanNvbjogc3RyaW5nKTogVCB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHZhbGlkYXRvci5zYWZlUGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmICghY29uZmlnLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgaXNFcnJvciA9IGNvbmZpZy5lcnJvciBpbnN0YW5jZW9mIEVycm9yO1xuICAgICAgICB0aHJvdyBpc0Vycm9yID8gbmV3IEVycm9yKGBJbnZhbGlkIEpTT046ICR7Y29uZmlnLmVycm9yLm1lc3NhZ2V9YCkgOiBjb25maWcuZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25maWcuZGF0YTtcbiAgICB9LFxuICAgIHNhZmVQYXJzZTogdmFsaWRhdG9yLnNhZmVQYXJzZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsU3RyaW5nKCkge1xuICByZXR1cm4gdW5pb24ob3B0aW9uYWwoKSwgc3RyaW5nKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxCb29sZWFuKCkge1xuICByZXR1cm4gdW5pb24ob3B0aW9uYWwoKSwgYm9vbGVhbigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTdHJpbmcoZGVmYXVsdFZhbHVlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmF1bHRUbyhzdHJpbmcoKSwgZGVmYXVsdFZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRCb29sZWFuKGRlZmF1bHRWYWx1ZTogYm9vbGVhbikge1xuICByZXR1cm4gZGVmYXVsdFRvKGJvb2xlYW4oKSwgZGVmYXVsdFZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRPcHRpb25hbFN0cmluZyhkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gZGVmYXVsdFRvKG9wdGlvbmFsU3RyaW5nKCksIGRlZmF1bHRWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0T3B0aW9uYWxCb29sZWFuKGRlZmF1bHRWYWx1ZTogYm9vbGVhbikge1xuICByZXR1cm4gZGVmYXVsdFRvKG9wdGlvbmFsQm9vbGVhbigpLCBkZWZhdWx0VmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxPYmplY3Q8VD4oc2NoZW1hOiBDYXN0PFQ+KSB7XG4gIHJldHVybiB1bmlvbihvcHRpb25hbCgpLCBzY2hlbWEpO1xufVxuIiwKICAgICJpbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5pbXBvcnQgeyBjb25maXJtLCBpc0NhbmNlbCwgdGV4dCB9IGZyb20gXCJAY2xhY2svcHJvbXB0c1wiO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSBcIkByNW4vY2xpLWNvcmVcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGdldFByb2ZpbGUsIGxvYWRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRQYWNrYWdlUGF0aCB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyB3b3JrZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL2xpYi93b3JrZXItbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVBcmdzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih7IHByZWZpeDogXCJjcmVhdGVNYWNoaW5lc1wiIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWFjaGluZXMoKSB7XG4gIGNvbnN0IGFyZ3MgPSBhd2FpdCBnZXRBcmdzKCk7XG4gIGNvbnN0IHsgb3ZlcndyaXRlLCBkaXJlY3RvcnksIG51bWJlck9mTWFjaGluZXMsIG9zLCBydW4sIG5hbWUsIGxhYmVscywgcnVubmVyR3JvdXAgfSA9IGFyZ3M7XG4gIGxldCB7IHRva2VuLCB1cmwgfSA9IGFyZ3M7XG5cbiAgaWYgKCF1cmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVUkwgKC11KSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoIXRva2VuKSB7XG4gICAgY29uc3Qgc2V0dGluZ3NVcmwgPSBjb25zdHJ1Y3RSdW5uZXJTZXR0aW5nc1VybCh1cmwpO1xuXG4gICAgY29uc3Qgc2hvdWxkT3BlbiA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgbWVzc2FnZTogYE5vIHRva2VuIHByb3ZpZGVkLiBXb3VsZCB5b3UgbGlrZSB0byBvcGVuIEdpdEh1YiB0byBnZXQgYSBydW5uZXIgdG9rZW4/XFxuICAke3NldHRpbmdzVXJsfWAsXG4gICAgfSk7XG5cbiAgICBpZiAoaXNDYW5jZWwoc2hvdWxkT3BlbikgfHwgIXNob3VsZE9wZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBydW5uZXJzXCIpO1xuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKFwiT3BlbmluZyBHaXRIdWIgcnVubmVyIHNldHRpbmdzLi4uXCIpO1xuICAgIGF3YWl0ICRgb3BlbiAke3NldHRpbmdzVXJsfWAucXVpZXQoKTtcblxuICAgIGNvbnN0IHRva2VuSW5wdXQgPSBhd2FpdCB0ZXh0KHtcbiAgICAgIG1lc3NhZ2U6IFwiRW50ZXIgdGhlIHJ1bm5lciByZWdpc3RyYXRpb24gdG9rZW46XCIsXG4gICAgICBwbGFjZWhvbGRlcjogXCJBWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFwiLFxuICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gXCJUb2tlbiBpcyByZXF1aXJlZFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHRva2VuSW5wdXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgcnVubmVyc1wiKTtcbiAgICB9XG5cbiAgICB0b2tlbiA9IHRva2VuSW5wdXQudHJpbSgpO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oYENyZWF0aW5nICR7bnVtYmVyT2ZNYWNoaW5lc30gcnVubmVycyBpbiAke2RpcmVjdG9yeX1gKTtcbiAgbG9nZ2VyLmRlYnVnKGBPUzogJHtvc30sIE5hbWU6ICR7bmFtZX0sIExhYmVsczogJHtsYWJlbHMgfHwgXCJub25lXCJ9YCk7XG5cbiAgY29uc3QgZGlyZWN0b3J5RXhpc3RzID0gYXdhaXQgQnVuLmZpbGUoZGlyZWN0b3J5KS5leGlzdHMoKTtcbiAgaWYgKGRpcmVjdG9yeUV4aXN0cykge1xuICAgIGlmIChvdmVyd3JpdGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBEaXJlY3RvcnkgJHtkaXJlY3Rvcnl9IGV4aXN0cywgcmVtb3ZpbmcuLi5gKTtcbiAgICAgIGF3YWl0ICRgcm0gLXJmICR7ZGlyZWN0b3J5fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5ICR7ZGlyZWN0b3J5fSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bm5lckJhc2UgPSBhd2FpdCBkb3dubG9hZExhdGVzdFJ1bm5lckltYWdlKHsgZGlyZWN0b3J5LCBvcyB9KTtcbiAgYXdhaXQgZXh0cmFjdEFuZENvcHlSdW5uZXJCYXNlKHsgZGlyZWN0b3J5LCBudW1iZXJPZk1hY2hpbmVzLCBvdmVyd3JpdGUsIHJ1bm5lckJhc2UgfSk7XG5cbiAgaWYgKCFydW4pIHtcbiAgICBsb2dnZXIuaW5mbyhcIlJ1bm5lcnMgY3JlYXRlZCBidXQgbm90IHN0YXJ0ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhcnRSdW5uZXJzKHsgZGlyZWN0b3J5LCBsYWJlbHMsIG5hbWUsIG51bWJlck9mTWFjaGluZXMsIHJ1bm5lckdyb3VwLCB0b2tlbiwgdXJsIH0pO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSdW5uZXJTZXR0aW5nc1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBHaXRIdWIgVVJMIGZvcm1hdHNcbiAgICBpZiAocGFyc2VkVXJsLmhvc3RuYW1lID09PSBcImdpdGh1Yi5jb21cIiB8fCBwYXJzZWRVcmwuaG9zdG5hbWUgPT09IFwid3d3LmdpdGh1Yi5jb21cIikge1xuICAgICAgaWYgKHBhdGhQYXJ0c1swXSA9PT0gXCJvcmdzXCIgJiYgcGF0aFBhcnRzWzFdKSB7XG4gICAgICAgIC8vIE9yZ2FuaXphdGlvbiBVUkw6IGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL215b3JnXG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tL29yZ2FuaXphdGlvbnMvJHtwYXRoUGFydHNbMV19L3NldHRpbmdzL2FjdGlvbnMvcnVubmVycy9uZXdgO1xuICAgICAgfSBlbHNlIGlmIChwYXRoUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgLy8gUmVwb3NpdG9yeSBVUkw6IGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvXG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7cGF0aFBhcnRzWzBdfS8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdpdEh1YiBFbnRlcnByaXNlIFVSTFxuICAgICAgaWYgKHBhdGhQYXJ0c1swXSA9PT0gXCJvcmdzXCIgJiYgcGF0aFBhcnRzWzFdKSB7XG4gICAgICAgIHJldHVybiBgJHtwYXJzZWRVcmwub3JpZ2lufS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJldHVybiBgJHtwYXJzZWRVcmwub3JpZ2lufS8ke3BhdGhQYXJ0c1swXX0vJHtwYXRoUGFydHNbMV19L3NldHRpbmdzL2FjdGlvbnMvcnVubmVycy9uZXdgO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIG9yaWdpbmFsIFVSTCBpZiB3ZSBjYW4ndCBwYXJzZSBpdFxuICAgIHJldHVybiB1cmw7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIFVSTCBwYXJzaW5nIGZhaWxzLCByZXR1cm4gdGhlIG9yaWdpbmFsXG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcmdzKCk6IFByb21pc2U8Q3JlYXRlQXJncz4ge1xuICBjb25zdCB7IHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcbiAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIGFyZ3M6IEJ1bi5hcmd2LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNvbmZpZzogeyBzaG9ydDogXCJjXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRpcmVjdG9yeTogeyBkZWZhdWx0OiBgJHtwcm9jZXNzLmN3ZCgpfS9naC1ydW5uZXJzYCwgc2hvcnQ6IFwiZFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBsYWJlbHM6IHsgc2hvcnQ6IFwibFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBuYW1lOiB7IGRlZmF1bHQ6IFwicnVubmVyXCIsIHNob3J0OiBcIm5cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogeyBkZWZhdWx0OiBcIjFcIiwgc2hvcnQ6IFwibVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBvczogeyBkZWZhdWx0OiBcIm9zeFwiLCBzaG9ydDogXCJzXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIG92ZXJ3cml0ZTogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiZlwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgcHJvZmlsZTogeyBzaG9ydDogXCJwXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIHJ1bjogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiclwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgcnVubmVyR3JvdXA6IHsgc2hvcnQ6IFwiZ1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB0b2tlbjogeyBzaG9ydDogXCJ0XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIHVybDogeyBzaG9ydDogXCJ1XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICB9LFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyh7IGNvbmZpZ1BhdGg6IHZhbHVlcy5jb25maWcgYXMgc3RyaW5nIH0pO1xuICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShjb25maWcsIHZhbHVlcy5wcm9maWxlIGFzIHN0cmluZyk7XG5cbiAgY29uc3QgYmFzZUFyZ3MgPSB7XG4gICAgZGlyZWN0b3J5OiB2YWx1ZXMuZGlyZWN0b3J5IGFzIHN0cmluZyxcbiAgICBsYWJlbHM6IHZhbHVlcy5sYWJlbHMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG5hbWU6IHZhbHVlcy5uYW1lIGFzIHN0cmluZyxcbiAgICBudW1iZXJPZk1hY2hpbmVzOiB2YWx1ZXMubnVtYmVyT2ZNYWNoaW5lcyBhcyBzdHJpbmcsXG4gICAgb3M6IHZhbHVlcy5vcyBhcyBzdHJpbmcsXG4gICAgb3ZlcndyaXRlOiB2YWx1ZXMub3ZlcndyaXRlIGFzIGJvb2xlYW4sXG4gICAgcnVuOiB2YWx1ZXMucnVuIGFzIGJvb2xlYW4sXG4gICAgcnVubmVyR3JvdXA6IHZhbHVlcy5ydW5uZXJHcm91cCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdG9rZW46IHZhbHVlcy50b2tlbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdXJsOiB2YWx1ZXMudXJsIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgfTtcblxuICAvLyBNZXJnZSB3aXRoIHByb2ZpbGVcbiAgaWYgKHByb2ZpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlyZWN0b3J5OiBiYXNlQXJncy5kaXJlY3RvcnkgPz8gcHJvZmlsZS5kaXJlY3RvcnkgPz8gYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsXG4gICAgICBsYWJlbHM6IGJhc2VBcmdzLmxhYmVscyA/PyBwcm9maWxlLmxhYmVscyxcbiAgICAgIG5hbWU6IGJhc2VBcmdzLm5hbWUgPz8gcHJvZmlsZS5uYW1lID8/IFwicnVubmVyXCIsXG4gICAgICBudW1iZXJPZk1hY2hpbmVzOiBiYXNlQXJncy5udW1iZXJPZk1hY2hpbmVzID8/IFN0cmluZyhwcm9maWxlLm51bWJlck9mTWFjaGluZXMpID8/IFwiMVwiLFxuICAgICAgb3M6IChiYXNlQXJncy5vcyA/PyBwcm9maWxlLm9zID8/IFwib3N4XCIpIGFzIFwib3N4XCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIixcbiAgICAgIG92ZXJ3cml0ZTogYmFzZUFyZ3Mub3ZlcndyaXRlID8/IHByb2ZpbGUub3ZlcndyaXRlID8/IGZhbHNlLFxuICAgICAgcnVuOiBiYXNlQXJncy5ydW4gPz8gcHJvZmlsZS5ydW4gPz8gZmFsc2UsXG4gICAgICBydW5uZXJHcm91cDogYmFzZUFyZ3MucnVubmVyR3JvdXAgPz8gcHJvZmlsZS5ydW5uZXJHcm91cCxcbiAgICAgIHRva2VuOiBiYXNlQXJncy50b2tlbixcbiAgICAgIHVybDogYmFzZUFyZ3MudXJsID8/IHByb2ZpbGUudXJsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeTogYmFzZUFyZ3MuZGlyZWN0b3J5LFxuICAgIGxhYmVsczogYmFzZUFyZ3MubGFiZWxzLFxuICAgIG5hbWU6IGJhc2VBcmdzLm5hbWUsXG4gICAgbnVtYmVyT2ZNYWNoaW5lczogYmFzZUFyZ3MubnVtYmVyT2ZNYWNoaW5lcyxcbiAgICBvczogYmFzZUFyZ3Mub3MgYXMgXCJvc3hcIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiLFxuICAgIG92ZXJ3cml0ZTogYmFzZUFyZ3Mub3ZlcndyaXRlLFxuICAgIHJ1bjogYmFzZUFyZ3MucnVuLFxuICAgIHJ1bm5lckdyb3VwOiBiYXNlQXJncy5ydW5uZXJHcm91cCxcbiAgICB0b2tlbjogYmFzZUFyZ3MudG9rZW4sXG4gICAgdXJsOiBiYXNlQXJncy51cmwsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkTGF0ZXN0UnVubmVySW1hZ2UoeyBkaXJlY3RvcnksIG9zIH06IHsgZGlyZWN0b3J5OiBzdHJpbmc7IG9zOiBzdHJpbmcgfSkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuY2hpbGQoXCJkb3dubG9hZFwiKTtcblxuICBsb2cuaW5mbyhgRmV0Y2hpbmcgbGF0ZXN0IHJ1bm5lciB2ZXJzaW9uIGZvciAke29zfS4uLmApO1xuICBjb25zdCByZWxlYXNlSW5mbyA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PlxuICAgICAgKFxuICAgICAgICBhd2FpdCAkYGN1cmwgLUxzIC1vIC9kZXYvbnVsbCAtdyBcIiV7dXJsX2VmZmVjdGl2ZX1cIiBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy9ydW5uZXIvcmVsZWFzZXMvbGF0ZXN0YFxuICAgICAgKS50ZXh0KCksXG4gICAge1xuICAgICAgb25SZXRyeTogKGF0dGVtcHQsIGVycm9yKSA9PiB7XG4gICAgICAgIGxvZy53YXJuKGBSZXRyeWluZyBHaXRIdWIgQVBJIGNhbGwgKGF0dGVtcHQgJHthdHRlbXB0fSk6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgY29uc3QgbGFzdFJlbGVhc2UgPSAoYXdhaXQgJGBiYXNlbmFtZSAke3JlbGVhc2VJbmZvfWApLnRleHQoKTtcblxuICBjb25zdCB2ZXJzaW9uID0gbGFzdFJlbGVhc2UudHJpbSgpLnJlcGxhY2UoXCJ2XCIsIFwiXCIpO1xuICBjb25zdCBydW5uZXJCYXNlID0gYGFjdGlvbnMtcnVubmVyLSR7b3N9LXg2NC0ke3ZlcnNpb259LnRhci5nemA7XG4gIGNvbnN0IGdpdGh1YlJlbGVhc2VVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzL2Rvd25sb2FkL3Yke3ZlcnNpb259LyR7cnVubmVyQmFzZX1gO1xuXG4gIGxvZy5kZWJ1ZyhgUnVubmVyIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcbiAgbG9nLmRlYnVnKGBEb3dubG9hZCBVUkw6ICR7Z2l0aHViUmVsZWFzZVVybH1gKTtcblxuICBhd2FpdCAkYG1rZGlyIC1wICR7ZGlyZWN0b3J5fWA7XG4gIGF3YWl0ICRgbWtkaXIgLXAgJHtkaXJlY3Rvcnl9L21hY2hpbmVzYDtcblxuICBjb25zdCBydW5uZXJGaWxlRXhpc3RzID0gYXdhaXQgQnVuLmZpbGUoYCR7ZGlyZWN0b3J5fS8ke3J1bm5lckJhc2V9YCkuZXhpc3RzKCk7XG4gIGlmICghcnVubmVyRmlsZUV4aXN0cykge1xuICAgIGxvZy5pbmZvKFwiRG93bmxvYWRpbmcgcnVubmVyIGltYWdlLi4uXCIpO1xuICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgIGFzeW5jICgpID0+IGF3YWl0ICRgY3VybCAtbyAke2RpcmVjdG9yeX0vJHtydW5uZXJCYXNlfSAtTCAke2dpdGh1YlJlbGVhc2VVcmx9YCxcbiAgICAgIHtcbiAgICAgICAgbWF4QXR0ZW1wdHM6IDUsXG4gICAgICAgIG9uUmV0cnk6IChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICAgIGxvZy53YXJuKGBSZXRyeWluZyBydW5uZXIgZG93bmxvYWQgKGF0dGVtcHQgJHthdHRlbXB0fSk6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBsb2cuaW5mbyhcIkRvd25sb2FkIGNvbXBsZXRlXCIpO1xuICB9IGVsc2Uge1xuICAgIGxvZy5pbmZvKFwiUnVubmVyIGltYWdlIGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyBkb3dubG9hZFwiKTtcbiAgfVxuXG4gIHJldHVybiBydW5uZXJCYXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0QW5kQ29weVJ1bm5lckJhc2Uoe1xuICBvdmVyd3JpdGUsXG4gIG51bWJlck9mTWFjaGluZXMsXG4gIGRpcmVjdG9yeSxcbiAgcnVubmVyQmFzZSxcbn06IHtcbiAgb3ZlcndyaXRlOiBib29sZWFuO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBydW5uZXJCYXNlOiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5jaGlsZChcImV4dHJhY3RcIik7XG4gIGNvbnN0IG51bU1hY2hpbmVzID0gTnVtYmVyKG51bWJlck9mTWFjaGluZXMpO1xuXG4gIGNvbnN0IGNwdUNvdW50ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gQnVuLnNwYXduU3luYyhbXCJucHJvY1wiXSk7XG4gICAgICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKS50cmltKCksIDEwKSB8fCA0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gQnVuLnNwYXduU3luYyhbXCJzeXNjdGxcIiwgXCItblwiLCBcImh3Lm5jcHVcIl0pO1xuICAgICAgICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKS50cmltKCksIDEwKSB8fCA0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcbiAgY29uc3QgY29uY3VycmVuY3kgPSBNYXRoLm1pbihNYXRoLm1heCgyLCBNYXRoLmZsb29yKGNwdUNvdW50IC8gMikpLCBudW1NYWNoaW5lcywgOCk7XG5cbiAgbG9nLmluZm8oYEV4dHJhY3RpbmcgJHtudW1NYWNoaW5lc30gcnVubmVycyB3aXRoIGNvbmN1cnJlbmN5IG9mICR7Y29uY3VycmVuY3l9YCk7XG5cbiAgY29uc3QgdGFza3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1NYWNoaW5lcyB9LCAoXywgaSkgPT4gaSArIDEpLm1hcCgocnVubmVySW5kZXgpID0+ICh7XG4gICAgZXhlY3V0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWFjaGluZURpcmVjdG9yeSA9IGAke2RpcmVjdG9yeX0vbWFjaGluZXMvJHtydW5uZXJJbmRleH1gO1xuICAgICAgY29uc3QgbWFjaGluZUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKG1hY2hpbmVEaXJlY3RvcnkpLmV4aXN0cygpO1xuXG4gICAgICBpZiAobWFjaGluZUV4aXN0cykge1xuICAgICAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBNYWNoaW5lICR7cnVubmVySW5kZXh9IGFscmVhZHkgZXhpc3RzLCByZW1vdmluZy4uLmApO1xuICAgICAgICAgIGF3YWl0ICRgcm0gLXJmICR7bWFjaGluZURpcmVjdG9yeX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgTWFjaGluZSAke3J1bm5lckluZGV4fSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuLi5gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgJGBta2RpciAtcCAke21hY2hpbmVEaXJlY3Rvcnl9YDtcblxuICAgICAgYXdhaXQgJGB0YXIgeHpmICR7cnVubmVyQmFzZX0gLUMgJHttYWNoaW5lRGlyZWN0b3J5LnJlcGxhY2UoYCR7ZGlyZWN0b3J5fS9gLCBcIlwiKX1gLmN3ZChcbiAgICAgICAgZGlyZWN0b3J5LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcnVubmVyUGF0aCA9IGAke2dldFBhY2thZ2VQYXRoKCl9L3NyYy9ydW5uZXJgO1xuXG4gICAgICBhd2FpdCAkYGNwIC1SICR7cnVubmVyUGF0aH0vaG9va3MgJHttYWNoaW5lRGlyZWN0b3J5fWA7XG4gICAgICBhd2FpdCAkYGNwIC1SICR7cnVubmVyUGF0aH0vLnJ1bm5lci1lbnYgJHttYWNoaW5lRGlyZWN0b3J5fS8ucnVubmVyLWVudmA7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgTWFjaGluZSAke3J1bm5lckluZGV4fSBleHRyYWN0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG4gICAgfSxcbiAgICBydW5uZXJJbmRleCxcbiAgfSkpO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkgKz0gY29uY3VycmVuY3kpIHtcbiAgICBjb25zdCBiYXRjaCA9IHRhc2tzLnNsaWNlKGksIGkgKyBjb25jdXJyZW5jeSk7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGJhdGNoLm1hcCgodGFzaykgPT4gdGFzay5leGVjdXRlKCkpKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCByZXN1bHRdIG9mIGJhdGNoUmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBydW5uZXIgJHtiYXRjaFtpbmRleF0/LnJ1bm5lckluZGV4fTogJHtyZXN1bHQucmVhc29ufWApO1xuICAgICAgICB0aHJvdyByZXN1bHQucmVhc29uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdHMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuICB9XG5cbiAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgJHtudW1NYWNoaW5lc30gcnVubmVyc2ApO1xufVxuXG5mdW5jdGlvbiBzdGFydFJ1bm5lcnMoe1xuICBkaXJlY3RvcnksXG4gIG51bWJlck9mTWFjaGluZXMsXG4gIHRva2VuLFxuICB1cmwsXG4gIG5hbWUsXG4gIGxhYmVscyxcbiAgcnVubmVyR3JvdXAsXG59OiB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgcnVubmVyR3JvdXA/OiBzdHJpbmc7XG59KSB7XG4gIGxvZ2dlci5pbmZvKGBTdGFydGluZyAke251bWJlck9mTWFjaGluZXN9IHJ1bm5lcnMuLi5gKTtcblxuICBmb3IgKGxldCBydW5uZXJJbmRleCA9IDE7IHJ1bm5lckluZGV4IDw9IE51bWJlcihudW1iZXJPZk1hY2hpbmVzKTsgcnVubmVySW5kZXgrKykge1xuICAgIGNvbnN0IHdvcmtlclBhdGggPSBgJHtnZXRQYWNrYWdlUGF0aCgpfS9zcmMvcnVubmVyLXdvcmtlci50c2A7XG4gICAgY29uc3Qgd29ya2VyTmFtZSA9IGAke25hbWV9LSR7cnVubmVySW5kZXh9YDtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclBhdGgsIHsgbmFtZTogd29ya2VyTmFtZSwgcmVmOiB0cnVlIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGBXb3JrZXIgJHt3b3JrZXJOYW1lfSBzdGFydGVkYCk7XG5cbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGluZGV4OiBydW5uZXJJbmRleCxcbiAgICAgICAgbGFiZWxzLFxuICAgICAgICBtYWNoaW5lQ3dkOiBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVubmVyR3JvdXAsXG4gICAgICAgIHRva2VuLFxuICAgICAgICB1cmwsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoeyBkYXRhIH0pID0+IHtcbiAgICAgIGNvbnN0IGxldmVsID0gZGF0YS50eXBlID09PSBcImVycm9yXCIgPyBcImVycm9yXCIgOiBcImluZm9cIjtcbiAgICAgIGxvZ2dlcltsZXZlbF0oYCR7d29ya2VyTmFtZX06ICR7ZGF0YS5tZXNzYWdlfWApO1xuICAgIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgV29ya2VyICR7d29ya2VyTmFtZX0gZXJyb3I6YCwgZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7d29ya2VyTmFtZX0gZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgfSk7XG5cbiAgICB3b3JrZXJNYW5hZ2VyLmFkZCh3b3JrZXIpO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oXCJBbGwgd29ya2VycyBzdGFydGVkLiBQcmVzcyBDdHJsK0MgdG8gc3RvcCBhbGwgbWFjaGluZXNcIik7XG59XG4iLAogICAgImltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHsgUEFUSFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnLCBDb25maWdGaWxlT3B0aW9ucywgUHJvZmlsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25maWdTY2hlbWEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBDT05GSUdfRklMRV9OQU1FUyA9IFtcImh5ZHJhLmpzb25cIiwgXCIuaHlkcmEuanNvblwiLCBcImh5ZHJhLnRvbWxcIiwgXCIuaHlkcmEudG9tbFwiXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDb25maWdGaWxlKHN0YXJ0UGF0aDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIENPTkZJR19GSUxFX05BTUVTKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oc3RhcnRQYXRoLCBmaWxlTmFtZSk7XG4gICAgY29uc3QgZmlsZSA9IEJ1bi5maWxlKGNvbmZpZ1BhdGgpO1xuICAgIGlmIChhd2FpdCBmaWxlLmV4aXN0cygpKSB7XG4gICAgICByZXR1cm4gY29uZmlnUGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKG9wdGlvbnM/OiBDb25maWdGaWxlT3B0aW9ucyk6IFByb21pc2U8Q29uZmlnIHwgbnVsbD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gb3B0aW9ucz8uY29uZmlnUGF0aCB8fCAoYXdhaXQgZmluZENvbmZpZ0ZpbGUoKSk7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmaWxlID0gQnVuLmZpbGUoY29uZmlnUGF0aCk7XG4gIGlmICghKGF3YWl0IGZpbGUuZXhpc3RzKCkpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmaWxlLnRleHQoKTtcbiAgICBjb25zdCBkYXRhID0gY29uZmlnUGF0aC5lbmRzV2l0aChcIi50b21sXCIpID8gYXdhaXQgcGFyc2VUb21sKGNvbnRlbnQpIDogSlNPTi5wYXJzZShjb250ZW50KTtcblxuICAgIHJldHVybiBDb25maWdTY2hlbWEucGFyc2UoZGF0YSkgYXMgQ29uZmlnO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZmlnIGZpbGU6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2ZpbGUoXG4gIGNvbmZpZzogQ29uZmlnIHwgbnVsbCxcbiAgcHJvZmlsZU5hbWU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFByb2ZpbGUgfCBudWxsPiB7XG4gIGlmICghY29uZmlnKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBuYW1lID0gcHJvZmlsZU5hbWUgfHwgY29uZmlnLmRlZmF1bHRQcm9maWxlO1xuICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBjb25maWcucHJvZmlsZXNbbmFtZV0gfHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJvZmlsZVdpdGhBcmdzPFQgZXh0ZW5kcyBQYXJ0aWFsPFByb2ZpbGU+PihcbiAgcHJvZmlsZTogUHJvZmlsZSB8IG51bGwsXG4gIGFyZ3M6IFQsXG4pOiBUIHtcbiAgaWYgKCFwcm9maWxlKSByZXR1cm4gYXJncztcblxuICBjb25zdCBtZXJnZWQgPSB7IC4uLmFyZ3MgfSBhcyBUO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2ZpbGUpKSB7XG4gICAgaWYgKChtZXJnZWQgYXMgYW55KVtrZXldID09PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgKG1lcmdlZCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVRvbWwoY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCB0ZW1wRmlsZSA9IGpvaW4oUEFUSFMuVEVNUF9ESVIsIGBoeWRyYS1jb25maWctJHtEYXRlLm5vdygpfS50b21sYCk7XG4gIGF3YWl0IEJ1bi53cml0ZSh0ZW1wRmlsZSwgY29udGVudCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQodGVtcEZpbGUpO1xuICAgIGF3YWl0ICRgcm0gLWYgJHt0ZW1wRmlsZX1gLnF1aWV0KCk7XG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGF3YWl0ICRgcm0gLWYgJHt0ZW1wRmlsZX1gLnF1aWV0KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgVE9NTCBjb25maWd1cmF0aW9uOiAke2Vycm9yfWApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgRElSRUNUT1JZOiBcIi4vZ2gtcnVubmVyc1wiLFxuICBOQU1FOiBcInJ1bm5lclwiLFxuICBOVU1CRVJfT0ZfTUFDSElORVM6IDEsXG4gIE9TOiBcIm9zeFwiIGFzIGNvbnN0LFxuICBQUk9GSUxFOiBcImRlZmF1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBGSUxFX0VYVEVOU0lPTlMgPSB7IEpTT046IFwiLmpzb25cIiwgVE9NTDogXCIudG9tbFwiIH0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBXT1JLRVJfTUVTU0FHRVMgPSB7IEVSUk9SOiBcImVycm9yXCIsIFNVQ0NFU1M6IFwic3VjY2Vzc1wiIH0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBQQVRIUyA9IHsgTUFDSElORVNfRElSOiBcIm1hY2hpbmVzXCIsIFRFTVBfRElSOiB0bXBkaXIoKSB9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgVElNRU9VVFMgPSB7IERPV05MT0FEOiAzMDAwMDAsIFdPUktFUl9SRVNQT05TRTogNTAwMCB9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX09TID0gW1wib3N4XCIsIFwibGludXhcIiwgXCJ3aW5cIl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdXBwb3J0ZWRPUyA9ICh0eXBlb2YgU1VQUE9SVEVEX09TKVtudW1iZXJdO1xuIiwKICAgICJpbXBvcnQge1xuICBjcmVhdGVTY2hlbWEsXG4gIGRlZmF1bHRCb29sZWFuLFxuICBkZWZhdWx0U3RyaW5nLFxuICBkZWZhdWx0VG8sXG4gIGVudW1zLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsU3RyaW5nLFxuICBwb3NpdGl2ZUludCxcbiAgcmVjb3JkLFxufSBmcm9tIFwiQHI1bi9jbGktY29yZVwiO1xuXG5jb25zdCBwcm9maWxlVmFsaWRhdG9yID0gb2JqZWN0KHtcbiAgZGlyZWN0b3J5OiBkZWZhdWx0U3RyaW5nKFwiLi9naC1ydW5uZXJzXCIpLFxuICBsYWJlbHM6IG9wdGlvbmFsU3RyaW5nKCksXG4gIG5hbWU6IGRlZmF1bHRTdHJpbmcoXCJydW5uZXJcIiksXG4gIG51bWJlck9mTWFjaGluZXM6IGRlZmF1bHRUbyhwb3NpdGl2ZUludCgpLCAxKSxcbiAgb3M6IGRlZmF1bHRUbyhlbnVtcyhbXCJvc3hcIiwgXCJsaW51eFwiLCBcIndpbmRvd3NcIl0pLCBcIm9zeFwiKSxcbiAgb3ZlcndyaXRlOiBkZWZhdWx0Qm9vbGVhbihmYWxzZSksXG4gIHJ1bjogZGVmYXVsdEJvb2xlYW4oZmFsc2UpLFxuICBydW5uZXJHcm91cDogb3B0aW9uYWxTdHJpbmcoKSxcbiAgdXJsOiBvcHRpb25hbFN0cmluZygpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBQcm9maWxlU2NoZW1hID0gY3JlYXRlU2NoZW1hKHByb2ZpbGVWYWxpZGF0b3IpO1xuXG5leHBvcnQgY29uc3QgQ29uZmlnU2NoZW1hID0gY3JlYXRlU2NoZW1hKFxuICBvYmplY3QoeyBkZWZhdWx0UHJvZmlsZTogb3B0aW9uYWxTdHJpbmcoKSwgcHJvZmlsZXM6IHJlY29yZChQcm9maWxlU2NoZW1hLnZhbGlkYXRvcikgfSksXG4pO1xuXG4vLyBNYW51YWxseSBkZWZpbmUgdHlwZXMgZm9yIGJldHRlciB0cmVlLXNoYWtpbmdcbmV4cG9ydCB0eXBlIFByb2ZpbGUgPSB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBsYWJlbHM/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVtYmVyT2ZNYWNoaW5lczogbnVtYmVyO1xuICBvczogXCJvc3hcIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiO1xuICBvdmVyd3JpdGU6IGJvb2xlYW47XG4gIHJ1bjogYm9vbGVhbjtcbiAgcnVubmVyR3JvdXA/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHsgZGVmYXVsdFByb2ZpbGU/OiBzdHJpbmc7IHByb2ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9maWxlPiB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZpbGVPcHRpb25zIHtcbiAgY29uZmlnUGF0aD86IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmdzIHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIG9zOiBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCI7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgcnVuOiBib29sZWFuO1xuICBydW5uZXJHcm91cD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5BcmdzIHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIHJ1bm5lckdyb3VwPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZUFyZ3Mge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgZm9yY2U6IGJvb2xlYW47XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHtcbiAgYm9vbGVhbixcbiAgY3JlYXRlU2NoZW1hLFxuICBkZWZhdWx0VG8sXG4gIGVudW1zLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsLFxuICByZWdleCxcbiAgc3RyaW5nLFxuICB1bmlvbixcbiAgdXJsLFxufSBmcm9tIFwiQHI1bi9jbGktY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVBhdGgoKSB7XG4gIGNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGltcG9ydC5tZXRhLnBhdGg7XG5cbiAgY29uc3QgY3VycmVudERpciA9IGN1cnJlbnRGaWxlUGF0aC5zdWJzdHJpbmcoMCwgY3VycmVudEZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cbiAgY29uc3Qgc3JjRGlyID0gY3VycmVudERpci5zdWJzdHJpbmcoMCwgY3VycmVudERpci5sYXN0SW5kZXhPZihcIi9cIikpO1xuXG4gIHJldHVybiBzcmNEaXI7XG59XG5cbmNvbnN0IGNsaUFyZ3NWYWxpZGF0b3IgPSBvYmplY3Qoe1xuICBkaXJlY3Rvcnk6IGRlZmF1bHRUbyhzdHJpbmcoKSwgYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2ApLFxuICBsYWJlbHM6IHVuaW9uKHN0cmluZygpLCBvcHRpb25hbCgpKSxcbiAgbmFtZTogZGVmYXVsdFRvKHN0cmluZygpLCBcInJ1bm5lclwiKSxcbiAgbnVtYmVyT2ZNYWNoaW5lczogZGVmYXVsdFRvKHJlZ2V4KC9eXFxkKyQvLCBcIk51bWJlciBvZiBtYWNoaW5lcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlclwiKSwgXCIxXCIpLFxuICBvczogZGVmYXVsdFRvKGVudW1zKFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luZG93c1wiXSksIFwib3N4XCIpLFxuICBvdmVyd3JpdGU6IGRlZmF1bHRUbyhib29sZWFuKCksIGZhbHNlKSxcbiAgcnVuOiBkZWZhdWx0VG8oYm9vbGVhbigpLCBmYWxzZSksXG4gIHRva2VuOiBkZWZhdWx0VG8oc3RyaW5nKCksIHByb2Nlc3MuZW52LkdJVEhVQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU4gPz8gXCJcIiksXG4gIHVybDogdXJsKCksXG59KTtcblxuY29uc3QgQ2xpQXJnc1NjaGVtYSA9IGNyZWF0ZVNjaGVtYShjbGlBcmdzVmFsaWRhdG9yKTtcblxuZXhwb3J0IHR5cGUgQ2xpQXJncyA9IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIG9zOiBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCI7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgcnVuOiBib29sZWFuO1xuICB0b2tlbjogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGlBcmdzKCk6IENsaUFyZ3Mge1xuICB0cnkge1xuICAgIGNvbnN0IHsgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAgIGFyZ3M6IEJ1bi5hcmd2LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBjb25maWc6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vLmh5ZHJhLmpzb25gLCBzaG9ydDogXCJjXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZGlyZWN0b3J5OiB7IGRlZmF1bHQ6IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLCBzaG9ydDogXCJkXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBuYW1lOiB7IGRlZmF1bHQ6IFwicnVubmVyXCIsIHNob3J0OiBcIm5cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBudW1iZXJPZk1hY2hpbmVzOiB7IGRlZmF1bHQ6IFwiMVwiLCBzaG9ydDogXCJtXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgb3M6IHsgZGVmYXVsdDogXCJvc3hcIiwgc2hvcnQ6IFwic1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIG92ZXJ3cml0ZTogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiZlwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICBydW46IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcInJcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHVybDogeyBzaG9ydDogXCJ1XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIH0sXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBDbGlBcmdzU2NoZW1hLnNhZmVQYXJzZSh2YWx1ZXMpO1xuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50czogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkZhaWxlZCB0byBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXCIsXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9sb2dnZXJcIjtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHsgcHJlZml4OiBcIldvcmtlck1hbmFnZXJcIiB9KTtcblxuLy8gSW50ZXJuYWwgc3RhdGVcbmNvbnN0IHdvcmtlcnM6IFNldDxXb3JrZXI+ID0gbmV3IFNldCgpO1xubGV0IGNsZWFudXBSZWdpc3RlcmVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyQ2xlYW51cCgpOiB2b2lkIHtcbiAgaWYgKGNsZWFudXBSZWdpc3RlcmVkKSByZXR1cm47XG5cbiAgY2xlYW51cFJlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKHdvcmtlcnMuc2l6ZSA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiQ2xlYW5pbmcgdXAgd29ya2Vycy4uLlwiKTtcbiAgICB9XG4gICAgdGVybWluYXRlQWxsKCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbihcImV4aXRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIiwgKGVycm9yKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKFwiVW5jYXVnaHQgZXhjZXB0aW9uOlwiLCBlcnJvcik7XG4gICAgY2xlYW51cCgpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcbiAgd29ya2Vycy5hZGQod29ya2VyKTtcbiAgbG9nZ2VyLmRlYnVnKGBXb3JrZXIgYWRkZWQuIFRvdGFsIHdvcmtlcnM6ICR7d29ya2Vycy5zaXplfWApO1xuXG4gIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCAoKSA9PiB7XG4gICAgd29ya2Vycy5kZWxldGUod29ya2VyKTtcbiAgICBsb2dnZXIuZGVidWcoYFdvcmtlciBleGl0ZWQuIFJlbWFpbmluZyB3b3JrZXJzOiAke3dvcmtlcnMuc2l6ZX1gKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcbiAgaWYgKHdvcmtlcnMuaGFzKHdvcmtlcikpIHtcbiAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgd29ya2Vycy5kZWxldGUod29ya2VyKTtcbiAgICBsb2dnZXIuZGVidWcoYFdvcmtlciByZW1vdmVkLiBSZW1haW5pbmcgd29ya2VyczogJHt3b3JrZXJzLnNpemV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlcm1pbmF0ZUFsbCgpOiB2b2lkIHtcbiAgaWYgKHdvcmtlcnMuc2l6ZSA+IDApIHtcbiAgICBsb2dnZXIuaW5mbyhgVGVybWluYXRpbmcgJHt3b3JrZXJzLnNpemV9IHdvcmtlcnMuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB3b3JrZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0ZXJtaW5hdGUgd29ya2VyOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd29ya2Vycy5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICByZXR1cm4gd29ya2Vycy5zaXplO1xufVxuXG4vLyBJbml0aWFsaXplIGNsZWFudXAgb24gbW9kdWxlIGxvYWRcbnJlZ2lzdGVyQ2xlYW51cCgpO1xuXG4vLyBFeHBvcnQgYSBjb252ZW5pZW50IGludGVyZmFjZSB0aGF0IG1hdGNoZXMgdGhlIG9sZCB1c2FnZSBwYXR0ZXJuXG5leHBvcnQgY29uc3Qgd29ya2VyTWFuYWdlciA9IHtcbiAgYWRkOiBhZGRXb3JrZXIsXG4gIHJlbW92ZTogcmVtb3ZlV29ya2VyLFxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gZ2V0V29ya2VyQ291bnQoKTtcbiAgfSxcbiAgdGVybWluYXRlQWxsLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgY29sb3JzIH0gZnJvbSBcIkByNW4vdG9vbHMvdXRpbHMvY29sb3JzXCI7XG5cbmNvbnN0IENPTU1BTkRfSEVMUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgY3JlYXRlOiBgXG5oeWRyYSBjcmVhdGUgLSBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldyBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIGNyZWF0ZSBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtbSwgLS1udW1iZXJPZk1hY2hpbmVzICBOdW1iZXIgb2YgbWFjaGluZXMgICAgICAgICAgICAgICAgW251bWJlcl0gKGRlZmF1bHQ6IDEpXG4gIC1uLCAtLW5hbWUgICAgICAgICAgICAgIFJ1bm5lciBuYW1lIHByZWZpeCAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtbCwgLS1sYWJlbHMgICAgICAgICAgICBDb21tYS1zZXBhcmF0ZWQgcnVubmVyIGxhYmVscyAgICAgW3N0cmluZ11cbiAgLW8sIC0tb3MgICAgICAgICAgICAgICAgUnVubmVyIE9TICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJpbmddIChkZWZhdWx0OiBvc3gpXG4gIC1kLCAtLWRpcmVjdG9yeSAgICAgICAgIFJ1bm5lcnMgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtTywgLS1vdmVyd3JpdGUgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgcnVubmVycyAgICAgICAgW2Jvb2xlYW5dXG4gIC1wLCAtLXByb2ZpbGUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvZmlsZSAgICAgICAgICAgICBbc3RyaW5nXVxuICAtYywgLS1jb25maWcgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgcGF0aCAgICAgICAgICAgW3N0cmluZ11cblxuRVhBTVBMRVNcbiAgIyBDcmVhdGUgYSBzaW5nbGUgcnVubmVyXG4gIGh5ZHJhIGNyZWF0ZSAtdCBUT0tFTiAtdSBodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cblxuICAjIENyZWF0ZSAzIHJ1bm5lcnMgd2l0aCBsYWJlbHNcbiAgaHlkcmEgY3JlYXRlIC1tIDMgLXQgVE9LRU4gLXUgVVJMIC1sIGRvY2tlcixncHVcblxuICAjIENyZWF0ZSB1c2luZyBwcm9maWxlXG4gIGh5ZHJhIGNyZWF0ZSAtcCBwcm9kdWN0aW9uIC10IFRPS0VOXG5gLFxuICBpbml0OiBgXG5oeWRyYSBpbml0IC0gSW5pdGlhbGl6ZSBhIG5ldyBIeWRyYSBjb25maWd1cmF0aW9uIGZpbGVcblxuVVNBR0VcbiAgaHlkcmEgaW5pdCBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b21sICAgICAgVXNlIFRPTUwgZm9ybWF0IGluc3RlYWQgb2YgSlNPTiAgICAgICAgIFtib29sZWFuXVxuXG5FWEFNUExFU1xuICAjIEluaXRpYWxpemUgd2l0aCBpbnRlcmFjdGl2ZSBwcm9tcHRzXG4gIGh5ZHJhIGluaXRcblxuICAjIEluaXRpYWxpemUgd2l0aCBUT01MIGZvcm1hdFxuICBoeWRyYSBpbml0IC0tdG9tbFxuYCxcblxuICByZW1vdmU6IGBcbmh5ZHJhIHJlbW92ZSAtIFJlbW92ZSBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIHJlbW92ZSBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtbSwgLS1udW1iZXJPZk1hY2hpbmVzICBOdW1iZXIgb2YgbWFjaGluZXMgICAgICAgICAgICAgICAgW251bWJlcl0gKGRlZmF1bHQ6IDEpXG4gIC1uLCAtLW5hbWUgICAgICAgICAgICAgIFJ1bm5lciBuYW1lIHByZWZpeCAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtZCwgLS1kaXJlY3RvcnkgICAgICAgICBSdW5uZXJzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWYsIC0tZm9yY2UgICAgICAgICAgICAgRm9yY2UgcmVtb3ZhbCAgICAgICAgICAgICAgICAgICAgIFtib29sZWFuXVxuICAtcCwgLS1wcm9maWxlICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb2ZpbGUgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWMsIC0tY29uZmlnICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhdGggICAgICAgICAgIFtzdHJpbmddXG5cbkVYQU1QTEVTXG4gICMgUmVtb3ZlIGFuZCB1bnJlZ2lzdGVyXG4gIGh5ZHJhIHJlbW92ZSAtdCBUT0tFTiAtdSBodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cblxuICAjIEZvcmNlIHJlbW92ZVxuICBoeWRyYSByZW1vdmUgLW0gMiAtLWZvcmNlXG5cbiAgIyBSZW1vdmUgc3BlY2lmaWMgcnVubmVyc1xuICBoeWRyYSByZW1vdmUgLW4gY3VzdG9tIC1tIDMgLXQgVE9LRU4gLXUgVVJMXG5gLFxuXG4gIHJ1bjogYFxuaHlkcmEgcnVuIC0gU3RhcnQgZXhpc3RpbmcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuXG5VU0FHRVxuICBoeWRyYSBydW4gW29wdGlvbnNdXG5cbk9QVElPTlNcbiAgLXQsIC0tdG9rZW4gICAgICAgICAgICAgR2l0SHViIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLXUsIC0tdXJsICAgICAgICAgICAgICAgR2l0SHViIHJlcG9zaXRvcnkgb3Igb3JnIFVSTCAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLW0sIC0tbnVtYmVyT2ZNYWNoaW5lcyAgTnVtYmVyIG9mIG1hY2hpbmVzICAgICAgICAgICAgICAgIFtudW1iZXJdIChkZWZhdWx0OiAxKVxuICAtbiwgLS1uYW1lICAgICAgICAgICAgICBSdW5uZXIgbmFtZSBwcmVmaXggICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWQsIC0tZGlyZWN0b3J5ICAgICAgICAgUnVubmVycyBkaXJlY3RvcnkgICAgICAgICAgICAgICAgIFtzdHJpbmddXG4gIC1wLCAtLXByb2ZpbGUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvZmlsZSAgICAgICAgICAgICBbc3RyaW5nXVxuICAtYywgLS1jb25maWcgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgcGF0aCAgICAgICAgICAgW3N0cmluZ11cblxuRVhBTVBMRVNcbiAgIyBSdW4gZXhpc3RpbmcgcnVubmVyc1xuICBoeWRyYSBydW4gLXQgVE9LRU4gLXUgaHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvXG5cbiAgIyBSdW4gc3BlY2lmaWMgcnVubmVyc1xuICBoeWRyYSBydW4gLW0gMiAtbiBjdXN0b20gLXQgVE9LRU4gLXUgVVJMXG5gLFxuXG4gIHN0YXR1czogYFxuaHlkcmEgc3RhdHVzIC0gQ2hlY2sgdGhlIHN0YXR1cyBvZiBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIHN0YXR1cyBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtZCwgLS1kaXJlY3RvcnkgICAgICAgICBSdW5uZXJzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWosIC0tanNvbiAgICAgICAgICAgICAgT3V0cHV0IHN0YXR1cyBpbiBKU09OIGZvcm1hdCAgICAgIFtib29sZWFuXVxuICAtcCwgLS1wcm9maWxlICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb2ZpbGUgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWMsIC0tY29uZmlnICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhdGggICAgICAgICAgIFtzdHJpbmddXG5cbkVYQU1QTEVTXG4gICMgQ2hlY2sgcnVubmVyIHN0YXR1c1xuICBoeWRyYSBzdGF0dXMgLXQgVE9LRU4gLXUgaHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvXG5cbiAgIyBPdXRwdXQgYXMgSlNPTlxuICBoeWRyYSBzdGF0dXMgLXQgVE9LRU4gLXUgVVJMIC0tanNvblxuXG4gICMgU3RhdHVzIHVzaW5nIHByb2ZpbGVcbiAgaHlkcmEgc3RhdHVzIC1wIHByb2R1Y3Rpb25cbmAsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaGVscChjb21tYW5kTmFtZT86IHN0cmluZykge1xuICBpZiAoY29tbWFuZE5hbWUgJiYgQ09NTUFORF9IRUxQW2NvbW1hbmROYW1lXSkge1xuICAgIGNvbnN0IGhlbHBUZXh0ID0gQ09NTUFORF9IRUxQW2NvbW1hbmROYW1lXTtcbiAgICBjb25zdCBjb2xvcmVkSGVscCA9IGhlbHBUZXh0XG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5tYXAoKGxpbmUpID0+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/XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgICR7Y29sb3JzLmN5YW4oc3VnZ2VzdGlvbil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBoZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoXCItLWhlbHBcIikgfHwgYXJncy5pbmNsdWRlcyhcIi1oXCIpKSB7XG4gICAgICBoZWxwKGFjdHVhbENvbW1hbmQpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYWN0dWFsQ29tbWFuZCkge1xuICAgICAgY2FzZSBcImluaXRcIjpcbiAgICAgICAgYXdhaXQgaW5pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJjcmVhdGVcIjpcbiAgICAgICAgYXdhaXQgY3JlYXRlTWFjaGluZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicnVuXCI6XG4gICAgICAgIGF3YWl0IHJ1bk1hY2hpbmVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbW92ZVwiOlxuICAgICAgICBhd2FpdCByZW1vdmVNYWNoaW5lcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzdGF0dXNcIjpcbiAgICAgICAgYXdhaXQgc3RhdHVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImhlbHBcIjoge1xuICAgICAgICBjb25zdCB0YXJnZXRDb21tYW5kID0gYXJnc1swXTtcbiAgICAgICAgaGVscCh0YXJnZXRDb21tYW5kKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHthY3R1YWxDb21tYW5kfWApO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck9iaiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICBsb2cuZXJyb3IoZXJyb3JPYmoubWVzc2FnZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVBLElBQU0sTUFBTTtBQUFBLEVBQ1osSUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNmLElBQU0sT0FBTztBQUFBLEVBRWIsSUFBTSxTQUFTO0FBQUEsSUFDYixFQUFFLENBQUMsR0FBRyxHQUFHO0FBQUEsTUFDUCxLQUFLO0FBQUEsUUFBRyxPQUFPLEdBQUcsTUFBTSxJQUFJO0FBQUEsTUFDNUIsT0FBTyxHQUFHLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFBQTtBQUFBLElBRS9CLElBQUksQ0FBQyxHQUFHLEdBQUc7QUFBQSxNQUNULElBQUksTUFBTTtBQUFBLE1BRVYsSUFBSSxJQUFJO0FBQUEsUUFBRyxPQUFPLEdBQUcsT0FBTztBQUFBLE1BQ3ZCLFNBQUksSUFBSTtBQUFBLFFBQUcsT0FBTyxHQUFHLE1BQU07QUFBQSxNQUVoQyxJQUFJLElBQUk7QUFBQSxRQUFHLE9BQU8sR0FBRyxPQUFPO0FBQUEsTUFDdkIsU0FBSSxJQUFJO0FBQUEsUUFBRyxPQUFPLEdBQUcsTUFBTTtBQUFBLE1BRWhDLE9BQU87QUFBQTtBQUFBLElBRVQsSUFBSSxDQUFDLFFBQVEsTUFBTSxHQUFHLE1BQU07QUFBQSxJQUM1QixNQUFNLENBQUMsUUFBUSxNQUFNLEdB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RSxFQUFFLFVBQVEsR0FBRSxFQUFFLGlCQUFlLFFBQVEsQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsRUFBRSxXQUFXLENBQUMsR0FBRSxJQUFFLEVBQUUsVUFBUSxJQUFFLEVBQUUsV0FBVyxDQUFDLElBQUUsR0FBRSxJQUFFO0FBQUEsSUFBRSxPQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsVUFBUSxLQUFHLE1BQUssS0FBRyxNQUFLLElBQUUsS0FBRyxLQUFHLEdBQUUsS0FBRyxRQUFPLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFFBQU0sTUFBSSxLQUFHLFFBQU0sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFFBQU0sTUFBSSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFNBQU8sTUFBSSxNQUFJLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsUUFBTSxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFNBQU8sS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxLQUFHLFNBQU8sVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFdBQVMsV0FBUyxLQUFHLEtBQUcsVUFBUSxNQUFJO0FBQUEsS0FBSyxFQUFFLGtCQUFnQixRQUFRLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssZUFBZSxDQUFDO0FBQUEsSUFBRSxPQUFPLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxNQUFJLElBQUU7QUFBQTtBQUFBLEVBQUcsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLElBQUMsT0FBTyxFQUFFLE1BQU0sa0RBQWtELEtBQUcsQ0FBQztBQUFBO0FBQUEsRUFBRSxFQUFFLFNBQU8sUUFBUSxDQUFDLEdBQUU7QUFBQSxJQUFDLFNBQVEsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEdBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxRQUFPO0FBQUEsTUFBSSxJQUFFLElBQUUsS0FBSyxnQkFBZ0IsRUFBRSxFQUFFO0FBQUEsSUFBRSxPQUFPO0FBQUEsS0FBRyxFQUFFLFFBQU0sUUFBUSxDQUFDLEdBQUUsR0FBRSxHQUFFO0FBQUEsSUFBQyxVQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBRSxNQUFJLElBQUUsVUFBUSxJQUFHLElBQUUsTUFBSSxJQUFFLFVBQVE7QUFBQSxJQUFHLFNBQVEsSUFBRSxJQUFHLElBQUUsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxJQUFHLElBQUUsRUFBRSxPQUFPLENBQUM7QUFBQSxNQUFFLElBQUcsS0FBRyxLQUFHLEtBQUcsSUFBRSxJQUFFO0FBQUEsUUFBRyxJQUFHLElBQUUsS0FBRztBQUFBLFVBQUUsS0FBRztBQUFBLFFBQU87QUFBQTtBQUFBLE1BQU0sS0FBRztBQUFBLElBQUM7QUFBQSxJQUFDLE9BQU87QUFBQTtBQUFBLEdBQUssQ0FBQztBQUFFLElBQUksS0FBRyxFQUFFO0FBQVEsSUFBTSxLQUFHLEVBQUUsRUFBRTtBQUFFLElBQUksS0FBRyxRQUFRLEdBQUU7QUFBQSxFQUFDLE9BQU07QUFBQTtBQUFreWUsSUFBTSxLQUFHLEVBQUUsRUFBRTtBQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUU7QUFBQSxFQUFDLElBQUcsT0FBTyxLQUFHLFlBQVUsRUFBRSxXQUFTLE1BQUksSUFBRSxFQUFDLG1CQUFrQixTQUFNLEVBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsV0FBUztBQUFBLElBQUcsT0FBTztBQUFBLEVBQUUsSUFBRSxFQUFFLFFBQVEsR0FBRyxHQUFFLElBQUk7QUFBQSxFQUFFLE1BQU0sSUFBRSxFQUFFLG9CQUFrQixJQUFFO0FBQUEsRUFBRSxJQUFJLElBQUU7QUFBQSxFQUFFLFdBQVUsS0FBSyxHQUFFO0FBQUEsSUFBQyxNQUFNLElBQUUsRUFBRSxZQUFZLENBQUM7QUFBQSxJQUFFLElBQUcsS0FBRyxNQUFJLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUc7QUFBQSxNQUFJO0FBQUEsSUFBUyxRQUFPLEdBQUcsZUFBZSxDQUFDO0FBQUEsV0FBTztBQUFBLFdBQVE7QUFBQSxRQUFJLEtBQUc7QUFBQSxRQUFFO0FBQUEsV0FBVTtBQUFBLFFBQUksS0FBRztBQUFBLFFBQUU7QUFBQTtBQUFBLFFBQWMsS0FBRztBQUFBO0FBQUEs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S0FBSSxJQUFFLEdBQUc7QUFBQSxLQUFHLFlBQVcsTUFBRSxHQUFFLGNBQWEsRUFBQyxPQUFNLE9BQUcsRUFBRSxhQUFhLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFLFlBQVcsTUFBRSxHQUFFLGVBQWMsRUFBQyxPQUFNLE9BQUc7QUFBQSxJQUFDLElBQUcsSUFBRTtBQUFBLE1BQUUsT0FBTyxLQUFHO0FBQUEsSUFBRSxJQUFHLElBQUU7QUFBQSxNQUFHLE9BQU8sTUFBSSxJQUFFO0FBQUEsSUFBRyxJQUFJLEdBQUUsR0FBRTtBQUFBLElBQUUsSUFBRyxLQUFHO0FBQUEsTUFBSSxNQUFJLElBQUUsT0FBSyxLQUFHLEtBQUcsS0FBSSxJQUFFLEdBQUUsSUFBRTtBQUFBLElBQU07QUFBQSxNQUFDLEtBQUc7QUFBQSxNQUFHLE1BQU0sSUFBRSxJQUFFO0FBQUEsTUFBRyxJQUFFLEtBQUssTUFBTSxJQUFFLEVBQUUsSUFBRSxHQUFFLElBQUUsS0FBSyxNQUFNLElBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUU7QUFBQTtBQUFBLElBQUUsTUFBTSxJQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxJQUFFO0FBQUEsSUFBRSxJQUFHLE1BQUk7QUFBQSxNQUFFLE9BQU87QUFBQSxJQUFHLElBQUksSUFBRSxNQUFJLEtBQUssTUFBTSxDQUFDLEtBQUcsSUFBRSxLQUFLLE1BQU0sQ0FBQyxLQUFHLElBQUUsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUFHLE9BQU8sTUFBSSxNQUFJLEtBQUcsS0FBSTtBQUFBLEtBQUcsWUFBVyxNQUFFLEdBQUUsV0FBVSxFQUFDLE9BQU0sQ0FBQyxHQUFFLEdBQUUsTUFBSSxFQUFFLGNBQWMsRUFBRSxhQUFhLEdBQUUsR0FBRSxDQUFDLENBQUMsR0FBRSxZQUFXLE1BQUUsR0FBRSxXQUFVLEVBQUMsT0FBTSxPQUFHLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUUsWUFBVyxNQUFFLEVBQUMsQ0FBQyxHQUFFO0FBQUE7QUFBRSxJQUFNLEtBQUcsR0FBRztBQUFaLElBQWMsSUFBRSxJQUFJLElBQUksQ0FBQyxRQUFPLE1BQU0sQ0FBQztBQUF2QyxJQUF5QyxLQUFHO0FBQTVDLElBQStDLElBQUU7QUFBakQsSUFBd0QsSUFBRTtBQUExRCxJQUE4RCxLQUFHO0FBQWpFLElBQXFFLElBQUU7QUFBdkUsSUFBMkUsSUFBRSxHQUFHO0FBQWhGLElBQXdGLElBQUUsT0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksSUFBSTtBQUFsSSxJQUFzSSxJQUFFLE9BQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLElBQUk7QUFBaEwsSUFBb0wsS0FBRyxPQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQWxOLElBQW9OLElBQUUsQ0FBQyxHQUFFLEdBQUUsTUFBSTtBQUFBLEVBQUMsTUFBTSxJQUFFLENBQUMsR0FBRyxDQUFDO0FBQUEsRUFBRSxJQUFJLElBQUUsT0FBRyxJQUFFLE9BQUcsSUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQU8sRUFBRSxDQUFDO0FBQUEsRUFBRSxZQUFVLEdBQUUsTUFBSyxFQUFFLFFBQVEsR0FBRTtBQUFBLElBQUMsTUFBTSxJQUFFLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRyxJQUFFLEtBQUcsSUFBRSxFQUFFLEVBQUUsU0FBTyxNQUFJLEtBQUcsRUFBRSxLQUFLLENBQUMsR0FBRSxJQUFFLElBQUcsRUFBRSxJQUFJLENBQUMsTUFBSSxJQUFFLE1BQUcsSUFBRSxFQUFFLE1BQU0sSUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUcsR0FBRTtBQUFBLE1BQUMsSUFBRSxNQUFJLE1BQUksSUFBRSxPQUFHLElBQUUsU0FBSSxNQUFJLE1BQUksSUFBRTtBQUFBLE1BQUk7QUFBQSxJQUFRO0FBQUEsSUFBQyxLQUFHLEdBQUUsTUFBSSxLQUFHLElBQUUsRUFBRSxTQUFPLE1BQUksRUFBRSxLQUFLLEVBQUUsR0FBRSxJQUFFO0FBQUEsRUFBRTtBQUFBLEdBQUUsS0FBRyxFQUFFLEVBQUUsU0FBTyxHQUFHLFNBQU8sS0FBRyxFQUFFLFNBQU8sTUFBSSxFQUFFLEVBQUUsU0FBTyxNQUFJLEVBQUUsSUFBSTtBQUFBO0FBQXhqQixJQUE0akIsS0FBRyxPQUFHO0FBQUEsRUFBQyxNQUFNLElBQUUsRUFBRSxNQUFNLEdBQUc7QUFBQSxFQUFFLElBQUksSUFBRSxFQUFFO0FBQUEsRUFBTyxNQUFLLElBQUUsT0FBSyxFQUFFLEVBQUUsSUFBRSxFQUFFLElBQUU7QUFBQSxJQUFJO0FBQUEsRUFBSSxPQUFPLE1BQUksRUFBRSxTQUFPLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUE7QUFBcHNCLElBQXVzQixLQUFHLENBQUMsR0FBRSxHQUFFLElBQUUsQ0FBQyxNQUFJO0FBQUEsRUFBQyxJQUFHLEVBQUUsU0FBTyxTQUFJLEVBQUUsS0FBSyxNQUFJO0FBQUEsSUFBRyxPQUFNO0FBQUEsRUFBRyxJQUFJLElBQUUsSUFBRyxHQUFFO0FBQUEsRUFBRSxNQUFNLElBQUUsR0FBRyxDQUFDO0FBQUEsRUFBRSxJQUFJLElBQUUsQ0FBQyxFQUFFO0FBQUEsRUFBRSxZQUFVLEdBQUUsTUFBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLFFBQVEsR0FBRTtBQUFBLElBQUMsRUFBRSxTQUFPLFVBQUssRUFBRSxFQUFFLFNBQU8sS0FBRyxFQUFFLEVBQUUsU0FBTyxHQUFHLFVBQVU7QUFBQSxJQUFHLElBQUksSUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFPLEVBQUU7QUFBQSxJQUFFLElBQUcsTUFBSSxNQUFJLEtBQUcsTUFBSSxFQUFFLGFBQVcsU0FBSSxFQUFFLFNBQU8sV0FBTSxFQUFFLEtBQUssRUFBRSxHQUFFLElBQUUsS0FBSSxJQUFFLEtBQUcsRUFBRSxTQUFPLFdBQU0sRUFBRSxFQUFFLFNBQU8sTUFBSSxLQUFJLE9BQU0sRUFBRSxRQUFNLEVBQUUsS0FBRyxHQUFFO0FBQUEsTUFBQyxNQUFNLElBQUUsSUFBRSxHQUFFLElBQUUsSUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFHLElBQUUsS0FBRyxDQUFDO0FBQUEsTUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFHLEtBQUcsQ0FBQyxJQUFFLEtBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQVE7QUFBQSxJQUFDLElBQUcsSUFBRSxFQUFFLEtBQUcsS0FBRyxJQUFFLEtBQUcsRUFBRSxLQUFHLEdBQUU7QUFBQSxNQUFDLElBQUcsRUFBRSxhQUFXLFNBQUksSUFBRSxHQUFFO0FBQUEsUUFBQyxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUEsSUFBQztBQUFBLElBQUMsSUFBRyxJQUFFLEVBQUUsS0FBRyxLQUFHLEVBQUUsYUFBVyxPQUFHO0FBQUEsTUFBQyxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQVE7QUFBQSxJQUFDLEVBQUUsRUFBRSxTQUFPLE1BQUk7QUFBQSxFQUFDO0FBQUEsRUFBQyxFQUFFLFNBQU8sVUFBSyxJQUFFLEVBQUUsSUFBSSxPQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsRUFBRyxNQUFNLElBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSztBQUFBLENBQzV0d0IsQ0FBQztBQUFBLEVBQUUsWUFBVSxHQUFFLE1BQUssRUFBRSxRQUFRLEdBQUU7QUFBQSxJQUFDLElBQUcsS0FBRyxHQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUU7QUFBQSxNQUFDLFFBQU0sUUFBTyxNQUFHLElBQUksT0FBTyxRQUFRLHFCQUFxQixjQUFjLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBRyxFQUFDLFFBQU8sQ0FBQyxFQUFDO0FBQUEsTUFBRSxJQUFHLEVBQUUsU0FBWSxXQUFFO0FBQUEsUUFBQyxNQUFNLElBQUUsT0FBTyxXQUFXLEVBQUUsSUFBSTtBQUFBLFFBQUUsSUFBRSxNQUFJLEtBQVEsWUFBRTtBQUFBLE1BQUMsRUFBTTtBQUFBLFVBQUUsUUFBVyxjQUFJLElBQUUsRUFBRSxJQUFJLFdBQVMsSUFBTyxZQUFFLEVBQUU7QUFBQSxJQUFJO0FBQUEsSUFBQyxNQUFNLElBQUUsR0FBRyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUM7QUFBQSxJQUFFLEVBQUUsSUFBRSxPQUFLO0FBQUEsS0FDNVUsTUFBSSxLQUFHLEVBQUUsRUFBRSxJQUFHLEtBQUcsTUFBSSxLQUFHLEVBQUUsQ0FBQyxNQUFJLE1BQUk7QUFBQSxNQUNsQyxLQUFHLE1BQUksS0FBRyxFQUFFLENBQUMsSUFBRyxNQUFJLEtBQUcsRUFBRSxDQUFDO0FBQUEsRUFBRztBQUFBLEVBQUMsT0FBTztBQUFBO0FBQUcsU0FBUyxDQUFDLENBQUMsR0FBRSxHQUFFLEdBQUU7QUFBQSxFQUFDLE9BQU8sT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsU0FBUTtBQUFBLENBQzFHLEVBQUUsTUFBTTtBQUFBLENBQ1IsRUFBRSxJQUFJLE9BQUcsR0FBRyxHQUFFLEdBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSztBQUFBLENBQ3pCO0FBQUE7QUFBRSxJQUFNLEtBQUcsQ0FBQyxNQUFLLFFBQU8sUUFBTyxTQUFRLFNBQVEsU0FBUSxRQUFRO0FBQTdELElBQStELElBQUUsRUFBQyxTQUFRLElBQUksSUFBSSxFQUFFLEdBQUUsU0FBUSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUksSUFBSSxHQUFFLENBQUMsS0FBSSxNQUFNLEdBQUUsQ0FBQyxLQUFJLE1BQU0sR0FBRSxDQUFDLEtBQUksT0FBTyxHQUFFLENBQUMsUUFBSSxRQUFRLEdBQUUsQ0FBQyxVQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUM7QUFBMk0sU0FBUyxDQUFDLENBQUMsR0FBRSxHQUFFO0FBQUEsRUFBQyxJQUFHLE9BQU8sS0FBRztBQUFBLElBQVMsT0FBTyxFQUFFLFFBQVEsSUFBSSxDQUFDLE1BQUk7QUFBQSxFQUFFLFdBQVUsS0FBSztBQUFBLElBQUUsSUFBRyxNQUFTLGFBQUcsRUFBRSxHQUFFLENBQUM7QUFBQSxNQUFFLE9BQU07QUFBQSxFQUFHLE9BQU07QUFBQTtBQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFBLEVBQUMsSUFBRyxNQUFJO0FBQUEsSUFBRTtBQUFBLEVBQU8sTUFBTSxJQUFFLEVBQUUsTUFBTTtBQUFBLENBQ3ZqQixHQUFFLElBQUUsRUFBRSxNQUFNO0FBQUEsQ0FDWixHQUFFLElBQUUsQ0FBQztBQUFBLEVBQUUsU0FBUSxJQUFFLEVBQUUsSUFBRSxLQUFLLElBQUksRUFBRSxRQUFPLEVBQUUsTUFBTSxHQUFFO0FBQUEsSUFBSSxFQUFFLE9BQUssRUFBRSxNQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUEsRUFBRSxPQUFPO0FBQUE7QUFBRSxJQUFNLEtBQUcsV0FBVyxRQUFRLFNBQVMsV0FBVyxLQUFLO0FBQXJELElBQXVELElBQUUsT0FBTyxjQUFjO0FBQUUsU0FBUyxFQUFFLENBQUMsR0FBRTtBQUFBLEVBQUMsT0FBTyxNQUFJO0FBQUE7QUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFLEdBQUU7QUFBQSxFQUFDLE1BQU0sSUFBRTtBQUFBLEVBQUUsRUFBRSxTQUFPLEVBQUUsV0FBVyxDQUFDO0FBQUE7QUFBRSxTQUFTLEVBQUUsR0FBRSxPQUFNLElBQUUsR0FBRSxRQUFPLElBQUUsR0FBRSxXQUFVLElBQUUsTUFBRyxZQUFXLElBQUUsU0FBSSxDQUFDLEdBQUU7QUFBQSxFQUFDLE1BQU0sSUFBSSxrQkFBZ0IsRUFBQyxPQUFNLEdBQUUsUUFBTyxHQUFFLFFBQU8sSUFBRyxTQUFRLEVBQUMsQ0FBQztBQUFBLEVBQUkscUJBQW1CLEdBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBTyxFQUFFLFdBQVcsSUFBRTtBQUFBLEVBQUUsTUFBTSxJQUFFLENBQUMsS0FBRyxNQUFLLEdBQUUsVUFBUyxRQUFLO0FBQUEsSUFBQyxNQUFNLElBQUUsT0FBTyxDQUFDO0FBQUEsSUFBRSxJQUFHLEVBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLFFBQVEsR0FBRTtBQUFBLE1BQUMsS0FBRyxFQUFFLE1BQU0seUJBQUUsSUFBSSxHQUFFLFFBQVEsS0FBSyxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQU07QUFBQSxJQUFDLEtBQUk7QUFBQSxNQUFFO0FBQUEsSUFBTyxNQUFNLElBQUUsTUFBSSxXQUFTLElBQUUsSUFBRyxJQUFFLE1BQUksV0FBUyxLQUFHO0FBQUEsSUFBSSxhQUFXLEdBQUUsR0FBRSxHQUFFLE1BQUk7QUFBQSxNQUFHLFlBQVUsR0FBRSxHQUFFLE1BQUk7QUFBQSxRQUFDLEVBQUUsS0FBSyxZQUFXLENBQUM7QUFBQSxPQUFFO0FBQUEsS0FBRTtBQUFBO0FBQUEsRUFBRyxPQUFPLEtBQUcsRUFBRSxNQUFNLHlCQUFFLElBQUksR0FBRSxFQUFFLEtBQUssWUFBVyxDQUFDLEdBQUUsTUFBSTtBQUFBLElBQUMsRUFBRSxJQUFJLFlBQVcsQ0FBQyxHQUFFLEtBQUcsRUFBRSxNQUFNLHlCQUFFLElBQUksR0FBRSxFQUFFLFVBQVEsTUFBSSxFQUFFLFdBQVcsS0FBRSxHQUFFLEVBQUUsV0FBUyxPQUFHLEVBQUUsTUFBTTtBQUFBO0FBQUE7QUFBRyxJQUFJLEtBQUcsT0FBTztBQUFkLElBQTZCLEtBQUcsQ0FBQyxHQUFFLEdBQUUsT0FBSSxLQUFLLEtBQUUsR0FBRyxHQUFFLEdBQUUsRUFBQyxZQUFXLE1BQUcsY0FBYSxNQUFHLFVBQVMsTUFBRyxPQUFNLEVBQUMsQ0FBQyxJQUFFLEVBQUUsS0FBRztBQUFqSCxJQUFtSCxJQUFFLENBQUMsR0FBRSxHQUFFLE9BQUssR0FBRyxHQUFFLE9BQU8sS0FBRyxXQUFTLElBQUUsS0FBRyxHQUFFLENBQUMsR0FBRTtBQUFBO0FBQUcsTUFBTSxFQUFDO0FBQUEsRUFBQyxXQUFXLENBQUMsR0FBRSxJQUFFLE1BQUc7QUFBQSxJQUFDLEVBQUUsTUFBSyxPQUFPLEdBQUUsRUFBRSxNQUFLLFFBQVEsR0FBRSxFQUFFLE1BQUssY0FBYyxHQUFFLEVBQUUsTUFBSyxJQUFJLEdBQUUsRUFBRSxNQUFLLE1BQU0sR0FBRSxFQUFFLE1BQUssU0FBUyxHQUFFLEVBQUUsTUFBSyxVQUFTLEtBQUUsR0FBRSxFQUFFLE1BQUssY0FBYSxFQUFFLEdBQUUsRUFBRSxNQUFLLGdCQUFlLElBQUksR0FBRyxHQUFFLEVBQUUsTUFBSyxXQUFVLENBQUMsR0FBRSxFQUFFLE1BQUssU0FBUSxTQUFTLEdBQUUsRUFBRSxNQUFLLFNBQVEsRUFBRSxHQUFFLEVBQUUsTUFBSyxPQUFPO0FBQUEsSUFBRSxRQUFNLE9BQU0sSUFBRSxHQUFFLFFBQU8sSUFBRSxHQUFFLFFBQU8sR0FBRSxRQUFPLE1BQUssTUFBRztBQUFBLElBQUUsS0FBSyxPQUFLLEdBQUUsS0FBSyxhQUFXLEtBQUssV0FBVyxLQUFLLElBQUksR0FBRSxLQUFLLFFBQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFFLEtBQUssU0FBTyxLQUFLLE9BQU8sS0FBSyxJQUFJLEdBQUUsS0FBSyxVQUFRLEVBQUUsS0FBSyxJQUFJLEdBQUUsS0FBSyxTQUFPLEdBQUUsS0FBSyxlQUFhLEdBQUUsS0FBSyxRQUFNLEdBQUUsS0FBSyxTQUFPO0FBQUE7QUFBQSxFQUFFLFdBQVcsR0FBRTtBQUFBLElBQUMsS0FBSyxhQUFhLE1BQU07QUFBQTtBQUFBLEVBQUUsYUFBYSxDQUFDLEdBQUUsR0FBRTtBQUFBLElBQUMsTUFBTSxJQUFFLEtBQUssYUFBYSxJQUFJLENBQUMsS0FBRyxDQUFDO0FBQUEsSUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFFLEtBQUssYUFBYSxJQUFJLEdBQUUsQ0FBQztBQUFBO0FBQUEsRUFBRSxFQUFFLENBQUMsR0FBRSxHQUFFO0FBQUEsSUFBQyxLQUFLLGNBQWMsR0FBRSxFQUFDLElBQUcsRUFBQyxDQUFDO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFDLEtBQUssY0FBYyxHQUFFLEVBQUMsSUFBRyxHQUFFLE1BQUssS0FBRSxDQUFDO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxNQUFLLEdBQUU7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QUksS0FBRyxLQUFLLEtBQUssT0FBTSxFQUFFLFlBQVksQ0FBQyxHQUFFLEdBQUcsU0FBTyxVQUFTO0FBQUEsTUFBQyxJQUFHLEtBQUssS0FBSyxVQUFTO0FBQUEsUUFBQyxNQUFNLElBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLO0FBQUEsUUFBRSxNQUFJLEtBQUssUUFBTSxhQUFhLFFBQU0sRUFBRSxVQUFRLEdBQUUsS0FBSyxRQUFNLFNBQVEsS0FBSyxJQUFJLE1BQU0sS0FBSyxLQUFLO0FBQUEsTUFBRTtBQUFBLE1BQUMsS0FBSyxVQUFRLFlBQVUsS0FBSyxRQUFNO0FBQUEsSUFBUztBQUFBLElBQUMsRUFBRSxDQUFDLEdBQUUsR0FBRyxNQUFLLEdBQUcsUUFBUSxHQUFFLFFBQVEsTUFBSSxLQUFLLFFBQU0sWUFBVyxLQUFLLFVBQVEsWUFBVSxLQUFLLFVBQVEsYUFBVyxLQUFLLEtBQUssVUFBVSxHQUFFLEtBQUssT0FBTyxJQUFHLEtBQUssVUFBUSxZQUFVLEtBQUssVUFBUSxhQUFXLEtBQUssTUFBTTtBQUFBO0FBQUEsRUFBRSxLQUFLLEdBQUU7QUFBQSxJQUFDLEtBQUssTUFBTSxPQUFPLEdBQUUsS0FBSyxNQUFNLGVBQWUsWUFBVyxLQUFLLFVBQVUsR0FBRSxLQUFLLE9BQU8sTUFBTTtBQUFBLENBQzl5SCxHQUFFLEVBQUUsS0FBSyxPQUFNLEtBQUUsR0FBRSxLQUFLLElBQUksTUFBTSxHQUFFLEtBQUssS0FBUSxXQUFFLEtBQUssS0FBSyxHQUFHLEtBQUssU0FBUSxLQUFLLEtBQUssR0FBRSxLQUFLLFlBQVk7QUFBQTtBQUFBLEVBQUUsYUFBYSxHQUFFO0FBQUEsSUFBQyxNQUFNLElBQUUsRUFBRSxLQUFLLFlBQVcsUUFBUSxPQUFPLFNBQVEsRUFBQyxNQUFLLEtBQUUsQ0FBQyxFQUFFLE1BQU07QUFBQSxDQUM5TCxFQUFFLFNBQU87QUFBQSxJQUFFLEtBQUssT0FBTyxNQUFNLHlCQUFFLEtBQUssTUFBSyxJQUFFLEVBQUUsQ0FBQztBQUFBO0FBQUEsRUFBRSxNQUFNLEdBQUU7QUFBQSxJQUFDLE1BQU0sSUFBRSxFQUFFLEtBQUssUUFBUSxJQUFJLEtBQUcsSUFBRyxRQUFRLE9BQU8sU0FBUSxFQUFDLE1BQUssS0FBRSxDQUFDO0FBQUEsSUFBRSxJQUFHLE1BQUksS0FBSyxZQUFXO0FBQUEsTUFBQyxJQUFHLEtBQUssVUFBUTtBQUFBLFFBQVUsS0FBSyxPQUFPLE1BQU0seUJBQUUsSUFBSTtBQUFBLE1BQU07QUFBQSxRQUFDLE1BQU0sSUFBRSxHQUFHLEtBQUssWUFBVyxDQUFDO0FBQUEsUUFBRSxJQUFHLEtBQUssY0FBYyxHQUFFLEtBQUcsR0FBRyxXQUFTLEdBQUU7QUFBQSxVQUFDLE1BQU0sSUFBRSxFQUFFO0FBQUEsVUFBRyxLQUFLLE9BQU8sTUFBTSx5QkFBRSxLQUFLLEdBQUUsQ0FBQyxDQUFDLEdBQUUsS0FBSyxPQUFPLE1BQU0sd0JBQUUsTUFBTSxDQUFDLENBQUM7QUFBQSxVQUFFLE1BQU0sSUFBRSxFQUFFLE1BQU07QUFBQSxDQUMvVztBQUFBLFVBQUUsS0FBSyxPQUFPLE1BQU0sRUFBRSxFQUFFLEdBQUUsS0FBSyxhQUFXLEdBQUUsS0FBSyxPQUFPLE1BQU0seUJBQUUsS0FBSyxHQUFFLEVBQUUsU0FBTyxJQUFFLENBQUMsQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFNO0FBQUEsUUFBQyxJQUFHLEtBQUcsR0FBRyxTQUFPLEdBQUU7QUFBQSxVQUFDLE1BQU0sSUFBRSxFQUFFO0FBQUEsVUFBRyxLQUFLLE9BQU8sTUFBTSx5QkFBRSxLQUFLLEdBQUUsQ0FBQyxDQUFDLEdBQUUsS0FBSyxPQUFPLE1BQU0sd0JBQUUsS0FBSyxDQUFDO0FBQUEsVUFBRSxNQUFNLElBQUUsRUFBRSxNQUFNO0FBQUEsQ0FDeE0sRUFBRSxNQUFNLENBQUM7QUFBQSxVQUFFLEtBQUssT0FBTyxNQUFNLEVBQUUsS0FBSztBQUFBLENBQ3BDLENBQUMsR0FBRSxLQUFLLGFBQVc7QUFBQSxVQUFFO0FBQUEsUUFBTTtBQUFBLFFBQUMsS0FBSyxPQUFPLE1BQU0sd0JBQUUsS0FBSyxDQUFDO0FBQUE7QUFBQSxNQUFFLEtBQUssT0FBTyxNQUFNLENBQUMsR0FBRSxLQUFLLFVBQVEsY0FBWSxLQUFLLFFBQU0sV0FBVSxLQUFLLGFBQVc7QUFBQSxJQUFDO0FBQUE7QUFBRTtBQUFBO0FBQUMsTUFBTSxXQUFXLEVBQUM7QUFBQSxNQUFLLE1BQU0sR0FBRTtBQUFBLElBQUMsT0FBTyxLQUFLLFFBQU0sSUFBRTtBQUFBO0FBQUEsTUFBTSxNQUFNLEdBQUU7QUFBQSxJQUFDLE9BQU8sS0FBSyxXQUFTO0FBQUE7QUFBQSxFQUFFLFdBQVcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxNQUFNLEdBQUUsS0FBRSxHQUFFLEtBQUssVUFBUSxFQUFFLGNBQWEsS0FBSyxHQUFHLFNBQVEsTUFBSTtBQUFBLE1BQUMsS0FBSyxRQUFNLEtBQUs7QUFBQSxLQUFPLEdBQUUsS0FBSyxHQUFHLFdBQVUsT0FBRztBQUFBLE1BQUMsS0FBSyxPQUFPLE1BQU0seUJBQUUsS0FBSyxHQUFFLEVBQUUsQ0FBQyxHQUFFLEtBQUssUUFBTSxHQUFFLEtBQUssUUFBTSxVQUFTLEtBQUssTUFBTTtBQUFBLEtBQUUsR0FBRSxLQUFLLEdBQUcsVUFBUyxNQUFJO0FBQUEsTUFBQyxLQUFLLFNBQU8sS0FBSztBQUFBLEtBQU07QUFBQTtBQUFFO0FBQUMsSUFBaWY7QUFBNDZDLElBQUUsSUFBSTtBQUFtNUYsTUFBTSxXQUFXLEVBQUM7QUFBQSxNQUFLLGVBQWUsR0FBRTtBQUFBLElBQUMsSUFBRyxLQUFLLFVBQVE7QUFBQSxNQUFTLE9BQU8sS0FBSztBQUFBLElBQU0sSUFBRyxLQUFLLFVBQVEsS0FBSyxNQUFNO0FBQUEsTUFBTyxPQUFNLEdBQUcsS0FBSztBQUFBLElBQWMsTUFBTSxJQUFFLEtBQUssTUFBTSxNQUFNLEdBQUUsS0FBSyxNQUFNLElBQUcsTUFBSyxLQUFHLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTTtBQUFBLElBQUUsT0FBTSxHQUFHLElBQUksMEJBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFBQTtBQUFBLE1BQVEsTUFBTSxH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QUFBQSxJQUFDLElBQUUsTUFBRyxJQUFFLEdBQUcsR0FBRSxLQUFFLEdBQUUsRUFBQyxHQUFFLEtBQUUsWUFBWSxJQUFJLEdBQUUsUUFBUSxPQUFPLE1BQU0sR0FBRywyQkFBRSxLQUFLLENBQUM7QUFBQSxDQUMxVDtBQUFBLElBQUUsSUFBSSxLQUFFLEdBQUUsS0FBRTtBQUFBLElBQUUsR0FBRSxHQUFFLElBQUUsWUFBWSxNQUFJO0FBQUEsTUFBQyxJQUFHLEtBQUcsT0FBSTtBQUFBLFFBQUU7QUFBQSxNQUFPLEdBQUUsR0FBRSxLQUFFO0FBQUEsTUFBRSxNQUFNLEtBQUUsMkJBQUUsUUFBUSxFQUFFLEdBQUU7QUFBQSxNQUFFLElBQUc7QUFBQSxRQUFFLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxPQUFNO0FBQUEsTUFBTyxTQUFHLE1BQUk7QUFBQSxRQUFRLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxNQUFLLEdBQUUsRUFBQyxHQUFHO0FBQUEsTUFBTTtBQUFBLFFBQUMsTUFBTSxLQUFFLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBQSxRQUFFLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxLQUFJLElBQUc7QUFBQTtBQUFBLE1BQUUsS0FBRSxLQUFFLElBQUUsRUFBRSxTQUFPLEtBQUUsSUFBRSxHQUFFLEtBQUUsS0FBRSxFQUFFLFNBQU8sS0FBRSxRQUFLO0FBQUEsT0FBRyxFQUFDO0FBQUEsS0FBRyxLQUFFLENBQUMsS0FBRSxJQUFHLEtBQUUsTUFBSTtBQUFBLElBQUMsSUFBRSxPQUFHLGNBQWMsQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFFLE1BQU0sS0FBRSxPQUFJLElBQUUsMkJBQUUsTUFBTSxDQUFDLElBQUUsT0FBSSxJQUFFLDJCQUFFLElBQUksRUFBQyxJQUFFLDJCQUFFLElBQUksRUFBQztBQUFBLElBQUUsS0FBRSxHQUFFLE1BQUcsRUFBQyxHQUFFLE1BQUksVUFBUSxRQUFRLE9BQU8sTUFBTSxHQUFHLE9BQU0sTUFBSyxHQUFF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U0FBUyxXQUFXLEdBQUc7QUFBQSxNQUNuQyxNQUFNLFlBQVksb0JBQW9CLGFBQWEsZUFBZTtBQUFBLE1BQ2xFLElBQUksYUFBYSxTQUFTLFNBQVMsU0FBUyxHQUFHO0FBQUEsUUFDN0MsZ0JBQWdCO0FBQUEsUUFDaEIsUUFBUSxJQUFJLE9BQU8sT0FBTyx1QkFBdUI7QUFBQSxDQUFjLENBQUM7QUFBQSxNQUNsRTtBQUFBLElBQ0Y7QUFBQSxJQUVBLEtBQUssU0FBUyxTQUFTLGFBQWEsR0FBRztBQUFBLE1BQ3JDLFFBQVEsTUFBTSxPQUFPLElBQUksb0JBQW9CLGFBQWEsQ0FBQztBQUFBLE1BRTNELE1BQU0sY0FBYyxlQUFlLGFBQWEsUUFBUTtBQUFBLE1BQ3hELElBQUksWUFBWSxTQUFTLEdBQUc7QUFBQSxRQUMxQixRQUFRLE1BQU07QUFBQSwyQkFBOEI7QUFBQSxRQUM1QyxXQUFXLGNBQWMsYUFBYTtBQUFBLFVBQ3BDLFFBQVEsTUFBTSxLQUFLLE9BQU8sS0FBSyxVQUFVLEdBQUc7QUFBQSxRQUM5QztBQUFBLFFBQ0EsUUFBUSxNQUFNO0FBQUEsTUFDaEI7QUFBQSxNQUVBLEtBQUs7QUFBQSxNQUNMLFFBQVEsS0FBSyxDQUFDO0FBQUEsSUFDaEI7QUFBQSxJQUVBLElBQUksS0FBSyxTQUFTLFFBQVEsS0FBSyxLQUFLLFNBQVMsSUFBSSxHQUFHO0FBQUEsTUFDbEQsS0FBSyxhQUFhO0FBQUEsTUFDbEIsUUFBUSxLQUFLLENBQUM7QUFBQSxJQUNoQjtBQUFBLElBRUEsUUFBUTtBQUFBLFdBQ0Q7QUFBQSxRQUNILE1BQU0sS0FBSztBQUFBLFFBQ1g7QUFBQSxXQUNHO0FBQUEsUUFDSCxNQUFNLGVBQWU7QUFBQSxRQUNyQjtBQUFBLFdBQ0c7QUFBQSxRQUNILE1BQU0sWUFBWTtBQUFBLFFBQ2xCO0FBQUEsV0FDRztBQUFBLFFBQ0gsTUFBTSxlQUFlO0FBQUEsUUFDckI7QUFBQSxXQUNHO0FBQUEsUUFDSCxNQUFNLE9BQU87QUFBQSxRQUNiO0FBQUEsV0FDRyxRQUFRO0FBQUEsUUFDWCxNQUFNLGdCQUFnQixLQUFLO0FBQUEsUUFDM0IsS0FBSyxhQUFhO0FBQUEsUUFDbEI7QUFBQSxNQUNGO0FBQUE7QUFBQSxRQUVFLE1BQU0sSUFBSSxNQUFNLG9CQUFvQixlQUFlO0FBQUE7QUFBQSxJQUd2RCxRQUFRLEtBQUssQ0FBQztBQUFBLElBQ2QsT0FBTyxRQUFPO0FBQUEsSUFDZCxNQUFNLFdBQVcsa0JBQWlCLFFBQVEsU0FBUSxJQUFJLE1BQU0sT0FBTyxNQUFLLENBQUM7QUFBQSxJQUN6RSxHQUFJLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDMUIsUUFBUSxLQUFLLENBQUM7QUFBQTtBQUFBO0FBSWxCLE1BQU0sS0FBSzsiLAogICJkZWJ1Z0lkIjogIkIzRDAyOTRDQjI1NDBGRkY2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
162
|
+
${p.bold("COMMANDS")}
|
|
163
|
+
${p.green("init")} Initialize a new Hydra configuration file
|
|
164
|
+
${p.green("create")} Create and register new GitHub runner machines
|
|
165
|
+
${p.green("run")} Start existing GitHub runner machines
|
|
166
|
+
${p.green("remove")} Remove GitHub runner machines
|
|
167
|
+
${p.green("status")} Check the status of GitHub runner machines
|
|
168
|
+
${p.green("help")} Show this help message
|
|
169
|
+
|
|
170
|
+
Use ${p.cyan("hydra <command> --help")} for more information about a command.
|
|
171
|
+
`)}import{resolve as ro}from"path";import{parseArgs as oo}from"util";var{$:In}=globalThis.Bun;async function Bt(){let{toml:t}=so(),r=t?"hydra.toml":"hydra.json",o=ro(process.cwd(),r);if(await Bun.file(o).exists()){let m=await j({initialValue:!1,message:`Configuration file ${r} already exists. Overwrite?`});if(S(m)||!m)qn("Configuration cancelled"),process.exit(0)}dt(p.cyan("\uD83D\uDE80 Hydra Configuration Setup")),console.info(p.dim("This will create a configuration file with your runner settings.")),console.info(p.dim(`You can always edit the file later or create additional profiles.
|
|
172
|
+
`));let s=await xt({profileName:()=>P({message:"Profile name?",placeholder:"default"}),directory:()=>P({defaultValue:"./gh-runners",message:"Directory to store runners?",placeholder:"./gh-runners"}),name:()=>P({defaultValue:"runner",message:"Runner name prefix?",placeholder:"runner"}),labels:({results:m})=>{let g=m.name||"runner";return P({defaultValue:g,message:"Runner labels (comma-separated)?",placeholder:g})},numberOfMachines:()=>P({defaultValue:"1",message:"Number of runner machines?",placeholder:"1",validate:(m)=>{let g=Number.parseInt(m,10);if(Number.isNaN(g)||g<1)return"Please enter a valid number greater than 0";return}}),url:()=>P({message:"GitHub repository or organization URL? (optional)",placeholder:"https://github.com/org/repo"})},{onCancel:()=>{qn("Configuration cancelled"),process.exit(0)}}),{profileName:i,labels:n,numberOfMachines:a,...c}=s,l={defaultProfile:i,profiles:{[i]:{...c,labels:n,numberOfMachines:Number.parseInt(a,10),os:"osx",overwrite:!1,run:!1}}},f=JSON.stringify(l,null,2);if(await Bun.write(o,f),await F(async()=>{await In`chmod 600 ${o}`.quiet()},{logLevel:"warn",message:"Could not set secure file permissions"}),bt(p.green(`\u2713 Configuration saved to ${r}`)),console.info(`
|
|
173
|
+
Example usage:`),console.info(p.cyan(` hydra create -p ${i} --token YOUR_TOKEN${s.url?"":" --url REPO_URL"}`)),console.info(`
|
|
174
|
+
You can add more profiles by editing the configuration file.`),s.url)await eo(s.url)}async function eo(t){let r=/github\.com[:/]([^/]+)(?:\/([^/.]+))?/,o=t.match(r);if(!o)return;let[,e,s]=o,n=`https://github.com/${s?`${e}/${s}`:`organizations/${e}`}/settings/actions/runners`;console.info(`
|
|
175
|
+
Opening GitHub settings: ${p.cyan(n)}`),await F(async()=>{await In`open ${n}`.quiet()},{fallback:async()=>{await F(async()=>{await In`xdg-open ${n}`.quiet()},{fallback:()=>{console.info(`
|
|
176
|
+
Please open the URL manually to add a new runner token.`)},logLevel:"info",message:"Alternative browser open method also failed"})},logLevel:"info",message:"Could not open browser automatically"})}function so(){let{values:t}=oo({allowPositionals:!0,args:Bun.argv,options:{toml:{default:!1,short:"t",type:"boolean"}},strict:!0});return t}import{parseArgs as io}from"util";var{$:V}=globalThis.Bun;var jn=_({prefix:"removeMachines"});async function It(){let t=await ao(),{directory:r,numberOfMachines:o,force:e}=t,{token:s,url:i}=t,n=`${r}/machines`;if(!await Bun.file(n).exists())throw new Error(`Machines directory not found at ${n}. Nothing to remove.`);if(!s&&!e){if(!i)throw console.warn(p.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub.")),console.warn(p.yellow("Use --force to remove runners without unregistering them.")),new Error("Token (-t) and URL (-u) parameters are required or use --force");let c=mo(i),l=await j({message:`No token provided. Would you like to open GitHub to get a runner token for unregistration?
|
|
177
|
+
${c}`});if(S(l)||!l)throw console.warn(p.yellow("Use --force to remove runners without unregistering them.")),new Error("Token is required to unregister runners (or use --force)");jn.info("Opening GitHub runner settings..."),await V`open ${c}`.quiet();let f=await P({message:"Enter the runner removal token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(m)=>{if(!m||m.trim().length===0)return"Token is required";return}});if(S(f))throw console.warn(p.yellow("Use --force to remove runners without unregistering them.")),new Error("Token is required to unregister runners (or use --force)");s=f.trim()}if(s&&i)console.info(p.cyan("Unregistering runners from GitHub...")),await co({directory:r,numberOfMachines:o,token:s});else if(!e)throw console.warn(p.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub.")),console.warn(p.yellow("Use --force to remove runners without unregistering them.")),new Error("Token (-t) and URL (-u) parameters are required or use --force");await fo({directory:r,numberOfMachines:o}),console.info(p.green("\u2713 Runners successfully removed"))}async function ao(){let{values:t}=io({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},force:{default:!1,short:"f",type:"boolean"},numberOfMachines:{default:"1",short:"m",type:"string"},profile:{short:"p",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),r=await W({configPath:t.config}),o=await z(r,t.profile),e={directory:t.directory,force:t.force,numberOfMachines:t.numberOfMachines,token:t.token,url:t.url};if(o)return{directory:e.directory??o.directory??`${process.cwd()}/gh-runners`,force:e.force,numberOfMachines:e.numberOfMachines??String(o.numberOfMachines)??"1",token:e.token,url:e.url??o.url};return e}async function co({directory:t,numberOfMachines:r,token:o}){let e=jn.child("unregister"),s=Number(r),i=(()=>{try{let g=Bun.spawnSync(["nproc"]);return Number.parseInt(g.stdout.toString().trim(),10)||4}catch{try{let g=Bun.spawnSync(["sysctl","-n","hw.ncpu"]);return Number.parseInt(g.stdout.toString().trim(),10)||4}catch{return 4}}})(),n=Math.min(Math.max(2,Math.floor(i/2)),s,8);e.info(`Unregistering ${s} runners with concurrency of ${n}`);let a=Array.from({length:s},(g,d)=>d+1).map((g)=>({execute:async()=>{let d=`${t}/machines/${g}`;if(!await Bun.file(d).exists())return e.debug(`Machine ${g} doesn't exist, skipping...`),{runnerIndex:g,status:"skipped"};try{return e.debug(`Unregistering machine ${g}...`),await V`${d}/config.sh remove --token ${o}`.quiet(),e.info(`Successfully unregistered machine ${g} from GitHub`),{runnerIndex:g,status:"success"}}catch(w){return e.warn(`Unable to unregister machine ${g}: ${w}`),{error:w,runnerIndex:g,status:"failed"}}},runnerIndex:g})),c=[];for(let g=0;g<a.length;g+=n){let d=a.slice(g,g+n),h=await Promise.allSettled(d.map((w)=>w.execute()));c.push(...h)}let l=c.filter((g)=>g.status==="fulfilled"&&g.value?.status==="success").length,f=c.filter((g)=>g.status==="fulfilled"&&g.value?.status==="failed").length,m=c.filter((g)=>g.status==="fulfilled"&&g.value?.status==="skipped").length;e.info(`Unregistration complete: ${l} successful, ${f} failed, ${m} skipped`)}async function fo({directory:t,numberOfMachines:r}){let o=jn.child("removeDirectories"),e=Number(r),s=Array.from({length:e},(c,l)=>l+1).map((c)=>({execute:async()=>{let l=`${t}/machines/${c}`;if(!await Bun.file(l).exists())return{runnerIndex:c,status:"skipped"};try{return await V`rm -rf ${l}`.quiet(),o.debug(`Removed machine ${c} directory`),{runnerIndex:c,status:"success"}}catch(m){return o.error(`Error removing machine ${c} directory: ${m}`),{error:m,runnerIndex:c,status:"failed"}}},runnerIndex:c})),i=await Promise.allSettled(s.map((c)=>c.execute())),n=i.filter((c)=>c.status==="fulfilled"&&c.value?.status==="success").length,a=i.filter((c)=>c.status==="fulfilled"&&c.value?.status==="failed").length;if(o.info(`Directory removal complete: ${n} removed, ${a} failed`),a>0)throw new Error(`Failed to remove ${a} runner directories`);try{let c=`${t}/machines`;if(!(await V`ls -A ${c}`.text()).trim()){if(await V`rm -rf ${c}`.quiet(),!(await V`ls -A ${t}`.text()).trim())await V`rm -rf ${t}`.quiet();console.info(p.green("\u2713 Removed empty directories"))}}catch(c){}}function mo(t){try{let r=new URL(t),o=r.pathname.split("/").filter(Boolean);if(r.hostname==="github.com"||r.hostname==="www.github.com"){if(o[0]==="orgs"&&o[1])return`https://github.com/organizations/${o[1]}/settings/actions/runners`;else if(o.length>=2)return`https://github.com/${o[0]}/${o[1]}/settings/actions/runners`}else if(o[0]==="orgs"&&o[1])return`${r.origin}/organizations/${o[1]}/settings/actions/runners`;else if(o.length>=2)return`${r.origin}/${o[0]}/${o[1]}/settings/actions/runners`;return t}catch{return t}}import{parseArgs as lo}from"util";var{$:go}=globalThis.Bun;var q=_({prefix:"runMachines"});async function jt(){let t=await po(),{directory:r,numberOfMachines:o,name:e,labels:s,runnerGroup:i}=t,{token:n,url:a}=t;if(!a)throw new Error("URL (-u) parameter is required");if(!n){let l=ho(a),f=await j({message:`No token provided. Would you like to open GitHub to get a runner token?
|
|
178
|
+
${l}`});if(S(f)||!f)throw new Error("Token is required to run machines");q.info("Opening GitHub runner settings..."),await go`open ${l}`.quiet();let m=await P({message:"Enter the runner registration token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(g)=>{if(!g||g.trim().length===0)return"Token is required";return}});if(S(m))throw new Error("Token is required to run machines");n=m.trim()}if(q.info(`Starting ${o} runners from ${r}`),q.debug(`Name: ${e}, Labels: ${s||"none"}`),!await Bun.file(`${r}/machines`).exists())throw new Error(`Machines directory not found at ${r}/machines. Run 'hydra create' first.`);await uo({directory:r,labels:s,name:e,numberOfMachines:o,runnerGroup:i,token:n,url:a})}async function po(){let{values:t}=lo({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},labels:{short:"l",type:"string"},name:{default:"runner",short:"n",type:"string"},numberOfMachines:{default:"1",short:"m",type:"string"},profile:{short:"p",type:"string"},runnerGroup:{short:"g",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),r=await W({configPath:t.config}),o=await z(r,t.profile),e={directory:t.directory,labels:t.labels,name:t.name,numberOfMachines:t.numberOfMachines,runnerGroup:t.runnerGroup,token:t.token,url:t.url};if(o)return{directory:e.directory??o.directory??`${process.cwd()}/gh-runners`,labels:e.labels??o.labels,name:e.name??o.name??"runner",numberOfMachines:e.numberOfMachines??String(o.numberOfMachines)??"1",runnerGroup:e.runnerGroup??o.runnerGroup,token:e.token,url:e.url??o.url};return e}async function uo({directory:t,numberOfMachines:r,token:o,url:e,name:s,labels:i,runnerGroup:n}){q.info(`Starting ${r} workers...`);for(let a=1;a<=Number(r);a++){let c=`${t}/machines/${a}`;if(!await Bun.file(c).exists()){q.warn(`Machine ${a} doesn't exist, skipping...`);continue}let f=`${an()}/src/runner-worker.ts`,m=`${s}-${a}`,g=new Worker(f,{name:m,ref:!0});g.addEventListener("message",({data:d})=>{let h=d.type==="error"?"error":"info";q[h](`${m}: ${d.message}`)}),g.addEventListener("error",(d)=>{q.error(`Worker ${m} error:`,d)}),g.addEventListener("exit",(d)=>{q.info(`Worker ${m} exited with code ${d}`)}),g.postMessage({index:a,labels:i,machineCwd:c,name:s,runnerGroup:n,token:o,url:e}),q.info(`Worker ${m} starting...`),wn.add(g)}q.info("All workers started. Press Ctrl+C to stop all machines")}function ho(t){try{let r=new URL(t),o=r.pathname.split("/").filter(Boolean);if(r.hostname==="github.com"||r.hostname==="www.github.com"){if(o[0]==="orgs"&&o[1])return`https://github.com/organizations/${o[1]}/settings/actions/runners/new`;else if(o.length>=2)return`https://github.com/${o[0]}/${o[1]}/settings/actions/runners/new`}else if(o[0]==="orgs"&&o[1])return`${r.origin}/organizations/${o[1]}/settings/actions/runners/new`;else if(o.length>=2)return`${r.origin}/${o[0]}/${o[1]}/settings/actions/runners/new`;return t}catch{return t}}import{parseArgs as bo}from"util";var{$:yo}=globalThis.Bun;async function Wt(){let t=await xo(),{directory:r,token:o,url:e,json:s}=t;if(!o||!e)throw new Error("Token (-t) and URL (-u) parameters are required");let i=yt();i.start("Fetching runner status...");try{let n=await $o(r),a=await wo(e,o),c=Eo(n,a);if(i.stop("Runner status fetched"),s)console.log(JSON.stringify(c,null,2));else Ro(c)}catch(n){throw i.stop("Failed to fetch runner status"),n}}async function xo(){let{values:t}=bo({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},json:{default:!1,short:"j",type:"boolean"},profile:{short:"p",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),r=await W({configPath:t.config}),o=await z(r,t.profile);return{directory:t.directory||o?.directory||`${process.cwd()}/gh-runners`,json:t.json,token:t.token,url:t.url||o?.url}}async function $o(t){let r=`${t}/machines`;return await F(async()=>{return(await yo`ls ${r} 2>/dev/null || true`.quiet()).stdout.toString().trim().split(`
|
|
179
|
+
`).filter(Boolean)},{fallback:()=>{},logLevel:"debug",message:"No local runners found"})||[]}async function wo(t,r){let o=t.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);if(!o)throw new Error("Invalid GitHub URL");let[,e,s]=o,i=s?`https://api.github.com/repos/${e}/${s}/actions/runners`:`https://api.github.com/orgs/${e}/actions/runners`;return on(async()=>{let n={Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${r}`},a=await fetch(i,{headers:n});if(!a.ok)throw new Error(`GitHub API error: ${a.status} ${a.statusText}`);return await a.json()},{onRetry:(n,a)=>{X.warn(`Retrying GitHub API call (attempt ${n}): ${a.message}`)}})}function Eo(t,r){let o=[],e=new Map(r.runners.map((s)=>[s.name,s]));for(let s of t){let i=`runner-${s}`,n=e.get(i);if(n)o.push({busy:n.busy,labels:n.labels.map((a)=>a.name),name:i,os:n.os,status:n.busy?"busy":n.status==="online"?"online":"offline"});else o.push({busy:!1,labels:[],name:i,os:"unknown",status:"offline"})}return o}function Ro(t){if(t.length===0){X.info("No runners found");return}console.log(`
|
|
180
|
+
${p.bold("Runner Status:")}`),console.log("\u2500".repeat(80));let r={busy:p.yellow,offline:p.red,online:p.green};for(let e of t){let s=r[e.status],i=e.status.toUpperCase().padEnd(7);console.log(`${s("\u25CF")} ${s(i)} ${p.cyan(e.name.padEnd(20))} ${p.dim(`OS: ${e.os.padEnd(10)}`)} ${e.labels.length>0?p.dim(`Labels: ${e.labels.join(", ")}`):""}`)}console.log("\u2500".repeat(80));let o={busy:t.filter((e)=>e.status==="busy").length,offline:t.filter((e)=>e.status==="offline").length,online:t.filter((e)=>e.status==="online").length,total:t.length};console.log(`
|
|
181
|
+
${p.bold("Summary:")} Total: ${o.total} | ${p.green(`Online: ${o.online}`)} | ${p.yellow(`Busy: ${o.busy}`)} | ${p.red(`Offline: ${o.offline}`)}
|
|
182
|
+
`)}var En=["init","create","run","remove","status","help"],Oo={c:"create",ceate:"create",craete:"create",cretae:"create",del:"remove",delete:"remove",h:"help",i:"init",info:"status",initialise:"init",inti:"init",intialize:"init",list:"status",ls:"status",new:"create",r:"run",remvoe:"remove",rm:"remove",rmove:"remove",rnu:"run",runn:"run",s:"status",start:"run",stat:"status",stop:"remove",sttaus:"status",t:"troubleshoot"};async function So(){try{let[,,t,...r]=process.argv;if(!t||t==="--help"||t==="-h")cn(),process.exit(0);let o=t;if(!En.includes(t)){let e=Ot(t,Oo);if(e&&En.includes(e))o=e,console.log(p.yellow(`Assuming you meant '${e}'
|
|
183
|
+
`))}if(!En.includes(o)){console.error(p.red(`Unknown command: ${t}`));let e=Rt(t,En);if(e.length>0){console.error(`
|
|
184
|
+
Did you mean one of these?`);for(let s of e)console.error(` ${p.cyan(s)}`);console.error()}cn(),process.exit(1)}if(r.includes("--help")||r.includes("-h"))cn(o),process.exit(0);switch(o){case"init":await Bt();break;case"create":await Ht();break;case"run":await jt();break;case"remove":await It();break;case"status":await Wt();break;case"help":{let e=r[0];cn(e);break}default:throw new Error(`Unknown command: ${o}`)}process.exit(0)}catch(t){let r=t instanceof Error?t:new Error(String(t));X.error(r.message),process.exit(1)}}await So();
|