@jsenv/terminal-recorder 1.4.7 → 1.4.9

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.
Files changed (30) hide show
  1. package/dist/terminal_recorder_browser.js +8 -4
  2. package/package.json +5 -6
  3. package/src/.jsenv/chrome@128.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  4. package/src/.jsenv/chrome@128.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
  5. package/src/.jsenv/chrome@128.00/terminal_recorder.js +26 -35
  6. package/src/.jsenv/chrome@128.00/terminal_recorder.js.map +2 -2
  7. package/src/.jsenv/chrome@129.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  8. package/src/.jsenv/chrome@129.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
  9. package/src/.jsenv/chrome@129.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +749 -0
  10. package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +11 -11
  11. package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/packages/internal/plugin-supervisor/src/client/supervisor.js +3 -3
  12. package/src/.jsenv/{chrome@127.00 → chrome@129.00}/gif_encoder.js +3 -3
  13. package/src/.jsenv/{chrome@127.00 → chrome@129.00}/gif_encoder.js.map +2 -2
  14. package/src/.jsenv/{chrome@127.00 → chrome@129.00}/terminal_recorder.js +69 -60
  15. package/src/.jsenv/{chrome@127.00 → chrome@129.00}/terminal_recorder.js.map +2 -2
  16. package/src/client/terminal_recorder.js +1 -0
  17. package/src/.jsenv/chrome@127.00/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -749
  18. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +0 -0
  19. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +0 -0
  20. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +0 -0
  21. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +0 -0
  22. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/xterm/css/xterm.css +0 -0
  23. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/xterm/lib/xterm.js +0 -0
  24. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/@fs/Users/damien.maillard/dev/perso/jsenv-core/node_modules/@xterm/xterm/lib/xterm.js.map +0 -0
  25. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/lzw_encoder.js +0 -0
  26. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/neuquant.js +0 -0
  27. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/xterm.html +0 -0
  28. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/xterm.html@L14C5-L18C14.js +0 -0
  29. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/xterm.html@L19C5-L24C14.js +0 -0
  30. /package/src/.jsenv/{chrome@127.00 → chrome@129.00}/xterm.html@L19C5-L24C14.js.map +0 -0
@@ -1,749 +0,0 @@
1
- !function (e, t) {
2
- "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.SerializeAddon = t() : e.SerializeAddon = t();
3
- }(window, () => (() => {
4
- "use strict";
5
-
6
- var e = {
7
- 930: (e, t, s) => {
8
- Object.defineProperty(t, "__esModule", {
9
- value: !0
10
- }), t.ColorContrastCache = void 0;
11
- const r = s(485);
12
- t.ColorContrastCache = class {
13
- constructor() {
14
- this._color = new r.TwoKeyMap(), this._css = new r.TwoKeyMap();
15
- }
16
- setCss(e, t, s) {
17
- this._css.set(e, t, s);
18
- }
19
- getCss(e, t) {
20
- return this._css.get(e, t);
21
- }
22
- setColor(e, t, s) {
23
- this._color.set(e, t, s);
24
- }
25
- getColor(e, t) {
26
- return this._color.get(e, t);
27
- }
28
- clear() {
29
- this._color.clear(), this._css.clear();
30
- }
31
- };
32
- },
33
- 997: function (e, t, s) {
34
- var r = this && this.__decorate || function (e, t, s, r) {
35
- var o,
36
- i = arguments.length,
37
- n = i < 3 ? t : null === r ? r = Object.getOwnPropertyDescriptor(t, s) : r;
38
- if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) n = Reflect.decorate(e, t, s, r);else for (var l = e.length - 1; l >= 0; l--) (o = e[l]) && (n = (i < 3 ? o(n) : i > 3 ? o(t, s, n) : o(t, s)) || n);
39
- return i > 3 && n && Object.defineProperty(t, s, n), n;
40
- },
41
- o = this && this.__param || function (e, t) {
42
- return function (s, r) {
43
- t(s, r, e);
44
- };
45
- };
46
- Object.defineProperty(t, "__esModule", {
47
- value: !0
48
- }), t.ThemeService = t.DEFAULT_ANSI_COLORS = void 0;
49
- const i = s(930),
50
- n = s(160),
51
- l = s(345),
52
- a = s(859),
53
- c = s(97),
54
- h = n.css.toColor("#ffffff"),
55
- u = n.css.toColor("#000000"),
56
- _ = n.css.toColor("#ffffff"),
57
- d = n.css.toColor("#000000"),
58
- C = {
59
- css: "rgba(255, 255, 255, 0.3)",
60
- rgba: 4294967117
61
- };
62
- t.DEFAULT_ANSI_COLORS = Object.freeze((() => {
63
- const e = [n.css.toColor("#2e3436"), n.css.toColor("#cc0000"), n.css.toColor("#4e9a06"), n.css.toColor("#c4a000"), n.css.toColor("#3465a4"), n.css.toColor("#75507b"), n.css.toColor("#06989a"), n.css.toColor("#d3d7cf"), n.css.toColor("#555753"), n.css.toColor("#ef2929"), n.css.toColor("#8ae234"), n.css.toColor("#fce94f"), n.css.toColor("#729fcf"), n.css.toColor("#ad7fa8"), n.css.toColor("#34e2e2"), n.css.toColor("#eeeeec")],
64
- t = [0, 95, 135, 175, 215, 255];
65
- for (let s = 0; s < 216; s++) {
66
- const r = t[s / 36 % 6 | 0],
67
- o = t[s / 6 % 6 | 0],
68
- i = t[s % 6];
69
- e.push({
70
- css: n.channels.toCss(r, o, i),
71
- rgba: n.channels.toRgba(r, o, i)
72
- });
73
- }
74
- for (let t = 0; t < 24; t++) {
75
- const s = 8 + 10 * t;
76
- e.push({
77
- css: n.channels.toCss(s, s, s),
78
- rgba: n.channels.toRgba(s, s, s)
79
- });
80
- }
81
- return e;
82
- })());
83
- let f = t.ThemeService = class extends a.Disposable {
84
- get colors() {
85
- return this._colors;
86
- }
87
- constructor(e) {
88
- super(), this._optionsService = e, this._contrastCache = new i.ColorContrastCache(), this._halfContrastCache = new i.ColorContrastCache(), this._onChangeColors = this.register(new l.EventEmitter()), this.onChangeColors = this._onChangeColors.event, this._colors = {
89
- foreground: h,
90
- background: u,
91
- cursor: _,
92
- cursorAccent: d,
93
- selectionForeground: void 0,
94
- selectionBackgroundTransparent: C,
95
- selectionBackgroundOpaque: n.color.blend(u, C),
96
- selectionInactiveBackgroundTransparent: C,
97
- selectionInactiveBackgroundOpaque: n.color.blend(u, C),
98
- ansi: t.DEFAULT_ANSI_COLORS.slice(),
99
- contrastCache: this._contrastCache,
100
- halfContrastCache: this._halfContrastCache
101
- }, this._updateRestoreColors(), this._setTheme(this._optionsService.rawOptions.theme), this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio", () => this._contrastCache.clear())), this.register(this._optionsService.onSpecificOptionChange("theme", () => this._setTheme(this._optionsService.rawOptions.theme)));
102
- }
103
- _setTheme(e = {}) {
104
- const s = this._colors;
105
- if (s.foreground = g(e.foreground, h), s.background = g(e.background, u), s.cursor = g(e.cursor, _), s.cursorAccent = g(e.cursorAccent, d), s.selectionBackgroundTransparent = g(e.selectionBackground, C), s.selectionBackgroundOpaque = n.color.blend(s.background, s.selectionBackgroundTransparent), s.selectionInactiveBackgroundTransparent = g(e.selectionInactiveBackground, s.selectionBackgroundTransparent), s.selectionInactiveBackgroundOpaque = n.color.blend(s.background, s.selectionInactiveBackgroundTransparent), s.selectionForeground = e.selectionForeground ? g(e.selectionForeground, n.NULL_COLOR) : void 0, s.selectionForeground === n.NULL_COLOR && (s.selectionForeground = void 0), n.color.isOpaque(s.selectionBackgroundTransparent)) {
106
- const e = .3;
107
- s.selectionBackgroundTransparent = n.color.opacity(s.selectionBackgroundTransparent, e);
108
- }
109
- if (n.color.isOpaque(s.selectionInactiveBackgroundTransparent)) {
110
- const e = .3;
111
- s.selectionInactiveBackgroundTransparent = n.color.opacity(s.selectionInactiveBackgroundTransparent, e);
112
- }
113
- if (s.ansi = t.DEFAULT_ANSI_COLORS.slice(), s.ansi[0] = g(e.black, t.DEFAULT_ANSI_COLORS[0]), s.ansi[1] = g(e.red, t.DEFAULT_ANSI_COLORS[1]), s.ansi[2] = g(e.green, t.DEFAULT_ANSI_COLORS[2]), s.ansi[3] = g(e.yellow, t.DEFAULT_ANSI_COLORS[3]), s.ansi[4] = g(e.blue, t.DEFAULT_ANSI_COLORS[4]), s.ansi[5] = g(e.magenta, t.DEFAULT_ANSI_COLORS[5]), s.ansi[6] = g(e.cyan, t.DEFAULT_ANSI_COLORS[6]), s.ansi[7] = g(e.white, t.DEFAULT_ANSI_COLORS[7]), s.ansi[8] = g(e.brightBlack, t.DEFAULT_ANSI_COLORS[8]), s.ansi[9] = g(e.brightRed, t.DEFAULT_ANSI_COLORS[9]), s.ansi[10] = g(e.brightGreen, t.DEFAULT_ANSI_COLORS[10]), s.ansi[11] = g(e.brightYellow, t.DEFAULT_ANSI_COLORS[11]), s.ansi[12] = g(e.brightBlue, t.DEFAULT_ANSI_COLORS[12]), s.ansi[13] = g(e.brightMagenta, t.DEFAULT_ANSI_COLORS[13]), s.ansi[14] = g(e.brightCyan, t.DEFAULT_ANSI_COLORS[14]), s.ansi[15] = g(e.brightWhite, t.DEFAULT_ANSI_COLORS[15]), e.extendedAnsi) {
114
- const r = Math.min(s.ansi.length - 16, e.extendedAnsi.length);
115
- for (let o = 0; o < r; o++) s.ansi[o + 16] = g(e.extendedAnsi[o], t.DEFAULT_ANSI_COLORS[o + 16]);
116
- }
117
- this._contrastCache.clear(), this._halfContrastCache.clear(), this._updateRestoreColors(), this._onChangeColors.fire(this.colors);
118
- }
119
- restoreColor(e) {
120
- this._restoreColor(e), this._onChangeColors.fire(this.colors);
121
- }
122
- _restoreColor(e) {
123
- if (void 0 !== e) switch (e) {
124
- case 256:
125
- this._colors.foreground = this._restoreColors.foreground;
126
- break;
127
- case 257:
128
- this._colors.background = this._restoreColors.background;
129
- break;
130
- case 258:
131
- this._colors.cursor = this._restoreColors.cursor;
132
- break;
133
- default:
134
- this._colors.ansi[e] = this._restoreColors.ansi[e];
135
- } else for (let e = 0; e < this._restoreColors.ansi.length; ++e) this._colors.ansi[e] = this._restoreColors.ansi[e];
136
- }
137
- modifyColors(e) {
138
- e(this._colors), this._onChangeColors.fire(this.colors);
139
- }
140
- _updateRestoreColors() {
141
- this._restoreColors = {
142
- foreground: this._colors.foreground,
143
- background: this._colors.background,
144
- cursor: this._colors.cursor,
145
- ansi: this._colors.ansi.slice()
146
- };
147
- }
148
- };
149
- function g(e, t) {
150
- if (void 0 !== e) try {
151
- return n.css.toColor(e);
152
- } catch {}
153
- return t;
154
- }
155
- t.ThemeService = f = r([o(0, c.IOptionsService)], f);
156
- },
157
- 160: (e, t) => {
158
- Object.defineProperty(t, "__esModule", {
159
- value: !0
160
- }), t.contrastRatio = t.toPaddedHex = t.rgba = t.rgb = t.css = t.color = t.channels = t.NULL_COLOR = void 0;
161
- let s = 0,
162
- r = 0,
163
- o = 0,
164
- i = 0;
165
- var n, l, a, c, h;
166
- function u(e) {
167
- const t = e.toString(16);
168
- return t.length < 2 ? "0" + t : t;
169
- }
170
- function _(e, t) {
171
- return e < t ? (t + .05) / (e + .05) : (e + .05) / (t + .05);
172
- }
173
- t.NULL_COLOR = {
174
- css: "#00000000",
175
- rgba: 0
176
- }, function (e) {
177
- e.toCss = function (e, t, s, r) {
178
- return void 0 !== r ? `#${u(e)}${u(t)}${u(s)}${u(r)}` : `#${u(e)}${u(t)}${u(s)}`;
179
- }, e.toRgba = function (e, t, s, r = 255) {
180
- return (e << 24 | t << 16 | s << 8 | r) >>> 0;
181
- }, e.toColor = function (t, s, r, o) {
182
- return {
183
- css: e.toCss(t, s, r, o),
184
- rgba: e.toRgba(t, s, r, o)
185
- };
186
- };
187
- }(n || (t.channels = n = {})), function (e) {
188
- function t(e, t) {
189
- return i = Math.round(255 * t), [s, r, o] = h.toChannels(e.rgba), {
190
- css: n.toCss(s, r, o, i),
191
- rgba: n.toRgba(s, r, o, i)
192
- };
193
- }
194
- e.blend = function (e, t) {
195
- if (i = (255 & t.rgba) / 255, 1 === i) return {
196
- css: t.css,
197
- rgba: t.rgba
198
- };
199
- const l = t.rgba >> 24 & 255,
200
- a = t.rgba >> 16 & 255,
201
- c = t.rgba >> 8 & 255,
202
- h = e.rgba >> 24 & 255,
203
- u = e.rgba >> 16 & 255,
204
- _ = e.rgba >> 8 & 255;
205
- return s = h + Math.round((l - h) * i), r = u + Math.round((a - u) * i), o = _ + Math.round((c - _) * i), {
206
- css: n.toCss(s, r, o),
207
- rgba: n.toRgba(s, r, o)
208
- };
209
- }, e.isOpaque = function (e) {
210
- return 255 == (255 & e.rgba);
211
- }, e.ensureContrastRatio = function (e, t, s) {
212
- const r = h.ensureContrastRatio(e.rgba, t.rgba, s);
213
- if (r) return n.toColor(r >> 24 & 255, r >> 16 & 255, r >> 8 & 255);
214
- }, e.opaque = function (e) {
215
- const t = (255 | e.rgba) >>> 0;
216
- return [s, r, o] = h.toChannels(t), {
217
- css: n.toCss(s, r, o),
218
- rgba: t
219
- };
220
- }, e.opacity = t, e.multiplyOpacity = function (e, s) {
221
- return i = 255 & e.rgba, t(e, i * s / 255);
222
- }, e.toColorRGB = function (e) {
223
- return [e.rgba >> 24 & 255, e.rgba >> 16 & 255, e.rgba >> 8 & 255];
224
- };
225
- }(l || (t.color = l = {})), function (e) {
226
- let t, l;
227
- try {
228
- const e = document.createElement("canvas");
229
- e.width = 1, e.height = 1;
230
- const s = e.getContext("2d", {
231
- willReadFrequently: !0
232
- });
233
- s && (t = s, t.globalCompositeOperation = "copy", l = t.createLinearGradient(0, 0, 1, 1));
234
- } catch {}
235
- e.toColor = function (e) {
236
- if (e.match(/#[\da-f]{3,8}/i)) switch (e.length) {
237
- case 4:
238
- return s = parseInt(e.slice(1, 2).repeat(2), 16), r = parseInt(e.slice(2, 3).repeat(2), 16), o = parseInt(e.slice(3, 4).repeat(2), 16), n.toColor(s, r, o);
239
- case 5:
240
- return s = parseInt(e.slice(1, 2).repeat(2), 16), r = parseInt(e.slice(2, 3).repeat(2), 16), o = parseInt(e.slice(3, 4).repeat(2), 16), i = parseInt(e.slice(4, 5).repeat(2), 16), n.toColor(s, r, o, i);
241
- case 7:
242
- return {
243
- css: e,
244
- rgba: (parseInt(e.slice(1), 16) << 8 | 255) >>> 0
245
- };
246
- case 9:
247
- return {
248
- css: e,
249
- rgba: parseInt(e.slice(1), 16) >>> 0
250
- };
251
- }
252
- const a = e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);
253
- if (a) return s = parseInt(a[1]), r = parseInt(a[2]), o = parseInt(a[3]), i = Math.round(255 * (void 0 === a[5] ? 1 : parseFloat(a[5]))), n.toColor(s, r, o, i);
254
- if (!t || !l) throw new Error("css.toColor: Unsupported css format");
255
- if (t.fillStyle = l, t.fillStyle = e, "string" != typeof t.fillStyle) throw new Error("css.toColor: Unsupported css format");
256
- if (t.fillRect(0, 0, 1, 1), [s, r, o, i] = t.getImageData(0, 0, 1, 1).data, 255 !== i) throw new Error("css.toColor: Unsupported css format");
257
- return {
258
- rgba: n.toRgba(s, r, o, i),
259
- css: e
260
- };
261
- };
262
- }(a || (t.css = a = {})), function (e) {
263
- function t(e, t, s) {
264
- const r = e / 255,
265
- o = t / 255,
266
- i = s / 255;
267
- return .2126 * (r <= .03928 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4)) + .7152 * (o <= .03928 ? o / 12.92 : Math.pow((o + .055) / 1.055, 2.4)) + .0722 * (i <= .03928 ? i / 12.92 : Math.pow((i + .055) / 1.055, 2.4));
268
- }
269
- e.relativeLuminance = function (e) {
270
- return t(e >> 16 & 255, e >> 8 & 255, 255 & e);
271
- }, e.relativeLuminance2 = t;
272
- }(c || (t.rgb = c = {})), function (e) {
273
- function t(e, t, s) {
274
- const r = e >> 24 & 255,
275
- o = e >> 16 & 255,
276
- i = e >> 8 & 255;
277
- let n = t >> 24 & 255,
278
- l = t >> 16 & 255,
279
- a = t >> 8 & 255,
280
- h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
281
- for (; h < s && (n > 0 || l > 0 || a > 0);) n -= Math.max(0, Math.ceil(.1 * n)), l -= Math.max(0, Math.ceil(.1 * l)), a -= Math.max(0, Math.ceil(.1 * a)), h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
282
- return (n << 24 | l << 16 | a << 8 | 255) >>> 0;
283
- }
284
- function l(e, t, s) {
285
- const r = e >> 24 & 255,
286
- o = e >> 16 & 255,
287
- i = e >> 8 & 255;
288
- let n = t >> 24 & 255,
289
- l = t >> 16 & 255,
290
- a = t >> 8 & 255,
291
- h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
292
- for (; h < s && (n < 255 || l < 255 || a < 255);) n = Math.min(255, n + Math.ceil(.1 * (255 - n))), l = Math.min(255, l + Math.ceil(.1 * (255 - l))), a = Math.min(255, a + Math.ceil(.1 * (255 - a))), h = _(c.relativeLuminance2(n, l, a), c.relativeLuminance2(r, o, i));
293
- return (n << 24 | l << 16 | a << 8 | 255) >>> 0;
294
- }
295
- e.blend = function (e, t) {
296
- if (i = (255 & t) / 255, 1 === i) return t;
297
- const l = t >> 24 & 255,
298
- a = t >> 16 & 255,
299
- c = t >> 8 & 255,
300
- h = e >> 24 & 255,
301
- u = e >> 16 & 255,
302
- _ = e >> 8 & 255;
303
- return s = h + Math.round((l - h) * i), r = u + Math.round((a - u) * i), o = _ + Math.round((c - _) * i), n.toRgba(s, r, o);
304
- }, e.ensureContrastRatio = function (e, s, r) {
305
- const o = c.relativeLuminance(e >> 8),
306
- i = c.relativeLuminance(s >> 8);
307
- if (_(o, i) < r) {
308
- if (i < o) {
309
- const i = t(e, s, r),
310
- n = _(o, c.relativeLuminance(i >> 8));
311
- if (n < r) {
312
- const t = l(e, s, r);
313
- return n > _(o, c.relativeLuminance(t >> 8)) ? i : t;
314
- }
315
- return i;
316
- }
317
- const n = l(e, s, r),
318
- a = _(o, c.relativeLuminance(n >> 8));
319
- if (a < r) {
320
- const i = t(e, s, r);
321
- return a > _(o, c.relativeLuminance(i >> 8)) ? n : i;
322
- }
323
- return n;
324
- }
325
- }, e.reduceLuminance = t, e.increaseLuminance = l, e.toChannels = function (e) {
326
- return [e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, 255 & e];
327
- };
328
- }(h || (t.rgba = h = {})), t.toPaddedHex = u, t.contrastRatio = _;
329
- },
330
- 345: (e, t) => {
331
- Object.defineProperty(t, "__esModule", {
332
- value: !0
333
- }), t.runAndSubscribe = t.forwardEvent = t.EventEmitter = void 0, t.EventEmitter = class {
334
- constructor() {
335
- this._listeners = [], this._disposed = !1;
336
- }
337
- get event() {
338
- return this._event || (this._event = e => (this._listeners.push(e), {
339
- dispose: () => {
340
- if (!this._disposed) for (let t = 0; t < this._listeners.length; t++) if (this._listeners[t] === e) return void this._listeners.splice(t, 1);
341
- }
342
- })), this._event;
343
- }
344
- fire(e, t) {
345
- const s = [];
346
- for (let e = 0; e < this._listeners.length; e++) s.push(this._listeners[e]);
347
- for (let r = 0; r < s.length; r++) s[r].call(void 0, e, t);
348
- }
349
- dispose() {
350
- this.clearListeners(), this._disposed = !0;
351
- }
352
- clearListeners() {
353
- this._listeners && (this._listeners.length = 0);
354
- }
355
- }, t.forwardEvent = function (e, t) {
356
- return e(e => t.fire(e));
357
- }, t.runAndSubscribe = function (e, t) {
358
- return t(void 0), e(e => t(e));
359
- };
360
- },
361
- 859: (e, t) => {
362
- function s(e) {
363
- for (const t of e) t.dispose();
364
- e.length = 0;
365
- }
366
- Object.defineProperty(t, "__esModule", {
367
- value: !0
368
- }), t.getDisposeArrayDisposable = t.disposeArray = t.toDisposable = t.MutableDisposable = t.Disposable = void 0, t.Disposable = class {
369
- constructor() {
370
- this._disposables = [], this._isDisposed = !1;
371
- }
372
- dispose() {
373
- this._isDisposed = !0;
374
- for (const e of this._disposables) e.dispose();
375
- this._disposables.length = 0;
376
- }
377
- register(e) {
378
- return this._disposables.push(e), e;
379
- }
380
- unregister(e) {
381
- const t = this._disposables.indexOf(e);
382
- -1 !== t && this._disposables.splice(t, 1);
383
- }
384
- }, t.MutableDisposable = class {
385
- constructor() {
386
- this._isDisposed = !1;
387
- }
388
- get value() {
389
- return this._isDisposed ? void 0 : this._value;
390
- }
391
- set value(e) {
392
- this._isDisposed || e === this._value || (this._value?.dispose(), this._value = e);
393
- }
394
- clear() {
395
- this.value = void 0;
396
- }
397
- dispose() {
398
- this._isDisposed = !0, this._value?.dispose(), this._value = void 0;
399
- }
400
- }, t.toDisposable = function (e) {
401
- return {
402
- dispose: e
403
- };
404
- }, t.disposeArray = s, t.getDisposeArrayDisposable = function (e) {
405
- return {
406
- dispose: () => s(e)
407
- };
408
- };
409
- },
410
- 485: (e, t) => {
411
- Object.defineProperty(t, "__esModule", {
412
- value: !0
413
- }), t.FourKeyMap = t.TwoKeyMap = void 0;
414
- class s {
415
- constructor() {
416
- this._data = {};
417
- }
418
- set(e, t, s) {
419
- this._data[e] || (this._data[e] = {}), this._data[e][t] = s;
420
- }
421
- get(e, t) {
422
- return this._data[e] ? this._data[e][t] : void 0;
423
- }
424
- clear() {
425
- this._data = {};
426
- }
427
- }
428
- t.TwoKeyMap = s, t.FourKeyMap = class {
429
- constructor() {
430
- this._data = new s();
431
- }
432
- set(e, t, r, o, i) {
433
- this._data.get(e, t) || this._data.set(e, t, new s()), this._data.get(e, t).set(r, o, i);
434
- }
435
- get(e, t, s, r) {
436
- return this._data.get(e, t)?.get(s, r);
437
- }
438
- clear() {
439
- this._data.clear();
440
- }
441
- };
442
- },
443
- 726: (e, t) => {
444
- Object.defineProperty(t, "__esModule", {
445
- value: !0
446
- }), t.createDecorator = t.getServiceDependencies = t.serviceRegistry = void 0;
447
- const s = "di$target",
448
- r = "di$dependencies";
449
- t.serviceRegistry = new Map(), t.getServiceDependencies = function (e) {
450
- return e[r] || [];
451
- }, t.createDecorator = function (e) {
452
- if (t.serviceRegistry.has(e)) return t.serviceRegistry.get(e);
453
- const o = function (e, t, i) {
454
- if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter");
455
- !function (e, t, o) {
456
- t[s] === t ? t[r].push({
457
- id: e,
458
- index: o
459
- }) : (t[r] = [{
460
- id: e,
461
- index: o
462
- }], t[s] = t);
463
- }(o, e, i);
464
- };
465
- return o.toString = () => e, t.serviceRegistry.set(e, o), o;
466
- };
467
- },
468
- 97: (e, t, s) => {
469
- Object.defineProperty(t, "__esModule", {
470
- value: !0
471
- }), t.IDecorationService = t.IUnicodeService = t.IOscLinkService = t.IOptionsService = t.ILogService = t.LogLevelEnum = t.IInstantiationService = t.ICharsetService = t.ICoreService = t.ICoreMouseService = t.IBufferService = void 0;
472
- const r = s(726);
473
- var o;
474
- t.IBufferService = (0, r.createDecorator)("BufferService"), t.ICoreMouseService = (0, r.createDecorator)("CoreMouseService"), t.ICoreService = (0, r.createDecorator)("CoreService"), t.ICharsetService = (0, r.createDecorator)("CharsetService"), t.IInstantiationService = (0, r.createDecorator)("InstantiationService"), function (e) {
475
- e[e.TRACE = 0] = "TRACE", e[e.DEBUG = 1] = "DEBUG", e[e.INFO = 2] = "INFO", e[e.WARN = 3] = "WARN", e[e.ERROR = 4] = "ERROR", e[e.OFF = 5] = "OFF";
476
- }(o || (t.LogLevelEnum = o = {})), t.ILogService = (0, r.createDecorator)("LogService"), t.IOptionsService = (0, r.createDecorator)("OptionsService"), t.IOscLinkService = (0, r.createDecorator)("OscLinkService"), t.IUnicodeService = (0, r.createDecorator)("UnicodeService"), t.IDecorationService = (0, r.createDecorator)("DecorationService");
477
- }
478
- },
479
- t = {};
480
- function s(r) {
481
- var o = t[r];
482
- if (void 0 !== o) return o.exports;
483
- var i = t[r] = {
484
- exports: {}
485
- };
486
- return e[r].call(i.exports, i, i.exports, s), i.exports;
487
- }
488
- var r = {};
489
- return (() => {
490
- var e = r;
491
- Object.defineProperty(e, "__esModule", {
492
- value: !0
493
- }), e.HTMLSerializeHandler = e.SerializeAddon = void 0;
494
- const t = s(997);
495
- function o(e, t, s) {
496
- return Math.max(t, Math.min(e, s));
497
- }
498
- class i {
499
- constructor(e) {
500
- this._buffer = e;
501
- }
502
- serialize(e, t) {
503
- const s = this._buffer.getNullCell(),
504
- r = this._buffer.getNullCell();
505
- let o = s;
506
- const i = e.start.y,
507
- n = e.end.y,
508
- l = e.start.x,
509
- a = e.end.x;
510
- this._beforeSerialize(n - i, i, n);
511
- for (let t = i; t <= n; t++) {
512
- const i = this._buffer.getLine(t);
513
- if (i) {
514
- const n = t === e.start.y ? l : 0,
515
- c = t === e.end.y ? a : i.length;
516
- for (let e = n; e < c; e++) {
517
- const n = i.getCell(e, o === s ? r : s);
518
- n ? (this._nextCell(n, o, t, e), o = n) : console.warn(`Can't get cell at row=${t}, col=${e}`);
519
- }
520
- }
521
- this._rowEnd(t, t === n);
522
- }
523
- return this._afterSerialize(), this._serializeString(t);
524
- }
525
- _nextCell(e, t, s, r) {}
526
- _rowEnd(e, t) {}
527
- _beforeSerialize(e, t, s) {}
528
- _afterSerialize() {}
529
- _serializeString(e) {
530
- return "";
531
- }
532
- }
533
- function n(e, t) {
534
- return e.getFgColorMode() === t.getFgColorMode() && e.getFgColor() === t.getFgColor();
535
- }
536
- function l(e, t) {
537
- return e.getBgColorMode() === t.getBgColorMode() && e.getBgColor() === t.getBgColor();
538
- }
539
- function a(e, t) {
540
- return e.isInverse() === t.isInverse() && e.isBold() === t.isBold() && e.isUnderline() === t.isUnderline() && e.isOverline() === t.isOverline() && e.isBlink() === t.isBlink() && e.isInvisible() === t.isInvisible() && e.isItalic() === t.isItalic() && e.isDim() === t.isDim() && e.isStrikethrough() === t.isStrikethrough();
541
- }
542
- class c extends i {
543
- constructor(e, t) {
544
- super(e), this._terminal = t, this._rowIndex = 0, this._allRows = new Array(), this._allRowSeparators = new Array(), this._currentRow = "", this._nullCellCount = 0, this._cursorStyle = this._buffer.getNullCell(), this._cursorStyleRow = 0, this._cursorStyleCol = 0, this._backgroundCell = this._buffer.getNullCell(), this._firstRow = 0, this._lastCursorRow = 0, this._lastCursorCol = 0, this._lastContentCursorRow = 0, this._lastContentCursorCol = 0, this._thisRowLastChar = this._buffer.getNullCell(), this._thisRowLastSecondChar = this._buffer.getNullCell(), this._nextRowFirstChar = this._buffer.getNullCell();
545
- }
546
- _beforeSerialize(e, t, s) {
547
- this._allRows = new Array(e), this._lastContentCursorRow = t, this._lastCursorRow = t, this._firstRow = t;
548
- }
549
- _rowEnd(e, t) {
550
- this._nullCellCount > 0 && !l(this._cursorStyle, this._backgroundCell) && (this._currentRow += `[${this._nullCellCount}X`);
551
- let s = "";
552
- if (!t) {
553
- e - this._firstRow >= this._terminal.rows && this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);
554
- const t = this._buffer.getLine(e),
555
- r = this._buffer.getLine(e + 1);
556
- if (r.isWrapped) {
557
- s = "";
558
- const o = t.getCell(t.length - 1, this._thisRowLastChar),
559
- i = t.getCell(t.length - 2, this._thisRowLastSecondChar),
560
- n = r.getCell(0, this._nextRowFirstChar),
561
- a = n.getWidth() > 1;
562
- let c = !1;
563
- (n.getChars() && a ? this._nullCellCount <= 1 : this._nullCellCount <= 0) && ((o.getChars() || 0 === o.getWidth()) && l(o, n) && (c = !0), a && (i.getChars() || 0 === i.getWidth()) && l(o, n) && l(i, n) && (c = !0)), c || (s = "-".repeat(this._nullCellCount + 1), s += "", this._nullCellCount > 0 && (s += "", s += `[${t.length - this._nullCellCount}C`, s += `[${this._nullCellCount}X`, s += `[${t.length - this._nullCellCount}D`, s += ""), this._lastContentCursorRow = e + 1, this._lastContentCursorCol = 0, this._lastCursorRow = e + 1, this._lastCursorCol = 0);
564
- } else s = "\r\n", this._lastCursorRow = e + 1, this._lastCursorCol = 0;
565
- }
566
- this._allRows[this._rowIndex] = this._currentRow, this._allRowSeparators[this._rowIndex++] = s, this._currentRow = "", this._nullCellCount = 0;
567
- }
568
- _diffStyle(e, t) {
569
- const s = [],
570
- r = !n(e, t),
571
- o = !l(e, t),
572
- i = !a(e, t);
573
- if (r || o || i) if (e.isAttributeDefault()) t.isAttributeDefault() || s.push(0);else {
574
- if (r) {
575
- const t = e.getFgColor();
576
- e.isFgRGB() ? s.push(38, 2, t >>> 16 & 255, t >>> 8 & 255, 255 & t) : e.isFgPalette() ? t >= 16 ? s.push(38, 5, t) : s.push(8 & t ? 90 + (7 & t) : 30 + (7 & t)) : s.push(39);
577
- }
578
- if (o) {
579
- const t = e.getBgColor();
580
- e.isBgRGB() ? s.push(48, 2, t >>> 16 & 255, t >>> 8 & 255, 255 & t) : e.isBgPalette() ? t >= 16 ? s.push(48, 5, t) : s.push(8 & t ? 100 + (7 & t) : 40 + (7 & t)) : s.push(49);
581
- }
582
- i && (e.isInverse() !== t.isInverse() && s.push(e.isInverse() ? 7 : 27), e.isBold() !== t.isBold() && s.push(e.isBold() ? 1 : 22), e.isUnderline() !== t.isUnderline() && s.push(e.isUnderline() ? 4 : 24), e.isOverline() !== t.isOverline() && s.push(e.isOverline() ? 53 : 55), e.isBlink() !== t.isBlink() && s.push(e.isBlink() ? 5 : 25), e.isInvisible() !== t.isInvisible() && s.push(e.isInvisible() ? 8 : 28), e.isItalic() !== t.isItalic() && s.push(e.isItalic() ? 3 : 23), e.isDim() !== t.isDim() && s.push(e.isDim() ? 2 : 22), e.isStrikethrough() !== t.isStrikethrough() && s.push(e.isStrikethrough() ? 9 : 29));
583
- }
584
- return s;
585
- }
586
- _nextCell(e, t, s, r) {
587
- if (0 === e.getWidth()) return;
588
- const o = "" === e.getChars(),
589
- i = this._diffStyle(e, this._cursorStyle);
590
- if (o ? !l(this._cursorStyle, e) : i.length > 0) {
591
- this._nullCellCount > 0 && (l(this._cursorStyle, this._backgroundCell) || (this._currentRow += `[${this._nullCellCount}X`), this._currentRow += `[${this._nullCellCount}C`, this._nullCellCount = 0), this._lastContentCursorRow = this._lastCursorRow = s, this._lastContentCursorCol = this._lastCursorCol = r, this._currentRow += `[${i.join(";")}m`;
592
- const e = this._buffer.getLine(s);
593
- void 0 !== e && (e.getCell(r, this._cursorStyle), this._cursorStyleRow = s, this._cursorStyleCol = r);
594
- }
595
- o ? this._nullCellCount += e.getWidth() : (this._nullCellCount > 0 && (l(this._cursorStyle, this._backgroundCell) || (this._currentRow += `[${this._nullCellCount}X`), this._currentRow += `[${this._nullCellCount}C`, this._nullCellCount = 0), this._currentRow += e.getChars(), this._lastContentCursorRow = this._lastCursorRow = s, this._lastContentCursorCol = this._lastCursorCol = r + e.getWidth());
596
- }
597
- _serializeString(e) {
598
- let t = this._allRows.length;
599
- this._buffer.length - this._firstRow <= this._terminal.rows && (t = this._lastContentCursorRow + 1 - this._firstRow, this._lastCursorCol = this._lastContentCursorCol, this._lastCursorRow = this._lastContentCursorRow);
600
- let s = "";
601
- for (let e = 0; e < t; e++) s += this._allRows[e], e + 1 < t && (s += this._allRowSeparators[e]);
602
- if (!e) {
603
- const e = this._buffer.baseY + this._buffer.cursorY,
604
- t = this._buffer.cursorX,
605
- o = e => {
606
- e > 0 ? s += `[${e}C` : e < 0 && (s += `[${-e}D`);
607
- };
608
- (e !== this._lastCursorRow || t !== this._lastCursorCol) && ((r = e - this._lastCursorRow) > 0 ? s += `[${r}B` : r < 0 && (s += `[${-r}A`), o(t - this._lastCursorCol));
609
- }
610
- var r;
611
- const o = this._terminal._core._inputHandler._curAttrData,
612
- i = this._diffStyle(o, this._cursorStyle);
613
- return i.length > 0 && (s += `[${i.join(";")}m`), s;
614
- }
615
- }
616
- e.SerializeAddon = class {
617
- activate(e) {
618
- this._terminal = e;
619
- }
620
- _serializeBufferByScrollback(e, t, s) {
621
- const r = t.length,
622
- i = void 0 === s ? r : o(s + e.rows, 0, r);
623
- return this._serializeBufferByRange(e, t, {
624
- start: r - i,
625
- end: r - 1
626
- }, !1);
627
- }
628
- _serializeBufferByRange(e, t, s, r) {
629
- return new c(t, e).serialize({
630
- start: {
631
- x: 0,
632
- y: "number" == typeof s.start ? s.start : s.start.line
633
- },
634
- end: {
635
- x: e.cols,
636
- y: "number" == typeof s.end ? s.end : s.end.line
637
- }
638
- }, r);
639
- }
640
- _serializeBufferAsHTML(e, t) {
641
- const s = e.buffer.active,
642
- r = new h(s, e, t);
643
- if (!t.onlySelection) {
644
- const i = s.length,
645
- n = t.scrollback,
646
- l = void 0 === n ? i : o(n + e.rows, 0, i);
647
- return r.serialize({
648
- start: {
649
- x: 0,
650
- y: i - l
651
- },
652
- end: {
653
- x: e.cols,
654
- y: i - 1
655
- }
656
- });
657
- }
658
- const i = this._terminal?.getSelectionPosition();
659
- return void 0 !== i ? r.serialize({
660
- start: {
661
- x: i.start.x,
662
- y: i.start.y
663
- },
664
- end: {
665
- x: i.end.x,
666
- y: i.end.y
667
- }
668
- }) : "";
669
- }
670
- _serializeModes(e) {
671
- let t = "";
672
- const s = e.modes;
673
- if (s.applicationCursorKeysMode && (t += "[?1h"), s.applicationKeypadMode && (t += "[?66h"), s.bracketedPasteMode && (t += "[?2004h"), s.insertMode && (t += ""), s.originMode && (t += "[?6h"), s.reverseWraparoundMode && (t += "[?45h"), s.sendFocusMode && (t += "[?1004h"), !1 === s.wraparoundMode && (t += "[?7l"), "none" !== s.mouseTrackingMode) switch (s.mouseTrackingMode) {
674
- case "x10":
675
- t += "[?9h";
676
- break;
677
- case "vt200":
678
- t += "[?1000h";
679
- break;
680
- case "drag":
681
- t += "[?1002h";
682
- break;
683
- case "any":
684
- t += "[?1003h";
685
- }
686
- return t;
687
- }
688
- serialize(e) {
689
- if (!this._terminal) throw new Error("Cannot use addon until it has been loaded");
690
- let t = e?.range ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, e.range, !0) : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, e?.scrollback);
691
- return e?.excludeAltBuffer || "alternate" !== this._terminal.buffer.active.type || (t += `[?1049h${this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, void 0)}`), e?.excludeModes || (t += this._serializeModes(this._terminal)), t;
692
- }
693
- serializeAsHTML(e) {
694
- if (!this._terminal) throw new Error("Cannot use addon until it has been loaded");
695
- return this._serializeBufferAsHTML(this._terminal, e || {});
696
- }
697
- dispose() {}
698
- };
699
- class h extends i {
700
- constructor(e, s, r) {
701
- super(e), this._terminal = s, this._options = r, this._currentRow = "", this._htmlContent = "", s._core._themeService ? this._ansiColors = s._core._themeService.colors.ansi : this._ansiColors = t.DEFAULT_ANSI_COLORS;
702
- }
703
- _padStart(e, t, s) {
704
- return t >>= 0, s = s ?? " ", e.length > t ? e : ((t -= e.length) > s.length && (s += s.repeat(t / s.length)), s.slice(0, t) + e);
705
- }
706
- _beforeSerialize(e, t, s) {
707
- this._htmlContent += "<html><body>\x3c!--StartFragment--\x3e<pre>";
708
- let r = "#000000",
709
- o = "#ffffff";
710
- this._options.includeGlobalBackground && (r = this._terminal.options.theme?.foreground ?? "#ffffff", o = this._terminal.options.theme?.background ?? "#000000");
711
- const i = [];
712
- i.push("color: " + r + ";"), i.push("background-color: " + o + ";"), i.push("font-family: " + this._terminal.options.fontFamily + ";"), i.push("font-size: " + this._terminal.options.fontSize + "px;"), this._htmlContent += "<div style='" + i.join(" ") + "'>";
713
- }
714
- _afterSerialize() {
715
- this._htmlContent += "</div>", this._htmlContent += "</pre>\x3c!--EndFragment--\x3e</body></html>";
716
- }
717
- _rowEnd(e, t) {
718
- this._htmlContent += "<div><span>" + this._currentRow + "</span></div>", this._currentRow = "";
719
- }
720
- _getHexColor(e, t) {
721
- const s = t ? e.getFgColor() : e.getBgColor();
722
- return (t ? e.isFgRGB() : e.isBgRGB()) ? "#" + [s >> 16 & 255, s >> 8 & 255, 255 & s].map(e => this._padStart(e.toString(16), 2, "0")).join("") : (t ? e.isFgPalette() : e.isBgPalette()) ? this._ansiColors[s].css : void 0;
723
- }
724
- _diffStyle(e, t) {
725
- const s = [],
726
- r = !n(e, t),
727
- o = !l(e, t),
728
- i = !a(e, t);
729
- if (r || o || i) {
730
- const t = this._getHexColor(e, !0);
731
- t && s.push("color: " + t + ";");
732
- const r = this._getHexColor(e, !1);
733
- return r && s.push("background-color: " + r + ";"), e.isInverse() && s.push("color: #000000; background-color: #BFBFBF;"), e.isBold() && s.push("font-weight: bold;"), e.isUnderline() && e.isOverline() ? s.push("text-decoration: overline underline;") : e.isUnderline() ? s.push("text-decoration: underline;") : e.isOverline() && s.push("text-decoration: overline;"), e.isBlink() && s.push("text-decoration: blink;"), e.isInvisible() && s.push("visibility: hidden;"), e.isItalic() && s.push("font-style: italic;"), e.isDim() && s.push("opacity: 0.5;"), e.isStrikethrough() && s.push("text-decoration: line-through;"), s;
734
- }
735
- }
736
- _nextCell(e, t, s, r) {
737
- if (0 === e.getWidth()) return;
738
- const o = "" === e.getChars(),
739
- i = this._diffStyle(e, t);
740
- i && (this._currentRow += 0 === i.length ? "</span><span>" : "</span><span style='" + i.join(" ") + "'>"), this._currentRow += o ? " " : e.getChars();
741
- }
742
- _serializeString() {
743
- return this._htmlContent;
744
- }
745
- }
746
- e.HTMLSerializeHandler = h;
747
- })(), r;
748
- })());
749
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9icm93c2VyL3NlcnZpY2VzL1RoZW1lU2VydmljZS50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0NvbG9yLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vRXZlbnRFbWl0dGVyLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvU2VyaWFsaXplQWRkb24udHMiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiZmlsZTovLy9Vc2Vycy9kYW1pZW4ubWFpbGxhcmQvZGV2L3BlcnNvL2pzZW52LWNvcmUvcGFja2FnZXMvcmVsYXRlZC90ZXN0L3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9icm93c2VyL0NvbG9yQ29udHJhc3RDYWNoZS50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UudHMiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9Db2xvci50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0V2ZW50RW1pdHRlci50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0xpZmVjeWNsZS50cyIsImZpbGU6Ly8vVXNlcnMvZGFtaWVuLm1haWxsYXJkL2Rldi9wZXJzby9qc2Vudi1jb3JlL3BhY2thZ2VzL3JlbGF0ZWQvdGVzdC93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL011bHRpS2V5TWFwLnRzIiwiZmlsZTovLy9Vc2Vycy9kYW1pZW4ubWFpbGxhcmQvZGV2L3BlcnNvL2pzZW52LWNvcmUvcGFja2FnZXMvcmVsYXRlZC90ZXN0L3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwiZmlsZTovLy9Vc2Vycy9kYW1pZW4ubWFpbGxhcmQvZGV2L3BlcnNvL2pzZW52LWNvcmUvcGFja2FnZXMvcmVsYXRlZC90ZXN0L3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZXMudHMiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vd2VicGFjay9ib290c3RyYXAiLCJmaWxlOi8vL1VzZXJzL2RhbWllbi5tYWlsbGFyZC9kZXYvcGVyc28vanNlbnYtY29yZS9wYWNrYWdlcy9yZWxhdGVkL3Rlc3Qvd2VicGFjazovU2VyaWFsaXplQWRkb24vc3JjL1NlcmlhbGl6ZUFkZG9uLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInRoaXMiLCJfY29sb3IiLCJUd29LZXlNYXAiLCJfY3NzIiwic2V0Q3NzIiwiYmciLCJmZyIsInZhbHVlIiwic2V0IiwiZ2V0Q3NzIiwiZ2V0Iiwic2V0Q29sb3IiLCJnZXRDb2xvciIsImNsZWFyIiwiREVGQVVMVF9GT1JFR1JPVU5EIiwiY3NzIiwidG9Db2xvciIsIkRFRkFVTFRfQkFDS0dST1VORCIsIkRFRkFVTFRfQ1VSU09SIiwiREVGQVVMVF9DVVJTT1JfQUNDRU5UIiwiREVGQVVMVF9TRUxFQ1RJT04iLCJyZ2JhIiwiREVGQVVMVF9BTlNJX0NPTE9SUyIsIk9iamVjdCIsImZyZWV6ZSIsImNvbG9ycyIsInYiLCJpIiwiciIsImciLCJiIiwicHVzaCIsImNoYW5uZWxzIiwidG9Dc3MiLCJ0b1JnYmEiLCJjIiwiVGhlbWVTZXJ2aWNlIiwiRGlzcG9zYWJsZSIsIl9jb2xvcnMiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiX29wdGlvbnNTZXJ2aWNlIiwiX2NvbnRyYXN0Q2FjaGUiLCJDb2xvckNvbnRyYXN0Q2FjaGUiLCJfaGFsZkNvbnRyYXN0Q2FjaGUiLCJfb25DaGFuZ2VDb2xvcnMiLCJyZWdpc3RlciIsIkV2ZW50RW1pdHRlciIsIm9uQ2hhbmdlQ29sb3JzIiwiZXZlbnQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImN1cnNvciIsImN1cnNvckFjY2VudCIsInNlbGVjdGlvbkZvcmVncm91bmQiLCJ1bmRlZmluZWQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIiwiY29sb3IiLCJibGVuZCIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50Iiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlIiwiYW5zaSIsInNsaWNlIiwiY29udHJhc3RDYWNoZSIsImhhbGZDb250cmFzdENhY2hlIiwiX3VwZGF0ZVJlc3RvcmVDb2xvcnMiLCJfc2V0VGhlbWUiLCJyYXdPcHRpb25zIiwidGhlbWUiLCJvblNwZWNpZmljT3B0aW9uQ2hhbmdlIiwicGFyc2VDb2xvciIsInNlbGVjdGlvbkJhY2tncm91bmQiLCJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQiLCJOVUxMX0NPTE9SIiwiaXNPcGFxdWUiLCJvcGFjaXR5IiwiYmxhY2siLCJyZWQiLCJncmVlbiIsInllbGxvdyIsImJsdWUiLCJtYWdlbnRhIiwiY3lhbiIsIndoaXRlIiwiYnJpZ2h0QmxhY2siLCJicmlnaHRSZWQiLCJicmlnaHRHcmVlbiIsImJyaWdodFllbGxvdyIsImJyaWdodEJsdWUiLCJicmlnaHRNYWdlbnRhIiwiYnJpZ2h0Q3lhbiIsImJyaWdodFdoaXRlIiwiZXh0ZW5kZWRBbnNpIiwiY29sb3JDb3VudCIsIk1hdGgiLCJtaW4iLCJsZW5ndGgiLCJmaXJlIiwicmVzdG9yZUNvbG9yIiwic2xvdCIsIl9yZXN0b3JlQ29sb3IiLCJfcmVzdG9yZUNvbG9ycyIsIm1vZGlmeUNvbG9ycyIsImNhbGxiYWNrIiwiY3NzU3RyaW5nIiwiZmFsbGJhY2siLCJJT3B0aW9uc1NlcnZpY2UiLCIkciIsIiRnIiwiJGIiLCIkYSIsInJnYiIsInRvUGFkZGVkSGV4IiwicyIsInRvU3RyaW5nIiwiY29udHJhc3RSYXRpbyIsImwxIiwibDIiLCJhIiwicm91bmQiLCJ0b0NoYW5uZWxzIiwiZmdSIiwiZmdHIiwiZmdCIiwiYmdSIiwiYmdHIiwiYmdCIiwiZW5zdXJlQ29udHJhc3RSYXRpbyIsInJhdGlvIiwicmVzdWx0Iiwib3BhcXVlIiwicmdiYUNvbG9yIiwibXVsdGlwbHlPcGFjaXR5IiwiZmFjdG9yIiwidG9Db2xvclJHQiIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJjYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ3aWR0aCIsImhlaWdodCIsImN0eCIsImdldENvbnRleHQiLCJ3aWxsUmVhZEZyZXF1ZW50bHkiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJjcmVhdGVMaW5lYXJHcmFkaWVudCIsIm1hdGNoIiwicGFyc2VJbnQiLCJyZXBlYXQiLCJyZ2JhTWF0Y2giLCJwYXJzZUZsb2F0IiwiRXJyb3IiLCJmaWxsU3R5bGUiLCJmaWxsUmVjdCIsImdldEltYWdlRGF0YSIsImRhdGEiLCJyZWxhdGl2ZUx1bWluYW5jZTIiLCJycyIsImdzIiwiYnMiLCJwb3ciLCJyZWxhdGl2ZUx1bWluYW5jZSIsInJlZHVjZUx1bWluYW5jZSIsImJnUmdiYSIsImZnUmdiYSIsImNyIiwibWF4IiwiY2VpbCIsImluY3JlYXNlTHVtaW5hbmNlIiwiYmdMIiwiZmdMIiwicmVzdWx0QSIsInJlc3VsdEFSYXRpbyIsInJlc3VsdEIiLCJfbGlzdGVuZXJzIiwiX2Rpc3Bvc2VkIiwiX2V2ZW50IiwibGlzdGVuZXIiLCJkaXNwb3NlIiwic3BsaWNlIiwiYXJnMSIsImFyZzIiLCJxdWV1ZSIsImNhbGwiLCJjbGVhckxpc3RlbmVycyIsImZyb20iLCJ0byIsImUiLCJoYW5kbGVyIiwiZGlzcG9zZUFycmF5IiwiZGlzcG9zYWJsZXMiLCJkIiwiX2Rpc3Bvc2FibGVzIiwiX2lzRGlzcG9zZWQiLCJ1bnJlZ2lzdGVyIiwiaW5kZXgiLCJpbmRleE9mIiwiX3ZhbHVlIiwiZiIsImFycmF5IiwiX2RhdGEiLCJmaXJzdCIsInNlY29uZCIsInRoaXJkIiwiZm91cnRoIiwiRElfVEFSR0VUIiwiRElfREVQRU5ERU5DSUVTIiwic2VydmljZVJlZ2lzdHJ5IiwiTWFwIiwiY3RvciIsImlkIiwiaGFzIiwiZGVjb3JhdG9yIiwidGFyZ2V0Iiwia2V5IiwiYXJndW1lbnRzIiwic3RvcmVTZXJ2aWNlRGVwZW5kZW5jeSIsIkxvZ0xldmVsRW51bSIsIklCdWZmZXJTZXJ2aWNlIiwiY3JlYXRlRGVjb3JhdG9yIiwiSUNvcmVNb3VzZVNlcnZpY2UiLCJJQ29yZVNlcnZpY2UiLCJJQ2hhcnNldFNlcnZpY2UiLCJJSW5zdGFudGlhdGlvblNlcnZpY2UiLCJJTG9nU2VydmljZSIsIklPc2NMaW5rU2VydmljZSIsIklVbmljb2RlU2VydmljZSIsIklEZWNvcmF0aW9uU2VydmljZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJjb25zdHJhaW4iLCJsb3ciLCJoaWdoIiwiQmFzZVNlcmlhbGl6ZUhhbmRsZXIiLCJfYnVmZmVyIiwic2VyaWFsaXplIiwicmFuZ2UiLCJleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbiIsImNlbGwxIiwiZ2V0TnVsbENlbGwiLCJjZWxsMiIsIm9sZENlbGwiLCJzdGFydFJvdyIsInN0YXJ0IiwieSIsImVuZFJvdyIsImVuZCIsInN0YXJ0Q29sdW1uIiwieCIsImVuZENvbHVtbiIsIl9iZWZvcmVTZXJpYWxpemUiLCJyb3ciLCJsaW5lIiwiZ2V0TGluZSIsInN0YXJ0TGluZUNvbHVtbiIsImVuZExpbmVDb2x1bW4iLCJjb2wiLCJnZXRDZWxsIiwiX25leHRDZWxsIiwiY29uc29sZSIsIndhcm4iLCJfcm93RW5kIiwiX2FmdGVyU2VyaWFsaXplIiwiX3NlcmlhbGl6ZVN0cmluZyIsImNlbGwiLCJpc0xhc3RSb3ciLCJyb3dzIiwiZXF1YWxGZyIsImdldEZnQ29sb3JNb2RlIiwiZ2V0RmdDb2xvciIsImVxdWFsQmciLCJnZXRCZ0NvbG9yTW9kZSIsImdldEJnQ29sb3IiLCJlcXVhbEZsYWdzIiwiaXNJbnZlcnNlIiwiaXNCb2xkIiwiaXNVbmRlcmxpbmUiLCJpc092ZXJsaW5lIiwiaXNCbGluayIsImlzSW52aXNpYmxlIiwiaXNJdGFsaWMiLCJpc0RpbSIsImlzU3RyaWtldGhyb3VnaCIsIlN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIiLCJidWZmZXIiLCJfdGVybWluYWwiLCJfcm93SW5kZXgiLCJfYWxsUm93cyIsIkFycmF5IiwiX2FsbFJvd1NlcGFyYXRvcnMiLCJfY3VycmVudFJvdyIsIl9udWxsQ2VsbENvdW50IiwiX2N1cnNvclN0eWxlIiwiX2N1cnNvclN0eWxlUm93IiwiX2N1cnNvclN0eWxlQ29sIiwiX2JhY2tncm91bmRDZWxsIiwiX2ZpcnN0Um93IiwiX2xhc3RDdXJzb3JSb3ciLCJfbGFzdEN1cnNvckNvbCIsIl9sYXN0Q29udGVudEN1cnNvclJvdyIsIl9sYXN0Q29udGVudEN1cnNvckNvbCIsIl90aGlzUm93TGFzdENoYXIiLCJfdGhpc1Jvd0xhc3RTZWNvbmRDaGFyIiwiX25leHRSb3dGaXJzdENoYXIiLCJyb3dTZXBhcmF0b3IiLCJjdXJyZW50TGluZSIsIm5leHRMaW5lIiwiaXNXcmFwcGVkIiwidGhpc1Jvd0xhc3RDaGFyIiwidGhpc1Jvd0xhc3RTZWNvbmRDaGFyIiwibmV4dFJvd0ZpcnN0Q2hhciIsImlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoIiwiZ2V0V2lkdGgiLCJpc1ZhbGlkIiwiZ2V0Q2hhcnMiLCJfZGlmZlN0eWxlIiwic2dyU2VxIiwiZmdDaGFuZ2VkIiwiYmdDaGFuZ2VkIiwiZmxhZ3NDaGFuZ2VkIiwiaXNBdHRyaWJ1dGVEZWZhdWx0IiwiaXNGZ1JHQiIsImlzRmdQYWxldHRlIiwiaXNCZ1JHQiIsImlzQmdQYWxldHRlIiwiaXNFbXB0eUNlbGwiLCJqb2luIiwicm93RW5kIiwiY29udGVudCIsInJlYWxDdXJzb3JSb3ciLCJiYXNlWSIsImN1cnNvclkiLCJyZWFsQ3Vyc29yQ29sIiwiY3Vyc29yWCIsIm1vdmVSaWdodCIsIm9mZnNldCIsImN1ckF0dHJEYXRhIiwiX2NvcmUiLCJfaW5wdXRIYW5kbGVyIiwiX2N1ckF0dHJEYXRhIiwiYWN0aXZhdGUiLCJ0ZXJtaW5hbCIsIl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2siLCJzY3JvbGxiYWNrIiwibWF4Um93cyIsImNvcnJlY3RSb3dzIiwiX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UiLCJjb2xzIiwiX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCIsIm9wdGlvbnMiLCJhY3RpdmUiLCJIVE1MU2VyaWFsaXplSGFuZGxlciIsIm9ubHlTZWxlY3Rpb24iLCJzZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb25Qb3NpdGlvbiIsIl9zZXJpYWxpemVNb2RlcyIsIm1vZGVzIiwiYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSIsImFwcGxpY2F0aW9uS2V5cGFkTW9kZSIsImJyYWNrZXRlZFBhc3RlTW9kZSIsImluc2VydE1vZGUiLCJvcmlnaW5Nb2RlIiwicmV2ZXJzZVdyYXBhcm91bmRNb2RlIiwic2VuZEZvY3VzTW9kZSIsIndyYXBhcm91bmRNb2RlIiwibW91c2VUcmFja2luZ01vZGUiLCJub3JtYWwiLCJleGNsdWRlQWx0QnVmZmVyIiwidHlwZSIsImFsdGVybmF0ZSIsImV4Y2x1ZGVNb2RlcyIsInNlcmlhbGl6ZUFzSFRNTCIsIl9vcHRpb25zIiwiX2h0bWxDb250ZW50IiwiX3RoZW1lU2VydmljZSIsIl9hbnNpQ29sb3JzIiwiX3BhZFN0YXJ0IiwidGFyZ2V0TGVuZ3RoIiwicGFkU3RyaW5nIiwiaW5jbHVkZUdsb2JhbEJhY2tncm91bmQiLCJnbG9iYWxTdHlsZURlZmluaXRpb25zIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiX2dldEhleENvbG9yIiwiaXNGZyIsIm1hcCIsImZnSGV4Q29sb3IiLCJiZ0hleENvbG9yIiwic3R5bGVEZWZpbml0aW9ucyIsInQiLCJTZXJpYWxpemVBZGRvbiIsIndpbmRvdyIsIm4iLCJsIiwiaCIsInUiLCJfIiwiQyIsIm8iLCJmb3J3YXJkRXZlbnQiLCJydW5BbmRTdWJzY3JpYmUiLCJNdXRhYmxlRGlzcG9zYWJsZSIsInRvRGlzcG9zYWJsZSIsImdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUiLCJGb3VyS2V5TWFwIiwiZ2V0U2VydmljZURlcGVuZGVuY2llcyIsIlRSQUNFIiwiREVCVUciLCJJTkZPIiwiV0FSTiIsIkVSUk9SIiwiT0ZGIl0sIm1hcHBpbmdzIjoiQ1dBQSxBWEFBLFNBQTJDQSxDV0FBbU0sQ0FBQSxBWEFNbE0sRVdBQStZLENBQUEsQVhDMUIsaUJBQVo5WSxTQUEwQyxpQkFBWEMsT0FDeENBLE9BQU9ELFFBQVVELElBQ1EsbUJBQVhHLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxHQUFJSCxHQUNlLGlCQUFaQyxRQUNkQSxRQUF3QixlQUFJRCxJQUU1QkQsRUFBcUIsZUFBSUMsR0FDMUIsQ0FURCxDQVNHSyxNQUFNLEkscUhDRlQsZUFFQSx5Q0FDVSxLQUFBQyxPQUFtRSxJQUFJLEVBQUFDLFVBQ3ZFLEtBQUFDLEtBQWlFLElBQUksRUFBQUQsU0FzQi9FLENBcEJTLE1BQUFFLENBQU9DLEVBQVlDLEVBQVlDLEdBQ3BDUCxLQUFLRyxLQUFLSyxJQUFJSCxFQUFJQyxFQUFJQyxFQUN4QixDQUVPLE1BQUFFLENBQU9KLEVBQVlDLEdBQ3hCLE9BQU9OLEtBQUtHLEtBQUtPLElBQUlMLEVBQUlDLEVBQzNCLENBRU8sUUFBQUssQ0FBU04sRUFBWUMsRUFBWUMsR0FDdENQLEtBQUtDLE9BQU9PLElBQUlILEVBQUlDLEVBQUlDLEVBQzFCLENBRU8sUUFBQUssQ0FBU1AsRUFBWUMsR0FDMUIsT0FBT04sS0FBS0MsT0FBT1MsSUFBSUwsRUFBSUMsRUFDN0IsQ0FFTyxLQUFBTyxHQUNMYixLQUFLQyxPQUFPWSxRQUNaYixLQUFLRyxLQUFLVSxPQUNaLEUsd2hCQzNCRixlQUdBLFNBQ0EsU0FDQSxTQUNBLFFBV01DLEVBQXFCLEVBQUFDLElBQUlDLFFBQVEsV0FDakNDLEVBQXFCLEVBQUFGLElBQUlDLFFBQVEsV0FDakNFLEVBQWlCLEVBQUFILElBQUlDLFFBQVEsV0FDN0JHLEVBQXdCLEVB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QjhKLENBQUEsQ0FBS2tHLGVBQUEsTUFBcUI3SyxDQUFBLENBQVFuRixJQUFBLENBQUssbUNBRXBDbUYsQzs7TUFJWDtNQUVVcUosVUFBVTFFLENBQUEsRUFBbUI2TSxDQUFBLEVBQXNCeFIsQ0FBQSxFQUFhdEYsQ0FBQTtRQUd4RSxJQUQ4QyxNQUFwQmlLLENBQUEsQ0FBS2dJLFFBQUEsSUFFN0I7UUFJRixNQUFNc0YsQ0FBQSxHQUFrQyxPQUFwQnROLENBQUEsQ0FBS2tJLFFBQUE7VUFFbkJwUyxDQUFBLEdBQW1CLEtBQUtxUyxVQUFBLENBQVduSSxDQUFBLEVBQU02TSxDQUFBO1FBRzNDL1csQ0FBQSxLQUNGLEtBQUs0USxXQUFBLElBQTJDLE1BQTVCNVEsQ0FBQSxDQUFpQnNFLE1BQUEsR0FDbkMsa0JBQ0EseUJBQTBCdEUsQ0FBQSxDQUFpQmdULElBQUEsQ0FBSyxPQUFPLE9BS3pELEtBQUtwQyxXQUFBLElBREg0RyxDQUFBLEdBQ2tCLE1BRUF0TixDQUFBLENBQUtrSSxRQUFBLEVBRTdCO01BQUE7TUFFVW5ELGlCQUFBO1FBQ1IsT0FBTyxLQUFLOEcsWUFDZDtNQUFBO0lBQUE7SUFqSkY3TCxDQUFBLENBQUF1SyxvQkFBQSxHQUFBMkMsQyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFR3b0tleU1hcCB9IGZyb20gJ2NvbW1vbi9NdWx0aUtleU1hcCc7XG5cbmV4cG9ydCBjbGFzcyBDb2xvckNvbnRyYXN0Q2FjaGUgaW1wbGVtZW50cyBJQ29sb3JDb250cmFzdENhY2hlIHtcbiAgcHJpdmF0ZSBfY29sb3I6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIElDb2xvciB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuICBwcml2YXRlIF9jc3M6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIHN0cmluZyB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jc3Muc2V0KGJnLCBmZywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Nzcy5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogSUNvbG9yIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogSUNvbG9yIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yLmdldChiZywgZmcpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLmNsZWFyKCk7XG4gICAgdGhpcy5fY3NzLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUnO1xuaW1wb3J0IHsgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSwgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IsIGNzcywgTlVMTF9DT0xPUiB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSwgSVRoZW1lIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElDb2xvciwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSVJlc3RvcmVDb2xvclNldCB7XG4gIGZvcmVncm91bmQ6IElDb2xvcjtcbiAgYmFja2dyb3VuZDogSUNvbG9yO1xuICBjdXJzb3I6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG59XG5cblxuY29uc3QgREVGQVVMVF9GT1JFR1JPVU5EID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUiA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9TRUxFQ1RJT04gPSB7XG4gIGNzczogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKScsXG4gIHJnYmE6IDB4RkZGRkZGNERcbn07XG5cbi8vIEFuIElJRkUgdG8gZ2VuZXJhdGUgREVGQVVMVF9BTlNJX0NPTE9SUy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOU0lfQ09MT1JTID0gT2JqZWN0LmZyZWV6ZSgoKCkgPT4ge1xuICBjb25zdCBjb2xvcnMgPSBbXG4gICAgLy8gZGFyazpcbiAgICBjc3MudG9Db2xvcignIzJlMzQzNicpLFxuICAgIGNzcy50b0NvbG9yKCcjY2MwMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyM0ZTlhMDYnKSxcbiAgICBjc3MudG9Db2xvcignI2M0YTAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzQ2NWE0JyksXG4gICAgY3NzLnRvQ29sb3IoJyM3NTUwN2InKSxcbiAgICBjc3MudG9Db2xvcignIzA2OTg5YScpLFxuICAgIGNzcy50b0NvbG9yKCcjZDNkN2NmJyksXG4gICAgLy8gYnJpZ2h0OlxuICAgIGNzcy50b0NvbG9yKCcjNTU1NzUzJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZjI5MjknKSxcbiAgICBjc3MudG9Db2xvcignIzhhZTIzNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjZmNlOTRmJyksXG4gICAgY3NzLnRvQ29sb3IoJyM3MjlmY2YnKSxcbiAgICBjc3MudG9Db2xvcignI2FkN2ZhOCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzRlMmUyJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZWVlZWMnKVxuICBdO1xuXG4gIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyAyNDAgQU5TSSBjb2xvcnMuXG4gIC8vIEdlbmVyYXRlIGNvbG9ycyAoMTYtMjMxKVxuICBjb25zdCB2ID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgY29uc3QgciA9IHZbKGkgLyAzNikgJSA2IHwgMF07XG4gICAgY29uc3QgZyA9IHZbKGkgLyA2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBiID0gdltpICUgNl07XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgZ3JleXMgKDIzMi0yNTUpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgIGNvbnN0IGMgPSA4ICsgaSAqIDEwO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoYywgYywgYyksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoYywgYywgYylcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59KSgpKTtcblxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGhlbWVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NvbG9yczogSUNvbG9yU2V0O1xuICBwcml2YXRlIF9jb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9oYWxmQ29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9ycyE6IElSZXN0b3JlQ29sb3JTZXQ7XG5cbiAgcHVibGljIGdldCBjb2xvcnMoKTogUmVhZG9ubHlDb2xvclNldCB7IHJldHVybiB0aGlzLl9jb2xvcnM7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZUNvbG9ycyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxSZWFkb25seUNvbG9yU2V0PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzID0gdGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gICAgICBiYWNrZ3JvdW5kOiBERUZBVUxUX0JBQ0tHUk9VTkQsXG4gICAgICBjdXJzb3I6IERFRkFVTFRfQ1VSU09SLFxuICAgICAgY3Vyc29yQWNjZW50OiBERUZBVUxUX0NVUlNPUl9BQ0NFTlQsXG4gICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgYW5zaTogREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLFxuICAgICAgY29udHJhc3RDYWNoZTogdGhpcy5fY29udHJhc3RDYWNoZSxcbiAgICAgIGhhbGZDb250cmFzdENhY2hlOiB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZVxuICAgIH07XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdtaW5pbXVtQ29udHJhc3RSYXRpbycsICgpID0+IHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGhlbWUnLCAoKSA9PiB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRlcm1pbmFsJ3MgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZSBUaGUgIHRoZW1lIHRvIHVzZS4gSWYgYSBwYXJ0aWFsIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gZGVmYXVsdFxuICAgKiBjb2xvcnMgd2lsbCBiZSB1c2VkIHdoZXJlIGNvbG9ycyBhcmUgbm90IGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zZXRUaGVtZSh0aGVtZTogSVRoZW1lID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLl9jb2xvcnM7XG4gICAgY29sb3JzLmZvcmVncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCk7XG4gICAgY29sb3JzLmJhY2tncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCk7XG4gICAgY29sb3JzLmN1cnNvciA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yLCBERUZBVUxUX0NVUlNPUik7XG4gICAgY29sb3JzLmN1cnNvckFjY2VudCA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yQWNjZW50LCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkJhY2tncm91bmQsIERFRkFVTFRfU0VMRUNUSU9OKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCA/IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCwgTlVMTF9DT0xPUikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID09PSBOVUxMX0NPTE9SKSB7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZWxlY3Rpb24gY29sb3IgaXMgb3BhcXVlLCBibGVuZCBpdCB3aXRoIGJhY2tncm91bmQgd2l0aCAwLjMgb3BhY2l0eVxuICAgICAqIElzc3VlICMyNzM3XG4gICAgICovXG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBjb2xvcnMuYW5zaSA9IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKTtcbiAgICBjb2xvcnMuYW5zaVswXSA9IHBhcnNlQ29sb3IodGhlbWUuYmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbMF0pO1xuICAgIGNvbG9ycy5hbnNpWzFdID0gcGFyc2VDb2xvcih0aGVtZS5yZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbMV0pO1xuICAgIGNvbG9ycy5hbnNpWzJdID0gcGFyc2VDb2xvcih0aGVtZS5ncmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1syXSk7XG4gICAgY29sb3JzLmFuc2lbM10gPSBwYXJzZUNvbG9yKHRoZW1lLnllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1szXSk7XG4gICAgY29sb3JzLmFuc2lbNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbNF0pO1xuICAgIGNvbG9ycy5hbnNpWzVdID0gcGFyc2VDb2xvcih0aGVtZS5tYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzVdKTtcbiAgICBjb2xvcnMuYW5zaVs2XSA9IHBhcnNlQ29sb3IodGhlbWUuY3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1s2XSk7XG4gICAgY29sb3JzLmFuc2lbN10gPSBwYXJzZUNvbG9yKHRoZW1lLndoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzddKTtcbiAgICBjb2xvcnMuYW5zaVs4XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0QmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbOF0pO1xuICAgIGNvbG9ycy5hbnNpWzldID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRSZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbOV0pO1xuICAgIGNvbG9ycy5hbnNpWzEwXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0R3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTBdKTtcbiAgICBjb2xvcnMuYW5zaVsxMV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pO1xuICAgIGNvbG9ycy5hbnNpWzEyXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Qmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMl0pO1xuICAgIGNvbG9ycy5hbnNpWzEzXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0TWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxM10pO1xuICAgIGNvbG9ycy5hbnNpWzE0XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Q3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pO1xuICAgIGNvbG9ycy5hbnNpWzE1XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0V2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTVdKTtcbiAgICBpZiAodGhlbWUuZXh0ZW5kZWRBbnNpKSB7XG4gICAgICBjb25zdCBjb2xvckNvdW50ID0gTWF0aC5taW4oY29sb3JzLmFuc2kubGVuZ3RoIC0gMTYsIHRoZW1lLmV4dGVuZGVkQW5zaS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvckNvdW50OyBpKyspIHtcbiAgICAgICAgY29sb3JzLmFuc2lbaSArIDE2XSA9IHBhcnNlQ29sb3IodGhlbWUuZXh0ZW5kZWRBbnNpW2ldLCBERUZBVUxUX0FOU0lfQ09MT1JTW2kgKyAxNl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciBvdXIgdGhlIGNhY2hlXG4gICAgdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcihzbG90KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcihzbG90OiBBbGxDb2xvckluZGV4IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gdW5zZXQgc2xvdCByZXN0b3JlcyBhbGwgYW5zaSBjb2xvcnNcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtpXSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzbG90KSB7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkZPUkVHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmJhY2tncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1I6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5jdXJzb3IgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmN1cnNvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtzbG90XSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtzbG90XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjayh0aGlzLl9jb2xvcnMpO1xuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlIGhhcHBlbmVkXG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZXN0b3JlQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLFxuICAgICAgY3Vyc29yOiB0aGlzLl9jb2xvcnMuY3Vyc29yLFxuICAgICAgYW5zaTogdGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xvcihcbiAgY3NzU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiBJQ29sb3Jcbik6IElDb2xvciB7XG4gIGlmIChjc3NTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY3NzLnRvQ29sb3IoY3NzU3RyaW5nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogKEVYUEVSSU1FTlRBTCkgVGhpcyBBZGRvbiBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgSUJ1ZmZlciwgSUJ1ZmZlckNlbGwsIElCdWZmZXJSYW5nZSwgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgSUhUTUxTZXJpYWxpemVPcHRpb25zLCBTZXJpYWxpemVBZGRvbiBhcyBJU2VyaWFsaXplQXBpLCBJU2VyaWFsaXplT3B0aW9ucywgSVNlcmlhbGl6ZVJhbmdlIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXNlcmlhbGl6ZSc7XG5pbXBvcnQgeyBERUZBVUxUX0FOU0lfQ09MT1JTIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UnO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmZ1bmN0aW9uIGNvbnN0cmFpbih2YWx1ZTogbnVtYmVyLCBsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KGxvdywgTWF0aC5taW4odmFsdWUsIGhpZ2gpKTtcbn1cblxuLy8gVE9ETzogUmVmaW5lIHRoaXMgdGVtcGxhdGUgY2xhc3MgbGF0ZXJcbmFic3RyYWN0IGNsYXNzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9idWZmZXI6IElCdWZmZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKHJhbmdlOiBJQnVmZmVyUmFuZ2UsIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8gd2UgbmVlZCB0d28gb2YgdGhlbSB0byBmbGlwIGJldHdlZW4gb2xkIGFuZCBuZXcgY2VsbFxuICAgIGNvbnN0IGNlbGwxID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gICAgY29uc3QgY2VsbDIgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgICBsZXQgb2xkQ2VsbCA9IGNlbGwxO1xuXG4gICAgY29uc3Qgc3RhcnRSb3cgPSByYW5nZS5zdGFydC55O1xuICAgIGNvbnN0IGVuZFJvdyA9IHJhbmdlLmVuZC55O1xuICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gcmFuZ2Uuc3RhcnQueDtcbiAgICBjb25zdCBlbmRDb2x1bW4gPSByYW5nZS5lbmQueDtcblxuICAgIHRoaXMuX2JlZm9yZVNlcmlhbGl6ZShlbmRSb3cgLSBzdGFydFJvdywgc3RhcnRSb3csIGVuZFJvdyk7XG5cbiAgICBmb3IgKGxldCByb3cgPSBzdGFydFJvdzsgcm93IDw9IGVuZFJvdzsgcm93KyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5zdGFydC55ID8gc3RhcnRDb2x1bW4gOiAwO1xuICAgICAgICBjb25zdCBlbmRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5lbmQueSA/IGVuZENvbHVtbjogbGluZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0TGluZUNvbHVtbjsgY29sIDwgZW5kTGluZUNvbHVtbjsgY29sKyspIHtcbiAgICAgICAgICBjb25zdCBjID0gbGluZS5nZXRDZWxsKGNvbCwgb2xkQ2VsbCA9PT0gY2VsbDEgPyBjZWxsMiA6IGNlbGwxKTtcbiAgICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ2V0IGNlbGwgYXQgcm93PSR7cm93fSwgY29sPSR7Y29sfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX25leHRDZWxsKGMsIG9sZENlbGwsIHJvdywgY29sKTtcbiAgICAgICAgICBvbGRDZWxsID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcm93RW5kKHJvdywgcm93ID09PSBlbmRSb3cpO1xuICAgIH1cblxuICAgIHRoaXMuX2FmdGVyU2VyaWFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfYWZ0ZXJTZXJpYWxpemUoKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24/OiBib29sZWFuKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG59XG5cbmZ1bmN0aW9uIGVxdWFsRmcoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuZ2V0RmdDb2xvck1vZGUoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvck1vZGUoKVxuICAgICYmIGNlbGwxLmdldEZnQ29sb3IoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvcigpO1xufVxuXG5mdW5jdGlvbiBlcXVhbEJnKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmdldEJnQ29sb3JNb2RlKCkgPT09IGNlbGwyLmdldEJnQ29sb3JNb2RlKClcbiAgICAmJiBjZWxsMS5nZXRCZ0NvbG9yKCkgPT09IGNlbGwyLmdldEJnQ29sb3IoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxGbGFncyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5pc0ludmVyc2UoKSA9PT0gY2VsbDIuaXNJbnZlcnNlKClcbiAgICAmJiBjZWxsMS5pc0JvbGQoKSA9PT0gY2VsbDIuaXNCb2xkKClcbiAgICAmJiBjZWxsMS5pc1VuZGVybGluZSgpID09PSBjZWxsMi5pc1VuZGVybGluZSgpXG4gICAgJiYgY2VsbDEuaXNPdmVybGluZSgpID09PSBjZWxsMi5pc092ZXJsaW5lKClcbiAgICAmJiBjZWxsMS5pc0JsaW5rKCkgPT09IGNlbGwyLmlzQmxpbmsoKVxuICAgICYmIGNlbGwxLmlzSW52aXNpYmxlKCkgPT09IGNlbGwyLmlzSW52aXNpYmxlKClcbiAgICAmJiBjZWxsMS5pc0l0YWxpYygpID09PSBjZWxsMi5pc0l0YWxpYygpXG4gICAgJiYgY2VsbDEuaXNEaW0oKSA9PT0gY2VsbDIuaXNEaW0oKVxuICAgICYmIGNlbGwxLmlzU3RyaWtldGhyb3VnaCgpID09PSBjZWxsMi5pc1N0cmlrZXRocm91Z2goKTtcbn1cblxuY2xhc3MgU3RyaW5nU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfcm93SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2FsbFJvd3M6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfYWxsUm93U2VwYXJhdG9yczogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIF9jdXJyZW50Um93OiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfbnVsbENlbGxDb3VudDogbnVtYmVyID0gMDtcblxuICAvLyB3ZSBjYW4gc2VlIGEgZnVsbCBjb2xvcmVkIGNlbGwgYW5kIGEgbnVsbCBjZWxsIHRoYXQgb25seSBoYXZlIGJhY2tncm91bmQgdGhlIHNhbWUgc3R5bGVcbiAgLy8gYnV0IHRoZSBpbmZvcm1hdGlvbiBpc24ndCBwcmVzZXJ2ZWQgYnkgbnVsbCBjZWxsIGl0c2VsZlxuICAvLyBzbyB3ZWUgbmVlZCB0byByZWNvcmQgaXQgd2hlbiByZXF1aXJlZC5cbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGU6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgLy8gd2hlcmUgZXhhY3QgdGhlIGN1cnNvciBzdHlsZXMgY29tZXMgZnJvbVxuICAvLyBiZWNhdXNlIHdlIGNhbid0IGNvcHkgdGhlIGNlbGwgZGlyZWN0bHlcbiAgLy8gc28gd2UgcmVtZW1iZXIgd2hlcmUgdGhlIGNvbnRlbnQgY29tZXMgZnJvbSBpbnN0ZWFkXG4gIHByaXZhdGUgX2N1cnNvclN0eWxlUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJzb3JTdHlsZUNvbDogbnVtYmVyID0gMDtcblxuICAvLyB0aGlzIGlzIGEgbnVsbCBjZWxsIGZvciByZWZlcmVuY2UgZm9yIGNoZWNraW5nIHdoZXRoZXIgYmFja2dyb3VuZCBpcyBlbXB0eSBvciBub3RcbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENlbGw6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgcHJpdmF0ZSBfZmlyc3RSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JDb2w6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50Q3Vyc29yUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudEN1cnNvckNvbDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWZmZXI6IElCdWZmZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsXG4gICkge1xuICAgIHN1cGVyKGJ1ZmZlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fYWxsUm93cyA9IG5ldyBBcnJheTxzdHJpbmc+KHJvd3MpO1xuICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gc3RhcnQ7XG4gICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHN0YXJ0O1xuICAgIHRoaXMuX2ZpcnN0Um93ID0gc3RhcnQ7XG4gIH1cblxuICBwcml2YXRlIF90aGlzUm93TGFzdENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByaXZhdGUgX3RoaXNSb3dMYXN0U2Vjb25kQ2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJpdmF0ZSBfbmV4dFJvd0ZpcnN0Q2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIGlmIHRoZXJlIGlzIGNvbG9yZnVsIGVtcHR5IGNlbGwgYXQgbGluZSBlbmQsIHdoZSBtdXN0IHBhZCBpdCBiYWNrLCBvciB0aGUgdGhlIGNvbG9yIGJsb2NrXG4gICAgLy8gd2lsbCBtaXNzaW5nXG4gICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwICYmICFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgIC8vIHVzZSBjbGVhciByaWdodCB0byBzZXQgYmFja2dyb3VuZC5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgIH1cblxuICAgIGxldCByb3dTZXBhcmF0b3IgPSAnJztcblxuICAgIC8vIGhhbmRsZSByb3cgc2VwYXJhdG9yXG4gICAgaWYgKCFpc0xhc3RSb3cpIHtcbiAgICAgIC8vIEVuYWJsZSBCQ0VcbiAgICAgIGlmIChyb3cgLSB0aGlzLl9maXJzdFJvdyA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlci5nZXRMaW5lKHRoaXMuX2N1cnNvclN0eWxlUm93KT8uZ2V0Q2VsbCh0aGlzLl9jdXJzb3JTdHlsZUNvbCwgdGhpcy5fYmFja2dyb3VuZENlbGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBGZXRjaCBjdXJyZW50IGxpbmVcbiAgICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KSE7XG4gICAgICAvLyBGZXRjaCBuZXh0IGxpbmVcbiAgICAgIGNvbnN0IG5leHRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93ICsgMSkhO1xuXG4gICAgICBpZiAoIW5leHRMaW5lLmlzV3JhcHBlZCkge1xuICAgICAgICAvLyBqdXN0IGluc2VydCB0aGUgbGluZSBicmVha1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnXFxyXFxuJztcbiAgICAgICAgLy8gd2Ugc2VuZGVkIHRoZSBlbnRlclxuICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnJztcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAxLCB0aGlzLl90aGlzUm93TGFzdENoYXIpITtcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RTZWNvbmRDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAyLCB0aGlzLl90aGlzUm93TGFzdFNlY29uZENoYXIpITtcbiAgICAgICAgY29uc3QgbmV4dFJvd0ZpcnN0Q2hhciA9IG5leHRMaW5lLmdldENlbGwoMCwgdGhpcy5fbmV4dFJvd0ZpcnN0Q2hhcikhO1xuICAgICAgICBjb25zdCBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCA9IG5leHRSb3dGaXJzdENoYXIuZ2V0V2lkdGgoKSA+IDE7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgd2hldGhlciB0aGlzIGxpbmUgd3JhcCBpcyBldmVyIHBvc3NpYmxlXG4gICAgICAgIC8vIHdoaWNoIG1lYW4gd2hldGhlciBjdXJzb3IgY2FuIHBsYWNlZCBhdCBhIG92ZXJmbG93IHBvc2l0aW9uICh4ID09PSByb3cpIG5hdHVyYWxseVxuICAgICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyB5b3UgbXVzdCBvdXRwdXQgY2hhcmFjdGVyIHRvIGNhdXNlIG92ZXJmbG93LCBjb250cm9sIHNlcXVlbmNlIGNhbid0IGRvIHRoaXNcbiAgICAgICAgICBuZXh0Um93Rmlyc3RDaGFyLmdldENoYXJzKCkgJiZcbiAgICAgICAgICAgIGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoID8gdGhpcy5fbnVsbENlbGxDb3VudCA8PSAxIDogdGhpcy5fbnVsbENlbGxDb3VudCA8PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNoYXJhY3RlciBjYW4ndCBiZSBudWxsLFxuICAgICAgICAgICAgLy8geW91IGNhbid0IHVzZSBjb250cm9sIHNlcXVlbmNlIHRvIG1vdmUgY3Vyc29yIHRvICh4ID09PSByb3cpXG4gICAgICAgICAgICAodGhpc1Jvd0xhc3RDaGFyLmdldENoYXJzKCkgfHwgdGhpc1Jvd0xhc3RDaGFyLmdldFdpZHRoKCkgPT09IDApICYmXG4gICAgICAgICAgICAvLyBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZmlyc3Qgd3JhcHBlZCBjZWxsIGFsc28gYWZmZWN0cyBCQ0VcbiAgICAgICAgICAgIC8vIHNvIHdlIG1hcmsgaXQgYXMgaW52YWxpZCB0byBzaW1wbHkgdGhlIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIGxpbmUgc2VwYXJhdG9yXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0Q2hhciwgbmV4dFJvd0ZpcnN0Q2hhcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgdG8gbGFzdCBjaGFyYWN0ZXIgY2FuJ3QgYmUgbnVsbCBpZiB0aGUgbmV4dCBsaW5lIHN0YXJ0cyB3aXRoIENKSyxcbiAgICAgICAgICAgIC8vIHlvdSBjYW4ndCB1c2UgY29udHJvbCBzZXF1ZW5jZSB0byBtb3ZlIGN1cnNvciB0byAoeCA9PT0gcm93KVxuICAgICAgICAgICAgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggJiZcbiAgICAgICAgICAgICh0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0Q2hhcnMoKSB8fCB0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0V2lkdGgoKSA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIG9mIHRoZSBmaXJzdCB3cmFwcGVkIGNlbGwgYWxzbyBhZmZlY3RzIEJDRVxuICAgICAgICAgICAgLy8gc28gd2UgbWFyayBpdCBhcyBpbnZhbGlkIHRvIHNpbXBseSB0aGUgcHJvY2VzcyB0byBkZXRlcm1pbmUgbGluZSBzZXBhcmF0b3JcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKSAmJlxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdFNlY29uZENoYXIsIG5leHRSb3dGaXJzdENoYXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAvLyBmb3JjZSB0aGUgd3JhcCB3aXRoIG1hZ2ljXG4gICAgICAgICAgLy8gaW5zZXJ0IGVub3VnaCBjaGFyYWN0ZXIgdG8gZm9yY2UgdGhlIHdyYXBcbiAgICAgICAgICByb3dTZXBhcmF0b3IgPSAnLScucmVwZWF0KHRoaXMuX251bGxDZWxsQ291bnQgKyAxKTtcbiAgICAgICAgICAvLyBtb3ZlIGJhY2sgYW5kIGVyYXNlIG5leHQgbGluZSBoZWFkXG4gICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiWzFEXFx1MDAxYlsxWCc7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIGRvIHRoZXNlIGJlY2F1c2Ugd2UgZmlsbGVkIHRoZSBsYXN0IHNldmVyYWwgbnVsbCBzbG90LCB3aGljaCB3ZSBzaG91bGRuJ3RcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltBJztcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske2N1cnJlbnRMaW5lLmxlbmd0aCAtIHRoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7Y3VycmVudExpbmUubGVuZ3RoIC0gdGhpcy5fbnVsbENlbGxDb3VudH1EYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltCJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGNvbnRlbnQgYW5kIG5lZWQgdGhlIGJlIHNlcmlhbGl6ZWQgZXZlbiBpdCBpcyBpbnZpc2libGUuXG4gICAgICAgICAgLy8gd2l0aG91dCB0aGlzLCB3cmFwIHdpbGwgYmUgbWlzc2luZyBmcm9tIG91dHB1dHMuXG4gICAgICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gMDtcblxuICAgICAgICAgIC8vIGZvcmNlIGNvbW1pdCB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hbGxSb3dzW3RoaXMuX3Jvd0luZGV4XSA9IHRoaXMuX2N1cnJlbnRSb3c7XG4gICAgdGhpcy5fYWxsUm93U2VwYXJhdG9yc1t0aGlzLl9yb3dJbmRleCsrXSA9IHJvd1NlcGFyYXRvcjtcbiAgICB0aGlzLl9jdXJyZW50Um93ID0gJyc7XG4gICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9kaWZmU3R5bGUoY2VsbDogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc2dyU2VxOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGZnQ2hhbmdlZCA9ICFlcXVhbEZnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGJnQ2hhbmdlZCA9ICFlcXVhbEJnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGZsYWdzQ2hhbmdlZCA9ICFlcXVhbEZsYWdzKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgaWYgKGZnQ2hhbmdlZCB8fCBiZ0NoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICBpZiAoY2VsbC5pc0F0dHJpYnV0ZURlZmF1bHQoKSkge1xuICAgICAgICBpZiAoIW9sZENlbGwuaXNBdHRyaWJ1dGVEZWZhdWx0KCkpIHtcbiAgICAgICAgICBzZ3JTZXEucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRGZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNGZ1JHQigpKSB7IHNnclNlcS5wdXNoKDM4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0ZnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goMzgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDkwICsgKGNvbG9yICYgNykgOiAzMCArIChjb2xvciAmIDcpKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goMzkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRCZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNCZ1JHQigpKSB7IHNnclNlcS5wdXNoKDQ4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goNDgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDEwMCArIChjb2xvciAmIDcpIDogNDAgKyAoY29sb3IgJiA3KSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKDQ5KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmbGFnc0NoYW5nZWQpIHtcbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSAhPT0gb2xkQ2VsbC5pc0ludmVyc2UoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52ZXJzZSgpID8gNyA6IDI3KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzQm9sZCgpICE9PSBvbGRDZWxsLmlzQm9sZCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCb2xkKCkgPyAxIDogMjIpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSAhPT0gb2xkQ2VsbC5pc1VuZGVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNVbmRlcmxpbmUoKSA/IDQgOiAyNCk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc092ZXJsaW5lKCkgIT09IG9sZENlbGwuaXNPdmVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNPdmVybGluZSgpID8gNTMgOiA1NSk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0JsaW5rKCkgIT09IG9sZENlbGwuaXNCbGluaygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCbGluaygpID8gNSA6IDI1KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkgIT09IG9sZENlbGwuaXNJbnZpc2libGUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52aXNpYmxlKCkgPyA4IDogMjgpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNJdGFsaWMoKSAhPT0gb2xkQ2VsbC5pc0l0YWxpYygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJdGFsaWMoKSA/IDMgOiAyMyk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0RpbSgpICE9PSBvbGRDZWxsLmlzRGltKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0RpbSgpID8gMiA6IDIyKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpICE9PSBvbGRDZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkgPyA5IDogMjkpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2dyU2VxO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGEgd2lkdGggMCBjZWxsIGRvbid0IG5lZWQgdG8gYmUgY291bnQgYmVjYXVzZSBpdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYWZ0ZXIgYSBDSksgY2hhcmFjdGVyO1xuICAgIGNvbnN0IGlzUGxhY2VIb2xkZXJDZWxsID0gY2VsbC5nZXRXaWR0aCgpID09PSAwO1xuXG4gICAgaWYgKGlzUGxhY2VIb2xkZXJDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjZWxsIGRvbid0IGhhdmUgY29udGVudFxuICAgIGNvbnN0IGlzRW1wdHlDZWxsID0gY2VsbC5nZXRDaGFycygpID09PSAnJztcblxuICAgIGNvbnN0IHNnclNlcSA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG5cbiAgICAvLyB0aGUgZW1wdHkgY2VsbCBzdHlsZSBpcyBvbmx5IGFzc3VtZWQgdG8gYmUgY2hhbmdlZCB3aGVuIGJhY2tncm91bmQgY2hhbmdlZCwgYmVjYXVzZVxuICAgIC8vIGZvcmVncm91bmQgaXMgYWx3YXlzIDAuXG4gICAgY29uc3Qgc3R5bGVDaGFuZ2VkID0gaXNFbXB0eUNlbGwgPyAhZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgY2VsbCkgOiBzZ3JTZXEubGVuZ3RoID4gMDtcblxuICAgIC8qKlxuICAgICAqICBoYW5kbGVzIHN0eWxlIGNoYW5nZVxuICAgICAqL1xuICAgIGlmIChzdHlsZUNoYW5nZWQpIHtcbiAgICAgIC8vIGJlZm9yZSB1cGRhdGUgdGhlIHN0eWxlLCB3ZSBuZWVkIHRvIGZpbGwgZW1wdHkgY2VsbCBiYWNrXG4gICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgLy8gdXNlIGNsZWFyIHJpZ2h0IHRvIHNldCBiYWNrZ3JvdW5kLlxuICAgICAgICBpZiAoIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZSBtb3ZlIHJpZ2h0IHRvIG1vdmUgY3Vyc29yLlxuICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbDtcblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3NnclNlcS5qb2luKCc7Jyl9bWA7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgbGFzdCBjdXJzb3Igc3R5bGVcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lLmdldENlbGwoY29sLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlUm93ID0gcm93O1xuICAgICAgICB0aGlzLl9jdXJzb3JTdHlsZUNvbCA9IGNvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgaGFuZGxlcyBhY3R1YWwgY29udGVudFxuICAgICAqL1xuICAgIGlmIChpc0VtcHR5Q2VsbCkge1xuICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCArPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAvLyB3ZSBjYW4ganVzdCBhc3N1bWUgd2UgaGF2ZSBzYW1lIHN0eWxlIHdpdGggcHJldmlvdXMgb25lIGhlcmVcbiAgICAgICAgLy8gYmVjYXVzZSBzdHlsZSBjaGFuZ2UgaXMgaGFuZGxlZCBieSBwcmV2aW91cyBzdGFnZVxuICAgICAgICAvLyB1c2UgbW92ZSByaWdodCB3aGVuIGJhY2tncm91bmQgaXMgZW1wdHksIHVzZSBjbGVhciByaWdodCB3aGVuIHRoZXJlIGlzIGJhY2tncm91bmQuXG4gICAgICAgIGlmIChlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG5cbiAgICAgIC8vIHVwZGF0ZSBjdXJzb3JcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbCArIGNlbGwuZ2V0V2lkdGgoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJvd0VuZCA9IHRoaXMuX2FsbFJvd3MubGVuZ3RoO1xuXG4gICAgLy8gdGhlIGZpeHVwIGlzIG9ubHkgcmVxdWlyZWQgZm9yIGRhdGEgd2l0aG91dCBzY3JvbGxiYWNrXG4gICAgLy8gYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSBwbGFjZWQgYXQgbGFzdCBsaW5lIG90aGVyd2lzZVxuICAgIGlmICh0aGlzLl9idWZmZXIubGVuZ3RoIC0gdGhpcy5fZmlyc3RSb3cgPD0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgcm93RW5kID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgKyAxIC0gdGhpcy5fZmlyc3RSb3c7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2w7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3c7XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93RW5kOyBpKyspIHtcbiAgICAgIGNvbnRlbnQgKz0gdGhpcy5fYWxsUm93c1tpXTtcbiAgICAgIGlmIChpICsgMSA8IHJvd0VuZCkge1xuICAgICAgICBjb250ZW50ICs9IHRoaXMuX2FsbFJvd1NlcGFyYXRvcnNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSB0aGUgY3Vyc29yXG4gICAgaWYgKCFleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbikge1xuICAgICAgY29uc3QgcmVhbEN1cnNvclJvdyA9IHRoaXMuX2J1ZmZlci5iYXNlWSArIHRoaXMuX2J1ZmZlci5jdXJzb3JZO1xuICAgICAgY29uc3QgcmVhbEN1cnNvckNvbCA9IHRoaXMuX2J1ZmZlci5jdXJzb3JYO1xuXG4gICAgICBjb25zdCBjdXJzb3JNb3ZlZCA9IChyZWFsQ3Vyc29yUm93ICE9PSB0aGlzLl9sYXN0Q3Vyc29yUm93IHx8IHJlYWxDdXJzb3JDb2wgIT09IHRoaXMuX2xhc3RDdXJzb3JDb2wpO1xuXG4gICAgICBjb25zdCBtb3ZlUmlnaHQgPSAob2Zmc2V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7b2Zmc2V0fUNgO1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7LW9mZnNldH1EYDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1vdmVEb3duID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlske29mZnNldH1CYDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlskey1vZmZzZXR9QWA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjdXJzb3JNb3ZlZCkge1xuICAgICAgICBtb3ZlRG93bihyZWFsQ3Vyc29yUm93IC0gdGhpcy5fbGFzdEN1cnNvclJvdyk7XG4gICAgICAgIG1vdmVSaWdodChyZWFsQ3Vyc29yQ29sIC0gdGhpcy5fbGFzdEN1cnNvckNvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSB0aGUgY3Vyc29yJ3MgY3VycmVudCBzdHlsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94dGVybWpzL3h0ZXJtLmpzL2lzc3Vlcy8zNjc3XG4gICAgLy8gSEFDSzogSW50ZXJuYWwgQVBJIGFjY2VzcyBzaW5jZSBpdCdzIGF3a3dhcmQgdG8gZXhwb3NlIHRoaXMgaW4gdGhlIEFQSSBhbmQgc2VyaWFsaXplIHdpbGxcbiAgICAvLyBsaWtlbHkgYmUgdGhlIG9ubHkgY29uc3VtZXJcbiAgICBjb25zdCBjdXJBdHRyRGF0YTogSUF0dHJpYnV0ZURhdGEgPSAodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5faW5wdXRIYW5kbGVyLl9jdXJBdHRyRGF0YTtcbiAgICBjb25zdCBzZ3JTZXEgPSB0aGlzLl9kaWZmU3R5bGUoY3VyQXR0ckRhdGEsIHRoaXMuX2N1cnNvclN0eWxlKTtcbiAgICBpZiAoc2dyU2VxLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtzZ3JTZXEuam9pbignOycpfW1gO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSVNlcmlhbGl6ZUFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgc2Nyb2xsYmFjaz86IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4Um93cyA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgY29ycmVjdFJvd3MgPSAoc2Nyb2xsYmFjayA9PT0gdW5kZWZpbmVkKSA/IG1heFJvd3MgOiBjb25zdHJhaW4oc2Nyb2xsYmFjayArIHRlcm1pbmFsLnJvd3MsIDAsIG1heFJvd3MpO1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRlcm1pbmFsLCBidWZmZXIsIHtcbiAgICAgIHN0YXJ0OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MsXG4gICAgICBlbmQ6IG1heFJvd3MgLSAxXG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgcmFuZ2U6IElTZXJpYWxpemVSYW5nZSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb246IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgU3RyaW5nU2VyaWFsaXplSGFuZGxlcihidWZmZXIsIHRlcm1pbmFsKTtcbiAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgc3RhcnQ6IHsgeDogMCwgICAgICAgICAgICAgeTogdHlwZW9mIHJhbmdlLnN0YXJ0ID09PSAnbnVtYmVyJyA/IHJhbmdlLnN0YXJ0IDogcmFuZ2Uuc3RhcnQubGluZSB9LFxuICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogdHlwZW9mIHJhbmdlLmVuZCAgID09PSAnbnVtYmVyJyA/IHJhbmdlLmVuZCAgIDogcmFuZ2UuZW5kLmxpbmUgICB9XG4gICAgfSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRlcm1pbmFsOiBUZXJtaW5hbCwgb3B0aW9uczogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBjb25zdCBidWZmZXIgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSFRNTFNlcmlhbGl6ZUhhbmRsZXIoYnVmZmVyLCB0ZXJtaW5hbCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgb25seVNlbGVjdGlvbiA9IG9wdGlvbnMub25seVNlbGVjdGlvbiA/PyBmYWxzZTtcbiAgICBpZiAoIW9ubHlTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IG1heFJvd3MgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgY29uc3Qgc2Nyb2xsYmFjayA9IG9wdGlvbnMuc2Nyb2xsYmFjaztcbiAgICAgIGNvbnN0IGNvcnJlY3RSb3dzID0gKHNjcm9sbGJhY2sgPT09IHVuZGVmaW5lZCkgPyBtYXhSb3dzIDogY29uc3RyYWluKHNjcm9sbGJhY2sgKyB0ZXJtaW5hbC5yb3dzLCAwLCBtYXhSb3dzKTtcbiAgICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0OiB7IHg6IDAsICAgICAgICAgICAgIHk6IG1heFJvd3MgLSBjb3JyZWN0Um93cyB9LFxuICAgICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiBtYXhSb3dzIC0gMSAgICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fdGVybWluYWw/LmdldFNlbGVjdGlvblBvc2l0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiBzZWxlY3Rpb24uc3RhcnQueCwgeTogc2VsZWN0aW9uLnN0YXJ0LnkgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogc2VsZWN0aW9uLmVuZC54LCAgIHk6IHNlbGVjdGlvbi5lbmQueSAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZU1vZGVzKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSAnJztcbiAgICBjb25zdCBtb2RlcyA9IHRlcm1pbmFsLm1vZGVzO1xuXG4gICAgLy8gRGVmYXVsdDogZmFsc2VcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzFoJztcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25LZXlwYWRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NjZoJztcbiAgICBpZiAobW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MjAwNGgnO1xuICAgIGlmIChtb2Rlcy5pbnNlcnRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls0aCc7XG4gICAgaWYgKG1vZGVzLm9yaWdpbk1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz82aCc7XG4gICAgaWYgKG1vZGVzLnJldmVyc2VXcmFwYXJvdW5kTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzQ1aCc7XG4gICAgaWYgKG1vZGVzLnNlbmRGb2N1c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xMDA0aCc7XG5cbiAgICAvLyBEZWZhdWx0OiB0cnVlXG4gICAgaWYgKG1vZGVzLndyYXBhcm91bmRNb2RlID09PSBmYWxzZSkgY29udGVudCArPSAnXFx4MWJbPzdsJztcblxuICAgIC8vIERlZmF1bHQ6ICdub25lJ1xuICAgIGlmIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSAhPT0gJ25vbmUnKSB7XG4gICAgICBzd2l0Y2ggKG1vZGVzLm1vdXNlVHJhY2tpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3gxMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz85aCc7IGJyZWFrO1xuICAgICAgICBjYXNlICd2dDIwMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAwaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdkcmFnJzogY29udGVudCArPSAnXFx4MWJbPzEwMDJoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FueSc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAzaCc7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShvcHRpb25zPzogSVNlcmlhbGl6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEFkZCBjb21iaW5lZERhdGEgc3VwcG9ydFxuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgYnVmZmVyXG4gICAgbGV0IGNvbnRlbnQgPSBvcHRpb25zPy5yYW5nZVxuICAgICAgPyB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zLnJhbmdlLCB0cnVlKVxuICAgICAgOiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5ub3JtYWwsIG9wdGlvbnM/LnNjcm9sbGJhY2spO1xuXG4gICAgLy8gQWx0ZXJuYXRlIGJ1ZmZlclxuICAgIGlmICghb3B0aW9ucz8uZXhjbHVkZUFsdEJ1ZmZlcikge1xuICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudHlwZSA9PT0gJ2FsdGVybmF0ZScpIHtcbiAgICAgICAgY29uc3QgYWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50ID0gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWx0ZXJuYXRlLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWz8xMDQ5aFxcdTAwMWJbSCR7YWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50fWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9kZXNcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVNb2Rlcykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9zZXJpYWxpemVNb2Rlcyh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplQXNIVE1MKG9wdGlvbnM/OiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRoaXMuX3Rlcm1pbmFsLCBvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIVE1MU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfaHRtbENvbnRlbnQgPSAnJztcblxuICBwcml2YXRlIF9hbnNpQ29sb3JzOiBSZWFkb25seTxJQ29sb3JbXT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcblxuICAgIC8vIEZvciB4dGVybSBoZWFkbGVzczogZmFsbGJhY2sgdG8gYW5zaSBjb2xvcnNcbiAgICBpZiAoKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX2Fuc2lDb2xvcnMgPSAoX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gREVGQVVMVF9BTlNJX0NPTE9SUztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYWRTdGFydCh0YXJnZXQ6IHN0cmluZywgdGFyZ2V0TGVuZ3RoOiBudW1iZXIsIHBhZFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBwYWRTdHJpbmcgPSBwYWRTdHJpbmcgPz8gJyAnO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHRhcmdldExlbmd0aCAtPSB0YXJnZXQubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRMZW5ndGggPiBwYWRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBwYWRTdHJpbmcgKz0gcGFkU3RyaW5nLnJlcGVhdCh0YXJnZXRMZW5ndGggLyBwYWRTdHJpbmcubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZFN0cmluZy5zbGljZSgwLCB0YXJnZXRMZW5ndGgpICsgdGFyZ2V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8aHRtbD48Ym9keT48IS0tU3RhcnRGcmFnbWVudC0tPjxwcmU+JztcblxuICAgIGxldCBmb3JlZ3JvdW5kID0gJyMwMDAwMDAnO1xuICAgIGxldCBiYWNrZ3JvdW5kID0gJyNmZmZmZmYnO1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmluY2x1ZGVHbG9iYWxCYWNrZ3JvdW5kID8/IGZhbHNlKSB7XG4gICAgICBmb3JlZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uZm9yZWdyb3VuZCA/PyAnI2ZmZmZmZic7XG4gICAgICBiYWNrZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uYmFja2dyb3VuZCA/PyAnIzAwMDAwMCc7XG4gICAgfVxuXG4gICAgY29uc3QgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyA9IFtdO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnY29sb3I6ICcgKyBmb3JlZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiYWNrZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtZmFtaWx5OiAnICsgdGhpcy5fdGVybWluYWwub3B0aW9ucy5mb250RmFtaWx5ICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtc2l6ZTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUgKyAncHg7Jyk7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxkaXYgc3R5bGU9XFwnJyArIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMuam9pbignICcpICsgJ1xcJz4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9kaXY+JztcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9wcmU+PCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2PjxzcGFuPicgKyB0aGlzLl9jdXJyZW50Um93ICsgJzwvc3Bhbj48L2Rpdj4nO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhleENvbG9yKGNlbGw6IElCdWZmZXJDZWxsLCBpc0ZnOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvciA9IGlzRmcgPyBjZWxsLmdldEZnQ29sb3IoKSA6IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUkdCKCkgOiBjZWxsLmlzQmdSR0IoKSkge1xuICAgICAgY29uc3QgcmdiID0gW1xuICAgICAgICAoY29sb3IgPj4gMTYpICYgMjU1LFxuICAgICAgICAoY29sb3IgPj4gIDgpICYgMjU1LFxuICAgICAgICAoY29sb3IgICAgICApICYgMjU1XG4gICAgICBdO1xuICAgICAgcmV0dXJuICcjJyArIHJnYi5tYXAoeCA9PiB0aGlzLl9wYWRTdGFydCh4LnRvU3RyaW5nKDE2KSwgMiwgJzAnKSkuam9pbignJyk7XG4gICAgfVxuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUGFsZXR0ZSgpIDogY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5zaUNvbG9yc1tjb2xvcl0uY3NzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250ZW50OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGNvbnN0IGZnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCB0cnVlKTtcbiAgICAgIGlmIChmZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnY29sb3I6ICcgKyBmZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmdIZXhDb2xvciA9IHRoaXMuX2dldEhleENvbG9yKGNlbGwsIGZhbHNlKTtcbiAgICAgIGlmIChiZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnYmFja2dyb3VuZC1jb2xvcjogJyArIGJnSGV4Q29sb3IgKyAnOycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSkgeyBjb250ZW50LnB1c2goJ2NvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQkZCRkJGOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JvbGQoKSkgeyBjb250ZW50LnB1c2goJ2ZvbnQtd2VpZ2h0OiBib2xkOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICYmIGNlbGwuaXNPdmVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSB1bmRlcmxpbmU7Jyk7IH1cbiAgICAgIGVsc2UgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogYmxpbms7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkpIHsgY29udGVudC5wdXNoKCd2aXNpYmlsaXR5OiBoaWRkZW47Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHsgY29udGVudC5wdXNoKCdmb250LXN0eWxlOiBpdGFsaWM7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzRGltKCkpIHsgY29udGVudC5wdXNoKCdvcGFjaXR5OiAwLjU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Jyk7IH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc3R5bGVEZWZpbml0aW9ucyA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCBvbGRDZWxsKTtcblxuICAgIC8vIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgaWYgKHN0eWxlRGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gc3R5bGVEZWZpbml0aW9ucy5sZW5ndGggPT09IDAgP1xuICAgICAgICAnPC9zcGFuPjxzcGFuPicgOlxuICAgICAgICAnPC9zcGFuPjxzcGFuIHN0eWxlPVxcJycgKyBzdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgICB9XG5cbiAgICAvLyBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9ICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbENvbnRlbnQ7XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlNlcmlhbGl6ZUFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFR3b0tleU1hcCB9IGZyb20gJ2NvbW1vbi9NdWx0aUtleU1hcCc7XG5cbmV4cG9ydCBjbGFzcyBDb2xvckNvbnRyYXN0Q2FjaGUgaW1wbGVtZW50cyBJQ29sb3JDb250cmFzdENhY2hlIHtcbiAgcHJpdmF0ZSBfY29sb3I6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIElDb2xvciB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuICBwcml2YXRlIF9jc3M6IFR3b0tleU1hcDwvKiBiZyAqL251bWJlciwgLyogZmcgKi9udW1iZXIsIHN0cmluZyB8IG51bGw+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jc3Muc2V0KGJnLCBmZywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Nzcy5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogSUNvbG9yIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogSUNvbG9yIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yLmdldChiZywgZmcpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yLmNsZWFyKCk7XG4gICAgdGhpcy5fY3NzLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUnO1xuaW1wb3J0IHsgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSwgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IsIGNzcywgTlVMTF9DT0xPUiB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSwgSVRoZW1lIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElDb2xvciwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSVJlc3RvcmVDb2xvclNldCB7XG4gIGZvcmVncm91bmQ6IElDb2xvcjtcbiAgYmFja2dyb3VuZDogSUNvbG9yO1xuICBjdXJzb3I6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG59XG5cblxuY29uc3QgREVGQVVMVF9GT1JFR1JPVU5EID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUiA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9TRUxFQ1RJT04gPSB7XG4gIGNzczogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKScsXG4gIHJnYmE6IDB4RkZGRkZGNERcbn07XG5cbi8vIEFuIElJRkUgdG8gZ2VuZXJhdGUgREVGQVVMVF9BTlNJX0NPTE9SUy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOU0lfQ09MT1JTID0gT2JqZWN0LmZyZWV6ZSgoKCkgPT4ge1xuICBjb25zdCBjb2xvcnMgPSBbXG4gICAgLy8gZGFyazpcbiAgICBjc3MudG9Db2xvcignIzJlMzQzNicpLFxuICAgIGNzcy50b0NvbG9yKCcjY2MwMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyM0ZTlhMDYnKSxcbiAgICBjc3MudG9Db2xvcignI2M0YTAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzQ2NWE0JyksXG4gICAgY3NzLnRvQ29sb3IoJyM3NTUwN2InKSxcbiAgICBjc3MudG9Db2xvcignIzA2OTg5YScpLFxuICAgIGNzcy50b0NvbG9yKCcjZDNkN2NmJyksXG4gICAgLy8gYnJpZ2h0OlxuICAgIGNzcy50b0NvbG9yKCcjNTU1NzUzJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZjI5MjknKSxcbiAgICBjc3MudG9Db2xvcignIzhhZTIzNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjZmNlOTRmJyksXG4gICAgY3NzLnRvQ29sb3IoJyM3MjlmY2YnKSxcbiAgICBjc3MudG9Db2xvcignI2FkN2ZhOCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzRlMmUyJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZWVlZWMnKVxuICBdO1xuXG4gIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyAyNDAgQU5TSSBjb2xvcnMuXG4gIC8vIEdlbmVyYXRlIGNvbG9ycyAoMTYtMjMxKVxuICBjb25zdCB2ID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgY29uc3QgciA9IHZbKGkgLyAzNikgJSA2IHwgMF07XG4gICAgY29uc3QgZyA9IHZbKGkgLyA2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBiID0gdltpICUgNl07XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgZ3JleXMgKDIzMi0yNTUpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgIGNvbnN0IGMgPSA4ICsgaSAqIDEwO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoYywgYywgYyksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoYywgYywgYylcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59KSgpKTtcblxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGhlbWVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NvbG9yczogSUNvbG9yU2V0O1xuICBwcml2YXRlIF9jb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9oYWxmQ29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9ycyE6IElSZXN0b3JlQ29sb3JTZXQ7XG5cbiAgcHVibGljIGdldCBjb2xvcnMoKTogUmVhZG9ubHlDb2xvclNldCB7IHJldHVybiB0aGlzLl9jb2xvcnM7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZUNvbG9ycyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxSZWFkb25seUNvbG9yU2V0PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzID0gdGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gICAgICBiYWNrZ3JvdW5kOiBERUZBVUxUX0JBQ0tHUk9VTkQsXG4gICAgICBjdXJzb3I6IERFRkFVTFRfQ1VSU09SLFxuICAgICAgY3Vyc29yQWNjZW50OiBERUZBVUxUX0NVUlNPUl9BQ0NFTlQsXG4gICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgYW5zaTogREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLFxuICAgICAgY29udHJhc3RDYWNoZTogdGhpcy5fY29udHJhc3RDYWNoZSxcbiAgICAgIGhhbGZDb250cmFzdENhY2hlOiB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZVxuICAgIH07XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdtaW5pbXVtQ29udHJhc3RSYXRpbycsICgpID0+IHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGhlbWUnLCAoKSA9PiB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRlcm1pbmFsJ3MgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZSBUaGUgIHRoZW1lIHRvIHVzZS4gSWYgYSBwYXJ0aWFsIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gZGVmYXVsdFxuICAgKiBjb2xvcnMgd2lsbCBiZSB1c2VkIHdoZXJlIGNvbG9ycyBhcmUgbm90IGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zZXRUaGVtZSh0aGVtZTogSVRoZW1lID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLl9jb2xvcnM7XG4gICAgY29sb3JzLmZvcmVncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCk7XG4gICAgY29sb3JzLmJhY2tncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCk7XG4gICAgY29sb3JzLmN1cnNvciA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yLCBERUZBVUxUX0NVUlNPUik7XG4gICAgY29sb3JzLmN1cnNvckFjY2VudCA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yQWNjZW50LCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkJhY2tncm91bmQsIERFRkFVTFRfU0VMRUNUSU9OKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCA/IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCwgTlVMTF9DT0xPUikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID09PSBOVUxMX0NPTE9SKSB7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZWxlY3Rpb24gY29sb3IgaXMgb3BhcXVlLCBibGVuZCBpdCB3aXRoIGJhY2tncm91bmQgd2l0aCAwLjMgb3BhY2l0eVxuICAgICAqIElzc3VlICMyNzM3XG4gICAgICovXG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBjb2xvcnMuYW5zaSA9IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKTtcbiAgICBjb2xvcnMuYW5zaVswXSA9IHBhcnNlQ29sb3IodGhlbWUuYmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbMF0pO1xuICAgIGNvbG9ycy5hbnNpWzFdID0gcGFyc2VDb2xvcih0aGVtZS5yZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbMV0pO1xuICAgIGNvbG9ycy5hbnNpWzJdID0gcGFyc2VDb2xvcih0aGVtZS5ncmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1syXSk7XG4gICAgY29sb3JzLmFuc2lbM10gPSBwYXJzZUNvbG9yKHRoZW1lLnllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1szXSk7XG4gICAgY29sb3JzLmFuc2lbNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbNF0pO1xuICAgIGNvbG9ycy5hbnNpWzVdID0gcGFyc2VDb2xvcih0aGVtZS5tYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzVdKTtcbiAgICBjb2xvcnMuYW5zaVs2XSA9IHBhcnNlQ29sb3IodGhlbWUuY3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1s2XSk7XG4gICAgY29sb3JzLmFuc2lbN10gPSBwYXJzZUNvbG9yKHRoZW1lLndoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzddKTtcbiAgICBjb2xvcnMuYW5zaVs4XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0QmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbOF0pO1xuICAgIGNvbG9ycy5hbnNpWzldID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRSZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbOV0pO1xuICAgIGNvbG9ycy5hbnNpWzEwXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0R3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTBdKTtcbiAgICBjb2xvcnMuYW5zaVsxMV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pO1xuICAgIGNvbG9ycy5hbnNpWzEyXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Qmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMl0pO1xuICAgIGNvbG9ycy5hbnNpWzEzXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0TWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxM10pO1xuICAgIGNvbG9ycy5hbnNpWzE0XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Q3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pO1xuICAgIGNvbG9ycy5hbnNpWzE1XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0V2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTVdKTtcbiAgICBpZiAodGhlbWUuZXh0ZW5kZWRBbnNpKSB7XG4gICAgICBjb25zdCBjb2xvckNvdW50ID0gTWF0aC5taW4oY29sb3JzLmFuc2kubGVuZ3RoIC0gMTYsIHRoZW1lLmV4dGVuZGVkQW5zaS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvckNvdW50OyBpKyspIHtcbiAgICAgICAgY29sb3JzLmFuc2lbaSArIDE2XSA9IHBhcnNlQ29sb3IodGhlbWUuZXh0ZW5kZWRBbnNpW2ldLCBERUZBVUxUX0FOU0lfQ09MT1JTW2kgKyAxNl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciBvdXIgdGhlIGNhY2hlXG4gICAgdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcihzbG90KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcihzbG90OiBBbGxDb2xvckluZGV4IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gdW5zZXQgc2xvdCByZXN0b3JlcyBhbGwgYW5zaSBjb2xvcnNcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtpXSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzbG90KSB7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkZPUkVHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmJhY2tncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1I6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5jdXJzb3IgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmN1cnNvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtzbG90XSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtzbG90XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjayh0aGlzLl9jb2xvcnMpO1xuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlIGhhcHBlbmVkXG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZXN0b3JlQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLFxuICAgICAgY3Vyc29yOiB0aGlzLl9jb2xvcnMuY3Vyc29yLFxuICAgICAgYW5zaTogdGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xvcihcbiAgY3NzU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiBJQ29sb3Jcbik6IElDb2xvciB7XG4gIGlmIChjc3NTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY3NzLnRvQ29sb3IoY3NzU3RyaW5nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElMaXN0ZW5lcjxULCBVID0gdm9pZD4ge1xuICAoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50PFQsIFUgPSB2b2lkPiB7XG4gIChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IHtcbiAgZXZlbnQ6IElFdmVudDxULCBVPjtcbiAgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiBpbXBsZW1lbnRzIElFdmVudEVtaXR0ZXI8VCwgVT4ge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gIHByaXZhdGUgX2V2ZW50PzogSUV2ZW50PFQsIFU+O1xuICBwcml2YXRlIF9kaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnQoKTogSUV2ZW50PFQsIFU+IHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lcjogKGFyZzE6IFQsIGFyZzI6IFUpID0+IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB7XG4gICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZmlyZShhcmcxOiBULCBhcmcyOiBVKTogdm9pZCB7XG4gICAgY29uc3QgcXVldWU6IElMaXN0ZW5lcjxULCBVPltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2godGhpcy5fbGlzdGVuZXJzW2ldKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0uY2FsbCh1bmRlZmluZWQsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkRXZlbnQ8VD4oZnJvbTogSUV2ZW50PFQ+LCB0bzogSUV2ZW50RW1pdHRlcjxUPik6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGZyb20oZSA9PiB0by5maXJlKGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogSUV2ZW50PFQ+LCBoYW5kbGVyOiAoZTogVCB8IHVuZGVmaW5lZCkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICBoYW5kbGVyKHVuZGVmaW5lZCk7XG4gIHJldHVybiBldmVudChlID0+IGhhbmRsZXIoZSkpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogKEVYUEVSSU1FTlRBTCkgVGhpcyBBZGRvbiBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudFxuICovXG5cbmltcG9ydCB0eXBlIHsgSUJ1ZmZlciwgSUJ1ZmZlckNlbGwsIElCdWZmZXJSYW5nZSwgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgSUhUTUxTZXJpYWxpemVPcHRpb25zLCBTZXJpYWxpemVBZGRvbiBhcyBJU2VyaWFsaXplQXBpLCBJU2VyaWFsaXplT3B0aW9ucywgSVNlcmlhbGl6ZVJhbmdlIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXNlcmlhbGl6ZSc7XG5pbXBvcnQgeyBERUZBVUxUX0FOU0lfQ09MT1JTIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UnO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmZ1bmN0aW9uIGNvbnN0cmFpbih2YWx1ZTogbnVtYmVyLCBsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KGxvdywgTWF0aC5taW4odmFsdWUsIGhpZ2gpKTtcbn1cblxuLy8gVE9ETzogUmVmaW5lIHRoaXMgdGVtcGxhdGUgY2xhc3MgbGF0ZXJcbmFic3RyYWN0IGNsYXNzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9idWZmZXI6IElCdWZmZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKHJhbmdlOiBJQnVmZmVyUmFuZ2UsIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8gd2UgbmVlZCB0d28gb2YgdGhlbSB0byBmbGlwIGJldHdlZW4gb2xkIGFuZCBuZXcgY2VsbFxuICAgIGNvbnN0IGNlbGwxID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gICAgY29uc3QgY2VsbDIgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgICBsZXQgb2xkQ2VsbCA9IGNlbGwxO1xuXG4gICAgY29uc3Qgc3RhcnRSb3cgPSByYW5nZS5zdGFydC55O1xuICAgIGNvbnN0IGVuZFJvdyA9IHJhbmdlLmVuZC55O1xuICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gcmFuZ2Uuc3RhcnQueDtcbiAgICBjb25zdCBlbmRDb2x1bW4gPSByYW5nZS5lbmQueDtcblxuICAgIHRoaXMuX2JlZm9yZVNlcmlhbGl6ZShlbmRSb3cgLSBzdGFydFJvdywgc3RhcnRSb3csIGVuZFJvdyk7XG5cbiAgICBmb3IgKGxldCByb3cgPSBzdGFydFJvdzsgcm93IDw9IGVuZFJvdzsgcm93KyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5zdGFydC55ID8gc3RhcnRDb2x1bW4gOiAwO1xuICAgICAgICBjb25zdCBlbmRMaW5lQ29sdW1uID0gcm93ID09PSByYW5nZS5lbmQueSA/IGVuZENvbHVtbjogbGluZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0TGluZUNvbHVtbjsgY29sIDwgZW5kTGluZUNvbHVtbjsgY29sKyspIHtcbiAgICAgICAgICBjb25zdCBjID0gbGluZS5nZXRDZWxsKGNvbCwgb2xkQ2VsbCA9PT0gY2VsbDEgPyBjZWxsMiA6IGNlbGwxKTtcbiAgICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ2V0IGNlbGwgYXQgcm93PSR7cm93fSwgY29sPSR7Y29sfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX25leHRDZWxsKGMsIG9sZENlbGwsIHJvdywgY29sKTtcbiAgICAgICAgICBvbGRDZWxsID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcm93RW5kKHJvdywgcm93ID09PSBlbmRSb3cpO1xuICAgIH1cblxuICAgIHRoaXMuX2FmdGVyU2VyaWFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfYWZ0ZXJTZXJpYWxpemUoKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24/OiBib29sZWFuKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG59XG5cbmZ1bmN0aW9uIGVxdWFsRmcoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuZ2V0RmdDb2xvck1vZGUoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvck1vZGUoKVxuICAgICYmIGNlbGwxLmdldEZnQ29sb3IoKSA9PT0gY2VsbDIuZ2V0RmdDb2xvcigpO1xufVxuXG5mdW5jdGlvbiBlcXVhbEJnKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmdldEJnQ29sb3JNb2RlKCkgPT09IGNlbGwyLmdldEJnQ29sb3JNb2RlKClcbiAgICAmJiBjZWxsMS5nZXRCZ0NvbG9yKCkgPT09IGNlbGwyLmdldEJnQ29sb3IoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxGbGFncyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5pc0ludmVyc2UoKSA9PT0gY2VsbDIuaXNJbnZlcnNlKClcbiAgICAmJiBjZWxsMS5pc0JvbGQoKSA9PT0gY2VsbDIuaXNCb2xkKClcbiAgICAmJiBjZWxsMS5pc1VuZGVybGluZSgpID09PSBjZWxsMi5pc1VuZGVybGluZSgpXG4gICAgJiYgY2VsbDEuaXNPdmVybGluZSgpID09PSBjZWxsMi5pc092ZXJsaW5lKClcbiAgICAmJiBjZWxsMS5pc0JsaW5rKCkgPT09IGNlbGwyLmlzQmxpbmsoKVxuICAgICYmIGNlbGwxLmlzSW52aXNpYmxlKCkgPT09IGNlbGwyLmlzSW52aXNpYmxlKClcbiAgICAmJiBjZWxsMS5pc0l0YWxpYygpID09PSBjZWxsMi5pc0l0YWxpYygpXG4gICAgJiYgY2VsbDEuaXNEaW0oKSA9PT0gY2VsbDIuaXNEaW0oKVxuICAgICYmIGNlbGwxLmlzU3RyaWtldGhyb3VnaCgpID09PSBjZWxsMi5pc1N0cmlrZXRocm91Z2goKTtcbn1cblxuY2xhc3MgU3RyaW5nU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfcm93SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2FsbFJvd3M6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfYWxsUm93U2VwYXJhdG9yczogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIF9jdXJyZW50Um93OiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfbnVsbENlbGxDb3VudDogbnVtYmVyID0gMDtcblxuICAvLyB3ZSBjYW4gc2VlIGEgZnVsbCBjb2xvcmVkIGNlbGwgYW5kIGEgbnVsbCBjZWxsIHRoYXQgb25seSBoYXZlIGJhY2tncm91bmQgdGhlIHNhbWUgc3R5bGVcbiAgLy8gYnV0IHRoZSBpbmZvcm1hdGlvbiBpc24ndCBwcmVzZXJ2ZWQgYnkgbnVsbCBjZWxsIGl0c2VsZlxuICAvLyBzbyB3ZWUgbmVlZCB0byByZWNvcmQgaXQgd2hlbiByZXF1aXJlZC5cbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGU6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgLy8gd2hlcmUgZXhhY3QgdGhlIGN1cnNvciBzdHlsZXMgY29tZXMgZnJvbVxuICAvLyBiZWNhdXNlIHdlIGNhbid0IGNvcHkgdGhlIGNlbGwgZGlyZWN0bHlcbiAgLy8gc28gd2UgcmVtZW1iZXIgd2hlcmUgdGhlIGNvbnRlbnQgY29tZXMgZnJvbSBpbnN0ZWFkXG4gIHByaXZhdGUgX2N1cnNvclN0eWxlUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJzb3JTdHlsZUNvbDogbnVtYmVyID0gMDtcblxuICAvLyB0aGlzIGlzIGEgbnVsbCBjZWxsIGZvciByZWZlcmVuY2UgZm9yIGNoZWNraW5nIHdoZXRoZXIgYmFja2dyb3VuZCBpcyBlbXB0eSBvciBub3RcbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENlbGw6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG5cbiAgcHJpdmF0ZSBfZmlyc3RSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDdXJzb3JDb2w6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50Q3Vyc29yUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudEN1cnNvckNvbDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWZmZXI6IElCdWZmZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsXG4gICkge1xuICAgIHN1cGVyKGJ1ZmZlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fYWxsUm93cyA9IG5ldyBBcnJheTxzdHJpbmc+KHJvd3MpO1xuICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gc3RhcnQ7XG4gICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHN0YXJ0O1xuICAgIHRoaXMuX2ZpcnN0Um93ID0gc3RhcnQ7XG4gIH1cblxuICBwcml2YXRlIF90aGlzUm93TGFzdENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByaXZhdGUgX3RoaXNSb3dMYXN0U2Vjb25kQ2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJpdmF0ZSBfbmV4dFJvd0ZpcnN0Q2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIGlmIHRoZXJlIGlzIGNvbG9yZnVsIGVtcHR5IGNlbGwgYXQgbGluZSBlbmQsIHdoZSBtdXN0IHBhZCBpdCBiYWNrLCBvciB0aGUgdGhlIGNvbG9yIGJsb2NrXG4gICAgLy8gd2lsbCBtaXNzaW5nXG4gICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwICYmICFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgIC8vIHVzZSBjbGVhciByaWdodCB0byBzZXQgYmFja2dyb3VuZC5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgIH1cblxuICAgIGxldCByb3dTZXBhcmF0b3IgPSAnJztcblxuICAgIC8vIGhhbmRsZSByb3cgc2VwYXJhdG9yXG4gICAgaWYgKCFpc0xhc3RSb3cpIHtcbiAgICAgIC8vIEVuYWJsZSBCQ0VcbiAgICAgIGlmIChyb3cgLSB0aGlzLl9maXJzdFJvdyA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlci5nZXRMaW5lKHRoaXMuX2N1cnNvclN0eWxlUm93KT8uZ2V0Q2VsbCh0aGlzLl9jdXJzb3JTdHlsZUNvbCwgdGhpcy5fYmFja2dyb3VuZENlbGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBGZXRjaCBjdXJyZW50IGxpbmVcbiAgICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KSE7XG4gICAgICAvLyBGZXRjaCBuZXh0IGxpbmVcbiAgICAgIGNvbnN0IG5leHRMaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93ICsgMSkhO1xuXG4gICAgICBpZiAoIW5leHRMaW5lLmlzV3JhcHBlZCkge1xuICAgICAgICAvLyBqdXN0IGluc2VydCB0aGUgbGluZSBicmVha1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnXFxyXFxuJztcbiAgICAgICAgLy8gd2Ugc2VuZGVkIHRoZSBlbnRlclxuICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dTZXBhcmF0b3IgPSAnJztcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAxLCB0aGlzLl90aGlzUm93TGFzdENoYXIpITtcbiAgICAgICAgY29uc3QgdGhpc1Jvd0xhc3RTZWNvbmRDaGFyID0gY3VycmVudExpbmUuZ2V0Q2VsbChjdXJyZW50TGluZS5sZW5ndGggLSAyLCB0aGlzLl90aGlzUm93TGFzdFNlY29uZENoYXIpITtcbiAgICAgICAgY29uc3QgbmV4dFJvd0ZpcnN0Q2hhciA9IG5leHRMaW5lLmdldENlbGwoMCwgdGhpcy5fbmV4dFJvd0ZpcnN0Q2hhcikhO1xuICAgICAgICBjb25zdCBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCA9IG5leHRSb3dGaXJzdENoYXIuZ2V0V2lkdGgoKSA+IDE7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgd2hldGhlciB0aGlzIGxpbmUgd3JhcCBpcyBldmVyIHBvc3NpYmxlXG4gICAgICAgIC8vIHdoaWNoIG1lYW4gd2hldGhlciBjdXJzb3IgY2FuIHBsYWNlZCBhdCBhIG92ZXJmbG93IHBvc2l0aW9uICh4ID09PSByb3cpIG5hdHVyYWxseVxuICAgICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyB5b3UgbXVzdCBvdXRwdXQgY2hhcmFjdGVyIHRvIGNhdXNlIG92ZXJmbG93LCBjb250cm9sIHNlcXVlbmNlIGNhbid0IGRvIHRoaXNcbiAgICAgICAgICBuZXh0Um93Rmlyc3RDaGFyLmdldENoYXJzKCkgJiZcbiAgICAgICAgICAgIGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoID8gdGhpcy5fbnVsbENlbGxDb3VudCA8PSAxIDogdGhpcy5fbnVsbENlbGxDb3VudCA8PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNoYXJhY3RlciBjYW4ndCBiZSBudWxsLFxuICAgICAgICAgICAgLy8geW91IGNhbid0IHVzZSBjb250cm9sIHNlcXVlbmNlIHRvIG1vdmUgY3Vyc29yIHRvICh4ID09PSByb3cpXG4gICAgICAgICAgICAodGhpc1Jvd0xhc3RDaGFyLmdldENoYXJzKCkgfHwgdGhpc1Jvd0xhc3RDaGFyLmdldFdpZHRoKCkgPT09IDApICYmXG4gICAgICAgICAgICAvLyBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZmlyc3Qgd3JhcHBlZCBjZWxsIGFsc28gYWZmZWN0cyBCQ0VcbiAgICAgICAgICAgIC8vIHNvIHdlIG1hcmsgaXQgYXMgaW52YWxpZCB0byBzaW1wbHkgdGhlIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIGxpbmUgc2VwYXJhdG9yXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0Q2hhciwgbmV4dFJvd0ZpcnN0Q2hhcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgdG8gbGFzdCBjaGFyYWN0ZXIgY2FuJ3QgYmUgbnVsbCBpZiB0aGUgbmV4dCBsaW5lIHN0YXJ0cyB3aXRoIENKSyxcbiAgICAgICAgICAgIC8vIHlvdSBjYW4ndCB1c2UgY29udHJvbCBzZXF1ZW5jZSB0byBtb3ZlIGN1cnNvciB0byAoeCA9PT0gcm93KVxuICAgICAgICAgICAgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggJiZcbiAgICAgICAgICAgICh0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0Q2hhcnMoKSB8fCB0aGlzUm93TGFzdFNlY29uZENoYXIuZ2V0V2lkdGgoKSA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIG9mIHRoZSBmaXJzdCB3cmFwcGVkIGNlbGwgYWxzbyBhZmZlY3RzIEJDRVxuICAgICAgICAgICAgLy8gc28gd2UgbWFyayBpdCBhcyBpbnZhbGlkIHRvIHNpbXBseSB0aGUgcHJvY2VzcyB0byBkZXRlcm1pbmUgbGluZSBzZXBhcmF0b3JcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKSAmJlxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdFNlY29uZENoYXIsIG5leHRSb3dGaXJzdENoYXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAvLyBmb3JjZSB0aGUgd3JhcCB3aXRoIG1hZ2ljXG4gICAgICAgICAgLy8gaW5zZXJ0IGVub3VnaCBjaGFyYWN0ZXIgdG8gZm9yY2UgdGhlIHdyYXBcbiAgICAgICAgICByb3dTZXBhcmF0b3IgPSAnLScucmVwZWF0KHRoaXMuX251bGxDZWxsQ291bnQgKyAxKTtcbiAgICAgICAgICAvLyBtb3ZlIGJhY2sgYW5kIGVyYXNlIG5leHQgbGluZSBoZWFkXG4gICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiWzFEXFx1MDAxYlsxWCc7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIGRvIHRoZXNlIGJlY2F1c2Ugd2UgZmlsbGVkIHRoZSBsYXN0IHNldmVyYWwgbnVsbCBzbG90LCB3aGljaCB3ZSBzaG91bGRuJ3RcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltBJztcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske2N1cnJlbnRMaW5lLmxlbmd0aCAtIHRoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7Y3VycmVudExpbmUubGVuZ3RoIC0gdGhpcy5fbnVsbENlbGxDb3VudH1EYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYltCJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGNvbnRlbnQgYW5kIG5lZWQgdGhlIGJlIHNlcmlhbGl6ZWQgZXZlbiBpdCBpcyBpbnZpc2libGUuXG4gICAgICAgICAgLy8gd2l0aG91dCB0aGlzLCB3cmFwIHdpbGwgYmUgbWlzc2luZyBmcm9tIG91dHB1dHMuXG4gICAgICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gMDtcblxuICAgICAgICAgIC8vIGZvcmNlIGNvbW1pdCB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hbGxSb3dzW3RoaXMuX3Jvd0luZGV4XSA9IHRoaXMuX2N1cnJlbnRSb3c7XG4gICAgdGhpcy5fYWxsUm93U2VwYXJhdG9yc1t0aGlzLl9yb3dJbmRleCsrXSA9IHJvd1NlcGFyYXRvcjtcbiAgICB0aGlzLl9jdXJyZW50Um93ID0gJyc7XG4gICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9kaWZmU3R5bGUoY2VsbDogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc2dyU2VxOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGZnQ2hhbmdlZCA9ICFlcXVhbEZnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGJnQ2hhbmdlZCA9ICFlcXVhbEJnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGZsYWdzQ2hhbmdlZCA9ICFlcXVhbEZsYWdzKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgaWYgKGZnQ2hhbmdlZCB8fCBiZ0NoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICBpZiAoY2VsbC5pc0F0dHJpYnV0ZURlZmF1bHQoKSkge1xuICAgICAgICBpZiAoIW9sZENlbGwuaXNBdHRyaWJ1dGVEZWZhdWx0KCkpIHtcbiAgICAgICAgICBzZ3JTZXEucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRGZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNGZ1JHQigpKSB7IHNnclNlcS5wdXNoKDM4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0ZnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goMzgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDkwICsgKGNvbG9yICYgNykgOiAzMCArIChjb2xvciAmIDcpKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goMzkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJnQ2hhbmdlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2VsbC5nZXRCZ0NvbG9yKCk7XG4gICAgICAgICAgaWYgKGNlbGwuaXNCZ1JHQigpKSB7IHNnclNlcS5wdXNoKDQ4LCAyLCAoY29sb3IgPj4+IDE2KSAmIDB4RkYsIChjb2xvciA+Pj4gOCkgJiAweEZGLCBjb2xvciAmIDB4RkYpOyB9XG4gICAgICAgICAgZWxzZSBpZiAoY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPj0gMTYpIHsgc2dyU2VxLnB1c2goNDgsIDUsIGNvbG9yKTsgfVxuICAgICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKGNvbG9yICYgOCA/IDEwMCArIChjb2xvciAmIDcpIDogNDAgKyAoY29sb3IgJiA3KSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKDQ5KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmbGFnc0NoYW5nZWQpIHtcbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSAhPT0gb2xkQ2VsbC5pc0ludmVyc2UoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52ZXJzZSgpID8gNyA6IDI3KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzQm9sZCgpICE9PSBvbGRDZWxsLmlzQm9sZCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCb2xkKCkgPyAxIDogMjIpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSAhPT0gb2xkQ2VsbC5pc1VuZGVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNVbmRlcmxpbmUoKSA/IDQgOiAyNCk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc092ZXJsaW5lKCkgIT09IG9sZENlbGwuaXNPdmVybGluZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNPdmVybGluZSgpID8gNTMgOiA1NSk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0JsaW5rKCkgIT09IG9sZENlbGwuaXNCbGluaygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNCbGluaygpID8gNSA6IDI1KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkgIT09IG9sZENlbGwuaXNJbnZpc2libGUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSW52aXNpYmxlKCkgPyA4IDogMjgpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNJdGFsaWMoKSAhPT0gb2xkQ2VsbC5pc0l0YWxpYygpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJdGFsaWMoKSA/IDMgOiAyMyk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0RpbSgpICE9PSBvbGRDZWxsLmlzRGltKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0RpbSgpID8gMiA6IDIyKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpICE9PSBvbGRDZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkgPyA5IDogMjkpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2dyU2VxO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGEgd2lkdGggMCBjZWxsIGRvbid0IG5lZWQgdG8gYmUgY291bnQgYmVjYXVzZSBpdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYWZ0ZXIgYSBDSksgY2hhcmFjdGVyO1xuICAgIGNvbnN0IGlzUGxhY2VIb2xkZXJDZWxsID0gY2VsbC5nZXRXaWR0aCgpID09PSAwO1xuXG4gICAgaWYgKGlzUGxhY2VIb2xkZXJDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjZWxsIGRvbid0IGhhdmUgY29udGVudFxuICAgIGNvbnN0IGlzRW1wdHlDZWxsID0gY2VsbC5nZXRDaGFycygpID09PSAnJztcblxuICAgIGNvbnN0IHNnclNlcSA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG5cbiAgICAvLyB0aGUgZW1wdHkgY2VsbCBzdHlsZSBpcyBvbmx5IGFzc3VtZWQgdG8gYmUgY2hhbmdlZCB3aGVuIGJhY2tncm91bmQgY2hhbmdlZCwgYmVjYXVzZVxuICAgIC8vIGZvcmVncm91bmQgaXMgYWx3YXlzIDAuXG4gICAgY29uc3Qgc3R5bGVDaGFuZ2VkID0gaXNFbXB0eUNlbGwgPyAhZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgY2VsbCkgOiBzZ3JTZXEubGVuZ3RoID4gMDtcblxuICAgIC8qKlxuICAgICAqICBoYW5kbGVzIHN0eWxlIGNoYW5nZVxuICAgICAqL1xuICAgIGlmIChzdHlsZUNoYW5nZWQpIHtcbiAgICAgIC8vIGJlZm9yZSB1cGRhdGUgdGhlIHN0eWxlLCB3ZSBuZWVkIHRvIGZpbGwgZW1wdHkgY2VsbCBiYWNrXG4gICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgLy8gdXNlIGNsZWFyIHJpZ2h0IHRvIHNldCBiYWNrZ3JvdW5kLlxuICAgICAgICBpZiAoIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZSBtb3ZlIHJpZ2h0IHRvIG1vdmUgY3Vyc29yLlxuICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbDtcblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3NnclNlcS5qb2luKCc7Jyl9bWA7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgbGFzdCBjdXJzb3Igc3R5bGVcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpO1xuICAgICAgaWYgKGxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lLmdldENlbGwoY29sLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlUm93ID0gcm93O1xuICAgICAgICB0aGlzLl9jdXJzb3JTdHlsZUNvbCA9IGNvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgaGFuZGxlcyBhY3R1YWwgY29udGVudFxuICAgICAqL1xuICAgIGlmIChpc0VtcHR5Q2VsbCkge1xuICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCArPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAvLyB3ZSBjYW4ganVzdCBhc3N1bWUgd2UgaGF2ZSBzYW1lIHN0eWxlIHdpdGggcHJldmlvdXMgb25lIGhlcmVcbiAgICAgICAgLy8gYmVjYXVzZSBzdHlsZSBjaGFuZ2UgaXMgaGFuZGxlZCBieSBwcmV2aW91cyBzdGFnZVxuICAgICAgICAvLyB1c2UgbW92ZSByaWdodCB3aGVuIGJhY2tncm91bmQgaXMgZW1wdHksIHVzZSBjbGVhciByaWdodCB3aGVuIHRoZXJlIGlzIGJhY2tncm91bmQuXG4gICAgICAgIGlmIChlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG5cbiAgICAgIC8vIHVwZGF0ZSBjdXJzb3JcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdztcbiAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sID0gdGhpcy5fbGFzdEN1cnNvckNvbCA9IGNvbCArIGNlbGwuZ2V0V2lkdGgoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJvd0VuZCA9IHRoaXMuX2FsbFJvd3MubGVuZ3RoO1xuXG4gICAgLy8gdGhlIGZpeHVwIGlzIG9ubHkgcmVxdWlyZWQgZm9yIGRhdGEgd2l0aG91dCBzY3JvbGxiYWNrXG4gICAgLy8gYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSBwbGFjZWQgYXQgbGFzdCBsaW5lIG90aGVyd2lzZVxuICAgIGlmICh0aGlzLl9idWZmZXIubGVuZ3RoIC0gdGhpcy5fZmlyc3RSb3cgPD0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgcm93RW5kID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgKyAxIC0gdGhpcy5fZmlyc3RSb3c7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2w7XG4gICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3c7XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93RW5kOyBpKyspIHtcbiAgICAgIGNvbnRlbnQgKz0gdGhpcy5fYWxsUm93c1tpXTtcbiAgICAgIGlmIChpICsgMSA8IHJvd0VuZCkge1xuICAgICAgICBjb250ZW50ICs9IHRoaXMuX2FsbFJvd1NlcGFyYXRvcnNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSB0aGUgY3Vyc29yXG4gICAgaWYgKCFleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbikge1xuICAgICAgY29uc3QgcmVhbEN1cnNvclJvdyA9IHRoaXMuX2J1ZmZlci5iYXNlWSArIHRoaXMuX2J1ZmZlci5jdXJzb3JZO1xuICAgICAgY29uc3QgcmVhbEN1cnNvckNvbCA9IHRoaXMuX2J1ZmZlci5jdXJzb3JYO1xuXG4gICAgICBjb25zdCBjdXJzb3JNb3ZlZCA9IChyZWFsQ3Vyc29yUm93ICE9PSB0aGlzLl9sYXN0Q3Vyc29yUm93IHx8IHJlYWxDdXJzb3JDb2wgIT09IHRoaXMuX2xhc3RDdXJzb3JDb2wpO1xuXG4gICAgICBjb25zdCBtb3ZlUmlnaHQgPSAob2Zmc2V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7b2Zmc2V0fUNgO1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7LW9mZnNldH1EYDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1vdmVEb3duID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlske29mZnNldH1CYDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlskey1vZmZzZXR9QWA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjdXJzb3JNb3ZlZCkge1xuICAgICAgICBtb3ZlRG93bihyZWFsQ3Vyc29yUm93IC0gdGhpcy5fbGFzdEN1cnNvclJvdyk7XG4gICAgICAgIG1vdmVSaWdodChyZWFsQ3Vyc29yQ29sIC0gdGhpcy5fbGFzdEN1cnNvckNvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSB0aGUgY3Vyc29yJ3MgY3VycmVudCBzdHlsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94dGVybWpzL3h0ZXJtLmpzL2lzc3Vlcy8zNjc3XG4gICAgLy8gSEFDSzogSW50ZXJuYWwgQVBJIGFjY2VzcyBzaW5jZSBpdCdzIGF3a3dhcmQgdG8gZXhwb3NlIHRoaXMgaW4gdGhlIEFQSSBhbmQgc2VyaWFsaXplIHdpbGxcbiAgICAvLyBsaWtlbHkgYmUgdGhlIG9ubHkgY29uc3VtZXJcbiAgICBjb25zdCBjdXJBdHRyRGF0YTogSUF0dHJpYnV0ZURhdGEgPSAodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5faW5wdXRIYW5kbGVyLl9jdXJBdHRyRGF0YTtcbiAgICBjb25zdCBzZ3JTZXEgPSB0aGlzLl9kaWZmU3R5bGUoY3VyQXR0ckRhdGEsIHRoaXMuX2N1cnNvclN0eWxlKTtcbiAgICBpZiAoc2dyU2VxLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtzZ3JTZXEuam9pbignOycpfW1gO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSVNlcmlhbGl6ZUFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgc2Nyb2xsYmFjaz86IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4Um93cyA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgY29ycmVjdFJvd3MgPSAoc2Nyb2xsYmFjayA9PT0gdW5kZWZpbmVkKSA/IG1heFJvd3MgOiBjb25zdHJhaW4oc2Nyb2xsYmFjayArIHRlcm1pbmFsLnJvd3MsIDAsIG1heFJvd3MpO1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRlcm1pbmFsLCBidWZmZXIsIHtcbiAgICAgIHN0YXJ0OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MsXG4gICAgICBlbmQ6IG1heFJvd3MgLSAxXG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0ZXJtaW5hbDogVGVybWluYWwsIGJ1ZmZlcjogSUJ1ZmZlciwgcmFuZ2U6IElTZXJpYWxpemVSYW5nZSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb246IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgU3RyaW5nU2VyaWFsaXplSGFuZGxlcihidWZmZXIsIHRlcm1pbmFsKTtcbiAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgc3RhcnQ6IHsgeDogMCwgICAgICAgICAgICAgeTogdHlwZW9mIHJhbmdlLnN0YXJ0ID09PSAnbnVtYmVyJyA/IHJhbmdlLnN0YXJ0IDogcmFuZ2Uuc3RhcnQubGluZSB9LFxuICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogdHlwZW9mIHJhbmdlLmVuZCAgID09PSAnbnVtYmVyJyA/IHJhbmdlLmVuZCAgIDogcmFuZ2UuZW5kLmxpbmUgICB9XG4gICAgfSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRlcm1pbmFsOiBUZXJtaW5hbCwgb3B0aW9uczogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBjb25zdCBidWZmZXIgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlO1xuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSFRNTFNlcmlhbGl6ZUhhbmRsZXIoYnVmZmVyLCB0ZXJtaW5hbCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgb25seVNlbGVjdGlvbiA9IG9wdGlvbnMub25seVNlbGVjdGlvbiA/PyBmYWxzZTtcbiAgICBpZiAoIW9ubHlTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IG1heFJvd3MgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgY29uc3Qgc2Nyb2xsYmFjayA9IG9wdGlvbnMuc2Nyb2xsYmFjaztcbiAgICAgIGNvbnN0IGNvcnJlY3RSb3dzID0gKHNjcm9sbGJhY2sgPT09IHVuZGVmaW5lZCkgPyBtYXhSb3dzIDogY29uc3RyYWluKHNjcm9sbGJhY2sgKyB0ZXJtaW5hbC5yb3dzLCAwLCBtYXhSb3dzKTtcbiAgICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0OiB7IHg6IDAsICAgICAgICAgICAgIHk6IG1heFJvd3MgLSBjb3JyZWN0Um93cyB9LFxuICAgICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiBtYXhSb3dzIC0gMSAgICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fdGVybWluYWw/LmdldFNlbGVjdGlvblBvc2l0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiBzZWxlY3Rpb24uc3RhcnQueCwgeTogc2VsZWN0aW9uLnN0YXJ0LnkgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogc2VsZWN0aW9uLmVuZC54LCAgIHk6IHNlbGVjdGlvbi5lbmQueSAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZU1vZGVzKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSAnJztcbiAgICBjb25zdCBtb2RlcyA9IHRlcm1pbmFsLm1vZGVzO1xuXG4gICAgLy8gRGVmYXVsdDogZmFsc2VcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzFoJztcbiAgICBpZiAobW9kZXMuYXBwbGljYXRpb25LZXlwYWRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NjZoJztcbiAgICBpZiAobW9kZXMuYnJhY2tldGVkUGFzdGVNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MjAwNGgnO1xuICAgIGlmIChtb2Rlcy5pbnNlcnRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls0aCc7XG4gICAgaWYgKG1vZGVzLm9yaWdpbk1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz82aCc7XG4gICAgaWYgKG1vZGVzLnJldmVyc2VXcmFwYXJvdW5kTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzQ1aCc7XG4gICAgaWYgKG1vZGVzLnNlbmRGb2N1c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xMDA0aCc7XG5cbiAgICAvLyBEZWZhdWx0OiB0cnVlXG4gICAgaWYgKG1vZGVzLndyYXBhcm91bmRNb2RlID09PSBmYWxzZSkgY29udGVudCArPSAnXFx4MWJbPzdsJztcblxuICAgIC8vIERlZmF1bHQ6ICdub25lJ1xuICAgIGlmIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSAhPT0gJ25vbmUnKSB7XG4gICAgICBzd2l0Y2ggKG1vZGVzLm1vdXNlVHJhY2tpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3gxMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz85aCc7IGJyZWFrO1xuICAgICAgICBjYXNlICd2dDIwMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAwaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdkcmFnJzogY29udGVudCArPSAnXFx4MWJbPzEwMDJoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FueSc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAzaCc7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShvcHRpb25zPzogSVNlcmlhbGl6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEFkZCBjb21iaW5lZERhdGEgc3VwcG9ydFxuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgYnVmZmVyXG4gICAgbGV0IGNvbnRlbnQgPSBvcHRpb25zPy5yYW5nZVxuICAgICAgPyB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zLnJhbmdlLCB0cnVlKVxuICAgICAgOiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5ub3JtYWwsIG9wdGlvbnM/LnNjcm9sbGJhY2spO1xuXG4gICAgLy8gQWx0ZXJuYXRlIGJ1ZmZlclxuICAgIGlmICghb3B0aW9ucz8uZXhjbHVkZUFsdEJ1ZmZlcikge1xuICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudHlwZSA9PT0gJ2FsdGVybmF0ZScpIHtcbiAgICAgICAgY29uc3QgYWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50ID0gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWx0ZXJuYXRlLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWz8xMDQ5aFxcdTAwMWJbSCR7YWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50fWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9kZXNcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVNb2Rlcykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9zZXJpYWxpemVNb2Rlcyh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplQXNIVE1MKG9wdGlvbnM/OiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRoaXMuX3Rlcm1pbmFsLCBvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIVE1MU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfaHRtbENvbnRlbnQgPSAnJztcblxuICBwcml2YXRlIF9hbnNpQ29sb3JzOiBSZWFkb25seTxJQ29sb3JbXT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcblxuICAgIC8vIEZvciB4dGVybSBoZWFkbGVzczogZmFsbGJhY2sgdG8gYW5zaSBjb2xvcnNcbiAgICBpZiAoKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX2Fuc2lDb2xvcnMgPSAoX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gREVGQVVMVF9BTlNJX0NPTE9SUztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYWRTdGFydCh0YXJnZXQ6IHN0cmluZywgdGFyZ2V0TGVuZ3RoOiBudW1iZXIsIHBhZFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBwYWRTdHJpbmcgPSBwYWRTdHJpbmcgPz8gJyAnO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHRhcmdldExlbmd0aCAtPSB0YXJnZXQubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRMZW5ndGggPiBwYWRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBwYWRTdHJpbmcgKz0gcGFkU3RyaW5nLnJlcGVhdCh0YXJnZXRMZW5ndGggLyBwYWRTdHJpbmcubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZFN0cmluZy5zbGljZSgwLCB0YXJnZXRMZW5ndGgpICsgdGFyZ2V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8aHRtbD48Ym9keT48IS0tU3RhcnRGcmFnbWVudC0tPjxwcmU+JztcblxuICAgIGxldCBmb3JlZ3JvdW5kID0gJyMwMDAwMDAnO1xuICAgIGxldCBiYWNrZ3JvdW5kID0gJyNmZmZmZmYnO1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmluY2x1ZGVHbG9iYWxCYWNrZ3JvdW5kID8/IGZhbHNlKSB7XG4gICAgICBmb3JlZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uZm9yZWdyb3VuZCA/PyAnI2ZmZmZmZic7XG4gICAgICBiYWNrZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uYmFja2dyb3VuZCA/PyAnIzAwMDAwMCc7XG4gICAgfVxuXG4gICAgY29uc3QgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyA9IFtdO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnY29sb3I6ICcgKyBmb3JlZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiYWNrZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtZmFtaWx5OiAnICsgdGhpcy5fdGVybWluYWwub3B0aW9ucy5mb250RmFtaWx5ICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtc2l6ZTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUgKyAncHg7Jyk7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxkaXYgc3R5bGU9XFwnJyArIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMuam9pbignICcpICsgJ1xcJz4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9kaXY+JztcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9wcmU+PCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2PjxzcGFuPicgKyB0aGlzLl9jdXJyZW50Um93ICsgJzwvc3Bhbj48L2Rpdj4nO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhleENvbG9yKGNlbGw6IElCdWZmZXJDZWxsLCBpc0ZnOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvciA9IGlzRmcgPyBjZWxsLmdldEZnQ29sb3IoKSA6IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUkdCKCkgOiBjZWxsLmlzQmdSR0IoKSkge1xuICAgICAgY29uc3QgcmdiID0gW1xuICAgICAgICAoY29sb3IgPj4gMTYpICYgMjU1LFxuICAgICAgICAoY29sb3IgPj4gIDgpICYgMjU1LFxuICAgICAgICAoY29sb3IgICAgICApICYgMjU1XG4gICAgICBdO1xuICAgICAgcmV0dXJuICcjJyArIHJnYi5tYXAoeCA9PiB0aGlzLl9wYWRTdGFydCh4LnRvU3RyaW5nKDE2KSwgMiwgJzAnKSkuam9pbignJyk7XG4gICAgfVxuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUGFsZXR0ZSgpIDogY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5zaUNvbG9yc1tjb2xvcl0uY3NzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250ZW50OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGNvbnN0IGZnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCB0cnVlKTtcbiAgICAgIGlmIChmZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnY29sb3I6ICcgKyBmZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmdIZXhDb2xvciA9IHRoaXMuX2dldEhleENvbG9yKGNlbGwsIGZhbHNlKTtcbiAgICAgIGlmIChiZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnYmFja2dyb3VuZC1jb2xvcjogJyArIGJnSGV4Q29sb3IgKyAnOycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSkgeyBjb250ZW50LnB1c2goJ2NvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQkZCRkJGOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JvbGQoKSkgeyBjb250ZW50LnB1c2goJ2ZvbnQtd2VpZ2h0OiBib2xkOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICYmIGNlbGwuaXNPdmVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSB1bmRlcmxpbmU7Jyk7IH1cbiAgICAgIGVsc2UgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogYmxpbms7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkpIHsgY29udGVudC5wdXNoKCd2aXNpYmlsaXR5OiBoaWRkZW47Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHsgY29udGVudC5wdXNoKCdmb250LXN0eWxlOiBpdGFsaWM7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzRGltKCkpIHsgY29udGVudC5wdXNoKCdvcGFjaXR5OiAwLjU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Jyk7IH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc3R5bGVEZWZpbml0aW9ucyA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCBvbGRDZWxsKTtcblxuICAgIC8vIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgaWYgKHN0eWxlRGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gc3R5bGVEZWZpbml0aW9ucy5sZW5ndGggPT09IDAgP1xuICAgICAgICAnPC9zcGFuPjxzcGFuPicgOlxuICAgICAgICAnPC9zcGFuPjxzcGFuIHN0eWxlPVxcJycgKyBzdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgICB9XG5cbiAgICAvLyBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9ICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBjZWxsLmdldENoYXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbENvbnRlbnQ7XG4gIH1cbn1cbiJdfQ==