@jsenv/terminal-recorder 1.5.17 → 1.5.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -15
- package/package.json +11 -4
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +11 -11
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize7as_js_module=.mjs +749 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/packages/internal/plugin-supervisor/src/client/supervisor.js +9 -8
- package/src/.jsenv/chrome@134.00/gif_encoder.js +1 -1
- package/src/.jsenv/chrome@134.00/gif_encoder.js.map +1 -1
- package/src/.jsenv/chrome@134.00/terminal_recorder.js +6 -6
- package/src/.jsenv/chrome@134.00/terminal_recorder.js.map +2 -2
- package/src/.jsenv/chrome@134.00/xterm.html +3 -3
- package/src/.jsenv/chrome@134.00/xterm.html@L19C5-L24C14.js +1 -1
- package/src/.jsenv/chrome@134.00/xterm.html@L19C5-L24C14.js.map +1 -1
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize7as_js_module=.mjs +0 -749
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +0 -1134
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js.map +0 -2558
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/addon-fit/lib/addon-fit.js +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/xterm/css/xterm.css +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core → jsenv/core}/node_modules/@xterm/xterm/lib/xterm.js +0 -0
- /package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/{core/packages/independent → jsenv/core/packages}/backend/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js +0 -0
|
@@ -0,0 +1,749 @@
|
|
|
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 += "[1D[1X", this._nullCellCount > 0 && (s += "[A", s += `[${t.length - this._nullCellCount}C`, s += `[${this._nullCellCount}X`, s += `[${t.length - this._nullCellCount}D`, s += "[B"), 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 += "[4h"), 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[H${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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9icm93c2VyL3NlcnZpY2VzL1RoZW1lU2VydmljZS50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0NvbG9yLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vRXZlbnRFbWl0dGVyLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvU2VyaWFsaXplQWRkb24udHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0NvbG9yLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvd2VicGFjazovU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9FdmVudEVtaXR0ZXIudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0xpZmVjeWNsZS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZXMudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS93ZWJwYWNrOi9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL3dlYnBhY2s6L1NlcmlhbGl6ZUFkZG9uL3NyYy9TZXJpYWxpemVBZGRvbi50cyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJ0aGlzIiwiX2NvbG9yIiwiVHdvS2V5TWFwIiwiX2NzcyIsInNldENzcyIsImJnIiwiZmciLCJ2YWx1ZSIsInNldCIsImdldENzcyIsImdldCIsInNldENvbG9yIiwiZ2V0Q29sb3IiLCJjbGVhciIsIkRFRkFVTFRfRk9SRUdST1VORCIsImNzcyIsInRvQ29sb3IiLCJERUZBVUxUX0JBQ0tHUk9VTkQiLCJERUZBVUxUX0NVUlNPUiIsIkRFRkFVTFRfQ1VSU09SX0FDQ0VOVCIsIkRFRkFVTFRfU0VMRUNUSU9OIiwicmdiYSIsIkRFRkFVTFRfQU5TSV9DT0xPUlMiLCJPYmplY3QiLCJmcmVlemUiLCJjb2xvcnMiLCJ2IiwiaSIsInIiLCJnIiwiYiIsInB1c2giLCJjaGFubmVscyIsInRvQ3NzIiwidG9SZ2JhIiwiYyIsIlRoZW1lU2VydmljZSIsIkRpc3Bvc2FibGUiLCJfY29sb3JzIiwiY29uc3RydWN0b3IiLCJzdXBlciIsIl9vcHRpb25zU2VydmljZSIsIl9jb250cmFzdENhY2hlIiwiQ29sb3JDb250cmFzdENhY2hlIiwiX2hhbGZDb250cmFzdENhY2hlIiwiX29uQ2hhbmdlQ29sb3JzIiwicmVnaXN0ZXIiLCJFdmVudEVtaXR0ZXIiLCJvbkNoYW5nZUNvbG9ycyIsImV2ZW50IiwiZm9yZWdyb3VuZCIsImJhY2tncm91bmQiLCJjdXJzb3IiLCJjdXJzb3JBY2NlbnQiLCJzZWxlY3Rpb25Gb3JlZ3JvdW5kIiwidW5kZWZpbmVkIiwic2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50Iiwic2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSIsImNvbG9yIiwiYmxlbmQiLCJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSIsImFuc2kiLCJzbGljZSIsImNvbnRyYXN0Q2FjaGUiLCJoYWxmQ29udHJhc3RDYWNoZSIsIl91cGRhdGVSZXN0b3JlQ29sb3JzIiwiX3NldFRoZW1lIiwicmF3T3B0aW9ucyIsInRoZW1lIiwib25TcGVjaWZpY09wdGlvbkNoYW5nZSIsInBhcnNlQ29sb3IiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kIiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kIiwiTlVMTF9DT0xPUiIsImlzT3BhcXVlIiwib3BhY2l0eSIsImJsYWNrIiwicmVkIiwiZ3JlZW4iLCJ5ZWxsb3ciLCJibHVlIiwibWFnZW50YSIsImN5YW4iLCJ3aGl0ZSIsImJyaWdodEJsYWNrIiwiYnJpZ2h0UmVkIiwiYnJpZ2h0R3JlZW4iLCJicmlnaHRZZWxsb3ciLCJicmlnaHRCbHVlIiwiYnJpZ2h0TWFnZW50YSIsImJyaWdodEN5YW4iLCJicmlnaHRXaGl0ZSIsImV4dGVuZGVkQW5zaSIsImNvbG9yQ291bnQiLCJNYXRoIiwibWluIiwibGVuZ3RoIiwiZmlyZSIsInJlc3RvcmVDb2xvciIsInNsb3QiLCJfcmVzdG9yZUNvbG9yIiwiX3Jlc3RvcmVDb2xvcnMiLCJtb2RpZnlDb2xvcnMiLCJjYWxsYmFjayIsImNzc1N0cmluZyIsImZhbGxiYWNrIiwiSU9wdGlvbnNTZXJ2aWNlIiwiJHIiLCIkZyIsIiRiIiwiJGEiLCJyZ2IiLCJ0b1BhZGRlZEhleCIsInMiLCJ0b1N0cmluZyIsImNvbnRyYXN0UmF0aW8iLCJsMSIsImwyIiwiYSIsInJvdW5kIiwidG9DaGFubmVscyIsImZnUiIsImZnRyIsImZnQiIsImJnUiIsImJnRyIsImJnQiIsImVuc3VyZUNvbnRyYXN0UmF0aW8iLCJyYXRpbyIsInJlc3VsdCIsIm9wYXF1ZSIsInJnYmFDb2xvciIsIm11bHRpcGx5T3BhY2l0eSIsImZhY3RvciIsInRvQ29sb3JSR0IiLCIkY3R4IiwiJGxpdG11c0NvbG9yIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwid2lkdGgiLCJoZWlnaHQiLCJjdHgiLCJnZXRDb250ZXh0Iiwid2lsbFJlYWRGcmVxdWVudGx5IiwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwiY3JlYXRlTGluZWFyR3JhZGllbnQiLCJtYXRjaCIsInBhcnNlSW50IiwicmVwZWF0IiwicmdiYU1hdGNoIiwicGFyc2VGbG9hdCIsIkVycm9yIiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJnZXRJbWFnZURhdGEiLCJkYXRhIiwicmVsYXRpdmVMdW1pbmFuY2UyIiwicnMiLCJncyIsImJzIiwicG93IiwicmVsYXRpdmVMdW1pbmFuY2UiLCJyZWR1Y2VMdW1pbmFuY2UiLCJiZ1JnYmEiLCJmZ1JnYmEiLCJjciIsIm1heCIsImNlaWwiLCJpbmNyZWFzZUx1bWluYW5jZSIsImJnTCIsImZnTCIsInJlc3VsdEEiLCJyZXN1bHRBUmF0aW8iLCJyZXN1bHRCIiwiX2xpc3RlbmVycyIsIl9kaXNwb3NlZCIsIl9ldmVudCIsImxpc3RlbmVyIiwiZGlzcG9zZSIsInNwbGljZSIsImFyZzEiLCJhcmcyIiwicXVldWUiLCJjYWxsIiwiY2xlYXJMaXN0ZW5lcnMiLCJmcm9tIiwidG8iLCJlIiwiaGFuZGxlciIsImRpc3Bvc2VBcnJheSIsImRpc3Bvc2FibGVzIiwiZCIsIl9kaXNwb3NhYmxlcyIsIl9pc0Rpc3Bvc2VkIiwidW5yZWdpc3RlciIsImluZGV4IiwiaW5kZXhPZiIsIl92YWx1ZSIsImYiLCJhcnJheSIsIl9kYXRhIiwiZmlyc3QiLCJzZWNvbmQiLCJ0aGlyZCIsImZvdXJ0aCIsIkRJX1RBUkdFVCIsIkRJX0RFUEVOREVOQ0lFUyIsInNlcnZpY2VSZWdpc3RyeSIsIk1hcCIsImN0b3IiLCJpZCIsImhhcyIsImRlY29yYXRvciIsInRhcmdldCIsImtleSIsImFyZ3VtZW50cyIsInN0b3JlU2VydmljZURlcGVuZGVuY3kiLCJMb2dMZXZlbEVudW0iLCJJQnVmZmVyU2VydmljZSIsImNyZWF0ZURlY29yYXRvciIsIklDb3JlTW91c2VTZXJ2aWNlIiwiSUNvcmVTZXJ2aWNlIiwiSUNoYXJzZXRTZXJ2aWNlIiwiSUluc3RhbnRpYXRpb25TZXJ2aWNlIiwiSUxvZ1NlcnZpY2UiLCJJT3NjTGlua1NlcnZpY2UiLCJJVW5pY29kZVNlcnZpY2UiLCJJRGVjb3JhdGlvblNlcnZpY2UiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiY29uc3RyYWluIiwibG93IiwiaGlnaCIsIkJhc2VTZXJpYWxpemVIYW5kbGVyIiwiX2J1ZmZlciIsInNlcmlhbGl6ZSIsInJhbmdlIiwiZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24iLCJjZWxsMSIsImdldE51bGxDZWxsIiwiY2VsbDIiLCJvbGRDZWxsIiwic3RhcnRSb3ciLCJzdGFydCIsInkiLCJlbmRSb3ciLCJlbmQiLCJzdGFydENvbHVtbiIsIngiLCJlbmRDb2x1bW4iLCJfYmVmb3JlU2VyaWFsaXplIiwicm93IiwibGluZSIsImdldExpbmUiLCJzdGFydExpbmVDb2x1bW4iLCJlbmRMaW5lQ29sdW1uIiwiY29sIiwiZ2V0Q2VsbCIsIl9uZXh0Q2VsbCIsImNvbnNvbGUiLCJ3YXJuIiwiX3Jvd0VuZCIsIl9hZnRlclNlcmlhbGl6ZSIsIl9zZXJpYWxpemVTdHJpbmciLCJjZWxsIiwiaXNMYXN0Um93Iiwicm93cyIsImVxdWFsRmciLCJnZXRGZ0NvbG9yTW9kZSIsImdldEZnQ29sb3IiLCJlcXVhbEJnIiwiZ2V0QmdDb2xvck1vZGUiLCJnZXRCZ0NvbG9yIiwiZXF1YWxGbGFncyIsImlzSW52ZXJzZSIsImlzQm9sZCIsImlzVW5kZXJsaW5lIiwiaXNPdmVybGluZSIsImlzQmxpbmsiLCJpc0ludmlzaWJsZSIsImlzSXRhbGljIiwiaXNEaW0iLCJpc1N0cmlrZXRocm91Z2giLCJTdHJpbmdTZXJpYWxpemVIYW5kbGVyIiwiYnVmZmVyIiwiX3Rlcm1pbmFsIiwiX3Jvd0luZGV4IiwiX2FsbFJvd3MiLCJBcnJheSIsIl9hbGxSb3dTZXBhcmF0b3JzIiwiX2N1cnJlbnRSb3ciLCJfbnVsbENlbGxDb3VudCIsIl9jdXJzb3JTdHlsZSIsIl9jdXJzb3JTdHlsZVJvdyIsIl9jdXJzb3JTdHlsZUNvbCIsIl9iYWNrZ3JvdW5kQ2VsbCIsIl9maXJzdFJvdyIsIl9sYXN0Q3Vyc29yUm93IiwiX2xhc3RDdXJzb3JDb2wiLCJfbGFzdENvbnRlbnRDdXJzb3JSb3ciLCJfbGFzdENvbnRlbnRDdXJzb3JDb2wiLCJfdGhpc1Jvd0xhc3RDaGFyIiwiX3RoaXNSb3dMYXN0U2Vjb25kQ2hhciIsIl9uZXh0Um93Rmlyc3RDaGFyIiwicm93U2VwYXJhdG9yIiwiY3VycmVudExpbmUiLCJuZXh0TGluZSIsImlzV3JhcHBlZCIsInRoaXNSb3dMYXN0Q2hhciIsInRoaXNSb3dMYXN0U2Vjb25kQ2hhciIsIm5leHRSb3dGaXJzdENoYXIiLCJpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCIsImdldFdpZHRoIiwiaXNWYWxpZCIsImdldENoYXJzIiwiX2RpZmZTdHlsZSIsInNnclNlcSIsImZnQ2hhbmdlZCIsImJnQ2hhbmdlZCIsImZsYWdzQ2hhbmdlZCIsImlzQXR0cmlidXRlRGVmYXVsdCIsImlzRmdSR0IiLCJpc0ZnUGFsZXR0ZSIsImlzQmdSR0IiLCJpc0JnUGFsZXR0ZSIsImlzRW1wdHlDZWxsIiwiam9pbiIsInJvd0VuZCIsImNvbnRlbnQiLCJyZWFsQ3Vyc29yUm93IiwiYmFzZVkiLCJjdXJzb3JZIiwicmVhbEN1cnNvckNvbCIsImN1cnNvclgiLCJtb3ZlUmlnaHQiLCJvZmZzZXQiLCJjdXJBdHRyRGF0YSIsIl9jb3JlIiwiX2lucHV0SGFuZGxlciIsIl9jdXJBdHRyRGF0YSIsImFjdGl2YXRlIiwidGVybWluYWwiLCJfc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrIiwic2Nyb2xsYmFjayIsIm1heFJvd3MiLCJjb3JyZWN0Um93cyIsIl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlIiwiY29scyIsIl9zZXJpYWxpemVCdWZmZXJBc0hUTUwiLCJvcHRpb25zIiwiYWN0aXZlIiwiSFRNTFNlcmlhbGl6ZUhhbmRsZXIiLCJvbmx5U2VsZWN0aW9uIiwic2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uUG9zaXRpb24iLCJfc2VyaWFsaXplTW9kZXMiLCJtb2RlcyIsImFwcGxpY2F0aW9uQ3Vyc29yS2V5c01vZGUiLCJhcHBsaWNhdGlvbktleXBhZE1vZGUiLCJicmFja2V0ZWRQYXN0ZU1vZGUiLCJpbnNlcnRNb2RlIiwib3JpZ2luTW9kZSIsInJldmVyc2VXcmFwYXJvdW5kTW9kZSIsInNlbmRGb2N1c01vZGUiLCJ3cmFwYXJvdW5kTW9kZSIsIm1vdXNlVHJhY2tpbmdNb2RlIiwibm9ybWFsIiwiZXhjbHVkZUFsdEJ1ZmZlciIsInR5cGUiLCJhbHRlcm5hdGUiLCJleGNsdWRlTW9kZXMiLCJzZXJpYWxpemVBc0hUTUwiLCJfb3B0aW9ucyIsIl9odG1sQ29udGVudCIsIl90aGVtZVNlcnZpY2UiLCJfYW5zaUNvbG9ycyIsIl9wYWRTdGFydCIsInRhcmdldExlbmd0aCIsInBhZFN0cmluZyIsImluY2x1ZGVHbG9iYWxCYWNrZ3JvdW5kIiwiZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyIsImZvbnRGYW1pbHkiLCJmb250U2l6ZSIsIl9nZXRIZXhDb2xvciIsImlzRmciLCJtYXAiLCJmZ0hleENvbG9yIiwiYmdIZXhDb2xvciIsInN0eWxlRGVmaW5pdGlvbnMiLCJ0IiwiU2VyaWFsaXplQWRkb24iLCJ3aW5kb3ciLCJuIiwibCIsImgiLCJ1IiwiXyIsIkMiLCJvIiwiZm9yd2FyZEV2ZW50IiwicnVuQW5kU3Vic2NyaWJlIiwiTXV0YWJsZURpc3Bvc2FibGUiLCJ0b0Rpc3Bvc2FibGUiLCJnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlIiwiRm91cktleU1hcCIsImdldFNlcnZpY2VEZXBlbmRlbmNpZXMiLCJUUkFDRSIsIkRFQlVHIiwiSU5GTyIsIldBUk4iLCJFUlJPUiIsIk9GRiJdLCJtYXBwaW5ncyI6IkNXQUEsQVhBQSxTQUEyQ0EsQ1dBQW1NLENBQUEsQVhBTWxNLEVXQUErWSxDQUFBLEFYQzFCLGlCQUFaOVksU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEs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QUE1QjVRLENBQUEsQ0FBaUJzRSxNQUFBLEdBQ25DLGtCQUNBLHlCQUEwQnRFLENBQUEsQ0FBaUJnVCxJQUFBLENBQUssT0FBTyxPQUt6RCxLQUFLcEMsV0FBQSxJQURINEcsQ0FBQSxHQUNrQixNQUVBdE4sQ0FBQSxDQUFLa0ksUUFBQSxFQUU3QjtNQUFBO01BRVVuRCxpQkFBQTtRQUNSLE9BQU8sS0FBSzhHLFlBQ2Q7TUFBQTtJQUFBO0lBakpGN0wsQ0FBQSxDQUFBdUssb0JBQUEsR0FBQTJDLEMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTZXJpYWxpemVBZGRvblwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTZXJpYWxpemVBZGRvblwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsICgpID0+IHtcbnJldHVybiAiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUd29LZXlNYXAgfSBmcm9tICdjb21tb24vTXVsdGlLZXlNYXAnO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JDb250cmFzdENhY2hlIGltcGxlbWVudHMgSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gIHByaXZhdGUgX2NvbG9yOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBJQ29sb3IgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcbiAgcHJpdmF0ZSBfY3NzOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBzdHJpbmcgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0Q3NzKGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY3NzLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jc3MuZ2V0KGJnLCBmZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IElDb2xvciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5zZXQoYmcsIGZnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IElDb2xvciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb2xvci5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5jbGVhcigpO1xuICAgIHRoaXMuX2Nzcy5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlJztcbmltcG9ydCB7IElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUsIElDb2xvclNldCwgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yLCBjc3MsIE5VTExfQ09MT1IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJT3B0aW9uc1NlcnZpY2UsIElUaGVtZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBBbGxDb2xvckluZGV4LCBJQ29sb3IsIFNwZWNpYWxDb2xvckluZGV4IH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElSZXN0b3JlQ29sb3JTZXQge1xuICBmb3JlZ3JvdW5kOiBJQ29sb3I7XG4gIGJhY2tncm91bmQ6IElDb2xvcjtcbiAgY3Vyc29yOiBJQ29sb3I7XG4gIGFuc2k6IElDb2xvcltdO1xufVxuXG5cbmNvbnN0IERFRkFVTFRfRk9SRUdST1VORCA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0JBQ0tHUk9VTkQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9DVVJTT1IgPSBjc3MudG9Db2xvcignI2ZmZmZmZicpO1xuY29uc3QgREVGQVVMVF9DVVJTT1JfQUNDRU5UID0gY3NzLnRvQ29sb3IoJyMwMDAwMDAnKTtcbmNvbnN0IERFRkFVTFRfU0VMRUNUSU9OID0ge1xuICBjc3M6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyknLFxuICByZ2JhOiAweEZGRkZGRjREXG59O1xuXG4vLyBBbiBJSUZFIHRvIGdlbmVyYXRlIERFRkFVTFRfQU5TSV9DT0xPUlMuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTlNJX0NPTE9SUyA9IE9iamVjdC5mcmVlemUoKCgpID0+IHtcbiAgY29uc3QgY29sb3JzID0gW1xuICAgIC8vIGRhcms6XG4gICAgY3NzLnRvQ29sb3IoJyMyZTM0MzYnKSxcbiAgICBjc3MudG9Db2xvcignI2NjMDAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNGU5YTA2JyksXG4gICAgY3NzLnRvQ29sb3IoJyNjNGEwMDAnKSxcbiAgICBjc3MudG9Db2xvcignIzM0NjVhNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNzU1MDdiJyksXG4gICAgY3NzLnRvQ29sb3IoJyMwNjk4OWEnKSxcbiAgICBjc3MudG9Db2xvcignI2QzZDdjZicpLFxuICAgIC8vIGJyaWdodDpcbiAgICBjc3MudG9Db2xvcignIzU1NTc1MycpLFxuICAgIGNzcy50b0NvbG9yKCcjZWYyOTI5JyksXG4gICAgY3NzLnRvQ29sb3IoJyM4YWUyMzQnKSxcbiAgICBjc3MudG9Db2xvcignI2ZjZTk0ZicpLFxuICAgIGNzcy50b0NvbG9yKCcjNzI5ZmNmJyksXG4gICAgY3NzLnRvQ29sb3IoJyNhZDdmYTgnKSxcbiAgICBjc3MudG9Db2xvcignIzM0ZTJlMicpLFxuICAgIGNzcy50b0NvbG9yKCcjZWVlZWVjJylcbiAgXTtcblxuICAvLyBGaWxsIGluIHRoZSByZW1haW5pbmcgMjQwIEFOU0kgY29sb3JzLlxuICAvLyBHZW5lcmF0ZSBjb2xvcnMgKDE2LTIzMSlcbiAgY29uc3QgdiA9IFsweDAwLCAweDVmLCAweDg3LCAweGFmLCAweGQ3LCAweGZmXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMTY7IGkrKykge1xuICAgIGNvbnN0IHIgPSB2WyhpIC8gMzYpICUgNiB8IDBdO1xuICAgIGNvbnN0IGcgPSB2WyhpIC8gNikgJSA2IHwgMF07XG4gICAgY29uc3QgYiA9IHZbaSAlIDZdO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYilcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGdyZXlzICgyMzItMjU1KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICBjb25zdCBjID0gOCArIGkgKiAxMDtcbiAgICBjb2xvcnMucHVzaCh7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKGMsIGMsIGMpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKGMsIGMsIGMpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufSkoKSk7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVRoZW1lU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9jb2xvcnM6IElDb2xvclNldDtcbiAgcHJpdmF0ZSBfY29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfaGFsZkNvbnRyYXN0Q2FjaGU6IElDb2xvckNvbnRyYXN0Q2FjaGUgPSBuZXcgQ29sb3JDb250cmFzdENhY2hlKCk7XG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcnMhOiBJUmVzdG9yZUNvbG9yU2V0O1xuXG4gIHB1YmxpYyBnZXQgY29sb3JzKCk6IFJlYWRvbmx5Q29sb3JTZXQgeyByZXR1cm4gdGhpcy5fY29sb3JzOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2VDb2xvcnMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8UmVhZG9ubHlDb2xvclNldD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZUNvbG9ycyA9IHRoaXMuX29uQ2hhbmdlQ29sb3JzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29sb3JzID0ge1xuICAgICAgZm9yZWdyb3VuZDogREVGQVVMVF9GT1JFR1JPVU5ELFxuICAgICAgYmFja2dyb3VuZDogREVGQVVMVF9CQUNLR1JPVU5ELFxuICAgICAgY3Vyc29yOiBERUZBVUxUX0NVUlNPUixcbiAgICAgIGN1cnNvckFjY2VudDogREVGQVVMVF9DVVJTT1JfQUNDRU5ULFxuICAgICAgc2VsZWN0aW9uRm9yZWdyb3VuZDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50OiBERUZBVUxUX1NFTEVDVElPTixcbiAgICAgIHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOiBjb2xvci5ibGVuZChERUZBVUxUX0JBQ0tHUk9VTkQsIERFRkFVTFRfU0VMRUNUSU9OKSxcbiAgICAgIGFuc2k6IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKSxcbiAgICAgIGNvbnRyYXN0Q2FjaGU6IHRoaXMuX2NvbnRyYXN0Q2FjaGUsXG4gICAgICBoYWxmQ29udHJhc3RDYWNoZTogdGhpcy5faGFsZkNvbnRyYXN0Q2FjaGVcbiAgICB9O1xuICAgIHRoaXMuX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTtcbiAgICB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnbWluaW11bUNvbnRyYXN0UmF0aW8nLCAoKSA9PiB0aGlzLl9jb250cmFzdENhY2hlLmNsZWFyKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ3RoZW1lJywgKCkgPT4gdGhpcy5fc2V0VGhlbWUodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy50aGVtZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXJtaW5hbCdzIHRoZW1lLlxuICAgKiBAcGFyYW0gdGhlbWUgVGhlICB0aGVtZSB0byB1c2UuIElmIGEgcGFydGlhbCB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGRlZmF1bHRcbiAgICogY29sb3JzIHdpbGwgYmUgdXNlZCB3aGVyZSBjb2xvcnMgYXJlIG5vdCBkZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0VGhlbWUodGhlbWU6IElUaGVtZSA9IHt9KTogdm9pZCB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5fY29sb3JzO1xuICAgIGNvbG9ycy5mb3JlZ3JvdW5kID0gcGFyc2VDb2xvcih0aGVtZS5mb3JlZ3JvdW5kLCBERUZBVUxUX0ZPUkVHUk9VTkQpO1xuICAgIGNvbG9ycy5iYWNrZ3JvdW5kID0gcGFyc2VDb2xvcih0aGVtZS5iYWNrZ3JvdW5kLCBERUZBVUxUX0JBQ0tHUk9VTkQpO1xuICAgIGNvbG9ycy5jdXJzb3IgPSBwYXJzZUNvbG9yKHRoZW1lLmN1cnNvciwgREVGQVVMVF9DVVJTT1IpO1xuICAgIGNvbG9ycy5jdXJzb3JBY2NlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLmN1cnNvckFjY2VudCwgREVGQVVMVF9DVVJTT1JfQUNDRU5UKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25CYWNrZ3JvdW5kLCBERUZBVUxUX1NFTEVDVElPTik7XG4gICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgPSBjb2xvci5ibGVuZChjb2xvcnMuYmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQsIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUgPSBjb2xvci5ibGVuZChjb2xvcnMuYmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHRoZW1lLnNlbGVjdGlvbkZvcmVncm91bmQgPyBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkZvcmVncm91bmQsIE5VTExfQ09MT1IpIDogdW5kZWZpbmVkO1xuICAgIGlmIChjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9PT0gTlVMTF9DT0xPUikge1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgc2VsZWN0aW9uIGNvbG9yIGlzIG9wYXF1ZSwgYmxlbmQgaXQgd2l0aCBiYWNrZ3JvdW5kIHdpdGggMC4zIG9wYWNpdHlcbiAgICAgKiBJc3N1ZSAjMjczN1xuICAgICAqL1xuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KSkge1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IDAuMztcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBjb2xvci5vcGFjaXR5KGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBpZiAoY29sb3IuaXNPcGFxdWUoY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KSkge1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IDAuMztcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50LCBvcGFjaXR5KTtcbiAgICB9XG4gICAgY29sb3JzLmFuc2kgPSBERUZBVUxUX0FOU0lfQ09MT1JTLnNsaWNlKCk7XG4gICAgY29sb3JzLmFuc2lbMF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsYWNrLCBERUZBVUxUX0FOU0lfQ09MT1JTWzBdKTtcbiAgICBjb2xvcnMuYW5zaVsxXSA9IHBhcnNlQ29sb3IodGhlbWUucmVkLCBERUZBVUxUX0FOU0lfQ09MT1JTWzFdKTtcbiAgICBjb2xvcnMuYW5zaVsyXSA9IHBhcnNlQ29sb3IodGhlbWUuZ3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMl0pO1xuICAgIGNvbG9ycy5hbnNpWzNdID0gcGFyc2VDb2xvcih0aGVtZS55ZWxsb3csIERFRkFVTFRfQU5TSV9DT0xPUlNbM10pO1xuICAgIGNvbG9ycy5hbnNpWzRdID0gcGFyc2VDb2xvcih0aGVtZS5ibHVlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzRdKTtcbiAgICBjb2xvcnMuYW5zaVs1XSA9IHBhcnNlQ29sb3IodGhlbWUubWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1s1XSk7XG4gICAgY29sb3JzLmFuc2lbNl0gPSBwYXJzZUNvbG9yKHRoZW1lLmN5YW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbNl0pO1xuICAgIGNvbG9ycy5hbnNpWzddID0gcGFyc2VDb2xvcih0aGVtZS53aGl0ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1s3XSk7XG4gICAgY29sb3JzLmFuc2lbOF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEJsYWNrLCBERUZBVUxUX0FOU0lfQ09MT1JTWzhdKTtcbiAgICBjb2xvcnMuYW5zaVs5XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0UmVkLCBERUZBVUxUX0FOU0lfQ09MT1JTWzldKTtcbiAgICBjb2xvcnMuYW5zaVsxMF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEdyZWVuLCBERUZBVUxUX0FOU0lfQ09MT1JTWzEwXSk7XG4gICAgY29sb3JzLmFuc2lbMTFdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRZZWxsb3csIERFRkFVTFRfQU5TSV9DT0xPUlNbMTFdKTtcbiAgICBjb2xvcnMuYW5zaVsxMl0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTJdKTtcbiAgICBjb2xvcnMuYW5zaVsxM10gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodE1hZ2VudGEsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTNdKTtcbiAgICBjb2xvcnMuYW5zaVsxNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEN5YW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTRdKTtcbiAgICBjb2xvcnMuYW5zaVsxNV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFdoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzE1XSk7XG4gICAgaWYgKHRoZW1lLmV4dGVuZGVkQW5zaSkge1xuICAgICAgY29uc3QgY29sb3JDb3VudCA9IE1hdGgubWluKGNvbG9ycy5hbnNpLmxlbmd0aCAtIDE2LCB0aGVtZS5leHRlbmRlZEFuc2kubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbG9ycy5hbnNpW2kgKyAxNl0gPSBwYXJzZUNvbG9yKHRoZW1lLmV4dGVuZGVkQW5zaVtpXSwgREVGQVVMVF9BTlNJX0NPTE9SU1tpICsgMTZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYXIgb3VyIHRoZSBjYWNoZVxuICAgIHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlQ29sb3Ioc2xvdD86IEFsbENvbG9ySW5kZXgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlQ29sb3Ioc2xvdCk7XG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF9yZXN0b3JlQ29sb3Ioc2xvdDogQWxsQ29sb3JJbmRleCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIHVuc2V0IHNsb3QgcmVzdG9yZXMgYWxsIGFuc2kgY29sb3JzXG4gICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2kubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5fY29sb3JzLmFuc2lbaV0gPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbaV07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoc2xvdCkge1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EOlxuICAgICAgICB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuZm9yZWdyb3VuZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkJBQ0tHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SOlxuICAgICAgICB0aGlzLl9jb2xvcnMuY3Vyc29yID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5jdXJzb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmFuc2lbc2xvdF0gPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbc2xvdF07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vZGlmeUNvbG9ycyhjYWxsYmFjazogKGNvbG9yczogSUNvbG9yU2V0KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY2FsbGJhY2sodGhpcy5fY29sb3JzKTtcbiAgICAvLyBBc3N1bWUgdGhlIGNoYW5nZSBoYXBwZW5lZFxuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmVzdG9yZUNvbG9ycygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlQ29sb3JzID0ge1xuICAgICAgZm9yZWdyb3VuZDogdGhpcy5fY29sb3JzLmZvcmVncm91bmQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLl9jb2xvcnMuYmFja2dyb3VuZCxcbiAgICAgIGN1cnNvcjogdGhpcy5fY29sb3JzLmN1cnNvcixcbiAgICAgIGFuc2k6IHRoaXMuX2NvbG9ycy5hbnNpLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29sb3IoXG4gIGNzc1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFjazogSUNvbG9yXG4pOiBJQ29sb3Ige1xuICBpZiAoY3NzU3RyaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNzcy50b0NvbG9yKGNzc1N0cmluZyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBuby1vcFxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvciwgSUNvbG9yUkdCIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxubGV0ICRyID0gMDtcbmxldCAkZyA9IDA7XG5sZXQgJGIgPSAwO1xubGV0ICRhID0gMDtcblxuZXhwb3J0IGNvbnN0IE5VTExfQ09MT1I6IElDb2xvciA9IHtcbiAgY3NzOiAnIzAwMDAwMDAwJyxcbiAgcmdiYTogMFxufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNoYW5uZWxzXCIgKGluZGl2aWR1YWwgY29sb3IgY2hhbm5lbHMgYXMgbnVtYmVycykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY2hhbm5lbHMge1xuICBleHBvcnQgZnVuY3Rpb24gdG9Dc3MocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9JHt0b1BhZGRlZEhleChhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvUmdiYShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAweEZGKTogbnVtYmVyIHtcbiAgICAvLyBOb3RlOiBUaGUgYWdncmVnYXRlZCBudW1iZXIgaXMgUkdCQTMyIChCRSksIHRodXMgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIEFCR1IzMlxuICAgIC8vIG9uIExFIHN5c3RlbXMsIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0IDMyLWJpdCBidWZmZXIgd3JpdGVzLlxuICAgIC8vID4+PiAwIGZvcmNlcyBhbiB1bnNpZ25lZCBpbnRcbiAgICByZXR1cm4gKHIgPDwgMjQgfCBnIDw8IDE2IHwgYiA8PCA4IHwgYSkgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogSUNvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiLCBhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiLCBhKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBgSUNvbG9yYC5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjb2xvciB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogSUNvbG9yLCBmZzogSUNvbG9yKTogSUNvbG9yIHtcbiAgICAkYSA9IChmZy5yZ2JhICYgMHhGRikgLyAyNTU7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjc3M6IGZnLmNzcyxcbiAgICAgICAgcmdiYTogZmcucmdiYVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIGNvbnN0IGNzcyA9IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpO1xuICAgIGNvbnN0IHJnYmEgPSBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gICAgcmV0dXJuIHsgY3NzLCByZ2JhIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNPcGFxdWUoY29sb3I6IElDb2xvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY29sb3IucmdiYSAmIDB4RkYpID09PSAweEZGO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmc6IElDb2xvciwgZmc6IElDb2xvciwgcmF0aW86IG51bWJlcik6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYS5lbnN1cmVDb250cmFzdFJhdGlvKGJnLnJnYmEsIGZnLnJnYmEsIHJhdGlvKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAocmVzdWx0ID4+IDI0ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDE2ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDggICYgMHhGRilcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZShjb2xvcjogSUNvbG9yKTogSUNvbG9yIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSAoY29sb3IucmdiYSB8IDB4RkYpID4+PiAwO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhyZ2JhQ29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpLFxuICAgICAgcmdiYTogcmdiYUNvbG9yXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFjaXR5KGNvbG9yOiBJQ29sb3IsIG9wYWNpdHk6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAweEZGKTtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMoY29sb3IucmdiYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKVxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlPcGFjaXR5KGNvbG9yOiBJQ29sb3IsIGZhY3RvcjogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IGNvbG9yLnJnYmEgJiAweEZGO1xuICAgIHJldHVybiBvcGFjaXR5KGNvbG9yLCAoJGEgKiBmYWN0b3IpIC8gMHhGRik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvclJHQihjb2xvcjogSUNvbG9yKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gWyhjb2xvci5yZ2JhID4+IDI0KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDE2KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDgpICYgMHhGRl07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNzc1wiIChzdHJpbmc6ICcjcmdiJywgJyNyZ2JhJywgJyNycmdnYmInLFxuICogJyNycmdnYmJhYScpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNzcyB7XG4gIC8vIEF0dGVtcHQgdG8gc2V0IGdldCB0aGUgc2hhcmVkIGNhbnZhcyBjb250ZXh0XG4gIGxldCAkY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCB1bmRlZmluZWQ7XG4gIGxldCAkbGl0bXVzQ29sb3I6IENhbnZhc0dyYWRpZW50IHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gdGhlIGZpcnN0IHdpbmRvdywgc28gZG9jdW1lbnQgc2hvdWxkIGJlIGNvcnJlY3RcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjdHgpIHtcbiAgICAgICRjdHggPSBjdHg7XG4gICAgICAkY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICAgICRsaXRtdXNDb2xvciA9ICRjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMSwgMSk7XG4gICAgfVxuICB9XG4gIGNhdGNoIHtcbiAgICAvLyBub29wXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjc3Mgc3RyaW5nIHRvIGFuIElDb2xvciwgdGhpcyBzaG91bGQgaGFuZGxlIGFsbCB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgd2lsbFxuICAgKiB0aHJvdyBpZiBpdCdzIGludmFsaWQuIFRoZSBpZGVhbCBmb3JtYXQgdG8gdXNlIGlzIGAjcnJnZ2JiW2FhXWAgYXMgaXQncyB0aGUgZmFzdGVzdCB0byBwYXJzZS5cbiAgICpcbiAgICogT25seSBgI3JnYlthXWAsIGAjcnJnZ2JiW2FhXWAsIGByZ2IoKWAgYW5kIGByZ2JhKClgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCB3aGVuIHJ1biBpbiBhIE5vZGVcbiAgICogZW52aXJvbm1lbnQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihjc3M6IHN0cmluZyk6IElDb2xvciB7XG4gICAgLy8gRm9ybWF0czogI3JnYlthXSBhbmQgI3JyZ2diYlthYV1cbiAgICBpZiAoY3NzLm1hdGNoKC8jW1xcZGEtZl17Myw4fS9pKSkge1xuICAgICAgc3dpdGNoIChjc3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgNDogeyAvLyAjcmdiXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7IC8vICNyZ2JhXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGEgPSBwYXJzZUludChjc3Muc2xpY2UoNCwgNSkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzogLy8gI3JyZ2diYlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiAocGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPDwgOCB8IDB4RkYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSA5OiAvLyAjcnJnZ2JiYWFcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogcGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdHM6IHJnYigpIG9yIHJnYmEoKVxuICAgIGNvbnN0IHJnYmFNYXRjaCA9IGNzcy5tYXRjaCgvcmdiYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKigsXFxzKigwfDF8XFxkP1xcLihcXGQrKSlcXHMqKT9cXCkvKTtcbiAgICBpZiAocmdiYU1hdGNoKSB7XG4gICAgICAkciA9IHBhcnNlSW50KHJnYmFNYXRjaFsxXSk7XG4gICAgICAkZyA9IHBhcnNlSW50KHJnYmFNYXRjaFsyXSk7XG4gICAgICAkYiA9IHBhcnNlSW50KHJnYmFNYXRjaFszXSk7XG4gICAgICAkYSA9IE1hdGgucm91bmQoKHJnYmFNYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzVdKSkgKiAweEZGKTtcbiAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGV4dCBpcyBhdmFpbGFibGUgZm9yIGNhbnZhcy1iYXNlZCBjb2xvciBwYXJzaW5nXG4gICAgaWYgKCEkY3R4IHx8ICEkbGl0bXVzQ29sb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgdXNpbmcgY2FudmFzIGZpbGxTdHlsZVxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNmaWxsLWFuZC1zdHJva2Utc3R5bGVzXG4gICAgJGN0eC5maWxsU3R5bGUgPSAkbGl0bXVzQ29sb3I7XG4gICAgJGN0eC5maWxsU3R5bGUgPSBjc3M7XG4gICAgaWYgKHR5cGVvZiAkY3R4LmZpbGxTdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAkY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIFskciwgJGcsICRiLCAkYV0gPSAkY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIGlzIG5vbi10cmFuc3BhcmVudCBhcyBjb2xvciBodWUgZ2V0cyBsb3N0IHdoZW4gZHJhd24gdG8gdGhlIGNhbnZhc1xuICAgIGlmICgkYSAhPT0gMHhGRikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhlIGNvbG9yIGZyb20gdGhlIGNhbnZhcycgZmlsbFN0eWxlIHByb3BlcnR5IHdoaWNoIGV4cG9zZXMgdGhlIGNvbG9yIHZhbHVlIGluIHJnYmEoKVxuICAgIC8vIGZvcm1hdFxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNzZXJpYWxpc2F0aW9uLW9mLWEtY29sb3JcbiAgICByZXR1cm4ge1xuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIGNzc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYlwiIChudW1iZXI6IDB4cnJnZ2JiKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2Ige1xuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHJnYiBUaGUgY29sb3IgdG8gdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UocmdiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZWxhdGl2ZUx1bWluYW5jZTIoXG4gICAgICAocmdiID4+IDE2KSAmIDB4RkYsXG4gICAgICAocmdiID4+IDggKSAmIDB4RkYsXG4gICAgICAocmdiICAgICAgKSAmIDB4RkYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByIFRoZSByZWQgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBiIFRoZSBibHVlIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZTIocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcnMgPSByIC8gMjU1O1xuICAgIGNvbnN0IGdzID0gZyAvIDI1NTtcbiAgICBjb25zdCBicyA9IGIgLyAyNTU7XG4gICAgY29uc3QgcnIgPSBycyA8PSAwLjAzOTI4ID8gcnMgLyAxMi45MiA6IE1hdGgucG93KChycyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJnID0gZ3MgPD0gMC4wMzkyOCA/IGdzIC8gMTIuOTIgOiBNYXRoLnBvdygoZ3MgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByYiA9IGJzIDw9IDAuMDM5MjggPyBicyAvIDEyLjkyIDogTWF0aC5wb3coKGJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgcmV0dXJuIHJyICogMC4yMTI2ICsgcmcgKiAwLjcxNTIgKyByYiAqIDAuMDcyMjtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiYVwiIChudW1iZXI6IDB4cnJnZ2JiYWEpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYmEge1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IG51bWJlciB7XG4gICAgJGEgPSAoZmcgJiAweEZGKSAvIDB4RkY7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4gZmc7XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZyA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICByZXR1cm4gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZm9yZWdyb3VuZCBjb2xvciBhbmQgYSBiYWNrZ3JvdW5kIGNvbG9yLCBlaXRoZXIgaW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgdW50aWwgdGhlIHNwZWNpZmllZCBjb250cmFzdCByYXRpbyBpcyBtZXQuIElmIHB1cmUgd2hpdGUgb3IgYmxhY2sgaXMgaGl0XG4gICAqIHdpdGhvdXQgdGhlIGNvbnRyYXN0IHJhdGlvIGJlaW5nIG1ldCwgZ28gdGhlIG90aGVyIGRpcmVjdGlvbiB1c2luZyB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciBhbmQgdGFrZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCByZXN1bHQgZGVwZW5kaW5nIG9uIHdoaWNoIGhhcyB0aGUgaGlnaGVyXG4gICAqIGNvbnRyYXN0IHJhdGlvLlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBhbHJlYWR5IG1ldC5cbiAgICpcbiAgICogQHBhcmFtIGJnUmdiYSBUaGUgYmFja2dyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIGZnUmdiYSBUaGUgZm9yZWdyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIHJhdGlvIFRoZSBjb250cmFzdCByYXRpbyB0byBhY2hpZXZlLlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoYmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGZnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShmZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgY3IgPSBjb250cmFzdFJhdGlvKGJnTCwgZmdMKTtcbiAgICBpZiAoY3IgPCByYXRpbykge1xuICAgICAgaWYgKGZnTCA8IGJnTCkge1xuICAgICAgICBjb25zdCByZXN1bHRBID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEIgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRBO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0QSA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEIgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIHJlZHVjaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA+IDAgfHwgZmdHID4gMCB8fCBmZ0IgPiAwKSkge1xuICAgICAgLy8gUmVkdWNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnUiAqIDAuMSkpO1xuICAgICAgZmdHIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0cgKiAwLjEpKTtcbiAgICAgIGZnQiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdCICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byBpbmNyZWFzaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA8IDB4RkYgfHwgZmdHIDwgMHhGRiB8fCBmZ0IgPCAweEZGKSkge1xuICAgICAgLy8gSW5jcmVhc2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiA9IE1hdGgubWluKDB4RkYsIGZnUiArIE1hdGguY2VpbCgoMjU1IC0gZmdSKSAqIDAuMSkpO1xuICAgICAgZmdHID0gTWF0aC5taW4oMHhGRiwgZmdHICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0cpICogMC4xKSk7XG4gICAgICBmZ0IgPSBNYXRoLm1pbigweEZGLCBmZ0IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnQikgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ2hhbm5lbHModmFsdWU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gWyh2YWx1ZSA+PiAyNCkgJiAweEZGLCAodmFsdWUgPj4gMTYpICYgMHhGRiwgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYWRkZWRIZXgoYzogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGMudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gcy5sZW5ndGggPCAyID8gJzAnICsgcyA6IHM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udHJhc3QgcmF0aW8gYmV0d2VlbiB0d28gcmVsYXRpdmUgbHVtaW5hbmNlIHZhbHVlcy5cbiAqIEBwYXJhbSBsMSBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHBhcmFtIGwyIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFJhdGlvKGwxOiBudW1iZXIsIGwyOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobDEgPCBsMikge1xuICAgIHJldHVybiAobDIgKyAwLjA1KSAvIChsMSArIDAuMDUpO1xuICB9XG4gIHJldHVybiAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJTGlzdGVuZXI8VCwgVSA9IHZvaWQ+IHtcbiAgKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudDxULCBVID0gdm9pZD4ge1xuICAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiB7XG4gIGV2ZW50OiBJRXZlbnQ8VCwgVT47XG4gIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4gaW1wbGVtZW50cyBJRXZlbnRFbWl0dGVyPFQsIFU+IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICBwcml2YXRlIF9ldmVudD86IElFdmVudDxULCBVPjtcbiAgcHJpdmF0ZSBfZGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IGV2ZW50KCk6IElFdmVudDxULCBVPiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudCkge1xuICAgICAgdGhpcy5fZXZlbnQgPSAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0ge1xuICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50O1xuICB9XG5cbiAgcHVibGljIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldLmNhbGwodW5kZWZpbmVkLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZEV2ZW50PFQ+KGZyb206IElFdmVudDxUPiwgdG86IElFdmVudEVtaXR0ZXI8VD4pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmU8VD4oZXZlbnQ6IElFdmVudDxUPiwgaGFuZGxlcjogKGU6IFQgfCB1bmRlZmluZWQpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgaGFuZGxlcih1bmRlZmluZWQpO1xuICByZXR1cm4gZXZlbnQoZSA9PiBoYW5kbGVyKGUpKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZCB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIG1hbmFnaW5nIHRoZSBsaWZlY3ljbGUgb2YgYW5cbiAqIG9iamVjdCBhbmQgaXRzIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgX2Rpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG4gIHByb3RlY3RlZCBfaXNEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LCB0cmlnZ2VyaW5nIHRoZSBgZGlzcG9zZWAgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElEaXNwb3NhYmxlcy5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZCBvZiB0aGlzLl9kaXNwb3NhYmxlcykge1xuICAgICAgZC5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZGlzcG9zYWJsZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkIFRoZSBkaXNwb3NhYmxlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzcG9zYWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcjxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGQ6IFQpOiBUIHtcbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKGQpO1xuICAgIHJldHVybiBkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgZGlzcG9zYWJsZSBvYmplY3QgaWYgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgaWYgbm90IGRvXG4gICAqIG5vdGhpbmcuXG4gICAqIEBwYXJhbSBkIFRoZSBkaXNwb3NhYmxlIHRvIHVucmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlcjxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGQ6IFQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2Rpc3Bvc2FibGVzLmluZGV4T2YoZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11dGFibGVEaXNwb3NhYmxlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4gaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgX3ZhbHVlPzogVDtcbiAgcHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUsIGRpc3Bvc2luZyBvZiB0aGUgb2xkIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5faXNEaXNwb3NlZCB8fCB2YWx1ZSA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc3RvcmVkIHZhbHVlIGFuZCBkaXNwb3NlcyBvZiB0aGUgcHJldmlvdXNseSBzdG9yZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gaW4gYSBkaXNwb3NhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EaXNwb3NhYmxlKGY6ICgpID0+IHZvaWQpOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6IGYgfTtcbn1cblxuLyoqXG4gKiBEaXNwb3NlIG9mIGFsbCBkaXNwb3NhYmxlcyBpbiBhbiBhcnJheSBhbmQgc2V0IGl0cyBsZW5ndGggdG8gMC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VBcnJheShkaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGQgb2YgZGlzcG9zYWJsZXMpIHtcbiAgICBkLmRpc3Bvc2UoKTtcbiAgfVxuICBkaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXNwb3NhYmxlIHRoYXQgd2lsbCBkaXNwb3NlIG9mIGFuIGFycmF5IG9mIGRpc3Bvc2FibGVzIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlKGFycmF5OiBJRGlzcG9zYWJsZVtdKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBkaXNwb3NlQXJyYXkoYXJyYXkpIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBjbGFzcyBUd29LZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogeyBbYmc6IHN0cmluZyB8IG51bWJlcl06IHsgW2ZnOiBzdHJpbmcgfCBudW1iZXJdOiBUVmFsdWUgfCB1bmRlZmluZWQgfSB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFbZmlyc3RdKSB7XG4gICAgICB0aGlzLl9kYXRhW2ZpcnN0XSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdID8gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRm91cktleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRUaGlyZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVEZvdXJ0aCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IFR3b0tleU1hcDxURmlyc3QsIFRTZWNvbmQsIFR3b0tleU1hcDxUVGhpcmQsIFRGb3VydGgsIFRWYWx1ZT4+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpKSB7XG4gICAgICB0aGlzLl9kYXRhLnNldChmaXJzdCwgc2Vjb25kLCBuZXcgVHdvS2V5TWFwKCkpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSEuc2V0KHRoaXJkLCBmb3VydGgsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKT8uZ2V0KHRoaXJkLCBmb3VydGgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBUaGlzIHdhcyBoZWF2aWx5IGluc3BpcmVkIGZyb20gbWljcm9zb2Z0L3ZzY29kZSdzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAoTUlUKS5cbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElTZXJ2aWNlSWRlbnRpZmllciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmNvbnN0IERJX1RBUkdFVCA9ICdkaSR0YXJnZXQnO1xuY29uc3QgRElfREVQRU5ERU5DSUVTID0gJ2RpJGRlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBjb25zdCBzZXJ2aWNlUmVnaXN0cnk6IE1hcDxzdHJpbmcsIElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VEZXBlbmRlbmNpZXMoY3RvcjogYW55KTogeyBpZDogSVNlcnZpY2VJZGVudGlmaWVyPGFueT4sIGluZGV4OiBudW1iZXIsIG9wdGlvbmFsOiBib29sZWFuIH1bXSB7XG4gIHJldHVybiBjdG9yW0RJX0RFUEVOREVOQ0lFU10gfHwgW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3I8VD4oaWQ6IHN0cmluZyk6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gIGlmIChzZXJ2aWNlUmVnaXN0cnkuaGFzKGlkKSkge1xuICAgIHJldHVybiBzZXJ2aWNlUmVnaXN0cnkuZ2V0KGlkKSE7XG4gIH1cblxuICBjb25zdCBkZWNvcmF0b3I6IGFueSA9IGZ1bmN0aW9uICh0YXJnZXQ6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQElTZXJ2aWNlTmFtZS1kZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWNvcmF0ZSBhIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHN0b3JlU2VydmljZURlcGVuZGVuY3koZGVjb3JhdG9yLCB0YXJnZXQsIGluZGV4KTtcbiAgfTtcblxuICBkZWNvcmF0b3IudG9TdHJpbmcgPSAoKSA9PiBpZDtcblxuICBzZXJ2aWNlUmVnaXN0cnkuc2V0KGlkLCBkZWNvcmF0b3IpO1xuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuXG5mdW5jdGlvbiBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGlkOiBGdW5jdGlvbiwgdGFyZ2V0OiBGdW5jdGlvbiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICBpZiAoKHRhcmdldCBhcyBhbnkpW0RJX1RBUkdFVF0gPT09IHRhcmdldCkge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdLnB1c2goeyBpZCwgaW5kZXggfSk7XG4gIH0gZWxzZSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10gPSBbeyBpZCwgaW5kZXggfV07XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX1RBUkdFVF0gPSB0YXJnZXQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUV2ZW50LCBJRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJRGVjUHJpdmF0ZU1vZGVzLCBJQ29yZU1vdXNlRXZlbnQsIENvcmVNb3VzZUVuY29kaW5nLCBJQ29yZU1vdXNlUHJvdG9jb2wsIENvcmVNb3VzZUV2ZW50VHlwZSwgSUNoYXJzZXQsIElXaW5kb3dPcHRpb25zLCBJTW9kZXMsIElBdHRyaWJ1dGVEYXRhLCBTY3JvbGxTb3VyY2UsIElEaXNwb3NhYmxlLCBJQ29sb3IsIEN1cnNvclN0eWxlLCBDdXJzb3JJbmFjdGl2ZVN0eWxlLCBJT3NjTGlua0RhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRGVjb3JhdG9yIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvbk9wdGlvbnMsIElEZWNvcmF0aW9uLCBJTGlua0hhbmRsZXIsIElXaW5kb3dzUHR5LCBJTG9nZ2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGNvbnN0IElCdWZmZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElCdWZmZXJTZXJ2aWNlPignQnVmZmVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQnVmZmVyU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGNvbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xuICByZWFkb25seSBidWZmZXI6IElCdWZmZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcnM6IElCdWZmZXJTZXQ7XG4gIGlzVXNlclNjcm9sbGluZzogYm9vbGVhbjtcbiAgb25SZXNpemU6IElFdmVudDx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+O1xuICBvblNjcm9sbDogSUV2ZW50PG51bWJlcj47XG4gIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ/OiBib29sZWFuKTogdm9pZDtcbiAgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbiwgc291cmNlPzogU2Nyb2xsU291cmNlKTogdm9pZDtcbiAgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlTW91c2VTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlTW91c2VTZXJ2aWNlPignQ29yZU1vdXNlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZU1vdXNlU2VydmljZSB7XG4gIGFjdGl2ZVByb3RvY29sOiBzdHJpbmc7XG4gIGFjdGl2ZUVuY29kaW5nOiBzdHJpbmc7XG4gIGFyZU1vdXNlRXZlbnRzQWN0aXZlOiBib29sZWFuO1xuICBhZGRQcm90b2NvbChuYW1lOiBzdHJpbmcsIHByb3RvY29sOiBJQ29yZU1vdXNlUHJvdG9jb2wpOiB2b2lkO1xuICBhZGRFbmNvZGluZyhuYW1lOiBzdHJpbmcsIGVuY29kaW5nOiBDb3JlTW91c2VFbmNvZGluZyk6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbW91c2UgZXZlbnQgdG8gYmUgc2VudC5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBwYXNzZWQgYWxsIHByb3RvY29sIHJlc3RyaWN0aW9ucyBhbmQgYSByZXBvcnRcbiAgICogd2FzIHNlbnQsIG90aGVyd2lzZSBmYWxzZS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlclxuICAgKiB0aGUgZGVmYXVsdCBldmVudCBhY3Rpb24gaW4gdGhlIGJvd3NlciBjb21wb25lbnQgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBtZXRob2Qgd2lsbCBjaGFuZ2UgdmFsdWVzIG9mIHRoZSBnaXZlbiBldmVudCBvYmplY3RcbiAgICogdG8gZnVsbGZpbGwgcHJvdG9jb2wgYW5kIGVuY29kaW5nIHJlc3RyaWN0aW9ucy5cbiAgICovXG4gIHRyaWdnZXJNb3VzZUV2ZW50KGV2ZW50OiBJQ29yZU1vdXNlRXZlbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0byBhbm5vdW5jZSBjaGFuZ2VzIGluIG1vdXNlIHRyYWNraW5nLlxuICAgKi9cbiAgb25Qcm90b2NvbENoYW5nZTogSUV2ZW50PENvcmVNb3VzZUV2ZW50VHlwZT47XG5cbiAgLyoqXG4gICAqIEh1bWFuIHJlYWRhYmxlIHZlcnNpb24gb2YgbW91c2UgZXZlbnRzLlxuICAgKi9cbiAgZXhwbGFpbkV2ZW50cyhldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZSk6IHsgW2V2ZW50OiBzdHJpbmddOiBib29sZWFuIH07XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVTZXJ2aWNlPignQ29yZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxseSB0aGUgY3Vyc29yIHdpbGwgbm90IGJlIHZpc2libGUgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIHRlcm1pbmFsXG4gICAqIGlzIGZvY3VzZWQuXG4gICAqL1xuICBpc0N1cnNvckluaXRpYWxpemVkOiBib29sZWFuO1xuICBpc0N1cnNvckhpZGRlbjogYm9vbGVhbjtcblxuICByZWFkb25seSBtb2RlczogSU1vZGVzO1xuICByZWFkb25seSBkZWNQcml2YXRlTW9kZXM6IElEZWNQcml2YXRlTW9kZXM7XG5cbiAgcmVhZG9ubHkgb25EYXRhOiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25Vc2VySW5wdXQ6IElFdmVudDx2b2lkPjtcbiAgcmVhZG9ubHkgb25CaW5hcnk6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblJlcXVlc3RTY3JvbGxUb0JvdHRvbTogSUV2ZW50PHZvaWQ+O1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkRhdGEgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICogQHBhcmFtIHdhc1VzZXJJbnB1dCBXaGV0aGVyIHRoZSBkYXRhIG9yaWdpbmF0ZWQgZnJvbSB0aGUgdXNlciAoYXMgb3Bwb3NlZCB0b1xuICAgKiByZXN1bHRpbmcgZnJvbSBwYXJzaW5nIGluY29taW5nIGRhdGEpLiBXaGVuIHRydWUgdGhpcyB3aWxsIGFsc286XG4gICAqIC0gU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGJ1ZmZlciBpZiBvcHRpb24gc2Nyb2xsT25Vc2VySW5wdXQgaXMgdHJ1ZS5cbiAgICogLSBGaXJlIHRoZSBgb25Vc2VySW5wdXRgIGV2ZW50IChzbyBzZWxlY3Rpb24gY2FuIGJlIGNsZWFyZWQpLlxuICAgKi9cbiAgdHJpZ2dlckRhdGFFdmVudChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dD86IGJvb2xlYW4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25CaW5hcnkgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICovXG4gIHRyaWdnZXJCaW5hcnlFdmVudChkYXRhOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNoYXJzZXRTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDaGFyc2V0U2VydmljZT4oJ0NoYXJzZXRTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDaGFyc2V0U2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBnbGV2ZWw6IG51bWJlcjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKi9cbiAgc2V0Z0xldmVsKGc6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hhcnNldCBmb3IgdGhlIGdpdmVuIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKiBAcGFyYW0gY2hhcnNldFxuICAgKi9cbiAgc2V0Z0NoYXJzZXQoZzogbnVtYmVyLCBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgdHlwZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnJhbmRlZFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbn1cblxudHlwZSBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSBUQXJncyBleHRlbmRzIFtdID8gW11cbiAgOiBUQXJncyBleHRlbmRzIFsuLi5pbmZlciBURmlyc3QsIGluZmVyIFRMYXN0XSA/IFRMYXN0IGV4dGVuZHMgSUJyYW5kZWRTZXJ2aWNlID8gR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRGaXJzdD4gOiBUQXJnc1xuICAgIDogbmV2ZXI7XG5cbmV4cG9ydCBjb25zdCBJSW5zdGFudGlhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUluc3RhbnRpYXRpb25TZXJ2aWNlPignSW5zdGFudGlhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25TZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgc2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IHZvaWQ7XG4gIGdldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQ7XG4gIGNyZWF0ZUluc3RhbmNlPEN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIFIgZXh0ZW5kcyBJbnN0YW5jZVR5cGU8Q3Rvcj4+KHQ6IEN0b3IsIC4uLmFyZ3M6IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Q3Rvcj4+KTogUjtcbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWxFbnVtIHtcbiAgVFJBQ0UgPSAwLFxuICBERUJVRyA9IDEsXG4gIElORk8gPSAyLFxuICBXQVJOID0gMyxcbiAgRVJST1IgPSA0LFxuICBPRkYgPSA1XG59XG5cbmV4cG9ydCBjb25zdCBJTG9nU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJTG9nU2VydmljZT4oJ0xvZ1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBsb2dMZXZlbDogTG9nTGV2ZWxFbnVtO1xuXG4gIHRyYWNlKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElPcHRpb25zU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3B0aW9uc1NlcnZpY2U+KCdPcHRpb25zU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3B0aW9uc1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgcmF3IG9wdGlvbnMgb2JqZWN0LCB0aGlzIGlzIGFuIGludGVybmFsLW9ubHkgZmFzdCBwYXRoIGZvciBhY2Nlc3NpbmdcbiAgICogc2luZ2xlIG9wdGlvbnMgd2l0aG91dCBhbnkgdmFsaWRhdGlvbiBhcyB3ZSB0cnVzdCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgY29ycmVjdCB1c2FnZVxuICAgKiBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3T3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgYXMgZXhwb3NlZCB0aHJvdWdoIHRoZSBwdWJsaWMgQVBJLCB0aGlzIHByb3BlcnR5IHVzZXMgZ2V0dGVycyBhbmQgc2V0dGVycyB3aXRoXG4gICAqIHZhbGlkYXRpb24gd2hpY2ggbWFrZXMgaXQgc2FmZXIgYnV0IHNsb3dlci4ge0BsaW5rIHJhd09wdGlvbnN9IHNob3VsZCBiZSB1c2VkIGZvciBwcmV0dHkgbXVjaFxuICAgKiBhbGwgaW50ZXJuYWwgdXNhZ2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhbnkgb3B0aW9uIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBvbk9wdGlvbkNoYW5nZTogSUV2ZW50PGtleW9mIElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc3BlY2lmaWMgb3B0aW9uIGNoYW5nZXMsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBpc1xuICAgKiBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gb25seSBhIHNpbmdsZSBvcHRpb24gaXMgYmVpbmcgbGlzdGVuZWQgdG8uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uU3BlY2lmaWNPcHRpb25DaGFuZ2U8VCBleHRlbmRzIGtleW9mIElUZXJtaW5hbE9wdGlvbnM+KGtleTogVCwgbGlzdGVuZXI6IChhcmcxOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPltUXSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzZXQgb2Ygc3BlY2lmaWMgb3B0aW9ucyBjaGFuZ2UsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2RcbiAgICogdGhhdCBpcyBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gbXVsdGlwbGUgb3B0aW9ucyBhcmUgYmVpbmcgbGlzdGVuZWQgdG8gYW5kXG4gICAqIGhhbmRsZWQgdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvbk11bHRpcGxlT3B0aW9uQ2hhbmdlKGtleXM6IChrZXlvZiBJVGVybWluYWxPcHRpb25zKVtdLCBsaXN0ZW5lcjogKCkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCB0eXBlIEZvbnRXZWlnaHQgPSAnbm9ybWFsJyB8ICdib2xkJyB8ICcxMDAnIHwgJzIwMCcgfCAnMzAwJyB8ICc0MDAnIHwgJzUwMCcgfCAnNjAwJyB8ICc3MDAnIHwgJzgwMCcgfCAnOTAwJyB8IG51bWJlcjtcbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ3RyYWNlJyB8ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ29mZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRlcm1pbmFsT3B0aW9ucyB7XG4gIGFsbG93UHJvcG9zZWRBcGk/OiBib29sZWFuO1xuICBhbGxvd1RyYW5zcGFyZW5jeT86IGJvb2xlYW47XG4gIGFsdENsaWNrTW92ZXNDdXJzb3I/OiBib29sZWFuO1xuICBjb2xzPzogbnVtYmVyO1xuICBjb252ZXJ0RW9sPzogYm9vbGVhbjtcbiAgY3Vyc29yQmxpbms/OiBib29sZWFuO1xuICBjdXJzb3JTdHlsZT86IEN1cnNvclN0eWxlO1xuICBjdXJzb3JXaWR0aD86IG51bWJlcjtcbiAgY3Vyc29ySW5hY3RpdmVTdHlsZT86IEN1cnNvckluYWN0aXZlU3R5bGU7XG4gIGN1c3RvbUdseXBocz86IGJvb2xlYW47XG4gIGRpc2FibGVTdGRpbj86IGJvb2xlYW47XG4gIGRvY3VtZW50T3ZlcnJpZGU/OiBhbnkgfCBudWxsO1xuICBkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycz86IGJvb2xlYW47XG4gIGZhc3RTY3JvbGxNb2RpZmllcj86ICdub25lJyB8ICdhbHQnIHwgJ2N0cmwnIHwgJ3NoaWZ0JztcbiAgZmFzdFNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBmb250U2l6ZT86IG51bWJlcjtcbiAgZm9udEZhbWlseT86IHN0cmluZztcbiAgZm9udFdlaWdodD86IEZvbnRXZWlnaHQ7XG4gIGZvbnRXZWlnaHRCb2xkPzogRm9udFdlaWdodDtcbiAgaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlPzogYm9vbGVhbjtcbiAgbGV0dGVyU3BhY2luZz86IG51bWJlcjtcbiAgbGluZUhlaWdodD86IG51bWJlcjtcbiAgbGlua0hhbmRsZXI/OiBJTGlua0hhbmRsZXIgfCBudWxsO1xuICBsb2dMZXZlbD86IExvZ0xldmVsO1xuICBsb2dnZXI/OiBJTG9nZ2VyIHwgbnVsbDtcbiAgbWFjT3B0aW9uSXNNZXRhPzogYm9vbGVhbjtcbiAgbWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb24/OiBib29sZWFuO1xuICBtaW5pbXVtQ29udHJhc3RSYXRpbz86IG51bWJlcjtcbiAgcmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzPzogYm9vbGVhbjtcbiAgcmlnaHRDbGlja1NlbGVjdHNXb3JkPzogYm9vbGVhbjtcbiAgcm93cz86IG51bWJlcjtcbiAgc2NyZWVuUmVhZGVyTW9kZT86IGJvb2xlYW47XG4gIHNjcm9sbGJhY2s/OiBudW1iZXI7XG4gIHNjcm9sbE9uVXNlcklucHV0PzogYm9vbGVhbjtcbiAgc2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIHNtb290aFNjcm9sbER1cmF0aW9uPzogbnVtYmVyO1xuICB0YWJTdG9wV2lkdGg/OiBudW1iZXI7XG4gIHRoZW1lPzogSVRoZW1lO1xuICB3aW5kb3dzTW9kZT86IGJvb2xlYW47XG4gIHdpbmRvd3NQdHk/OiBJV2luZG93c1B0eTtcbiAgd2luZG93T3B0aW9ucz86IElXaW5kb3dPcHRpb25zO1xuICB3b3JkU2VwYXJhdG9yPzogc3RyaW5nO1xuICBvdmVydmlld1J1bGVyV2lkdGg/OiBudW1iZXI7XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBjYW5jZWxFdmVudHM6IGJvb2xlYW47XG4gIHRlcm1OYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRoZW1lIHtcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBjdXJzb3JBY2NlbnQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZD86IHN0cmluZztcbiAgYmxhY2s/OiBzdHJpbmc7XG4gIHJlZD86IHN0cmluZztcbiAgZ3JlZW4/OiBzdHJpbmc7XG4gIHllbGxvdz86IHN0cmluZztcbiAgYmx1ZT86IHN0cmluZztcbiAgbWFnZW50YT86IHN0cmluZztcbiAgY3lhbj86IHN0cmluZztcbiAgd2hpdGU/OiBzdHJpbmc7XG4gIGJyaWdodEJsYWNrPzogc3RyaW5nO1xuICBicmlnaHRSZWQ/OiBzdHJpbmc7XG4gIGJyaWdodEdyZWVuPzogc3RyaW5nO1xuICBicmlnaHRZZWxsb3c/OiBzdHJpbmc7XG4gIGJyaWdodEJsdWU/OiBzdHJpbmc7XG4gIGJyaWdodE1hZ2VudGE/OiBzdHJpbmc7XG4gIGJyaWdodEN5YW4/OiBzdHJpbmc7XG4gIGJyaWdodFdoaXRlPzogc3RyaW5nO1xuICBleHRlbmRlZEFuc2k/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IElPc2NMaW5rU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3NjTGlua1NlcnZpY2U+KCdPc2NMaW5rU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3NjTGlua1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxpbmsgdG8gdGhlIHNlcnZpY2UsIHJldHVybmluZyB0aGUgbGluayBJRC4gVGhlIGxpbmsgZGF0YSBpcyBtYW5hZ2VkIGJ5IHRoaXNcbiAgICogc2VydmljZSBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoaXMgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgdHJpbW1lZCBvZmYgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHJlZ2lzdGVyTGluayhsaW5rRGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyO1xuICAvKipcbiAgICogQWRkcyBhIGxpbmUgdG8gYSBsaW5rIGlmIG5lZWRlZC5cbiAgICovXG4gIGFkZExpbmVUb0xpbmsobGlua0lkOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XG4gIC8qKiBHZXQgdGhlIGxpbmsgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rIElELiAqL1xuICBnZXRMaW5rRGF0YShsaW5rSWQ6IG51bWJlcik6IElPc2NMaW5rRGF0YSB8IHVuZGVmaW5lZDtcbn1cblxuLypcbiAqIFdpZHRoIGFuZCBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrIHByb3BlcnRpZXMgb2YgYSBjaGFyYWN0ZXIgYXMgYSBiaXQgbWFzay5cbiAqXG4gKiBiaXQgMDogc2hvdWxkSm9pbiAtIHNob3VsZCBjb21iaW5lIHdpdGggcHJlY2VkaW5nIGNoYXJhY3Rlci5cbiAqIGJpdCAxLi4yOiB3Y3dpZHRoIC0gc2VlIFVuaWNvZGVDaGFyV2lkdGguXG4gKiBiaXQgMy4uMzE6IGNsYXNzIG9mIGNoYXJhY3RlciAoY3VycmVudGx5IG9ubHkgNCBiaXRzIGFyZSB1c2VkKS5cbiAqICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZWQgZ3JhcGhlbWUgY2x1c3RlcmluZyAtIGkuZS4gd2hpY2ggY29kZXBvaW50c1xuICogICBhcmUgdG8gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb21wb3VuZCBjaGFyYWN0ZXIuXG4gKlxuICogVXNlIHRoZSBVbmljb2RlU2VydmljZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlWYWx1ZSB0byBjcmVhdGUgYVxuICogVW5pY29kZUNoYXJQcm9wZXJ0aWVzOyB1c2UgZXh0cmFjdFNob3VsZEpvaW4sIGV4dHJhY3RXaWR0aCwgYW5kXG4gKiBleHRyYWN0Q2hhcktpbmQgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJQcm9wZXJ0aWVzID0gbnVtYmVyO1xuXG4vKipcbiAqIFdpZHRoIGluIGNvbHVtbnMgb2YgYSBjaGFyYWN0ZXIuXG4gKiBJbiBhIENKSyBjb250ZXh0LCBcImhhbGYtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIExhdGluKSBhcmUgd2lkdGggMSxcbiAqIHdoaWxlIFwiZnVsbC13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgS2FuamkpIGFyZSAyIGNvbHVtbnMgd2lkZS5cbiAqIENvbWJpbmluZyBjaGFyYWN0ZXJzIChzdWNoIGFzIGFjY2VudHMpIGFyZSB3aWR0aCAwLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhcldpZHRoID0gMCB8IDEgfCAyO1xuXG5leHBvcnQgY29uc3QgSVVuaWNvZGVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElVbmljb2RlU2VydmljZT4oJ1VuaWNvZGVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKiogUmVnaXN0ZXIgYW4gVW5pY29kZSB2ZXJzaW9uIHByb3ZpZGVyLiAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIpOiB2b2lkO1xuICAvKiogUmVnaXN0ZXJlZCBVbmljb2RlIHZlcnNpb25zLiAqL1xuICByZWFkb25seSB2ZXJzaW9uczogc3RyaW5nW107XG4gIC8qKiBDdXJyZW50bHkgYWN0aXZlIHZlcnNpb24uICovXG4gIGFjdGl2ZVZlcnNpb246IHN0cmluZztcbiAgLyoqIEV2ZW50IHRyaWdnZXJlZCwgd2hlbiBhY3RpdmF0ZSB2ZXJzaW9uIGNoYW5nZWQuICovXG4gIHJlYWRvbmx5IG9uQ2hhbmdlOiBJRXZlbnQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogVW5pY29kZSB2ZXJzaW9uIGRlcGVuZGVudFxuICAgKi9cbiAgd2N3aWR0aChjb2RlcG9pbnQ6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGdldFN0cmluZ0NlbGxXaWR0aChzOiBzdHJpbmcpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXR1cm4gY2hhcmFjdGVyIHdpZHRoIGFuZCB0eXBlIGZvciBncmFwaGVtZSBjbHVzdGVyaW5nLlxuICAgKiBJZiBwcmVjZWRpbmcgIT0gMCwgaXQgaXMgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHByZXZpb3VzIGNoYXJhY3RlcjtcbiAgICogaW4gdGhhdCBjYXNlIHRoZSByZXN1bHQgc3BlY2lmaWVzIGlmIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBqb2luZWQuXG4gICAqL1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIge1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHdjd2lkdGgodWNzOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBJRGVjb3JhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SURlY29yYXRpb25TZXJ2aWNlPignRGVjb3JhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSURlY29yYXRpb25TZXJ2aWNlIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZGVjb3JhdGlvbnM6IEl0ZXJhYmxlSXRlcmF0b3I8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlZ2lzdGVyZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVtb3ZlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xuICByZXNldCgpOiB2b2lkO1xuICAvKipcbiAgICogVHJpZ2dlciBhIGNhbGxiYWNrIG92ZXIgdGhlIGRlY29yYXRpb24gYXQgYSBjZWxsIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS4gVGhpcyB1c2VzIGEgY2FsbGJhY2tcbiAgICogaW5zdGVhZCBvZiBhbiBpdGVyYXRvciBhcyBpdCdzIHR5cGljYWxseSB1c2VkIGluIGhvdCBjb2RlIHBhdGhzLlxuICAgKi9cbiAgZm9yRWFjaERlY29yYXRpb25BdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyOiAnYm90dG9tJyB8ICd0b3AnIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pID0+IHZvaWQpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJuYWxEZWNvcmF0aW9uIGV4dGVuZHMgSURlY29yYXRpb24ge1xuICByZWFkb25seSBvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmb3JlZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25SZW5kZXJFbWl0dGVyOiBJRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50Pjtcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIChFWFBFUklNRU5UQUwpIFRoaXMgQWRkb24gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElCdWZmZXIsIElCdWZmZXJDZWxsLCBJQnVmZmVyUmFuZ2UsIElUZXJtaW5hbEFkZG9uLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IElIVE1MU2VyaWFsaXplT3B0aW9ucywgU2VyaWFsaXplQWRkb24gYXMgSVNlcmlhbGl6ZUFwaSwgSVNlcmlhbGl6ZU9wdGlvbnMsIElTZXJpYWxpemVSYW5nZSB9IGZyb20gJ0B4dGVybS9hZGRvbi1zZXJpYWxpemUnO1xuaW1wb3J0IHsgREVGQVVMVF9BTlNJX0NPTE9SUyB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvVGhlbWVTZXJ2aWNlJztcbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5mdW5jdGlvbiBjb25zdHJhaW4odmFsdWU6IG51bWJlciwgbG93OiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChsb3csIE1hdGgubWluKHZhbHVlLCBoaWdoKSk7XG59XG5cbi8vIFRPRE86IFJlZmluZSB0aGlzIHRlbXBsYXRlIGNsYXNzIGxhdGVyXG5hYnN0cmFjdCBjbGFzcyBCYXNlU2VyaWFsaXplSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfYnVmZmVyOiBJQnVmZmVyXG4gICkge1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShyYW5nZTogSUJ1ZmZlclJhbmdlLCBleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbj86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIHdlIG5lZWQgdHdvIG9mIHRoZW0gdG8gZmxpcCBiZXR3ZWVuIG9sZCBhbmQgbmV3IGNlbGxcbiAgICBjb25zdCBjZWxsMSA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICAgIGNvbnN0IGNlbGwyID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gICAgbGV0IG9sZENlbGwgPSBjZWxsMTtcblxuICAgIGNvbnN0IHN0YXJ0Um93ID0gcmFuZ2Uuc3RhcnQueTtcbiAgICBjb25zdCBlbmRSb3cgPSByYW5nZS5lbmQueTtcbiAgICBjb25zdCBzdGFydENvbHVtbiA9IHJhbmdlLnN0YXJ0Lng7XG4gICAgY29uc3QgZW5kQ29sdW1uID0gcmFuZ2UuZW5kLng7XG5cbiAgICB0aGlzLl9iZWZvcmVTZXJpYWxpemUoZW5kUm93IC0gc3RhcnRSb3csIHN0YXJ0Um93LCBlbmRSb3cpO1xuXG4gICAgZm9yIChsZXQgcm93ID0gc3RhcnRSb3c7IHJvdyA8PSBlbmRSb3c7IHJvdysrKSB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TGluZUNvbHVtbiA9IHJvdyA9PT0gcmFuZ2Uuc3RhcnQueSA/IHN0YXJ0Q29sdW1uIDogMDtcbiAgICAgICAgY29uc3QgZW5kTGluZUNvbHVtbiA9IHJvdyA9PT0gcmFuZ2UuZW5kLnkgPyBlbmRDb2x1bW46IGxpbmUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBjb2wgPSBzdGFydExpbmVDb2x1bW47IGNvbCA8IGVuZExpbmVDb2x1bW47IGNvbCsrKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGxpbmUuZ2V0Q2VsbChjb2wsIG9sZENlbGwgPT09IGNlbGwxID8gY2VsbDIgOiBjZWxsMSk7XG4gICAgICAgICAgaWYgKCFjKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENhbid0IGdldCBjZWxsIGF0IHJvdz0ke3Jvd30sIGNvbD0ke2NvbH1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9uZXh0Q2VsbChjLCBvbGRDZWxsLCByb3csIGNvbCk7XG4gICAgICAgICAgb2xkQ2VsbCA9IGM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jvd0VuZChyb3csIHJvdyA9PT0gZW5kUm93KTtcbiAgICB9XG5cbiAgICB0aGlzLl9hZnRlclNlcmlhbGl6ZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25leHRDZWxsKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfYmVmb3JlU2VyaWFsaXplKHJvd3M6IG51bWJlciwgc3RhcnRSb3c6IG51bWJlciwgZW5kUm93OiBudW1iZXIpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX2FmdGVyU2VyaWFsaXplKCk6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7IHJldHVybiAnJzsgfVxufVxuXG5mdW5jdGlvbiBlcXVhbEZnKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmdldEZnQ29sb3JNb2RlKCkgPT09IGNlbGwyLmdldEZnQ29sb3JNb2RlKClcbiAgICAmJiBjZWxsMS5nZXRGZ0NvbG9yKCkgPT09IGNlbGwyLmdldEZnQ29sb3IoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxCZyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5nZXRCZ0NvbG9yTW9kZSgpID09PSBjZWxsMi5nZXRCZ0NvbG9yTW9kZSgpXG4gICAgJiYgY2VsbDEuZ2V0QmdDb2xvcigpID09PSBjZWxsMi5nZXRCZ0NvbG9yKCk7XG59XG5cbmZ1bmN0aW9uIGVxdWFsRmxhZ3MoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuaXNJbnZlcnNlKCkgPT09IGNlbGwyLmlzSW52ZXJzZSgpXG4gICAgJiYgY2VsbDEuaXNCb2xkKCkgPT09IGNlbGwyLmlzQm9sZCgpXG4gICAgJiYgY2VsbDEuaXNVbmRlcmxpbmUoKSA9PT0gY2VsbDIuaXNVbmRlcmxpbmUoKVxuICAgICYmIGNlbGwxLmlzT3ZlcmxpbmUoKSA9PT0gY2VsbDIuaXNPdmVybGluZSgpXG4gICAgJiYgY2VsbDEuaXNCbGluaygpID09PSBjZWxsMi5pc0JsaW5rKClcbiAgICAmJiBjZWxsMS5pc0ludmlzaWJsZSgpID09PSBjZWxsMi5pc0ludmlzaWJsZSgpXG4gICAgJiYgY2VsbDEuaXNJdGFsaWMoKSA9PT0gY2VsbDIuaXNJdGFsaWMoKVxuICAgICYmIGNlbGwxLmlzRGltKCkgPT09IGNlbGwyLmlzRGltKClcbiAgICAmJiBjZWxsMS5pc1N0cmlrZXRocm91Z2goKSA9PT0gY2VsbDIuaXNTdHJpa2V0aHJvdWdoKCk7XG59XG5cbmNsYXNzIFN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlU2VyaWFsaXplSGFuZGxlciB7XG4gIHByaXZhdGUgX3Jvd0luZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9hbGxSb3dzOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2FsbFJvd1NlcGFyYXRvcnM6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX251bGxDZWxsQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgLy8gd2UgY2FuIHNlZSBhIGZ1bGwgY29sb3JlZCBjZWxsIGFuZCBhIG51bGwgY2VsbCB0aGF0IG9ubHkgaGF2ZSBiYWNrZ3JvdW5kIHRoZSBzYW1lIHN0eWxlXG4gIC8vIGJ1dCB0aGUgaW5mb3JtYXRpb24gaXNuJ3QgcHJlc2VydmVkIGJ5IG51bGwgY2VsbCBpdHNlbGZcbiAgLy8gc28gd2VlIG5lZWQgdG8gcmVjb3JkIGl0IHdoZW4gcmVxdWlyZWQuXG4gIHByaXZhdGUgX2N1cnNvclN0eWxlOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuXG4gIC8vIHdoZXJlIGV4YWN0IHRoZSBjdXJzb3Igc3R5bGVzIGNvbWVzIGZyb21cbiAgLy8gYmVjYXVzZSB3ZSBjYW4ndCBjb3B5IHRoZSBjZWxsIGRpcmVjdGx5XG4gIC8vIHNvIHdlIHJlbWVtYmVyIHdoZXJlIHRoZSBjb250ZW50IGNvbWVzIGZyb20gaW5zdGVhZFxuICBwcml2YXRlIF9jdXJzb3JTdHlsZVJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGVDb2w6IG51bWJlciA9IDA7XG5cbiAgLy8gdGhpcyBpcyBhIG51bGwgY2VsbCBmb3IgcmVmZXJlbmNlIGZvciBjaGVja2luZyB3aGV0aGVyIGJhY2tncm91bmQgaXMgZW1wdHkgb3Igbm90XG4gIHByaXZhdGUgX2JhY2tncm91bmRDZWxsOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuXG4gIHByaXZhdGUgX2ZpcnN0Um93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q3Vyc29yUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q3Vyc29yQ29sOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudEN1cnNvclJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdENvbnRlbnRDdXJzb3JDb2w6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbFxuICApIHtcbiAgICBzdXBlcihidWZmZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2FsbFJvd3MgPSBuZXcgQXJyYXk8c3RyaW5nPihyb3dzKTtcbiAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHN0YXJ0O1xuICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSBzdGFydDtcbiAgICB0aGlzLl9maXJzdFJvdyA9IHN0YXJ0O1xuICB9XG5cbiAgcHJpdmF0ZSBfdGhpc1Jvd0xhc3RDaGFyOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICBwcml2YXRlIF90aGlzUm93TGFzdFNlY29uZENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByaXZhdGUgX25leHRSb3dGaXJzdENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByb3RlY3RlZCBfcm93RW5kKHJvdzogbnVtYmVyLCBpc0xhc3RSb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBjb2xvcmZ1bCBlbXB0eSBjZWxsIGF0IGxpbmUgZW5kLCB3aGUgbXVzdCBwYWQgaXQgYmFjaywgb3IgdGhlIHRoZSBjb2xvciBibG9ja1xuICAgIC8vIHdpbGwgbWlzc2luZ1xuICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCAmJiAhZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgdGhpcy5fYmFja2dyb3VuZENlbGwpKSB7XG4gICAgICAvLyB1c2UgY2xlYXIgcmlnaHQgdG8gc2V0IGJhY2tncm91bmQuXG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICB9XG5cbiAgICBsZXQgcm93U2VwYXJhdG9yID0gJyc7XG5cbiAgICAvLyBoYW5kbGUgcm93IHNlcGFyYXRvclxuICAgIGlmICghaXNMYXN0Um93KSB7XG4gICAgICAvLyBFbmFibGUgQkNFXG4gICAgICBpZiAocm93IC0gdGhpcy5fZmlyc3RSb3cgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICB0aGlzLl9idWZmZXIuZ2V0TGluZSh0aGlzLl9jdXJzb3JTdHlsZVJvdyk/LmdldENlbGwodGhpcy5fY3Vyc29yU3R5bGVDb2wsIHRoaXMuX2JhY2tncm91bmRDZWxsKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmV0Y2ggY3VycmVudCBsaW5lXG4gICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdykhO1xuICAgICAgLy8gRmV0Y2ggbmV4dCBsaW5lXG4gICAgICBjb25zdCBuZXh0TGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdyArIDEpITtcblxuICAgICAgaWYgKCFuZXh0TGluZS5pc1dyYXBwZWQpIHtcbiAgICAgICAgLy8ganVzdCBpbnNlcnQgdGhlIGxpbmUgYnJlYWtcbiAgICAgICAgcm93U2VwYXJhdG9yID0gJ1xcclxcbic7XG4gICAgICAgIC8vIHdlIHNlbmRlZCB0aGUgZW50ZXJcbiAgICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgIHRoaXMuX2xhc3RDdXJzb3JDb2wgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm93U2VwYXJhdG9yID0gJyc7XG4gICAgICAgIGNvbnN0IHRoaXNSb3dMYXN0Q2hhciA9IGN1cnJlbnRMaW5lLmdldENlbGwoY3VycmVudExpbmUubGVuZ3RoIC0gMSwgdGhpcy5fdGhpc1Jvd0xhc3RDaGFyKSE7XG4gICAgICAgIGNvbnN0IHRoaXNSb3dMYXN0U2Vjb25kQ2hhciA9IGN1cnJlbnRMaW5lLmdldENlbGwoY3VycmVudExpbmUubGVuZ3RoIC0gMiwgdGhpcy5fdGhpc1Jvd0xhc3RTZWNvbmRDaGFyKSE7XG4gICAgICAgIGNvbnN0IG5leHRSb3dGaXJzdENoYXIgPSBuZXh0TGluZS5nZXRDZWxsKDAsIHRoaXMuX25leHRSb3dGaXJzdENoYXIpITtcbiAgICAgICAgY29uc3QgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggPSBuZXh0Um93Rmlyc3RDaGFyLmdldFdpZHRoKCkgPiAxO1xuXG4gICAgICAgIC8vIHZhbGlkYXRlIHdoZXRoZXIgdGhpcyBsaW5lIHdyYXAgaXMgZXZlciBwb3NzaWJsZVxuICAgICAgICAvLyB3aGljaCBtZWFuIHdoZXRoZXIgY3Vyc29yIGNhbiBwbGFjZWQgYXQgYSBvdmVyZmxvdyBwb3NpdGlvbiAoeCA9PT0gcm93KSBuYXR1cmFsbHlcbiAgICAgICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8geW91IG11c3Qgb3V0cHV0IGNoYXJhY3RlciB0byBjYXVzZSBvdmVyZmxvdywgY29udHJvbCBzZXF1ZW5jZSBjYW4ndCBkbyB0aGlzXG4gICAgICAgICAgbmV4dFJvd0ZpcnN0Q2hhci5nZXRDaGFycygpICYmXG4gICAgICAgICAgICBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCA/IHRoaXMuX251bGxDZWxsQ291bnQgPD0gMSA6IHRoaXMuX251bGxDZWxsQ291bnQgPD0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyB0aGUgbGFzdCBjaGFyYWN0ZXIgY2FuJ3QgYmUgbnVsbCxcbiAgICAgICAgICAgIC8vIHlvdSBjYW4ndCB1c2UgY29udHJvbCBzZXF1ZW5jZSB0byBtb3ZlIGN1cnNvciB0byAoeCA9PT0gcm93KVxuICAgICAgICAgICAgKHRoaXNSb3dMYXN0Q2hhci5nZXRDaGFycygpIHx8IHRoaXNSb3dMYXN0Q2hhci5nZXRXaWR0aCgpID09PSAwKSAmJlxuICAgICAgICAgICAgLy8gY2hhbmdlIGJhY2tncm91bmQgb2YgdGhlIGZpcnN0IHdyYXBwZWQgY2VsbCBhbHNvIGFmZmVjdHMgQkNFXG4gICAgICAgICAgICAvLyBzbyB3ZSBtYXJrIGl0IGFzIGludmFsaWQgdG8gc2ltcGx5IHRoZSBwcm9jZXNzIHRvIGRldGVybWluZSBsaW5lIHNlcGFyYXRvclxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdENoYXIsIG5leHRSb3dGaXJzdENoYXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyB0aGUgc2Vjb25kIHRvIGxhc3QgY2hhcmFjdGVyIGNhbid0IGJlIG51bGwgaWYgdGhlIG5leHQgbGluZSBzdGFydHMgd2l0aCBDSkssXG4gICAgICAgICAgICAvLyB5b3UgY2FuJ3QgdXNlIGNvbnRyb2wgc2VxdWVuY2UgdG8gbW92ZSBjdXJzb3IgdG8gKHggPT09IHJvdylcbiAgICAgICAgICAgIGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoICYmXG4gICAgICAgICAgICAodGhpc1Jvd0xhc3RTZWNvbmRDaGFyLmdldENoYXJzKCkgfHwgdGhpc1Jvd0xhc3RTZWNvbmRDaGFyLmdldFdpZHRoKCkgPT09IDApICYmXG4gICAgICAgICAgICAvLyBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZmlyc3Qgd3JhcHBlZCBjZWxsIGFsc28gYWZmZWN0cyBCQ0VcbiAgICAgICAgICAgIC8vIHNvIHdlIG1hcmsgaXQgYXMgaW52YWxpZCB0byBzaW1wbHkgdGhlIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIGxpbmUgc2VwYXJhdG9yXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0Q2hhciwgbmV4dFJvd0ZpcnN0Q2hhcikgJiZcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RTZWNvbmRDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgLy8gZm9yY2UgdGhlIHdyYXAgd2l0aCBtYWdpY1xuICAgICAgICAgIC8vIGluc2VydCBlbm91Z2ggY2hhcmFjdGVyIHRvIGZvcmNlIHRoZSB3cmFwXG4gICAgICAgICAgcm93U2VwYXJhdG9yID0gJy0nLnJlcGVhdCh0aGlzLl9udWxsQ2VsbENvdW50ICsgMSk7XG4gICAgICAgICAgLy8gbW92ZSBiYWNrIGFuZCBlcmFzZSBuZXh0IGxpbmUgaGVhZFxuICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYlsxRFxcdTAwMWJbMVgnO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBkbyB0aGVzZSBiZWNhdXNlIHdlIGZpbGxlZCB0aGUgbGFzdCBzZXZlcmFsIG51bGwgc2xvdCwgd2hpY2ggd2Ugc2hvdWxkbid0XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gJ1xcdTAwMWJbQSc7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHtjdXJyZW50TGluZS5sZW5ndGggLSB0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske2N1cnJlbnRMaW5lLmxlbmd0aCAtIHRoaXMuX251bGxDZWxsQ291bnR9RGA7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gJ1xcdTAwMWJbQic7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGhpcyBpcyBjb250ZW50IGFuZCBuZWVkIHRoZSBiZSBzZXJpYWxpemVkIGV2ZW4gaXQgaXMgaW52aXNpYmxlLlxuICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgd3JhcCB3aWxsIGJlIG1pc3NpbmcgZnJvbSBvdXRwdXRzLlxuICAgICAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbCA9IDA7XG5cbiAgICAgICAgICAvLyBmb3JjZSBjb21taXQgdGhlIGN1cnNvciBwb3NpdGlvblxuICAgICAgICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICAgIHRoaXMuX2xhc3RDdXJzb3JDb2wgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYWxsUm93c1t0aGlzLl9yb3dJbmRleF0gPSB0aGlzLl9jdXJyZW50Um93O1xuICAgIHRoaXMuX2FsbFJvd1NlcGFyYXRvcnNbdGhpcy5fcm93SW5kZXgrK10gPSByb3dTZXBhcmF0b3I7XG4gICAgdGhpcy5fY3VycmVudFJvdyA9ICcnO1xuICAgIHRoaXMuX251bGxDZWxsQ291bnQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIG9sZENlbGw6IElCdWZmZXJDZWxsKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNnclNlcTogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBmZ0NoYW5nZWQgPSAhZXF1YWxGZyhjZWxsLCBvbGRDZWxsKTtcbiAgICBjb25zdCBiZ0NoYW5nZWQgPSAhZXF1YWxCZyhjZWxsLCBvbGRDZWxsKTtcbiAgICBjb25zdCBmbGFnc0NoYW5nZWQgPSAhZXF1YWxGbGFncyhjZWxsLCBvbGRDZWxsKTtcblxuICAgIGlmIChmZ0NoYW5nZWQgfHwgYmdDaGFuZ2VkIHx8IGZsYWdzQ2hhbmdlZCkge1xuICAgICAgaWYgKGNlbGwuaXNBdHRyaWJ1dGVEZWZhdWx0KCkpIHtcbiAgICAgICAgaWYgKCFvbGRDZWxsLmlzQXR0cmlidXRlRGVmYXVsdCgpKSB7XG4gICAgICAgICAgc2dyU2VxLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmZ0NoYW5nZWQpIHtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNlbGwuZ2V0RmdDb2xvcigpO1xuICAgICAgICAgIGlmIChjZWxsLmlzRmdSR0IoKSkgeyBzZ3JTZXEucHVzaCgzOCwgMiwgKGNvbG9yID4+PiAxNikgJiAweEZGLCAoY29sb3IgPj4+IDgpICYgMHhGRiwgY29sb3IgJiAweEZGKTsgfVxuICAgICAgICAgIGVsc2UgaWYgKGNlbGwuaXNGZ1BhbGV0dGUoKSkge1xuICAgICAgICAgICAgaWYgKGNvbG9yID49IDE2KSB7IHNnclNlcS5wdXNoKDM4LCA1LCBjb2xvcik7IH1cbiAgICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaChjb2xvciAmIDggPyA5MCArIChjb2xvciAmIDcpIDogMzAgKyAoY29sb3IgJiA3KSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKDM5KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZ0NoYW5nZWQpIHtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgICAgICAgIGlmIChjZWxsLmlzQmdSR0IoKSkgeyBzZ3JTZXEucHVzaCg0OCwgMiwgKGNvbG9yID4+PiAxNikgJiAweEZGLCAoY29sb3IgPj4+IDgpICYgMHhGRiwgY29sb3IgJiAweEZGKTsgfVxuICAgICAgICAgIGVsc2UgaWYgKGNlbGwuaXNCZ1BhbGV0dGUoKSkge1xuICAgICAgICAgICAgaWYgKGNvbG9yID49IDE2KSB7IHNnclNlcS5wdXNoKDQ4LCA1LCBjb2xvcik7IH1cbiAgICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaChjb2xvciAmIDggPyAxMDAgKyAoY29sb3IgJiA3KSA6IDQwICsgKGNvbG9yICYgNykpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaCg0OSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICAgICAgaWYgKGNlbGwuaXNJbnZlcnNlKCkgIT09IG9sZENlbGwuaXNJbnZlcnNlKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0ludmVyc2UoKSA/IDcgOiAyNyk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0JvbGQoKSAhPT0gb2xkQ2VsbC5pc0JvbGQoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzQm9sZCgpID8gMSA6IDIyKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzVW5kZXJsaW5lKCkgIT09IG9sZENlbGwuaXNVbmRlcmxpbmUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzVW5kZXJsaW5lKCkgPyA0IDogMjQpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNPdmVybGluZSgpICE9PSBvbGRDZWxsLmlzT3ZlcmxpbmUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzT3ZlcmxpbmUoKSA/IDUzIDogNTUpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNCbGluaygpICE9PSBvbGRDZWxsLmlzQmxpbmsoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzQmxpbmsoKSA/IDUgOiAyNSk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpICE9PSBvbGRDZWxsLmlzSW52aXNpYmxlKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0ludmlzaWJsZSgpID8gOCA6IDI4KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkgIT09IG9sZENlbGwuaXNJdGFsaWMoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSXRhbGljKCkgPyAzIDogMjMpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNEaW0oKSAhPT0gb2xkQ2VsbC5pc0RpbSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNEaW0oKSA/IDIgOiAyMik7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc1N0cmlrZXRocm91Z2goKSAhPT0gb2xkQ2VsbC5pc1N0cmlrZXRocm91Z2goKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzU3RyaWtldGhyb3VnaCgpID8gOSA6IDI5KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNnclNlcTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcblxuICAgIGlmIChpc1BsYWNlSG9sZGVyQ2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY2VsbCBkb24ndCBoYXZlIGNvbnRlbnRcbiAgICBjb25zdCBpc0VtcHR5Q2VsbCA9IGNlbGwuZ2V0Q2hhcnMoKSA9PT0gJyc7XG5cbiAgICBjb25zdCBzZ3JTZXEgPSB0aGlzLl9kaWZmU3R5bGUoY2VsbCwgdGhpcy5fY3Vyc29yU3R5bGUpO1xuXG4gICAgLy8gdGhlIGVtcHR5IGNlbGwgc3R5bGUgaXMgb25seSBhc3N1bWVkIHRvIGJlIGNoYW5nZWQgd2hlbiBiYWNrZ3JvdW5kIGNoYW5nZWQsIGJlY2F1c2VcbiAgICAvLyBmb3JlZ3JvdW5kIGlzIGFsd2F5cyAwLlxuICAgIGNvbnN0IHN0eWxlQ2hhbmdlZCA9IGlzRW1wdHlDZWxsID8gIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIGNlbGwpIDogc2dyU2VxLmxlbmd0aCA+IDA7XG5cbiAgICAvKipcbiAgICAgKiAgaGFuZGxlcyBzdHlsZSBjaGFuZ2VcbiAgICAgKi9cbiAgICBpZiAoc3R5bGVDaGFuZ2VkKSB7XG4gICAgICAvLyBiZWZvcmUgdXBkYXRlIHRoZSBzdHlsZSwgd2UgbmVlZCB0byBmaWxsIGVtcHR5IGNlbGwgYmFja1xuICAgICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwKSB7XG4gICAgICAgIC8vIHVzZSBjbGVhciByaWdodCB0byBzZXQgYmFja2dyb3VuZC5cbiAgICAgICAgaWYgKCFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2UgbW92ZSByaWdodCB0byBtb3ZlIGN1cnNvci5cbiAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgIHRoaXMuX251bGxDZWxsQ291bnQgPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3c7XG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbCA9IHRoaXMuX2xhc3RDdXJzb3JDb2wgPSBjb2w7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHtzZ3JTZXEuam9pbignOycpfW1gO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGxhc3QgY3Vyc29yIHN0eWxlXG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KTtcbiAgICAgIGlmIChsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGluZS5nZXRDZWxsKGNvbCwgdGhpcy5fY3Vyc29yU3R5bGUpO1xuICAgICAgICB0aGlzLl9jdXJzb3JTdHlsZVJvdyA9IHJvdztcbiAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGVDb2wgPSBjb2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIGhhbmRsZXMgYWN0dWFsIGNvbnRlbnRcbiAgICAgKi9cbiAgICBpZiAoaXNFbXB0eUNlbGwpIHtcbiAgICAgIHRoaXMuX251bGxDZWxsQ291bnQgKz0gY2VsbC5nZXRXaWR0aCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgLy8gd2UgY2FuIGp1c3QgYXNzdW1lIHdlIGhhdmUgc2FtZSBzdHlsZSB3aXRoIHByZXZpb3VzIG9uZSBoZXJlXG4gICAgICAgIC8vIGJlY2F1c2Ugc3R5bGUgY2hhbmdlIGlzIGhhbmRsZWQgYnkgcHJldmlvdXMgc3RhZ2VcbiAgICAgICAgLy8gdXNlIG1vdmUgcmlnaHQgd2hlbiBiYWNrZ3JvdW5kIGlzIGVtcHR5LCB1c2UgY2xlYXIgcmlnaHQgd2hlbiB0aGVyZSBpcyBiYWNrZ3JvdW5kLlxuICAgICAgICBpZiAoZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgdGhpcy5fYmFja2dyb3VuZENlbGwpKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gY2VsbC5nZXRDaGFycygpO1xuXG4gICAgICAvLyB1cGRhdGUgY3Vyc29yXG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3c7XG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbCA9IHRoaXMuX2xhc3RDdXJzb3JDb2wgPSBjb2wgKyBjZWxsLmdldFdpZHRoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb246IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGxldCByb3dFbmQgPSB0aGlzLl9hbGxSb3dzLmxlbmd0aDtcblxuICAgIC8vIHRoZSBmaXh1cCBpcyBvbmx5IHJlcXVpcmVkIGZvciBkYXRhIHdpdGhvdXQgc2Nyb2xsYmFja1xuICAgIC8vIGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgcGxhY2VkIGF0IGxhc3QgbGluZSBvdGhlcndpc2VcbiAgICBpZiAodGhpcy5fYnVmZmVyLmxlbmd0aCAtIHRoaXMuX2ZpcnN0Um93IDw9IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgIHJvd0VuZCA9IHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ICsgMSAtIHRoaXMuX2ZpcnN0Um93O1xuICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sO1xuICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93O1xuICAgIH1cblxuICAgIGxldCBjb250ZW50ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0VuZDsgaSsrKSB7XG4gICAgICBjb250ZW50ICs9IHRoaXMuX2FsbFJvd3NbaV07XG4gICAgICBpZiAoaSArIDEgPCByb3dFbmQpIHtcbiAgICAgICAgY29udGVudCArPSB0aGlzLl9hbGxSb3dTZXBhcmF0b3JzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlc3RvcmUgdGhlIGN1cnNvclxuICAgIGlmICghZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHJlYWxDdXJzb3JSb3cgPSB0aGlzLl9idWZmZXIuYmFzZVkgKyB0aGlzLl9idWZmZXIuY3Vyc29yWTtcbiAgICAgIGNvbnN0IHJlYWxDdXJzb3JDb2wgPSB0aGlzLl9idWZmZXIuY3Vyc29yWDtcblxuICAgICAgY29uc3QgY3Vyc29yTW92ZWQgPSAocmVhbEN1cnNvclJvdyAhPT0gdGhpcy5fbGFzdEN1cnNvclJvdyB8fCByZWFsQ3Vyc29yQ29sICE9PSB0aGlzLl9sYXN0Q3Vyc29yQ29sKTtcblxuICAgICAgY29uc3QgbW92ZVJpZ2h0ID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlske29mZnNldH1DYDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlskey1vZmZzZXR9RGA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBtb3ZlRG93biA9IChvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtvZmZzZXR9QmA7XG4gICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHstb2Zmc2V0fUFgO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoY3Vyc29yTW92ZWQpIHtcbiAgICAgICAgbW92ZURvd24ocmVhbEN1cnNvclJvdyAtIHRoaXMuX2xhc3RDdXJzb3JSb3cpO1xuICAgICAgICBtb3ZlUmlnaHQocmVhbEN1cnNvckNvbCAtIHRoaXMuX2xhc3RDdXJzb3JDb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgdGhlIGN1cnNvcidzIGN1cnJlbnQgc3R5bGUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9pc3N1ZXMvMzY3N1xuICAgIC8vIEhBQ0s6IEludGVybmFsIEFQSSBhY2Nlc3Mgc2luY2UgaXQncyBhd2t3YXJkIHRvIGV4cG9zZSB0aGlzIGluIHRoZSBBUEkgYW5kIHNlcmlhbGl6ZSB3aWxsXG4gICAgLy8gbGlrZWx5IGJlIHRoZSBvbmx5IGNvbnN1bWVyXG4gICAgY29uc3QgY3VyQXR0ckRhdGE6IElBdHRyaWJ1dGVEYXRhID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX2lucHV0SGFuZGxlci5fY3VyQXR0ckRhdGE7XG4gICAgY29uc3Qgc2dyU2VxID0gdGhpcy5fZGlmZlN0eWxlKGN1ckF0dHJEYXRhLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgaWYgKHNnclNlcS5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7c2dyU2VxLmpvaW4oJzsnKX1tYDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplQWRkb24gaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElTZXJpYWxpemVBcGkge1xuICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIHRoaXMuX3Rlcm1pbmFsID0gdGVybWluYWw7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGVybWluYWw6IFRlcm1pbmFsLCBidWZmZXI6IElCdWZmZXIsIHNjcm9sbGJhY2s/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1heFJvd3MgPSBidWZmZXIubGVuZ3RoO1xuICAgIGNvbnN0IGNvcnJlY3RSb3dzID0gKHNjcm9sbGJhY2sgPT09IHVuZGVmaW5lZCkgPyBtYXhSb3dzIDogY29uc3RyYWluKHNjcm9sbGJhY2sgKyB0ZXJtaW5hbC5yb3dzLCAwLCBtYXhSb3dzKTtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0ZXJtaW5hbCwgYnVmZmVyLCB7XG4gICAgICBzdGFydDogbWF4Um93cyAtIGNvcnJlY3RSb3dzLFxuICAgICAgZW5kOiBtYXhSb3dzIC0gMVxuICAgIH0sIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UodGVybWluYWw6IFRlcm1pbmFsLCBidWZmZXI6IElCdWZmZXIsIHJhbmdlOiBJU2VyaWFsaXplUmFuZ2UsIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IFN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIoYnVmZmVyLCB0ZXJtaW5hbCk7XG4gICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKHtcbiAgICAgIHN0YXJ0OiB7IHg6IDAsICAgICAgICAgICAgIHk6IHR5cGVvZiByYW5nZS5zdGFydCA9PT0gJ251bWJlcicgPyByYW5nZS5zdGFydCA6IHJhbmdlLnN0YXJ0LmxpbmUgfSxcbiAgICAgIGVuZDogICB7IHg6IHRlcm1pbmFsLmNvbHMsIHk6IHR5cGVvZiByYW5nZS5lbmQgICA9PT0gJ251bWJlcicgPyByYW5nZS5lbmQgICA6IHJhbmdlLmVuZC5saW5lICAgfVxuICAgIH0sIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCh0ZXJtaW5hbDogVGVybWluYWwsIG9wdGlvbnM6IFBhcnRpYWw8SUhUTUxTZXJpYWxpemVPcHRpb25zPik6IHN0cmluZyB7XG4gICAgY29uc3QgYnVmZmVyID0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEhUTUxTZXJpYWxpemVIYW5kbGVyKGJ1ZmZlciwgdGVybWluYWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IG9ubHlTZWxlY3Rpb24gPSBvcHRpb25zLm9ubHlTZWxlY3Rpb24gPz8gZmFsc2U7XG4gICAgaWYgKCFvbmx5U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBtYXhSb3dzID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNjcm9sbGJhY2sgPSBvcHRpb25zLnNjcm9sbGJhY2s7XG4gICAgICBjb25zdCBjb3JyZWN0Um93cyA9IChzY3JvbGxiYWNrID09PSB1bmRlZmluZWQpID8gbWF4Um93cyA6IGNvbnN0cmFpbihzY3JvbGxiYWNrICsgdGVybWluYWwucm93cywgMCwgbWF4Um93cyk7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiAwLCAgICAgICAgICAgICB5OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogbWF4Um93cyAtIDEgICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX3Rlcm1pbmFsPy5nZXRTZWxlY3Rpb25Qb3NpdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKHtcbiAgICAgICAgc3RhcnQ6IHsgeDogc2VsZWN0aW9uLnN0YXJ0LngsIHk6IHNlbGVjdGlvbi5zdGFydC55IH0sXG4gICAgICAgIGVuZDogICB7IHg6IHNlbGVjdGlvbi5lbmQueCwgICB5OiBzZWxlY3Rpb24uZW5kLnkgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVNb2Rlcyh0ZXJtaW5hbDogVGVybWluYWwpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgY29uc3QgbW9kZXMgPSB0ZXJtaW5hbC5tb2RlcztcblxuICAgIC8vIERlZmF1bHQ6IGZhbHNlXG4gICAgaWYgKG1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xaCc7XG4gICAgaWYgKG1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzY2aCc7XG4gICAgaWYgKG1vZGVzLmJyYWNrZXRlZFBhc3RlTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzIwMDRoJztcbiAgICBpZiAobW9kZXMuaW5zZXJ0TW9kZSkgY29udGVudCArPSAnXFx4MWJbNGgnO1xuICAgIGlmIChtb2Rlcy5vcmlnaW5Nb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NmgnO1xuICAgIGlmIChtb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZE1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz80NWgnO1xuICAgIGlmIChtb2Rlcy5zZW5kRm9jdXNNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MTAwNGgnO1xuXG4gICAgLy8gRGVmYXVsdDogdHJ1ZVxuICAgIGlmIChtb2Rlcy53cmFwYXJvdW5kTW9kZSA9PT0gZmFsc2UpIGNvbnRlbnQgKz0gJ1xceDFiWz83bCc7XG5cbiAgICAvLyBEZWZhdWx0OiAnbm9uZSdcbiAgICBpZiAobW9kZXMubW91c2VUcmFja2luZ01vZGUgIT09ICdub25lJykge1xuICAgICAgc3dpdGNoIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSkge1xuICAgICAgICBjYXNlICd4MTAnOiBjb250ZW50ICs9ICdcXHgxYls/OWgnOyBicmVhaztcbiAgICAgICAgY2FzZSAndnQyMDAnOiBjb250ZW50ICs9ICdcXHgxYls/MTAwMGgnOyBicmVhaztcbiAgICAgICAgY2FzZSAnZHJhZyc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAyaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdhbnknOiBjb250ZW50ICs9ICdcXHgxYls/MTAwM2gnOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemUob3B0aW9ucz86IElTZXJpYWxpemVPcHRpb25zKTogc3RyaW5nIHtcbiAgICAvLyBUT0RPOiBBZGQgY29tYmluZWREYXRhIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYWRkb24gdW50aWwgaXQgaGFzIGJlZW4gbG9hZGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsIGJ1ZmZlclxuICAgIGxldCBjb250ZW50ID0gb3B0aW9ucz8ucmFuZ2VcbiAgICAgID8gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0aGlzLl90ZXJtaW5hbCwgdGhpcy5fdGVybWluYWwuYnVmZmVyLm5vcm1hbCwgb3B0aW9ucy5yYW5nZSwgdHJ1ZSlcbiAgICAgIDogdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zPy5zY3JvbGxiYWNrKTtcblxuICAgIC8vIEFsdGVybmF0ZSBidWZmZXJcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVBbHRCdWZmZXIpIHtcbiAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnR5cGUgPT09ICdhbHRlcm5hdGUnKSB7XG4gICAgICAgIGNvbnN0IGFsdGVybmF0aXZlU2NyZWVuQ29udGVudCA9IHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0aGlzLl90ZXJtaW5hbCwgdGhpcy5fdGVybWluYWwuYnVmZmVyLmFsdGVybmF0ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgY29udGVudCArPSBgXFx1MDAxYls/MTA0OWhcXHUwMDFiW0gke2FsdGVybmF0aXZlU2NyZWVuQ29udGVudH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1vZGVzXG4gICAgaWYgKCFvcHRpb25zPy5leGNsdWRlTW9kZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gdGhpcy5fc2VyaWFsaXplTW9kZXModGhpcy5fdGVybWluYWwpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZUFzSFRNTChvcHRpb25zPzogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYWRkb24gdW50aWwgaXQgaGFzIGJlZW4gbG9hZGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCh0aGlzLl90ZXJtaW5hbCwgb3B0aW9ucyB8fCB7fSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHsgfVxufVxuXG5leHBvcnQgY2xhc3MgSFRNTFNlcmlhbGl6ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlU2VyaWFsaXplSGFuZGxlciB7XG4gIHByaXZhdGUgX2N1cnJlbnRSb3c6IHN0cmluZyA9ICcnO1xuXG4gIHByaXZhdGUgX2h0bWxDb250ZW50ID0gJyc7XG5cbiAgcHJpdmF0ZSBfYW5zaUNvbG9yczogUmVhZG9ubHk8SUNvbG9yW10+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1ZmZlcjogSUJ1ZmZlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+XG4gICkge1xuICAgIHN1cGVyKGJ1ZmZlcik7XG5cbiAgICAvLyBGb3IgeHRlcm0gaGVhZGxlc3M6IGZhbGxiYWNrIHRvIGFuc2kgY29sb3JzXG4gICAgaWYgKChfdGVybWluYWwgYXMgYW55KS5fY29yZS5fdGhlbWVTZXJ2aWNlKSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2k7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fYW5zaUNvbG9ycyA9IERFRkFVTFRfQU5TSV9DT0xPUlM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFkU3RhcnQodGFyZ2V0OiBzdHJpbmcsIHRhcmdldExlbmd0aDogbnVtYmVyLCBwYWRTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0TGVuZ3RoID4+IDA7XG4gICAgcGFkU3RyaW5nID0gcGFkU3RyaW5nID8/ICcgJztcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA+IHRhcmdldExlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICB0YXJnZXRMZW5ndGggLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICBpZiAodGFyZ2V0TGVuZ3RoID4gcGFkU3RyaW5nLmxlbmd0aCkge1xuICAgICAgcGFkU3RyaW5nICs9IHBhZFN0cmluZy5yZXBlYXQodGFyZ2V0TGVuZ3RoIC8gcGFkU3RyaW5nLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBwYWRTdHJpbmcuc2xpY2UoMCwgdGFyZ2V0TGVuZ3RoKSArIHRhcmdldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYmVmb3JlU2VyaWFsaXplKHJvd3M6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPGh0bWw+PGJvZHk+PCEtLVN0YXJ0RnJhZ21lbnQtLT48cHJlPic7XG5cbiAgICBsZXQgZm9yZWdyb3VuZCA9ICcjMDAwMDAwJztcbiAgICBsZXQgYmFja2dyb3VuZCA9ICcjZmZmZmZmJztcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pbmNsdWRlR2xvYmFsQmFja2dyb3VuZCA/PyBmYWxzZSkge1xuICAgICAgZm9yZWdyb3VuZCA9IHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMudGhlbWU/LmZvcmVncm91bmQgPz8gJyNmZmZmZmYnO1xuICAgICAgYmFja2dyb3VuZCA9IHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMudGhlbWU/LmJhY2tncm91bmQgPz8gJyMwMDAwMDAnO1xuICAgIH1cblxuICAgIGNvbnN0IGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMgPSBbXTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2NvbG9yOiAnICsgZm9yZWdyb3VuZCArICc7Jyk7XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdiYWNrZ3JvdW5kLWNvbG9yOiAnICsgYmFja2dyb3VuZCArICc7Jyk7XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdmb250LWZhbWlseTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udEZhbWlseSArICc7Jyk7XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdmb250LXNpemU6ICcgKyB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLmZvbnRTaXplICsgJ3B4OycpO1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2IHN0eWxlPVxcJycgKyBnbG9iYWxTdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgfVxuXG4gIHByb3RlY3RlZCBfYWZ0ZXJTZXJpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzwvZGl2Pic7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzwvcHJlPjwhLS1FbmRGcmFnbWVudC0tPjwvYm9keT48L2h0bWw+JztcbiAgfVxuXG4gIHByb3RlY3RlZCBfcm93RW5kKHJvdzogbnVtYmVyLCBpc0xhc3RSb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPGRpdj48c3Bhbj4nICsgdGhpcy5fY3VycmVudFJvdyArICc8L3NwYW4+PC9kaXY+JztcbiAgICB0aGlzLl9jdXJyZW50Um93ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIZXhDb2xvcihjZWxsOiBJQnVmZmVyQ2VsbCwgaXNGZzogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29sb3IgPSBpc0ZnID8gY2VsbC5nZXRGZ0NvbG9yKCkgOiBjZWxsLmdldEJnQ29sb3IoKTtcbiAgICBpZiAoaXNGZyA/IGNlbGwuaXNGZ1JHQigpIDogY2VsbC5pc0JnUkdCKCkpIHtcbiAgICAgIGNvbnN0IHJnYiA9IFtcbiAgICAgICAgKGNvbG9yID4+IDE2KSAmIDI1NSxcbiAgICAgICAgKGNvbG9yID4+ICA4KSAmIDI1NSxcbiAgICAgICAgKGNvbG9yICAgICAgKSAmIDI1NVxuICAgICAgXTtcbiAgICAgIHJldHVybiAnIycgKyByZ2IubWFwKHggPT4gdGhpcy5fcGFkU3RhcnQoeC50b1N0cmluZygxNiksIDIsICcwJykpLmpvaW4oJycpO1xuICAgIH1cbiAgICBpZiAoaXNGZyA/IGNlbGwuaXNGZ1BhbGV0dGUoKSA6IGNlbGwuaXNCZ1BhbGV0dGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Fuc2lDb2xvcnNbY29sb3JdLmNzcztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX2RpZmZTdHlsZShjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29udGVudDogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IGZnQ2hhbmdlZCA9ICFlcXVhbEZnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGJnQ2hhbmdlZCA9ICFlcXVhbEJnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGZsYWdzQ2hhbmdlZCA9ICFlcXVhbEZsYWdzKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgaWYgKGZnQ2hhbmdlZCB8fCBiZ0NoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICBjb25zdCBmZ0hleENvbG9yID0gdGhpcy5fZ2V0SGV4Q29sb3IoY2VsbCwgdHJ1ZSk7XG4gICAgICBpZiAoZmdIZXhDb2xvcikge1xuICAgICAgICBjb250ZW50LnB1c2goJ2NvbG9yOiAnICsgZmdIZXhDb2xvciArICc7Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCBmYWxzZSk7XG4gICAgICBpZiAoYmdIZXhDb2xvcikge1xuICAgICAgICBjb250ZW50LnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNJbnZlcnNlKCkpIHsgY29udGVudC5wdXNoKCdjb2xvcjogIzAwMDAwMDsgYmFja2dyb3VuZC1jb2xvcjogI0JGQkZCRjsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNCb2xkKCkpIHsgY29udGVudC5wdXNoKCdmb250LXdlaWdodDogYm9sZDsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSAmJiBjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUgdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzVW5kZXJsaW5lKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsnKTsgfVxuICAgICAgZWxzZSBpZiAoY2VsbC5pc092ZXJsaW5lKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JsaW5rKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IGJsaW5rOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpKSB7IGNvbnRlbnQucHVzaCgndmlzaWJpbGl0eTogaGlkZGVuOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0l0YWxpYygpKSB7IGNvbnRlbnQucHVzaCgnZm9udC1zdHlsZTogaXRhbGljOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0RpbSgpKSB7IGNvbnRlbnQucHVzaCgnb3BhY2l0eTogMC41OycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1N0cmlrZXRocm91Z2goKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOycpOyB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25leHRDZWxsKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYSB3aWR0aCAwIGNlbGwgZG9uJ3QgbmVlZCB0byBiZSBjb3VudCBiZWNhdXNlIGl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhZnRlciBhIENKSyBjaGFyYWN0ZXI7XG4gICAgY29uc3QgaXNQbGFjZUhvbGRlckNlbGwgPSBjZWxsLmdldFdpZHRoKCkgPT09IDA7XG4gICAgaWYgKGlzUGxhY2VIb2xkZXJDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjZWxsIGRvbid0IGhhdmUgY29udGVudFxuICAgIGNvbnN0IGlzRW1wdHlDZWxsID0gY2VsbC5nZXRDaGFycygpID09PSAnJztcblxuICAgIGNvbnN0IHN0eWxlRGVmaW5pdGlvbnMgPSB0aGlzLl9kaWZmU3R5bGUoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICAvLyBoYW5kbGVzIHN0eWxlIGNoYW5nZVxuICAgIGlmIChzdHlsZURlZmluaXRpb25zKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IHN0eWxlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwID9cbiAgICAgICAgJzwvc3Bhbj48c3Bhbj4nIDpcbiAgICAgICAgJzwvc3Bhbj48c3BhbiBzdHlsZT1cXCcnICsgc3R5bGVEZWZpbml0aW9ucy5qb2luKCcgJykgKyAnXFwnPic7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlcyBhY3R1YWwgY29udGVudFxuICAgIGlmIChpc0VtcHR5Q2VsbCkge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gY2VsbC5nZXRDaGFycygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWxDb250ZW50O1xuICB9XG59XG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTZXJpYWxpemVBZGRvblwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTZXJpYWxpemVBZGRvblwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsICgpID0+IHtcbnJldHVybiAiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUd29LZXlNYXAgfSBmcm9tICdjb21tb24vTXVsdGlLZXlNYXAnO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JDb250cmFzdENhY2hlIGltcGxlbWVudHMgSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gIHByaXZhdGUgX2NvbG9yOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBJQ29sb3IgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcbiAgcHJpdmF0ZSBfY3NzOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBzdHJpbmcgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0Q3NzKGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY3NzLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jc3MuZ2V0KGJnLCBmZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IElDb2xvciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5zZXQoYmcsIGZnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IElDb2xvciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb2xvci5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5jbGVhcigpO1xuICAgIHRoaXMuX2Nzcy5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlJztcbmltcG9ydCB7IElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUsIElDb2xvclNldCwgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yLCBjc3MsIE5VTExfQ09MT1IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJT3B0aW9uc1NlcnZpY2UsIElUaGVtZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBBbGxDb2xvckluZGV4LCBJQ29sb3IsIFNwZWNpYWxDb2xvckluZGV4IH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuaW50ZXJmYWNlIElSZXN0b3JlQ29sb3JTZXQge1xuICBmb3JlZ3JvdW5kOiBJQ29sb3I7XG4gIGJhY2tncm91bmQ6IElDb2xvcjtcbiAgY3Vyc29yOiBJQ29sb3I7XG4gIGFuc2k6IElDb2xvcltdO1xufVxuXG5cbmNvbnN0IERFRkFVTFRfRk9SRUdST1VORCA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0JBQ0tHUk9VTkQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9DVVJTT1IgPSBjc3MudG9Db2xvcignI2ZmZmZmZicpO1xuY29uc3QgREVGQVVMVF9DVVJTT1JfQUNDRU5UID0gY3NzLnRvQ29sb3IoJyMwMDAwMDAnKTtcbmNvbnN0IERFRkFVTFRfU0VMRUNUSU9OID0ge1xuICBjc3M6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyknLFxuICByZ2JhOiAweEZGRkZGRjREXG59O1xuXG4vLyBBbiBJSUZFIHRvIGdlbmVyYXRlIERFRkFVTFRfQU5TSV9DT0xPUlMuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTlNJX0NPTE9SUyA9IE9iamVjdC5mcmVlemUoKCgpID0+IHtcbiAgY29uc3QgY29sb3JzID0gW1xuICAgIC8vIGRhcms6XG4gICAgY3NzLnRvQ29sb3IoJyMyZTM0MzYnKSxcbiAgICBjc3MudG9Db2xvcignI2NjMDAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNGU5YTA2JyksXG4gICAgY3NzLnRvQ29sb3IoJyNjNGEwMDAnKSxcbiAgICBjc3MudG9Db2xvcignIzM0NjVhNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNzU1MDdiJyksXG4gICAgY3NzLnRvQ29sb3IoJyMwNjk4OWEnKSxcbiAgICBjc3MudG9Db2xvcignI2QzZDdjZicpLFxuICAgIC8vIGJyaWdodDpcbiAgICBjc3MudG9Db2xvcignIzU1NTc1MycpLFxuICAgIGNzcy50b0NvbG9yKCcjZWYyOTI5JyksXG4gICAgY3NzLnRvQ29sb3IoJyM4YWUyMzQnKSxcbiAgICBjc3MudG9Db2xvcignI2ZjZTk0ZicpLFxuICAgIGNzcy50b0NvbG9yKCcjNzI5ZmNmJyksXG4gICAgY3NzLnRvQ29sb3IoJyNhZDdmYTgnKSxcbiAgICBjc3MudG9Db2xvcignIzM0ZTJlMicpLFxuICAgIGNzcy50b0NvbG9yKCcjZWVlZWVjJylcbiAgXTtcblxuICAvLyBGaWxsIGluIHRoZSByZW1haW5pbmcgMjQwIEFOU0kgY29sb3JzLlxuICAvLyBHZW5lcmF0ZSBjb2xvcnMgKDE2LTIzMSlcbiAgY29uc3QgdiA9IFsweDAwLCAweDVmLCAweDg3LCAweGFmLCAweGQ3LCAweGZmXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMTY7IGkrKykge1xuICAgIGNvbnN0IHIgPSB2WyhpIC8gMzYpICUgNiB8IDBdO1xuICAgIGNvbnN0IGcgPSB2WyhpIC8gNikgJSA2IHwgMF07XG4gICAgY29uc3QgYiA9IHZbaSAlIDZdO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYilcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGdyZXlzICgyMzItMjU1KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICBjb25zdCBjID0gOCArIGkgKiAxMDtcbiAgICBjb2xvcnMucHVzaCh7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKGMsIGMsIGMpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKGMsIGMsIGMpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufSkoKSk7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVRoZW1lU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9jb2xvcnM6IElDb2xvclNldDtcbiAgcHJpdmF0ZSBfY29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfaGFsZkNvbnRyYXN0Q2FjaGU6IElDb2xvckNvbnRyYXN0Q2FjaGUgPSBuZXcgQ29sb3JDb250cmFzdENhY2hlKCk7XG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcnMhOiBJUmVzdG9yZUNvbG9yU2V0O1xuXG4gIHB1YmxpYyBnZXQgY29sb3JzKCk6IFJlYWRvbmx5Q29sb3JTZXQgeyByZXR1cm4gdGhpcy5fY29sb3JzOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2VDb2xvcnMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8UmVhZG9ubHlDb2xvclNldD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZUNvbG9ycyA9IHRoaXMuX29uQ2hhbmdlQ29sb3JzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29sb3JzID0ge1xuICAgICAgZm9yZWdyb3VuZDogREVGQVVMVF9GT1JFR1JPVU5ELFxuICAgICAgYmFja2dyb3VuZDogREVGQVVMVF9CQUNLR1JPVU5ELFxuICAgICAgY3Vyc29yOiBERUZBVUxUX0NVUlNPUixcbiAgICAgIGN1cnNvckFjY2VudDogREVGQVVMVF9DVVJTT1JfQUNDRU5ULFxuICAgICAgc2VsZWN0aW9uRm9yZWdyb3VuZDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50OiBERUZBVUxUX1NFTEVDVElPTixcbiAgICAgIHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOiBjb2xvci5ibGVuZChERUZBVUxUX0JBQ0tHUk9VTkQsIERFRkFVTFRfU0VMRUNUSU9OKSxcbiAgICAgIGFuc2k6IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKSxcbiAgICAgIGNvbnRyYXN0Q2FjaGU6IHRoaXMuX2NvbnRyYXN0Q2FjaGUsXG4gICAgICBoYWxmQ29udHJhc3RDYWNoZTogdGhpcy5faGFsZkNvbnRyYXN0Q2FjaGVcbiAgICB9O1xuICAgIHRoaXMuX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTtcbiAgICB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnbWluaW11bUNvbnRyYXN0UmF0aW8nLCAoKSA9PiB0aGlzLl9jb250cmFzdENhY2hlLmNsZWFyKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ3RoZW1lJywgKCkgPT4gdGhpcy5fc2V0VGhlbWUodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy50aGVtZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXJtaW5hbCdzIHRoZW1lLlxuICAgKiBAcGFyYW0gdGhlbWUgVGhlICB0aGVtZSB0byB1c2UuIElmIGEgcGFydGlhbCB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGRlZmF1bHRcbiAgICogY29sb3JzIHdpbGwgYmUgdXNlZCB3aGVyZSBjb2xvcnMgYXJlIG5vdCBkZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0VGhlbWUodGhlbWU6IElUaGVtZSA9IHt9KTogdm9pZCB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5fY29sb3JzO1xuICAgIGNvbG9ycy5mb3JlZ3JvdW5kID0gcGFyc2VDb2xvcih0aGVtZS5mb3JlZ3JvdW5kLCBERUZBVUxUX0ZPUkVHUk9VTkQpO1xuICAgIGNvbG9ycy5iYWNrZ3JvdW5kID0gcGFyc2VDb2xvcih0aGVtZS5iYWNrZ3JvdW5kLCBERUZBVUxUX0JBQ0tHUk9VTkQpO1xuICAgIGNvbG9ycy5jdXJzb3IgPSBwYXJzZUNvbG9yKHRoZW1lLmN1cnNvciwgREVGQVVMVF9DVVJTT1IpO1xuICAgIGNvbG9ycy5jdXJzb3JBY2NlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLmN1cnNvckFjY2VudCwgREVGQVVMVF9DVVJTT1JfQUNDRU5UKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25CYWNrZ3JvdW5kLCBERUZBVUxUX1NFTEVDVElPTik7XG4gICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgPSBjb2xvci5ibGVuZChjb2xvcnMuYmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQsIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUgPSBjb2xvci5ibGVuZChjb2xvcnMuYmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHRoZW1lLnNlbGVjdGlvbkZvcmVncm91bmQgPyBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkZvcmVncm91bmQsIE5VTExfQ09MT1IpIDogdW5kZWZpbmVkO1xuICAgIGlmIChjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9PT0gTlVMTF9DT0xPUikge1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgc2VsZWN0aW9uIGNvbG9yIGlzIG9wYXF1ZSwgYmxlbmQgaXQgd2l0aCBiYWNrZ3JvdW5kIHdpdGggMC4zIG9wYWNpdHlcbiAgICAgKiBJc3N1ZSAjMjczN1xuICAgICAqL1xuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KSkge1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IDAuMztcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBjb2xvci5vcGFjaXR5KGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBpZiAoY29sb3IuaXNPcGFxdWUoY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KSkge1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IDAuMztcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50LCBvcGFjaXR5KTtcbiAgICB9XG4gICAgY29sb3JzLmFuc2kgPSBERUZBVUxUX0FOU0lfQ09MT1JTLnNsaWNlKCk7XG4gICAgY29sb3JzLmFuc2lbMF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsYWNrLCBERUZBVUxUX0FOU0lfQ09MT1JTWzBdKTtcbiAgICBjb2xvcnMuYW5zaVsxXSA9IHBhcnNlQ29sb3IodGhlbWUucmVkLCBERUZBVUxUX0FOU0lfQ09MT1JTWzFdKTtcbiAgICBjb2xvcnMuYW5zaVsyXSA9IHBhcnNlQ29sb3IodGhlbWUuZ3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMl0pO1xuICAgIGNvbG9ycy5hbnNpWzNdID0gcGFyc2VDb2xvcih0aGVtZS55ZWxsb3csIERFRkFVTFRfQU5TSV9DT0xPUlNbM10pO1xuICAgIGNvbG9ycy5hbnNpWzRdID0gcGFyc2VDb2xvcih0aGVtZS5ibHVlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzRdKTtcbiAgICBjb2xvcnMuYW5zaVs1XSA9IHBhcnNlQ29sb3IodGhlbWUubWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1s1XSk7XG4gICAgY29sb3JzLmFuc2lbNl0gPSBwYXJzZUNvbG9yKHRoZW1lLmN5YW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbNl0pO1xuICAgIGNvbG9ycy5hbnNpWzddID0gcGFyc2VDb2xvcih0aGVtZS53aGl0ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1s3XSk7XG4gICAgY29sb3JzLmFuc2lbOF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEJsYWNrLCBERUZBVUxUX0FOU0lfQ09MT1JTWzhdKTtcbiAgICBjb2xvcnMuYW5zaVs5XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0UmVkLCBERUZBVUxUX0FOU0lfQ09MT1JTWzldKTtcbiAgICBjb2xvcnMuYW5zaVsxMF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEdyZWVuLCBERUZBVUxUX0FOU0lfQ09MT1JTWzEwXSk7XG4gICAgY29sb3JzLmFuc2lbMTFdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRZZWxsb3csIERFRkFVTFRfQU5TSV9DT0xPUlNbMTFdKTtcbiAgICBjb2xvcnMuYW5zaVsxMl0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTJdKTtcbiAgICBjb2xvcnMuYW5zaVsxM10gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodE1hZ2VudGEsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTNdKTtcbiAgICBjb2xvcnMuYW5zaVsxNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodEN5YW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTRdKTtcbiAgICBjb2xvcnMuYW5zaVsxNV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFdoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzE1XSk7XG4gICAgaWYgKHRoZW1lLmV4dGVuZGVkQW5zaSkge1xuICAgICAgY29uc3QgY29sb3JDb3VudCA9IE1hdGgubWluKGNvbG9ycy5hbnNpLmxlbmd0aCAtIDE2LCB0aGVtZS5leHRlbmRlZEFuc2kubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbG9ycy5hbnNpW2kgKyAxNl0gPSBwYXJzZUNvbG9yKHRoZW1lLmV4dGVuZGVkQW5zaVtpXSwgREVGQVVMVF9BTlNJX0NPTE9SU1tpICsgMTZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYXIgb3VyIHRoZSBjYWNoZVxuICAgIHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlQ29sb3Ioc2xvdD86IEFsbENvbG9ySW5kZXgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlQ29sb3Ioc2xvdCk7XG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF9yZXN0b3JlQ29sb3Ioc2xvdDogQWxsQ29sb3JJbmRleCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIHVuc2V0IHNsb3QgcmVzdG9yZXMgYWxsIGFuc2kgY29sb3JzXG4gICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2kubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5fY29sb3JzLmFuc2lbaV0gPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbaV07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoc2xvdCkge1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EOlxuICAgICAgICB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuZm9yZWdyb3VuZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkJBQ0tHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SOlxuICAgICAgICB0aGlzLl9jb2xvcnMuY3Vyc29yID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5jdXJzb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmFuc2lbc2xvdF0gPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbc2xvdF07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vZGlmeUNvbG9ycyhjYWxsYmFjazogKGNvbG9yczogSUNvbG9yU2V0KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY2FsbGJhY2sodGhpcy5fY29sb3JzKTtcbiAgICAvLyBBc3N1bWUgdGhlIGNoYW5nZSBoYXBwZW5lZFxuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmVzdG9yZUNvbG9ycygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlQ29sb3JzID0ge1xuICAgICAgZm9yZWdyb3VuZDogdGhpcy5fY29sb3JzLmZvcmVncm91bmQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLl9jb2xvcnMuYmFja2dyb3VuZCxcbiAgICAgIGN1cnNvcjogdGhpcy5fY29sb3JzLmN1cnNvcixcbiAgICAgIGFuc2k6IHRoaXMuX2NvbG9ycy5hbnNpLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29sb3IoXG4gIGNzc1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFjazogSUNvbG9yXG4pOiBJQ29sb3Ige1xuICBpZiAoY3NzU3RyaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNzcy50b0NvbG9yKGNzc1N0cmluZyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBuby1vcFxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvciwgSUNvbG9yUkdCIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxubGV0ICRyID0gMDtcbmxldCAkZyA9IDA7XG5sZXQgJGIgPSAwO1xubGV0ICRhID0gMDtcblxuZXhwb3J0IGNvbnN0IE5VTExfQ09MT1I6IElDb2xvciA9IHtcbiAgY3NzOiAnIzAwMDAwMDAwJyxcbiAgcmdiYTogMFxufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNoYW5uZWxzXCIgKGluZGl2aWR1YWwgY29sb3IgY2hhbm5lbHMgYXMgbnVtYmVycykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY2hhbm5lbHMge1xuICBleHBvcnQgZnVuY3Rpb24gdG9Dc3MocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9JHt0b1BhZGRlZEhleChhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvUmdiYShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAweEZGKTogbnVtYmVyIHtcbiAgICAvLyBOb3RlOiBUaGUgYWdncmVnYXRlZCBudW1iZXIgaXMgUkdCQTMyIChCRSksIHRodXMgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIEFCR1IzMlxuICAgIC8vIG9uIExFIHN5c3RlbXMsIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0IDMyLWJpdCBidWZmZXIgd3JpdGVzLlxuICAgIC8vID4+PiAwIGZvcmNlcyBhbiB1bnNpZ25lZCBpbnRcbiAgICByZXR1cm4gKHIgPDwgMjQgfCBnIDw8IDE2IHwgYiA8PCA4IHwgYSkgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogSUNvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiLCBhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiLCBhKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBgSUNvbG9yYC5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjb2xvciB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogSUNvbG9yLCBmZzogSUNvbG9yKTogSUNvbG9yIHtcbiAgICAkYSA9IChmZy5yZ2JhICYgMHhGRikgLyAyNTU7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjc3M6IGZnLmNzcyxcbiAgICAgICAgcmdiYTogZmcucmdiYVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIGNvbnN0IGNzcyA9IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpO1xuICAgIGNvbnN0IHJnYmEgPSBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gICAgcmV0dXJuIHsgY3NzLCByZ2JhIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNPcGFxdWUoY29sb3I6IElDb2xvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY29sb3IucmdiYSAmIDB4RkYpID09PSAweEZGO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmc6IElDb2xvciwgZmc6IElDb2xvciwgcmF0aW86IG51bWJlcik6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYS5lbnN1cmVDb250cmFzdFJhdGlvKGJnLnJnYmEsIGZnLnJnYmEsIHJhdGlvKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAocmVzdWx0ID4+IDI0ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDE2ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDggICYgMHhGRilcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZShjb2xvcjogSUNvbG9yKTogSUNvbG9yIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSAoY29sb3IucmdiYSB8IDB4RkYpID4+PiAwO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhyZ2JhQ29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpLFxuICAgICAgcmdiYTogcmdiYUNvbG9yXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFjaXR5KGNvbG9yOiBJQ29sb3IsIG9wYWNpdHk6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAweEZGKTtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMoY29sb3IucmdiYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKVxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlPcGFjaXR5KGNvbG9yOiBJQ29sb3IsIGZhY3RvcjogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IGNvbG9yLnJnYmEgJiAweEZGO1xuICAgIHJldHVybiBvcGFjaXR5KGNvbG9yLCAoJGEgKiBmYWN0b3IpIC8gMHhGRik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvclJHQihjb2xvcjogSUNvbG9yKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gWyhjb2xvci5yZ2JhID4+IDI0KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDE2KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDgpICYgMHhGRl07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNzc1wiIChzdHJpbmc6ICcjcmdiJywgJyNyZ2JhJywgJyNycmdnYmInLFxuICogJyNycmdnYmJhYScpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNzcyB7XG4gIC8vIEF0dGVtcHQgdG8gc2V0IGdldCB0aGUgc2hhcmVkIGNhbnZhcyBjb250ZXh0XG4gIGxldCAkY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCB1bmRlZmluZWQ7XG4gIGxldCAkbGl0bXVzQ29sb3I6IENhbnZhc0dyYWRpZW50IHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gdGhlIGZpcnN0IHdpbmRvdywgc28gZG9jdW1lbnQgc2hvdWxkIGJlIGNvcnJlY3RcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjdHgpIHtcbiAgICAgICRjdHggPSBjdHg7XG4gICAgICAkY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICAgICRsaXRtdXNDb2xvciA9ICRjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMSwgMSk7XG4gICAgfVxuICB9XG4gIGNhdGNoIHtcbiAgICAvLyBub29wXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjc3Mgc3RyaW5nIHRvIGFuIElDb2xvciwgdGhpcyBzaG91bGQgaGFuZGxlIGFsbCB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgd2lsbFxuICAgKiB0aHJvdyBpZiBpdCdzIGludmFsaWQuIFRoZSBpZGVhbCBmb3JtYXQgdG8gdXNlIGlzIGAjcnJnZ2JiW2FhXWAgYXMgaXQncyB0aGUgZmFzdGVzdCB0byBwYXJzZS5cbiAgICpcbiAgICogT25seSBgI3JnYlthXWAsIGAjcnJnZ2JiW2FhXWAsIGByZ2IoKWAgYW5kIGByZ2JhKClgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCB3aGVuIHJ1biBpbiBhIE5vZGVcbiAgICogZW52aXJvbm1lbnQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihjc3M6IHN0cmluZyk6IElDb2xvciB7XG4gICAgLy8gRm9ybWF0czogI3JnYlthXSBhbmQgI3JyZ2diYlthYV1cbiAgICBpZiAoY3NzLm1hdGNoKC8jW1xcZGEtZl17Myw4fS9pKSkge1xuICAgICAgc3dpdGNoIChjc3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgNDogeyAvLyAjcmdiXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7IC8vICNyZ2JhXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGEgPSBwYXJzZUludChjc3Muc2xpY2UoNCwgNSkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzogLy8gI3JyZ2diYlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiAocGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPDwgOCB8IDB4RkYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSA5OiAvLyAjcnJnZ2JiYWFcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogcGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdHM6IHJnYigpIG9yIHJnYmEoKVxuICAgIGNvbnN0IHJnYmFNYXRjaCA9IGNzcy5tYXRjaCgvcmdiYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKigsXFxzKigwfDF8XFxkP1xcLihcXGQrKSlcXHMqKT9cXCkvKTtcbiAgICBpZiAocmdiYU1hdGNoKSB7XG4gICAgICAkciA9IHBhcnNlSW50KHJnYmFNYXRjaFsxXSk7XG4gICAgICAkZyA9IHBhcnNlSW50KHJnYmFNYXRjaFsyXSk7XG4gICAgICAkYiA9IHBhcnNlSW50KHJnYmFNYXRjaFszXSk7XG4gICAgICAkYSA9IE1hdGgucm91bmQoKHJnYmFNYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzVdKSkgKiAweEZGKTtcbiAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGV4dCBpcyBhdmFpbGFibGUgZm9yIGNhbnZhcy1iYXNlZCBjb2xvciBwYXJzaW5nXG4gICAgaWYgKCEkY3R4IHx8ICEkbGl0bXVzQ29sb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgdXNpbmcgY2FudmFzIGZpbGxTdHlsZVxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNmaWxsLWFuZC1zdHJva2Utc3R5bGVzXG4gICAgJGN0eC5maWxsU3R5bGUgPSAkbGl0bXVzQ29sb3I7XG4gICAgJGN0eC5maWxsU3R5bGUgPSBjc3M7XG4gICAgaWYgKHR5cGVvZiAkY3R4LmZpbGxTdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAkY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIFskciwgJGcsICRiLCAkYV0gPSAkY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIGlzIG5vbi10cmFuc3BhcmVudCBhcyBjb2xvciBodWUgZ2V0cyBsb3N0IHdoZW4gZHJhd24gdG8gdGhlIGNhbnZhc1xuICAgIGlmICgkYSAhPT0gMHhGRikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhlIGNvbG9yIGZyb20gdGhlIGNhbnZhcycgZmlsbFN0eWxlIHByb3BlcnR5IHdoaWNoIGV4cG9zZXMgdGhlIGNvbG9yIHZhbHVlIGluIHJnYmEoKVxuICAgIC8vIGZvcm1hdFxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNzZXJpYWxpc2F0aW9uLW9mLWEtY29sb3JcbiAgICByZXR1cm4ge1xuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIGNzc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYlwiIChudW1iZXI6IDB4cnJnZ2JiKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2Ige1xuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHJnYiBUaGUgY29sb3IgdG8gdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UocmdiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZWxhdGl2ZUx1bWluYW5jZTIoXG4gICAgICAocmdiID4+IDE2KSAmIDB4RkYsXG4gICAgICAocmdiID4+IDggKSAmIDB4RkYsXG4gICAgICAocmdiICAgICAgKSAmIDB4RkYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByIFRoZSByZWQgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBiIFRoZSBibHVlIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZTIocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcnMgPSByIC8gMjU1O1xuICAgIGNvbnN0IGdzID0gZyAvIDI1NTtcbiAgICBjb25zdCBicyA9IGIgLyAyNTU7XG4gICAgY29uc3QgcnIgPSBycyA8PSAwLjAzOTI4ID8gcnMgLyAxMi45MiA6IE1hdGgucG93KChycyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJnID0gZ3MgPD0gMC4wMzkyOCA/IGdzIC8gMTIuOTIgOiBNYXRoLnBvdygoZ3MgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByYiA9IGJzIDw9IDAuMDM5MjggPyBicyAvIDEyLjkyIDogTWF0aC5wb3coKGJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgcmV0dXJuIHJyICogMC4yMTI2ICsgcmcgKiAwLjcxNTIgKyByYiAqIDAuMDcyMjtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiYVwiIChudW1iZXI6IDB4cnJnZ2JiYWEpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYmEge1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IG51bWJlciB7XG4gICAgJGEgPSAoZmcgJiAweEZGKSAvIDB4RkY7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4gZmc7XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZyA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICByZXR1cm4gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZm9yZWdyb3VuZCBjb2xvciBhbmQgYSBiYWNrZ3JvdW5kIGNvbG9yLCBlaXRoZXIgaW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgdW50aWwgdGhlIHNwZWNpZmllZCBjb250cmFzdCByYXRpbyBpcyBtZXQuIElmIHB1cmUgd2hpdGUgb3IgYmxhY2sgaXMgaGl0XG4gICAqIHdpdGhvdXQgdGhlIGNvbnRyYXN0IHJhdGlvIGJlaW5nIG1ldCwgZ28gdGhlIG90aGVyIGRpcmVjdGlvbiB1c2luZyB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciBhbmQgdGFrZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCByZXN1bHQgZGVwZW5kaW5nIG9uIHdoaWNoIGhhcyB0aGUgaGlnaGVyXG4gICAqIGNvbnRyYXN0IHJhdGlvLlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBhbHJlYWR5IG1ldC5cbiAgICpcbiAgICogQHBhcmFtIGJnUmdiYSBUaGUgYmFja2dyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIGZnUmdiYSBUaGUgZm9yZWdyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIHJhdGlvIFRoZSBjb250cmFzdCByYXRpbyB0byBhY2hpZXZlLlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoYmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGZnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShmZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgY3IgPSBjb250cmFzdFJhdGlvKGJnTCwgZmdMKTtcbiAgICBpZiAoY3IgPCByYXRpbykge1xuICAgICAgaWYgKGZnTCA8IGJnTCkge1xuICAgICAgICBjb25zdCByZXN1bHRBID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEIgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRBO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0QSA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEIgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIHJlZHVjaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA+IDAgfHwgZmdHID4gMCB8fCBmZ0IgPiAwKSkge1xuICAgICAgLy8gUmVkdWNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnUiAqIDAuMSkpO1xuICAgICAgZmdHIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0cgKiAwLjEpKTtcbiAgICAgIGZnQiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdCICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byBpbmNyZWFzaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA8IDB4RkYgfHwgZmdHIDwgMHhGRiB8fCBmZ0IgPCAweEZGKSkge1xuICAgICAgLy8gSW5jcmVhc2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiA9IE1hdGgubWluKDB4RkYsIGZnUiArIE1hdGguY2VpbCgoMjU1IC0gZmdSKSAqIDAuMSkpO1xuICAgICAgZmdHID0gTWF0aC5taW4oMHhGRiwgZmdHICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0cpICogMC4xKSk7XG4gICAgICBmZ0IgPSBNYXRoLm1pbigweEZGLCBmZ0IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnQikgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ2hhbm5lbHModmFsdWU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gWyh2YWx1ZSA+PiAyNCkgJiAweEZGLCAodmFsdWUgPj4gMTYpICYgMHhGRiwgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYWRkZWRIZXgoYzogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGMudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gcy5sZW5ndGggPCAyID8gJzAnICsgcyA6IHM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udHJhc3QgcmF0aW8gYmV0d2VlbiB0d28gcmVsYXRpdmUgbHVtaW5hbmNlIHZhbHVlcy5cbiAqIEBwYXJhbSBsMSBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHBhcmFtIGwyIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFJhdGlvKGwxOiBudW1iZXIsIGwyOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobDEgPCBsMikge1xuICAgIHJldHVybiAobDIgKyAwLjA1KSAvIChsMSArIDAuMDUpO1xuICB9XG4gIHJldHVybiAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJTGlzdGVuZXI8VCwgVSA9IHZvaWQ+IHtcbiAgKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudDxULCBVID0gdm9pZD4ge1xuICAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiB7XG4gIGV2ZW50OiBJRXZlbnQ8VCwgVT47XG4gIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4gaW1wbGVtZW50cyBJRXZlbnRFbWl0dGVyPFQsIFU+IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICBwcml2YXRlIF9ldmVudD86IElFdmVudDxULCBVPjtcbiAgcHJpdmF0ZSBfZGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IGV2ZW50KCk6IElFdmVudDxULCBVPiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudCkge1xuICAgICAgdGhpcy5fZXZlbnQgPSAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0ge1xuICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50O1xuICB9XG5cbiAgcHVibGljIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldLmNhbGwodW5kZWZpbmVkLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZEV2ZW50PFQ+KGZyb206IElFdmVudDxUPiwgdG86IElFdmVudEVtaXR0ZXI8VD4pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmU8VD4oZXZlbnQ6IElFdmVudDxUPiwgaGFuZGxlcjogKGU6IFQgfCB1bmRlZmluZWQpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgaGFuZGxlcih1bmRlZmluZWQpO1xuICByZXR1cm4gZXZlbnQoZSA9PiBoYW5kbGVyKGUpKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZCB0byBwcm92aWRlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIG1hbmFnaW5nIHRoZSBsaWZlY3ljbGUgb2YgYW5cbiAqIG9iamVjdCBhbmQgaXRzIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcm90ZWN0ZWQgX2Rpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG4gIHByb3RlY3RlZCBfaXNEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LCB0cmlnZ2VyaW5nIHRoZSBgZGlzcG9zZWAgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElEaXNwb3NhYmxlcy5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZCBvZiB0aGlzLl9kaXNwb3NhYmxlcykge1xuICAgICAgZC5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZGlzcG9zYWJsZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkIFRoZSBkaXNwb3NhYmxlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzcG9zYWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcjxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGQ6IFQpOiBUIHtcbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKGQpO1xuICAgIHJldHVybiBkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgZGlzcG9zYWJsZSBvYmplY3QgaWYgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgaWYgbm90IGRvXG4gICAqIG5vdGhpbmcuXG4gICAqIEBwYXJhbSBkIFRoZSBkaXNwb3NhYmxlIHRvIHVucmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlcjxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGQ6IFQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2Rpc3Bvc2FibGVzLmluZGV4T2YoZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11dGFibGVEaXNwb3NhYmxlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4gaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgX3ZhbHVlPzogVDtcbiAgcHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUsIGRpc3Bvc2luZyBvZiB0aGUgb2xkIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5faXNEaXNwb3NlZCB8fCB2YWx1ZSA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc3RvcmVkIHZhbHVlIGFuZCBkaXNwb3NlcyBvZiB0aGUgcHJldmlvdXNseSBzdG9yZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gaW4gYSBkaXNwb3NhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EaXNwb3NhYmxlKGY6ICgpID0+IHZvaWQpOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6IGYgfTtcbn1cblxuLyoqXG4gKiBEaXNwb3NlIG9mIGFsbCBkaXNwb3NhYmxlcyBpbiBhbiBhcnJheSBhbmQgc2V0IGl0cyBsZW5ndGggdG8gMC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VBcnJheShkaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGQgb2YgZGlzcG9zYWJsZXMpIHtcbiAgICBkLmRpc3Bvc2UoKTtcbiAgfVxuICBkaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXNwb3NhYmxlIHRoYXQgd2lsbCBkaXNwb3NlIG9mIGFuIGFycmF5IG9mIGRpc3Bvc2FibGVzIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlKGFycmF5OiBJRGlzcG9zYWJsZVtdKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBkaXNwb3NlQXJyYXkoYXJyYXkpIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBjbGFzcyBUd29LZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogeyBbYmc6IHN0cmluZyB8IG51bWJlcl06IHsgW2ZnOiBzdHJpbmcgfCBudW1iZXJdOiBUVmFsdWUgfCB1bmRlZmluZWQgfSB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFbZmlyc3RdKSB7XG4gICAgICB0aGlzLl9kYXRhW2ZpcnN0XSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdID8gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRm91cktleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRUaGlyZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVEZvdXJ0aCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IFR3b0tleU1hcDxURmlyc3QsIFRTZWNvbmQsIFR3b0tleU1hcDxUVGhpcmQsIFRGb3VydGgsIFRWYWx1ZT4+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpKSB7XG4gICAgICB0aGlzLl9kYXRhLnNldChmaXJzdCwgc2Vjb25kLCBuZXcgVHdvS2V5TWFwKCkpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSEuc2V0KHRoaXJkLCBmb3VydGgsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKT8uZ2V0KHRoaXJkLCBmb3VydGgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBUaGlzIHdhcyBoZWF2aWx5IGluc3BpcmVkIGZyb20gbWljcm9zb2Z0L3ZzY29kZSdzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAoTUlUKS5cbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElTZXJ2aWNlSWRlbnRpZmllciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmNvbnN0IERJX1RBUkdFVCA9ICdkaSR0YXJnZXQnO1xuY29uc3QgRElfREVQRU5ERU5DSUVTID0gJ2RpJGRlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBjb25zdCBzZXJ2aWNlUmVnaXN0cnk6IE1hcDxzdHJpbmcsIElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VEZXBlbmRlbmNpZXMoY3RvcjogYW55KTogeyBpZDogSVNlcnZpY2VJZGVudGlmaWVyPGFueT4sIGluZGV4OiBudW1iZXIsIG9wdGlvbmFsOiBib29sZWFuIH1bXSB7XG4gIHJldHVybiBjdG9yW0RJX0RFUEVOREVOQ0lFU10gfHwgW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3I8VD4oaWQ6IHN0cmluZyk6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gIGlmIChzZXJ2aWNlUmVnaXN0cnkuaGFzKGlkKSkge1xuICAgIHJldHVybiBzZXJ2aWNlUmVnaXN0cnkuZ2V0KGlkKSE7XG4gIH1cblxuICBjb25zdCBkZWNvcmF0b3I6IGFueSA9IGZ1bmN0aW9uICh0YXJnZXQ6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQElTZXJ2aWNlTmFtZS1kZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWNvcmF0ZSBhIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHN0b3JlU2VydmljZURlcGVuZGVuY3koZGVjb3JhdG9yLCB0YXJnZXQsIGluZGV4KTtcbiAgfTtcblxuICBkZWNvcmF0b3IudG9TdHJpbmcgPSAoKSA9PiBpZDtcblxuICBzZXJ2aWNlUmVnaXN0cnkuc2V0KGlkLCBkZWNvcmF0b3IpO1xuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuXG5mdW5jdGlvbiBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGlkOiBGdW5jdGlvbiwgdGFyZ2V0OiBGdW5jdGlvbiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICBpZiAoKHRhcmdldCBhcyBhbnkpW0RJX1RBUkdFVF0gPT09IHRhcmdldCkge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdLnB1c2goeyBpZCwgaW5kZXggfSk7XG4gIH0gZWxzZSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10gPSBbeyBpZCwgaW5kZXggfV07XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX1RBUkdFVF0gPSB0YXJnZXQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUV2ZW50LCBJRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJRGVjUHJpdmF0ZU1vZGVzLCBJQ29yZU1vdXNlRXZlbnQsIENvcmVNb3VzZUVuY29kaW5nLCBJQ29yZU1vdXNlUHJvdG9jb2wsIENvcmVNb3VzZUV2ZW50VHlwZSwgSUNoYXJzZXQsIElXaW5kb3dPcHRpb25zLCBJTW9kZXMsIElBdHRyaWJ1dGVEYXRhLCBTY3JvbGxTb3VyY2UsIElEaXNwb3NhYmxlLCBJQ29sb3IsIEN1cnNvclN0eWxlLCBDdXJzb3JJbmFjdGl2ZVN0eWxlLCBJT3NjTGlua0RhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRGVjb3JhdG9yIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvbk9wdGlvbnMsIElEZWNvcmF0aW9uLCBJTGlua0hhbmRsZXIsIElXaW5kb3dzUHR5LCBJTG9nZ2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGNvbnN0IElCdWZmZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElCdWZmZXJTZXJ2aWNlPignQnVmZmVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQnVmZmVyU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGNvbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xuICByZWFkb25seSBidWZmZXI6IElCdWZmZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcnM6IElCdWZmZXJTZXQ7XG4gIGlzVXNlclNjcm9sbGluZzogYm9vbGVhbjtcbiAgb25SZXNpemU6IElFdmVudDx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+O1xuICBvblNjcm9sbDogSUV2ZW50PG51bWJlcj47XG4gIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ/OiBib29sZWFuKTogdm9pZDtcbiAgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbiwgc291cmNlPzogU2Nyb2xsU291cmNlKTogdm9pZDtcbiAgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlTW91c2VTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlTW91c2VTZXJ2aWNlPignQ29yZU1vdXNlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZU1vdXNlU2VydmljZSB7XG4gIGFjdGl2ZVByb3RvY29sOiBzdHJpbmc7XG4gIGFjdGl2ZUVuY29kaW5nOiBzdHJpbmc7XG4gIGFyZU1vdXNlRXZlbnRzQWN0aXZlOiBib29sZWFuO1xuICBhZGRQcm90b2NvbChuYW1lOiBzdHJpbmcsIHByb3RvY29sOiBJQ29yZU1vdXNlUHJvdG9jb2wpOiB2b2lkO1xuICBhZGRFbmNvZGluZyhuYW1lOiBzdHJpbmcsIGVuY29kaW5nOiBDb3JlTW91c2VFbmNvZGluZyk6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbW91c2UgZXZlbnQgdG8gYmUgc2VudC5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBwYXNzZWQgYWxsIHByb3RvY29sIHJlc3RyaWN0aW9ucyBhbmQgYSByZXBvcnRcbiAgICogd2FzIHNlbnQsIG90aGVyd2lzZSBmYWxzZS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlclxuICAgKiB0aGUgZGVmYXVsdCBldmVudCBhY3Rpb24gaW4gdGhlIGJvd3NlciBjb21wb25lbnQgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBtZXRob2Qgd2lsbCBjaGFuZ2UgdmFsdWVzIG9mIHRoZSBnaXZlbiBldmVudCBvYmplY3RcbiAgICogdG8gZnVsbGZpbGwgcHJvdG9jb2wgYW5kIGVuY29kaW5nIHJlc3RyaWN0aW9ucy5cbiAgICovXG4gIHRyaWdnZXJNb3VzZUV2ZW50KGV2ZW50OiBJQ29yZU1vdXNlRXZlbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0byBhbm5vdW5jZSBjaGFuZ2VzIGluIG1vdXNlIHRyYWNraW5nLlxuICAgKi9cbiAgb25Qcm90b2NvbENoYW5nZTogSUV2ZW50PENvcmVNb3VzZUV2ZW50VHlwZT47XG5cbiAgLyoqXG4gICAqIEh1bWFuIHJlYWRhYmxlIHZlcnNpb24gb2YgbW91c2UgZXZlbnRzLlxuICAgKi9cbiAgZXhwbGFpbkV2ZW50cyhldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZSk6IHsgW2V2ZW50OiBzdHJpbmddOiBib29sZWFuIH07XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVTZXJ2aWNlPignQ29yZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxseSB0aGUgY3Vyc29yIHdpbGwgbm90IGJlIHZpc2libGUgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIHRlcm1pbmFsXG4gICAqIGlzIGZvY3VzZWQuXG4gICAqL1xuICBpc0N1cnNvckluaXRpYWxpemVkOiBib29sZWFuO1xuICBpc0N1cnNvckhpZGRlbjogYm9vbGVhbjtcblxuICByZWFkb25seSBtb2RlczogSU1vZGVzO1xuICByZWFkb25seSBkZWNQcml2YXRlTW9kZXM6IElEZWNQcml2YXRlTW9kZXM7XG5cbiAgcmVhZG9ubHkgb25EYXRhOiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25Vc2VySW5wdXQ6IElFdmVudDx2b2lkPjtcbiAgcmVhZG9ubHkgb25CaW5hcnk6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblJlcXVlc3RTY3JvbGxUb0JvdHRvbTogSUV2ZW50PHZvaWQ+O1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkRhdGEgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICogQHBhcmFtIHdhc1VzZXJJbnB1dCBXaGV0aGVyIHRoZSBkYXRhIG9yaWdpbmF0ZWQgZnJvbSB0aGUgdXNlciAoYXMgb3Bwb3NlZCB0b1xuICAgKiByZXN1bHRpbmcgZnJvbSBwYXJzaW5nIGluY29taW5nIGRhdGEpLiBXaGVuIHRydWUgdGhpcyB3aWxsIGFsc286XG4gICAqIC0gU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGJ1ZmZlciBpZiBvcHRpb24gc2Nyb2xsT25Vc2VySW5wdXQgaXMgdHJ1ZS5cbiAgICogLSBGaXJlIHRoZSBgb25Vc2VySW5wdXRgIGV2ZW50IChzbyBzZWxlY3Rpb24gY2FuIGJlIGNsZWFyZWQpLlxuICAgKi9cbiAgdHJpZ2dlckRhdGFFdmVudChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dD86IGJvb2xlYW4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25CaW5hcnkgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICovXG4gIHRyaWdnZXJCaW5hcnlFdmVudChkYXRhOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNoYXJzZXRTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDaGFyc2V0U2VydmljZT4oJ0NoYXJzZXRTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDaGFyc2V0U2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBnbGV2ZWw6IG51bWJlcjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKi9cbiAgc2V0Z0xldmVsKGc6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hhcnNldCBmb3IgdGhlIGdpdmVuIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKiBAcGFyYW0gY2hhcnNldFxuICAgKi9cbiAgc2V0Z0NoYXJzZXQoZzogbnVtYmVyLCBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgdHlwZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnJhbmRlZFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbn1cblxudHlwZSBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSBUQXJncyBleHRlbmRzIFtdID8gW11cbiAgOiBUQXJncyBleHRlbmRzIFsuLi5pbmZlciBURmlyc3QsIGluZmVyIFRMYXN0XSA/IFRMYXN0IGV4dGVuZHMgSUJyYW5kZWRTZXJ2aWNlID8gR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRGaXJzdD4gOiBUQXJnc1xuICAgIDogbmV2ZXI7XG5cbmV4cG9ydCBjb25zdCBJSW5zdGFudGlhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUluc3RhbnRpYXRpb25TZXJ2aWNlPignSW5zdGFudGlhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25TZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgc2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IHZvaWQ7XG4gIGdldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQ7XG4gIGNyZWF0ZUluc3RhbmNlPEN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIFIgZXh0ZW5kcyBJbnN0YW5jZVR5cGU8Q3Rvcj4+KHQ6IEN0b3IsIC4uLmFyZ3M6IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Q3Rvcj4+KTogUjtcbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWxFbnVtIHtcbiAgVFJBQ0UgPSAwLFxuICBERUJVRyA9IDEsXG4gIElORk8gPSAyLFxuICBXQVJOID0gMyxcbiAgRVJST1IgPSA0LFxuICBPRkYgPSA1XG59XG5cbmV4cG9ydCBjb25zdCBJTG9nU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJTG9nU2VydmljZT4oJ0xvZ1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBsb2dMZXZlbDogTG9nTGV2ZWxFbnVtO1xuXG4gIHRyYWNlKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElPcHRpb25zU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3B0aW9uc1NlcnZpY2U+KCdPcHRpb25zU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3B0aW9uc1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgcmF3IG9wdGlvbnMgb2JqZWN0LCB0aGlzIGlzIGFuIGludGVybmFsLW9ubHkgZmFzdCBwYXRoIGZvciBhY2Nlc3NpbmdcbiAgICogc2luZ2xlIG9wdGlvbnMgd2l0aG91dCBhbnkgdmFsaWRhdGlvbiBhcyB3ZSB0cnVzdCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgY29ycmVjdCB1c2FnZVxuICAgKiBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3T3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgYXMgZXhwb3NlZCB0aHJvdWdoIHRoZSBwdWJsaWMgQVBJLCB0aGlzIHByb3BlcnR5IHVzZXMgZ2V0dGVycyBhbmQgc2V0dGVycyB3aXRoXG4gICAqIHZhbGlkYXRpb24gd2hpY2ggbWFrZXMgaXQgc2FmZXIgYnV0IHNsb3dlci4ge0BsaW5rIHJhd09wdGlvbnN9IHNob3VsZCBiZSB1c2VkIGZvciBwcmV0dHkgbXVjaFxuICAgKiBhbGwgaW50ZXJuYWwgdXNhZ2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhbnkgb3B0aW9uIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBvbk9wdGlvbkNoYW5nZTogSUV2ZW50PGtleW9mIElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc3BlY2lmaWMgb3B0aW9uIGNoYW5nZXMsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBpc1xuICAgKiBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gb25seSBhIHNpbmdsZSBvcHRpb24gaXMgYmVpbmcgbGlzdGVuZWQgdG8uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uU3BlY2lmaWNPcHRpb25DaGFuZ2U8VCBleHRlbmRzIGtleW9mIElUZXJtaW5hbE9wdGlvbnM+KGtleTogVCwgbGlzdGVuZXI6IChhcmcxOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPltUXSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzZXQgb2Ygc3BlY2lmaWMgb3B0aW9ucyBjaGFuZ2UsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2RcbiAgICogdGhhdCBpcyBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gbXVsdGlwbGUgb3B0aW9ucyBhcmUgYmVpbmcgbGlzdGVuZWQgdG8gYW5kXG4gICAqIGhhbmRsZWQgdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvbk11bHRpcGxlT3B0aW9uQ2hhbmdlKGtleXM6IChrZXlvZiBJVGVybWluYWxPcHRpb25zKVtdLCBsaXN0ZW5lcjogKCkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCB0eXBlIEZvbnRXZWlnaHQgPSAnbm9ybWFsJyB8ICdib2xkJyB8ICcxMDAnIHwgJzIwMCcgfCAnMzAwJyB8ICc0MDAnIHwgJzUwMCcgfCAnNjAwJyB8ICc3MDAnIHwgJzgwMCcgfCAnOTAwJyB8IG51bWJlcjtcbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ3RyYWNlJyB8ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ29mZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRlcm1pbmFsT3B0aW9ucyB7XG4gIGFsbG93UHJvcG9zZWRBcGk/OiBib29sZWFuO1xuICBhbGxvd1RyYW5zcGFyZW5jeT86IGJvb2xlYW47XG4gIGFsdENsaWNrTW92ZXNDdXJzb3I/OiBib29sZWFuO1xuICBjb2xzPzogbnVtYmVyO1xuICBjb252ZXJ0RW9sPzogYm9vbGVhbjtcbiAgY3Vyc29yQmxpbms/OiBib29sZWFuO1xuICBjdXJzb3JTdHlsZT86IEN1cnNvclN0eWxlO1xuICBjdXJzb3JXaWR0aD86IG51bWJlcjtcbiAgY3Vyc29ySW5hY3RpdmVTdHlsZT86IEN1cnNvckluYWN0aXZlU3R5bGU7XG4gIGN1c3RvbUdseXBocz86IGJvb2xlYW47XG4gIGRpc2FibGVTdGRpbj86IGJvb2xlYW47XG4gIGRvY3VtZW50T3ZlcnJpZGU/OiBhbnkgfCBudWxsO1xuICBkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycz86IGJvb2xlYW47XG4gIGZhc3RTY3JvbGxNb2RpZmllcj86ICdub25lJyB8ICdhbHQnIHwgJ2N0cmwnIHwgJ3NoaWZ0JztcbiAgZmFzdFNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBmb250U2l6ZT86IG51bWJlcjtcbiAgZm9udEZhbWlseT86IHN0cmluZztcbiAgZm9udFdlaWdodD86IEZvbnRXZWlnaHQ7XG4gIGZvbnRXZWlnaHRCb2xkPzogRm9udFdlaWdodDtcbiAgaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlPzogYm9vbGVhbjtcbiAgbGV0dGVyU3BhY2luZz86IG51bWJlcjtcbiAgbGluZUhlaWdodD86IG51bWJlcjtcbiAgbGlua0hhbmRsZXI/OiBJTGlua0hhbmRsZXIgfCBudWxsO1xuICBsb2dMZXZlbD86IExvZ0xldmVsO1xuICBsb2dnZXI/OiBJTG9nZ2VyIHwgbnVsbDtcbiAgbWFjT3B0aW9uSXNNZXRhPzogYm9vbGVhbjtcbiAgbWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb24/OiBib29sZWFuO1xuICBtaW5pbXVtQ29udHJhc3RSYXRpbz86IG51bWJlcjtcbiAgcmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzPzogYm9vbGVhbjtcbiAgcmlnaHRDbGlja1NlbGVjdHNXb3JkPzogYm9vbGVhbjtcbiAgcm93cz86IG51bWJlcjtcbiAgc2NyZWVuUmVhZGVyTW9kZT86IGJvb2xlYW47XG4gIHNjcm9sbGJhY2s/OiBudW1iZXI7XG4gIHNjcm9sbE9uVXNlcklucHV0PzogYm9vbGVhbjtcbiAgc2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIHNtb290aFNjcm9sbER1cmF0aW9uPzogbnVtYmVyO1xuICB0YWJTdG9wV2lkdGg/OiBudW1iZXI7XG4gIHRoZW1lPzogSVRoZW1lO1xuICB3aW5kb3dzTW9kZT86IGJvb2xlYW47XG4gIHdpbmRvd3NQdHk/OiBJV2luZG93c1B0eTtcbiAgd2luZG93T3B0aW9ucz86IElXaW5kb3dPcHRpb25zO1xuICB3b3JkU2VwYXJhdG9yPzogc3RyaW5nO1xuICBvdmVydmlld1J1bGVyV2lkdGg/OiBudW1iZXI7XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBjYW5jZWxFdmVudHM6IGJvb2xlYW47XG4gIHRlcm1OYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRoZW1lIHtcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBjdXJzb3JBY2NlbnQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZD86IHN0cmluZztcbiAgYmxhY2s/OiBzdHJpbmc7XG4gIHJlZD86IHN0cmluZztcbiAgZ3JlZW4/OiBzdHJpbmc7XG4gIHllbGxvdz86IHN0cmluZztcbiAgYmx1ZT86IHN0cmluZztcbiAgbWFnZW50YT86IHN0cmluZztcbiAgY3lhbj86IHN0cmluZztcbiAgd2hpdGU/OiBzdHJpbmc7XG4gIGJyaWdodEJsYWNrPzogc3RyaW5nO1xuICBicmlnaHRSZWQ/OiBzdHJpbmc7XG4gIGJyaWdodEdyZWVuPzogc3RyaW5nO1xuICBicmlnaHRZZWxsb3c/OiBzdHJpbmc7XG4gIGJyaWdodEJsdWU/OiBzdHJpbmc7XG4gIGJyaWdodE1hZ2VudGE/OiBzdHJpbmc7XG4gIGJyaWdodEN5YW4/OiBzdHJpbmc7XG4gIGJyaWdodFdoaXRlPzogc3RyaW5nO1xuICBleHRlbmRlZEFuc2k/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IElPc2NMaW5rU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3NjTGlua1NlcnZpY2U+KCdPc2NMaW5rU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3NjTGlua1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxpbmsgdG8gdGhlIHNlcnZpY2UsIHJldHVybmluZyB0aGUgbGluayBJRC4gVGhlIGxpbmsgZGF0YSBpcyBtYW5hZ2VkIGJ5IHRoaXNcbiAgICogc2VydmljZSBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoaXMgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgdHJpbW1lZCBvZmYgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHJlZ2lzdGVyTGluayhsaW5rRGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyO1xuICAvKipcbiAgICogQWRkcyBhIGxpbmUgdG8gYSBsaW5rIGlmIG5lZWRlZC5cbiAgICovXG4gIGFkZExpbmVUb0xpbmsobGlua0lkOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XG4gIC8qKiBHZXQgdGhlIGxpbmsgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rIElELiAqL1xuICBnZXRMaW5rRGF0YShsaW5rSWQ6IG51bWJlcik6IElPc2NMaW5rRGF0YSB8IHVuZGVmaW5lZDtcbn1cblxuLypcbiAqIFdpZHRoIGFuZCBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrIHByb3BlcnRpZXMgb2YgYSBjaGFyYWN0ZXIgYXMgYSBiaXQgbWFzay5cbiAqXG4gKiBiaXQgMDogc2hvdWxkSm9pbiAtIHNob3VsZCBjb21iaW5lIHdpdGggcHJlY2VkaW5nIGNoYXJhY3Rlci5cbiAqIGJpdCAxLi4yOiB3Y3dpZHRoIC0gc2VlIFVuaWNvZGVDaGFyV2lkdGguXG4gKiBiaXQgMy4uMzE6IGNsYXNzIG9mIGNoYXJhY3RlciAoY3VycmVudGx5IG9ubHkgNCBiaXRzIGFyZSB1c2VkKS5cbiAqICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZWQgZ3JhcGhlbWUgY2x1c3RlcmluZyAtIGkuZS4gd2hpY2ggY29kZXBvaW50c1xuICogICBhcmUgdG8gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb21wb3VuZCBjaGFyYWN0ZXIuXG4gKlxuICogVXNlIHRoZSBVbmljb2RlU2VydmljZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlWYWx1ZSB0byBjcmVhdGUgYVxuICogVW5pY29kZUNoYXJQcm9wZXJ0aWVzOyB1c2UgZXh0cmFjdFNob3VsZEpvaW4sIGV4dHJhY3RXaWR0aCwgYW5kXG4gKiBleHRyYWN0Q2hhcktpbmQgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJQcm9wZXJ0aWVzID0gbnVtYmVyO1xuXG4vKipcbiAqIFdpZHRoIGluIGNvbHVtbnMgb2YgYSBjaGFyYWN0ZXIuXG4gKiBJbiBhIENKSyBjb250ZXh0LCBcImhhbGYtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIExhdGluKSBhcmUgd2lkdGggMSxcbiAqIHdoaWxlIFwiZnVsbC13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgS2FuamkpIGFyZSAyIGNvbHVtbnMgd2lkZS5cbiAqIENvbWJpbmluZyBjaGFyYWN0ZXJzIChzdWNoIGFzIGFjY2VudHMpIGFyZSB3aWR0aCAwLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhcldpZHRoID0gMCB8IDEgfCAyO1xuXG5leHBvcnQgY29uc3QgSVVuaWNvZGVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElVbmljb2RlU2VydmljZT4oJ1VuaWNvZGVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKiogUmVnaXN0ZXIgYW4gVW5pY29kZSB2ZXJzaW9uIHByb3ZpZGVyLiAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIpOiB2b2lkO1xuICAvKiogUmVnaXN0ZXJlZCBVbmljb2RlIHZlcnNpb25zLiAqL1xuICByZWFkb25seSB2ZXJzaW9uczogc3RyaW5nW107XG4gIC8qKiBDdXJyZW50bHkgYWN0aXZlIHZlcnNpb24uICovXG4gIGFjdGl2ZVZlcnNpb246IHN0cmluZztcbiAgLyoqIEV2ZW50IHRyaWdnZXJlZCwgd2hlbiBhY3RpdmF0ZSB2ZXJzaW9uIGNoYW5nZWQuICovXG4gIHJlYWRvbmx5IG9uQ2hhbmdlOiBJRXZlbnQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogVW5pY29kZSB2ZXJzaW9uIGRlcGVuZGVudFxuICAgKi9cbiAgd2N3aWR0aChjb2RlcG9pbnQ6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGdldFN0cmluZ0NlbGxXaWR0aChzOiBzdHJpbmcpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXR1cm4gY2hhcmFjdGVyIHdpZHRoIGFuZCB0eXBlIGZvciBncmFwaGVtZSBjbHVzdGVyaW5nLlxuICAgKiBJZiBwcmVjZWRpbmcgIT0gMCwgaXQgaXMgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHByZXZpb3VzIGNoYXJhY3RlcjtcbiAgICogaW4gdGhhdCBjYXNlIHRoZSByZXN1bHQgc3BlY2lmaWVzIGlmIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBqb2luZWQuXG4gICAqL1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIge1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHdjd2lkdGgodWNzOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBJRGVjb3JhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SURlY29yYXRpb25TZXJ2aWNlPignRGVjb3JhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSURlY29yYXRpb25TZXJ2aWNlIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZGVjb3JhdGlvbnM6IEl0ZXJhYmxlSXRlcmF0b3I8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlZ2lzdGVyZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVtb3ZlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xuICByZXNldCgpOiB2b2lkO1xuICAvKipcbiAgICogVHJpZ2dlciBhIGNhbGxiYWNrIG92ZXIgdGhlIGRlY29yYXRpb24gYXQgYSBjZWxsIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS4gVGhpcyB1c2VzIGEgY2FsbGJhY2tcbiAgICogaW5zdGVhZCBvZiBhbiBpdGVyYXRvciBhcyBpdCdzIHR5cGljYWxseSB1c2VkIGluIGhvdCBjb2RlIHBhdGhzLlxuICAgKi9cbiAgZm9yRWFjaERlY29yYXRpb25BdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyOiAnYm90dG9tJyB8ICd0b3AnIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pID0+IHZvaWQpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJuYWxEZWNvcmF0aW9uIGV4dGVuZHMgSURlY29yYXRpb24ge1xuICByZWFkb25seSBvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmb3JlZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25SZW5kZXJFbWl0dGVyOiBJRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50Pjtcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIChFWFBFUklNRU5UQUwpIFRoaXMgQWRkb24gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElCdWZmZXIsIElCdWZmZXJDZWxsLCBJQnVmZmVyUmFuZ2UsIElUZXJtaW5hbEFkZG9uLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IElIVE1MU2VyaWFsaXplT3B0aW9ucywgU2VyaWFsaXplQWRkb24gYXMgSVNlcmlhbGl6ZUFwaSwgSVNlcmlhbGl6ZU9wdGlvbnMsIElTZXJpYWxpemVSYW5nZSB9IGZyb20gJ0B4dGVybS9hZGRvbi1zZXJpYWxpemUnO1xuaW1wb3J0IHsgREVGQVVMVF9BTlNJX0NPTE9SUyB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvVGhlbWVTZXJ2aWNlJztcbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5mdW5jdGlvbiBjb25zdHJhaW4odmFsdWU6IG51bWJlciwgbG93OiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChsb3csIE1hdGgubWluKHZhbHVlLCBoaWdoKSk7XG59XG5cbi8vIFRPRE86IFJlZmluZSB0aGlzIHRlbXBsYXRlIGNsYXNzIGxhdGVyXG5hYnN0cmFjdCBjbGFzcyBCYXNlU2VyaWFsaXplSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfYnVmZmVyOiBJQnVmZmVyXG4gICkge1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShyYW5nZTogSUJ1ZmZlclJhbmdlLCBleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbj86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIHdlIG5lZWQgdHdvIG9mIHRoZW0gdG8gZmxpcCBiZXR3ZWVuIG9sZCBhbmQgbmV3IGNlbGxcbiAgICBjb25zdCBjZWxsMSA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICAgIGNvbnN0IGNlbGwyID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gICAgbGV0IG9sZENlbGwgPSBjZWxsMTtcblxuICAgIGNvbnN0IHN0YXJ0Um93ID0gcmFuZ2Uuc3RhcnQueTtcbiAgICBjb25zdCBlbmRSb3cgPSByYW5nZS5lbmQueTtcbiAgICBjb25zdCBzdGFydENvbHVtbiA9IHJhbmdlLnN0YXJ0Lng7XG4gICAgY29uc3QgZW5kQ29sdW1uID0gcmFuZ2UuZW5kLng7XG5cbiAgICB0aGlzLl9iZWZvcmVTZXJpYWxpemUoZW5kUm93IC0gc3RhcnRSb3csIHN0YXJ0Um93LCBlbmRSb3cpO1xuXG4gICAgZm9yIChsZXQgcm93ID0gc3RhcnRSb3c7IHJvdyA8PSBlbmRSb3c7IHJvdysrKSB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TGluZUNvbHVtbiA9IHJvdyA9PT0gcmFuZ2Uuc3RhcnQueSA/IHN0YXJ0Q29sdW1uIDogMDtcbiAgICAgICAgY29uc3QgZW5kTGluZUNvbHVtbiA9IHJvdyA9PT0gcmFuZ2UuZW5kLnkgPyBlbmRDb2x1bW46IGxpbmUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBjb2wgPSBzdGFydExpbmVDb2x1bW47IGNvbCA8IGVuZExpbmVDb2x1bW47IGNvbCsrKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGxpbmUuZ2V0Q2VsbChjb2wsIG9sZENlbGwgPT09IGNlbGwxID8gY2VsbDIgOiBjZWxsMSk7XG4gICAgICAgICAgaWYgKCFjKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENhbid0IGdldCBjZWxsIGF0IHJvdz0ke3Jvd30sIGNvbD0ke2NvbH1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9uZXh0Q2VsbChjLCBvbGRDZWxsLCByb3csIGNvbCk7XG4gICAgICAgICAgb2xkQ2VsbCA9IGM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jvd0VuZChyb3csIHJvdyA9PT0gZW5kUm93KTtcbiAgICB9XG5cbiAgICB0aGlzLl9hZnRlclNlcmlhbGl6ZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25leHRDZWxsKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfYmVmb3JlU2VyaWFsaXplKHJvd3M6IG51bWJlciwgc3RhcnRSb3c6IG51bWJlciwgZW5kUm93OiBudW1iZXIpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX2FmdGVyU2VyaWFsaXplKCk6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7IHJldHVybiAnJzsgfVxufVxuXG5mdW5jdGlvbiBlcXVhbEZnKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmdldEZnQ29sb3JNb2RlKCkgPT09IGNlbGwyLmdldEZnQ29sb3JNb2RlKClcbiAgICAmJiBjZWxsMS5nZXRGZ0NvbG9yKCkgPT09IGNlbGwyLmdldEZnQ29sb3IoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxCZyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5nZXRCZ0NvbG9yTW9kZSgpID09PSBjZWxsMi5nZXRCZ0NvbG9yTW9kZSgpXG4gICAgJiYgY2VsbDEuZ2V0QmdDb2xvcigpID09PSBjZWxsMi5nZXRCZ0NvbG9yKCk7XG59XG5cbmZ1bmN0aW9uIGVxdWFsRmxhZ3MoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuaXNJbnZlcnNlKCkgPT09IGNlbGwyLmlzSW52ZXJzZSgpXG4gICAgJiYgY2VsbDEuaXNCb2xkKCkgPT09IGNlbGwyLmlzQm9sZCgpXG4gICAgJiYgY2VsbDEuaXNVbmRlcmxpbmUoKSA9PT0gY2VsbDIuaXNVbmRlcmxpbmUoKVxuICAgICYmIGNlbGwxLmlzT3ZlcmxpbmUoKSA9PT0gY2VsbDIuaXNPdmVybGluZSgpXG4gICAgJiYgY2VsbDEuaXNCbGluaygpID09PSBjZWxsMi5pc0JsaW5rKClcbiAgICAmJiBjZWxsMS5pc0ludmlzaWJsZSgpID09PSBjZWxsMi5pc0ludmlzaWJsZSgpXG4gICAgJiYgY2VsbDEuaXNJdGFsaWMoKSA9PT0gY2VsbDIuaXNJdGFsaWMoKVxuICAgICYmIGNlbGwxLmlzRGltKCkgPT09IGNlbGwyLmlzRGltKClcbiAgICAmJiBjZWxsMS5pc1N0cmlrZXRocm91Z2goKSA9PT0gY2VsbDIuaXNTdHJpa2V0aHJvdWdoKCk7XG59XG5cbmNsYXNzIFN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlU2VyaWFsaXplSGFuZGxlciB7XG4gIHByaXZhdGUgX3Jvd0luZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9hbGxSb3dzOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2FsbFJvd1NlcGFyYXRvcnM6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX251bGxDZWxsQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgLy8gd2UgY2FuIHNlZSBhIGZ1bGwgY29sb3JlZCBjZWxsIGFuZCBhIG51bGwgY2VsbCB0aGF0IG9ubHkgaGF2ZSBiYWNrZ3JvdW5kIHRoZSBzYW1lIHN0eWxlXG4gIC8vIGJ1dCB0aGUgaW5mb3JtYXRpb24gaXNuJ3QgcHJlc2VydmVkIGJ5IG51bGwgY2VsbCBpdHNlbGZcbiAgLy8gc28gd2VlIG5lZWQgdG8gcmVjb3JkIGl0IHdoZW4gcmVxdWlyZWQuXG4gIHByaXZhdGUgX2N1cnNvclN0eWxlOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuXG4gIC8vIHdoZXJlIGV4YWN0IHRoZSBjdXJzb3Igc3R5bGVzIGNvbWVzIGZyb21cbiAgLy8gYmVjYXVzZSB3ZSBjYW4ndCBjb3B5IHRoZSBjZWxsIGRpcmVjdGx5XG4gIC8vIHNvIHdlIHJlbWVtYmVyIHdoZXJlIHRoZSBjb250ZW50IGNvbWVzIGZyb20gaW5zdGVhZFxuICBwcml2YXRlIF9jdXJzb3JTdHlsZVJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGVDb2w6IG51bWJlciA9IDA7XG5cbiAgLy8gdGhpcyBpcyBhIG51bGwgY2VsbCBmb3IgcmVmZXJlbmNlIGZvciBjaGVja2luZyB3aGV0aGVyIGJhY2tncm91bmQgaXMgZW1wdHkgb3Igbm90XG4gIHByaXZhdGUgX2JhY2tncm91bmRDZWxsOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuXG4gIHByaXZhdGUgX2ZpcnN0Um93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q3Vyc29yUm93OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q3Vyc29yQ29sOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudEN1cnNvclJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdENvbnRlbnRDdXJzb3JDb2w6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbFxuICApIHtcbiAgICBzdXBlcihidWZmZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2FsbFJvd3MgPSBuZXcgQXJyYXk8c3RyaW5nPihyb3dzKTtcbiAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHN0YXJ0O1xuICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSBzdGFydDtcbiAgICB0aGlzLl9maXJzdFJvdyA9IHN0YXJ0O1xuICB9XG5cbiAgcHJpdmF0ZSBfdGhpc1Jvd0xhc3RDaGFyOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICBwcml2YXRlIF90aGlzUm93TGFzdFNlY29uZENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByaXZhdGUgX25leHRSb3dGaXJzdENoYXI6IElCdWZmZXJDZWxsID0gdGhpcy5fYnVmZmVyLmdldE51bGxDZWxsKCk7XG4gIHByb3RlY3RlZCBfcm93RW5kKHJvdzogbnVtYmVyLCBpc0xhc3RSb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBjb2xvcmZ1bCBlbXB0eSBjZWxsIGF0IGxpbmUgZW5kLCB3aGUgbXVzdCBwYWQgaXQgYmFjaywgb3IgdGhlIHRoZSBjb2xvciBibG9ja1xuICAgIC8vIHdpbGwgbWlzc2luZ1xuICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCAmJiAhZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgdGhpcy5fYmFja2dyb3VuZENlbGwpKSB7XG4gICAgICAvLyB1c2UgY2xlYXIgcmlnaHQgdG8gc2V0IGJhY2tncm91bmQuXG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICB9XG5cbiAgICBsZXQgcm93U2VwYXJhdG9yID0gJyc7XG5cbiAgICAvLyBoYW5kbGUgcm93IHNlcGFyYXRvclxuICAgIGlmICghaXNMYXN0Um93KSB7XG4gICAgICAvLyBFbmFibGUgQkNFXG4gICAgICBpZiAocm93IC0gdGhpcy5fZmlyc3RSb3cgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICB0aGlzLl9idWZmZXIuZ2V0TGluZSh0aGlzLl9jdXJzb3JTdHlsZVJvdyk/LmdldENlbGwodGhpcy5fY3Vyc29yU3R5bGVDb2wsIHRoaXMuX2JhY2tncm91bmRDZWxsKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmV0Y2ggY3VycmVudCBsaW5lXG4gICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdykhO1xuICAgICAgLy8gRmV0Y2ggbmV4dCBsaW5lXG4gICAgICBjb25zdCBuZXh0TGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdyArIDEpITtcblxuICAgICAgaWYgKCFuZXh0TGluZS5pc1dyYXBwZWQpIHtcbiAgICAgICAgLy8ganVzdCBpbnNlcnQgdGhlIGxpbmUgYnJlYWtcbiAgICAgICAgcm93U2VwYXJhdG9yID0gJ1xcclxcbic7XG4gICAgICAgIC8vIHdlIHNlbmRlZCB0aGUgZW50ZXJcbiAgICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgIHRoaXMuX2xhc3RDdXJzb3JDb2wgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm93U2VwYXJhdG9yID0gJyc7XG4gICAgICAgIGNvbnN0IHRoaXNSb3dMYXN0Q2hhciA9IGN1cnJlbnRMaW5lLmdldENlbGwoY3VycmVudExpbmUubGVuZ3RoIC0gMSwgdGhpcy5fdGhpc1Jvd0xhc3RDaGFyKSE7XG4gICAgICAgIGNvbnN0IHRoaXNSb3dMYXN0U2Vjb25kQ2hhciA9IGN1cnJlbnRMaW5lLmdldENlbGwoY3VycmVudExpbmUubGVuZ3RoIC0gMiwgdGhpcy5fdGhpc1Jvd0xhc3RTZWNvbmRDaGFyKSE7XG4gICAgICAgIGNvbnN0IG5leHRSb3dGaXJzdENoYXIgPSBuZXh0TGluZS5nZXRDZWxsKDAsIHRoaXMuX25leHRSb3dGaXJzdENoYXIpITtcbiAgICAgICAgY29uc3QgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggPSBuZXh0Um93Rmlyc3RDaGFyLmdldFdpZHRoKCkgPiAxO1xuXG4gICAgICAgIC8vIHZhbGlkYXRlIHdoZXRoZXIgdGhpcyBsaW5lIHdyYXAgaXMgZXZlciBwb3NzaWJsZVxuICAgICAgICAvLyB3aGljaCBtZWFuIHdoZXRoZXIgY3Vyc29yIGNhbiBwbGFjZWQgYXQgYSBvdmVyZmxvdyBwb3NpdGlvbiAoeCA9PT0gcm93KSBuYXR1cmFsbHlcbiAgICAgICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8geW91IG11c3Qgb3V0cHV0IGNoYXJhY3RlciB0byBjYXVzZSBvdmVyZmxvdywgY29udHJvbCBzZXF1ZW5jZSBjYW4ndCBkbyB0aGlzXG4gICAgICAgICAgbmV4dFJvd0ZpcnN0Q2hhci5nZXRDaGFycygpICYmXG4gICAgICAgICAgICBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCA/IHRoaXMuX251bGxDZWxsQ291bnQgPD0gMSA6IHRoaXMuX251bGxDZWxsQ291bnQgPD0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyB0aGUgbGFzdCBjaGFyYWN0ZXIgY2FuJ3QgYmUgbnVsbCxcbiAgICAgICAgICAgIC8vIHlvdSBjYW4ndCB1c2UgY29udHJvbCBzZXF1ZW5jZSB0byBtb3ZlIGN1cnNvciB0byAoeCA9PT0gcm93KVxuICAgICAgICAgICAgKHRoaXNSb3dMYXN0Q2hhci5nZXRDaGFycygpIHx8IHRoaXNSb3dMYXN0Q2hhci5nZXRXaWR0aCgpID09PSAwKSAmJlxuICAgICAgICAgICAgLy8gY2hhbmdlIGJhY2tncm91bmQgb2YgdGhlIGZpcnN0IHdyYXBwZWQgY2VsbCBhbHNvIGFmZmVjdHMgQkNFXG4gICAgICAgICAgICAvLyBzbyB3ZSBtYXJrIGl0IGFzIGludmFsaWQgdG8gc2ltcGx5IHRoZSBwcm9jZXNzIHRvIGRldGVybWluZSBsaW5lIHNlcGFyYXRvclxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdENoYXIsIG5leHRSb3dGaXJzdENoYXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyB0aGUgc2Vjb25kIHRvIGxhc3QgY2hhcmFjdGVyIGNhbid0IGJlIG51bGwgaWYgdGhlIG5leHQgbGluZSBzdGFydHMgd2l0aCBDSkssXG4gICAgICAgICAgICAvLyB5b3UgY2FuJ3QgdXNlIGNvbnRyb2wgc2VxdWVuY2UgdG8gbW92ZSBjdXJzb3IgdG8gKHggPT09IHJvdylcbiAgICAgICAgICAgIGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoICYmXG4gICAgICAgICAgICAodGhpc1Jvd0xhc3RTZWNvbmRDaGFyLmdldENoYXJzKCkgfHwgdGhpc1Jvd0xhc3RTZWNvbmRDaGFyLmdldFdpZHRoKCkgPT09IDApICYmXG4gICAgICAgICAgICAvLyBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZmlyc3Qgd3JhcHBlZCBjZWxsIGFsc28gYWZmZWN0cyBCQ0VcbiAgICAgICAgICAgIC8vIHNvIHdlIG1hcmsgaXQgYXMgaW52YWxpZCB0byBzaW1wbHkgdGhlIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIGxpbmUgc2VwYXJhdG9yXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0Q2hhciwgbmV4dFJvd0ZpcnN0Q2hhcikgJiZcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RTZWNvbmRDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgLy8gZm9yY2UgdGhlIHdyYXAgd2l0aCBtYWdpY1xuICAgICAgICAgIC8vIGluc2VydCBlbm91Z2ggY2hhcmFjdGVyIHRvIGZvcmNlIHRoZSB3cmFwXG4gICAgICAgICAgcm93U2VwYXJhdG9yID0gJy0nLnJlcGVhdCh0aGlzLl9udWxsQ2VsbENvdW50ICsgMSk7XG4gICAgICAgICAgLy8gbW92ZSBiYWNrIGFuZCBlcmFzZSBuZXh0IGxpbmUgaGVhZFxuICAgICAgICAgIHJvd1NlcGFyYXRvciArPSAnXFx1MDAxYlsxRFxcdTAwMWJbMVgnO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBkbyB0aGVzZSBiZWNhdXNlIHdlIGZpbGxlZCB0aGUgbGFzdCBzZXZlcmFsIG51bGwgc2xvdCwgd2hpY2ggd2Ugc2hvdWxkbid0XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gJ1xcdTAwMWJbQSc7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHtjdXJyZW50TGluZS5sZW5ndGggLSB0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske2N1cnJlbnRMaW5lLmxlbmd0aCAtIHRoaXMuX251bGxDZWxsQ291bnR9RGA7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gJ1xcdTAwMWJbQic7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGhpcyBpcyBjb250ZW50IGFuZCBuZWVkIHRoZSBiZSBzZXJpYWxpemVkIGV2ZW4gaXQgaXMgaW52aXNpYmxlLlxuICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgd3JhcCB3aWxsIGJlIG1pc3NpbmcgZnJvbSBvdXRwdXRzLlxuICAgICAgICAgIHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbCA9IDA7XG5cbiAgICAgICAgICAvLyBmb3JjZSBjb21taXQgdGhlIGN1cnNvciBwb3NpdGlvblxuICAgICAgICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICAgIHRoaXMuX2xhc3RDdXJzb3JDb2wgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYWxsUm93c1t0aGlzLl9yb3dJbmRleF0gPSB0aGlzLl9jdXJyZW50Um93O1xuICAgIHRoaXMuX2FsbFJvd1NlcGFyYXRvcnNbdGhpcy5fcm93SW5kZXgrK10gPSByb3dTZXBhcmF0b3I7XG4gICAgdGhpcy5fY3VycmVudFJvdyA9ICcnO1xuICAgIHRoaXMuX251bGxDZWxsQ291bnQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIG9sZENlbGw6IElCdWZmZXJDZWxsKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNnclNlcTogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBmZ0NoYW5nZWQgPSAhZXF1YWxGZyhjZWxsLCBvbGRDZWxsKTtcbiAgICBjb25zdCBiZ0NoYW5nZWQgPSAhZXF1YWxCZyhjZWxsLCBvbGRDZWxsKTtcbiAgICBjb25zdCBmbGFnc0NoYW5nZWQgPSAhZXF1YWxGbGFncyhjZWxsLCBvbGRDZWxsKTtcblxuICAgIGlmIChmZ0NoYW5nZWQgfHwgYmdDaGFuZ2VkIHx8IGZsYWdzQ2hhbmdlZCkge1xuICAgICAgaWYgKGNlbGwuaXNBdHRyaWJ1dGVEZWZhdWx0KCkpIHtcbiAgICAgICAgaWYgKCFvbGRDZWxsLmlzQXR0cmlidXRlRGVmYXVsdCgpKSB7XG4gICAgICAgICAgc2dyU2VxLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmZ0NoYW5nZWQpIHtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNlbGwuZ2V0RmdDb2xvcigpO1xuICAgICAgICAgIGlmIChjZWxsLmlzRmdSR0IoKSkgeyBzZ3JTZXEucHVzaCgzOCwgMiwgKGNvbG9yID4+PiAxNikgJiAweEZGLCAoY29sb3IgPj4+IDgpICYgMHhGRiwgY29sb3IgJiAweEZGKTsgfVxuICAgICAgICAgIGVsc2UgaWYgKGNlbGwuaXNGZ1BhbGV0dGUoKSkge1xuICAgICAgICAgICAgaWYgKGNvbG9yID49IDE2KSB7IHNnclNlcS5wdXNoKDM4LCA1LCBjb2xvcik7IH1cbiAgICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaChjb2xvciAmIDggPyA5MCArIChjb2xvciAmIDcpIDogMzAgKyAoY29sb3IgJiA3KSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHNnclNlcS5wdXNoKDM5KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZ0NoYW5nZWQpIHtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgICAgICAgIGlmIChjZWxsLmlzQmdSR0IoKSkgeyBzZ3JTZXEucHVzaCg0OCwgMiwgKGNvbG9yID4+PiAxNikgJiAweEZGLCAoY29sb3IgPj4+IDgpICYgMHhGRiwgY29sb3IgJiAweEZGKTsgfVxuICAgICAgICAgIGVsc2UgaWYgKGNlbGwuaXNCZ1BhbGV0dGUoKSkge1xuICAgICAgICAgICAgaWYgKGNvbG9yID49IDE2KSB7IHNnclNlcS5wdXNoKDQ4LCA1LCBjb2xvcik7IH1cbiAgICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaChjb2xvciAmIDggPyAxMDAgKyAoY29sb3IgJiA3KSA6IDQwICsgKGNvbG9yICYgNykpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaCg0OSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICAgICAgaWYgKGNlbGwuaXNJbnZlcnNlKCkgIT09IG9sZENlbGwuaXNJbnZlcnNlKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0ludmVyc2UoKSA/IDcgOiAyNyk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0JvbGQoKSAhPT0gb2xkQ2VsbC5pc0JvbGQoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzQm9sZCgpID8gMSA6IDIyKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzVW5kZXJsaW5lKCkgIT09IG9sZENlbGwuaXNVbmRlcmxpbmUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzVW5kZXJsaW5lKCkgPyA0IDogMjQpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNPdmVybGluZSgpICE9PSBvbGRDZWxsLmlzT3ZlcmxpbmUoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzT3ZlcmxpbmUoKSA/IDUzIDogNTUpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNCbGluaygpICE9PSBvbGRDZWxsLmlzQmxpbmsoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzQmxpbmsoKSA/IDUgOiAyNSk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpICE9PSBvbGRDZWxsLmlzSW52aXNpYmxlKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0ludmlzaWJsZSgpID8gOCA6IDI4KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkgIT09IG9sZENlbGwuaXNJdGFsaWMoKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzSXRhbGljKCkgPyAzIDogMjMpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNEaW0oKSAhPT0gb2xkQ2VsbC5pc0RpbSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNEaW0oKSA/IDIgOiAyMik7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc1N0cmlrZXRocm91Z2goKSAhPT0gb2xkQ2VsbC5pc1N0cmlrZXRocm91Z2goKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzU3RyaWtldGhyb3VnaCgpID8gOSA6IDI5KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNnclNlcTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcblxuICAgIGlmIChpc1BsYWNlSG9sZGVyQ2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY2VsbCBkb24ndCBoYXZlIGNvbnRlbnRcbiAgICBjb25zdCBpc0VtcHR5Q2VsbCA9IGNlbGwuZ2V0Q2hhcnMoKSA9PT0gJyc7XG5cbiAgICBjb25zdCBzZ3JTZXEgPSB0aGlzLl9kaWZmU3R5bGUoY2VsbCwgdGhpcy5fY3Vyc29yU3R5bGUpO1xuXG4gICAgLy8gdGhlIGVtcHR5IGNlbGwgc3R5bGUgaXMgb25seSBhc3N1bWVkIHRvIGJlIGNoYW5nZWQgd2hlbiBiYWNrZ3JvdW5kIGNoYW5nZWQsIGJlY2F1c2VcbiAgICAvLyBmb3JlZ3JvdW5kIGlzIGFsd2F5cyAwLlxuICAgIGNvbnN0IHN0eWxlQ2hhbmdlZCA9IGlzRW1wdHlDZWxsID8gIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIGNlbGwpIDogc2dyU2VxLmxlbmd0aCA+IDA7XG5cbiAgICAvKipcbiAgICAgKiAgaGFuZGxlcyBzdHlsZSBjaGFuZ2VcbiAgICAgKi9cbiAgICBpZiAoc3R5bGVDaGFuZ2VkKSB7XG4gICAgICAvLyBiZWZvcmUgdXBkYXRlIHRoZSBzdHlsZSwgd2UgbmVlZCB0byBmaWxsIGVtcHR5IGNlbGwgYmFja1xuICAgICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwKSB7XG4gICAgICAgIC8vIHVzZSBjbGVhciByaWdodCB0byBzZXQgYmFja2dyb3VuZC5cbiAgICAgICAgaWYgKCFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7dGhpcy5fbnVsbENlbGxDb3VudH1YYDtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2UgbW92ZSByaWdodCB0byBtb3ZlIGN1cnNvci5cbiAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgIHRoaXMuX251bGxDZWxsQ291bnQgPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3c7XG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbCA9IHRoaXMuX2xhc3RDdXJzb3JDb2wgPSBjb2w7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHtzZ3JTZXEuam9pbignOycpfW1gO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGxhc3QgY3Vyc29yIHN0eWxlXG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyLmdldExpbmUocm93KTtcbiAgICAgIGlmIChsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGluZS5nZXRDZWxsKGNvbCwgdGhpcy5fY3Vyc29yU3R5bGUpO1xuICAgICAgICB0aGlzLl9jdXJzb3JTdHlsZVJvdyA9IHJvdztcbiAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGVDb2wgPSBjb2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIGhhbmRsZXMgYWN0dWFsIGNvbnRlbnRcbiAgICAgKi9cbiAgICBpZiAoaXNFbXB0eUNlbGwpIHtcbiAgICAgIHRoaXMuX251bGxDZWxsQ291bnQgKz0gY2VsbC5nZXRXaWR0aCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDApIHtcbiAgICAgICAgLy8gd2UgY2FuIGp1c3QgYXNzdW1lIHdlIGhhdmUgc2FtZSBzdHlsZSB3aXRoIHByZXZpb3VzIG9uZSBoZXJlXG4gICAgICAgIC8vIGJlY2F1c2Ugc3R5bGUgY2hhbmdlIGlzIGhhbmRsZWQgYnkgcHJldmlvdXMgc3RhZ2VcbiAgICAgICAgLy8gdXNlIG1vdmUgcmlnaHQgd2hlbiBiYWNrZ3JvdW5kIGlzIGVtcHR5LCB1c2UgY2xlYXIgcmlnaHQgd2hlbiB0aGVyZSBpcyBiYWNrZ3JvdW5kLlxuICAgICAgICBpZiAoZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgdGhpcy5fYmFja2dyb3VuZENlbGwpKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9Q2A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbnVsbENlbGxDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gY2VsbC5nZXRDaGFycygpO1xuXG4gICAgICAvLyB1cGRhdGUgY3Vyc29yXG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3c7XG4gICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbCA9IHRoaXMuX2xhc3RDdXJzb3JDb2wgPSBjb2wgKyBjZWxsLmdldFdpZHRoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb246IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGxldCByb3dFbmQgPSB0aGlzLl9hbGxSb3dzLmxlbmd0aDtcblxuICAgIC8vIHRoZSBmaXh1cCBpcyBvbmx5IHJlcXVpcmVkIGZvciBkYXRhIHdpdGhvdXQgc2Nyb2xsYmFja1xuICAgIC8vIGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgcGxhY2VkIGF0IGxhc3QgbGluZSBvdGhlcndpc2VcbiAgICBpZiAodGhpcy5fYnVmZmVyLmxlbmd0aCAtIHRoaXMuX2ZpcnN0Um93IDw9IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgIHJvd0VuZCA9IHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93ICsgMSAtIHRoaXMuX2ZpcnN0Um93O1xuICAgICAgdGhpcy5fbGFzdEN1cnNvckNvbCA9IHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yQ29sO1xuICAgICAgdGhpcy5fbGFzdEN1cnNvclJvdyA9IHRoaXMuX2xhc3RDb250ZW50Q3Vyc29yUm93O1xuICAgIH1cblxuICAgIGxldCBjb250ZW50ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0VuZDsgaSsrKSB7XG4gICAgICBjb250ZW50ICs9IHRoaXMuX2FsbFJvd3NbaV07XG4gICAgICBpZiAoaSArIDEgPCByb3dFbmQpIHtcbiAgICAgICAgY29udGVudCArPSB0aGlzLl9hbGxSb3dTZXBhcmF0b3JzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlc3RvcmUgdGhlIGN1cnNvclxuICAgIGlmICghZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHJlYWxDdXJzb3JSb3cgPSB0aGlzLl9idWZmZXIuYmFzZVkgKyB0aGlzLl9idWZmZXIuY3Vyc29yWTtcbiAgICAgIGNvbnN0IHJlYWxDdXJzb3JDb2wgPSB0aGlzLl9idWZmZXIuY3Vyc29yWDtcblxuICAgICAgY29uc3QgY3Vyc29yTW92ZWQgPSAocmVhbEN1cnNvclJvdyAhPT0gdGhpcy5fbGFzdEN1cnNvclJvdyB8fCByZWFsQ3Vyc29yQ29sICE9PSB0aGlzLl9sYXN0Q3Vyc29yQ29sKTtcblxuICAgICAgY29uc3QgbW92ZVJpZ2h0ID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlske29mZnNldH1DYDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgY29udGVudCArPSBgXFx1MDAxYlskey1vZmZzZXR9RGA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBtb3ZlRG93biA9IChvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtvZmZzZXR9QmA7XG4gICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHstb2Zmc2V0fUFgO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoY3Vyc29yTW92ZWQpIHtcbiAgICAgICAgbW92ZURvd24ocmVhbEN1cnNvclJvdyAtIHRoaXMuX2xhc3RDdXJzb3JSb3cpO1xuICAgICAgICBtb3ZlUmlnaHQocmVhbEN1cnNvckNvbCAtIHRoaXMuX2xhc3RDdXJzb3JDb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgdGhlIGN1cnNvcidzIGN1cnJlbnQgc3R5bGUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9pc3N1ZXMvMzY3N1xuICAgIC8vIEhBQ0s6IEludGVybmFsIEFQSSBhY2Nlc3Mgc2luY2UgaXQncyBhd2t3YXJkIHRvIGV4cG9zZSB0aGlzIGluIHRoZSBBUEkgYW5kIHNlcmlhbGl6ZSB3aWxsXG4gICAgLy8gbGlrZWx5IGJlIHRoZSBvbmx5IGNvbnN1bWVyXG4gICAgY29uc3QgY3VyQXR0ckRhdGE6IElBdHRyaWJ1dGVEYXRhID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX2lucHV0SGFuZGxlci5fY3VyQXR0ckRhdGE7XG4gICAgY29uc3Qgc2dyU2VxID0gdGhpcy5fZGlmZlN0eWxlKGN1ckF0dHJEYXRhLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgaWYgKHNnclNlcS5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7c2dyU2VxLmpvaW4oJzsnKX1tYDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplQWRkb24gaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElTZXJpYWxpemVBcGkge1xuICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIHRoaXMuX3Rlcm1pbmFsID0gdGVybWluYWw7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGVybWluYWw6IFRlcm1pbmFsLCBidWZmZXI6IElCdWZmZXIsIHNjcm9sbGJhY2s/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1heFJvd3MgPSBidWZmZXIubGVuZ3RoO1xuICAgIGNvbnN0IGNvcnJlY3RSb3dzID0gKHNjcm9sbGJhY2sgPT09IHVuZGVmaW5lZCkgPyBtYXhSb3dzIDogY29uc3RyYWluKHNjcm9sbGJhY2sgKyB0ZXJtaW5hbC5yb3dzLCAwLCBtYXhSb3dzKTtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0ZXJtaW5hbCwgYnVmZmVyLCB7XG4gICAgICBzdGFydDogbWF4Um93cyAtIGNvcnJlY3RSb3dzLFxuICAgICAgZW5kOiBtYXhSb3dzIC0gMVxuICAgIH0sIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UodGVybWluYWw6IFRlcm1pbmFsLCBidWZmZXI6IElCdWZmZXIsIHJhbmdlOiBJU2VyaWFsaXplUmFuZ2UsIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IFN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIoYnVmZmVyLCB0ZXJtaW5hbCk7XG4gICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKHtcbiAgICAgIHN0YXJ0OiB7IHg6IDAsICAgICAgICAgICAgIHk6IHR5cGVvZiByYW5nZS5zdGFydCA9PT0gJ251bWJlcicgPyByYW5nZS5zdGFydCA6IHJhbmdlLnN0YXJ0LmxpbmUgfSxcbiAgICAgIGVuZDogICB7IHg6IHRlcm1pbmFsLmNvbHMsIHk6IHR5cGVvZiByYW5nZS5lbmQgICA9PT0gJ251bWJlcicgPyByYW5nZS5lbmQgICA6IHJhbmdlLmVuZC5saW5lICAgfVxuICAgIH0sIGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCh0ZXJtaW5hbDogVGVybWluYWwsIG9wdGlvbnM6IFBhcnRpYWw8SUhUTUxTZXJpYWxpemVPcHRpb25zPik6IHN0cmluZyB7XG4gICAgY29uc3QgYnVmZmVyID0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IEhUTUxTZXJpYWxpemVIYW5kbGVyKGJ1ZmZlciwgdGVybWluYWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IG9ubHlTZWxlY3Rpb24gPSBvcHRpb25zLm9ubHlTZWxlY3Rpb24gPz8gZmFsc2U7XG4gICAgaWYgKCFvbmx5U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBtYXhSb3dzID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNjcm9sbGJhY2sgPSBvcHRpb25zLnNjcm9sbGJhY2s7XG4gICAgICBjb25zdCBjb3JyZWN0Um93cyA9IChzY3JvbGxiYWNrID09PSB1bmRlZmluZWQpID8gbWF4Um93cyA6IGNvbnN0cmFpbihzY3JvbGxiYWNrICsgdGVybWluYWwucm93cywgMCwgbWF4Um93cyk7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiAwLCAgICAgICAgICAgICB5OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogbWF4Um93cyAtIDEgICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX3Rlcm1pbmFsPy5nZXRTZWxlY3Rpb25Qb3NpdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKHtcbiAgICAgICAgc3RhcnQ6IHsgeDogc2VsZWN0aW9uLnN0YXJ0LngsIHk6IHNlbGVjdGlvbi5zdGFydC55IH0sXG4gICAgICAgIGVuZDogICB7IHg6IHNlbGVjdGlvbi5lbmQueCwgICB5OiBzZWxlY3Rpb24uZW5kLnkgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVNb2Rlcyh0ZXJtaW5hbDogVGVybWluYWwpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgY29uc3QgbW9kZXMgPSB0ZXJtaW5hbC5tb2RlcztcblxuICAgIC8vIERlZmF1bHQ6IGZhbHNlXG4gICAgaWYgKG1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xaCc7XG4gICAgaWYgKG1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzY2aCc7XG4gICAgaWYgKG1vZGVzLmJyYWNrZXRlZFBhc3RlTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzIwMDRoJztcbiAgICBpZiAobW9kZXMuaW5zZXJ0TW9kZSkgY29udGVudCArPSAnXFx4MWJbNGgnO1xuICAgIGlmIChtb2Rlcy5vcmlnaW5Nb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NmgnO1xuICAgIGlmIChtb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZE1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz80NWgnO1xuICAgIGlmIChtb2Rlcy5zZW5kRm9jdXNNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MTAwNGgnO1xuXG4gICAgLy8gRGVmYXVsdDogdHJ1ZVxuICAgIGlmIChtb2Rlcy53cmFwYXJvdW5kTW9kZSA9PT0gZmFsc2UpIGNvbnRlbnQgKz0gJ1xceDFiWz83bCc7XG5cbiAgICAvLyBEZWZhdWx0OiAnbm9uZSdcbiAgICBpZiAobW9kZXMubW91c2VUcmFja2luZ01vZGUgIT09ICdub25lJykge1xuICAgICAgc3dpdGNoIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSkge1xuICAgICAgICBjYXNlICd4MTAnOiBjb250ZW50ICs9ICdcXHgxYls/OWgnOyBicmVhaztcbiAgICAgICAgY2FzZSAndnQyMDAnOiBjb250ZW50ICs9ICdcXHgxYls/MTAwMGgnOyBicmVhaztcbiAgICAgICAgY2FzZSAnZHJhZyc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAyaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdhbnknOiBjb250ZW50ICs9ICdcXHgxYls/MTAwM2gnOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemUob3B0aW9ucz86IElTZXJpYWxpemVPcHRpb25zKTogc3RyaW5nIHtcbiAgICAvLyBUT0RPOiBBZGQgY29tYmluZWREYXRhIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYWRkb24gdW50aWwgaXQgaGFzIGJlZW4gbG9hZGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsIGJ1ZmZlclxuICAgIGxldCBjb250ZW50ID0gb3B0aW9ucz8ucmFuZ2VcbiAgICAgID8gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlSYW5nZSh0aGlzLl90ZXJtaW5hbCwgdGhpcy5fdGVybWluYWwuYnVmZmVyLm5vcm1hbCwgb3B0aW9ucy5yYW5nZSwgdHJ1ZSlcbiAgICAgIDogdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zPy5zY3JvbGxiYWNrKTtcblxuICAgIC8vIEFsdGVybmF0ZSBidWZmZXJcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVBbHRCdWZmZXIpIHtcbiAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnR5cGUgPT09ICdhbHRlcm5hdGUnKSB7XG4gICAgICAgIGNvbnN0IGFsdGVybmF0aXZlU2NyZWVuQ29udGVudCA9IHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0aGlzLl90ZXJtaW5hbCwgdGhpcy5fdGVybWluYWwuYnVmZmVyLmFsdGVybmF0ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgY29udGVudCArPSBgXFx1MDAxYls/MTA0OWhcXHUwMDFiW0gke2FsdGVybmF0aXZlU2NyZWVuQ29udGVudH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1vZGVzXG4gICAgaWYgKCFvcHRpb25zPy5leGNsdWRlTW9kZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gdGhpcy5fc2VyaWFsaXplTW9kZXModGhpcy5fdGVybWluYWwpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZUFzSFRNTChvcHRpb25zPzogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYWRkb24gdW50aWwgaXQgaGFzIGJlZW4gbG9hZGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCh0aGlzLl90ZXJtaW5hbCwgb3B0aW9ucyB8fCB7fSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHsgfVxufVxuXG5leHBvcnQgY2xhc3MgSFRNTFNlcmlhbGl6ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlU2VyaWFsaXplSGFuZGxlciB7XG4gIHByaXZhdGUgX2N1cnJlbnRSb3c6IHN0cmluZyA9ICcnO1xuXG4gIHByaXZhdGUgX2h0bWxDb250ZW50ID0gJyc7XG5cbiAgcHJpdmF0ZSBfYW5zaUNvbG9yczogUmVhZG9ubHk8SUNvbG9yW10+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1ZmZlcjogSUJ1ZmZlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogUGFydGlhbDxJSFRNTFNlcmlhbGl6ZU9wdGlvbnM+XG4gICkge1xuICAgIHN1cGVyKGJ1ZmZlcik7XG5cbiAgICAvLyBGb3IgeHRlcm0gaGVhZGxlc3M6IGZhbGxiYWNrIHRvIGFuc2kgY29sb3JzXG4gICAgaWYgKChfdGVybWluYWwgYXMgYW55KS5fY29yZS5fdGhlbWVTZXJ2aWNlKSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2k7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fYW5zaUNvbG9ycyA9IERFRkFVTFRfQU5TSV9DT0xPUlM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFkU3RhcnQodGFyZ2V0OiBzdHJpbmcsIHRhcmdldExlbmd0aDogbnVtYmVyLCBwYWRTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0TGVuZ3RoID4+IDA7XG4gICAgcGFkU3RyaW5nID0gcGFkU3RyaW5nID8/ICcgJztcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA+IHRhcmdldExlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICB0YXJnZXRMZW5ndGggLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICBpZiAodGFyZ2V0TGVuZ3RoID4gcGFkU3RyaW5nLmxlbmd0aCkge1xuICAgICAgcGFkU3RyaW5nICs9IHBhZFN0cmluZy5yZXBlYXQodGFyZ2V0TGVuZ3RoIC8gcGFkU3RyaW5nLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBwYWRTdHJpbmcuc2xpY2UoMCwgdGFyZ2V0TGVuZ3RoKSArIHRhcmdldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYmVmb3JlU2VyaWFsaXplKHJvd3M6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPGh0bWw+PGJvZHk+PCEtLVN0YXJ0RnJhZ21lbnQtLT48cHJlPic7XG5cbiAgICBsZXQgZm9yZWdyb3VuZCA9ICcjMDAwMDAwJztcbiAgICBsZXQgYmFja2dyb3VuZCA9ICcjZmZmZmZmJztcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pbmNsdWRlR2xvYmFsQmFja2dyb3VuZCA/PyBmYWxzZSkge1xuICAgICAgZm9yZWdyb3VuZCA9IHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMudGhlbWU/LmZvcmVncm91bmQgPz8gJyNmZmZmZmYnO1xuICAgICAgYmFja2dyb3VuZCA9IHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMudGhlbWU/LmJhY2tncm91bmQgPz8gJyMwMDAwMDAnO1xuICAgIH1cblxuICAgIGNvbnN0IGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMgPSBbXTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2NvbG9yOiAnICsgZm9yZWdyb3VuZCArICc7Jyk7XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdiYWNrZ3JvdW5kLWNvbG9yOiAnICsgYmFja2dyb3VuZCArICc7Jyk7XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdmb250LWZhbWlseTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udEZhbWlseSArICc7Jyk7XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdmb250LXNpemU6ICcgKyB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLmZvbnRTaXplICsgJ3B4OycpO1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2IHN0eWxlPVxcJycgKyBnbG9iYWxTdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgfVxuXG4gIHByb3RlY3RlZCBfYWZ0ZXJTZXJpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzwvZGl2Pic7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzwvcHJlPjwhLS1FbmRGcmFnbWVudC0tPjwvYm9keT48L2h0bWw+JztcbiAgfVxuXG4gIHByb3RlY3RlZCBfcm93RW5kKHJvdzogbnVtYmVyLCBpc0xhc3RSb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPGRpdj48c3Bhbj4nICsgdGhpcy5fY3VycmVudFJvdyArICc8L3NwYW4+PC9kaXY+JztcbiAgICB0aGlzLl9jdXJyZW50Um93ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIZXhDb2xvcihjZWxsOiBJQnVmZmVyQ2VsbCwgaXNGZzogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29sb3IgPSBpc0ZnID8gY2VsbC5nZXRGZ0NvbG9yKCkgOiBjZWxsLmdldEJnQ29sb3IoKTtcbiAgICBpZiAoaXNGZyA/IGNlbGwuaXNGZ1JHQigpIDogY2VsbC5pc0JnUkdCKCkpIHtcbiAgICAgIGNvbnN0IHJnYiA9IFtcbiAgICAgICAgKGNvbG9yID4+IDE2KSAmIDI1NSxcbiAgICAgICAgKGNvbG9yID4+ICA4KSAmIDI1NSxcbiAgICAgICAgKGNvbG9yICAgICAgKSAmIDI1NVxuICAgICAgXTtcbiAgICAgIHJldHVybiAnIycgKyByZ2IubWFwKHggPT4gdGhpcy5fcGFkU3RhcnQoeC50b1N0cmluZygxNiksIDIsICcwJykpLmpvaW4oJycpO1xuICAgIH1cbiAgICBpZiAoaXNGZyA/IGNlbGwuaXNGZ1BhbGV0dGUoKSA6IGNlbGwuaXNCZ1BhbGV0dGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Fuc2lDb2xvcnNbY29sb3JdLmNzcztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX2RpZmZTdHlsZShjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29udGVudDogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IGZnQ2hhbmdlZCA9ICFlcXVhbEZnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGJnQ2hhbmdlZCA9ICFlcXVhbEJnKGNlbGwsIG9sZENlbGwpO1xuICAgIGNvbnN0IGZsYWdzQ2hhbmdlZCA9ICFlcXVhbEZsYWdzKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgaWYgKGZnQ2hhbmdlZCB8fCBiZ0NoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7XG4gICAgICBjb25zdCBmZ0hleENvbG9yID0gdGhpcy5fZ2V0SGV4Q29sb3IoY2VsbCwgdHJ1ZSk7XG4gICAgICBpZiAoZmdIZXhDb2xvcikge1xuICAgICAgICBjb250ZW50LnB1c2goJ2NvbG9yOiAnICsgZmdIZXhDb2xvciArICc7Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCBmYWxzZSk7XG4gICAgICBpZiAoYmdIZXhDb2xvcikge1xuICAgICAgICBjb250ZW50LnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNJbnZlcnNlKCkpIHsgY29udGVudC5wdXNoKCdjb2xvcjogIzAwMDAwMDsgYmFja2dyb3VuZC1jb2xvcjogI0JGQkZCRjsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNCb2xkKCkpIHsgY29udGVudC5wdXNoKCdmb250LXdlaWdodDogYm9sZDsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSAmJiBjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUgdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzVW5kZXJsaW5lKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsnKTsgfVxuICAgICAgZWxzZSBpZiAoY2VsbC5pc092ZXJsaW5lKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JsaW5rKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IGJsaW5rOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpKSB7IGNvbnRlbnQucHVzaCgndmlzaWJpbGl0eTogaGlkZGVuOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0l0YWxpYygpKSB7IGNvbnRlbnQucHVzaCgnZm9udC1zdHlsZTogaXRhbGljOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0RpbSgpKSB7IGNvbnRlbnQucHVzaCgnb3BhY2l0eTogMC41OycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1N0cmlrZXRocm91Z2goKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOycpOyB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25leHRDZWxsKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYSB3aWR0aCAwIGNlbGwgZG9uJ3QgbmVlZCB0byBiZSBjb3VudCBiZWNhdXNlIGl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhZnRlciBhIENKSyBjaGFyYWN0ZXI7XG4gICAgY29uc3QgaXNQbGFjZUhvbGRlckNlbGwgPSBjZWxsLmdldFdpZHRoKCkgPT09IDA7XG4gICAgaWYgKGlzUGxhY2VIb2xkZXJDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjZWxsIGRvbid0IGhhdmUgY29udGVudFxuICAgIGNvbnN0IGlzRW1wdHlDZWxsID0gY2VsbC5nZXRDaGFycygpID09PSAnJztcblxuICAgIGNvbnN0IHN0eWxlRGVmaW5pdGlvbnMgPSB0aGlzLl9kaWZmU3R5bGUoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICAvLyBoYW5kbGVzIHN0eWxlIGNoYW5nZVxuICAgIGlmIChzdHlsZURlZmluaXRpb25zKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IHN0eWxlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwID9cbiAgICAgICAgJzwvc3Bhbj48c3Bhbj4nIDpcbiAgICAgICAgJzwvc3Bhbj48c3BhbiBzdHlsZT1cXCcnICsgc3R5bGVEZWZpbml0aW9ucy5qb2luKCcgJykgKyAnXFwnPic7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlcyBhY3R1YWwgY29udGVudFxuICAgIGlmIChpc0VtcHR5Q2VsbCkge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gY2VsbC5nZXRDaGFycygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWxDb250ZW50O1xuICB9XG59XG4iXX0=
|