@fest-lib/lure 0.1.19 → 0.1.20

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.
@@ -0,0 +1,3075 @@
1
+ "use strict";
2
+ (function() {
3
+ var Z = Object.defineProperty, De = (e, t, n) => () => {
4
+ if (n) throw n[0];
5
+ try {
6
+ return e && (t = e(e = 0)), t;
7
+ } catch (s) {
8
+ throw n = [s], s;
9
+ }
10
+ }, Ne = (e, t) => {
11
+ let n = {};
12
+ for (var s in e) Z(n, s, {
13
+ get: e[s],
14
+ enumerable: !0
15
+ });
16
+ return t || Z(n, Symbol.toStringTag, { value: "Module" }), n;
17
+ };
18
+ function Le() {
19
+ const e = globalThis;
20
+ if (typeof e.HTMLElement == "function") return;
21
+ const t = class {}, n = (s) => {
22
+ typeof e[s] != "function" && (e[s] = t);
23
+ };
24
+ n("EventTarget"), n("Node"), n("Element"), n("HTMLElement"), n("SVGElement"), n("Text"), n("Comment"), n("DocumentFragment"), n("ShadowRoot"), n("HTMLDocument"), n("Document"), n("HTMLBodyElement"), n("HTMLHeadElement"), n("HTMLCanvasElement"), n("HTMLInputElement"), n("HTMLLinkElement"), n("HTMLStyleElement"), n("HTMLPreElement"), n("HTMLDivElement"), n("CSSStyleRule"), n("CSSLayerBlockRule");
25
+ }
26
+ var je = class {
27
+ channels = /* @__PURE__ */ new Map();
28
+ listeners = /* @__PURE__ */ new Map();
29
+ register(e, t) {
30
+ this.channels.set(e, t);
31
+ const n = this.listeners.get(e);
32
+ if (n) for (const s of n) try {
33
+ s(t);
34
+ } catch (r) {
35
+ console.error(`[ChannelRegistry] Listener error for ${e}:`, r);
36
+ }
37
+ return t;
38
+ }
39
+ get(e) {
40
+ return this.channels.get(e);
41
+ }
42
+ has(e) {
43
+ return this.channels.has(e);
44
+ }
45
+ unregister(e) {
46
+ const t = this.channels.delete(e);
47
+ if (t) {
48
+ const n = this.listeners.get(e);
49
+ if (n) for (const s of n) try {
50
+ s(null);
51
+ } catch (r) {
52
+ console.error(`[ChannelRegistry] Unregister listener error for ${e}:`, r);
53
+ }
54
+ }
55
+ return t;
56
+ }
57
+ onChannelChange(e, t) {
58
+ this.listeners.has(e) || this.listeners.set(e, /* @__PURE__ */ new Set());
59
+ const n = this.listeners.get(e);
60
+ if (n.add(t), this.channels.has(e)) try {
61
+ t(this.channels.get(e));
62
+ } catch (s) {
63
+ console.error(`[ChannelRegistry] Initial listener error for ${e}:`, s);
64
+ }
65
+ return () => {
66
+ n.delete(t), n.size === 0 && this.listeners.delete(e);
67
+ };
68
+ }
69
+ getChannelNames() {
70
+ return Array.from(this.channels.keys());
71
+ }
72
+ clear() {
73
+ this.channels.clear(), this.listeners.clear();
74
+ }
75
+ };
76
+ new je();
77
+ var qe = class {
78
+ healthChecks = /* @__PURE__ */ new Map();
79
+ intervals = /* @__PURE__ */ new Map();
80
+ healthStatus = /* @__PURE__ */ new Map();
81
+ registerHealthCheck(e, t, n = 3e4) {
82
+ this.healthChecks.set(e, t);
83
+ const s = this.intervals.get(e);
84
+ s && clearInterval(s);
85
+ const r = setInterval(async () => {
86
+ try {
87
+ const o = await t();
88
+ this.healthStatus.set(e, o), o || console.warn(`[ChannelHealth] Channel '${e}' is unhealthy`);
89
+ } catch (o) {
90
+ console.error(`[ChannelHealth] Health check failed for '${e}':`, o), this.healthStatus.set(e, !1);
91
+ }
92
+ }, n);
93
+ this.intervals.set(e, r), t().then((o) => {
94
+ this.healthStatus.set(e, o);
95
+ }).catch(() => {
96
+ this.healthStatus.set(e, !1);
97
+ });
98
+ }
99
+ isHealthy(e) {
100
+ return this.healthStatus.get(e) ?? !1;
101
+ }
102
+ getAllHealthStatuses() {
103
+ const e = {};
104
+ for (const [t, n] of this.healthStatus) e[t] = n;
105
+ return e;
106
+ }
107
+ stopMonitoring(e) {
108
+ const t = this.intervals.get(e);
109
+ t && (clearInterval(t), this.intervals.delete(e)), this.healthChecks.delete(e), this.healthStatus.delete(e);
110
+ }
111
+ stopAllMonitoring() {
112
+ for (const e of this.intervals.values()) clearInterval(e);
113
+ this.intervals.clear(), this.healthChecks.clear(), this.healthStatus.clear();
114
+ }
115
+ };
116
+ new qe();
117
+ WeakMap.prototype.getOrInsert ??= function(e, t) {
118
+ return this.has(e) || this.set(e, t), this.get(e);
119
+ }, WeakMap.prototype.getOrInsertComputed ??= function(e, t) {
120
+ return this.has(e) || this.set(e, t(e)), this.get(e);
121
+ }, Map.prototype.getOrInsert ??= function(e, t) {
122
+ return this.has(e) || this.set(e, t), this.get(e);
123
+ }, Map.prototype.getOrInsertComputed ??= function(e, t) {
124
+ return this.has(e) || this.set(e, t(e)), this.get(e);
125
+ };
126
+ var ee = Symbol.for("@fix"), C = (e) => typeof e == "string" || typeof e == "number" || typeof e == "boolean" || typeof e == "bigint" || typeof e > "u" || e == null, Be = (e, t) => C(e) ? t == "number" ? Number(e) || 0 : t == "string" ? String(e) || "" : t == "boolean" ? !!e : e : null, f = (e, t) => e?.[ee] ?? e ?? t ?? t, We = (e) => {
127
+ if (typeof e == "function" || e == null) return e;
128
+ const t = function() {};
129
+ return t[ee] = e, t;
130
+ }, He = (e) => crypto?.getRandomValues ? crypto?.getRandomValues?.(e) : (() => {
131
+ const t = new Uint8Array(e.length);
132
+ for (let n = 0; n < e.length; n++) t[n] = Math.floor(Math.random() * 256);
133
+ return t;
134
+ })(), d = () => crypto?.randomUUID ? crypto?.randomUUID?.() : "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (e) => (+e ^ He?.(/* @__PURE__ */ new Uint8Array(1))?.[0] & 15 >> +e / 4).toString(16)), te = (e) => Array.isArray(e) ? e?.flatMap?.((t) => Array.isArray(t) ? te(t) : t) : e, $ = (e) => te(e)?.every?.(S), S = (e) => C(e) || typeof SharedArrayBuffer == "function" && e instanceof SharedArrayBuffer || Fe(e) || Array.isArray(e) && $(e), Fe = (e) => ArrayBuffer.isView(e) && !(e instanceof DataView), U = (e) => C(e) || typeof ArrayBuffer == "function" && e instanceof ArrayBuffer || typeof MessagePort == "function" && e instanceof MessagePort || typeof ReadableStream == "function" && e instanceof ReadableStream || typeof WritableStream == "function" && e instanceof WritableStream || typeof TransformStream == "function" && e instanceof TransformStream || typeof ImageBitmap == "function" && e instanceof ImageBitmap || typeof VideoFrame == "function" && e instanceof VideoFrame || typeof OffscreenCanvas == "function" && e instanceof OffscreenCanvas || typeof RTCDataChannel == "function" && e instanceof RTCDataChannel || typeof AudioData == "function" && e instanceof AudioData || typeof WebTransportReceiveStream == "function" && e instanceof WebTransportReceiveStream || typeof WebTransportSendStream == "function" && e instanceof WebTransportSendStream || typeof WebTransportReceiveStream == "function" && e instanceof WebTransportReceiveStream, ne = Symbol.for("object.boundCtx");
135
+ globalThis[ne] ??= /* @__PURE__ */ new WeakMap();
136
+ globalThis[ne];
137
+ var k = (e, t, n) => {
138
+ if (Array.isArray(e)) return e.every(S) ? e.map(t) : e.map((s, r) => k(s, t, [e, r]));
139
+ if (e instanceof Map) {
140
+ const s = Array.from(e.entries());
141
+ return s.map(([r, o]) => o).every(S) ? new Map(s.map(([r, o]) => [r, t(o, r, e)])) : new Map(s.map(([r, o]) => [r, k(o, t, [e, r])]));
142
+ }
143
+ if (e instanceof Set) {
144
+ const s = Array.from(e.entries()), r = s.map(([o, a]) => a);
145
+ return s.every(S) ? new Set(r.map(t)) : new Set(r.map((o) => k(o, t, [e, o])));
146
+ }
147
+ if (typeof e == "object" && e?.constructor == Object && Object.prototype.toString.call(e) == "[object Object]") {
148
+ const s = Array.from(Object.entries(e));
149
+ return s.map(([r, o]) => o).every(S) ? Object.fromEntries(s.map(([r, o]) => [r, t(o, r, e)])) : Object.fromEntries(s.map(([r, o]) => [r, k(o, t, [e, r])]));
150
+ }
151
+ return t(e, n?.[1] ?? "", n?.[0] ?? null);
152
+ }, v = /* @__PURE__ */ new WeakMap(), se = /* @__PURE__ */ new WeakMap(), m = (e, t) => e instanceof Promise || typeof e?.then == "function" ? v?.has?.(e) ? t(v?.get?.(e)) : Promise.try?.(async () => {
153
+ const n = await e;
154
+ return v?.set?.(e, n), n;
155
+ })?.then?.(t) : t(e), Ge = class {
156
+ #e;
157
+ #t;
158
+ constructor(e, t) {
159
+ this.#e = e, this.#t = t;
160
+ }
161
+ defineProperty(e, t, n) {
162
+ return f(e) instanceof Promise ? Reflect.defineProperty(e, t, n) : m(f(e), (s) => Reflect.defineProperty(s, t, n));
163
+ }
164
+ deleteProperty(e, t) {
165
+ return f(e) instanceof Promise ? Reflect.deleteProperty(e, t) : m(f(e), (n) => Reflect.deleteProperty(n, t));
166
+ }
167
+ getPrototypeOf(e) {
168
+ return f(e) instanceof Promise ? Reflect.getPrototypeOf(e) : m(f(e), (t) => Reflect.getPrototypeOf(t));
169
+ }
170
+ setPrototypeOf(e, t) {
171
+ return f(e) instanceof Promise ? Reflect.setPrototypeOf(e, t) : m(f(e), (n) => Reflect.setPrototypeOf(n, t));
172
+ }
173
+ isExtensible(e) {
174
+ return f(e) instanceof Promise ? Reflect.isExtensible(e) : m(f(e), (t) => Reflect.isExtensible(t));
175
+ }
176
+ preventExtensions(e) {
177
+ return f(e) instanceof Promise ? Reflect.ownKeys(e) : m(f(e), (t) => Reflect.preventExtensions(t));
178
+ }
179
+ ownKeys(e) {
180
+ const t = f(e);
181
+ return t instanceof Promise ? Object.keys(t) : m(t, (n) => (typeof n == "object" || typeof n == "function") && n != null ? Object.keys(n) : []) ?? [];
182
+ }
183
+ getOwnPropertyDescriptor(e, t) {
184
+ return f(e) instanceof Promise ? Reflect.getOwnPropertyDescriptor(e, t) : m(f(e), (n) => Reflect.getOwnPropertyDescriptor(n, t));
185
+ }
186
+ construct(e, t, n) {
187
+ return m(f(e), (s) => Reflect.construct(s, t, n));
188
+ }
189
+ has(e, t) {
190
+ return f(e) instanceof Promise ? Reflect.has(e, t) : m(f(e), (n) => Reflect.has(n, t));
191
+ }
192
+ get(e, t, n) {
193
+ if (e = f(e), t == "promise") return e;
194
+ if (t == "resolve" && this.#e) return (...r) => {
195
+ const o = this.#e?.(...r);
196
+ return this.#e = null, o;
197
+ };
198
+ if (t == "reject" && this.#t) return (...r) => {
199
+ const o = this.#t?.(...r);
200
+ return this.#t = null, o;
201
+ };
202
+ if (t == "then" || t == "catch" || t == "finally") {
203
+ if (e instanceof Promise) return e?.[t]?.bind?.(e);
204
+ {
205
+ const r = Promise.try(() => e);
206
+ return r?.[t]?.bind?.(r);
207
+ }
208
+ }
209
+ let s;
210
+ return v?.has?.(e) && (s = v?.get?.(e))?.[t] != null ? s = v?.get?.(e)?.[t] : s = re(m(e, async (r) => {
211
+ if (f(r) instanceof Promise) return Reflect.get(r, t, n);
212
+ if (C(r)) return t == Symbol.toPrimitive || t == Symbol.toStringTag ? r : void 0;
213
+ let o;
214
+ try {
215
+ o = Reflect.get(r, t, n);
216
+ } catch {
217
+ o = e?.[t];
218
+ }
219
+ return typeof o == "function" ? o?.bind?.(r) : o;
220
+ })), t == Symbol.toStringTag ? C(s) ? String(s ?? "") || "" : s?.[Symbol.toStringTag]?.() || String(s ?? "") || "" : t == Symbol.toPrimitive ? (r) => {
221
+ if (C(s)) return Be(s, r);
222
+ } : s;
223
+ }
224
+ set(e, t, n) {
225
+ return m(f(e), (s) => Reflect.set(s, t, n));
226
+ }
227
+ apply(e, t, n) {
228
+ if (this.#e) {
229
+ const s = this.#e?.(...n);
230
+ return this.#e = null, s;
231
+ }
232
+ return m(f(e, this.#e), (s) => {
233
+ if (typeof s == "function") return f(s) instanceof Promise, Reflect.apply(s, t, n);
234
+ });
235
+ }
236
+ };
237
+ function re(e, t, n) {
238
+ return e instanceof Promise || typeof e?.then == "function" ? v?.has?.(e) ? v?.get?.(e) : (se?.has?.(e) || e?.then?.((s) => v?.set?.(e, s)), se?.getOrInsertComputed?.(e, () => new Proxy(We(e), new Ge(t, n)))) : e;
239
+ }
240
+ Le();
241
+ var u = (function(e) {
242
+ return e.GET = "get", e.SET = "set", e.CALL = "call", e.APPLY = "apply", e.CONSTRUCT = "construct", e.DELETE = "delete", e.DELETE_PROPERTY = "deleteProperty", e.HAS = "has", e.OWN_KEYS = "ownKeys", e.GET_OWN_PROPERTY_DESCRIPTOR = "getOwnPropertyDescriptor", e.GET_PROPERTY_DESCRIPTOR = "getPropertyDescriptor", e.GET_PROTOTYPE_OF = "getPrototypeOf", e.SET_PROTOTYPE_OF = "setPrototypeOf", e.IS_EXTENSIBLE = "isExtensible", e.PREVENT_EXTENSIONS = "preventExtensions", e.TRANSFER = "transfer", e.IMPORT = "import", e.DISPOSE = "dispose", e;
243
+ })({}), $e = {
244
+ ws: "websocket",
245
+ socket: "websocket",
246
+ socketio: "socket-io",
247
+ service: "service-worker",
248
+ sw: "service-worker",
249
+ "service-worker-client": "service-worker",
250
+ "service-worker-host": "service-worker",
251
+ "ring-buffer": "atomics"
252
+ };
253
+ function Ue(e) {
254
+ const t = String(e ?? "").trim().toLowerCase();
255
+ return t ? $e[t] ?? t : "internal";
256
+ }
257
+ function Xe(e) {
258
+ return typeof e == "string" ? Ue(e) : typeof Worker < "u" && e instanceof Worker ? "worker" : typeof SharedWorker < "u" && e instanceof SharedWorker ? "shared-worker" : typeof MessagePort < "u" && e instanceof MessagePort ? "message-port" : typeof BroadcastChannel < "u" && e instanceof BroadcastChannel ? "broadcast" : typeof WebSocket < "u" && e instanceof WebSocket ? "websocket" : typeof RTCDataChannel < "u" && e instanceof RTCDataChannel ? "rtc-data" : typeof chrome < "u" && e && typeof e == "object" && typeof e.postMessage == "function" && e.onMessage?.addListener ? "chrome-port" : "internal";
259
+ }
260
+ var oe = class {
261
+ _unsubscribe;
262
+ _closed = !1;
263
+ constructor(e) {
264
+ this._unsubscribe = e;
265
+ }
266
+ get closed() {
267
+ return this._closed;
268
+ }
269
+ unsubscribe() {
270
+ this._closed || (this._closed = !0, this._unsubscribe());
271
+ }
272
+ }, ze = class {
273
+ _producer;
274
+ constructor(e) {
275
+ this._producer = e;
276
+ }
277
+ subscribe(e, t) {
278
+ const n = typeof e == "function" ? { next: e } : e ?? {}, s = new AbortController();
279
+ t?.signal?.addEventListener("abort", () => s.abort());
280
+ let r = !0, o;
281
+ const a = () => {
282
+ r = !1, s.abort(), o?.();
283
+ }, i = {
284
+ next: (c) => r && n.next?.(c),
285
+ error: (c) => {
286
+ r && (n.error?.(c), a());
287
+ },
288
+ complete: () => {
289
+ r && (n.complete?.(), a());
290
+ },
291
+ signal: s.signal,
292
+ get active() {
293
+ return r && !s.signal.aborted;
294
+ }
295
+ };
296
+ try {
297
+ o = this._producer(i);
298
+ } catch (c) {
299
+ i.error(c);
300
+ }
301
+ return new oe(a);
302
+ }
303
+ pipe(...e) {
304
+ return e.reduce((t, n) => n(t), this);
305
+ }
306
+ }, g = class {
307
+ _subs = /* @__PURE__ */ new Set();
308
+ _buffer = [];
309
+ _maxBuffer;
310
+ _replay;
311
+ constructor(e = {}) {
312
+ this._maxBuffer = e.bufferSize ?? 0, this._replay = e.replayOnSubscribe ?? !1;
313
+ }
314
+ next(e) {
315
+ this._maxBuffer > 0 && (this._buffer.push(e), this._buffer.length > this._maxBuffer && this._buffer.shift());
316
+ for (const t of this._subs) try {
317
+ t.next?.(e);
318
+ } catch (n) {
319
+ t.error?.(n);
320
+ }
321
+ }
322
+ error(e) {
323
+ for (const t of this._subs) t.error?.(e);
324
+ }
325
+ complete() {
326
+ for (const e of this._subs) e.complete?.();
327
+ this._subs.clear();
328
+ }
329
+ subscribe(e) {
330
+ const t = typeof e == "function" ? { next: e } : e;
331
+ if (this._subs.add(t), this._replay) for (const n of this._buffer) try {
332
+ t.next?.(n);
333
+ } catch (s) {
334
+ t.error?.(s);
335
+ }
336
+ return new oe(() => {
337
+ this._subs.delete(t);
338
+ });
339
+ }
340
+ getValue() {
341
+ return this._buffer.at(-1);
342
+ }
343
+ getBuffer() {
344
+ return [...this._buffer];
345
+ }
346
+ get subscriberCount() {
347
+ return this._subs.size;
348
+ }
349
+ }, Ye = (e) => (t) => new ze((n) => {
350
+ const s = t.subscribe({
351
+ next: (r) => e(r) && n.next(r),
352
+ error: (r) => n.error(r),
353
+ complete: () => n.complete()
354
+ });
355
+ return () => s.unsubscribe();
356
+ });
357
+ function ae() {
358
+ if (typeof globalThis.Deno < "u") return "deno";
359
+ if (typeof globalThis.process < "u" && globalThis.process?.versions?.node) return "node";
360
+ const e = globalThis.ServiceWorkerGlobalScope, t = globalThis.SharedWorkerGlobalScope, n = globalThis.DedicatedWorkerGlobalScope;
361
+ if (e && self instanceof e) return "service-worker";
362
+ if (t && self instanceof t) return "shared-worker";
363
+ if (n && self instanceof n) return "worker";
364
+ if (typeof chrome < "u" && chrome.runtime?.id) {
365
+ if (typeof chrome.runtime.getBackgroundPage == "function" || chrome.runtime.getManifest?.()?.background?.service_worker) return "chrome-background";
366
+ if (typeof chrome.devtools < "u") return "chrome-devtools";
367
+ if (typeof document < "u" && globalThis?.location?.protocol === "chrome-extension:" && (chrome.extension?.getViews?.({ type: "popup" }) ?? []).includes(globalThis)) return "chrome-popup";
368
+ if (typeof document < "u" && globalThis?.location?.protocol !== "chrome-extension:") return "chrome-content";
369
+ }
370
+ return typeof globalThis < "u" && typeof document < "u" ? "window" : "unknown";
371
+ }
372
+ function ie(e) {
373
+ if (typeof RTCDataChannel < "u" && e instanceof RTCDataChannel) return "rtc-data";
374
+ const t = Xe(e);
375
+ return t && t !== "internal" ? t : e === self || e === globalThis || e === "self" ? "self" : "internal";
376
+ }
377
+ function Ke(e) {
378
+ if (!e) return "unknown";
379
+ if (e.contextType) return e.contextType;
380
+ const t = e.sender ?? "";
381
+ return t.includes("worker") ? "worker" : t.includes("sw") || t.includes("service") ? "service-worker" : t.includes("chrome") || t.includes("crx") ? "chrome-content" : t.includes("background") ? "chrome-background" : "unknown";
382
+ }
383
+ var Ve = {
384
+ get: (e, t) => Reflect.get(e, t),
385
+ set: (e, t, n) => Reflect.set(e, t, n),
386
+ has: (e, t) => Reflect.has(e, t),
387
+ apply: (e, t, n) => Reflect.apply(e, t, n),
388
+ construct: (e, t) => Reflect.construct(e, t),
389
+ deleteProperty: (e, t) => Reflect.deleteProperty(e, t),
390
+ ownKeys: (e) => Reflect.ownKeys(e),
391
+ getOwnPropertyDescriptor: (e, t) => Reflect.getOwnPropertyDescriptor(e, t),
392
+ getPrototypeOf: (e) => Reflect.getPrototypeOf(e),
393
+ setPrototypeOf: (e, t) => Reflect.setPrototypeOf(e, t),
394
+ isExtensible: (e) => Reflect.isExtensible(e),
395
+ preventExtensions: (e) => Reflect.preventExtensions(e)
396
+ }, Je = Symbol.for("uniform.proxy"), Qe = Symbol.for("uniform.proxy.internals"), Ze = class {
397
+ _invoker;
398
+ _config;
399
+ _childCache = /* @__PURE__ */ new Map();
400
+ constructor(e, t) {
401
+ this._invoker = e, this._config = {
402
+ channel: t.channel,
403
+ basePath: t.basePath ?? [],
404
+ invoker: e,
405
+ cache: t.cache ?? !0,
406
+ timeout: t.timeout ?? 3e4
407
+ };
408
+ }
409
+ get(e, t, n) {
410
+ const s = String(t);
411
+ if (t === Je) return !0;
412
+ if (t === Qe) return this._config;
413
+ if (t === ht) return !0;
414
+ if (t === D) return this._getDescriptor();
415
+ if (t === "then" || t === "catch" || t === "finally" || typeof t == "symbol") return;
416
+ if (t === "$path") return this._config.basePath;
417
+ if (t === "$channel") return this._config.channel;
418
+ if (t === "$descriptor") return this._getDescriptor();
419
+ if (t === "$invoke") return this._invoker;
420
+ const r = [...this._config.basePath, s];
421
+ if (this._config.cache && this._childCache.has(s)) return this._childCache.get(s);
422
+ const o = W(this._invoker, {
423
+ ...this._config,
424
+ basePath: r
425
+ });
426
+ return this._config.cache && this._childCache.set(s, o), o;
427
+ }
428
+ set(e, t, n, s) {
429
+ return typeof t == "symbol" || this._invoker(u.SET, [...this._config.basePath, String(t)], [n]), !0;
430
+ }
431
+ apply(e, t, n) {
432
+ return this._invoker(u.APPLY, this._config.basePath, [n]);
433
+ }
434
+ construct(e, t, n) {
435
+ return this._invoker(u.CONSTRUCT, this._config.basePath, [t]);
436
+ }
437
+ has(e, t) {
438
+ return typeof t == "symbol" ? !1 : this._invoker(u.HAS, this._config.basePath, [t]);
439
+ }
440
+ deleteProperty(e, t) {
441
+ return typeof t == "symbol" ? !0 : this._invoker(u.DELETE_PROPERTY, [...this._config.basePath, String(t)], []);
442
+ }
443
+ ownKeys(e) {
444
+ return [];
445
+ }
446
+ getOwnPropertyDescriptor(e, t) {
447
+ return {
448
+ configurable: !0,
449
+ enumerable: !0,
450
+ writable: !0
451
+ };
452
+ }
453
+ getPrototypeOf(e) {
454
+ return Function.prototype;
455
+ }
456
+ setPrototypeOf(e, t) {
457
+ return this._invoker(u.SET_PROTOTYPE_OF, this._config.basePath, [t]);
458
+ }
459
+ isExtensible(e) {
460
+ return !0;
461
+ }
462
+ preventExtensions(e) {
463
+ return this._invoker(u.PREVENT_EXTENSIONS, this._config.basePath, []);
464
+ }
465
+ _getDescriptor() {
466
+ return {
467
+ path: this._config.basePath,
468
+ channel: this._config.channel,
469
+ primitive: !1
470
+ };
471
+ }
472
+ };
473
+ function W(e, t) {
474
+ const n = function() {}, s = new Ze(e, t);
475
+ return new Proxy(n, s);
476
+ }
477
+ function ce(e, t, n) {
478
+ if (!e || typeof e != "object" || e.primitive) return e;
479
+ const s = _e.get(e);
480
+ if (s) return s;
481
+ const r = W(t, {
482
+ channel: n ?? e.channel ?? "unknown",
483
+ basePath: e.path ?? []
484
+ });
485
+ return _e.set(e, r), Y.set(r, e), r;
486
+ }
487
+ var nt = ce;
488
+ function st(e) {
489
+ return [
490
+ e.localChannel,
491
+ e.remoteChannel,
492
+ e.sender,
493
+ e.transportType,
494
+ e.direction
495
+ ].join("::");
496
+ }
497
+ function rt(e, t = {}) {
498
+ const n = t.includeClosed ?? !1, s = t.status ?? (n ? void 0 : "active");
499
+ return [...e].filter((r) => !(s && r.status !== s || t.channel && r.localChannel !== t.channel && r.remoteChannel !== t.channel || t.localChannel && r.localChannel !== t.localChannel || t.remoteChannel && r.remoteChannel !== t.remoteChannel || t.sender && r.sender !== t.sender || t.transportType && r.transportType !== t.transportType || t.direction && r.direction !== t.direction)).sort((r, o) => o.updatedAt - r.updatedAt);
500
+ }
501
+ var le = class {
502
+ _createId;
503
+ _emitEvent;
504
+ _connections = /* @__PURE__ */ new Map();
505
+ constructor(e, t) {
506
+ this._createId = e, this._emitEvent = t;
507
+ }
508
+ register(e) {
509
+ const t = st(e), n = Date.now(), s = this._connections.get(t);
510
+ if (s) return s.updatedAt = n, s.status = "active", s.metadata = {
511
+ ...s.metadata,
512
+ ...e.metadata
513
+ }, s;
514
+ const r = {
515
+ id: this._createId(),
516
+ localChannel: e.localChannel,
517
+ remoteChannel: e.remoteChannel,
518
+ sender: e.sender,
519
+ transportType: e.transportType,
520
+ direction: e.direction,
521
+ status: "active",
522
+ createdAt: n,
523
+ updatedAt: n,
524
+ metadata: e.metadata
525
+ };
526
+ return this._connections.set(t, r), this._emitEvent?.({
527
+ type: "connected",
528
+ connection: r,
529
+ timestamp: n
530
+ }), r;
531
+ }
532
+ markNotified(e, t) {
533
+ const n = Date.now();
534
+ e.lastNotifyAt = n, e.updatedAt = n, this._emitEvent?.({
535
+ type: "notified",
536
+ connection: e,
537
+ timestamp: n,
538
+ payload: t
539
+ });
540
+ }
541
+ closeByChannel(e) {
542
+ const t = Date.now();
543
+ for (const n of this._connections.values()) n.localChannel !== e && n.remoteChannel !== e || n.status !== "closed" && (n.status = "closed", n.updatedAt = t, this._emitEvent?.({
544
+ type: "disconnected",
545
+ connection: n,
546
+ timestamp: t
547
+ }));
548
+ }
549
+ closeAll() {
550
+ const e = Date.now();
551
+ for (const t of this._connections.values()) t.status !== "closed" && (t.status = "closed", t.updatedAt = e, this._emitEvent?.({
552
+ type: "disconnected",
553
+ connection: t,
554
+ timestamp: e
555
+ }));
556
+ }
557
+ query(e = {}) {
558
+ return rt(this._connections.values(), e);
559
+ }
560
+ values() {
561
+ return [...this._connections.values()];
562
+ }
563
+ clear() {
564
+ this._connections.clear();
565
+ }
566
+ }, he = class {
567
+ _name;
568
+ _contextType;
569
+ _config;
570
+ _transports = /* @__PURE__ */ new Map();
571
+ _defaultTransport = null;
572
+ _connectionEvents = new g({ bufferSize: 200 });
573
+ _connectionRegistry = new le(() => d(), (e) => this._connectionEvents.next(e));
574
+ _pending = /* @__PURE__ */ new Map();
575
+ _subscriptions = [];
576
+ _inbound = new g({ bufferSize: 100 });
577
+ _outbound = new g({ bufferSize: 100 });
578
+ _invocations = new g({ bufferSize: 100 });
579
+ _responses = new g({ bufferSize: 100 });
580
+ _exposed = /* @__PURE__ */ new Map();
581
+ _proxyCache = /* @__PURE__ */ new WeakMap();
582
+ __getPrivate(e) {
583
+ return this[e];
584
+ }
585
+ __setPrivate(e, t) {
586
+ this[e] = t;
587
+ }
588
+ constructor(e) {
589
+ const t = typeof e == "string" ? { name: e } : e;
590
+ this._name = t.name, this._contextType = t.autoDetect !== !1 ? ae() : "unknown", this._config = {
591
+ name: t.name,
592
+ autoDetect: t.autoDetect ?? !0,
593
+ timeout: t.timeout ?? 3e4,
594
+ reflect: t.reflect ?? Ve,
595
+ bufferSize: t.bufferSize ?? 100,
596
+ autoListen: t.autoListen ?? !0
597
+ }, this._config.autoListen && this._isWorkerContext() && this.listen(self);
598
+ }
599
+ connect(e, t = {}) {
600
+ const n = ie(e), s = t.targetChannel ?? this._inferTargetChannel(e, n), r = this._createTransportBinding(e, n, s, t);
601
+ this._transports.set(s, r), this._defaultTransport || (this._defaultTransport = r);
602
+ const o = this._registerConnection({
603
+ localChannel: this._name,
604
+ remoteChannel: s,
605
+ sender: this._name,
606
+ transportType: n,
607
+ direction: "outgoing",
608
+ metadata: { phase: "connect" }
609
+ });
610
+ return this._emitConnectionSignal(r, "connect", {
611
+ connectionId: o.id,
612
+ from: this._name,
613
+ to: s
614
+ }), this;
615
+ }
616
+ listen(e, t = {}) {
617
+ const n = ie(e), s = t.targetChannel ?? this._inferTargetChannel(e, n), r = (a) => this._handleIncoming(a), o = this._registerConnection({
618
+ localChannel: this._name,
619
+ remoteChannel: s,
620
+ sender: s,
621
+ transportType: n,
622
+ direction: "incoming",
623
+ metadata: { phase: "listen" }
624
+ });
625
+ switch (n) {
626
+ case "worker":
627
+ case "message-port":
628
+ case "broadcast":
629
+ t.autoStart !== !1 && e.start && e.start(), e.addEventListener?.("message", ((a) => r(a.data)));
630
+ break;
631
+ case "websocket":
632
+ e.addEventListener?.("message", ((a) => {
633
+ try {
634
+ r(JSON.parse(a.data));
635
+ } catch {}
636
+ }));
637
+ break;
638
+ case "chrome-runtime":
639
+ chrome.runtime.onMessage?.addListener?.((a, i, c) => (r(a), !0));
640
+ break;
641
+ case "chrome-tabs":
642
+ chrome.runtime.onMessage?.addListener?.((a, i) => t.tabId != null && i?.tab?.id !== t.tabId ? !1 : (r(a), !0));
643
+ break;
644
+ case "chrome-port":
645
+ e?.onMessage?.addListener?.((a) => {
646
+ r(a);
647
+ });
648
+ break;
649
+ case "chrome-external":
650
+ chrome.runtime.onMessageExternal?.addListener?.((a) => (r(a), !0));
651
+ break;
652
+ case "self":
653
+ addEventListener?.("message", ((a) => r(a.data)));
654
+ break;
655
+ default: t.onMessage && t.onMessage(r);
656
+ }
657
+ return this._sendSignalToTarget(e, n, {
658
+ connectionId: o.id,
659
+ from: this._name,
660
+ to: s,
661
+ tabId: t.tabId,
662
+ externalId: t.externalId
663
+ }, "notify"), this;
664
+ }
665
+ attach(e, t = {}) {
666
+ return this.connect(e, t);
667
+ }
668
+ expose(e, t) {
669
+ const n = [e];
670
+ return F(n, t), this._exposed.set(e, {
671
+ name: e,
672
+ obj: t,
673
+ path: n
674
+ }), this;
675
+ }
676
+ exposeAll(e) {
677
+ for (const [t, n] of Object.entries(e)) this.expose(t, n);
678
+ return this;
679
+ }
680
+ async import(e, t) {
681
+ return this.invoke(t ?? this._getDefaultTarget(), u.IMPORT, [], [e]);
682
+ }
683
+ invoke(e, t, n, s = []) {
684
+ const r = d(), o = Promise.withResolvers();
685
+ this._pending.set(r, o);
686
+ const a = setTimeout(() => {
687
+ this._pending.has(r) && (this._pending.delete(r), o.reject(/* @__PURE__ */ new Error(`Request timeout: ${t} on ${n.join(".")}`)));
688
+ }, this._config.timeout), i = {
689
+ id: r,
690
+ channel: e,
691
+ sender: this._name,
692
+ type: "request",
693
+ payload: {
694
+ channel: e,
695
+ sender: this._name,
696
+ action: t,
697
+ path: n,
698
+ args: s
699
+ },
700
+ timestamp: Date.now()
701
+ };
702
+ return this._send(e, i), this._outbound.next(i), o.promise.finally(() => clearTimeout(a));
703
+ }
704
+ get(e, t, n) {
705
+ return this.invoke(e, u.GET, t, [n]);
706
+ }
707
+ set(e, t, n, s) {
708
+ return this.invoke(e, u.SET, t, [n, s]);
709
+ }
710
+ call(e, t, n = []) {
711
+ return this.invoke(e, u.APPLY, t, [n]);
712
+ }
713
+ construct(e, t, n = []) {
714
+ return this.invoke(e, u.CONSTRUCT, t, [n]);
715
+ }
716
+ proxy(e, t = []) {
717
+ const n = e ?? this._getDefaultTarget();
718
+ return this._createProxy(n, t);
719
+ }
720
+ remote(e, t) {
721
+ return this.proxy(t, [e]);
722
+ }
723
+ wrapDescriptor(e, t) {
724
+ return ce(e, (n, s, r) => {
725
+ const o = t ?? e?.channel ?? this._getDefaultTarget();
726
+ return this.invoke(o, n, s, r);
727
+ }, t ?? e?.channel ?? this._getDefaultTarget());
728
+ }
729
+ subscribe(e) {
730
+ return this._inbound.subscribe(e);
731
+ }
732
+ next(e) {
733
+ this._send(e.channel, e), this._outbound.next(e);
734
+ }
735
+ emit(e, t, n) {
736
+ const s = {
737
+ id: d(),
738
+ channel: e,
739
+ sender: this._name,
740
+ type: "event",
741
+ payload: {
742
+ type: t,
743
+ data: n
744
+ },
745
+ timestamp: Date.now()
746
+ };
747
+ this.next(s);
748
+ }
749
+ notify(e, t = {}, n = "notify") {
750
+ const s = this._transports.get(e);
751
+ return s ? (this._emitConnectionSignal(s, n, {
752
+ from: this._name,
753
+ to: e,
754
+ ...t
755
+ }), !0) : !1;
756
+ }
757
+ get onMessage() {
758
+ return this._inbound;
759
+ }
760
+ get onOutbound() {
761
+ return this._outbound;
762
+ }
763
+ get onInvocation() {
764
+ return this._invocations;
765
+ }
766
+ get onResponse() {
767
+ return this._responses;
768
+ }
769
+ get onConnection() {
770
+ return this._connectionEvents;
771
+ }
772
+ subscribeConnections(e) {
773
+ return this._connectionEvents.subscribe(e);
774
+ }
775
+ queryConnections(e = {}) {
776
+ return this._connectionRegistry.query(e);
777
+ }
778
+ notifyConnections(e = {}, t = {}) {
779
+ let n = 0;
780
+ const s = this.queryConnections({
781
+ ...t,
782
+ status: "active",
783
+ includeClosed: !1
784
+ });
785
+ for (const r of s) {
786
+ const o = this._transports.get(r.remoteChannel);
787
+ o && (this._emitConnectionSignal(o, "notify", {
788
+ connectionId: r.id,
789
+ from: this._name,
790
+ to: r.remoteChannel,
791
+ ...e
792
+ }), n++);
793
+ }
794
+ return n;
795
+ }
796
+ get name() {
797
+ return this._name;
798
+ }
799
+ get contextType() {
800
+ return this._contextType;
801
+ }
802
+ get config() {
803
+ return this._config;
804
+ }
805
+ get connectedChannels() {
806
+ return [...this._transports.keys()];
807
+ }
808
+ get exposedModules() {
809
+ return [...this._exposed.keys()];
810
+ }
811
+ close() {
812
+ this._subscriptions.forEach((e) => e.unsubscribe()), this._subscriptions = [], this._pending.clear(), this._markAllConnectionsClosed();
813
+ for (const e of this._transports.values()) {
814
+ try {
815
+ e.cleanup?.();
816
+ } catch {}
817
+ if (e.transportType === "message-port" || e.transportType === "broadcast") try {
818
+ e.target?.close?.();
819
+ } catch {}
820
+ }
821
+ this._transports.clear(), this._defaultTransport = null, this._connectionRegistry.clear(), this._inbound.complete(), this._outbound.complete(), this._invocations.complete(), this._responses.complete(), this._connectionEvents.complete();
822
+ }
823
+ _handleIncoming(e) {
824
+ if (!(!e || typeof e != "object")) switch (this._inbound.next(e), e.type) {
825
+ case "request":
826
+ e.channel === this._name && this._handleRequest(e);
827
+ break;
828
+ case "response":
829
+ this._handleResponse(e);
830
+ break;
831
+ case "event": break;
832
+ case "signal": this._handleSignal(e);
833
+ }
834
+ }
835
+ _handleResponse(e) {
836
+ const t = e.reqId ?? e.id, n = this._pending.get(t);
837
+ if (n) {
838
+ if (this._pending.delete(t), e.payload?.error) n.reject(new Error(e.payload.error));
839
+ else {
840
+ const s = e.payload?.result, r = e.payload?.descriptor;
841
+ s != null ? n.resolve(s) : r ? n.resolve(this.wrapDescriptor(r, e.sender)) : n.resolve(void 0);
842
+ }
843
+ this._responses.next({
844
+ id: t,
845
+ channel: e.channel,
846
+ sender: e.sender,
847
+ result: e.payload?.result,
848
+ descriptor: e.payload?.descriptor,
849
+ timestamp: Date.now()
850
+ });
851
+ }
852
+ }
853
+ async _handleRequest(e) {
854
+ const t = e.payload;
855
+ if (!t) return;
856
+ const { action: n, path: s, args: r, sender: o } = t, a = e.reqId ?? e.id;
857
+ this._invocations.next({
858
+ id: a,
859
+ channel: this._name,
860
+ sender: o,
861
+ action: n,
862
+ path: s,
863
+ args: r ?? [],
864
+ timestamp: Date.now(),
865
+ contextType: Ke(e)
866
+ });
867
+ const { result: i, toTransfer: c, newPath: l } = await this._executeAction(n, s, r ?? [], o);
868
+ await this._sendResponse(a, n, o, l, i, c);
869
+ }
870
+ async _executeAction(e, t, n, s) {
871
+ const { result: r, toTransfer: o, path: a } = be(e, t, n, {
872
+ channel: this._name,
873
+ sender: s,
874
+ reflect: this._config.reflect
875
+ });
876
+ return {
877
+ result: await r,
878
+ toTransfer: o,
879
+ newPath: a
880
+ };
881
+ }
882
+ async _sendResponse(e, t, n, s, r, o) {
883
+ const { response: a, transfer: i } = await we(e, t, this._name, n, s, r, o), c = {
884
+ id: e,
885
+ ...a,
886
+ timestamp: Date.now(),
887
+ transferable: i
888
+ };
889
+ this._send(n, c, i);
890
+ }
891
+ _handleSignal(e) {
892
+ const t = e?.payload ?? {}, n = t.from ?? e.sender ?? "unknown", s = e.transportType ?? this._transports.get(e.channel)?.transportType ?? "internal", r = this._registerConnection({
893
+ localChannel: this._name,
894
+ remoteChannel: n,
895
+ sender: e.sender ?? n,
896
+ transportType: s,
897
+ direction: "incoming"
898
+ });
899
+ this._markConnectionNotified(r, t);
900
+ }
901
+ _registerConnection(e) {
902
+ return this._connectionRegistry.register(e);
903
+ }
904
+ _markConnectionNotified(e, t) {
905
+ this._connectionRegistry.markNotified(e, t);
906
+ }
907
+ _emitConnectionSignal(e, t, n = {}) {
908
+ const s = {
909
+ id: d(),
910
+ type: "signal",
911
+ channel: e.targetChannel,
912
+ sender: this._name,
913
+ transportType: e.transportType,
914
+ payload: {
915
+ type: t,
916
+ from: this._name,
917
+ to: e.targetChannel,
918
+ ...n
919
+ },
920
+ timestamp: Date.now()
921
+ };
922
+ (e?.sender ?? e?.postMessage)?.call(e, s);
923
+ const r = this._registerConnection({
924
+ localChannel: this._name,
925
+ remoteChannel: e.targetChannel,
926
+ sender: this._name,
927
+ transportType: e.transportType,
928
+ direction: "outgoing"
929
+ });
930
+ this._markConnectionNotified(r, s.payload);
931
+ }
932
+ _sendSignalToTarget(e, t, n, s) {
933
+ const r = {
934
+ id: d(),
935
+ type: "signal",
936
+ channel: n.to ?? this._name,
937
+ sender: this._name,
938
+ transportType: t,
939
+ payload: {
940
+ type: s,
941
+ ...n
942
+ },
943
+ timestamp: Date.now()
944
+ };
945
+ try {
946
+ if (t === "websocket") {
947
+ e?.send?.(JSON.stringify(r));
948
+ return;
949
+ }
950
+ if (t === "chrome-runtime") {
951
+ chrome.runtime?.sendMessage?.(r);
952
+ return;
953
+ }
954
+ if (t === "chrome-tabs") {
955
+ const o = n.tabId;
956
+ o != null && chrome.tabs?.sendMessage?.(o, r);
957
+ return;
958
+ }
959
+ if (t === "chrome-port") {
960
+ e?.postMessage?.(r);
961
+ return;
962
+ }
963
+ if (t === "chrome-external") {
964
+ n.externalId && chrome.runtime?.sendMessage?.(n.externalId, r);
965
+ return;
966
+ }
967
+ e?.postMessage?.(r, { transfer: [] });
968
+ } catch {}
969
+ }
970
+ _markAllConnectionsClosed() {
971
+ this._connectionRegistry.closeAll();
972
+ }
973
+ _createTransportBinding(e, t, n, s) {
974
+ let r, o;
975
+ switch (t) {
976
+ case "worker":
977
+ case "message-port":
978
+ case "broadcast":
979
+ s.autoStart !== !1 && e.start && e.start(), r = (a, i) => e.postMessage(a, { transfer: i });
980
+ {
981
+ const a = ((i) => this._handleIncoming(i.data));
982
+ e.addEventListener?.("message", a), o = () => e.removeEventListener?.("message", a);
983
+ }
984
+ break;
985
+ case "websocket":
986
+ r = (a) => e.send(JSON.stringify(a));
987
+ {
988
+ const a = ((i) => {
989
+ try {
990
+ this._handleIncoming(JSON.parse(i.data));
991
+ } catch {}
992
+ });
993
+ e.addEventListener?.("message", a), o = () => e.removeEventListener?.("message", a);
994
+ }
995
+ break;
996
+ case "chrome-runtime":
997
+ r = (a) => chrome.runtime.sendMessage(a);
998
+ {
999
+ const a = (i) => this._handleIncoming(i);
1000
+ chrome.runtime.onMessage?.addListener?.(a), o = () => chrome.runtime.onMessage?.removeListener?.(a);
1001
+ }
1002
+ break;
1003
+ case "chrome-tabs":
1004
+ r = (a) => {
1005
+ s.tabId != null && chrome.tabs?.sendMessage?.(s.tabId, a);
1006
+ };
1007
+ {
1008
+ const a = (i, c) => s.tabId != null && c?.tab?.id !== s.tabId ? !1 : (this._handleIncoming(i), !0);
1009
+ chrome.runtime.onMessage?.addListener?.(a), o = () => chrome.runtime.onMessage?.removeListener?.(a);
1010
+ }
1011
+ break;
1012
+ case "chrome-port":
1013
+ if (e?.postMessage && e?.onMessage?.addListener) {
1014
+ r = (i) => e.postMessage(i);
1015
+ const a = (i) => this._handleIncoming(i);
1016
+ e.onMessage.addListener(a), o = () => {
1017
+ try {
1018
+ e.onMessage.removeListener(a);
1019
+ } catch {}
1020
+ try {
1021
+ e.disconnect?.();
1022
+ } catch {}
1023
+ };
1024
+ } else {
1025
+ const a = s.portName ?? n, i = s.tabId != null && chrome.tabs?.connect ? chrome.tabs.connect(s.tabId, { name: a }) : chrome.runtime.connect({ name: a });
1026
+ r = (l) => i.postMessage(l);
1027
+ const c = (l) => this._handleIncoming(l);
1028
+ i.onMessage.addListener(c), o = () => {
1029
+ try {
1030
+ i.onMessage.removeListener(c);
1031
+ } catch {}
1032
+ try {
1033
+ i.disconnect();
1034
+ } catch {}
1035
+ };
1036
+ }
1037
+ break;
1038
+ case "chrome-external":
1039
+ r = (a) => {
1040
+ s.externalId && chrome.runtime.sendMessage(s.externalId, a);
1041
+ };
1042
+ {
1043
+ const a = (i) => (this._handleIncoming(i), !0);
1044
+ chrome.runtime.onMessageExternal?.addListener?.(a), o = () => chrome.runtime.onMessageExternal?.removeListener?.(a);
1045
+ }
1046
+ break;
1047
+ case "self":
1048
+ r = (a, i) => globalThis.postMessage?.(a, { transfer: i ?? [] });
1049
+ {
1050
+ const a = ((i) => this._handleIncoming(i.data));
1051
+ globalThis.addEventListener?.("message", a), o = () => globalThis.removeEventListener?.("message", a);
1052
+ }
1053
+ break;
1054
+ default: s.onMessage && (o = s.onMessage((a) => this._handleIncoming(a))), r = (a) => e?.postMessage?.(a);
1055
+ }
1056
+ return {
1057
+ target: e,
1058
+ targetChannel: n,
1059
+ transportType: t,
1060
+ sender: r,
1061
+ cleanup: o,
1062
+ postMessage: (a, i) => r?.(a, i),
1063
+ start: () => e?.start?.(),
1064
+ close: () => e?.close?.()
1065
+ };
1066
+ }
1067
+ _send(e, t, n) {
1068
+ const s = this._transports.get(e) ?? this._defaultTransport;
1069
+ (s?.sender ?? s?.postMessage)?.call(s, t, n);
1070
+ }
1071
+ _getDefaultTarget() {
1072
+ return this._defaultTransport ? this._defaultTransport.targetChannel : "worker";
1073
+ }
1074
+ _inferTargetChannel(e, t) {
1075
+ return t === "worker" ? "worker" : t === "broadcast" && e.name ? e.name : t === "self" ? "self" : `${t}-${d().slice(0, 8)}`;
1076
+ }
1077
+ _createProxy(e, t) {
1078
+ return W((n, s, r) => this.invoke(e, n, s, r), {
1079
+ channel: e,
1080
+ basePath: t,
1081
+ cache: !0,
1082
+ timeout: this._config.timeout
1083
+ });
1084
+ }
1085
+ _isWorkerContext() {
1086
+ return [
1087
+ "worker",
1088
+ "shared-worker",
1089
+ "service-worker"
1090
+ ].includes(this._contextType);
1091
+ }
1092
+ };
1093
+ function X(e) {
1094
+ return new he(e);
1095
+ }
1096
+ var H = null;
1097
+ function ot() {
1098
+ if (!H) {
1099
+ const e = ae();
1100
+ [
1101
+ "worker",
1102
+ "shared-worker",
1103
+ "service-worker"
1104
+ ].includes(e) ? H = X({
1105
+ name: "worker",
1106
+ autoListen: !0
1107
+ }) : H = X({
1108
+ name: "host",
1109
+ autoListen: !1
1110
+ });
1111
+ }
1112
+ return H;
1113
+ }
1114
+ var y = {
1115
+ rjb: "rejectBy",
1116
+ rvb: "resolveBy",
1117
+ rj: "reject",
1118
+ rv: "resolve",
1119
+ cr: "create",
1120
+ cs: "createSync",
1121
+ a: "array",
1122
+ ta: "typedarray",
1123
+ udf: "undefined"
1124
+ };
1125
+ [
1126
+ typeof ArrayBuffer != y.udf ? ArrayBuffer : null,
1127
+ typeof MessagePort != y.udf ? MessagePort : null,
1128
+ typeof ReadableStream != y.udf ? ReadableStream : null,
1129
+ typeof WritableStream != y.udf ? WritableStream : null,
1130
+ typeof TransformStream != y.udf ? TransformStream : null,
1131
+ typeof WebTransportReceiveStream != y.udf ? WebTransportReceiveStream : null,
1132
+ typeof WebTransportSendStream != y.udf ? WebTransportSendStream : null,
1133
+ typeof AudioData != y.udf ? AudioData : null,
1134
+ typeof ImageBitmap != y.udf ? ImageBitmap : null,
1135
+ typeof VideoFrame != y.udf ? VideoFrame : null,
1136
+ typeof OffscreenCanvas != y.udf ? OffscreenCanvas : null,
1137
+ typeof RTCDataChannel != y.udf ? RTCDataChannel : null
1138
+ ].filter((e) => e != null);
1139
+ function ue() {
1140
+ try {
1141
+ const e = globalThis.location?.href;
1142
+ if (typeof e == "string" && e.length > 0) return e;
1143
+ } catch {}
1144
+ try {
1145
+ if (typeof document < "u" && typeof document.baseURI == "string" && document.baseURI.length > 0) return document.baseURI;
1146
+ } catch {}
1147
+ return "";
1148
+ }
1149
+ function de(e) {
1150
+ const t = ue();
1151
+ if (!t.length) throw new TypeError("[uniform] No base URL for worker resolution (missing location / document.baseURI)");
1152
+ const n = e.startsWith("/") ? e.replace(/^\//, "./") : e;
1153
+ return new URL(n, t).href;
1154
+ }
1155
+ var b = {
1156
+ name: "unknown",
1157
+ instance: null
1158
+ }, z = /* @__PURE__ */ new Map(), pe = (e) => [...Object.values(u)].includes(e), at = class {
1159
+ channelName;
1160
+ options;
1161
+ _channel;
1162
+ constructor(e, t = {}) {
1163
+ this.channelName = e, this.options = t, this._channel = ot();
1164
+ }
1165
+ request(e, t, n, s = {}) {
1166
+ return typeof e == "string" && (e = [e]), Array.isArray(t) && pe(e) && (s = n, n = t, t = e, e = []), this._channel.invoke(this.channelName, t, e, n);
1167
+ }
1168
+ doImportModule(e, t) {
1169
+ return this._channel.import(e, this.channelName);
1170
+ }
1171
+ }, it = class {
1172
+ channel;
1173
+ options;
1174
+ _unified;
1175
+ broadcasts = {};
1176
+ constructor(e, t = {}) {
1177
+ this.channel = e, this.options = t, this._unified = X({
1178
+ name: e,
1179
+ autoListen: !1
1180
+ }), b.name = e, b.instance = this;
1181
+ }
1182
+ createRemoteChannel(e, t = {}, n) {
1183
+ return n && (this._unified.attach(n, { targetChannel: e }), this.broadcasts[e] = n), Promise.resolve(new at(e, t));
1184
+ }
1185
+ getChannel() {
1186
+ return this.channel;
1187
+ }
1188
+ request(e, t, n, s = {}, r = "worker") {
1189
+ return typeof e == "string" && (e = [e]), Array.isArray(t) && pe(e) && (r = s, s = n, n = t, t = e, e = []), this._unified.invoke(r, t, e, n);
1190
+ }
1191
+ resolveResponse(e, t) {
1192
+ return Promise.resolve(t);
1193
+ }
1194
+ async handleAndResponse(e, t, n) {
1195
+ const s = await pt(e, t, this.channel);
1196
+ s && n?.(s.response, s.transfer);
1197
+ }
1198
+ close() {
1199
+ this._unified.close();
1200
+ }
1201
+ }, ct = (e = "$host$") => {
1202
+ if (b?.instance && e === "$host$") return b.instance;
1203
+ if (z.has(e)) return z.get(e) ?? null;
1204
+ const t = new it(e);
1205
+ return e === "$host$" && (b.name = e, b.instance = t), z.set(e, t), t;
1206
+ }, fe = /* @__PURE__ */ new WeakMap(), Y = /* @__PURE__ */ new WeakMap(), _e = /* @__PURE__ */ new WeakMap(), lt = (e, t = b?.name, n) => typeof e == "object" && e != null || typeof e == "function" && e != null ? Y.has(e) ? Y.get(e) : fe.has(e) ? fe.get(e) : $(e) || n?.includes?.(e) || t == b?.name ? e : {
1207
+ $isDescriptor: !0,
1208
+ path: T.get(e) ?? (() => {
1209
+ const s = [d()];
1210
+ return F(s, e), s;
1211
+ })(),
1212
+ owner: b?.name,
1213
+ channel: t,
1214
+ primitive: C(e),
1215
+ writable: !0,
1216
+ enumerable: !0,
1217
+ configurable: !0,
1218
+ argumentCount: e instanceof Function ? e.length : -1
1219
+ } : S(e) ? e : null, ht = Symbol.for("@requestHandler"), D = Symbol.for("@descriptor"), K = (e) => S(e) || e?.[D] ? e : e?.$isDescriptor ? nt(e, async () => {}) : $(e) ? e : null, L = /* @__PURE__ */ new Map(), T = /* @__PURE__ */ new WeakMap(), ge = (e, t) => {
1220
+ if (t != null && !Array.isArray(t) && (t = [t]), t == null || t?.length < 1) return e;
1221
+ const n = e?.[D] ?? (e?.$isDescriptor ? e : null);
1222
+ if (n && n?.owner == b?.name && (e = R(n?.path) ?? e), C(e)) return e;
1223
+ for (const s of t) if (e = e?.[s], e == null) return e;
1224
+ return e;
1225
+ }, R = (e) => {
1226
+ if (e != null && !Array.isArray(e) && (e = [e]), e == null || e?.length < 1) return null;
1227
+ const t = L?.get?.(e?.[0]) ?? null;
1228
+ return t != null ? ge(t, e?.slice?.(1)) : null;
1229
+ }, F = (e, t) => {
1230
+ const n = t?.[D] ?? (t?.$isDescriptor ? t : null);
1231
+ if (n && n?.owner == b?.name && (t = R(n?.path) ?? t), e != null && !Array.isArray(e) && (e = [e]), e == null || e?.length < 1) return null;
1232
+ const s = L?.get?.(e?.[0]) ?? null;
1233
+ return e?.length > 1 ? ge(s, e?.slice?.(1, -1))[e?.[e?.length - 1]] = t : L?.set?.(e?.[0], t), (typeof t == "object" || typeof t == "function") && T?.set?.(t, e), t;
1234
+ }, me = (e) => (e != null && !Array.isArray(e) && (e = [e]), e == null || e?.length < 1 ? !1 : !(L?.get?.(e?.[0]) ?? null) && e?.length <= 1 ? (L?.delete?.(e?.[0]), !0) : !1), ut = (e) => {
1235
+ const t = e?.[D] ?? (e?.$isDescriptor ? e : null);
1236
+ t && t?.owner == b?.name && (e = R(t?.path) ?? e);
1237
+ const n = T?.get?.(e) ?? t?.path;
1238
+ return n == null || n?.length < 1 ? !1 : (me(n), (typeof e == "object" || typeof e == "function") && T?.delete?.(e), !0);
1239
+ }, dt = (e) => {
1240
+ const t = e?.[D] ?? (e?.$isDescriptor ? e : null);
1241
+ return (T?.get?.(e) ?? t?.path) == null;
1242
+ }, E = (e) => (typeof e == "object" || typeof e == "function") && e != null, ye = {
1243
+ get: (e, t) => e?.[t],
1244
+ set: (e, t, n) => (e[t] = n, !0),
1245
+ has: (e, t) => t in e,
1246
+ apply: (e, t, n) => e.apply(t, n),
1247
+ construct: (e, t) => new e(...t),
1248
+ deleteProperty: (e, t) => delete e[t],
1249
+ ownKeys: (e) => Object.keys(e),
1250
+ getOwnPropertyDescriptor: (e, t) => Object.getOwnPropertyDescriptor(e, t),
1251
+ getPrototypeOf: (e) => Object.getPrototypeOf(e),
1252
+ setPrototypeOf: (e, t) => Object.setPrototypeOf(e, t),
1253
+ isExtensible: (e) => Object.isExtensible(e),
1254
+ preventExtensions: (e) => Object.preventExtensions(e)
1255
+ };
1256
+ function be(e, t, n, s = {}) {
1257
+ const { channel: r = "", sender: o = "", reflect: a = ye } = s, i = s.target ?? R(t), c = [];
1258
+ let l = null, _ = t;
1259
+ switch (String(e).toLowerCase()) {
1260
+ case "import":
1261
+ case u.IMPORT:
1262
+ l = import(n?.[0]);
1263
+ break;
1264
+ case "transfer":
1265
+ case u.TRANSFER:
1266
+ U(i) && r !== o && c.push(i), l = i;
1267
+ break;
1268
+ case "get":
1269
+ case u.GET: {
1270
+ const p = n?.[0], w = a.get?.(i, p) ?? i?.[p];
1271
+ l = typeof w == "function" && i != null ? w.bind(i) : w, _ = [...t, String(p)];
1272
+ break;
1273
+ }
1274
+ case "set":
1275
+ case u.SET: {
1276
+ const [p, w] = n, N = k(w, K);
1277
+ s.target ? l = a.set?.(i, p, N) ?? (i[p] = N, !0) : l = a.set?.(i, p, N) ?? F([...t, String(p)], N);
1278
+ break;
1279
+ }
1280
+ case "apply":
1281
+ case "call":
1282
+ case u.APPLY:
1283
+ case u.CALL:
1284
+ if (typeof i == "function") {
1285
+ const p = s.context ?? (s.target ? void 0 : R(t.slice(0, -1))), w = k(n?.[0] ?? n ?? [], K);
1286
+ l = a.apply?.(i, p, w) ?? i.apply(p, w), U(l) && t?.at(-1) === "transfer" && r !== o && c.push(l);
1287
+ }
1288
+ break;
1289
+ case "construct":
1290
+ case u.CONSTRUCT:
1291
+ if (typeof i == "function") {
1292
+ const p = k(n?.[0] ?? n ?? [], K);
1293
+ l = a.construct?.(i, p) ?? new i(...p);
1294
+ }
1295
+ break;
1296
+ case "delete":
1297
+ case "deleteproperty":
1298
+ case "dispose":
1299
+ case u.DELETE:
1300
+ case u.DELETE_PROPERTY:
1301
+ case u.DISPOSE:
1302
+ if (s.target) {
1303
+ const p = t[t.length - 1];
1304
+ l = a.deleteProperty?.(i, p) ?? delete i[p];
1305
+ } else l = t?.length > 0 ? me(t) : ut(i), l && (_ = T.get(i) ?? []);
1306
+ break;
1307
+ case "has":
1308
+ case u.HAS:
1309
+ l = a.has?.(i, n?.[0]) ?? (E(i) ? n?.[0] in i : !1);
1310
+ break;
1311
+ case "ownkeys":
1312
+ case u.OWN_KEYS:
1313
+ l = a.ownKeys?.(i) ?? (E(i) ? Object.keys(i) : []);
1314
+ break;
1315
+ case "getownpropertydescriptor":
1316
+ case "getpropertydescriptor":
1317
+ case u.GET_OWN_PROPERTY_DESCRIPTOR:
1318
+ case u.GET_PROPERTY_DESCRIPTOR:
1319
+ l = a.getOwnPropertyDescriptor?.(i, n?.[0] ?? t?.at(-1) ?? "") ?? (E(i) ? Object.getOwnPropertyDescriptor(i, n?.[0] ?? t?.at(-1) ?? "") : void 0);
1320
+ break;
1321
+ case "getprototypeof":
1322
+ case u.GET_PROTOTYPE_OF:
1323
+ l = a.getPrototypeOf?.(i) ?? (E(i) ? Object.getPrototypeOf(i) : null);
1324
+ break;
1325
+ case "setprototypeof":
1326
+ case u.SET_PROTOTYPE_OF:
1327
+ l = a.setPrototypeOf?.(i, n?.[0]) ?? (E(i) ? Object.setPrototypeOf(i, n?.[0]) : !1);
1328
+ break;
1329
+ case "isextensible":
1330
+ case u.IS_EXTENSIBLE:
1331
+ l = a.isExtensible?.(i) ?? (E(i) ? Object.isExtensible(i) : !0);
1332
+ break;
1333
+ case "preventextensions":
1334
+ case u.PREVENT_EXTENSIONS: l = a.preventExtensions?.(i) ?? (E(i) ? Object.preventExtensions(i) : !1);
1335
+ }
1336
+ return {
1337
+ result: l,
1338
+ toTransfer: c,
1339
+ path: _
1340
+ };
1341
+ }
1342
+ async function we(e, t, n, s, r, o, a) {
1343
+ const i = await o, c = U(i) && a.includes(i) || S(i);
1344
+ let l = r;
1345
+ !c && t !== "get" && t !== u.GET && (typeof i == "object" || typeof i == "function") && (dt(i) ? (l = [d()], F(l, i)) : l = T.get(i) ?? []);
1346
+ const _ = R(l), p = t === "get" || t === u.GET ? l?.at(-1) : void 0, w = R(r), N = k(i, (Nt) => lt(Nt, n, a)) ?? i;
1347
+ return {
1348
+ response: {
1349
+ channel: s,
1350
+ sender: n,
1351
+ reqId: e,
1352
+ action: t,
1353
+ type: "response",
1354
+ payload: {
1355
+ result: c ? N : null,
1356
+ type: typeof i,
1357
+ channel: s,
1358
+ sender: n,
1359
+ descriptor: {
1360
+ $isDescriptor: !0,
1361
+ path: l,
1362
+ owner: n,
1363
+ channel: n,
1364
+ primitive: C(i),
1365
+ writable: !0,
1366
+ enumerable: !0,
1367
+ configurable: !0,
1368
+ argumentCount: w instanceof Function ? w.length : -1,
1369
+ ...E(_) && p != null ? Object.getOwnPropertyDescriptor(_, p) : {}
1370
+ }
1371
+ }
1372
+ },
1373
+ transfer: a
1374
+ };
1375
+ }
1376
+ async function pt(e, t, n, s) {
1377
+ const { channel: r, sender: o, path: a, action: i, args: c } = e;
1378
+ if (r !== n) return null;
1379
+ const { result: l, toTransfer: _, path: p } = be(i, a, c, {
1380
+ channel: r,
1381
+ sender: o,
1382
+ ...s
1383
+ });
1384
+ return we(t, i, n, o, p, l, _);
1385
+ }
1386
+ var _t = class {
1387
+ _name;
1388
+ _transportType;
1389
+ _id = d();
1390
+ _state = "disconnected";
1391
+ _inbound = new g({ bufferSize: 1e3 });
1392
+ _outbound = new g({ bufferSize: 1e3 });
1393
+ _stateChanges = new g();
1394
+ _connectedPeers = /* @__PURE__ */ new Map();
1395
+ _subs = [];
1396
+ _stats = {
1397
+ messagesSent: 0,
1398
+ messagesReceived: 0,
1399
+ bytesTransferred: 0,
1400
+ latencyMs: 0,
1401
+ uptime: 0,
1402
+ reconnectCount: 0
1403
+ };
1404
+ _startTime = 0;
1405
+ _pending = /* @__PURE__ */ new Map();
1406
+ _buffer = [];
1407
+ _opts;
1408
+ constructor(e, t = "internal", n = {}) {
1409
+ this._name = e, this._transportType = t, this._opts = {
1410
+ timeout: 3e4,
1411
+ autoReconnect: !0,
1412
+ reconnectInterval: 1e3,
1413
+ maxReconnectAttempts: 5,
1414
+ bufferMessages: !0,
1415
+ bufferSize: 1e3,
1416
+ metadata: {},
1417
+ ...n
1418
+ }, this._setupSubscriptions();
1419
+ }
1420
+ subscribe(e, t) {
1421
+ return (t ? Ye((n) => n.sender === t)(this._inbound) : this._inbound).subscribe(typeof e == "function" ? { next: e } : e);
1422
+ }
1423
+ next(e) {
1424
+ if (this._state !== "connected") {
1425
+ this._opts.bufferMessages && this._buffer.length < this._opts.bufferSize && this._buffer.push(e);
1426
+ return;
1427
+ }
1428
+ this._outbound.next(e), this._stats.messagesSent++;
1429
+ }
1430
+ async request(e, t, n = {}) {
1431
+ const s = d(), r = Promise.withResolvers();
1432
+ this._pending.set(s, r);
1433
+ const o = setTimeout(() => {
1434
+ this._pending.has(s) && (this._pending.delete(s), r.reject(/* @__PURE__ */ new Error("Request timeout")));
1435
+ }, n.timeout ?? this._opts.timeout);
1436
+ return this.next({
1437
+ id: d(),
1438
+ channel: e,
1439
+ sender: this._name,
1440
+ type: "request",
1441
+ reqId: s,
1442
+ payload: {
1443
+ ...t,
1444
+ action: n.action,
1445
+ path: n.path
1446
+ },
1447
+ timestamp: Date.now()
1448
+ }), r.promise.finally(() => clearTimeout(o));
1449
+ }
1450
+ respond(e, t) {
1451
+ this.next({
1452
+ id: d(),
1453
+ channel: e.sender,
1454
+ sender: this._name,
1455
+ type: "response",
1456
+ reqId: e.reqId,
1457
+ payload: t,
1458
+ timestamp: Date.now()
1459
+ });
1460
+ }
1461
+ emit(e, t, n) {
1462
+ this.next({
1463
+ id: d(),
1464
+ channel: e,
1465
+ sender: this._name,
1466
+ type: "event",
1467
+ payload: {
1468
+ type: t,
1469
+ data: n
1470
+ },
1471
+ timestamp: Date.now()
1472
+ });
1473
+ }
1474
+ subscribeOutbound(e) {
1475
+ return this._outbound.subscribe(typeof e == "function" ? { next: e } : e);
1476
+ }
1477
+ pushInbound(e) {
1478
+ if (this._stats.messagesReceived++, e.type === "response" && e.reqId) {
1479
+ const t = this._pending.get(e.reqId);
1480
+ if (t) {
1481
+ this._pending.delete(e.reqId), t.resolve(e.payload);
1482
+ return;
1483
+ }
1484
+ }
1485
+ this._inbound.next(e);
1486
+ }
1487
+ async connect() {
1488
+ this._state !== "connected" && (this._setState("connecting"), this._startTime = Date.now(), this._setState("connected"), this._flushBuffer());
1489
+ }
1490
+ disconnect() {
1491
+ this._state === "disconnected" || this._state === "closed" || (this._setState("disconnected"), this._subs.forEach((e) => e.unsubscribe()), this._subs = []);
1492
+ }
1493
+ close() {
1494
+ this.disconnect(), this._setState("closed"), this._inbound.complete(), this._outbound.complete(), this._stateChanges.complete();
1495
+ }
1496
+ markConnected() {
1497
+ this._setState("connected"), this._flushBuffer();
1498
+ }
1499
+ markDisconnected() {
1500
+ this._setState("disconnected");
1501
+ }
1502
+ _setState(e) {
1503
+ this._state !== e && (this._state = e, this._stateChanges.next(e));
1504
+ }
1505
+ _flushBuffer() {
1506
+ for (const e of this._buffer) this._outbound.next(e);
1507
+ this._buffer = [];
1508
+ }
1509
+ _setupSubscriptions() {
1510
+ this._subs.push(this._inbound.subscribe({ next: (e) => {
1511
+ e.type === "signal" && e.payload?.type === "connect" && this._connectedPeers.set(e.sender, {
1512
+ name: e.sender,
1513
+ state: "connected",
1514
+ isHost: !1
1515
+ });
1516
+ } }));
1517
+ }
1518
+ get id() {
1519
+ return this._id;
1520
+ }
1521
+ get name() {
1522
+ return this._name;
1523
+ }
1524
+ get state() {
1525
+ return this._state;
1526
+ }
1527
+ get transportType() {
1528
+ return this._transportType;
1529
+ }
1530
+ get stats() {
1531
+ return {
1532
+ ...this._stats,
1533
+ uptime: this._startTime ? Date.now() - this._startTime : 0
1534
+ };
1535
+ }
1536
+ get stateChanges() {
1537
+ return this._stateChanges;
1538
+ }
1539
+ get connectedPeers() {
1540
+ return [...this._connectedPeers.keys()];
1541
+ }
1542
+ get meta() {
1543
+ return {
1544
+ id: this._id,
1545
+ name: this._name,
1546
+ state: this._state,
1547
+ isHost: !1,
1548
+ connectedChannels: new Set(this._connectedPeers.keys())
1549
+ };
1550
+ }
1551
+ }, gt = class B {
1552
+ _connections = /* @__PURE__ */ new Map();
1553
+ static _instance = null;
1554
+ static getInstance() {
1555
+ return B._instance || (B._instance = new B()), B._instance;
1556
+ }
1557
+ getOrCreate(t, n = "internal", s = {}) {
1558
+ return this._connections.has(t) || this._connections.set(t, new _t(t, n, s)), this._connections.get(t);
1559
+ }
1560
+ get(t) {
1561
+ return this._connections.get(t);
1562
+ }
1563
+ has(t) {
1564
+ return this._connections.has(t);
1565
+ }
1566
+ delete(t) {
1567
+ return this._connections.get(t)?.close(), this._connections.delete(t);
1568
+ }
1569
+ clear() {
1570
+ this._connections.forEach((t) => t.close()), this._connections.clear();
1571
+ }
1572
+ get size() {
1573
+ return this._connections.size;
1574
+ }
1575
+ get names() {
1576
+ return [...this._connections.keys()];
1577
+ }
1578
+ }, Ce = () => gt.getInstance(), mt = (e, t, n) => Ce().getOrCreate(e, t, n), yt = "uniform_channels", bt = 1, h = {
1579
+ MESSAGES: "messages",
1580
+ MAILBOX: "mailbox",
1581
+ PENDING: "pending",
1582
+ EXCHANGE: "exchange",
1583
+ TRANSACTIONS: "transactions"
1584
+ }, wt = class {
1585
+ _db = null;
1586
+ _isOpen = !1;
1587
+ _openPromise = null;
1588
+ _channelName;
1589
+ _messageUpdates = new g();
1590
+ _exchangeUpdates = new g();
1591
+ constructor(e) {
1592
+ this._channelName = e;
1593
+ }
1594
+ async open() {
1595
+ return this._db && this._isOpen ? this._db : this._openPromise ? this._openPromise : (this._openPromise = new Promise((e, t) => {
1596
+ const n = indexedDB.open(yt, bt);
1597
+ n.onerror = () => {
1598
+ this._openPromise = null, t(/* @__PURE__ */ new Error("Failed to open IndexedDB"));
1599
+ }, n.onsuccess = () => {
1600
+ this._db = n.result, this._isOpen = !0, this._openPromise = null, e(this._db);
1601
+ }, n.onupgradeneeded = (s) => {
1602
+ const r = s.target.result;
1603
+ this._createStores(r);
1604
+ };
1605
+ }), this._openPromise);
1606
+ }
1607
+ close() {
1608
+ this._db && (this._db.close(), this._db = null, this._isOpen = !1);
1609
+ }
1610
+ _createStores(e) {
1611
+ if (!e.objectStoreNames.contains(h.MESSAGES)) {
1612
+ const t = e.createObjectStore(h.MESSAGES, { keyPath: "id" });
1613
+ t.createIndex("channel", "channel", { unique: !1 }), t.createIndex("status", "status", { unique: !1 }), t.createIndex("recipient", "recipient", { unique: !1 }), t.createIndex("createdAt", "createdAt", { unique: !1 }), t.createIndex("channel_status", ["channel", "status"], { unique: !1 });
1614
+ }
1615
+ if (!e.objectStoreNames.contains(h.MAILBOX)) {
1616
+ const t = e.createObjectStore(h.MAILBOX, { keyPath: "id" });
1617
+ t.createIndex("channel", "channel", { unique: !1 }), t.createIndex("priority", "priority", { unique: !1 }), t.createIndex("expiresAt", "expiresAt", { unique: !1 });
1618
+ }
1619
+ if (!e.objectStoreNames.contains(h.PENDING)) {
1620
+ const t = e.createObjectStore(h.PENDING, { keyPath: "id" });
1621
+ t.createIndex("channel", "channel", { unique: !1 }), t.createIndex("createdAt", "createdAt", { unique: !1 });
1622
+ }
1623
+ if (!e.objectStoreNames.contains(h.EXCHANGE)) {
1624
+ const t = e.createObjectStore(h.EXCHANGE, { keyPath: "id" });
1625
+ t.createIndex("key", "key", { unique: !0 }), t.createIndex("owner", "owner", { unique: !1 });
1626
+ }
1627
+ e.objectStoreNames.contains(h.TRANSACTIONS) || e.createObjectStore(h.TRANSACTIONS, { keyPath: "id" }).createIndex("createdAt", "createdAt", { unique: !1 });
1628
+ }
1629
+ async defer(e, t = {}) {
1630
+ const n = await this.open(), s = {
1631
+ id: d(),
1632
+ channel: e.channel,
1633
+ sender: e.sender ?? this._channelName,
1634
+ recipient: e.channel,
1635
+ type: e.type,
1636
+ payload: e.payload,
1637
+ status: "pending",
1638
+ priority: t.priority ?? 0,
1639
+ createdAt: Date.now(),
1640
+ updatedAt: Date.now(),
1641
+ expiresAt: t.expiresIn ? Date.now() + t.expiresIn : null,
1642
+ retryCount: 0,
1643
+ maxRetries: t.maxRetries ?? 3,
1644
+ metadata: t.metadata
1645
+ };
1646
+ return new Promise((r, o) => {
1647
+ const a = n.transaction([h.MESSAGES, h.MAILBOX], "readwrite"), i = a.objectStore(h.MESSAGES), c = a.objectStore(h.MAILBOX);
1648
+ i.add(s), c.add(s), a.oncomplete = () => {
1649
+ this._messageUpdates.next(s), r(s.id);
1650
+ }, a.onerror = () => o(/* @__PURE__ */ new Error("Failed to defer message"));
1651
+ });
1652
+ }
1653
+ async getDeferredMessages(e, t = {}) {
1654
+ const n = await this.open();
1655
+ return new Promise((s, r) => {
1656
+ const o = n.transaction(h.MESSAGES, "readonly").objectStore(h.MESSAGES), a = t.status ? o.index("channel_status") : o.index("channel"), i = t.status ? IDBKeyRange.only([e, t.status]) : IDBKeyRange.only(e), c = a.getAll(i, t.limit);
1657
+ c.onsuccess = () => {
1658
+ let l = c.result;
1659
+ t.offset && (l = l.slice(t.offset)), s(l);
1660
+ }, c.onerror = () => r(/* @__PURE__ */ new Error("Failed to get deferred messages"));
1661
+ });
1662
+ }
1663
+ async processNextPending(e) {
1664
+ const t = await this.open();
1665
+ return new Promise((n, s) => {
1666
+ const r = t.transaction(h.MESSAGES, "readwrite").objectStore(h.MESSAGES).index("channel_status").openCursor(IDBKeyRange.only([e, "pending"]));
1667
+ r.onsuccess = () => {
1668
+ const o = r.result;
1669
+ if (o) {
1670
+ const a = o.value;
1671
+ a.status = "processing", a.updatedAt = Date.now(), o.update(a), this._messageUpdates.next(a), n(a);
1672
+ } else n(null);
1673
+ }, r.onerror = () => s(/* @__PURE__ */ new Error("Failed to process pending message"));
1674
+ });
1675
+ }
1676
+ async markDelivered(e) {
1677
+ await this._updateMessageStatus(e, "delivered");
1678
+ }
1679
+ async markFailed(e) {
1680
+ const t = await this.open();
1681
+ return new Promise((n, s) => {
1682
+ const r = t.transaction(h.MESSAGES, "readwrite").objectStore(h.MESSAGES), o = r.get(e);
1683
+ o.onsuccess = () => {
1684
+ const a = o.result;
1685
+ if (!a) {
1686
+ n(!1);
1687
+ return;
1688
+ }
1689
+ a.retryCount++, a.updatedAt = Date.now(), a.retryCount < a.maxRetries ? a.status = "pending" : a.status = "failed", r.put(a), this._messageUpdates.next(a), n(a.status === "pending");
1690
+ }, o.onerror = () => s(/* @__PURE__ */ new Error("Failed to mark message as failed"));
1691
+ });
1692
+ }
1693
+ async _updateMessageStatus(e, t) {
1694
+ const n = await this.open();
1695
+ return new Promise((s, r) => {
1696
+ const o = n.transaction(h.MESSAGES, "readwrite").objectStore(h.MESSAGES), a = o.get(e);
1697
+ a.onsuccess = () => {
1698
+ const i = a.result;
1699
+ i && (i.status = t, i.updatedAt = Date.now(), o.put(i), this._messageUpdates.next(i)), s();
1700
+ }, a.onerror = () => r(/* @__PURE__ */ new Error("Failed to update message status"));
1701
+ });
1702
+ }
1703
+ async getMailbox(e, t = {}) {
1704
+ const n = await this.open();
1705
+ return new Promise((s, r) => {
1706
+ const o = n.transaction(h.MAILBOX, "readonly").objectStore(h.MAILBOX).index("channel").getAll(IDBKeyRange.only(e), t.limit);
1707
+ o.onsuccess = () => {
1708
+ let a = o.result;
1709
+ t.sortBy === "priority" ? a.sort((i, c) => c.priority - i.priority) : a.sort((i, c) => c.createdAt - i.createdAt), s(a);
1710
+ }, o.onerror = () => r(/* @__PURE__ */ new Error("Failed to get mailbox"));
1711
+ });
1712
+ }
1713
+ async getMailboxStats(e) {
1714
+ const t = await this.getDeferredMessages(e), n = {
1715
+ total: t.length,
1716
+ pending: 0,
1717
+ processing: 0,
1718
+ delivered: 0,
1719
+ failed: 0,
1720
+ expired: 0
1721
+ }, s = Date.now();
1722
+ for (const r of t) r.expiresAt && r.expiresAt < s ? n.expired++ : n[r.status]++;
1723
+ return n;
1724
+ }
1725
+ async clearMailbox(e) {
1726
+ const t = await this.open();
1727
+ return new Promise((n, s) => {
1728
+ const r = t.transaction(h.MAILBOX, "readwrite"), o = r.objectStore(h.MAILBOX).index("channel");
1729
+ let a = 0;
1730
+ const i = o.openCursor(IDBKeyRange.only(e));
1731
+ i.onsuccess = () => {
1732
+ const c = i.result;
1733
+ c && (c.delete(), a++, c.continue());
1734
+ }, r.oncomplete = () => n(a), r.onerror = () => s(/* @__PURE__ */ new Error("Failed to clear mailbox"));
1735
+ });
1736
+ }
1737
+ async registerPending(e) {
1738
+ const t = await this.open(), n = {
1739
+ id: d(),
1740
+ channel: this._channelName,
1741
+ type: e.type,
1742
+ data: e.data,
1743
+ metadata: e.metadata,
1744
+ createdAt: Date.now(),
1745
+ status: "pending"
1746
+ };
1747
+ return new Promise((s, r) => {
1748
+ const o = t.transaction(h.PENDING, "readwrite");
1749
+ o.objectStore(h.PENDING).add(n), o.oncomplete = () => s(n.id), o.onerror = () => r(/* @__PURE__ */ new Error("Failed to register pending operation"));
1750
+ });
1751
+ }
1752
+ async getPendingOperations() {
1753
+ const e = await this.open();
1754
+ return new Promise((t, n) => {
1755
+ const s = e.transaction(h.PENDING, "readonly").objectStore(h.PENDING).index("channel").getAll(IDBKeyRange.only(this._channelName));
1756
+ s.onsuccess = () => t(s.result), s.onerror = () => n(/* @__PURE__ */ new Error("Failed to get pending operations"));
1757
+ });
1758
+ }
1759
+ async completePending(e) {
1760
+ const t = await this.open();
1761
+ return new Promise((n, s) => {
1762
+ const r = t.transaction(h.PENDING, "readwrite");
1763
+ r.objectStore(h.PENDING).delete(e), r.oncomplete = () => n(), r.onerror = () => s(/* @__PURE__ */ new Error("Failed to complete pending operation"));
1764
+ });
1765
+ }
1766
+ async awaitPending(e, t = {}) {
1767
+ const n = t.timeout ?? 3e4, s = t.pollInterval ?? 100, r = Date.now();
1768
+ for (; Date.now() - r < n;) {
1769
+ const o = await this._getPendingById(e);
1770
+ if (!o) return null;
1771
+ if (o.status === "completed") return await this.completePending(e), o.result;
1772
+ await new Promise((a) => setTimeout(a, s));
1773
+ }
1774
+ throw new Error(`Pending operation ${e} timed out`);
1775
+ }
1776
+ async _getPendingById(e) {
1777
+ const t = await this.open();
1778
+ return new Promise((n, s) => {
1779
+ const r = t.transaction(h.PENDING, "readonly").objectStore(h.PENDING).get(e);
1780
+ r.onsuccess = () => n(r.result ?? null), r.onerror = () => s(/* @__PURE__ */ new Error("Failed to get pending operation"));
1781
+ });
1782
+ }
1783
+ async exchangePut(e, t, n = {}) {
1784
+ const s = await this.open(), r = {
1785
+ id: d(),
1786
+ key: e,
1787
+ value: t,
1788
+ owner: this._channelName,
1789
+ sharedWith: n.sharedWith ?? ["*"],
1790
+ version: 1,
1791
+ createdAt: Date.now(),
1792
+ updatedAt: Date.now()
1793
+ };
1794
+ return new Promise((o, a) => {
1795
+ const i = s.transaction(h.EXCHANGE, "readwrite"), c = i.objectStore(h.EXCHANGE), l = c.index("key").get(e);
1796
+ l.onsuccess = () => {
1797
+ const _ = l.result;
1798
+ _ && (r.id = _.id, r.version = _.version + 1, r.createdAt = _.createdAt), c.put(r);
1799
+ }, i.oncomplete = () => {
1800
+ this._exchangeUpdates.next(r), o(r.id);
1801
+ }, i.onerror = () => a(/* @__PURE__ */ new Error("Failed to put exchange data"));
1802
+ });
1803
+ }
1804
+ async exchangeGet(e) {
1805
+ const t = await this.open();
1806
+ return new Promise((n, s) => {
1807
+ const r = t.transaction(h.EXCHANGE, "readonly").objectStore(h.EXCHANGE).index("key").get(e);
1808
+ r.onsuccess = () => {
1809
+ const o = r.result;
1810
+ if (!o) {
1811
+ n(null);
1812
+ return;
1813
+ }
1814
+ if (!this._canAccessExchange(o)) {
1815
+ n(null);
1816
+ return;
1817
+ }
1818
+ n(o.value);
1819
+ }, r.onerror = () => s(/* @__PURE__ */ new Error("Failed to get exchange data"));
1820
+ });
1821
+ }
1822
+ async exchangeDelete(e) {
1823
+ const t = await this.open();
1824
+ return new Promise((n, s) => {
1825
+ const r = t.transaction(h.EXCHANGE, "readwrite"), o = r.objectStore(h.EXCHANGE), a = o.index("key").get(e);
1826
+ a.onsuccess = () => {
1827
+ const i = a.result;
1828
+ if (!i) {
1829
+ n(!1);
1830
+ return;
1831
+ }
1832
+ if (i.owner !== this._channelName) {
1833
+ n(!1);
1834
+ return;
1835
+ }
1836
+ o.delete(i.id);
1837
+ }, r.oncomplete = () => n(!0), r.onerror = () => s(/* @__PURE__ */ new Error("Failed to delete exchange data"));
1838
+ });
1839
+ }
1840
+ async exchangeLock(e, t = {}) {
1841
+ const n = await this.open(), s = t.timeout ?? 3e4;
1842
+ return new Promise((r, o) => {
1843
+ const a = n.transaction(h.EXCHANGE, "readwrite"), i = a.objectStore(h.EXCHANGE), c = i.index("key").get(e);
1844
+ c.onsuccess = () => {
1845
+ const l = c.result;
1846
+ if (!l) {
1847
+ r(!1);
1848
+ return;
1849
+ }
1850
+ if (l.lock && l.lock.holder !== this._channelName && l.lock.expiresAt > Date.now()) {
1851
+ r(!1);
1852
+ return;
1853
+ }
1854
+ l.lock = {
1855
+ holder: this._channelName,
1856
+ acquiredAt: Date.now(),
1857
+ expiresAt: Date.now() + s
1858
+ }, l.updatedAt = Date.now(), i.put(l);
1859
+ }, a.oncomplete = () => r(!0), a.onerror = () => o(/* @__PURE__ */ new Error("Failed to acquire lock"));
1860
+ });
1861
+ }
1862
+ async exchangeUnlock(e) {
1863
+ const t = await this.open();
1864
+ return new Promise((n, s) => {
1865
+ const r = t.transaction(h.EXCHANGE, "readwrite"), o = r.objectStore(h.EXCHANGE), a = o.index("key").get(e);
1866
+ a.onsuccess = () => {
1867
+ const i = a.result;
1868
+ i && i.lock?.holder === this._channelName && (delete i.lock, i.updatedAt = Date.now(), o.put(i));
1869
+ }, r.oncomplete = () => n(), r.onerror = () => s(/* @__PURE__ */ new Error("Failed to release lock"));
1870
+ });
1871
+ }
1872
+ _canAccessExchange(e) {
1873
+ return e.owner === this._channelName || e.sharedWith.includes("*") ? !0 : e.sharedWith.includes(this._channelName);
1874
+ }
1875
+ async beginTransaction() {
1876
+ return new Ct(this);
1877
+ }
1878
+ async executeTransaction(e) {
1879
+ const t = await this.open(), n = new Set(e.map((s) => s.store));
1880
+ return new Promise((s, r) => {
1881
+ const o = t.transaction(Array.from(n), "readwrite");
1882
+ for (const a of e) {
1883
+ const i = o.objectStore(a.store);
1884
+ switch (a.type) {
1885
+ case "put":
1886
+ a.value !== void 0 && i.put(a.value);
1887
+ break;
1888
+ case "delete":
1889
+ a.key !== void 0 && i.delete(a.key);
1890
+ break;
1891
+ case "update": if (a.key !== void 0) {
1892
+ const c = i.get(a.key);
1893
+ c.onsuccess = () => {
1894
+ c.result && a.value && i.put({
1895
+ ...c.result,
1896
+ ...a.value
1897
+ });
1898
+ };
1899
+ }
1900
+ }
1901
+ }
1902
+ o.oncomplete = () => s(), o.onerror = () => r(/* @__PURE__ */ new Error("Transaction failed"));
1903
+ });
1904
+ }
1905
+ onMessageUpdate(e) {
1906
+ return this._messageUpdates.subscribe({ next: e });
1907
+ }
1908
+ onExchangeUpdate(e) {
1909
+ return this._exchangeUpdates.subscribe({ next: e });
1910
+ }
1911
+ async cleanupExpired() {
1912
+ const e = await this.open(), t = Date.now();
1913
+ return new Promise((n, s) => {
1914
+ const r = e.transaction([h.MESSAGES, h.MAILBOX], "readwrite"), o = r.objectStore(h.MESSAGES), a = r.objectStore(h.MAILBOX);
1915
+ let i = 0;
1916
+ const c = o.openCursor();
1917
+ c.onsuccess = () => {
1918
+ const _ = c.result;
1919
+ if (_) {
1920
+ const p = _.value;
1921
+ p.expiresAt && p.expiresAt < t && (_.delete(), i++), _.continue();
1922
+ }
1923
+ };
1924
+ const l = a.openCursor();
1925
+ l.onsuccess = () => {
1926
+ const _ = l.result;
1927
+ if (_) {
1928
+ const p = _.value;
1929
+ p.expiresAt && p.expiresAt < t && (_.delete(), i++), _.continue();
1930
+ }
1931
+ }, r.oncomplete = () => n(i), r.onerror = () => s(/* @__PURE__ */ new Error("Failed to cleanup expired"));
1932
+ });
1933
+ }
1934
+ }, Ct = class {
1935
+ _storage;
1936
+ _operations = [];
1937
+ _isCommitted = !1;
1938
+ _isRolledBack = !1;
1939
+ constructor(e) {
1940
+ this._storage = e;
1941
+ }
1942
+ put(e, t) {
1943
+ return this._checkState(), this._operations.push({
1944
+ id: d(),
1945
+ type: "put",
1946
+ store: e,
1947
+ value: t,
1948
+ timestamp: Date.now()
1949
+ }), this;
1950
+ }
1951
+ delete(e, t) {
1952
+ return this._checkState(), this._operations.push({
1953
+ id: d(),
1954
+ type: "delete",
1955
+ store: e,
1956
+ key: t,
1957
+ timestamp: Date.now()
1958
+ }), this;
1959
+ }
1960
+ update(e, t, n) {
1961
+ return this._checkState(), this._operations.push({
1962
+ id: d(),
1963
+ type: "update",
1964
+ store: e,
1965
+ key: t,
1966
+ value: n,
1967
+ timestamp: Date.now()
1968
+ }), this;
1969
+ }
1970
+ async commit() {
1971
+ if (this._checkState(), this._operations.length === 0) {
1972
+ this._isCommitted = !0;
1973
+ return;
1974
+ }
1975
+ await this._storage.executeTransaction(this._operations), this._isCommitted = !0;
1976
+ }
1977
+ rollback() {
1978
+ this._operations = [], this._isRolledBack = !0;
1979
+ }
1980
+ get operationCount() {
1981
+ return this._operations.length;
1982
+ }
1983
+ _checkState() {
1984
+ if (this._isCommitted) throw new Error("Transaction already committed");
1985
+ if (this._isRolledBack) throw new Error("Transaction already rolled back");
1986
+ }
1987
+ }, V = /* @__PURE__ */ new Map();
1988
+ function vt(e) {
1989
+ return V.has(e) || V.set(e, new wt(e)), V.get(e);
1990
+ }
1991
+ var ve = ue(), St = ve.length > 0 ? new URL("../transport/Worker.ts", ve) : "", Se = class {
1992
+ _channel;
1993
+ _context;
1994
+ _options;
1995
+ _connection;
1996
+ _storage;
1997
+ constructor(e, t, n = {}) {
1998
+ this._channel = e, this._context = t, this._options = n, this._connection = mt(e), this._storage = vt(e);
1999
+ }
2000
+ async request(e, t, n, s = {}) {
2001
+ let r = typeof e == "string" ? [e] : e, o = t, a = n;
2002
+ return Array.isArray(t) && ke(e) && (s = n, a = t, o = e, r = []), this._context.getHost()?.request(r, o, a, s, this._channel);
2003
+ }
2004
+ async doImportModule(e, t = {}) {
2005
+ return this.request([], u.IMPORT, [e], t);
2006
+ }
2007
+ async deferMessage(e, t = {}) {
2008
+ return this._storage.defer({
2009
+ channel: this._channel,
2010
+ sender: this._context.hostName,
2011
+ type: "request",
2012
+ payload: e
2013
+ }, t);
2014
+ }
2015
+ async getPendingMessages() {
2016
+ return this._storage.getDeferredMessages(this._channel, { status: "pending" });
2017
+ }
2018
+ get connection() {
2019
+ return this._connection;
2020
+ }
2021
+ get channelName() {
2022
+ return this._channel;
2023
+ }
2024
+ get context() {
2025
+ return this._context;
2026
+ }
2027
+ }, P = class {
2028
+ _channel;
2029
+ _context;
2030
+ _options;
2031
+ _connection;
2032
+ _unified;
2033
+ get _forResolves() {
2034
+ return this._unified.__getPrivate("_pending");
2035
+ }
2036
+ get _subscriptions() {
2037
+ return this._unified.__getPrivate("_subscriptions");
2038
+ }
2039
+ get _broadcasts() {
2040
+ return this._unified.__getPrivate("_transports");
2041
+ }
2042
+ constructor(e, t, n = {}) {
2043
+ this._channel = e, this._context = t, this._options = n, this._connection = Ce().getOrCreate(e, "internal", n), this._unified = new he({
2044
+ name: e,
2045
+ autoListen: !1,
2046
+ timeout: n?.timeout
2047
+ });
2048
+ }
2049
+ createRemoteChannel(e, t = {}, n) {
2050
+ const s = Et(n ?? this._context.$createOrUseExistingRemote(e, t, n ?? null)?.messageChannel?.port1), r = Pe(s?.target ?? s);
2051
+ return this._unified.listen(s?.target, { targetChannel: e }), s && (this._broadcasts?.set?.(e, s), r === "self" && typeof postMessage > "u" || this._unified.connect(s, { targetChannel: e }), this._context.$registerConnection({
2052
+ localChannel: this._channel,
2053
+ remoteChannel: e,
2054
+ sender: this._channel,
2055
+ direction: "outgoing",
2056
+ transportType: r
2057
+ }), this.notifyChannel(e, {
2058
+ contextId: this._context.id,
2059
+ contextName: this._context.hostName
2060
+ }, "connect")), new Se(e, this._context, t);
2061
+ }
2062
+ getChannel() {
2063
+ return this._channel;
2064
+ }
2065
+ get connection() {
2066
+ return this._connection;
2067
+ }
2068
+ request(e, t, n, s = {}, r = "worker") {
2069
+ let o = typeof e == "string" ? [e] : e, a = n;
2070
+ return Array.isArray(t) && ke(e) && (r = s, s = n, a = t, t = e, o = []), this._unified.invoke(r, t, o ?? [], Array.isArray(a) ? a : [a]);
2071
+ }
2072
+ resolveResponse(e, t) {
2073
+ this._forResolves.get(e)?.resolve?.(t);
2074
+ const n = this._forResolves.get(e)?.promise;
2075
+ return this._forResolves.delete(e), n;
2076
+ }
2077
+ async handleAndResponse(e, t, n) {}
2078
+ notifyChannel(e, t = {}, n = "notify") {
2079
+ return this._unified.notify(e, {
2080
+ ...t,
2081
+ from: this._channel,
2082
+ to: e
2083
+ }, n);
2084
+ }
2085
+ getConnectedChannels() {
2086
+ return this._unified.connectedChannels;
2087
+ }
2088
+ close() {
2089
+ this._subscriptions.forEach((e) => e.unsubscribe()), this._forResolves.clear(), this._broadcasts?.values?.()?.forEach((e) => e.close?.()), this._broadcasts?.clear?.(), this._unified.close();
2090
+ }
2091
+ get unified() {
2092
+ return this._unified;
2093
+ }
2094
+ }, kt = class {
2095
+ _options;
2096
+ _id = d();
2097
+ _hostName;
2098
+ _host = null;
2099
+ _endpoints = /* @__PURE__ */ new Map();
2100
+ _unifiedByChannel = /* @__PURE__ */ new Map();
2101
+ _unifiedConnectionSubs = /* @__PURE__ */ new Map();
2102
+ _remoteChannels = /* @__PURE__ */ new Map();
2103
+ _deferredChannels = /* @__PURE__ */ new Map();
2104
+ _connectionEvents = new g({ bufferSize: 200 });
2105
+ _connectionRegistry = new le(() => d(), (e) => this._emitConnectionEvent(e));
2106
+ _closed = !1;
2107
+ _globalSelf = null;
2108
+ constructor(e = {}) {
2109
+ this._options = e, this._hostName = e.name ?? `ctx-${this._id.slice(0, 8)}`, e.useGlobalSelf !== !1 && (this._globalSelf = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : null);
2110
+ }
2111
+ initHost(e) {
2112
+ if (this._host && !e) return this._host;
2113
+ const t = e ?? this._hostName;
2114
+ if (this._hostName = t, this._endpoints.has(t)) return this._host = this._endpoints.get(t).handler, this._host;
2115
+ this._host = new P(t, this, this._options.defaultOptions);
2116
+ const n = {
2117
+ name: t,
2118
+ handler: this._host,
2119
+ connection: this._host.connection,
2120
+ subscriptions: [],
2121
+ ready: Promise.resolve(null),
2122
+ unified: this._host.unified
2123
+ };
2124
+ return this._endpoints.set(t, n), this._registerUnifiedChannel(t, this._host.unified), this._host;
2125
+ }
2126
+ getHost() {
2127
+ return this._host ?? this.initHost();
2128
+ }
2129
+ get hostName() {
2130
+ return this._hostName;
2131
+ }
2132
+ get id() {
2133
+ return this._id;
2134
+ }
2135
+ get onConnection() {
2136
+ return this._connectionEvents;
2137
+ }
2138
+ subscribeConnections(e) {
2139
+ return this._connectionEvents.subscribe(e);
2140
+ }
2141
+ notifyConnections(e = {}, t = {}) {
2142
+ let n = 0;
2143
+ for (const s of this._endpoints.values()) {
2144
+ const r = s.handler.getConnectedChannels();
2145
+ for (const o of r) {
2146
+ if (t.localChannel && t.localChannel !== s.name || t.remoteChannel && t.remoteChannel !== o) continue;
2147
+ const a = this.queryConnections({
2148
+ localChannel: s.name,
2149
+ remoteChannel: o,
2150
+ status: "active"
2151
+ })[0];
2152
+ t.sender && a?.sender !== t.sender || t.transportType && a?.transportType !== t.transportType || t.channel && t.channel !== s.name && t.channel !== o || s.handler.notifyChannel(o, e, "notify") && n++;
2153
+ }
2154
+ }
2155
+ return n;
2156
+ }
2157
+ queryConnections(e = {}) {
2158
+ return this._connectionRegistry.query(e).map((t) => ({
2159
+ ...t,
2160
+ contextId: this._id
2161
+ }));
2162
+ }
2163
+ createChannel(e, t = {}) {
2164
+ if (this._endpoints.has(e)) return this._endpoints.get(e);
2165
+ const n = new P(e, this, {
2166
+ ...this._options.defaultOptions,
2167
+ ...t
2168
+ }), s = {
2169
+ name: e,
2170
+ handler: n,
2171
+ connection: n.connection,
2172
+ subscriptions: [],
2173
+ ready: Promise.resolve(null),
2174
+ unified: n.unified
2175
+ };
2176
+ return this._endpoints.set(e, s), this._registerUnifiedChannel(e, n.unified), s;
2177
+ }
2178
+ createChannels(e, t = {}) {
2179
+ const n = /* @__PURE__ */ new Map();
2180
+ for (const s of e) n.set(s, this.createChannel(s, t));
2181
+ return n;
2182
+ }
2183
+ getChannel(e) {
2184
+ return this._endpoints.get(e);
2185
+ }
2186
+ getOrCreateChannel(e, t = {}) {
2187
+ return this._endpoints.get(e) ?? this.createChannel(e, t);
2188
+ }
2189
+ hasChannel(e) {
2190
+ return this._endpoints.has(e);
2191
+ }
2192
+ getChannelNames() {
2193
+ return [...this._endpoints.keys()];
2194
+ }
2195
+ get size() {
2196
+ return this._endpoints.size;
2197
+ }
2198
+ defer(e, t) {
2199
+ this._deferredChannels.set(e, t);
2200
+ }
2201
+ async initDeferred(e) {
2202
+ const t = this._deferredChannels.get(e);
2203
+ if (!t) return null;
2204
+ const n = await t();
2205
+ return this._endpoints.set(e, n), this._deferredChannels.delete(e), n;
2206
+ }
2207
+ isDeferred(e) {
2208
+ return this._deferredChannels.has(e);
2209
+ }
2210
+ async getChannelAsync(e) {
2211
+ return this._endpoints.has(e) ? this._endpoints.get(e) : this._deferredChannels.has(e) ? this.initDeferred(e) : null;
2212
+ }
2213
+ async addWorker(e, t, n = {}) {
2214
+ const s = xe(t);
2215
+ if (!s) throw new Error(`Failed to create worker for channel: ${e}`);
2216
+ const r = new P(e, this, {
2217
+ ...this._options.defaultOptions,
2218
+ ...n
2219
+ }), o = r.createRemoteChannel(e, n, s), a = {
2220
+ name: e,
2221
+ handler: r,
2222
+ connection: r.connection,
2223
+ subscriptions: [],
2224
+ transportType: "worker",
2225
+ ready: Promise.resolve(o),
2226
+ unified: r.unified
2227
+ };
2228
+ return this._endpoints.set(e, a), this._registerUnifiedChannel(e, r.unified), this._remoteChannels.set(e, {
2229
+ channel: e,
2230
+ context: this,
2231
+ remote: Promise.resolve(o),
2232
+ transport: s,
2233
+ transportType: "worker"
2234
+ }), a;
2235
+ }
2236
+ async addPort(e, t, n = {}) {
2237
+ const s = new P(e, this, {
2238
+ ...this._options.defaultOptions,
2239
+ ...n
2240
+ });
2241
+ t.start?.();
2242
+ const r = s.createRemoteChannel(e, n, t), o = {
2243
+ name: e,
2244
+ handler: s,
2245
+ connection: s.connection,
2246
+ subscriptions: [],
2247
+ transportType: "message-port",
2248
+ ready: Promise.resolve(r),
2249
+ unified: s.unified
2250
+ };
2251
+ return this._endpoints.set(e, o), this._registerUnifiedChannel(e, s.unified), this._remoteChannels.set(e, {
2252
+ channel: e,
2253
+ context: this,
2254
+ remote: Promise.resolve(r),
2255
+ transport: t,
2256
+ transportType: "message-port"
2257
+ }), o;
2258
+ }
2259
+ async addBroadcast(e, t, n = {}) {
2260
+ const s = new BroadcastChannel(t ?? e), r = new P(e, this, {
2261
+ ...this._options.defaultOptions,
2262
+ ...n
2263
+ }), o = r.createRemoteChannel(e, n, s), a = {
2264
+ name: e,
2265
+ handler: r,
2266
+ connection: r.connection,
2267
+ subscriptions: [],
2268
+ transportType: "broadcast",
2269
+ ready: Promise.resolve(o),
2270
+ unified: r.unified
2271
+ };
2272
+ return this._endpoints.set(e, a), this._registerUnifiedChannel(e, r.unified), this._remoteChannels.set(e, {
2273
+ channel: e,
2274
+ context: this,
2275
+ remote: Promise.resolve(o),
2276
+ transport: s,
2277
+ transportType: "broadcast"
2278
+ }), a;
2279
+ }
2280
+ addSelfChannel(e, t = {}) {
2281
+ const n = new P(e, this, {
2282
+ ...this._options.defaultOptions,
2283
+ ...t
2284
+ }), s = this._globalSelf ?? (typeof self < "u" ? self : null), r = {
2285
+ name: e,
2286
+ handler: n,
2287
+ connection: n.connection,
2288
+ subscriptions: [],
2289
+ transportType: "self",
2290
+ ready: Promise.resolve(s ? n.createRemoteChannel(e, t, s) : null),
2291
+ unified: n.unified
2292
+ };
2293
+ return this._endpoints.set(e, r), this._registerUnifiedChannel(e, n.unified), r;
2294
+ }
2295
+ async addTransport(e, t) {
2296
+ const n = t.options ?? {};
2297
+ switch (t.type) {
2298
+ case "worker":
2299
+ if (!t.worker) throw new Error("Worker required for worker transport");
2300
+ return this.addWorker(e, t.worker, n);
2301
+ case "message-port":
2302
+ if (!t.port) throw new Error("Port required for message-port transport");
2303
+ return this.addPort(e, t.port, n);
2304
+ case "broadcast":
2305
+ const s = typeof t.broadcast == "string" ? t.broadcast : void 0;
2306
+ return this.addBroadcast(e, s, n);
2307
+ case "self": return this.addSelfChannel(e, n);
2308
+ default: return this.createChannel(e, n);
2309
+ }
2310
+ }
2311
+ createChannelPair(e, t, n = {}) {
2312
+ const s = new MessageChannel(), r = new P(e, this, {
2313
+ ...this._options.defaultOptions,
2314
+ ...n
2315
+ }), o = new P(t, this, {
2316
+ ...this._options.defaultOptions,
2317
+ ...n
2318
+ });
2319
+ s.port1.start(), s.port2.start();
2320
+ const a = Promise.resolve(r.createRemoteChannel(t, n, s.port1)), i = Promise.resolve(o.createRemoteChannel(e, n, s.port2)), c = {
2321
+ name: e,
2322
+ handler: r,
2323
+ connection: r.connection,
2324
+ subscriptions: [],
2325
+ transportType: "message-port",
2326
+ ready: a,
2327
+ unified: r.unified
2328
+ }, l = {
2329
+ name: t,
2330
+ handler: o,
2331
+ connection: o.connection,
2332
+ subscriptions: [],
2333
+ transportType: "message-port",
2334
+ ready: i,
2335
+ unified: o.unified
2336
+ };
2337
+ return this._endpoints.set(e, c), this._endpoints.set(t, l), this._registerUnifiedChannel(e, r.unified), this._registerUnifiedChannel(t, o.unified), {
2338
+ channel1: c,
2339
+ channel2: l,
2340
+ messageChannel: s
2341
+ };
2342
+ }
2343
+ get globalSelf() {
2344
+ return this._globalSelf;
2345
+ }
2346
+ async connectRemote(e, t = {}, n) {
2347
+ return this.initHost(), this._host.createRemoteChannel(e, t, n);
2348
+ }
2349
+ async importModuleInChannel(e, t, n = {}, s) {
2350
+ return (await this.connectRemote(e, n.channelOptions, s))?.doImportModule?.(t, n.importOptions);
2351
+ }
2352
+ $createOrUseExistingRemote(e, t = {}, n) {
2353
+ if (e == null || n) return null;
2354
+ if (this._remoteChannels.has(e)) return this._remoteChannels.get(e);
2355
+ const s = new MessageChannel(), r = re(new Promise((a) => {
2356
+ const i = xe(St);
2357
+ i?.addEventListener?.("message", (c) => {
2358
+ c.data.type === "channelCreated" && (s.port1?.start?.(), a(new Se(c.data.channel, this, t)));
2359
+ }), i?.postMessage?.({
2360
+ type: "createChannel",
2361
+ channel: e,
2362
+ sender: this._hostName,
2363
+ options: t,
2364
+ messagePort: s.port2
2365
+ }, { transfer: [s.port2] });
2366
+ })), o = {
2367
+ channel: e,
2368
+ context: this,
2369
+ messageChannel: s,
2370
+ remote: r
2371
+ };
2372
+ return this._remoteChannels.set(e, o), o;
2373
+ }
2374
+ $registerConnection(e) {
2375
+ return {
2376
+ ...this._connectionRegistry.register(e),
2377
+ contextId: this._id
2378
+ };
2379
+ }
2380
+ $markNotified(e) {
2381
+ const t = this._connectionRegistry.register({
2382
+ localChannel: e.localChannel,
2383
+ remoteChannel: e.remoteChannel,
2384
+ sender: e.sender,
2385
+ direction: e.direction,
2386
+ transportType: e.transportType
2387
+ });
2388
+ this._connectionRegistry.markNotified(t, e.payload);
2389
+ }
2390
+ $observeSignal(e) {
2391
+ const t = (e.payload?.type, "incoming");
2392
+ this.$markNotified({
2393
+ localChannel: e.localChannel,
2394
+ remoteChannel: e.remoteChannel,
2395
+ sender: e.sender,
2396
+ direction: t,
2397
+ transportType: e.transportType,
2398
+ payload: e.payload
2399
+ });
2400
+ }
2401
+ $forwardUnifiedConnectionEvent(e, t) {
2402
+ const n = t.connection.transportType ?? "internal", s = this._connectionRegistry.register({
2403
+ localChannel: t.connection.localChannel || e,
2404
+ remoteChannel: t.connection.remoteChannel,
2405
+ sender: t.connection.sender,
2406
+ direction: t.connection.direction,
2407
+ transportType: n,
2408
+ metadata: t.connection.metadata
2409
+ });
2410
+ t.type === "notified" ? this._connectionRegistry.markNotified(s, t.payload) : t.type === "disconnected" && this._connectionRegistry.closeByChannel(t.connection.localChannel);
2411
+ }
2412
+ closeChannel(e) {
2413
+ const t = this._endpoints.get(e);
2414
+ return t ? (t.subscriptions.forEach((n) => n.unsubscribe()), t.handler.close(), t.transport?.detach(), this._unifiedConnectionSubs.get(e)?.unsubscribe(), this._unifiedConnectionSubs.delete(e), this._unifiedByChannel.delete(e), this._endpoints.delete(e), e === this._hostName && (this._host = null), this._connectionRegistry.closeByChannel(e), !0) : !1;
2415
+ }
2416
+ close() {
2417
+ if (!this._closed) {
2418
+ this._closed = !0;
2419
+ for (const [e] of this._endpoints) this.closeChannel(e);
2420
+ this._remoteChannels.clear(), this._host = null, this._unifiedConnectionSubs.forEach((e) => e.unsubscribe()), this._unifiedConnectionSubs.clear(), this._unifiedByChannel.clear(), this._connectionRegistry.clear(), this._connectionEvents.complete();
2421
+ }
2422
+ }
2423
+ get closed() {
2424
+ return this._closed;
2425
+ }
2426
+ _registerUnifiedChannel(e, t) {
2427
+ this._unifiedByChannel.set(e, t), this._unifiedConnectionSubs.get(e)?.unsubscribe();
2428
+ const n = t.subscribeConnections((s) => {
2429
+ this.$forwardUnifiedConnectionEvent(e, s);
2430
+ });
2431
+ this._unifiedConnectionSubs.set(e, n);
2432
+ }
2433
+ _emitConnectionEvent(e) {
2434
+ this._connectionEvents.next({
2435
+ ...e,
2436
+ connection: {
2437
+ ...e.connection,
2438
+ contextId: this._id
2439
+ }
2440
+ });
2441
+ }
2442
+ };
2443
+ function ke(e) {
2444
+ return [...Object.values(u)].includes(e);
2445
+ }
2446
+ function Et(e) {
2447
+ if (!e) return null;
2448
+ if (Ee(e)) return e;
2449
+ const t = e, n = Pe(t);
2450
+ return {
2451
+ target: t,
2452
+ targetChannel: "unknown",
2453
+ transportType: n === "internal" ? "self" : n,
2454
+ sender: (s, r) => {
2455
+ if (typeof WebSocket < "u" && t instanceof WebSocket) {
2456
+ t.send(JSON.stringify(s));
2457
+ return;
2458
+ }
2459
+ t.postMessage?.(s, r?.length ? { transfer: r } : void 0);
2460
+ },
2461
+ postMessage: (s, r) => {
2462
+ t.postMessage?.(s, r);
2463
+ },
2464
+ addEventListener: t.addEventListener?.bind(t),
2465
+ removeEventListener: t.removeEventListener?.bind(t),
2466
+ start: t.start?.bind(t),
2467
+ close: t.close?.bind(t)
2468
+ };
2469
+ }
2470
+ function Ee(e) {
2471
+ return !!e && typeof e == "object" && "target" in e && typeof e.postMessage == "function";
2472
+ }
2473
+ function Pe(e) {
2474
+ const t = Ee(e) ? e.target : e;
2475
+ return t ? t === "chrome-runtime" ? "chrome-runtime" : t === "chrome-tabs" ? "chrome-tabs" : t === "chrome-port" ? "chrome-port" : t === "chrome-external" ? "chrome-external" : typeof MessagePort < "u" && t instanceof MessagePort ? "message-port" : typeof BroadcastChannel < "u" && t instanceof BroadcastChannel ? "broadcast" : typeof Worker < "u" && t instanceof Worker ? "worker" : typeof WebSocket < "u" && t instanceof WebSocket ? "websocket" : typeof chrome < "u" && typeof t == "object" && t && typeof t.postMessage == "function" && t.onMessage?.addListener ? "chrome-port" : typeof self < "u" && t === self ? "self" : "internal" : "internal";
2476
+ }
2477
+ function xe(e) {
2478
+ if (e instanceof Worker) return e;
2479
+ if (e instanceof URL) return new Worker(e.href, { type: "module" });
2480
+ if (typeof e == "function") try {
2481
+ return new e({ type: "module" });
2482
+ } catch {
2483
+ return e({ type: "module" });
2484
+ }
2485
+ return typeof e == "string" ? e.startsWith("/") ? new Worker(de(e.replace(/^\//, "./")), { type: "module" }) : URL.canParse(e) || e.startsWith("./") ? new Worker(de(e), { type: "module" }) : new Worker(URL.createObjectURL(new Blob([e], { type: "application/javascript" })), { type: "module" }) : e instanceof Blob || e instanceof File ? new Worker(URL.createObjectURL(e), { type: "module" }) : e ?? (typeof self < "u" ? self : null);
2486
+ }
2487
+ var Pt = /* @__PURE__ */ new Map();
2488
+ function xt(e = {}) {
2489
+ const t = new kt(e);
2490
+ return e.name && Pt.set(e.name, t), t;
2491
+ }
2492
+ var Tt = class {
2493
+ _context;
2494
+ _config;
2495
+ _subscriptions = [];
2496
+ _incomingConnections = new g({ bufferSize: 100 });
2497
+ _channelCreated = new g({ bufferSize: 100 });
2498
+ _channelClosed = new g();
2499
+ constructor(e = {}) {
2500
+ this._config = {
2501
+ name: e.name ?? "worker",
2502
+ workerName: e.workerName ?? `worker-${d().slice(0, 8)}`,
2503
+ autoAcceptChannels: e.autoAcceptChannels ?? !0,
2504
+ allowedChannels: e.allowedChannels ?? [],
2505
+ maxChannels: e.maxChannels ?? 100,
2506
+ autoConnect: e.autoConnect ?? !0,
2507
+ useGlobalSelf: !0,
2508
+ defaultOptions: e.defaultOptions ?? {},
2509
+ isolatedStorage: e.isolatedStorage ?? !1,
2510
+ ...e
2511
+ }, this._context = xt({
2512
+ name: this._config.name,
2513
+ useGlobalSelf: !0,
2514
+ defaultOptions: e.defaultOptions
2515
+ }), this._setupMessageListener();
2516
+ }
2517
+ get onConnection() {
2518
+ return this._incomingConnections;
2519
+ }
2520
+ get onChannelCreated() {
2521
+ return this._channelCreated;
2522
+ }
2523
+ get onChannelClosed() {
2524
+ return this._channelClosed;
2525
+ }
2526
+ subscribeConnections(e) {
2527
+ return this._incomingConnections.subscribe(e);
2528
+ }
2529
+ subscribeChannelCreated(e) {
2530
+ return this._channelCreated.subscribe(e);
2531
+ }
2532
+ acceptConnection(e) {
2533
+ if (!this._canAcceptChannel(e.channel)) return null;
2534
+ const t = this._context.createChannel(e.channel, e.options);
2535
+ return e.port && (e.port.start?.(), t.handler.createRemoteChannel(e.sender, e.options, e.port)), this._channelCreated.next({
2536
+ channel: e.channel,
2537
+ endpoint: t,
2538
+ sender: e.sender,
2539
+ timestamp: Date.now()
2540
+ }), this._postChannelCreated(e.channel, e.sender, e.id), t;
2541
+ }
2542
+ createChannel(e, t) {
2543
+ return this._context.createChannel(e, t);
2544
+ }
2545
+ getChannel(e) {
2546
+ return this._context.getChannel(e);
2547
+ }
2548
+ hasChannel(e) {
2549
+ return this._context.hasChannel(e);
2550
+ }
2551
+ getChannelNames() {
2552
+ return this._context.getChannelNames();
2553
+ }
2554
+ queryConnections(e = {}) {
2555
+ return this._context.queryConnections(e);
2556
+ }
2557
+ notifyConnections(e = {}, t = {}) {
2558
+ return this._context.notifyConnections(e, t);
2559
+ }
2560
+ closeChannel(e) {
2561
+ const t = this._context.closeChannel(e);
2562
+ return t && this._channelClosed.next({
2563
+ channel: e,
2564
+ timestamp: Date.now()
2565
+ }), t;
2566
+ }
2567
+ get context() {
2568
+ return this._context;
2569
+ }
2570
+ get config() {
2571
+ return this._config;
2572
+ }
2573
+ _setupMessageListener() {
2574
+ addEventListener("message", ((e) => {
2575
+ this._handleIncomingMessage(e);
2576
+ }));
2577
+ }
2578
+ _handleIncomingMessage(e) {
2579
+ const t = e.data;
2580
+ if (!(!t || typeof t != "object")) switch (t.type) {
2581
+ case "createChannel":
2582
+ this._handleCreateChannel(t);
2583
+ break;
2584
+ case "connectChannel":
2585
+ this._handleConnectChannel(t);
2586
+ break;
2587
+ case "addPort":
2588
+ this._handleAddPort(t);
2589
+ break;
2590
+ case "listChannels":
2591
+ this._handleListChannels(t);
2592
+ break;
2593
+ case "closeChannel":
2594
+ this._handleCloseChannel(t);
2595
+ break;
2596
+ case "ping":
2597
+ postMessage({
2598
+ type: "pong",
2599
+ id: t.id,
2600
+ timestamp: Date.now()
2601
+ });
2602
+ break;
2603
+ default: t.channel && this._context.hasChannel(t.channel) && this._context.getChannel(t.channel)?.handler?.handleAndResponse?.(t.payload, t.reqId);
2604
+ }
2605
+ }
2606
+ _handleCreateChannel(e) {
2607
+ const t = {
2608
+ id: e.reqId ?? d(),
2609
+ channel: e.channel,
2610
+ sender: e.sender ?? "unknown",
2611
+ type: "channel",
2612
+ port: e.messagePort,
2613
+ timestamp: Date.now(),
2614
+ options: e.options
2615
+ };
2616
+ this._incomingConnections.next(t), this._config.autoAcceptChannels && this.acceptConnection(t);
2617
+ }
2618
+ _handleConnectChannel(e) {
2619
+ const t = {
2620
+ id: e.reqId ?? d(),
2621
+ channel: e.channel,
2622
+ sender: e.sender ?? "unknown",
2623
+ type: e.portType ?? "channel",
2624
+ port: e.port,
2625
+ timestamp: Date.now(),
2626
+ options: e.options
2627
+ };
2628
+ if (this._incomingConnections.next(t), this._config.autoAcceptChannels && this._canAcceptChannel(e.channel)) {
2629
+ const n = this._context.getOrCreateChannel(e.channel, e.options);
2630
+ e.port && (e.port.start?.(), n.handler.createRemoteChannel(e.sender, e.options, e.port)), postMessage({
2631
+ type: "channelConnected",
2632
+ channel: e.channel,
2633
+ reqId: e.reqId
2634
+ });
2635
+ }
2636
+ }
2637
+ _handleAddPort(e) {
2638
+ if (!e.port || !e.channel) return;
2639
+ const t = {
2640
+ id: e.reqId ?? d(),
2641
+ channel: e.channel,
2642
+ sender: e.sender ?? "unknown",
2643
+ type: "port",
2644
+ port: e.port,
2645
+ timestamp: Date.now(),
2646
+ options: e.options
2647
+ };
2648
+ this._incomingConnections.next(t), this._config.autoAcceptChannels && this.acceptConnection(t);
2649
+ }
2650
+ _handleListChannels(e) {
2651
+ postMessage({
2652
+ type: "channelList",
2653
+ channels: this.getChannelNames(),
2654
+ reqId: e.reqId
2655
+ });
2656
+ }
2657
+ _handleCloseChannel(e) {
2658
+ e.channel && (this.closeChannel(e.channel), postMessage({
2659
+ type: "channelClosed",
2660
+ channel: e.channel,
2661
+ reqId: e.reqId
2662
+ }));
2663
+ }
2664
+ _canAcceptChannel(e) {
2665
+ return this._context.size >= this._config.maxChannels ? !1 : this._config.allowedChannels.length > 0 ? this._config.allowedChannels.includes(e) : !0;
2666
+ }
2667
+ _postChannelCreated(e, t, n) {
2668
+ postMessage({
2669
+ type: "channelCreated",
2670
+ channel: e,
2671
+ sender: t,
2672
+ reqId: n,
2673
+ timestamp: Date.now()
2674
+ });
2675
+ }
2676
+ close() {
2677
+ this._subscriptions.forEach((e) => e.unsubscribe()), this._subscriptions = [], this._incomingConnections.complete(), this._channelCreated.complete(), this._channelClosed.complete(), this._context.close();
2678
+ }
2679
+ }, J = null;
2680
+ function Rt(e) {
2681
+ return J || (J = new Tt(e)), J;
2682
+ }
2683
+ Rt({ name: "worker" });
2684
+ var G = class {
2685
+ _channelName;
2686
+ _config;
2687
+ _port;
2688
+ _subs = /* @__PURE__ */ new Set();
2689
+ _pending = /* @__PURE__ */ new Map();
2690
+ _listening = !1;
2691
+ _cleanup = null;
2692
+ _portId = d();
2693
+ _state = new g();
2694
+ _keepAliveTimer = null;
2695
+ constructor(e, t, n = {}) {
2696
+ this._channelName = t, this._config = n, this._port = e, this._setupPort(), n.autoStart !== !1 && this.start();
2697
+ }
2698
+ _setupPort() {
2699
+ const e = (n) => {
2700
+ const s = n.data;
2701
+ if (s.type === "response" && s.reqId) {
2702
+ const r = this._pending.get(s.reqId);
2703
+ if (r) {
2704
+ this._pending.delete(s.reqId), s.payload?.error ? r.reject(new Error(s.payload.error)) : r.resolve(s.payload?.result ?? s.payload);
2705
+ return;
2706
+ }
2707
+ }
2708
+ if (s.type === "signal" && s.payload?.action === "ping") {
2709
+ this.send({
2710
+ id: d(),
2711
+ channel: this._channelName,
2712
+ sender: this._portId,
2713
+ type: "signal",
2714
+ payload: { action: "pong" }
2715
+ });
2716
+ return;
2717
+ }
2718
+ s.portId = s.portId ?? this._portId;
2719
+ for (const r of this._subs) try {
2720
+ r.next?.(s);
2721
+ } catch (o) {
2722
+ r.error?.(o);
2723
+ }
2724
+ }, t = () => {
2725
+ this._state.next("error");
2726
+ const n = /* @__PURE__ */ new Error("Port error");
2727
+ for (const s of this._subs) s.error?.(n);
2728
+ };
2729
+ this._port.addEventListener("message", e), this._port.addEventListener("messageerror", t), this._cleanup = () => {
2730
+ this._port.removeEventListener("message", e), this._port.removeEventListener("messageerror", t);
2731
+ };
2732
+ }
2733
+ start() {
2734
+ this._listening || (this._port.start(), this._listening = !0, this._state.next("ready"), this._config.keepAlive && this._startKeepAlive());
2735
+ }
2736
+ send(e, t) {
2737
+ const { transferable: n, ...s } = e;
2738
+ this._port.postMessage({
2739
+ ...s,
2740
+ portId: this._portId
2741
+ }, t ?? []);
2742
+ }
2743
+ request(e) {
2744
+ const t = e.reqId ?? d();
2745
+ return new Promise((n, s) => {
2746
+ const r = setTimeout(() => {
2747
+ this._pending.delete(t), s(/* @__PURE__ */ new Error("Request timeout"));
2748
+ }, this._config.timeout ?? 3e4);
2749
+ this._pending.set(t, {
2750
+ resolve: (o) => {
2751
+ clearTimeout(r), n(o);
2752
+ },
2753
+ reject: (o) => {
2754
+ clearTimeout(r), s(o);
2755
+ },
2756
+ timestamp: Date.now()
2757
+ }), this.send({
2758
+ ...e,
2759
+ reqId: t,
2760
+ type: "request"
2761
+ });
2762
+ });
2763
+ }
2764
+ subscribe(e) {
2765
+ const t = typeof e == "function" ? { next: e } : e;
2766
+ return this._subs.add(t), {
2767
+ closed: !1,
2768
+ unsubscribe: () => {
2769
+ this._subs.delete(t);
2770
+ }
2771
+ };
2772
+ }
2773
+ _startKeepAlive() {
2774
+ this._keepAliveTimer = setInterval(() => {
2775
+ this.send({
2776
+ id: d(),
2777
+ channel: this._channelName,
2778
+ sender: this._portId,
2779
+ type: "signal",
2780
+ payload: { action: "ping" }
2781
+ });
2782
+ }, this._config.keepAliveInterval ?? 3e4);
2783
+ }
2784
+ close() {
2785
+ this._keepAliveTimer && (clearInterval(this._keepAliveTimer), this._keepAliveTimer = null), this._cleanup?.(), this._subs.forEach((e) => e.complete?.()), this._subs.clear(), this._port.close(), this._state.next("closed");
2786
+ }
2787
+ get port() {
2788
+ return this._port;
2789
+ }
2790
+ get portId() {
2791
+ return this._portId;
2792
+ }
2793
+ get isListening() {
2794
+ return this._listening;
2795
+ }
2796
+ get state() {
2797
+ return this._state;
2798
+ }
2799
+ get channelName() {
2800
+ return this._channelName;
2801
+ }
2802
+ };
2803
+ function Q(e, t) {
2804
+ const n = new MessageChannel();
2805
+ return {
2806
+ local: new G(n.port1, e, t),
2807
+ remote: n.port2,
2808
+ transfer: () => n.port2
2809
+ };
2810
+ }
2811
+ var Te = class {
2812
+ _target;
2813
+ _channelName;
2814
+ _config;
2815
+ _transport = null;
2816
+ _state = new g();
2817
+ _handshakeComplete = !1;
2818
+ constructor(e, t, n = {}) {
2819
+ this._target = e, this._channelName = t, this._config = n;
2820
+ }
2821
+ async connect() {
2822
+ if (this._transport && this._handshakeComplete) return this._transport;
2823
+ this._state.next("connecting");
2824
+ const { local: e, remote: t } = Q(this._channelName, this._config);
2825
+ return this._target.postMessage({
2826
+ type: "port-connect",
2827
+ channelName: this._channelName,
2828
+ portId: e.portId
2829
+ }, this._config.targetOrigin ?? "*", [t]), new Promise((n, s) => {
2830
+ const r = setTimeout(() => {
2831
+ s(/* @__PURE__ */ new Error("Handshake timeout")), this._state.next("error");
2832
+ }, this._config.handshakeTimeout ?? 1e4), o = e.subscribe({ next: (a) => {
2833
+ a.type === "signal" && a.payload?.action === "handshake-ack" && (clearTimeout(r), this._handshakeComplete = !0, this._transport = e, this._state.next("connected"), o.unsubscribe(), n(e));
2834
+ } });
2835
+ });
2836
+ }
2837
+ static listen(e, t, n) {
2838
+ const s = (r) => {
2839
+ if (r.data?.type !== "port-connect" || r.data?.channelName !== e || !r.ports[0]) return;
2840
+ const o = new G(r.ports[0], e, n);
2841
+ o.send({
2842
+ id: d(),
2843
+ channel: e,
2844
+ sender: o.portId,
2845
+ type: "signal",
2846
+ payload: { action: "handshake-ack" }
2847
+ }), t(o);
2848
+ };
2849
+ return globalThis.addEventListener("message", s), () => globalThis.removeEventListener("message", s);
2850
+ }
2851
+ disconnect() {
2852
+ this._transport?.close(), this._transport = null, this._handshakeComplete = !1, this._state.next("disconnected");
2853
+ }
2854
+ get isConnected() {
2855
+ return this._handshakeComplete;
2856
+ }
2857
+ get state() {
2858
+ return this._state;
2859
+ }
2860
+ get transport() {
2861
+ return this._transport;
2862
+ }
2863
+ };
2864
+ Te.listen;
2865
+ var Re = (e, t = "worker") => {
2866
+ const n = ct(t ?? "worker");
2867
+ return Object.keys(e).forEach((s) => {
2868
+ e[s];
2869
+ }), n;
2870
+ }, Ot = Ne({
2871
+ getDirHandle: () => I,
2872
+ getFileSystemRoot: () => A,
2873
+ handlers: () => x,
2874
+ normalizePath: () => M,
2875
+ resolveFileSystemHandle: () => Ae
2876
+ }), j, q, A, M, Ae, I, x, Me, O, Ie = De((() => {
2877
+ j = /* @__PURE__ */ new Map(), q = /* @__PURE__ */ new Map(), A = async (e = "") => e && j.has(e) ? j.get(e) : await navigator.storage.getDirectory(), M = (e) => e?.trim?.()?.replace(/\/+/g, "/") || "/", Ae = async (e, t, n = !1) => {
2878
+ const s = M(t).split("/").filter((o) => o && o !== ".");
2879
+ let r = e;
2880
+ for (let o = 0; o < s.length; o++) {
2881
+ const a = s[o];
2882
+ if (o === s.length - 1) try {
2883
+ return await r.getDirectoryHandle(a, { create: n });
2884
+ } catch {
2885
+ try {
2886
+ return await r.getFileHandle(a, { create: n });
2887
+ } catch (i) {
2888
+ if (n) throw i;
2889
+ return null;
2890
+ }
2891
+ }
2892
+ else r = await r.getDirectoryHandle(a, { create: n });
2893
+ }
2894
+ return r;
2895
+ }, I = async (e, t, n) => {
2896
+ const s = M(t).split("/").filter((o) => o);
2897
+ let r = e;
2898
+ for (const o of s) r = await r.getDirectoryHandle(o, { create: n });
2899
+ return r;
2900
+ }, x = {
2901
+ mount: async ({ id: e, handle: t }) => (j.set(e, t), !0),
2902
+ unmount: async ({ id: e }) => (j.delete(e), !0),
2903
+ readDirectory: async ({ rootId: e, path: t, create: n }) => {
2904
+ try {
2905
+ const s = await A(e), r = await I(s, t, n), o = [];
2906
+ for await (const [a, i] of r.entries()) o.push([a, i]);
2907
+ return o;
2908
+ } catch (s) {
2909
+ return console.warn("Worker readDirectory error:", s), [];
2910
+ }
2911
+ },
2912
+ readFile: async ({ rootId: e, path: t, type: n }) => {
2913
+ try {
2914
+ const s = await A(e), r = M(t).split("/").filter((c) => c), o = r.pop(), a = r.join("/"), i = await (await (await I(s, a, !1)).getFileHandle(o, { create: !1 })).getFile();
2915
+ return n === "text" ? await i.text() : n === "arrayBuffer" ? await i.arrayBuffer() : i;
2916
+ } catch (s) {
2917
+ return console.warn("Worker readFile error:", s), null;
2918
+ }
2919
+ },
2920
+ writeFile: async ({ rootId: e, path: t, data: n }) => {
2921
+ try {
2922
+ const s = await A(e), r = M(t).split("/").filter((c) => c), o = r.pop(), a = r.join("/"), i = await (await (await I(s, a, !0)).getFileHandle(o, { create: !0 })).createWritable();
2923
+ return await i.write(n), await i.close(), !0;
2924
+ } catch (s) {
2925
+ return console.warn("Worker writeFile error:", s), !1;
2926
+ }
2927
+ },
2928
+ remove: async ({ rootId: e, path: t, recursive: n }) => {
2929
+ try {
2930
+ const s = await A(e), r = M(t).split("/").filter((i) => i), o = r.pop(), a = r.join("/");
2931
+ return await (await I(s, a, !1)).removeEntry(o, { recursive: n }), !0;
2932
+ } catch {
2933
+ return !1;
2934
+ }
2935
+ },
2936
+ observe: async ({ rootId: e, path: t, id: n }) => {
2937
+ try {
2938
+ if (q.has(n)) return !0;
2939
+ const s = await A(e), r = await I(s, t, !1);
2940
+ if (typeof FileSystemObserver < "u") {
2941
+ const o = new FileSystemObserver((a) => {
2942
+ const i = a.map((c) => {
2943
+ const l = c.changedHandle?.name || c.relativePathComponents?.at(-1);
2944
+ return {
2945
+ type: c.type,
2946
+ name: l,
2947
+ kind: c.changedHandle?.kind || (l?.includes(".") ? "file" : "directory"),
2948
+ handle: c.changedHandle,
2949
+ path: c.relativePathComponents.join("/")
2950
+ };
2951
+ });
2952
+ self.postMessage({
2953
+ type: "observation",
2954
+ id: n,
2955
+ changes: i
2956
+ });
2957
+ });
2958
+ return o.observe(r), q.set(n, o), !0;
2959
+ }
2960
+ return !1;
2961
+ } catch {
2962
+ return !1;
2963
+ }
2964
+ },
2965
+ unobserve: async ({ id: e }) => {
2966
+ const t = q.get(e);
2967
+ return t && (t.disconnect(), q.delete(e)), !0;
2968
+ },
2969
+ copy: async ({ from: e, to: t }) => {
2970
+ try {
2971
+ const n = async (s, r) => {
2972
+ if (s.kind === "directory") for await (const [o, a] of s.entries()) if (a.kind === "directory") {
2973
+ const i = await r.getDirectoryHandle(o, { create: !0 });
2974
+ await n(a, i);
2975
+ } else {
2976
+ const i = await a.getFile(), c = await (await r.getFileHandle(o, { create: !0 })).createWritable();
2977
+ await c.write(i), await c.close();
2978
+ }
2979
+ else {
2980
+ const o = await s.getFile(), a = await r.createWritable();
2981
+ await a.write(o), await a.close();
2982
+ }
2983
+ };
2984
+ return await n(e, t), !0;
2985
+ } catch (n) {
2986
+ return console.warn("Worker copy error:", n), !1;
2987
+ }
2988
+ }
2989
+ }, Me = "opfs-sw-bridge-v1", O = null;
2990
+ try {
2991
+ typeof BroadcastChannel < "u" && (O = new BroadcastChannel(Me), O.onmessage = async (e) => {
2992
+ const t = e?.data || {};
2993
+ if (!t || typeof t != "object" || t?.type !== "opfs-sw-request") return;
2994
+ const n = String(t?.requestId || ""), s = String(t?.action || ""), r = t?.payload;
2995
+ if (!n || !s) return;
2996
+ const o = x[s];
2997
+ if (!o) {
2998
+ O?.postMessage?.({
2999
+ type: "opfs-sw-response",
3000
+ requestId: n,
3001
+ ok: !1,
3002
+ error: `Unknown operation type: ${s}`
3003
+ });
3004
+ return;
3005
+ }
3006
+ try {
3007
+ const a = await o(r);
3008
+ O?.postMessage?.({
3009
+ type: "opfs-sw-response",
3010
+ requestId: n,
3011
+ ok: !0,
3012
+ result: a
3013
+ });
3014
+ } catch (a) {
3015
+ O?.postMessage?.({
3016
+ type: "opfs-sw-response",
3017
+ requestId: n,
3018
+ ok: !1,
3019
+ error: a?.message || String(a)
3020
+ });
3021
+ }
3022
+ });
3023
+ } catch {
3024
+ O = null;
3025
+ }
3026
+ self.addEventListener("message", async (e) => {
3027
+ if (!e.data || typeof e.data != "object") return;
3028
+ const { id: t, type: n, payload: s } = e.data;
3029
+ if (x[n]) try {
3030
+ const r = await x[n](s);
3031
+ self.postMessage({
3032
+ id: t,
3033
+ result: r
3034
+ });
3035
+ } catch (r) {
3036
+ self.postMessage({
3037
+ id: t,
3038
+ error: r?.message || String(r)
3039
+ });
3040
+ }
3041
+ else t && self.postMessage({
3042
+ id: t,
3043
+ error: `Unknown operation type: ${n}`
3044
+ });
3045
+ });
3046
+ }));
3047
+ Ie(), x && Re(x);
3048
+ const Dt = async (e) => {
3049
+ try {
3050
+ if (e.type === "batch") {
3051
+ const t = [];
3052
+ for (const n of e.payload) {
3053
+ const s = await Oe(n);
3054
+ t.push(s);
3055
+ }
3056
+ return t;
3057
+ } else return await Oe(e);
3058
+ } catch (t) {
3059
+ throw console.error("[OPFS Worker] Message processing error:", t), t;
3060
+ }
3061
+ }, Oe = async (e) => {
3062
+ const t = x[e.type];
3063
+ if (!t) throw new Error(`Unknown message type: ${e.type}`);
3064
+ return await t(e.payload);
3065
+ };
3066
+ globalThis.processMessage = Dt, (async () => {
3067
+ try {
3068
+ const e = (await Promise.resolve().then(() => (Ie(), Ot))).handlers;
3069
+ e && Re(e), console.log("[OPFS Worker] Initialized with handlers:", Object.keys(e || {}));
3070
+ } catch (e) {
3071
+ console.error("[OPFS Worker] Failed to initialize:", e);
3072
+ }
3073
+ })();
3074
+ })();
3075
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXNzZXRzL09QRlMudW5pZm9ybS53b3JrZXItIX57MDAwfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIihmdW5jdGlvbigpIHtcblxuLy8jcmVnaW9uIFxcMHJvbGxkb3duL3J1bnRpbWUuanNcblx0dmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblx0dmFyIF9fZXNtTWluID0gKGZuLCByZXMsIGVycikgPT4gKCkgPT4ge1xuXHRcdGlmIChlcnIpIHRocm93IGVyclswXTtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZuICYmIChyZXMgPSBmbihmbiA9IDApKSwgcmVzO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRocm93IGVyciA9IFtlXSwgZTtcblx0XHR9XG5cdH07XG5cdHZhciBfX2V4cG9ydEFsbCA9IChhbGwsIG5vX3N5bWJvbHMpID0+IHtcblx0XHRsZXQgdGFyZ2V0ID0ge307XG5cdFx0Zm9yICh2YXIgbmFtZSBpbiBhbGwpIHtcblx0XHRcdF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHtcblx0XHRcdFx0Z2V0OiBhbGxbbmFtZV0sXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWVcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoIW5vX3N5bWJvbHMpIHtcblx0XHRcdF9fZGVmUHJvcCh0YXJnZXQsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogXCJNb2R1bGVcIiB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vY29yZS50cy9kaXN0L2NvcmUuanNcblx0ZnVuY3Rpb24gWCQxKCkge1xuXHRcdGNvbnN0IGUgPSBnbG9iYWxUaGlzO1xuXHRcdGlmICh0eXBlb2YgZS5IVE1MRWxlbWVudCA9PSBcImZ1bmN0aW9uXCIpIHJldHVybjtcblx0XHRjb25zdCB0ID0gY2xhc3Mge30sIHIgPSAobikgPT4ge1xuXHRcdFx0dHlwZW9mIGVbbl0gIT0gXCJmdW5jdGlvblwiICYmIChlW25dID0gdCk7XG5cdFx0fTtcblx0XHRyKFwiRXZlbnRUYXJnZXRcIiksIHIoXCJOb2RlXCIpLCByKFwiRWxlbWVudFwiKSwgcihcIkhUTUxFbGVtZW50XCIpLCByKFwiU1ZHRWxlbWVudFwiKSwgcihcIlRleHRcIiksIHIoXCJDb21tZW50XCIpLCByKFwiRG9jdW1lbnRGcmFnbWVudFwiKSwgcihcIlNoYWRvd1Jvb3RcIiksIHIoXCJIVE1MRG9jdW1lbnRcIiksIHIoXCJEb2N1bWVudFwiKSwgcihcIkhUTUxCb2R5RWxlbWVudFwiKSwgcihcIkhUTUxIZWFkRWxlbWVudFwiKSwgcihcIkhUTUxDYW52YXNFbGVtZW50XCIpLCByKFwiSFRNTElucHV0RWxlbWVudFwiKSwgcihcIkhUTUxMaW5rRWxlbWVudFwiKSwgcihcIkhUTUxTdHlsZUVsZW1lbnRcIiksIHIoXCJIVE1MUHJlRWxlbWVudFwiKSwgcihcIkhUTUxEaXZFbGVtZW50XCIpLCByKFwiQ1NTU3R5bGVSdWxlXCIpLCByKFwiQ1NTTGF5ZXJCbG9ja1J1bGVcIik7XG5cdH1cblx0dmFyIFokMSA9IGNsYXNzIHtcblx0XHRjaGFubmVscyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0bGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRyZWdpc3RlcihlLCB0KSB7XG5cdFx0XHR0aGlzLmNoYW5uZWxzLnNldChlLCB0KTtcblx0XHRcdGNvbnN0IHIgPSB0aGlzLmxpc3RlbmVycy5nZXQoZSk7XG5cdFx0XHRpZiAocikgZm9yIChjb25zdCBuIG9mIHIpIHRyeSB7XG5cdFx0XHRcdG4odCk7XG5cdFx0XHR9IGNhdGNoIChpKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtDaGFubmVsUmVnaXN0cnldIExpc3RlbmVyIGVycm9yIGZvciAke2V9OmAsIGkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHQ7XG5cdFx0fVxuXHRcdGdldChlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jaGFubmVscy5nZXQoZSk7XG5cdFx0fVxuXHRcdGhhcyhlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jaGFubmVscy5oYXMoZSk7XG5cdFx0fVxuXHRcdHVucmVnaXN0ZXIoZSkge1xuXHRcdFx0Y29uc3QgdCA9IHRoaXMuY2hhbm5lbHMuZGVsZXRlKGUpO1xuXHRcdFx0aWYgKHQpIHtcblx0XHRcdFx0Y29uc3QgciA9IHRoaXMubGlzdGVuZXJzLmdldChlKTtcblx0XHRcdFx0aWYgKHIpIGZvciAoY29uc3QgbiBvZiByKSB0cnkge1xuXHRcdFx0XHRcdG4obnVsbCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGkpIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBbQ2hhbm5lbFJlZ2lzdHJ5XSBVbnJlZ2lzdGVyIGxpc3RlbmVyIGVycm9yIGZvciAke2V9OmAsIGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdDtcblx0XHR9XG5cdFx0b25DaGFubmVsQ2hhbmdlKGUsIHQpIHtcblx0XHRcdHRoaXMubGlzdGVuZXJzLmhhcyhlKSB8fCB0aGlzLmxpc3RlbmVycy5zZXQoZSwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7XG5cdFx0XHRjb25zdCByID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGUpO1xuXHRcdFx0aWYgKHIuYWRkKHQpLCB0aGlzLmNoYW5uZWxzLmhhcyhlKSkgdHJ5IHtcblx0XHRcdFx0dCh0aGlzLmNoYW5uZWxzLmdldChlKSk7XG5cdFx0XHR9IGNhdGNoIChuKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtDaGFubmVsUmVnaXN0cnldIEluaXRpYWwgbGlzdGVuZXIgZXJyb3IgZm9yICR7ZX06YCwgbik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRyLmRlbGV0ZSh0KSwgci5zaXplID09PSAwICYmIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShlKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdGdldENoYW5uZWxOYW1lcygpIHtcblx0XHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hhbm5lbHMua2V5cygpKTtcblx0XHR9XG5cdFx0Y2xlYXIoKSB7XG5cdFx0XHR0aGlzLmNoYW5uZWxzLmNsZWFyKCksIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG5cdFx0fVxuXHR9O1xuXHR2YXIgRGUkMSA9IG5ldyBaJDEoKTtcblx0dmFyIFkgPSBjbGFzcyB7XG5cdFx0aGVhbHRoQ2hlY2tzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRpbnRlcnZhbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdGhlYWx0aFN0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0cmVnaXN0ZXJIZWFsdGhDaGVjayhlLCB0LCByID0gM2U0KSB7XG5cdFx0XHR0aGlzLmhlYWx0aENoZWNrcy5zZXQoZSwgdCk7XG5cdFx0XHRjb25zdCBuID0gdGhpcy5pbnRlcnZhbHMuZ2V0KGUpO1xuXHRcdFx0biAmJiBjbGVhckludGVydmFsKG4pO1xuXHRcdFx0Y29uc3QgaSA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzID0gYXdhaXQgdCgpO1xuXHRcdFx0XHRcdHRoaXMuaGVhbHRoU3RhdHVzLnNldChlLCBzKSwgcyB8fCBjb25zb2xlLndhcm4oYFtDaGFubmVsSGVhbHRoXSBDaGFubmVsICcke2V9JyBpcyB1bmhlYWx0aHlgKTtcblx0XHRcdFx0fSBjYXRjaCAocykge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtDaGFubmVsSGVhbHRoXSBIZWFsdGggY2hlY2sgZmFpbGVkIGZvciAnJHtlfSc6YCwgcyksIHRoaXMuaGVhbHRoU3RhdHVzLnNldChlLCAhMSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHIpO1xuXHRcdFx0dGhpcy5pbnRlcnZhbHMuc2V0KGUsIGkpLCB0KCkudGhlbigocykgPT4ge1xuXHRcdFx0XHR0aGlzLmhlYWx0aFN0YXR1cy5zZXQoZSwgcyk7XG5cdFx0XHR9KS5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaGVhbHRoU3RhdHVzLnNldChlLCAhMSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aXNIZWFsdGh5KGUpIHtcblx0XHRcdHJldHVybiB0aGlzLmhlYWx0aFN0YXR1cy5nZXQoZSkgPz8gITE7XG5cdFx0fVxuXHRcdGdldEFsbEhlYWx0aFN0YXR1c2VzKCkge1xuXHRcdFx0Y29uc3QgZSA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBbdCwgcl0gb2YgdGhpcy5oZWFsdGhTdGF0dXMpIGVbdF0gPSByO1xuXHRcdFx0cmV0dXJuIGU7XG5cdFx0fVxuXHRcdHN0b3BNb25pdG9yaW5nKGUpIHtcblx0XHRcdGNvbnN0IHQgPSB0aGlzLmludGVydmFscy5nZXQoZSk7XG5cdFx0XHR0ICYmIChjbGVhckludGVydmFsKHQpLCB0aGlzLmludGVydmFscy5kZWxldGUoZSkpLCB0aGlzLmhlYWx0aENoZWNrcy5kZWxldGUoZSksIHRoaXMuaGVhbHRoU3RhdHVzLmRlbGV0ZShlKTtcblx0XHR9XG5cdFx0c3RvcEFsbE1vbml0b3JpbmcoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGUgb2YgdGhpcy5pbnRlcnZhbHMudmFsdWVzKCkpIGNsZWFySW50ZXJ2YWwoZSk7XG5cdFx0XHR0aGlzLmludGVydmFscy5jbGVhcigpLCB0aGlzLmhlYWx0aENoZWNrcy5jbGVhcigpLCB0aGlzLmhlYWx0aFN0YXR1cy5jbGVhcigpO1xuXHRcdH1cblx0fTtcblx0dmFyIE5lID0gbmV3IFkoKTtcblx0V2Vha01hcC5wcm90b3R5cGUuZ2V0T3JJbnNlcnQgPz89IGZ1bmN0aW9uKGUsIHQpIHtcblx0XHRyZXR1cm4gdGhpcy5oYXMoZSkgfHwgdGhpcy5zZXQoZSwgdCksIHRoaXMuZ2V0KGUpO1xuXHR9O1xuXHRXZWFrTWFwLnByb3RvdHlwZS5nZXRPckluc2VydENvbXB1dGVkID8/PSBmdW5jdGlvbihlLCB0KSB7XG5cdFx0cmV0dXJuIHRoaXMuaGFzKGUpIHx8IHRoaXMuc2V0KGUsIHQoZSkpLCB0aGlzLmdldChlKTtcblx0fTtcblx0TWFwLnByb3RvdHlwZS5nZXRPckluc2VydCA/Pz0gZnVuY3Rpb24oZSwgdCkge1xuXHRcdHJldHVybiB0aGlzLmhhcyhlKSB8fCB0aGlzLnNldChlLCB0KSwgdGhpcy5nZXQoZSk7XG5cdH07XG5cdE1hcC5wcm90b3R5cGUuZ2V0T3JJbnNlcnRDb21wdXRlZCA/Pz0gZnVuY3Rpb24oZSwgdCkge1xuXHRcdHJldHVybiB0aGlzLmhhcyhlKSB8fCB0aGlzLnNldChlLCB0KGUpKSwgdGhpcy5nZXQoZSk7XG5cdH07XG5cdHZhciBGID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJAZml4XCIpO1xuXHR2YXIgZyA9IChlKSA9PiB0eXBlb2YgZSA9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBlID09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGUgPT0gXCJib29sZWFuXCIgfHwgdHlwZW9mIGUgPT0gXCJiaWdpbnRcIiB8fCB0eXBlb2YgZSA+IFwidVwiIHx8IGUgPT0gbnVsbDtcblx0dmFyIFEkMSA9IChlLCB0KSA9PiBnKGUpID8gdCA9PSBcIm51bWJlclwiID8gTnVtYmVyKGUpIHx8IDAgOiB0ID09IFwic3RyaW5nXCIgPyBTdHJpbmcoZSkgfHwgXCJcIiA6IHQgPT0gXCJib29sZWFuXCIgPyAhIWUgOiBlIDogbnVsbDtcblx0dmFyIGMgPSAoZSwgdCkgPT4gZT8uW0ZdID8/IGUgPz8gdCA/PyB0O1xuXHR2YXIgdGUkMSA9IChlKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIiB8fCBlID09IG51bGwpIHJldHVybiBlO1xuXHRcdGNvbnN0IHQgPSBmdW5jdGlvbigpIHt9O1xuXHRcdHJldHVybiB0W0ZdID0gZSwgdDtcblx0fTtcblx0dmFyIHJlJDEgPSAoZSkgPT4gY3J5cHRvPy5nZXRSYW5kb21WYWx1ZXMgPyBjcnlwdG8/LmdldFJhbmRvbVZhbHVlcz8uKGUpIDogKCgpID0+IHtcblx0XHRjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgpO1xuXHRcdGZvciAobGV0IHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgdFtyXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XG5cdFx0cmV0dXJuIHQ7XG5cdH0pKCk7XG5cdHZhciAkZSA9ICgpID0+IGNyeXB0bz8ucmFuZG9tVVVJRCA/IGNyeXB0bz8ucmFuZG9tVVVJRD8uKCkgOiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIChlKSA9PiAoK2UgXiByZSQxPy4oLyogQF9fUFVSRV9fICovIG5ldyBVaW50OEFycmF5KDEpKT8uWzBdICYgMTUgPj4gK2UgLyA0KS50b1N0cmluZygxNikpO1xuXHR2YXIgViA9IChlKSA9PiBBcnJheS5pc0FycmF5KGUpID8gZT8uZmxhdE1hcD8uKCh0KSA9PiBBcnJheS5pc0FycmF5KHQpID8gVih0KSA6IHQpIDogZTtcblx0dmFyIHNlID0gKGUpID0+IFYoZSk/LmV2ZXJ5Py4oYik7XG5cdHZhciBiID0gKGUpID0+IGcoZSkgfHwgdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIgfHwgb2UoZSkgfHwgQXJyYXkuaXNBcnJheShlKSAmJiBzZShlKTtcblx0dmFyIG9lID0gKGUpID0+IEFycmF5QnVmZmVyLmlzVmlldyhlKSAmJiAhKGUgaW5zdGFuY2VvZiBEYXRhVmlldyk7XG5cdHZhciBwdCQxID0gKGUpID0+IGcoZSkgfHwgdHlwZW9mIEFycmF5QnVmZmVyID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgdHlwZW9mIE1lc3NhZ2VQb3J0ID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgTWVzc2FnZVBvcnQgfHwgdHlwZW9mIFJlYWRhYmxlU3RyZWFtID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0gfHwgdHlwZW9mIFdyaXRhYmxlU3RyZWFtID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgV3JpdGFibGVTdHJlYW0gfHwgdHlwZW9mIFRyYW5zZm9ybVN0cmVhbSA9PSBcImZ1bmN0aW9uXCIgJiYgZSBpbnN0YW5jZW9mIFRyYW5zZm9ybVN0cmVhbSB8fCB0eXBlb2YgSW1hZ2VCaXRtYXAgPT0gXCJmdW5jdGlvblwiICYmIGUgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCB8fCB0eXBlb2YgVmlkZW9GcmFtZSA9PSBcImZ1bmN0aW9uXCIgJiYgZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUgfHwgdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyA9PSBcImZ1bmN0aW9uXCIgJiYgZSBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcyB8fCB0eXBlb2YgUlRDRGF0YUNoYW5uZWwgPT0gXCJmdW5jdGlvblwiICYmIGUgaW5zdGFuY2VvZiBSVENEYXRhQ2hhbm5lbCB8fCB0eXBlb2YgQXVkaW9EYXRhID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgQXVkaW9EYXRhIHx8IHR5cGVvZiBXZWJUcmFuc3BvcnRSZWNlaXZlU3RyZWFtID09IFwiZnVuY3Rpb25cIiAmJiBlIGluc3RhbmNlb2YgV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbSB8fCB0eXBlb2YgV2ViVHJhbnNwb3J0U2VuZFN0cmVhbSA9PSBcImZ1bmN0aW9uXCIgJiYgZSBpbnN0YW5jZW9mIFdlYlRyYW5zcG9ydFNlbmRTdHJlYW0gfHwgdHlwZW9mIFdlYlRyYW5zcG9ydFJlY2VpdmVTdHJlYW0gPT0gXCJmdW5jdGlvblwiICYmIGUgaW5zdGFuY2VvZiBXZWJUcmFuc3BvcnRSZWNlaXZlU3RyZWFtO1xuXHR2YXIgJCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwib2JqZWN0LmJvdW5kQ3R4XCIpO1xuXHRnbG9iYWxUaGlzWyRdID8/PSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblx0dmFyIGxlID0gZ2xvYmFsVGhpc1skXTtcblx0dmFyIE8gPSAoZSwgdCwgcikgPT4ge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGUpKSByZXR1cm4gZS5ldmVyeShiKSA/IGUubWFwKHQpIDogZS5tYXAoKG4sIGkpID0+IE8obiwgdCwgW2UsIGldKSk7XG5cdFx0aWYgKGUgaW5zdGFuY2VvZiBNYXApIHtcblx0XHRcdGNvbnN0IG4gPSBBcnJheS5mcm9tKGUuZW50cmllcygpKTtcblx0XHRcdHJldHVybiBuLm1hcCgoW2ksIHNdKSA9PiBzKS5ldmVyeShiKSA/IG5ldyBNYXAobi5tYXAoKFtpLCBzXSkgPT4gW2ksIHQocywgaSwgZSldKSkgOiBuZXcgTWFwKG4ubWFwKChbaSwgc10pID0+IFtpLCBPKHMsIHQsIFtlLCBpXSldKSk7XG5cdFx0fVxuXHRcdGlmIChlIGluc3RhbmNlb2YgU2V0KSB7XG5cdFx0XHRjb25zdCBuID0gQXJyYXkuZnJvbShlLmVudHJpZXMoKSksIGkgPSBuLm1hcCgoW3MsIGZdKSA9PiBmKTtcblx0XHRcdHJldHVybiBuLmV2ZXJ5KGIpID8gbmV3IFNldChpLm1hcCh0KSkgOiBuZXcgU2V0KGkubWFwKChzKSA9PiBPKHMsIHQsIFtlLCBzXSkpKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgZT8uY29uc3RydWN0b3IgPT0gT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSA9PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG5cdFx0XHRjb25zdCBuID0gQXJyYXkuZnJvbShPYmplY3QuZW50cmllcyhlKSk7XG5cdFx0XHRyZXR1cm4gbi5tYXAoKFtpLCBzXSkgPT4gcykuZXZlcnkoYikgPyBPYmplY3QuZnJvbUVudHJpZXMobi5tYXAoKFtpLCBzXSkgPT4gW2ksIHQocywgaSwgZSldKSkgOiBPYmplY3QuZnJvbUVudHJpZXMobi5tYXAoKFtpLCBzXSkgPT4gW2ksIE8ocywgdCwgW2UsIGldKV0pKTtcblx0XHR9XG5cdFx0cmV0dXJuIHQoZSwgcj8uWzFdID8/IFwiXCIsIHI/LlswXSA/PyBudWxsKTtcblx0fTtcblx0dmFyIHAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblx0dmFyIEgkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXHR2YXIgbSA9IChlLCB0KSA9PiBlIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgZT8udGhlbiA9PSBcImZ1bmN0aW9uXCIgPyBwPy5oYXM/LihlKSA/IHQocD8uZ2V0Py4oZSkpIDogUHJvbWlzZS50cnk/Lihhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgciA9IGF3YWl0IGU7XG5cdFx0cmV0dXJuIHA/LnNldD8uKGUsIHIpLCByO1xuXHR9KT8udGhlbj8uKHQpIDogdChlKTtcblx0dmFyIHllID0gY2xhc3Mge1xuXHRcdCNlO1xuXHRcdCN0O1xuXHRcdGNvbnN0cnVjdG9yKGUsIHQpIHtcblx0XHRcdHRoaXMuI2UgPSBlLCB0aGlzLiN0ID0gdDtcblx0XHR9XG5cdFx0ZGVmaW5lUHJvcGVydHkoZSwgdCwgcikge1xuXHRcdFx0cmV0dXJuIGMoZSkgaW5zdGFuY2VvZiBQcm9taXNlID8gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCByKSA6IG0oYyhlKSwgKG4pID0+IFJlZmxlY3QuZGVmaW5lUHJvcGVydHkobiwgdCwgcikpO1xuXHRcdH1cblx0XHRkZWxldGVQcm9wZXJ0eShlLCB0KSB7XG5cdFx0XHRyZXR1cm4gYyhlKSBpbnN0YW5jZW9mIFByb21pc2UgPyBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsIHQpIDogbShjKGUpLCAocikgPT4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShyLCB0KSk7XG5cdFx0fVxuXHRcdGdldFByb3RvdHlwZU9mKGUpIHtcblx0XHRcdHJldHVybiBjKGUpIGluc3RhbmNlb2YgUHJvbWlzZSA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSkgOiBtKGMoZSksICh0KSA9PiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHQpKTtcblx0XHR9XG5cdFx0c2V0UHJvdG90eXBlT2YoZSwgdCkge1xuXHRcdFx0cmV0dXJuIGMoZSkgaW5zdGFuY2VvZiBQcm9taXNlID8gUmVmbGVjdC5zZXRQcm90b3R5cGVPZihlLCB0KSA6IG0oYyhlKSwgKHIpID0+IFJlZmxlY3Quc2V0UHJvdG90eXBlT2YociwgdCkpO1xuXHRcdH1cblx0XHRpc0V4dGVuc2libGUoZSkge1xuXHRcdFx0cmV0dXJuIGMoZSkgaW5zdGFuY2VvZiBQcm9taXNlID8gUmVmbGVjdC5pc0V4dGVuc2libGUoZSkgOiBtKGMoZSksICh0KSA9PiBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0KSk7XG5cdFx0fVxuXHRcdHByZXZlbnRFeHRlbnNpb25zKGUpIHtcblx0XHRcdHJldHVybiBjKGUpIGluc3RhbmNlb2YgUHJvbWlzZSA/IFJlZmxlY3Qub3duS2V5cyhlKSA6IG0oYyhlKSwgKHQpID0+IFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnModCkpO1xuXHRcdH1cblx0XHRvd25LZXlzKGUpIHtcblx0XHRcdGNvbnN0IHQgPSBjKGUpO1xuXHRcdFx0cmV0dXJuIHQgaW5zdGFuY2VvZiBQcm9taXNlID8gT2JqZWN0LmtleXModCkgOiBtKHQsIChyKSA9PiAodHlwZW9mIHIgPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgciA9PSBcImZ1bmN0aW9uXCIpICYmIHIgIT0gbnVsbCA/IE9iamVjdC5rZXlzKHIpIDogW10pID8/IFtdO1xuXHRcdH1cblx0XHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkge1xuXHRcdFx0cmV0dXJuIGMoZSkgaW5zdGFuY2VvZiBQcm9taXNlID8gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkgOiBtKGMoZSksIChyKSA9PiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7XG5cdFx0fVxuXHRcdGNvbnN0cnVjdChlLCB0LCByKSB7XG5cdFx0XHRyZXR1cm4gbShjKGUpLCAobikgPT4gUmVmbGVjdC5jb25zdHJ1Y3QobiwgdCwgcikpO1xuXHRcdH1cblx0XHRoYXMoZSwgdCkge1xuXHRcdFx0cmV0dXJuIGMoZSkgaW5zdGFuY2VvZiBQcm9taXNlID8gUmVmbGVjdC5oYXMoZSwgdCkgOiBtKGMoZSksIChyKSA9PiBSZWZsZWN0LmhhcyhyLCB0KSk7XG5cdFx0fVxuXHRcdGdldChlLCB0LCByKSB7XG5cdFx0XHRpZiAoZSA9IGMoZSksIHQgPT0gXCJwcm9taXNlXCIpIHJldHVybiBlO1xuXHRcdFx0aWYgKHQgPT0gXCJyZXNvbHZlXCIgJiYgdGhpcy4jZSkgcmV0dXJuICguLi5pKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHMgPSB0aGlzLiNlPy4oLi4uaSk7XG5cdFx0XHRcdHJldHVybiB0aGlzLiNlID0gbnVsbCwgcztcblx0XHRcdH07XG5cdFx0XHRpZiAodCA9PSBcInJlamVjdFwiICYmIHRoaXMuI3QpIHJldHVybiAoLi4uaSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzID0gdGhpcy4jdD8uKC4uLmkpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy4jdCA9IG51bGwsIHM7XG5cdFx0XHR9O1xuXHRcdFx0aWYgKHQgPT0gXCJ0aGVuXCIgfHwgdCA9PSBcImNhdGNoXCIgfHwgdCA9PSBcImZpbmFsbHlcIikge1xuXHRcdFx0XHRpZiAoZSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBlPy5bdF0/LmJpbmQ/LihlKTtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGkgPSBQcm9taXNlLnRyeSgoKSA9PiBlKTtcblx0XHRcdFx0XHRyZXR1cm4gaT8uW3RdPy5iaW5kPy4oaSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxldCBuO1xuXHRcdFx0cmV0dXJuIHA/Lmhhcz8uKGUpICYmIChuID0gcD8uZ2V0Py4oZSkpPy5bdF0gIT0gbnVsbCA/IG4gPSBwPy5nZXQ/LihlKT8uW3RdIDogbiA9IGhlKG0oZSwgYXN5bmMgKGkpID0+IHtcblx0XHRcdFx0aWYgKGMoaSkgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gUmVmbGVjdC5nZXQoaSwgdCwgcik7XG5cdFx0XHRcdGlmIChnKGkpKSByZXR1cm4gdCA9PSBTeW1ib2wudG9QcmltaXRpdmUgfHwgdCA9PSBTeW1ib2wudG9TdHJpbmdUYWcgPyBpIDogdm9pZCAwO1xuXHRcdFx0XHRsZXQgcztcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRzID0gUmVmbGVjdC5nZXQoaSwgdCwgcik7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHMgPSBlPy5bdF07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBzID09IFwiZnVuY3Rpb25cIiA/IHM/LmJpbmQ/LihpKSA6IHM7XG5cdFx0XHR9KSksIHQgPT0gU3ltYm9sLnRvU3RyaW5nVGFnID8gZyhuKSA/IFN0cmluZyhuID8/IFwiXCIpIHx8IFwiXCIgOiBuPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8uKCkgfHwgU3RyaW5nKG4gPz8gXCJcIikgfHwgXCJcIiA6IHQgPT0gU3ltYm9sLnRvUHJpbWl0aXZlID8gKGkpID0+IHtcblx0XHRcdFx0aWYgKGcobikpIHJldHVybiBRJDEobiwgaSk7XG5cdFx0XHR9IDogbjtcblx0XHR9XG5cdFx0c2V0KGUsIHQsIHIpIHtcblx0XHRcdHJldHVybiBtKGMoZSksIChuKSA9PiBSZWZsZWN0LnNldChuLCB0LCByKSk7XG5cdFx0fVxuXHRcdGFwcGx5KGUsIHQsIHIpIHtcblx0XHRcdGlmICh0aGlzLiNlKSB7XG5cdFx0XHRcdGNvbnN0IG4gPSB0aGlzLiNlPy4oLi4ucik7XG5cdFx0XHRcdHJldHVybiB0aGlzLiNlID0gbnVsbCwgbjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtKGMoZSwgdGhpcy4jZSksIChuKSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbiA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBjKG4pIGluc3RhbmNlb2YgUHJvbWlzZSwgUmVmbGVjdC5hcHBseShuLCB0LCByKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0ZnVuY3Rpb24gaGUoZSwgdCwgcikge1xuXHRcdHJldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgZT8udGhlbiA9PSBcImZ1bmN0aW9uXCIgPyBwPy5oYXM/LihlKSA/IHA/LmdldD8uKGUpIDogKEgkMT8uaGFzPy4oZSkgfHwgZT8udGhlbj8uKChuKSA9PiBwPy5zZXQ/LihlLCBuKSksIEgkMT8uZ2V0T3JJbnNlcnRDb21wdXRlZD8uKGUsICgpID0+IG5ldyBQcm94eSh0ZSQxKGUpLCBuZXcgeWUodCwgcikpKSkgOiBlO1xuXHR9XG5cdFgkMSgpO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi91bmlmb3JtLnRzL2Rpc3QvdW5pZm9ybS5qc1xuXHR2YXIgZCA9IC8qIEBfX1BVUkVfXyAqLyAoZnVuY3Rpb24oZSkge1xuXHRcdHJldHVybiBlLkdFVCA9IFwiZ2V0XCIsIGUuU0VUID0gXCJzZXRcIiwgZS5DQUxMID0gXCJjYWxsXCIsIGUuQVBQTFkgPSBcImFwcGx5XCIsIGUuQ09OU1RSVUNUID0gXCJjb25zdHJ1Y3RcIiwgZS5ERUxFVEUgPSBcImRlbGV0ZVwiLCBlLkRFTEVURV9QUk9QRVJUWSA9IFwiZGVsZXRlUHJvcGVydHlcIiwgZS5IQVMgPSBcImhhc1wiLCBlLk9XTl9LRVlTID0gXCJvd25LZXlzXCIsIGUuR0VUX09XTl9QUk9QRVJUWV9ERVNDUklQVE9SID0gXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgZS5HRVRfUFJPUEVSVFlfREVTQ1JJUFRPUiA9IFwiZ2V0UHJvcGVydHlEZXNjcmlwdG9yXCIsIGUuR0VUX1BST1RPVFlQRV9PRiA9IFwiZ2V0UHJvdG90eXBlT2ZcIiwgZS5TRVRfUFJPVE9UWVBFX09GID0gXCJzZXRQcm90b3R5cGVPZlwiLCBlLklTX0VYVEVOU0lCTEUgPSBcImlzRXh0ZW5zaWJsZVwiLCBlLlBSRVZFTlRfRVhURU5TSU9OUyA9IFwicHJldmVudEV4dGVuc2lvbnNcIiwgZS5UUkFOU0ZFUiA9IFwidHJhbnNmZXJcIiwgZS5JTVBPUlQgPSBcImltcG9ydFwiLCBlLkRJU1BPU0UgPSBcImRpc3Bvc2VcIiwgZTtcblx0fSkoe30pO1xuXHR2YXIgb24gPSB7XG5cdFx0d3M6IFwid2Vic29ja2V0XCIsXG5cdFx0c29ja2V0OiBcIndlYnNvY2tldFwiLFxuXHRcdHNvY2tldGlvOiBcInNvY2tldC1pb1wiLFxuXHRcdHNlcnZpY2U6IFwic2VydmljZS13b3JrZXJcIixcblx0XHRzdzogXCJzZXJ2aWNlLXdvcmtlclwiLFxuXHRcdFwic2VydmljZS13b3JrZXItY2xpZW50XCI6IFwic2VydmljZS13b3JrZXJcIixcblx0XHRcInNlcnZpY2Utd29ya2VyLWhvc3RcIjogXCJzZXJ2aWNlLXdvcmtlclwiLFxuXHRcdFwicmluZy1idWZmZXJcIjogXCJhdG9taWNzXCJcblx0fTtcblx0ZnVuY3Rpb24gYW4oZSkge1xuXHRcdGNvbnN0IHQgPSBTdHJpbmcoZSA/PyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gdCA/IG9uW3RdID8/IHQgOiBcImludGVybmFsXCI7XG5cdH1cblx0ZnVuY3Rpb24gWihlKSB7XG5cdFx0cmV0dXJuIHR5cGVvZiBlID09IFwic3RyaW5nXCIgPyBhbihlKSA6IHR5cGVvZiBXb3JrZXIgPCBcInVcIiAmJiBlIGluc3RhbmNlb2YgV29ya2VyID8gXCJ3b3JrZXJcIiA6IHR5cGVvZiBTaGFyZWRXb3JrZXIgPCBcInVcIiAmJiBlIGluc3RhbmNlb2YgU2hhcmVkV29ya2VyID8gXCJzaGFyZWQtd29ya2VyXCIgOiB0eXBlb2YgTWVzc2FnZVBvcnQgPCBcInVcIiAmJiBlIGluc3RhbmNlb2YgTWVzc2FnZVBvcnQgPyBcIm1lc3NhZ2UtcG9ydFwiIDogdHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgPCBcInVcIiAmJiBlIGluc3RhbmNlb2YgQnJvYWRjYXN0Q2hhbm5lbCA/IFwiYnJvYWRjYXN0XCIgOiB0eXBlb2YgV2ViU29ja2V0IDwgXCJ1XCIgJiYgZSBpbnN0YW5jZW9mIFdlYlNvY2tldCA/IFwid2Vic29ja2V0XCIgOiB0eXBlb2YgUlRDRGF0YUNoYW5uZWwgPCBcInVcIiAmJiBlIGluc3RhbmNlb2YgUlRDRGF0YUNoYW5uZWwgPyBcInJ0Yy1kYXRhXCIgOiB0eXBlb2YgY2hyb21lIDwgXCJ1XCIgJiYgZSAmJiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBlLnBvc3RNZXNzYWdlID09IFwiZnVuY3Rpb25cIiAmJiBlLm9uTWVzc2FnZT8uYWRkTGlzdGVuZXIgPyBcImNocm9tZS1wb3J0XCIgOiBcImludGVybmFsXCI7XG5cdH1cblx0dmFyIFJlID0gY2xhc3Mge1xuXHRcdF91bnN1YnNjcmliZTtcblx0XHRfY2xvc2VkID0gITE7XG5cdFx0Y29uc3RydWN0b3IoZSkge1xuXHRcdFx0dGhpcy5fdW5zdWJzY3JpYmUgPSBlO1xuXHRcdH1cblx0XHRnZXQgY2xvc2VkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nsb3NlZDtcblx0XHR9XG5cdFx0dW5zdWJzY3JpYmUoKSB7XG5cdFx0XHR0aGlzLl9jbG9zZWQgfHwgKHRoaXMuX2Nsb3NlZCA9ICEwLCB0aGlzLl91bnN1YnNjcmliZSgpKTtcblx0XHR9XG5cdH07XG5cdHZhciB2ID0gY2xhc3Mge1xuXHRcdF9wcm9kdWNlcjtcblx0XHRjb25zdHJ1Y3RvcihlKSB7XG5cdFx0XHR0aGlzLl9wcm9kdWNlciA9IGU7XG5cdFx0fVxuXHRcdHN1YnNjcmliZShlLCB0KSB7XG5cdFx0XHRjb25zdCBuID0gdHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBlIH0gOiBlID8/IHt9LCBzID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHRcdFx0dD8uc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gcy5hYm9ydCgpKTtcblx0XHRcdGxldCByID0gITAsIGk7XG5cdFx0XHRjb25zdCBvID0gKCkgPT4ge1xuXHRcdFx0XHRyID0gITEsIHMuYWJvcnQoKSwgaT8uKCk7XG5cdFx0XHR9LCBhID0ge1xuXHRcdFx0XHRuZXh0OiAoYykgPT4gciAmJiBuLm5leHQ/LihjKSxcblx0XHRcdFx0ZXJyb3I6IChjKSA9PiB7XG5cdFx0XHRcdFx0ciAmJiAobi5lcnJvcj8uKGMpLCBvKCkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb21wbGV0ZTogKCkgPT4ge1xuXHRcdFx0XHRcdHIgJiYgKG4uY29tcGxldGU/LigpLCBvKCkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzaWduYWw6IHMuc2lnbmFsLFxuXHRcdFx0XHRnZXQgYWN0aXZlKCkge1xuXHRcdFx0XHRcdHJldHVybiByICYmICFzLnNpZ25hbC5hYm9ydGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aSA9IHRoaXMuX3Byb2R1Y2VyKGEpO1xuXHRcdFx0fSBjYXRjaCAoYykge1xuXHRcdFx0XHRhLmVycm9yKGMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ldyBSZShvKTtcblx0XHR9XG5cdFx0cGlwZSguLi5lKSB7XG5cdFx0XHRyZXR1cm4gZS5yZWR1Y2UoKHQsIG4pID0+IG4odCksIHRoaXMpO1xuXHRcdH1cblx0fTtcblx0dmFyIF8gPSBjbGFzcyB7XG5cdFx0X3N1YnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdF9idWZmZXIgPSBbXTtcblx0XHRfbWF4QnVmZmVyO1xuXHRcdF9yZXBsYXk7XG5cdFx0Y29uc3RydWN0b3IoZSA9IHt9KSB7XG5cdFx0XHR0aGlzLl9tYXhCdWZmZXIgPSBlLmJ1ZmZlclNpemUgPz8gMCwgdGhpcy5fcmVwbGF5ID0gZS5yZXBsYXlPblN1YnNjcmliZSA/PyAhMTtcblx0XHR9XG5cdFx0bmV4dChlKSB7XG5cdFx0XHR0aGlzLl9tYXhCdWZmZXIgPiAwICYmICh0aGlzLl9idWZmZXIucHVzaChlKSwgdGhpcy5fYnVmZmVyLmxlbmd0aCA+IHRoaXMuX21heEJ1ZmZlciAmJiB0aGlzLl9idWZmZXIuc2hpZnQoKSk7XG5cdFx0XHRmb3IgKGNvbnN0IHQgb2YgdGhpcy5fc3VicykgdHJ5IHtcblx0XHRcdFx0dC5uZXh0Py4oZSk7XG5cdFx0XHR9IGNhdGNoIChuKSB7XG5cdFx0XHRcdHQuZXJyb3I/LihuKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZXJyb3IoZSkge1xuXHRcdFx0Zm9yIChjb25zdCB0IG9mIHRoaXMuX3N1YnMpIHQuZXJyb3I/LihlKTtcblx0XHR9XG5cdFx0Y29tcGxldGUoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGUgb2YgdGhpcy5fc3VicykgZS5jb21wbGV0ZT8uKCk7XG5cdFx0XHR0aGlzLl9zdWJzLmNsZWFyKCk7XG5cdFx0fVxuXHRcdHN1YnNjcmliZShlKSB7XG5cdFx0XHRjb25zdCB0ID0gdHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBlIH0gOiBlO1xuXHRcdFx0aWYgKHRoaXMuX3N1YnMuYWRkKHQpLCB0aGlzLl9yZXBsYXkpIGZvciAoY29uc3QgbiBvZiB0aGlzLl9idWZmZXIpIHRyeSB7XG5cdFx0XHRcdHQubmV4dD8uKG4pO1xuXHRcdFx0fSBjYXRjaCAocykge1xuXHRcdFx0XHR0LmVycm9yPy4ocyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmV3IFJlKCgpID0+IHtcblx0XHRcdFx0dGhpcy5fc3Vicy5kZWxldGUodCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Z2V0VmFsdWUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fYnVmZmVyLmF0KC0xKTtcblx0XHR9XG5cdFx0Z2V0QnVmZmVyKCkge1xuXHRcdFx0cmV0dXJuIFsuLi50aGlzLl9idWZmZXJdO1xuXHRcdH1cblx0XHRnZXQgc3Vic2NyaWJlckNvdW50KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N1YnMuc2l6ZTtcblx0XHR9XG5cdH07XG5cdHZhciB1dCA9IChlKSA9PiAodCkgPT4gbmV3IHYoKG4pID0+IHtcblx0XHRjb25zdCBzID0gdC5zdWJzY3JpYmUoe1xuXHRcdFx0bmV4dDogKHIpID0+IGUocikgJiYgbi5uZXh0KHIpLFxuXHRcdFx0ZXJyb3I6IChyKSA9PiBuLmVycm9yKHIpLFxuXHRcdFx0Y29tcGxldGU6ICgpID0+IG4uY29tcGxldGUoKVxuXHRcdH0pO1xuXHRcdHJldHVybiAoKSA9PiBzLnVuc3Vic2NyaWJlKCk7XG5cdH0pO1xuXHRmdW5jdGlvbiBIKCkge1xuXHRcdGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5EZW5vIDwgXCJ1XCIpIHJldHVybiBcImRlbm9cIjtcblx0XHRpZiAodHlwZW9mIGdsb2JhbFRoaXMucHJvY2VzcyA8IFwidVwiICYmIGdsb2JhbFRoaXMucHJvY2Vzcz8udmVyc2lvbnM/Lm5vZGUpIHJldHVybiBcIm5vZGVcIjtcblx0XHRjb25zdCBlID0gZ2xvYmFsVGhpcy5TZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGUsIHQgPSBnbG9iYWxUaGlzLlNoYXJlZFdvcmtlckdsb2JhbFNjb3BlLCBuID0gZ2xvYmFsVGhpcy5EZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTtcblx0XHRpZiAoZSAmJiBzZWxmIGluc3RhbmNlb2YgZSkgcmV0dXJuIFwic2VydmljZS13b3JrZXJcIjtcblx0XHRpZiAodCAmJiBzZWxmIGluc3RhbmNlb2YgdCkgcmV0dXJuIFwic2hhcmVkLXdvcmtlclwiO1xuXHRcdGlmIChuICYmIHNlbGYgaW5zdGFuY2VvZiBuKSByZXR1cm4gXCJ3b3JrZXJcIjtcblx0XHRpZiAodHlwZW9mIGNocm9tZSA8IFwidVwiICYmIGNocm9tZS5ydW50aW1lPy5pZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaHJvbWUucnVudGltZS5nZXRCYWNrZ3JvdW5kUGFnZSA9PSBcImZ1bmN0aW9uXCIgfHwgY2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3Q/LigpPy5iYWNrZ3JvdW5kPy5zZXJ2aWNlX3dvcmtlcikgcmV0dXJuIFwiY2hyb21lLWJhY2tncm91bmRcIjtcblx0XHRcdGlmICh0eXBlb2YgY2hyb21lLmRldnRvb2xzIDwgXCJ1XCIpIHJldHVybiBcImNocm9tZS1kZXZ0b29sc1wiO1xuXHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA8IFwidVwiICYmIGdsb2JhbFRoaXM/LmxvY2F0aW9uPy5wcm90b2NvbCA9PT0gXCJjaHJvbWUtZXh0ZW5zaW9uOlwiICYmIChjaHJvbWUuZXh0ZW5zaW9uPy5nZXRWaWV3cz8uKHsgdHlwZTogXCJwb3B1cFwiIH0pID8/IFtdKS5pbmNsdWRlcyhnbG9iYWxUaGlzKSkgcmV0dXJuIFwiY2hyb21lLXBvcHVwXCI7XG5cdFx0XHRpZiAodHlwZW9mIGRvY3VtZW50IDwgXCJ1XCIgJiYgZ2xvYmFsVGhpcz8ubG9jYXRpb24/LnByb3RvY29sICE9PSBcImNocm9tZS1leHRlbnNpb246XCIpIHJldHVybiBcImNocm9tZS1jb250ZW50XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0eXBlb2YgZ2xvYmFsVGhpcyA8IFwidVwiICYmIHR5cGVvZiBkb2N1bWVudCA8IFwidVwiID8gXCJ3aW5kb3dcIiA6IFwidW5rbm93blwiO1xuXHR9XG5cdGZ1bmN0aW9uIEtlKGUpIHtcblx0XHRpZiAodHlwZW9mIFJUQ0RhdGFDaGFubmVsIDwgXCJ1XCIgJiYgZSBpbnN0YW5jZW9mIFJUQ0RhdGFDaGFubmVsKSByZXR1cm4gXCJydGMtZGF0YVwiO1xuXHRcdGNvbnN0IHQgPSBaKGUpO1xuXHRcdHJldHVybiB0ICYmIHQgIT09IFwiaW50ZXJuYWxcIiA/IHQgOiBlID09PSBzZWxmIHx8IGUgPT09IGdsb2JhbFRoaXMgfHwgZSA9PT0gXCJzZWxmXCIgPyBcInNlbGZcIiA6IFwiaW50ZXJuYWxcIjtcblx0fVxuXHRmdW5jdGlvbiBibihlKSB7XG5cdFx0aWYgKCFlKSByZXR1cm4gXCJ1bmtub3duXCI7XG5cdFx0aWYgKGUuY29udGV4dFR5cGUpIHJldHVybiBlLmNvbnRleHRUeXBlO1xuXHRcdGNvbnN0IHQgPSBlLnNlbmRlciA/PyBcIlwiO1xuXHRcdHJldHVybiB0LmluY2x1ZGVzKFwid29ya2VyXCIpID8gXCJ3b3JrZXJcIiA6IHQuaW5jbHVkZXMoXCJzd1wiKSB8fCB0LmluY2x1ZGVzKFwic2VydmljZVwiKSA/IFwic2VydmljZS13b3JrZXJcIiA6IHQuaW5jbHVkZXMoXCJjaHJvbWVcIikgfHwgdC5pbmNsdWRlcyhcImNyeFwiKSA/IFwiY2hyb21lLWNvbnRlbnRcIiA6IHQuaW5jbHVkZXMoXCJiYWNrZ3JvdW5kXCIpID8gXCJjaHJvbWUtYmFja2dyb3VuZFwiIDogXCJ1bmtub3duXCI7XG5cdH1cblx0dmFyIHluID0ge1xuXHRcdGdldDogKGUsIHQpID0+IFJlZmxlY3QuZ2V0KGUsIHQpLFxuXHRcdHNldDogKGUsIHQsIG4pID0+IFJlZmxlY3Quc2V0KGUsIHQsIG4pLFxuXHRcdGhhczogKGUsIHQpID0+IFJlZmxlY3QuaGFzKGUsIHQpLFxuXHRcdGFwcGx5OiAoZSwgdCwgbikgPT4gUmVmbGVjdC5hcHBseShlLCB0LCBuKSxcblx0XHRjb25zdHJ1Y3Q6IChlLCB0KSA9PiBSZWZsZWN0LmNvbnN0cnVjdChlLCB0KSxcblx0XHRkZWxldGVQcm9wZXJ0eTogKGUsIHQpID0+IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZSwgdCksXG5cdFx0b3duS2V5czogKGUpID0+IFJlZmxlY3Qub3duS2V5cyhlKSxcblx0XHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChlLCB0KSA9PiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KSxcblx0XHRnZXRQcm90b3R5cGVPZjogKGUpID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSksXG5cdFx0c2V0UHJvdG90eXBlT2Y6IChlLCB0KSA9PiBSZWZsZWN0LnNldFByb3RvdHlwZU9mKGUsIHQpLFxuXHRcdGlzRXh0ZW5zaWJsZTogKGUpID0+IFJlZmxlY3QuaXNFeHRlbnNpYmxlKGUpLFxuXHRcdHByZXZlbnRFeHRlbnNpb25zOiAoZSkgPT4gUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhlKVxuXHR9O1xuXHR2YXIgcHQgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcInVuaWZvcm0ucHJveHlcIik7XG5cdHZhciBfdCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwidW5pZm9ybS5wcm94eS5pbnRlcm5hbHNcIik7XG5cdHZhciBDbiA9IGNsYXNzIHtcblx0XHRfaW52b2tlcjtcblx0XHRfY29uZmlnO1xuXHRcdF9jaGlsZENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRjb25zdHJ1Y3RvcihlLCB0KSB7XG5cdFx0XHR0aGlzLl9pbnZva2VyID0gZSwgdGhpcy5fY29uZmlnID0ge1xuXHRcdFx0XHRjaGFubmVsOiB0LmNoYW5uZWwsXG5cdFx0XHRcdGJhc2VQYXRoOiB0LmJhc2VQYXRoID8/IFtdLFxuXHRcdFx0XHRpbnZva2VyOiBlLFxuXHRcdFx0XHRjYWNoZTogdC5jYWNoZSA/PyAhMCxcblx0XHRcdFx0dGltZW91dDogdC50aW1lb3V0ID8/IDNlNFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0Z2V0KGUsIHQsIG4pIHtcblx0XHRcdGNvbnN0IHMgPSBTdHJpbmcodCk7XG5cdFx0XHRpZiAodCA9PT0gcHQpIHJldHVybiAhMDtcblx0XHRcdGlmICh0ID09PSBfdCkgcmV0dXJuIHRoaXMuX2NvbmZpZztcblx0XHRcdGlmICh0ID09PSBxbikgcmV0dXJuICEwO1xuXHRcdFx0aWYgKHQgPT09IFEpIHJldHVybiB0aGlzLl9nZXREZXNjcmlwdG9yKCk7XG5cdFx0XHRpZiAodCA9PT0gXCJ0aGVuXCIgfHwgdCA9PT0gXCJjYXRjaFwiIHx8IHQgPT09IFwiZmluYWxseVwiIHx8IHR5cGVvZiB0ID09IFwic3ltYm9sXCIpIHJldHVybjtcblx0XHRcdGlmICh0ID09PSBcIiRwYXRoXCIpIHJldHVybiB0aGlzLl9jb25maWcuYmFzZVBhdGg7XG5cdFx0XHRpZiAodCA9PT0gXCIkY2hhbm5lbFwiKSByZXR1cm4gdGhpcy5fY29uZmlnLmNoYW5uZWw7XG5cdFx0XHRpZiAodCA9PT0gXCIkZGVzY3JpcHRvclwiKSByZXR1cm4gdGhpcy5fZ2V0RGVzY3JpcHRvcigpO1xuXHRcdFx0aWYgKHQgPT09IFwiJGludm9rZVwiKSByZXR1cm4gdGhpcy5faW52b2tlcjtcblx0XHRcdGNvbnN0IHIgPSBbLi4udGhpcy5fY29uZmlnLmJhc2VQYXRoLCBzXTtcblx0XHRcdGlmICh0aGlzLl9jb25maWcuY2FjaGUgJiYgdGhpcy5fY2hpbGRDYWNoZS5oYXMocykpIHJldHVybiB0aGlzLl9jaGlsZENhY2hlLmdldChzKTtcblx0XHRcdGNvbnN0IGkgPSBlZSh0aGlzLl9pbnZva2VyLCB7XG5cdFx0XHRcdC4uLnRoaXMuX2NvbmZpZyxcblx0XHRcdFx0YmFzZVBhdGg6IHJcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbmZpZy5jYWNoZSAmJiB0aGlzLl9jaGlsZENhY2hlLnNldChzLCBpKSwgaTtcblx0XHR9XG5cdFx0c2V0KGUsIHQsIG4sIHMpIHtcblx0XHRcdHJldHVybiB0eXBlb2YgdCA9PSBcInN5bWJvbFwiIHx8IHRoaXMuX2ludm9rZXIoZC5TRVQsIFsuLi50aGlzLl9jb25maWcuYmFzZVBhdGgsIFN0cmluZyh0KV0sIFtuXSksICEwO1xuXHRcdH1cblx0XHRhcHBseShlLCB0LCBuKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faW52b2tlcihkLkFQUExZLCB0aGlzLl9jb25maWcuYmFzZVBhdGgsIFtuXSk7XG5cdFx0fVxuXHRcdGNvbnN0cnVjdChlLCB0LCBuKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faW52b2tlcihkLkNPTlNUUlVDVCwgdGhpcy5fY29uZmlnLmJhc2VQYXRoLCBbdF0pO1xuXHRcdH1cblx0XHRoYXMoZSwgdCkge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiB0ID09IFwic3ltYm9sXCIgPyAhMSA6IHRoaXMuX2ludm9rZXIoZC5IQVMsIHRoaXMuX2NvbmZpZy5iYXNlUGF0aCwgW3RdKTtcblx0XHR9XG5cdFx0ZGVsZXRlUHJvcGVydHkoZSwgdCkge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiB0ID09IFwic3ltYm9sXCIgPyAhMCA6IHRoaXMuX2ludm9rZXIoZC5ERUxFVEVfUFJPUEVSVFksIFsuLi50aGlzLl9jb25maWcuYmFzZVBhdGgsIFN0cmluZyh0KV0sIFtdKTtcblx0XHR9XG5cdFx0b3duS2V5cyhlKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHRcdGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjb25maWd1cmFibGU6ICEwLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdFx0d3JpdGFibGU6ICEwXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRnZXRQcm90b3R5cGVPZihlKSB7XG5cdFx0XHRyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlO1xuXHRcdH1cblx0XHRzZXRQcm90b3R5cGVPZihlLCB0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faW52b2tlcihkLlNFVF9QUk9UT1RZUEVfT0YsIHRoaXMuX2NvbmZpZy5iYXNlUGF0aCwgW3RdKTtcblx0XHR9XG5cdFx0aXNFeHRlbnNpYmxlKGUpIHtcblx0XHRcdHJldHVybiAhMDtcblx0XHR9XG5cdFx0cHJldmVudEV4dGVuc2lvbnMoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2ludm9rZXIoZC5QUkVWRU5UX0VYVEVOU0lPTlMsIHRoaXMuX2NvbmZpZy5iYXNlUGF0aCwgW10pO1xuXHRcdH1cblx0XHRfZ2V0RGVzY3JpcHRvcigpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHBhdGg6IHRoaXMuX2NvbmZpZy5iYXNlUGF0aCxcblx0XHRcdFx0Y2hhbm5lbDogdGhpcy5fY29uZmlnLmNoYW5uZWwsXG5cdFx0XHRcdHByaW1pdGl2ZTogITFcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xuXHRmdW5jdGlvbiBlZShlLCB0KSB7XG5cdFx0Y29uc3QgbiA9IGZ1bmN0aW9uKCkge30sIHMgPSBuZXcgQ24oZSwgdCk7XG5cdFx0cmV0dXJuIG5ldyBQcm94eShuLCBzKTtcblx0fVxuXHRmdW5jdGlvbiBtdChlLCB0LCBuKSB7XG5cdFx0aWYgKCFlIHx8IHR5cGVvZiBlICE9IFwib2JqZWN0XCIgfHwgZS5wcmltaXRpdmUpIHJldHVybiBlO1xuXHRcdGNvbnN0IHMgPSBZZS5nZXQoZSk7XG5cdFx0aWYgKHMpIHJldHVybiBzO1xuXHRcdGNvbnN0IHIgPSBlZSh0LCB7XG5cdFx0XHRjaGFubmVsOiBuID8/IGUuY2hhbm5lbCA/PyBcInVua25vd25cIixcblx0XHRcdGJhc2VQYXRoOiBlLnBhdGggPz8gW11cblx0XHR9KTtcblx0XHRyZXR1cm4gWWUuc2V0KGUsIHIpLCBkZS5zZXQociwgZSksIHI7XG5cdH1cblx0ZnVuY3Rpb24geG4oZSwgdCkge1xuXHRcdHJldHVybiBMbihlLCB0KTtcblx0fVxuXHRmdW5jdGlvbiBrbihlLCB0ID0gW10pIHtcblx0XHRyZXR1cm4gZWUoKHMsIHIsIGkpID0+IGUucmVxdWVzdCh7XG5cdFx0XHRpZDogJGUoKSxcblx0XHRcdGNoYW5uZWw6IGUuY2hhbm5lbE5hbWUsXG5cdFx0XHRzZW5kZXI6IGUuc2VuZGVySWQgPz8gXCJwcm94eVwiLFxuXHRcdFx0dHlwZTogXCJyZXF1ZXN0XCIsXG5cdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdGFjdGlvbjogcyxcblx0XHRcdFx0cGF0aDogcixcblx0XHRcdFx0YXJnczogaVxuXHRcdFx0fVxuXHRcdH0pLCB7XG5cdFx0XHRjaGFubmVsOiBlLmNoYW5uZWxOYW1lLFxuXHRcdFx0YmFzZVBhdGg6IHRcblx0XHR9KTtcblx0fVxuXHR2YXIgRW4gPSBtdDtcblx0ZnVuY3Rpb24gSW4oZSkge1xuXHRcdHJldHVybiBbXG5cdFx0XHRlLmxvY2FsQ2hhbm5lbCxcblx0XHRcdGUucmVtb3RlQ2hhbm5lbCxcblx0XHRcdGUuc2VuZGVyLFxuXHRcdFx0ZS50cmFuc3BvcnRUeXBlLFxuXHRcdFx0ZS5kaXJlY3Rpb25cblx0XHRdLmpvaW4oXCI6OlwiKTtcblx0fVxuXHRmdW5jdGlvbiBUbihlLCB0ID0ge30pIHtcblx0XHRjb25zdCBuID0gdC5pbmNsdWRlQ2xvc2VkID8/ICExLCBzID0gdC5zdGF0dXMgPz8gKG4gPyB2b2lkIDAgOiBcImFjdGl2ZVwiKTtcblx0XHRyZXR1cm4gWy4uLmVdLmZpbHRlcigocikgPT4gIShzICYmIHIuc3RhdHVzICE9PSBzIHx8IHQuY2hhbm5lbCAmJiByLmxvY2FsQ2hhbm5lbCAhPT0gdC5jaGFubmVsICYmIHIucmVtb3RlQ2hhbm5lbCAhPT0gdC5jaGFubmVsIHx8IHQubG9jYWxDaGFubmVsICYmIHIubG9jYWxDaGFubmVsICE9PSB0LmxvY2FsQ2hhbm5lbCB8fCB0LnJlbW90ZUNoYW5uZWwgJiYgci5yZW1vdGVDaGFubmVsICE9PSB0LnJlbW90ZUNoYW5uZWwgfHwgdC5zZW5kZXIgJiYgci5zZW5kZXIgIT09IHQuc2VuZGVyIHx8IHQudHJhbnNwb3J0VHlwZSAmJiByLnRyYW5zcG9ydFR5cGUgIT09IHQudHJhbnNwb3J0VHlwZSB8fCB0LmRpcmVjdGlvbiAmJiByLmRpcmVjdGlvbiAhPT0gdC5kaXJlY3Rpb24pKS5zb3J0KChyLCBpKSA9PiBpLnVwZGF0ZWRBdCAtIHIudXBkYXRlZEF0KTtcblx0fVxuXHR2YXIgYnQgPSBjbGFzcyB7XG5cdFx0X2NyZWF0ZUlkO1xuXHRcdF9lbWl0RXZlbnQ7XG5cdFx0X2Nvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRjb25zdHJ1Y3RvcihlLCB0KSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVJZCA9IGUsIHRoaXMuX2VtaXRFdmVudCA9IHQ7XG5cdFx0fVxuXHRcdHJlZ2lzdGVyKGUpIHtcblx0XHRcdGNvbnN0IHQgPSBJbihlKSwgbiA9IERhdGUubm93KCksIHMgPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQodCk7XG5cdFx0XHRpZiAocykgcmV0dXJuIHMudXBkYXRlZEF0ID0gbiwgcy5zdGF0dXMgPSBcImFjdGl2ZVwiLCBzLm1ldGFkYXRhID0ge1xuXHRcdFx0XHQuLi5zLm1ldGFkYXRhLFxuXHRcdFx0XHQuLi5lLm1ldGFkYXRhXG5cdFx0XHR9LCBzO1xuXHRcdFx0Y29uc3QgciA9IHtcblx0XHRcdFx0aWQ6IHRoaXMuX2NyZWF0ZUlkKCksXG5cdFx0XHRcdGxvY2FsQ2hhbm5lbDogZS5sb2NhbENoYW5uZWwsXG5cdFx0XHRcdHJlbW90ZUNoYW5uZWw6IGUucmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlcixcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogZS50cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRkaXJlY3Rpb246IGUuZGlyZWN0aW9uLFxuXHRcdFx0XHRzdGF0dXM6IFwiYWN0aXZlXCIsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbixcblx0XHRcdFx0dXBkYXRlZEF0OiBuLFxuXHRcdFx0XHRtZXRhZGF0YTogZS5tZXRhZGF0YVxuXHRcdFx0fTtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9ucy5zZXQodCwgciksIHRoaXMuX2VtaXRFdmVudD8uKHtcblx0XHRcdFx0dHlwZTogXCJjb25uZWN0ZWRcIixcblx0XHRcdFx0Y29ubmVjdGlvbjogcixcblx0XHRcdFx0dGltZXN0YW1wOiBuXG5cdFx0XHR9KSwgcjtcblx0XHR9XG5cdFx0bWFya05vdGlmaWVkKGUsIHQpIHtcblx0XHRcdGNvbnN0IG4gPSBEYXRlLm5vdygpO1xuXHRcdFx0ZS5sYXN0Tm90aWZ5QXQgPSBuLCBlLnVwZGF0ZWRBdCA9IG4sIHRoaXMuX2VtaXRFdmVudD8uKHtcblx0XHRcdFx0dHlwZTogXCJub3RpZmllZFwiLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBlLFxuXHRcdFx0XHR0aW1lc3RhbXA6IG4sXG5cdFx0XHRcdHBheWxvYWQ6IHRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjbG9zZUJ5Q2hhbm5lbChlKSB7XG5cdFx0XHRjb25zdCB0ID0gRGF0ZS5ub3coKTtcblx0XHRcdGZvciAoY29uc3QgbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgbi5sb2NhbENoYW5uZWwgIT09IGUgJiYgbi5yZW1vdGVDaGFubmVsICE9PSBlIHx8IG4uc3RhdHVzICE9PSBcImNsb3NlZFwiICYmIChuLnN0YXR1cyA9IFwiY2xvc2VkXCIsIG4udXBkYXRlZEF0ID0gdCwgdGhpcy5fZW1pdEV2ZW50Py4oe1xuXHRcdFx0XHR0eXBlOiBcImRpc2Nvbm5lY3RlZFwiLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBuLFxuXHRcdFx0XHR0aW1lc3RhbXA6IHRcblx0XHRcdH0pKTtcblx0XHR9XG5cdFx0Y2xvc2VBbGwoKSB7XG5cdFx0XHRjb25zdCBlID0gRGF0ZS5ub3coKTtcblx0XHRcdGZvciAoY29uc3QgdCBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgdC5zdGF0dXMgIT09IFwiY2xvc2VkXCIgJiYgKHQuc3RhdHVzID0gXCJjbG9zZWRcIiwgdC51cGRhdGVkQXQgPSBlLCB0aGlzLl9lbWl0RXZlbnQ/Lih7XG5cdFx0XHRcdHR5cGU6IFwiZGlzY29ubmVjdGVkXCIsXG5cdFx0XHRcdGNvbm5lY3Rpb246IHQsXG5cdFx0XHRcdHRpbWVzdGFtcDogZVxuXHRcdFx0fSkpO1xuXHRcdH1cblx0XHRxdWVyeShlID0ge30pIHtcblx0XHRcdHJldHVybiBUbih0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSwgZSk7XG5cdFx0fVxuXHRcdHZhbHVlcygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldO1xuXHRcdH1cblx0XHRjbGVhcigpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKCk7XG5cdFx0fVxuXHR9O1xuXHR2YXIgeXQgPSBjbGFzcyB7XG5cdFx0X25hbWU7XG5cdFx0X2NvbnRleHRUeXBlO1xuXHRcdF9jb25maWc7XG5cdFx0X3RyYW5zcG9ydHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9kZWZhdWx0VHJhbnNwb3J0ID0gbnVsbDtcblx0XHRfY29ubmVjdGlvbkV2ZW50cyA9IG5ldyBfKHsgYnVmZmVyU2l6ZTogMjAwIH0pO1xuXHRcdF9jb25uZWN0aW9uUmVnaXN0cnkgPSBuZXcgYnQoKCkgPT4gJGUoKSwgKGUpID0+IHRoaXMuX2Nvbm5lY3Rpb25FdmVudHMubmV4dChlKSk7XG5cdFx0X3BlbmRpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9zdWJzY3JpcHRpb25zID0gW107XG5cdFx0X2luYm91bmQgPSBuZXcgXyh7IGJ1ZmZlclNpemU6IDEwMCB9KTtcblx0XHRfb3V0Ym91bmQgPSBuZXcgXyh7IGJ1ZmZlclNpemU6IDEwMCB9KTtcblx0XHRfaW52b2NhdGlvbnMgPSBuZXcgXyh7IGJ1ZmZlclNpemU6IDEwMCB9KTtcblx0XHRfcmVzcG9uc2VzID0gbmV3IF8oeyBidWZmZXJTaXplOiAxMDAgfSk7XG5cdFx0X2V4cG9zZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9wcm94eUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5cdFx0X19nZXRQcml2YXRlKGUpIHtcblx0XHRcdHJldHVybiB0aGlzW2VdO1xuXHRcdH1cblx0XHRfX3NldFByaXZhdGUoZSwgdCkge1xuXHRcdFx0dGhpc1tlXSA9IHQ7XG5cdFx0fVxuXHRcdGNvbnN0cnVjdG9yKGUpIHtcblx0XHRcdGNvbnN0IHQgPSB0eXBlb2YgZSA9PSBcInN0cmluZ1wiID8geyBuYW1lOiBlIH0gOiBlO1xuXHRcdFx0dGhpcy5fbmFtZSA9IHQubmFtZSwgdGhpcy5fY29udGV4dFR5cGUgPSB0LmF1dG9EZXRlY3QgIT09ICExID8gSCgpIDogXCJ1bmtub3duXCIsIHRoaXMuX2NvbmZpZyA9IHtcblx0XHRcdFx0bmFtZTogdC5uYW1lLFxuXHRcdFx0XHRhdXRvRGV0ZWN0OiB0LmF1dG9EZXRlY3QgPz8gITAsXG5cdFx0XHRcdHRpbWVvdXQ6IHQudGltZW91dCA/PyAzZTQsXG5cdFx0XHRcdHJlZmxlY3Q6IHQucmVmbGVjdCA/PyB5bixcblx0XHRcdFx0YnVmZmVyU2l6ZTogdC5idWZmZXJTaXplID8/IDEwMCxcblx0XHRcdFx0YXV0b0xpc3RlbjogdC5hdXRvTGlzdGVuID8/ICEwXG5cdFx0XHR9LCB0aGlzLl9jb25maWcuYXV0b0xpc3RlbiAmJiB0aGlzLl9pc1dvcmtlckNvbnRleHQoKSAmJiB0aGlzLmxpc3RlbihzZWxmKTtcblx0XHR9XG5cdFx0Y29ubmVjdChlLCB0ID0ge30pIHtcblx0XHRcdGNvbnN0IG4gPSBLZShlKSwgcyA9IHQudGFyZ2V0Q2hhbm5lbCA/PyB0aGlzLl9pbmZlclRhcmdldENoYW5uZWwoZSwgbiksIHIgPSB0aGlzLl9jcmVhdGVUcmFuc3BvcnRCaW5kaW5nKGUsIG4sIHMsIHQpO1xuXHRcdFx0dGhpcy5fdHJhbnNwb3J0cy5zZXQocywgciksIHRoaXMuX2RlZmF1bHRUcmFuc3BvcnQgfHwgKHRoaXMuX2RlZmF1bHRUcmFuc3BvcnQgPSByKTtcblx0XHRcdGNvbnN0IGkgPSB0aGlzLl9yZWdpc3RlckNvbm5lY3Rpb24oe1xuXHRcdFx0XHRsb2NhbENoYW5uZWw6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHJlbW90ZUNoYW5uZWw6IHMsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogbixcblx0XHRcdFx0ZGlyZWN0aW9uOiBcIm91dGdvaW5nXCIsXG5cdFx0XHRcdG1ldGFkYXRhOiB7IHBoYXNlOiBcImNvbm5lY3RcIiB9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0aGlzLl9lbWl0Q29ubmVjdGlvblNpZ25hbChyLCBcImNvbm5lY3RcIiwge1xuXHRcdFx0XHRjb25uZWN0aW9uSWQ6IGkuaWQsXG5cdFx0XHRcdGZyb206IHRoaXMuX25hbWUsXG5cdFx0XHRcdHRvOiBzXG5cdFx0XHR9KSwgdGhpcztcblx0XHR9XG5cdFx0bGlzdGVuKGUsIHQgPSB7fSkge1xuXHRcdFx0Y29uc3QgbiA9IEtlKGUpLCBzID0gdC50YXJnZXRDaGFubmVsID8/IHRoaXMuX2luZmVyVGFyZ2V0Q2hhbm5lbChlLCBuKSwgciA9IChvKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhvKSwgaSA9IHRoaXMuX3JlZ2lzdGVyQ29ubmVjdGlvbih7XG5cdFx0XHRcdGxvY2FsQ2hhbm5lbDogdGhpcy5fbmFtZSxcblx0XHRcdFx0cmVtb3RlQ2hhbm5lbDogcyxcblx0XHRcdFx0c2VuZGVyOiBzLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBuLFxuXHRcdFx0XHRkaXJlY3Rpb246IFwiaW5jb21pbmdcIixcblx0XHRcdFx0bWV0YWRhdGE6IHsgcGhhc2U6IFwibGlzdGVuXCIgfVxuXHRcdFx0fSk7XG5cdFx0XHRzd2l0Y2ggKG4pIHtcblx0XHRcdFx0Y2FzZSBcIndvcmtlclwiOlxuXHRcdFx0XHRjYXNlIFwibWVzc2FnZS1wb3J0XCI6XG5cdFx0XHRcdGNhc2UgXCJicm9hZGNhc3RcIjpcblx0XHRcdFx0XHR0LmF1dG9TdGFydCAhPT0gITEgJiYgZS5zdGFydCAmJiBlLnN0YXJ0KCksIGUuYWRkRXZlbnRMaXN0ZW5lcj8uKFwibWVzc2FnZVwiLCAoKG8pID0+IHIoby5kYXRhKSkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwid2Vic29ja2V0XCI6XG5cdFx0XHRcdFx0ZS5hZGRFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsICgobykgPT4ge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cihKU09OLnBhcnNlKG8uZGF0YSkpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS1ydW50aW1lXCI6XG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlPy5hZGRMaXN0ZW5lcj8uKChvLCBhLCBjKSA9PiAocihvKSwgITApKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS10YWJzXCI6XG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUub25NZXNzYWdlPy5hZGRMaXN0ZW5lcj8uKChvLCBhKSA9PiB0LnRhYklkICE9IG51bGwgJiYgYT8udGFiPy5pZCAhPT0gdC50YWJJZCA/ICExIDogKHIobyksICEwKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtcG9ydFwiOlxuXHRcdFx0XHRcdGU/Lm9uTWVzc2FnZT8uYWRkTGlzdGVuZXI/LigobykgPT4ge1xuXHRcdFx0XHRcdFx0cihvKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImNocm9tZS1leHRlcm5hbFwiOlxuXHRcdFx0XHRcdGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZUV4dGVybmFsPy5hZGRMaXN0ZW5lcj8uKChvKSA9PiAocihvKSwgITApKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInNlbGZcIjpcblx0XHRcdFx0XHRhZGRFdmVudExpc3RlbmVyPy4oXCJtZXNzYWdlXCIsICgobykgPT4gcihvLmRhdGEpKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IHQub25NZXNzYWdlICYmIHQub25NZXNzYWdlKHIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuX3NlbmRTaWduYWxUb1RhcmdldChlLCBuLCB7XG5cdFx0XHRcdGNvbm5lY3Rpb25JZDogaS5pZCxcblx0XHRcdFx0ZnJvbTogdGhpcy5fbmFtZSxcblx0XHRcdFx0dG86IHMsXG5cdFx0XHRcdHRhYklkOiB0LnRhYklkLFxuXHRcdFx0XHRleHRlcm5hbElkOiB0LmV4dGVybmFsSWRcblx0XHRcdH0sIFwibm90aWZ5XCIpLCB0aGlzO1xuXHRcdH1cblx0XHRhdHRhY2goZSwgdCA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KGUsIHQpO1xuXHRcdH1cblx0XHRleHBvc2UoZSwgdCkge1xuXHRcdFx0Y29uc3QgbiA9IFtlXTtcblx0XHRcdHJldHVybiBmZShuLCB0KSwgdGhpcy5fZXhwb3NlZC5zZXQoZSwge1xuXHRcdFx0XHRuYW1lOiBlLFxuXHRcdFx0XHRvYmo6IHQsXG5cdFx0XHRcdHBhdGg6IG5cblx0XHRcdH0pLCB0aGlzO1xuXHRcdH1cblx0XHRleHBvc2VBbGwoZSkge1xuXHRcdFx0Zm9yIChjb25zdCBbdCwgbl0gb2YgT2JqZWN0LmVudHJpZXMoZSkpIHRoaXMuZXhwb3NlKHQsIG4pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGFzeW5jIGltcG9ydChlLCB0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnZva2UodCA/PyB0aGlzLl9nZXREZWZhdWx0VGFyZ2V0KCksIGQuSU1QT1JULCBbXSwgW2VdKTtcblx0XHR9XG5cdFx0aW52b2tlKGUsIHQsIG4sIHMgPSBbXSkge1xuXHRcdFx0Y29uc3QgciA9ICRlKCksIGkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcblx0XHRcdHRoaXMuX3BlbmRpbmcuc2V0KHIsIGkpO1xuXHRcdFx0Y29uc3QgbyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9wZW5kaW5nLmhhcyhyKSAmJiAodGhpcy5fcGVuZGluZy5kZWxldGUociksIGkucmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dDogJHt0fSBvbiAke24uam9pbihcIi5cIil9YCkpKTtcblx0XHRcdH0sIHRoaXMuX2NvbmZpZy50aW1lb3V0KSwgYSA9IHtcblx0XHRcdFx0aWQ6IHIsXG5cdFx0XHRcdGNoYW5uZWw6IGUsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHlwZTogXCJyZXF1ZXN0XCIsXG5cdFx0XHRcdHBheWxvYWQ6IHtcblx0XHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0XHRhY3Rpb246IHQsXG5cdFx0XHRcdFx0cGF0aDogbixcblx0XHRcdFx0XHRhcmdzOiBzXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fTtcblx0XHRcdHJldHVybiB0aGlzLl9zZW5kKGUsIGEpLCB0aGlzLl9vdXRib3VuZC5uZXh0KGEpLCBpLnByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQobykpO1xuXHRcdH1cblx0XHRnZXQoZSwgdCwgbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW52b2tlKGUsIGQuR0VULCB0LCBbbl0pO1xuXHRcdH1cblx0XHRzZXQoZSwgdCwgbiwgcykge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW52b2tlKGUsIGQuU0VULCB0LCBbbiwgc10pO1xuXHRcdH1cblx0XHRjYWxsKGUsIHQsIG4gPSBbXSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW52b2tlKGUsIGQuQVBQTFksIHQsIFtuXSk7XG5cdFx0fVxuXHRcdGNvbnN0cnVjdChlLCB0LCBuID0gW10pIHtcblx0XHRcdHJldHVybiB0aGlzLmludm9rZShlLCBkLkNPTlNUUlVDVCwgdCwgW25dKTtcblx0XHR9XG5cdFx0cHJveHkoZSwgdCA9IFtdKSB7XG5cdFx0XHRjb25zdCBuID0gZSA/PyB0aGlzLl9nZXREZWZhdWx0VGFyZ2V0KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY3JlYXRlUHJveHkobiwgdCk7XG5cdFx0fVxuXHRcdHJlbW90ZShlLCB0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm94eSh0LCBbZV0pO1xuXHRcdH1cblx0XHR3cmFwRGVzY3JpcHRvcihlLCB0KSB7XG5cdFx0XHRyZXR1cm4gbXQoZSwgKHMsIHIsIGkpID0+IHtcblx0XHRcdFx0Y29uc3QgbyA9IHQgPz8gZT8uY2hhbm5lbCA/PyB0aGlzLl9nZXREZWZhdWx0VGFyZ2V0KCk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmludm9rZShvLCBzLCByLCBpKTtcblx0XHRcdH0sIHQgPz8gZT8uY2hhbm5lbCA/PyB0aGlzLl9nZXREZWZhdWx0VGFyZ2V0KCkpO1xuXHRcdH1cblx0XHRzdWJzY3JpYmUoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2luYm91bmQuc3Vic2NyaWJlKGUpO1xuXHRcdH1cblx0XHRuZXh0KGUpIHtcblx0XHRcdHRoaXMuX3NlbmQoZS5jaGFubmVsLCBlKSwgdGhpcy5fb3V0Ym91bmQubmV4dChlKTtcblx0XHR9XG5cdFx0ZW1pdChlLCB0LCBuKSB7XG5cdFx0XHRjb25zdCBzID0ge1xuXHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0Y2hhbm5lbDogZSxcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0eXBlOiBcImV2ZW50XCIsXG5cdFx0XHRcdHBheWxvYWQ6IHtcblx0XHRcdFx0XHR0eXBlOiB0LFxuXHRcdFx0XHRcdGRhdGE6IG5cblx0XHRcdFx0fSxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5uZXh0KHMpO1xuXHRcdH1cblx0XHRub3RpZnkoZSwgdCA9IHt9LCBuID0gXCJub3RpZnlcIikge1xuXHRcdFx0Y29uc3QgcyA9IHRoaXMuX3RyYW5zcG9ydHMuZ2V0KGUpO1xuXHRcdFx0cmV0dXJuIHMgPyAodGhpcy5fZW1pdENvbm5lY3Rpb25TaWduYWwocywgbiwge1xuXHRcdFx0XHRmcm9tOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0bzogZSxcblx0XHRcdFx0Li4udFxuXHRcdFx0fSksICEwKSA6ICExO1xuXHRcdH1cblx0XHRnZXQgb25NZXNzYWdlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2luYm91bmQ7XG5cdFx0fVxuXHRcdGdldCBvbk91dGJvdW5kKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX291dGJvdW5kO1xuXHRcdH1cblx0XHRnZXQgb25JbnZvY2F0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2ludm9jYXRpb25zO1xuXHRcdH1cblx0XHRnZXQgb25SZXNwb25zZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXNwb25zZXM7XG5cdFx0fVxuXHRcdGdldCBvbkNvbm5lY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbkV2ZW50cztcblx0XHR9XG5cdFx0c3Vic2NyaWJlQ29ubmVjdGlvbnMoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25FdmVudHMuc3Vic2NyaWJlKGUpO1xuXHRcdH1cblx0XHRxdWVyeUNvbm5lY3Rpb25zKGUgPSB7fSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5xdWVyeShlKTtcblx0XHR9XG5cdFx0bm90aWZ5Q29ubmVjdGlvbnMoZSA9IHt9LCB0ID0ge30pIHtcblx0XHRcdGxldCBuID0gMDtcblx0XHRcdGNvbnN0IHMgPSB0aGlzLnF1ZXJ5Q29ubmVjdGlvbnMoe1xuXHRcdFx0XHQuLi50LFxuXHRcdFx0XHRzdGF0dXM6IFwiYWN0aXZlXCIsXG5cdFx0XHRcdGluY2x1ZGVDbG9zZWQ6ICExXG5cdFx0XHR9KTtcblx0XHRcdGZvciAoY29uc3QgciBvZiBzKSB7XG5cdFx0XHRcdGNvbnN0IGkgPSB0aGlzLl90cmFuc3BvcnRzLmdldChyLnJlbW90ZUNoYW5uZWwpO1xuXHRcdFx0XHRpICYmICh0aGlzLl9lbWl0Q29ubmVjdGlvblNpZ25hbChpLCBcIm5vdGlmeVwiLCB7XG5cdFx0XHRcdFx0Y29ubmVjdGlvbklkOiByLmlkLFxuXHRcdFx0XHRcdGZyb206IHRoaXMuX25hbWUsXG5cdFx0XHRcdFx0dG86IHIucmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0XHQuLi5lXG5cdFx0XHRcdH0pLCBuKyspO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG47XG5cdFx0fVxuXHRcdGdldCBuYW1lKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX25hbWU7XG5cdFx0fVxuXHRcdGdldCBjb250ZXh0VHlwZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb250ZXh0VHlwZTtcblx0XHR9XG5cdFx0Z2V0IGNvbmZpZygpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25maWc7XG5cdFx0fVxuXHRcdGdldCBjb25uZWN0ZWRDaGFubmVscygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fdHJhbnNwb3J0cy5rZXlzKCldO1xuXHRcdH1cblx0XHRnZXQgZXhwb3NlZE1vZHVsZXMoKSB7XG5cdFx0XHRyZXR1cm4gWy4uLnRoaXMuX2V4cG9zZWQua2V5cygpXTtcblx0XHR9XG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goKGUpID0+IGUudW5zdWJzY3JpYmUoKSksIHRoaXMuX3N1YnNjcmlwdGlvbnMgPSBbXSwgdGhpcy5fcGVuZGluZy5jbGVhcigpLCB0aGlzLl9tYXJrQWxsQ29ubmVjdGlvbnNDbG9zZWQoKTtcblx0XHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl90cmFuc3BvcnRzLnZhbHVlcygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZS5jbGVhbnVwPy4oKTtcblx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRpZiAoZS50cmFuc3BvcnRUeXBlID09PSBcIm1lc3NhZ2UtcG9ydFwiIHx8IGUudHJhbnNwb3J0VHlwZSA9PT0gXCJicm9hZGNhc3RcIikgdHJ5IHtcblx0XHRcdFx0XHRlLnRhcmdldD8uY2xvc2U/LigpO1xuXHRcdFx0XHR9IGNhdGNoIHt9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90cmFuc3BvcnRzLmNsZWFyKCksIHRoaXMuX2RlZmF1bHRUcmFuc3BvcnQgPSBudWxsLCB0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkuY2xlYXIoKSwgdGhpcy5faW5ib3VuZC5jb21wbGV0ZSgpLCB0aGlzLl9vdXRib3VuZC5jb21wbGV0ZSgpLCB0aGlzLl9pbnZvY2F0aW9ucy5jb21wbGV0ZSgpLCB0aGlzLl9yZXNwb25zZXMuY29tcGxldGUoKSwgdGhpcy5fY29ubmVjdGlvbkV2ZW50cy5jb21wbGV0ZSgpO1xuXHRcdH1cblx0XHRfaGFuZGxlSW5jb21pbmcoZSkge1xuXHRcdFx0aWYgKCEoIWUgfHwgdHlwZW9mIGUgIT0gXCJvYmplY3RcIikpIHN3aXRjaCAodGhpcy5faW5ib3VuZC5uZXh0KGUpLCBlLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcInJlcXVlc3RcIjpcblx0XHRcdFx0XHRlLmNoYW5uZWwgPT09IHRoaXMuX25hbWUgJiYgdGhpcy5faGFuZGxlUmVxdWVzdChlKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlc3BvbnNlXCI6XG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlUmVzcG9uc2UoZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJldmVudFwiOiBicmVhaztcblx0XHRcdFx0Y2FzZSBcInNpZ25hbFwiOiB0aGlzLl9oYW5kbGVTaWduYWwoZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdF9oYW5kbGVSZXNwb25zZShlKSB7XG5cdFx0XHRjb25zdCB0ID0gZS5yZXFJZCA/PyBlLmlkLCBuID0gdGhpcy5fcGVuZGluZy5nZXQodCk7XG5cdFx0XHRpZiAobikge1xuXHRcdFx0XHRpZiAodGhpcy5fcGVuZGluZy5kZWxldGUodCksIGUucGF5bG9hZD8uZXJyb3IpIG4ucmVqZWN0KG5ldyBFcnJvcihlLnBheWxvYWQuZXJyb3IpKTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcyA9IGUucGF5bG9hZD8ucmVzdWx0LCByID0gZS5wYXlsb2FkPy5kZXNjcmlwdG9yO1xuXHRcdFx0XHRcdHMgIT0gbnVsbCA/IG4ucmVzb2x2ZShzKSA6IHIgPyBuLnJlc29sdmUodGhpcy53cmFwRGVzY3JpcHRvcihyLCBlLnNlbmRlcikpIDogbi5yZXNvbHZlKHZvaWQgMCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fcmVzcG9uc2VzLm5leHQoe1xuXHRcdFx0XHRcdGlkOiB0LFxuXHRcdFx0XHRcdGNoYW5uZWw6IGUuY2hhbm5lbCxcblx0XHRcdFx0XHRzZW5kZXI6IGUuc2VuZGVyLFxuXHRcdFx0XHRcdHJlc3VsdDogZS5wYXlsb2FkPy5yZXN1bHQsXG5cdFx0XHRcdFx0ZGVzY3JpcHRvcjogZS5wYXlsb2FkPy5kZXNjcmlwdG9yLFxuXHRcdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0YXN5bmMgX2hhbmRsZVJlcXVlc3QoZSkge1xuXHRcdFx0Y29uc3QgdCA9IGUucGF5bG9hZDtcblx0XHRcdGlmICghdCkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgeyBhY3Rpb246IG4sIHBhdGg6IHMsIGFyZ3M6IHIsIHNlbmRlcjogaSB9ID0gdCwgbyA9IGUucmVxSWQgPz8gZS5pZDtcblx0XHRcdHRoaXMuX2ludm9jYXRpb25zLm5leHQoe1xuXHRcdFx0XHRpZDogbyxcblx0XHRcdFx0Y2hhbm5lbDogdGhpcy5fbmFtZSxcblx0XHRcdFx0c2VuZGVyOiBpLFxuXHRcdFx0XHRhY3Rpb246IG4sXG5cdFx0XHRcdHBhdGg6IHMsXG5cdFx0XHRcdGFyZ3M6IHIgPz8gW10sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcblx0XHRcdFx0Y29udGV4dFR5cGU6IGJuKGUpXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHsgcmVzdWx0OiBhLCB0b1RyYW5zZmVyOiBjLCBuZXdQYXRoOiBsIH0gPSBhd2FpdCB0aGlzLl9leGVjdXRlQWN0aW9uKG4sIHMsIHIgPz8gW10sIGkpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc2VuZFJlc3BvbnNlKG8sIG4sIGksIGwsIGEsIGMpO1xuXHRcdH1cblx0XHRhc3luYyBfZXhlY3V0ZUFjdGlvbihlLCB0LCBuLCBzKSB7XG5cdFx0XHRjb25zdCB7IHJlc3VsdDogciwgdG9UcmFuc2ZlcjogaSwgcGF0aDogbyB9ID0gUHQoZSwgdCwgbiwge1xuXHRcdFx0XHRjaGFubmVsOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHRzZW5kZXI6IHMsXG5cdFx0XHRcdHJlZmxlY3Q6IHRoaXMuX2NvbmZpZy5yZWZsZWN0XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlc3VsdDogYXdhaXQgcixcblx0XHRcdFx0dG9UcmFuc2ZlcjogaSxcblx0XHRcdFx0bmV3UGF0aDogb1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0YXN5bmMgX3NlbmRSZXNwb25zZShlLCB0LCBuLCBzLCByLCBpKSB7XG5cdFx0XHRjb25zdCB7IHJlc3BvbnNlOiBvLCB0cmFuc2ZlcjogYSB9ID0gYXdhaXQgTXQoZSwgdCwgdGhpcy5fbmFtZSwgbiwgcywgciwgaSksIGMgPSB7XG5cdFx0XHRcdGlkOiBlLFxuXHRcdFx0XHQuLi5vLFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KCksXG5cdFx0XHRcdHRyYW5zZmVyYWJsZTogYVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NlbmQobiwgYywgYSk7XG5cdFx0fVxuXHRcdF9oYW5kbGVTaWduYWwoZSkge1xuXHRcdFx0Y29uc3QgdCA9IGU/LnBheWxvYWQgPz8ge30sIG4gPSB0LmZyb20gPz8gZS5zZW5kZXIgPz8gXCJ1bmtub3duXCIsIHMgPSBlLnRyYW5zcG9ydFR5cGUgPz8gdGhpcy5fdHJhbnNwb3J0cy5nZXQoZS5jaGFubmVsKT8udHJhbnNwb3J0VHlwZSA/PyBcImludGVybmFsXCIsIHIgPSB0aGlzLl9yZWdpc3RlckNvbm5lY3Rpb24oe1xuXHRcdFx0XHRsb2NhbENoYW5uZWw6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHJlbW90ZUNoYW5uZWw6IG4sXG5cdFx0XHRcdHNlbmRlcjogZS5zZW5kZXIgPz8gbixcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogcyxcblx0XHRcdFx0ZGlyZWN0aW9uOiBcImluY29taW5nXCJcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5fbWFya0Nvbm5lY3Rpb25Ob3RpZmllZChyLCB0KTtcblx0XHR9XG5cdFx0X3JlZ2lzdGVyQ29ubmVjdGlvbihlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LnJlZ2lzdGVyKGUpO1xuXHRcdH1cblx0XHRfbWFya0Nvbm5lY3Rpb25Ob3RpZmllZChlLCB0KSB7XG5cdFx0XHR0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkubWFya05vdGlmaWVkKGUsIHQpO1xuXHRcdH1cblx0XHRfZW1pdENvbm5lY3Rpb25TaWduYWwoZSwgdCwgbiA9IHt9KSB7XG5cdFx0XHRjb25zdCBzID0ge1xuXHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0dHlwZTogXCJzaWduYWxcIixcblx0XHRcdFx0Y2hhbm5lbDogZS50YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRzZW5kZXI6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IGUudHJhbnNwb3J0VHlwZSxcblx0XHRcdFx0cGF5bG9hZDoge1xuXHRcdFx0XHRcdHR5cGU6IHQsXG5cdFx0XHRcdFx0ZnJvbTogdGhpcy5fbmFtZSxcblx0XHRcdFx0XHR0bzogZS50YXJnZXRDaGFubmVsLFxuXHRcdFx0XHRcdC4uLm5cblx0XHRcdFx0fSxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9O1xuXHRcdFx0KGU/LnNlbmRlciA/PyBlPy5wb3N0TWVzc2FnZSk/LmNhbGwoZSwgcyk7XG5cdFx0XHRjb25zdCByID0gdGhpcy5fcmVnaXN0ZXJDb25uZWN0aW9uKHtcblx0XHRcdFx0bG9jYWxDaGFubmVsOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiBlLnRhcmdldENoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogZS50cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRkaXJlY3Rpb246IFwib3V0Z29pbmdcIlxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9tYXJrQ29ubmVjdGlvbk5vdGlmaWVkKHIsIHMucGF5bG9hZCk7XG5cdFx0fVxuXHRcdF9zZW5kU2lnbmFsVG9UYXJnZXQoZSwgdCwgbiwgcykge1xuXHRcdFx0Y29uc3QgciA9IHtcblx0XHRcdFx0aWQ6ICRlKCksXG5cdFx0XHRcdHR5cGU6IFwic2lnbmFsXCIsXG5cdFx0XHRcdGNoYW5uZWw6IG4udG8gPz8gdGhpcy5fbmFtZSxcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiB0LFxuXHRcdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdFx0dHlwZTogcyxcblx0XHRcdFx0XHQuLi5uXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0ID09PSBcIndlYnNvY2tldFwiKSB7XG5cdFx0XHRcdFx0ZT8uc2VuZD8uKEpTT04uc3RyaW5naWZ5KHIpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHQgPT09IFwiY2hyb21lLXJ1bnRpbWVcIikge1xuXHRcdFx0XHRcdGNocm9tZS5ydW50aW1lPy5zZW5kTWVzc2FnZT8uKHIpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodCA9PT0gXCJjaHJvbWUtdGFic1wiKSB7XG5cdFx0XHRcdFx0Y29uc3QgaSA9IG4udGFiSWQ7XG5cdFx0XHRcdFx0aSAhPSBudWxsICYmIGNocm9tZS50YWJzPy5zZW5kTWVzc2FnZT8uKGksIHIpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodCA9PT0gXCJjaHJvbWUtcG9ydFwiKSB7XG5cdFx0XHRcdFx0ZT8ucG9zdE1lc3NhZ2U/LihyKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHQgPT09IFwiY2hyb21lLWV4dGVybmFsXCIpIHtcblx0XHRcdFx0XHRuLmV4dGVybmFsSWQgJiYgY2hyb21lLnJ1bnRpbWU/LnNlbmRNZXNzYWdlPy4obi5leHRlcm5hbElkLCByKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0ZT8ucG9zdE1lc3NhZ2U/LihyLCB7IHRyYW5zZmVyOiBbXSB9KTtcblx0XHRcdH0gY2F0Y2gge31cblx0XHR9XG5cdFx0X21hcmtBbGxDb25uZWN0aW9uc0Nsb3NlZCgpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5jbG9zZUFsbCgpO1xuXHRcdH1cblx0XHRfY3JlYXRlVHJhbnNwb3J0QmluZGluZyhlLCB0LCBuLCBzKSB7XG5cdFx0XHRsZXQgciwgaTtcblx0XHRcdHN3aXRjaCAodCkge1xuXHRcdFx0XHRjYXNlIFwid29ya2VyXCI6XG5cdFx0XHRcdGNhc2UgXCJtZXNzYWdlLXBvcnRcIjpcblx0XHRcdFx0Y2FzZSBcImJyb2FkY2FzdFwiOlxuXHRcdFx0XHRcdHMuYXV0b1N0YXJ0ICE9PSAhMSAmJiBlLnN0YXJ0ICYmIGUuc3RhcnQoKSwgciA9IChvLCBhKSA9PiBlLnBvc3RNZXNzYWdlKG8sIHsgdHJhbnNmZXI6IGEgfSk7XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9ICgoYSkgPT4gdGhpcy5faGFuZGxlSW5jb21pbmcoYS5kYXRhKSk7XG5cdFx0XHRcdFx0XHRlLmFkZEV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgbyksIGkgPSAoKSA9PiBlLnJlbW92ZUV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgbyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwid2Vic29ja2V0XCI6XG5cdFx0XHRcdFx0ciA9IChvKSA9PiBlLnNlbmQoSlNPTi5zdHJpbmdpZnkobykpO1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IG8gPSAoKGEpID0+IHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVJbmNvbWluZyhKU09OLnBhcnNlKGEuZGF0YSkpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIHt9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGUuYWRkRXZlbnRMaXN0ZW5lcj8uKFwibWVzc2FnZVwiLCBvKSwgaSA9ICgpID0+IGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj8uKFwibWVzc2FnZVwiLCBvKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtcnVudGltZVwiOlxuXHRcdFx0XHRcdHIgPSAobykgPT4gY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uobyk7XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9IChhKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhhKTtcblx0XHRcdFx0XHRcdGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZT8uYWRkTGlzdGVuZXI/LihvKSwgaSA9ICgpID0+IGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZT8ucmVtb3ZlTGlzdGVuZXI/LihvKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtdGFic1wiOlxuXHRcdFx0XHRcdHIgPSAobykgPT4ge1xuXHRcdFx0XHRcdFx0cy50YWJJZCAhPSBudWxsICYmIGNocm9tZS50YWJzPy5zZW5kTWVzc2FnZT8uKHMudGFiSWQsIG8pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9IChhLCBjKSA9PiBzLnRhYklkICE9IG51bGwgJiYgYz8udGFiPy5pZCAhPT0gcy50YWJJZCA/ICExIDogKHRoaXMuX2hhbmRsZUluY29taW5nKGEpLCAhMCk7XG5cdFx0XHRcdFx0XHRjaHJvbWUucnVudGltZS5vbk1lc3NhZ2U/LmFkZExpc3RlbmVyPy4obyksIGkgPSAoKSA9PiBjaHJvbWUucnVudGltZS5vbk1lc3NhZ2U/LnJlbW92ZUxpc3RlbmVyPy4obyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiY2hyb21lLXBvcnRcIjpcblx0XHRcdFx0XHRpZiAoZT8ucG9zdE1lc3NhZ2UgJiYgZT8ub25NZXNzYWdlPy5hZGRMaXN0ZW5lcikge1xuXHRcdFx0XHRcdFx0ciA9IChhKSA9PiBlLnBvc3RNZXNzYWdlKGEpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9IChhKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhhKTtcblx0XHRcdFx0XHRcdGUub25NZXNzYWdlLmFkZExpc3RlbmVyKG8pLCBpID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGUub25NZXNzYWdlLnJlbW92ZUxpc3RlbmVyKG8pO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIHt9XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0ZS5kaXNjb25uZWN0Py4oKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9IHMucG9ydE5hbWUgPz8gbiwgYSA9IHMudGFiSWQgIT0gbnVsbCAmJiBjaHJvbWUudGFicz8uY29ubmVjdCA/IGNocm9tZS50YWJzLmNvbm5lY3Qocy50YWJJZCwgeyBuYW1lOiBvIH0pIDogY2hyb21lLnJ1bnRpbWUuY29ubmVjdCh7IG5hbWU6IG8gfSk7XG5cdFx0XHRcdFx0XHRyID0gKGwpID0+IGEucG9zdE1lc3NhZ2UobCk7XG5cdFx0XHRcdFx0XHRjb25zdCBjID0gKGwpID0+IHRoaXMuX2hhbmRsZUluY29taW5nKGwpO1xuXHRcdFx0XHRcdFx0YS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoYyksIGkgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0YS5vbk1lc3NhZ2UucmVtb3ZlTGlzdGVuZXIoYyk7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2gge31cblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRhLmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJjaHJvbWUtZXh0ZXJuYWxcIjpcblx0XHRcdFx0XHRyID0gKG8pID0+IHtcblx0XHRcdFx0XHRcdHMuZXh0ZXJuYWxJZCAmJiBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZShzLmV4dGVybmFsSWQsIG8pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9IChhKSA9PiAodGhpcy5faGFuZGxlSW5jb21pbmcoYSksICEwKTtcblx0XHRcdFx0XHRcdGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZUV4dGVybmFsPy5hZGRMaXN0ZW5lcj8uKG8pLCBpID0gKCkgPT4gY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlRXh0ZXJuYWw/LnJlbW92ZUxpc3RlbmVyPy4obyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic2VsZlwiOlxuXHRcdFx0XHRcdHIgPSAobywgYSkgPT4gZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZT8uKG8sIHsgdHJhbnNmZXI6IGEgPz8gW10gfSk7XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9ICgoYSkgPT4gdGhpcy5faGFuZGxlSW5jb21pbmcoYS5kYXRhKSk7XG5cdFx0XHRcdFx0XHRnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgbyksIGkgPSAoKSA9PiBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgbyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBzLm9uTWVzc2FnZSAmJiAoaSA9IHMub25NZXNzYWdlKChvKSA9PiB0aGlzLl9oYW5kbGVJbmNvbWluZyhvKSkpLCByID0gKG8pID0+IGU/LnBvc3RNZXNzYWdlPy4obyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXQ6IGUsXG5cdFx0XHRcdHRhcmdldENoYW5uZWw6IG4sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IHQsXG5cdFx0XHRcdHNlbmRlcjogcixcblx0XHRcdFx0Y2xlYW51cDogaSxcblx0XHRcdFx0cG9zdE1lc3NhZ2U6IChvLCBhKSA9PiByPy4obywgYSksXG5cdFx0XHRcdHN0YXJ0OiAoKSA9PiBlPy5zdGFydD8uKCksXG5cdFx0XHRcdGNsb3NlOiAoKSA9PiBlPy5jbG9zZT8uKClcblx0XHRcdH07XG5cdFx0fVxuXHRcdF9zZW5kKGUsIHQsIG4pIHtcblx0XHRcdGNvbnN0IHMgPSB0aGlzLl90cmFuc3BvcnRzLmdldChlKSA/PyB0aGlzLl9kZWZhdWx0VHJhbnNwb3J0O1xuXHRcdFx0KHM/LnNlbmRlciA/PyBzPy5wb3N0TWVzc2FnZSk/LmNhbGwocywgdCwgbik7XG5cdFx0fVxuXHRcdF9nZXREZWZhdWx0VGFyZ2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RlZmF1bHRUcmFuc3BvcnQgPyB0aGlzLl9kZWZhdWx0VHJhbnNwb3J0LnRhcmdldENoYW5uZWwgOiBcIndvcmtlclwiO1xuXHRcdH1cblx0XHRfaW5mZXJUYXJnZXRDaGFubmVsKGUsIHQpIHtcblx0XHRcdHJldHVybiB0ID09PSBcIndvcmtlclwiID8gXCJ3b3JrZXJcIiA6IHQgPT09IFwiYnJvYWRjYXN0XCIgJiYgZS5uYW1lID8gZS5uYW1lIDogdCA9PT0gXCJzZWxmXCIgPyBcInNlbGZcIiA6IGAke3R9LSR7JGUoKS5zbGljZSgwLCA4KX1gO1xuXHRcdH1cblx0XHRfY3JlYXRlUHJveHkoZSwgdCkge1xuXHRcdFx0cmV0dXJuIGVlKChzLCByLCBpKSA9PiB0aGlzLmludm9rZShlLCBzLCByLCBpKSwge1xuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRiYXNlUGF0aDogdCxcblx0XHRcdFx0Y2FjaGU6ICEwLFxuXHRcdFx0XHR0aW1lb3V0OiB0aGlzLl9jb25maWcudGltZW91dFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdF9pc1dvcmtlckNvbnRleHQoKSB7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcIndvcmtlclwiLFxuXHRcdFx0XHRcInNoYXJlZC13b3JrZXJcIixcblx0XHRcdFx0XCJzZXJ2aWNlLXdvcmtlclwiXG5cdFx0XHRdLmluY2x1ZGVzKHRoaXMuX2NvbnRleHRUeXBlKTtcblx0XHR9XG5cdH07XG5cdGZ1bmN0aW9uIFMoZSkge1xuXHRcdHJldHVybiBuZXcgeXQoZSk7XG5cdH1cblx0dmFyIHJlID0gbnVsbDtcblx0ZnVuY3Rpb24gdGUoKSB7XG5cdFx0aWYgKCFyZSkge1xuXHRcdFx0Y29uc3QgZSA9IEgoKTtcblx0XHRcdFtcblx0XHRcdFx0XCJ3b3JrZXJcIixcblx0XHRcdFx0XCJzaGFyZWQtd29ya2VyXCIsXG5cdFx0XHRcdFwic2VydmljZS13b3JrZXJcIlxuXHRcdFx0XS5pbmNsdWRlcyhlKSA/IHJlID0gUyh7XG5cdFx0XHRcdG5hbWU6IFwid29ya2VyXCIsXG5cdFx0XHRcdGF1dG9MaXN0ZW46ICEwXG5cdFx0XHR9KSA6IHJlID0gUyh7XG5cdFx0XHRcdG5hbWU6IFwiaG9zdFwiLFxuXHRcdFx0XHRhdXRvTGlzdGVuOiAhMVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiByZTtcblx0fVxuXHR2YXIgQyA9IHtcblx0XHRyamI6IFwicmVqZWN0QnlcIixcblx0XHRydmI6IFwicmVzb2x2ZUJ5XCIsXG5cdFx0cmo6IFwicmVqZWN0XCIsXG5cdFx0cnY6IFwicmVzb2x2ZVwiLFxuXHRcdGNyOiBcImNyZWF0ZVwiLFxuXHRcdGNzOiBcImNyZWF0ZVN5bmNcIixcblx0XHRhOiBcImFycmF5XCIsXG5cdFx0dGE6IFwidHlwZWRhcnJheVwiLFxuXHRcdHVkZjogXCJ1bmRlZmluZWRcIlxuXHR9O1xuXHRbXG5cdFx0dHlwZW9mIEFycmF5QnVmZmVyICE9IEMudWRmID8gQXJyYXlCdWZmZXIgOiBudWxsLFxuXHRcdHR5cGVvZiBNZXNzYWdlUG9ydCAhPSBDLnVkZiA/IE1lc3NhZ2VQb3J0IDogbnVsbCxcblx0XHR0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT0gQy51ZGYgPyBSZWFkYWJsZVN0cmVhbSA6IG51bGwsXG5cdFx0dHlwZW9mIFdyaXRhYmxlU3RyZWFtICE9IEMudWRmID8gV3JpdGFibGVTdHJlYW0gOiBudWxsLFxuXHRcdHR5cGVvZiBUcmFuc2Zvcm1TdHJlYW0gIT0gQy51ZGYgPyBUcmFuc2Zvcm1TdHJlYW0gOiBudWxsLFxuXHRcdHR5cGVvZiBXZWJUcmFuc3BvcnRSZWNlaXZlU3RyZWFtICE9IEMudWRmID8gV2ViVHJhbnNwb3J0UmVjZWl2ZVN0cmVhbSA6IG51bGwsXG5cdFx0dHlwZW9mIFdlYlRyYW5zcG9ydFNlbmRTdHJlYW0gIT0gQy51ZGYgPyBXZWJUcmFuc3BvcnRTZW5kU3RyZWFtIDogbnVsbCxcblx0XHR0eXBlb2YgQXVkaW9EYXRhICE9IEMudWRmID8gQXVkaW9EYXRhIDogbnVsbCxcblx0XHR0eXBlb2YgSW1hZ2VCaXRtYXAgIT0gQy51ZGYgPyBJbWFnZUJpdG1hcCA6IG51bGwsXG5cdFx0dHlwZW9mIFZpZGVvRnJhbWUgIT0gQy51ZGYgPyBWaWRlb0ZyYW1lIDogbnVsbCxcblx0XHR0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9IEMudWRmID8gT2Zmc2NyZWVuQ2FudmFzIDogbnVsbCxcblx0XHR0eXBlb2YgUlRDRGF0YUNoYW5uZWwgIT0gQy51ZGYgPyBSVENEYXRhQ2hhbm5lbCA6IG51bGxcblx0XS5maWx0ZXIoKGUpID0+IGUgIT0gbnVsbCk7XG5cdGZ1bmN0aW9uIEN0KCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBlID0gZ2xvYmFsVGhpcy5sb2NhdGlvbj8uaHJlZjtcblx0XHRcdGlmICh0eXBlb2YgZSA9PSBcInN0cmluZ1wiICYmIGUubGVuZ3RoID4gMCkgcmV0dXJuIGU7XG5cdFx0fSBjYXRjaCB7fVxuXHRcdHRyeSB7XG5cdFx0XHRpZiAodHlwZW9mIGRvY3VtZW50IDwgXCJ1XCIgJiYgdHlwZW9mIGRvY3VtZW50LmJhc2VVUkkgPT0gXCJzdHJpbmdcIiAmJiBkb2N1bWVudC5iYXNlVVJJLmxlbmd0aCA+IDApIHJldHVybiBkb2N1bWVudC5iYXNlVVJJO1xuXHRcdH0gY2F0Y2gge31cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHRmdW5jdGlvbiBQKGUpIHtcblx0XHRjb25zdCB0ID0gQ3QoKTtcblx0XHRpZiAoIXQubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiW3VuaWZvcm1dIE5vIGJhc2UgVVJMIGZvciB3b3JrZXIgcmVzb2x1dGlvbiAobWlzc2luZyBsb2NhdGlvbiAvIGRvY3VtZW50LmJhc2VVUkkpXCIpO1xuXHRcdGNvbnN0IG4gPSBlLnN0YXJ0c1dpdGgoXCIvXCIpID8gZS5yZXBsYWNlKC9eXFwvLywgXCIuL1wiKSA6IGU7XG5cdFx0cmV0dXJuIG5ldyBVUkwobiwgdCkuaHJlZjtcblx0fVxuXHR2YXIgdyA9IHtcblx0XHRuYW1lOiBcInVua25vd25cIixcblx0XHRpbnN0YW5jZTogbnVsbFxuXHR9O1xuXHR2YXIgd2UgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHR2YXIgeHQgPSAoZSkgPT4gWy4uLk9iamVjdC52YWx1ZXMoZCldLmluY2x1ZGVzKGUpO1xuXHR2YXIga3QgPSBjbGFzcyB7XG5cdFx0Y2hhbm5lbE5hbWU7XG5cdFx0b3B0aW9ucztcblx0XHRfY2hhbm5lbDtcblx0XHRjb25zdHJ1Y3RvcihlLCB0ID0ge30pIHtcblx0XHRcdHRoaXMuY2hhbm5lbE5hbWUgPSBlLCB0aGlzLm9wdGlvbnMgPSB0LCB0aGlzLl9jaGFubmVsID0gdGUoKTtcblx0XHR9XG5cdFx0cmVxdWVzdChlLCB0LCBuLCBzID0ge30pIHtcblx0XHRcdHJldHVybiB0eXBlb2YgZSA9PSBcInN0cmluZ1wiICYmIChlID0gW2VdKSwgQXJyYXkuaXNBcnJheSh0KSAmJiB4dChlKSAmJiAocyA9IG4sIG4gPSB0LCB0ID0gZSwgZSA9IFtdKSwgdGhpcy5fY2hhbm5lbC5pbnZva2UodGhpcy5jaGFubmVsTmFtZSwgdCwgZSwgbik7XG5cdFx0fVxuXHRcdGRvSW1wb3J0TW9kdWxlKGUsIHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jaGFubmVsLmltcG9ydChlLCB0aGlzLmNoYW5uZWxOYW1lKTtcblx0XHR9XG5cdH07XG5cdHZhciBBbiA9IGNsYXNzIHtcblx0XHRjaGFubmVsO1xuXHRcdG9wdGlvbnM7XG5cdFx0X3VuaWZpZWQ7XG5cdFx0YnJvYWRjYXN0cyA9IHt9O1xuXHRcdGNvbnN0cnVjdG9yKGUsIHQgPSB7fSkge1xuXHRcdFx0dGhpcy5jaGFubmVsID0gZSwgdGhpcy5vcHRpb25zID0gdCwgdGhpcy5fdW5pZmllZCA9IFMoe1xuXHRcdFx0XHRuYW1lOiBlLFxuXHRcdFx0XHRhdXRvTGlzdGVuOiAhMVxuXHRcdFx0fSksIHcubmFtZSA9IGUsIHcuaW5zdGFuY2UgPSB0aGlzO1xuXHRcdH1cblx0XHRjcmVhdGVSZW1vdGVDaGFubmVsKGUsIHQgPSB7fSwgbikge1xuXHRcdFx0cmV0dXJuIG4gJiYgKHRoaXMuX3VuaWZpZWQuYXR0YWNoKG4sIHsgdGFyZ2V0Q2hhbm5lbDogZSB9KSwgdGhpcy5icm9hZGNhc3RzW2VdID0gbiksIFByb21pc2UucmVzb2x2ZShuZXcga3QoZSwgdCkpO1xuXHRcdH1cblx0XHRnZXRDaGFubmVsKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2hhbm5lbDtcblx0XHR9XG5cdFx0cmVxdWVzdChlLCB0LCBuLCBzID0ge30sIHIgPSBcIndvcmtlclwiKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIGUgPT0gXCJzdHJpbmdcIiAmJiAoZSA9IFtlXSksIEFycmF5LmlzQXJyYXkodCkgJiYgeHQoZSkgJiYgKHIgPSBzLCBzID0gbiwgbiA9IHQsIHQgPSBlLCBlID0gW10pLCB0aGlzLl91bmlmaWVkLmludm9rZShyLCB0LCBlLCBuKTtcblx0XHR9XG5cdFx0cmVzb2x2ZVJlc3BvbnNlKGUsIHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodCk7XG5cdFx0fVxuXHRcdGFzeW5jIGhhbmRsZUFuZFJlc3BvbnNlKGUsIHQsIG4pIHtcblx0XHRcdGNvbnN0IHMgPSBhd2FpdCBEZShlLCB0LCB0aGlzLmNoYW5uZWwpO1xuXHRcdFx0cyAmJiBuPy4ocy5yZXNwb25zZSwgcy50cmFuc2Zlcik7XG5cdFx0fVxuXHRcdGNsb3NlKCkge1xuXHRcdFx0dGhpcy5fdW5pZmllZC5jbG9zZSgpO1xuXHRcdH1cblx0fTtcblx0dmFyIE9lID0gKGUgPSBcIiRob3N0JFwiKSA9PiB7XG5cdFx0aWYgKHc/Lmluc3RhbmNlICYmIGUgPT09IFwiJGhvc3QkXCIpIHJldHVybiB3Lmluc3RhbmNlO1xuXHRcdGlmICh3ZS5oYXMoZSkpIHJldHVybiB3ZS5nZXQoZSkgPz8gbnVsbDtcblx0XHRjb25zdCB0ID0gbmV3IEFuKGUpO1xuXHRcdHJldHVybiBlID09PSBcIiRob3N0JFwiICYmICh3Lm5hbWUgPSBlLCB3Lmluc3RhbmNlID0gdCksIHdlLnNldChlLCB0KSwgdDtcblx0fTtcblx0dmFyIHVlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5cdHZhciBkZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXHR2YXIgWWUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblx0dmFyIFJuID0gKGUsIHQgPSB3Py5uYW1lLCBuKSA9PiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIGUgIT0gbnVsbCB8fCB0eXBlb2YgZSA9PSBcImZ1bmN0aW9uXCIgJiYgZSAhPSBudWxsID8gZGUuaGFzKGUpID8gZGUuZ2V0KGUpIDogdWUuaGFzKGUpID8gdWUuZ2V0KGUpIDogc2UoZSkgfHwgbj8uaW5jbHVkZXM/LihlKSB8fCB0ID09IHc/Lm5hbWUgPyBlIDoge1xuXHRcdCRpc0Rlc2NyaXB0b3I6ICEwLFxuXHRcdHBhdGg6IEQuZ2V0KGUpID8/ICgoKSA9PiB7XG5cdFx0XHRjb25zdCBzID0gWyRlKCldO1xuXHRcdFx0cmV0dXJuIGZlKHMsIGUpLCBzO1xuXHRcdH0pKCksXG5cdFx0b3duZXI6IHc/Lm5hbWUsXG5cdFx0Y2hhbm5lbDogdCxcblx0XHRwcmltaXRpdmU6IGcoZSksXG5cdFx0d3JpdGFibGU6ICEwLFxuXHRcdGVudW1lcmFibGU6ICEwLFxuXHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0YXJndW1lbnRDb3VudDogZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gZS5sZW5ndGggOiAtMVxuXHR9IDogYihlKSA/IGUgOiBudWxsO1xuXHR2YXIgcW4gPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcIkByZXF1ZXN0SGFuZGxlclwiKTtcblx0dmFyIFEgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcIkBkZXNjcmlwdG9yXCIpO1xuXHR2YXIgdmUgPSAoZSkgPT4gYihlKSB8fCBlPy5bUV0gPyBlIDogZT8uJGlzRGVzY3JpcHRvciA/IEVuKGUsIGFzeW5jICgpID0+IHt9KSA6IHNlKGUpID8gZSA6IG51bGw7XG5cdHZhciBYID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0dmFyIEQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblx0dmFyIEV0ID0gKGUsIHQpID0+IHtcblx0XHRpZiAodCAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHQpICYmICh0ID0gW3RdKSwgdCA9PSBudWxsIHx8IHQ/Lmxlbmd0aCA8IDEpIHJldHVybiBlO1xuXHRcdGNvbnN0IG4gPSBlPy5bUV0gPz8gKGU/LiRpc0Rlc2NyaXB0b3IgPyBlIDogbnVsbCk7XG5cdFx0aWYgKG4gJiYgbj8ub3duZXIgPT0gdz8ubmFtZSAmJiAoZSA9IEwobj8ucGF0aCkgPz8gZSksIGcoZSkpIHJldHVybiBlO1xuXHRcdGZvciAoY29uc3QgcyBvZiB0KSBpZiAoZSA9IGU/LltzXSwgZSA9PSBudWxsKSByZXR1cm4gZTtcblx0XHRyZXR1cm4gZTtcblx0fTtcblx0dmFyIEwgPSAoZSkgPT4ge1xuXHRcdGlmIChlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZSkgJiYgKGUgPSBbZV0pLCBlID09IG51bGwgfHwgZT8ubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgdCA9IFg/LmdldD8uKGU/LlswXSkgPz8gbnVsbDtcblx0XHRyZXR1cm4gdCAhPSBudWxsID8gRXQodCwgZT8uc2xpY2U/LigxKSkgOiBudWxsO1xuXHR9O1xuXHR2YXIgZmUgPSAoZSwgdCkgPT4ge1xuXHRcdGNvbnN0IG4gPSB0Py5bUV0gPz8gKHQ/LiRpc0Rlc2NyaXB0b3IgPyB0IDogbnVsbCk7XG5cdFx0aWYgKG4gJiYgbj8ub3duZXIgPT0gdz8ubmFtZSAmJiAodCA9IEwobj8ucGF0aCkgPz8gdCksIGUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShlKSAmJiAoZSA9IFtlXSksIGUgPT0gbnVsbCB8fCBlPy5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCBzID0gWD8uZ2V0Py4oZT8uWzBdKSA/PyBudWxsO1xuXHRcdHJldHVybiBlPy5sZW5ndGggPiAxID8gRXQocywgZT8uc2xpY2U/LigxLCAtMSkpW2U/LltlPy5sZW5ndGggLSAxXV0gPSB0IDogWD8uc2V0Py4oZT8uWzBdLCB0KSwgKHR5cGVvZiB0ID09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHQgPT0gXCJmdW5jdGlvblwiKSAmJiBEPy5zZXQ/Lih0LCBlKSwgdDtcblx0fTtcblx0dmFyIEl0ID0gKGUpID0+IChlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZSkgJiYgKGUgPSBbZV0pLCBlID09IG51bGwgfHwgZT8ubGVuZ3RoIDwgMSA/ICExIDogIShYPy5nZXQ/LihlPy5bMF0pID8/IG51bGwpICYmIGU/Lmxlbmd0aCA8PSAxID8gKFg/LmRlbGV0ZT8uKGU/LlswXSksICEwKSA6ICExKTtcblx0dmFyIE9uID0gKGUpID0+IHtcblx0XHRjb25zdCB0ID0gZT8uW1FdID8/IChlPy4kaXNEZXNjcmlwdG9yID8gZSA6IG51bGwpO1xuXHRcdHQgJiYgdD8ub3duZXIgPT0gdz8ubmFtZSAmJiAoZSA9IEwodD8ucGF0aCkgPz8gZSk7XG5cdFx0Y29uc3QgbiA9IEQ/LmdldD8uKGUpID8/IHQ/LnBhdGg7XG5cdFx0cmV0dXJuIG4gPT0gbnVsbCB8fCBuPy5sZW5ndGggPCAxID8gITEgOiAoSXQobiksICh0eXBlb2YgZSA9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIikgJiYgRD8uZGVsZXRlPy4oZSksICEwKTtcblx0fTtcblx0dmFyIERuID0gKGUpID0+IHtcblx0XHRjb25zdCB0ID0gZT8uW1FdID8/IChlPy4kaXNEZXNjcmlwdG9yID8gZSA6IG51bGwpO1xuXHRcdHJldHVybiAoRD8uZ2V0Py4oZSkgPz8gdD8ucGF0aCkgPT0gbnVsbDtcblx0fTtcblx0dmFyIFIgPSAoZSkgPT4gKHR5cGVvZiBlID09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiKSAmJiBlICE9IG51bGw7XG5cdHZhciBUdCA9IHtcblx0XHRnZXQ6IChlLCB0KSA9PiBlPy5bdF0sXG5cdFx0c2V0OiAoZSwgdCwgbikgPT4gKGVbdF0gPSBuLCAhMCksXG5cdFx0aGFzOiAoZSwgdCkgPT4gdCBpbiBlLFxuXHRcdGFwcGx5OiAoZSwgdCwgbikgPT4gZS5hcHBseSh0LCBuKSxcblx0XHRjb25zdHJ1Y3Q6IChlLCB0KSA9PiBuZXcgZSguLi50KSxcblx0XHRkZWxldGVQcm9wZXJ0eTogKGUsIHQpID0+IGRlbGV0ZSBlW3RdLFxuXHRcdG93bktleXM6IChlKSA9PiBPYmplY3Qua2V5cyhlKSxcblx0XHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChlLCB0KSA9PiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpLFxuXHRcdGdldFByb3RvdHlwZU9mOiAoZSkgPT4gT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpLFxuXHRcdHNldFByb3RvdHlwZU9mOiAoZSwgdCkgPT4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsIHQpLFxuXHRcdGlzRXh0ZW5zaWJsZTogKGUpID0+IE9iamVjdC5pc0V4dGVuc2libGUoZSksXG5cdFx0cHJldmVudEV4dGVuc2lvbnM6IChlKSA9PiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoZSlcblx0fTtcblx0ZnVuY3Rpb24gUHQoZSwgdCwgbiwgcyA9IHt9KSB7XG5cdFx0Y29uc3QgeyBjaGFubmVsOiByID0gXCJcIiwgc2VuZGVyOiBpID0gXCJcIiwgcmVmbGVjdDogbyA9IFR0IH0gPSBzLCBhID0gcy50YXJnZXQgPz8gTCh0KSwgYyA9IFtdO1xuXHRcdGxldCBsID0gbnVsbCwgdSA9IHQ7XG5cdFx0c3dpdGNoIChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkge1xuXHRcdFx0Y2FzZSBcImltcG9ydFwiOlxuXHRcdFx0Y2FzZSBkLklNUE9SVDpcblx0XHRcdFx0bCA9IGltcG9ydChcblx0XHRcdFx0XHQvKiBAdml0ZS1pZ25vcmUgKi9cblx0XHRcdFx0XHRuPy5bMF1cbik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInRyYW5zZmVyXCI6XG5cdFx0XHRjYXNlIGQuVFJBTlNGRVI6XG5cdFx0XHRcdHB0JDEoYSkgJiYgciAhPT0gaSAmJiBjLnB1c2goYSksIGwgPSBhO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJnZXRcIjpcblx0XHRcdGNhc2UgZC5HRVQ6IHtcblx0XHRcdFx0Y29uc3QgcCA9IG4/LlswXSwgeSA9IG8uZ2V0Py4oYSwgcCkgPz8gYT8uW3BdO1xuXHRcdFx0XHRsID0gdHlwZW9mIHkgPT0gXCJmdW5jdGlvblwiICYmIGEgIT0gbnVsbCA/IHkuYmluZChhKSA6IHksIHUgPSBbLi4udCwgU3RyaW5nKHApXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwic2V0XCI6XG5cdFx0XHRjYXNlIGQuU0VUOiB7XG5cdFx0XHRcdGNvbnN0IFtwLCB5XSA9IG4sIHggPSBPKHksIHZlKTtcblx0XHRcdFx0cy50YXJnZXQgPyBsID0gby5zZXQ/LihhLCBwLCB4KSA/PyAoYVtwXSA9IHgsICEwKSA6IGwgPSBvLnNldD8uKGEsIHAsIHgpID8/IGZlKFsuLi50LCBTdHJpbmcocCldLCB4KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiYXBwbHlcIjpcblx0XHRcdGNhc2UgXCJjYWxsXCI6XG5cdFx0XHRjYXNlIGQuQVBQTFk6XG5cdFx0XHRjYXNlIGQuQ0FMTDpcblx0XHRcdFx0aWYgKHR5cGVvZiBhID09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdGNvbnN0IHAgPSBzLmNvbnRleHQgPz8gKHMudGFyZ2V0ID8gdm9pZCAwIDogTCh0LnNsaWNlKDAsIC0xKSkpLCB5ID0gTyhuPy5bMF0gPz8gbiA/PyBbXSwgdmUpO1xuXHRcdFx0XHRcdGwgPSBvLmFwcGx5Py4oYSwgcCwgeSkgPz8gYS5hcHBseShwLCB5KSwgcHQkMShsKSAmJiB0Py5hdCgtMSkgPT09IFwidHJhbnNmZXJcIiAmJiByICE9PSBpICYmIGMucHVzaChsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJjb25zdHJ1Y3RcIjpcblx0XHRcdGNhc2UgZC5DT05TVFJVQ1Q6XG5cdFx0XHRcdGlmICh0eXBlb2YgYSA9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjb25zdCBwID0gTyhuPy5bMF0gPz8gbiA/PyBbXSwgdmUpO1xuXHRcdFx0XHRcdGwgPSBvLmNvbnN0cnVjdD8uKGEsIHApID8/IG5ldyBhKC4uLnApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImRlbGV0ZVwiOlxuXHRcdFx0Y2FzZSBcImRlbGV0ZXByb3BlcnR5XCI6XG5cdFx0XHRjYXNlIFwiZGlzcG9zZVwiOlxuXHRcdFx0Y2FzZSBkLkRFTEVURTpcblx0XHRcdGNhc2UgZC5ERUxFVEVfUFJPUEVSVFk6XG5cdFx0XHRjYXNlIGQuRElTUE9TRTpcblx0XHRcdFx0aWYgKHMudGFyZ2V0KSB7XG5cdFx0XHRcdFx0Y29uc3QgcCA9IHRbdC5sZW5ndGggLSAxXTtcblx0XHRcdFx0XHRsID0gby5kZWxldGVQcm9wZXJ0eT8uKGEsIHApID8/IGRlbGV0ZSBhW3BdO1xuXHRcdFx0XHR9IGVsc2UgbCA9IHQ/Lmxlbmd0aCA+IDAgPyBJdCh0KSA6IE9uKGEpLCBsICYmICh1ID0gRC5nZXQoYSkgPz8gW10pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJoYXNcIjpcblx0XHRcdGNhc2UgZC5IQVM6XG5cdFx0XHRcdGwgPSBvLmhhcz8uKGEsIG4/LlswXSkgPz8gKFIoYSkgPyBuPy5bMF0gaW4gYSA6ICExKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwib3dua2V5c1wiOlxuXHRcdFx0Y2FzZSBkLk9XTl9LRVlTOlxuXHRcdFx0XHRsID0gby5vd25LZXlzPy4oYSkgPz8gKFIoYSkgPyBPYmplY3Qua2V5cyhhKSA6IFtdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXCI6XG5cdFx0XHRjYXNlIFwiZ2V0cHJvcGVydHlkZXNjcmlwdG9yXCI6XG5cdFx0XHRjYXNlIGQuR0VUX09XTl9QUk9QRVJUWV9ERVNDUklQVE9SOlxuXHRcdFx0Y2FzZSBkLkdFVF9QUk9QRVJUWV9ERVNDUklQVE9SOlxuXHRcdFx0XHRsID0gby5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I/LihhLCBuPy5bMF0gPz8gdD8uYXQoLTEpID8/IFwiXCIpID8/IChSKGEpID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLCBuPy5bMF0gPz8gdD8uYXQoLTEpID8/IFwiXCIpIDogdm9pZCAwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZ2V0cHJvdG90eXBlb2ZcIjpcblx0XHRcdGNhc2UgZC5HRVRfUFJPVE9UWVBFX09GOlxuXHRcdFx0XHRsID0gby5nZXRQcm90b3R5cGVPZj8uKGEpID8/IChSKGEpID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpIDogbnVsbCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInNldHByb3RvdHlwZW9mXCI6XG5cdFx0XHRjYXNlIGQuU0VUX1BST1RPVFlQRV9PRjpcblx0XHRcdFx0bCA9IG8uc2V0UHJvdG90eXBlT2Y/LihhLCBuPy5bMF0pID8/IChSKGEpID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGEsIG4/LlswXSkgOiAhMSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImlzZXh0ZW5zaWJsZVwiOlxuXHRcdFx0Y2FzZSBkLklTX0VYVEVOU0lCTEU6XG5cdFx0XHRcdGwgPSBvLmlzRXh0ZW5zaWJsZT8uKGEpID8/IChSKGEpID8gT2JqZWN0LmlzRXh0ZW5zaWJsZShhKSA6ICEwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwicHJldmVudGV4dGVuc2lvbnNcIjpcblx0XHRcdGNhc2UgZC5QUkVWRU5UX0VYVEVOU0lPTlM6IGwgPSBvLnByZXZlbnRFeHRlbnNpb25zPy4oYSkgPz8gKFIoYSkgPyBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoYSkgOiAhMSk7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRyZXN1bHQ6IGwsXG5cdFx0XHR0b1RyYW5zZmVyOiBjLFxuXHRcdFx0cGF0aDogdVxuXHRcdH07XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gTXQoZSwgdCwgbiwgcywgciwgaSwgbykge1xuXHRcdGNvbnN0IGEgPSBhd2FpdCBpLCBjID0gcHQkMShhKSAmJiBvLmluY2x1ZGVzKGEpIHx8IGIoYSk7XG5cdFx0bGV0IGwgPSByO1xuXHRcdCFjICYmIHQgIT09IFwiZ2V0XCIgJiYgdCAhPT0gZC5HRVQgJiYgKHR5cGVvZiBhID09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGEgPT0gXCJmdW5jdGlvblwiKSAmJiAoRG4oYSkgPyAobCA9IFskZSgpXSwgZmUobCwgYSkpIDogbCA9IEQuZ2V0KGEpID8/IFtdKTtcblx0XHRjb25zdCB1ID0gTChsKSwgcCA9IHQgPT09IFwiZ2V0XCIgfHwgdCA9PT0gZC5HRVQgPyBsPy5hdCgtMSkgOiB2b2lkIDAsIHkgPSBMKHIpLCB4ID0gTyhhLCAoc24pID0+IFJuKHNuLCBuLCBvKSkgPz8gYTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVzcG9uc2U6IHtcblx0XHRcdFx0Y2hhbm5lbDogcyxcblx0XHRcdFx0c2VuZGVyOiBuLFxuXHRcdFx0XHRyZXFJZDogZSxcblx0XHRcdFx0YWN0aW9uOiB0LFxuXHRcdFx0XHR0eXBlOiBcInJlc3BvbnNlXCIsXG5cdFx0XHRcdHBheWxvYWQ6IHtcblx0XHRcdFx0XHRyZXN1bHQ6IGMgPyB4IDogbnVsbCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlb2YgYSxcblx0XHRcdFx0XHRjaGFubmVsOiBzLFxuXHRcdFx0XHRcdHNlbmRlcjogbixcblx0XHRcdFx0XHRkZXNjcmlwdG9yOiB7XG5cdFx0XHRcdFx0XHQkaXNEZXNjcmlwdG9yOiAhMCxcblx0XHRcdFx0XHRcdHBhdGg6IGwsXG5cdFx0XHRcdFx0XHRvd25lcjogbixcblx0XHRcdFx0XHRcdGNoYW5uZWw6IG4sXG5cdFx0XHRcdFx0XHRwcmltaXRpdmU6IGcoYSksXG5cdFx0XHRcdFx0XHR3cml0YWJsZTogITAsXG5cdFx0XHRcdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdFx0XHRhcmd1bWVudENvdW50OiB5IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB5Lmxlbmd0aCA6IC0xLFxuXHRcdFx0XHRcdFx0Li4uUih1KSAmJiBwICE9IG51bGwgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsIHApIDoge31cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR0cmFuc2Zlcjogb1xuXHRcdH07XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gRGUoZSwgdCwgbiwgcykge1xuXHRcdGNvbnN0IHsgY2hhbm5lbDogciwgc2VuZGVyOiBpLCBwYXRoOiBvLCBhY3Rpb246IGEsIGFyZ3M6IGMgfSA9IGU7XG5cdFx0aWYgKHIgIT09IG4pIHJldHVybiBudWxsO1xuXHRcdGNvbnN0IHsgcmVzdWx0OiBsLCB0b1RyYW5zZmVyOiB1LCBwYXRoOiBwIH0gPSBQdChhLCBvLCBjLCB7XG5cdFx0XHRjaGFubmVsOiByLFxuXHRcdFx0c2VuZGVyOiBpLFxuXHRcdFx0Li4uc1xuXHRcdH0pO1xuXHRcdHJldHVybiBNdCh0LCBhLCBuLCBpLCBwLCBsLCB1KTtcblx0fVxuXHRmdW5jdGlvbiBMbihlLCB0ID0gVHQpIHtcblx0XHRyZXR1cm4gYXN5bmMgKG4sIHMsIHIpID0+IHtcblx0XHRcdGxldCBpID0gZSwgbyA9IGU7XG5cdFx0XHRmb3IgKGxldCBjID0gMDsgYyA8IHMubGVuZ3RoOyBjKyspIGlmIChpID0gbywgbyA9IG8/LltzW2NdXSwgbyA9PT0gdm9pZCAwICYmIGMgPCBzLmxlbmd0aCAtIDEpIHRocm93IG5ldyBFcnJvcihgUGF0aCBzZWdtZW50ICcke3NbY119JyBub3QgZm91bmRgKTtcblx0XHRcdGNvbnN0IGEgPSBzW3MubGVuZ3RoIC0gMV07XG5cdFx0XHRzd2l0Y2ggKFN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRcdGNhc2UgXCJnZXRcIjpcblx0XHRcdFx0Y2FzZSBkLkdFVDogcmV0dXJuIG87XG5cdFx0XHRcdGNhc2UgXCJzZXRcIjpcblx0XHRcdFx0Y2FzZSBkLlNFVDogcmV0dXJuIGlbYV0gPSByWzBdLCAhMDtcblx0XHRcdFx0Y2FzZSBcImNhbGxcIjpcblx0XHRcdFx0Y2FzZSBcImFwcGx5XCI6XG5cdFx0XHRcdGNhc2UgZC5BUFBMWTpcblx0XHRcdFx0Y2FzZSBkLkNBTEw6XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvID09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYyA9IEFycmF5LmlzQXJyYXkoclswXSkgPyByWzBdIDogcjtcblx0XHRcdFx0XHRcdHJldHVybiBhd2FpdCBvLmFwcGx5KGksIGMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCcke2F9JyBpcyBub3QgYSBmdW5jdGlvbmApO1xuXHRcdFx0XHRjYXNlIFwiY29uc3RydWN0XCI6XG5cdFx0XHRcdGNhc2UgZC5DT05TVFJVQ1Q6XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvID09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYyA9IEFycmF5LmlzQXJyYXkoclswXSkgPyByWzBdIDogcjtcblx0XHRcdFx0XHRcdHJldHVybiBuZXcgbyguLi5jKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGAnJHthfScgaXMgbm90IGEgY29uc3RydWN0b3JgKTtcblx0XHRcdFx0Y2FzZSBcImhhc1wiOlxuXHRcdFx0XHRjYXNlIGQuSEFTOiByZXR1cm4gYSBpbiBpO1xuXHRcdFx0XHRjYXNlIFwiZGVsZXRlXCI6XG5cdFx0XHRcdGNhc2UgXCJkZWxldGVwcm9wZXJ0eVwiOlxuXHRcdFx0XHRjYXNlIGQuREVMRVRFX1BST1BFUlRZOiByZXR1cm4gZGVsZXRlIGlbYV07XG5cdFx0XHRcdGNhc2UgXCJvd25rZXlzXCI6XG5cdFx0XHRcdGNhc2UgZC5PV05fS0VZUzogcmV0dXJuIE9iamVjdC5rZXlzKG8gPz8gaSk7XG5cdFx0XHRcdGRlZmF1bHQ6IHJldHVybiBvO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0dmFyIEJuID0gY2xhc3Mge1xuXHRcdF9uYW1lO1xuXHRcdF90cmFuc3BvcnRUeXBlO1xuXHRcdF9pZCA9ICRlKCk7XG5cdFx0X3N0YXRlID0gXCJkaXNjb25uZWN0ZWRcIjtcblx0XHRfaW5ib3VuZCA9IG5ldyBfKHsgYnVmZmVyU2l6ZTogMWUzIH0pO1xuXHRcdF9vdXRib3VuZCA9IG5ldyBfKHsgYnVmZmVyU2l6ZTogMWUzIH0pO1xuXHRcdF9zdGF0ZUNoYW5nZXMgPSBuZXcgXygpO1xuXHRcdF9jb25uZWN0ZWRQZWVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0X3N1YnMgPSBbXTtcblx0XHRfc3RhdHMgPSB7XG5cdFx0XHRtZXNzYWdlc1NlbnQ6IDAsXG5cdFx0XHRtZXNzYWdlc1JlY2VpdmVkOiAwLFxuXHRcdFx0Ynl0ZXNUcmFuc2ZlcnJlZDogMCxcblx0XHRcdGxhdGVuY3lNczogMCxcblx0XHRcdHVwdGltZTogMCxcblx0XHRcdHJlY29ubmVjdENvdW50OiAwXG5cdFx0fTtcblx0XHRfc3RhcnRUaW1lID0gMDtcblx0XHRfcGVuZGluZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0X2J1ZmZlciA9IFtdO1xuXHRcdF9vcHRzO1xuXHRcdGNvbnN0cnVjdG9yKGUsIHQgPSBcImludGVybmFsXCIsIG4gPSB7fSkge1xuXHRcdFx0dGhpcy5fbmFtZSA9IGUsIHRoaXMuX3RyYW5zcG9ydFR5cGUgPSB0LCB0aGlzLl9vcHRzID0ge1xuXHRcdFx0XHR0aW1lb3V0OiAzZTQsXG5cdFx0XHRcdGF1dG9SZWNvbm5lY3Q6ICEwLFxuXHRcdFx0XHRyZWNvbm5lY3RJbnRlcnZhbDogMWUzLFxuXHRcdFx0XHRtYXhSZWNvbm5lY3RBdHRlbXB0czogNSxcblx0XHRcdFx0YnVmZmVyTWVzc2FnZXM6ICEwLFxuXHRcdFx0XHRidWZmZXJTaXplOiAxZTMsXG5cdFx0XHRcdG1ldGFkYXRhOiB7fSxcblx0XHRcdFx0Li4ublxuXHRcdFx0fSwgdGhpcy5fc2V0dXBTdWJzY3JpcHRpb25zKCk7XG5cdFx0fVxuXHRcdHN1YnNjcmliZShlLCB0KSB7XG5cdFx0XHRyZXR1cm4gKHQgPyB1dCgobikgPT4gbi5zZW5kZXIgPT09IHQpKHRoaXMuX2luYm91bmQpIDogdGhpcy5faW5ib3VuZCkuc3Vic2NyaWJlKHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIiA/IHsgbmV4dDogZSB9IDogZSk7XG5cdFx0fVxuXHRcdG5leHQoZSkge1xuXHRcdFx0aWYgKHRoaXMuX3N0YXRlICE9PSBcImNvbm5lY3RlZFwiKSB7XG5cdFx0XHRcdHRoaXMuX29wdHMuYnVmZmVyTWVzc2FnZXMgJiYgdGhpcy5fYnVmZmVyLmxlbmd0aCA8IHRoaXMuX29wdHMuYnVmZmVyU2l6ZSAmJiB0aGlzLl9idWZmZXIucHVzaChlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fb3V0Ym91bmQubmV4dChlKSwgdGhpcy5fc3RhdHMubWVzc2FnZXNTZW50Kys7XG5cdFx0fVxuXHRcdGFzeW5jIHJlcXVlc3QoZSwgdCwgbiA9IHt9KSB7XG5cdFx0XHRjb25zdCBzID0gJGUoKSwgciA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuXHRcdFx0dGhpcy5fcGVuZGluZy5zZXQocywgcik7XG5cdFx0XHRjb25zdCBpID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX3BlbmRpbmcuaGFzKHMpICYmICh0aGlzLl9wZW5kaW5nLmRlbGV0ZShzKSwgci5yZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZW91dFwiKSkpO1xuXHRcdFx0fSwgbi50aW1lb3V0ID8/IHRoaXMuX29wdHMudGltZW91dCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5uZXh0KHtcblx0XHRcdFx0aWQ6ICRlKCksXG5cdFx0XHRcdGNoYW5uZWw6IGUsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fbmFtZSxcblx0XHRcdFx0dHlwZTogXCJyZXF1ZXN0XCIsXG5cdFx0XHRcdHJlcUlkOiBzLFxuXHRcdFx0XHRwYXlsb2FkOiB7XG5cdFx0XHRcdFx0Li4udCxcblx0XHRcdFx0XHRhY3Rpb246IG4uYWN0aW9uLFxuXHRcdFx0XHRcdHBhdGg6IG4ucGF0aFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pLCByLnByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQoaSkpO1xuXHRcdH1cblx0XHRyZXNwb25kKGUsIHQpIHtcblx0XHRcdHRoaXMubmV4dCh7XG5cdFx0XHRcdGlkOiAkZSgpLFxuXHRcdFx0XHRjaGFubmVsOiBlLnNlbmRlcixcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9uYW1lLFxuXHRcdFx0XHR0eXBlOiBcInJlc3BvbnNlXCIsXG5cdFx0XHRcdHJlcUlkOiBlLnJlcUlkLFxuXHRcdFx0XHRwYXlsb2FkOiB0LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRlbWl0KGUsIHQsIG4pIHtcblx0XHRcdHRoaXMubmV4dCh7XG5cdFx0XHRcdGlkOiAkZSgpLFxuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRzZW5kZXI6IHRoaXMuX25hbWUsXG5cdFx0XHRcdHR5cGU6IFwiZXZlbnRcIixcblx0XHRcdFx0cGF5bG9hZDoge1xuXHRcdFx0XHRcdHR5cGU6IHQsXG5cdFx0XHRcdFx0ZGF0YTogblxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRzdWJzY3JpYmVPdXRib3VuZChlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb3V0Ym91bmQuc3Vic2NyaWJlKHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIiA/IHsgbmV4dDogZSB9IDogZSk7XG5cdFx0fVxuXHRcdHB1c2hJbmJvdW5kKGUpIHtcblx0XHRcdGlmICh0aGlzLl9zdGF0cy5tZXNzYWdlc1JlY2VpdmVkKyssIGUudHlwZSA9PT0gXCJyZXNwb25zZVwiICYmIGUucmVxSWQpIHtcblx0XHRcdFx0Y29uc3QgdCA9IHRoaXMuX3BlbmRpbmcuZ2V0KGUucmVxSWQpO1xuXHRcdFx0XHRpZiAodCkge1xuXHRcdFx0XHRcdHRoaXMuX3BlbmRpbmcuZGVsZXRlKGUucmVxSWQpLCB0LnJlc29sdmUoZS5wYXlsb2FkKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX2luYm91bmQubmV4dChlKTtcblx0XHR9XG5cdFx0YXN5bmMgY29ubmVjdCgpIHtcblx0XHRcdHRoaXMuX3N0YXRlICE9PSBcImNvbm5lY3RlZFwiICYmICh0aGlzLl9zZXRTdGF0ZShcImNvbm5lY3RpbmdcIiksIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCksIHRoaXMuX3NldFN0YXRlKFwiY29ubmVjdGVkXCIpLCB0aGlzLl9mbHVzaEJ1ZmZlcigpKTtcblx0XHR9XG5cdFx0ZGlzY29ubmVjdCgpIHtcblx0XHRcdHRoaXMuX3N0YXRlID09PSBcImRpc2Nvbm5lY3RlZFwiIHx8IHRoaXMuX3N0YXRlID09PSBcImNsb3NlZFwiIHx8ICh0aGlzLl9zZXRTdGF0ZShcImRpc2Nvbm5lY3RlZFwiKSwgdGhpcy5fc3Vicy5mb3JFYWNoKChlKSA9PiBlLnVuc3Vic2NyaWJlKCkpLCB0aGlzLl9zdWJzID0gW10pO1xuXHRcdH1cblx0XHRjbG9zZSgpIHtcblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpLCB0aGlzLl9zZXRTdGF0ZShcImNsb3NlZFwiKSwgdGhpcy5faW5ib3VuZC5jb21wbGV0ZSgpLCB0aGlzLl9vdXRib3VuZC5jb21wbGV0ZSgpLCB0aGlzLl9zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcblx0XHR9XG5cdFx0bWFya0Nvbm5lY3RlZCgpIHtcblx0XHRcdHRoaXMuX3NldFN0YXRlKFwiY29ubmVjdGVkXCIpLCB0aGlzLl9mbHVzaEJ1ZmZlcigpO1xuXHRcdH1cblx0XHRtYXJrRGlzY29ubmVjdGVkKCkge1xuXHRcdFx0dGhpcy5fc2V0U3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG5cdFx0fVxuXHRcdF9zZXRTdGF0ZShlKSB7XG5cdFx0XHR0aGlzLl9zdGF0ZSAhPT0gZSAmJiAodGhpcy5fc3RhdGUgPSBlLCB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dChlKSk7XG5cdFx0fVxuXHRcdF9mbHVzaEJ1ZmZlcigpIHtcblx0XHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl9idWZmZXIpIHRoaXMuX291dGJvdW5kLm5leHQoZSk7XG5cdFx0XHR0aGlzLl9idWZmZXIgPSBbXTtcblx0XHR9XG5cdFx0X3NldHVwU3Vic2NyaXB0aW9ucygpIHtcblx0XHRcdHRoaXMuX3N1YnMucHVzaCh0aGlzLl9pbmJvdW5kLnN1YnNjcmliZSh7IG5leHQ6IChlKSA9PiB7XG5cdFx0XHRcdGUudHlwZSA9PT0gXCJzaWduYWxcIiAmJiBlLnBheWxvYWQ/LnR5cGUgPT09IFwiY29ubmVjdFwiICYmIHRoaXMuX2Nvbm5lY3RlZFBlZXJzLnNldChlLnNlbmRlciwge1xuXHRcdFx0XHRcdG5hbWU6IGUuc2VuZGVyLFxuXHRcdFx0XHRcdHN0YXRlOiBcImNvbm5lY3RlZFwiLFxuXHRcdFx0XHRcdGlzSG9zdDogITFcblx0XHRcdFx0fSk7XG5cdFx0XHR9IH0pKTtcblx0XHR9XG5cdFx0Z2V0IGlkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2lkO1xuXHRcdH1cblx0XHRnZXQgbmFtZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9uYW1lO1xuXHRcdH1cblx0XHRnZXQgc3RhdGUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fc3RhdGU7XG5cdFx0fVxuXHRcdGdldCB0cmFuc3BvcnRUeXBlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3RyYW5zcG9ydFR5cGU7XG5cdFx0fVxuXHRcdGdldCBzdGF0cygpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdC4uLnRoaXMuX3N0YXRzLFxuXHRcdFx0XHR1cHRpbWU6IHRoaXMuX3N0YXJ0VGltZSA/IERhdGUubm93KCkgLSB0aGlzLl9zdGFydFRpbWUgOiAwXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRnZXQgc3RhdGVDaGFuZ2VzKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N0YXRlQ2hhbmdlcztcblx0XHR9XG5cdFx0Z2V0IGNvbm5lY3RlZFBlZXJzKCkge1xuXHRcdFx0cmV0dXJuIFsuLi50aGlzLl9jb25uZWN0ZWRQZWVycy5rZXlzKCldO1xuXHRcdH1cblx0XHRnZXQgbWV0YSgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiB0aGlzLl9pZCxcblx0XHRcdFx0bmFtZTogdGhpcy5fbmFtZSxcblx0XHRcdFx0c3RhdGU6IHRoaXMuX3N0YXRlLFxuXHRcdFx0XHRpc0hvc3Q6ICExLFxuXHRcdFx0XHRjb25uZWN0ZWRDaGFubmVsczogbmV3IFNldCh0aGlzLl9jb25uZWN0ZWRQZWVycy5rZXlzKCkpXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0dmFyIFduID0gY2xhc3MgWSB7XG5cdFx0X2Nvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRzdGF0aWMgX2luc3RhbmNlID0gbnVsbDtcblx0XHRzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG5cdFx0XHRyZXR1cm4gWS5faW5zdGFuY2UgfHwgKFkuX2luc3RhbmNlID0gbmV3IFkoKSksIFkuX2luc3RhbmNlO1xuXHRcdH1cblx0XHRnZXRPckNyZWF0ZSh0LCBuID0gXCJpbnRlcm5hbFwiLCBzID0ge30pIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9ucy5oYXModCkgfHwgdGhpcy5fY29ubmVjdGlvbnMuc2V0KHQsIG5ldyBCbih0LCBuLCBzKSksIHRoaXMuX2Nvbm5lY3Rpb25zLmdldCh0KTtcblx0XHR9XG5cdFx0Z2V0KHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9ucy5nZXQodCk7XG5cdFx0fVxuXHRcdGhhcyh0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbnMuaGFzKHQpO1xuXHRcdH1cblx0XHRkZWxldGUodCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zLmdldCh0KT8uY2xvc2UoKSwgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKHQpO1xuXHRcdH1cblx0XHRjbGVhcigpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25zLmZvckVhY2goKHQpID0+IHQuY2xvc2UoKSksIHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKCk7XG5cdFx0fVxuXHRcdGdldCBzaXplKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zLnNpemU7XG5cdFx0fVxuXHRcdGdldCBuYW1lcygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fY29ubmVjdGlvbnMua2V5cygpXTtcblx0XHR9XG5cdH07XG5cdHZhciBMZSA9ICgpID0+IFduLmdldEluc3RhbmNlKCk7XG5cdHZhciBBdCA9IChlLCB0LCBuKSA9PiBMZSgpLmdldE9yQ3JlYXRlKGUsIHQsIG4pO1xuXHR2YXIgWW4gPSBcInVuaWZvcm1fY2hhbm5lbHNcIjtcblx0dmFyIEpuID0gMTtcblx0dmFyIGYgPSB7XG5cdFx0TUVTU0FHRVM6IFwibWVzc2FnZXNcIixcblx0XHRNQUlMQk9YOiBcIm1haWxib3hcIixcblx0XHRQRU5ESU5HOiBcInBlbmRpbmdcIixcblx0XHRFWENIQU5HRTogXCJleGNoYW5nZVwiLFxuXHRcdFRSQU5TQUNUSU9OUzogXCJ0cmFuc2FjdGlvbnNcIlxuXHR9O1xuXHR2YXIgWG4gPSBjbGFzcyB7XG5cdFx0X2RiID0gbnVsbDtcblx0XHRfaXNPcGVuID0gITE7XG5cdFx0X29wZW5Qcm9taXNlID0gbnVsbDtcblx0XHRfY2hhbm5lbE5hbWU7XG5cdFx0X21lc3NhZ2VVcGRhdGVzID0gbmV3IF8oKTtcblx0XHRfZXhjaGFuZ2VVcGRhdGVzID0gbmV3IF8oKTtcblx0XHRjb25zdHJ1Y3RvcihlKSB7XG5cdFx0XHR0aGlzLl9jaGFubmVsTmFtZSA9IGU7XG5cdFx0fVxuXHRcdGFzeW5jIG9wZW4oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZGIgJiYgdGhpcy5faXNPcGVuID8gdGhpcy5fZGIgOiB0aGlzLl9vcGVuUHJvbWlzZSA/IHRoaXMuX29wZW5Qcm9taXNlIDogKHRoaXMuX29wZW5Qcm9taXNlID0gbmV3IFByb21pc2UoKGUsIHQpID0+IHtcblx0XHRcdFx0Y29uc3QgbiA9IGluZGV4ZWREQi5vcGVuKFluLCBKbik7XG5cdFx0XHRcdG4ub25lcnJvciA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9vcGVuUHJvbWlzZSA9IG51bGwsIHQoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBvcGVuIEluZGV4ZWREQlwiKSk7XG5cdFx0XHRcdH0sIG4ub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2RiID0gbi5yZXN1bHQsIHRoaXMuX2lzT3BlbiA9ICEwLCB0aGlzLl9vcGVuUHJvbWlzZSA9IG51bGwsIGUodGhpcy5fZGIpO1xuXHRcdFx0XHR9LCBuLm9udXBncmFkZW5lZWRlZCA9IChzKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgciA9IHMudGFyZ2V0LnJlc3VsdDtcblx0XHRcdFx0XHR0aGlzLl9jcmVhdGVTdG9yZXMocik7XG5cdFx0XHRcdH07XG5cdFx0XHR9KSwgdGhpcy5fb3BlblByb21pc2UpO1xuXHRcdH1cblx0XHRjbG9zZSgpIHtcblx0XHRcdHRoaXMuX2RiICYmICh0aGlzLl9kYi5jbG9zZSgpLCB0aGlzLl9kYiA9IG51bGwsIHRoaXMuX2lzT3BlbiA9ICExKTtcblx0XHR9XG5cdFx0X2NyZWF0ZVN0b3JlcyhlKSB7XG5cdFx0XHRpZiAoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhmLk1FU1NBR0VTKSkge1xuXHRcdFx0XHRjb25zdCB0ID0gZS5jcmVhdGVPYmplY3RTdG9yZShmLk1FU1NBR0VTLCB7IGtleVBhdGg6IFwiaWRcIiB9KTtcblx0XHRcdFx0dC5jcmVhdGVJbmRleChcImNoYW5uZWxcIiwgXCJjaGFubmVsXCIsIHsgdW5pcXVlOiAhMSB9KSwgdC5jcmVhdGVJbmRleChcInN0YXR1c1wiLCBcInN0YXR1c1wiLCB7IHVuaXF1ZTogITEgfSksIHQuY3JlYXRlSW5kZXgoXCJyZWNpcGllbnRcIiwgXCJyZWNpcGllbnRcIiwgeyB1bmlxdWU6ICExIH0pLCB0LmNyZWF0ZUluZGV4KFwiY3JlYXRlZEF0XCIsIFwiY3JlYXRlZEF0XCIsIHsgdW5pcXVlOiAhMSB9KSwgdC5jcmVhdGVJbmRleChcImNoYW5uZWxfc3RhdHVzXCIsIFtcImNoYW5uZWxcIiwgXCJzdGF0dXNcIl0sIHsgdW5pcXVlOiAhMSB9KTtcblx0XHRcdH1cblx0XHRcdGlmICghZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGYuTUFJTEJPWCkpIHtcblx0XHRcdFx0Y29uc3QgdCA9IGUuY3JlYXRlT2JqZWN0U3RvcmUoZi5NQUlMQk9YLCB7IGtleVBhdGg6IFwiaWRcIiB9KTtcblx0XHRcdFx0dC5jcmVhdGVJbmRleChcImNoYW5uZWxcIiwgXCJjaGFubmVsXCIsIHsgdW5pcXVlOiAhMSB9KSwgdC5jcmVhdGVJbmRleChcInByaW9yaXR5XCIsIFwicHJpb3JpdHlcIiwgeyB1bmlxdWU6ICExIH0pLCB0LmNyZWF0ZUluZGV4KFwiZXhwaXJlc0F0XCIsIFwiZXhwaXJlc0F0XCIsIHsgdW5pcXVlOiAhMSB9KTtcblx0XHRcdH1cblx0XHRcdGlmICghZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGYuUEVORElORykpIHtcblx0XHRcdFx0Y29uc3QgdCA9IGUuY3JlYXRlT2JqZWN0U3RvcmUoZi5QRU5ESU5HLCB7IGtleVBhdGg6IFwiaWRcIiB9KTtcblx0XHRcdFx0dC5jcmVhdGVJbmRleChcImNoYW5uZWxcIiwgXCJjaGFubmVsXCIsIHsgdW5pcXVlOiAhMSB9KSwgdC5jcmVhdGVJbmRleChcImNyZWF0ZWRBdFwiLCBcImNyZWF0ZWRBdFwiLCB7IHVuaXF1ZTogITEgfSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhmLkVYQ0hBTkdFKSkge1xuXHRcdFx0XHRjb25zdCB0ID0gZS5jcmVhdGVPYmplY3RTdG9yZShmLkVYQ0hBTkdFLCB7IGtleVBhdGg6IFwiaWRcIiB9KTtcblx0XHRcdFx0dC5jcmVhdGVJbmRleChcImtleVwiLCBcImtleVwiLCB7IHVuaXF1ZTogITAgfSksIHQuY3JlYXRlSW5kZXgoXCJvd25lclwiLCBcIm93bmVyXCIsIHsgdW5pcXVlOiAhMSB9KTtcblx0XHRcdH1cblx0XHRcdGUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhmLlRSQU5TQUNUSU9OUykgfHwgZS5jcmVhdGVPYmplY3RTdG9yZShmLlRSQU5TQUNUSU9OUywgeyBrZXlQYXRoOiBcImlkXCIgfSkuY3JlYXRlSW5kZXgoXCJjcmVhdGVkQXRcIiwgXCJjcmVhdGVkQXRcIiwgeyB1bmlxdWU6ICExIH0pO1xuXHRcdH1cblx0XHRhc3luYyBkZWZlcihlLCB0ID0ge30pIHtcblx0XHRcdGNvbnN0IG4gPSBhd2FpdCB0aGlzLm9wZW4oKSwgcyA9IHtcblx0XHRcdFx0aWQ6ICRlKCksXG5cdFx0XHRcdGNoYW5uZWw6IGUuY2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlciA/PyB0aGlzLl9jaGFubmVsTmFtZSxcblx0XHRcdFx0cmVjaXBpZW50OiBlLmNoYW5uZWwsXG5cdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0cGF5bG9hZDogZS5wYXlsb2FkLFxuXHRcdFx0XHRzdGF0dXM6IFwicGVuZGluZ1wiLFxuXHRcdFx0XHRwcmlvcml0eTogdC5wcmlvcml0eSA/PyAwLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IERhdGUubm93KCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcblx0XHRcdFx0ZXhwaXJlc0F0OiB0LmV4cGlyZXNJbiA/IERhdGUubm93KCkgKyB0LmV4cGlyZXNJbiA6IG51bGwsXG5cdFx0XHRcdHJldHJ5Q291bnQ6IDAsXG5cdFx0XHRcdG1heFJldHJpZXM6IHQubWF4UmV0cmllcyA/PyAzLFxuXHRcdFx0XHRtZXRhZGF0YTogdC5tZXRhZGF0YVxuXHRcdFx0fTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgociwgaSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvID0gbi50cmFuc2FjdGlvbihbZi5NRVNTQUdFUywgZi5NQUlMQk9YXSwgXCJyZWFkd3JpdGVcIiksIGEgPSBvLm9iamVjdFN0b3JlKGYuTUVTU0FHRVMpLCBjID0gby5vYmplY3RTdG9yZShmLk1BSUxCT1gpO1xuXHRcdFx0XHRhLmFkZChzKSwgYy5hZGQocyksIG8ub25jb21wbGV0ZSA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9tZXNzYWdlVXBkYXRlcy5uZXh0KHMpLCByKHMuaWQpO1xuXHRcdFx0XHR9LCBvLm9uZXJyb3IgPSAoKSA9PiBpKC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZGVmZXIgbWVzc2FnZVwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgZ2V0RGVmZXJyZWRNZXNzYWdlcyhlLCB0ID0ge30pIHtcblx0XHRcdGNvbnN0IG4gPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocywgcikgPT4ge1xuXHRcdFx0XHRjb25zdCBpID0gbi50cmFuc2FjdGlvbihmLk1FU1NBR0VTLCBcInJlYWRvbmx5XCIpLm9iamVjdFN0b3JlKGYuTUVTU0FHRVMpLCBvID0gdC5zdGF0dXMgPyBpLmluZGV4KFwiY2hhbm5lbF9zdGF0dXNcIikgOiBpLmluZGV4KFwiY2hhbm5lbFwiKSwgYSA9IHQuc3RhdHVzID8gSURCS2V5UmFuZ2Uub25seShbZSwgdC5zdGF0dXNdKSA6IElEQktleVJhbmdlLm9ubHkoZSksIGMgPSBvLmdldEFsbChhLCB0LmxpbWl0KTtcblx0XHRcdFx0Yy5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0bGV0IGwgPSBjLnJlc3VsdDtcblx0XHRcdFx0XHR0Lm9mZnNldCAmJiAobCA9IGwuc2xpY2UodC5vZmZzZXQpKSwgcyhsKTtcblx0XHRcdFx0fSwgYy5vbmVycm9yID0gKCkgPT4gcigvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBkZWZlcnJlZCBtZXNzYWdlc1wiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgcHJvY2Vzc05leHRQZW5kaW5nKGUpIHtcblx0XHRcdGNvbnN0IHQgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgobiwgcykgPT4ge1xuXHRcdFx0XHRjb25zdCByID0gdC50cmFuc2FjdGlvbihmLk1FU1NBR0VTLCBcInJlYWR3cml0ZVwiKS5vYmplY3RTdG9yZShmLk1FU1NBR0VTKS5pbmRleChcImNoYW5uZWxfc3RhdHVzXCIpLm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seShbZSwgXCJwZW5kaW5nXCJdKSk7XG5cdFx0XHRcdHIub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGkgPSByLnJlc3VsdDtcblx0XHRcdFx0XHRpZiAoaSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbyA9IGkudmFsdWU7XG5cdFx0XHRcdFx0XHRvLnN0YXR1cyA9IFwicHJvY2Vzc2luZ1wiLCBvLnVwZGF0ZWRBdCA9IERhdGUubm93KCksIGkudXBkYXRlKG8pLCB0aGlzLl9tZXNzYWdlVXBkYXRlcy5uZXh0KG8pLCBuKG8pO1xuXHRcdFx0XHRcdH0gZWxzZSBuKG51bGwpO1xuXHRcdFx0XHR9LCByLm9uZXJyb3IgPSAoKSA9PiBzKC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcHJvY2VzcyBwZW5kaW5nIG1lc3NhZ2VcIikpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFzeW5jIG1hcmtEZWxpdmVyZWQoZSkge1xuXHRcdFx0YXdhaXQgdGhpcy5fdXBkYXRlTWVzc2FnZVN0YXR1cyhlLCBcImRlbGl2ZXJlZFwiKTtcblx0XHR9XG5cdFx0YXN5bmMgbWFya0ZhaWxlZChlKSB7XG5cdFx0XHRjb25zdCB0ID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKG4sIHMpID0+IHtcblx0XHRcdFx0Y29uc3QgciA9IHQudHJhbnNhY3Rpb24oZi5NRVNTQUdFUywgXCJyZWFkd3JpdGVcIikub2JqZWN0U3RvcmUoZi5NRVNTQUdFUyksIGkgPSByLmdldChlKTtcblx0XHRcdFx0aS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbyA9IGkucmVzdWx0O1xuXHRcdFx0XHRcdGlmICghbykge1xuXHRcdFx0XHRcdFx0bighMSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG8ucmV0cnlDb3VudCsrLCBvLnVwZGF0ZWRBdCA9IERhdGUubm93KCksIG8ucmV0cnlDb3VudCA8IG8ubWF4UmV0cmllcyA/IG8uc3RhdHVzID0gXCJwZW5kaW5nXCIgOiBvLnN0YXR1cyA9IFwiZmFpbGVkXCIsIHIucHV0KG8pLCB0aGlzLl9tZXNzYWdlVXBkYXRlcy5uZXh0KG8pLCBuKG8uc3RhdHVzID09PSBcInBlbmRpbmdcIik7XG5cdFx0XHRcdH0sIGkub25lcnJvciA9ICgpID0+IHMoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBtYXJrIG1lc3NhZ2UgYXMgZmFpbGVkXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyBfdXBkYXRlTWVzc2FnZVN0YXR1cyhlLCB0KSB7XG5cdFx0XHRjb25zdCBuID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHMsIHIpID0+IHtcblx0XHRcdFx0Y29uc3QgaSA9IG4udHJhbnNhY3Rpb24oZi5NRVNTQUdFUywgXCJyZWFkd3JpdGVcIikub2JqZWN0U3RvcmUoZi5NRVNTQUdFUyksIG8gPSBpLmdldChlKTtcblx0XHRcdFx0by5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IG8ucmVzdWx0O1xuXHRcdFx0XHRcdGEgJiYgKGEuc3RhdHVzID0gdCwgYS51cGRhdGVkQXQgPSBEYXRlLm5vdygpLCBpLnB1dChhKSwgdGhpcy5fbWVzc2FnZVVwZGF0ZXMubmV4dChhKSksIHMoKTtcblx0XHRcdFx0fSwgby5vbmVycm9yID0gKCkgPT4gcigvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIHVwZGF0ZSBtZXNzYWdlIHN0YXR1c1wiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgZ2V0TWFpbGJveChlLCB0ID0ge30pIHtcblx0XHRcdGNvbnN0IG4gPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocywgcikgPT4ge1xuXHRcdFx0XHRjb25zdCBpID0gbi50cmFuc2FjdGlvbihmLk1BSUxCT1gsIFwicmVhZG9ubHlcIikub2JqZWN0U3RvcmUoZi5NQUlMQk9YKS5pbmRleChcImNoYW5uZWxcIikuZ2V0QWxsKElEQktleVJhbmdlLm9ubHkoZSksIHQubGltaXQpO1xuXHRcdFx0XHRpLm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRsZXQgbyA9IGkucmVzdWx0O1xuXHRcdFx0XHRcdHQuc29ydEJ5ID09PSBcInByaW9yaXR5XCIgPyBvLnNvcnQoKGEsIGMpID0+IGMucHJpb3JpdHkgLSBhLnByaW9yaXR5KSA6IG8uc29ydCgoYSwgYykgPT4gYy5jcmVhdGVkQXQgLSBhLmNyZWF0ZWRBdCksIHMobyk7XG5cdFx0XHRcdH0sIGkub25lcnJvciA9ICgpID0+IHIoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBnZXQgbWFpbGJveFwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgZ2V0TWFpbGJveFN0YXRzKGUpIHtcblx0XHRcdGNvbnN0IHQgPSBhd2FpdCB0aGlzLmdldERlZmVycmVkTWVzc2FnZXMoZSksIG4gPSB7XG5cdFx0XHRcdHRvdGFsOiB0Lmxlbmd0aCxcblx0XHRcdFx0cGVuZGluZzogMCxcblx0XHRcdFx0cHJvY2Vzc2luZzogMCxcblx0XHRcdFx0ZGVsaXZlcmVkOiAwLFxuXHRcdFx0XHRmYWlsZWQ6IDAsXG5cdFx0XHRcdGV4cGlyZWQ6IDBcblx0XHRcdH0sIHMgPSBEYXRlLm5vdygpO1xuXHRcdFx0Zm9yIChjb25zdCByIG9mIHQpIHIuZXhwaXJlc0F0ICYmIHIuZXhwaXJlc0F0IDwgcyA/IG4uZXhwaXJlZCsrIDogbltyLnN0YXR1c10rKztcblx0XHRcdHJldHVybiBuO1xuXHRcdH1cblx0XHRhc3luYyBjbGVhck1haWxib3goZSkge1xuXHRcdFx0Y29uc3QgdCA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChuLCBzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHIgPSB0LnRyYW5zYWN0aW9uKGYuTUFJTEJPWCwgXCJyZWFkd3JpdGVcIiksIGkgPSByLm9iamVjdFN0b3JlKGYuTUFJTEJPWCkuaW5kZXgoXCJjaGFubmVsXCIpO1xuXHRcdFx0XHRsZXQgbyA9IDA7XG5cdFx0XHRcdGNvbnN0IGEgPSBpLm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seShlKSk7XG5cdFx0XHRcdGEub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGMgPSBhLnJlc3VsdDtcblx0XHRcdFx0XHRjICYmIChjLmRlbGV0ZSgpLCBvKyssIGMuY29udGludWUoKSk7XG5cdFx0XHRcdH0sIHIub25jb21wbGV0ZSA9ICgpID0+IG4obyksIHIub25lcnJvciA9ICgpID0+IHMoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBjbGVhciBtYWlsYm94XCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyByZWdpc3RlclBlbmRpbmcoZSkge1xuXHRcdFx0Y29uc3QgdCA9IGF3YWl0IHRoaXMub3BlbigpLCBuID0ge1xuXHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0Y2hhbm5lbDogdGhpcy5fY2hhbm5lbE5hbWUsXG5cdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0ZGF0YTogZS5kYXRhLFxuXHRcdFx0XHRtZXRhZGF0YTogZS5tZXRhZGF0YSxcblx0XHRcdFx0Y3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0XHRzdGF0dXM6IFwicGVuZGluZ1wiXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChzLCByKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGkgPSB0LnRyYW5zYWN0aW9uKGYuUEVORElORywgXCJyZWFkd3JpdGVcIik7XG5cdFx0XHRcdGkub2JqZWN0U3RvcmUoZi5QRU5ESU5HKS5hZGQobiksIGkub25jb21wbGV0ZSA9ICgpID0+IHMobi5pZCksIGkub25lcnJvciA9ICgpID0+IHIoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWdpc3RlciBwZW5kaW5nIG9wZXJhdGlvblwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgZ2V0UGVuZGluZ09wZXJhdGlvbnMoKSB7XG5cdFx0XHRjb25zdCBlID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHQsIG4pID0+IHtcblx0XHRcdFx0Y29uc3QgcyA9IGUudHJhbnNhY3Rpb24oZi5QRU5ESU5HLCBcInJlYWRvbmx5XCIpLm9iamVjdFN0b3JlKGYuUEVORElORykuaW5kZXgoXCJjaGFubmVsXCIpLmdldEFsbChJREJLZXlSYW5nZS5vbmx5KHRoaXMuX2NoYW5uZWxOYW1lKSk7XG5cdFx0XHRcdHMub25zdWNjZXNzID0gKCkgPT4gdChzLnJlc3VsdCksIHMub25lcnJvciA9ICgpID0+IG4oLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBnZXQgcGVuZGluZyBvcGVyYXRpb25zXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyBjb21wbGV0ZVBlbmRpbmcoZSkge1xuXHRcdFx0Y29uc3QgdCA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChuLCBzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHIgPSB0LnRyYW5zYWN0aW9uKGYuUEVORElORywgXCJyZWFkd3JpdGVcIik7XG5cdFx0XHRcdHIub2JqZWN0U3RvcmUoZi5QRU5ESU5HKS5kZWxldGUoZSksIHIub25jb21wbGV0ZSA9ICgpID0+IG4oKSwgci5vbmVycm9yID0gKCkgPT4gcygvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNvbXBsZXRlIHBlbmRpbmcgb3BlcmF0aW9uXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyBhd2FpdFBlbmRpbmcoZSwgdCA9IHt9KSB7XG5cdFx0XHRjb25zdCBuID0gdC50aW1lb3V0ID8/IDNlNCwgcyA9IHQucG9sbEludGVydmFsID8/IDEwMCwgciA9IERhdGUubm93KCk7XG5cdFx0XHRmb3IgKDsgRGF0ZS5ub3coKSAtIHIgPCBuOykge1xuXHRcdFx0XHRjb25zdCBpID0gYXdhaXQgdGhpcy5fZ2V0UGVuZGluZ0J5SWQoZSk7XG5cdFx0XHRcdGlmICghaSkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdGlmIChpLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGxldGVQZW5kaW5nKGUpLCBpLnJlc3VsdDtcblx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2UoKG8pID0+IHNldFRpbWVvdXQobywgcykpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBQZW5kaW5nIG9wZXJhdGlvbiAke2V9IHRpbWVkIG91dGApO1xuXHRcdH1cblx0XHRhc3luYyBfZ2V0UGVuZGluZ0J5SWQoZSkge1xuXHRcdFx0Y29uc3QgdCA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChuLCBzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHIgPSB0LnRyYW5zYWN0aW9uKGYuUEVORElORywgXCJyZWFkb25seVwiKS5vYmplY3RTdG9yZShmLlBFTkRJTkcpLmdldChlKTtcblx0XHRcdFx0ci5vbnN1Y2Nlc3MgPSAoKSA9PiBuKHIucmVzdWx0ID8/IG51bGwpLCByLm9uZXJyb3IgPSAoKSA9PiBzKC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IHBlbmRpbmcgb3BlcmF0aW9uXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyBleGNoYW5nZVB1dChlLCB0LCBuID0ge30pIHtcblx0XHRcdGNvbnN0IHMgPSBhd2FpdCB0aGlzLm9wZW4oKSwgciA9IHtcblx0XHRcdFx0aWQ6ICRlKCksXG5cdFx0XHRcdGtleTogZSxcblx0XHRcdFx0dmFsdWU6IHQsXG5cdFx0XHRcdG93bmVyOiB0aGlzLl9jaGFubmVsTmFtZSxcblx0XHRcdFx0c2hhcmVkV2l0aDogbi5zaGFyZWRXaXRoID8/IFtcIipcIl0sXG5cdFx0XHRcdHZlcnNpb246IDEsXG5cdFx0XHRcdGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcblx0XHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChpLCBvKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGEgPSBzLnRyYW5zYWN0aW9uKGYuRVhDSEFOR0UsIFwicmVhZHdyaXRlXCIpLCBjID0gYS5vYmplY3RTdG9yZShmLkVYQ0hBTkdFKSwgbCA9IGMuaW5kZXgoXCJrZXlcIikuZ2V0KGUpO1xuXHRcdFx0XHRsLm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCB1ID0gbC5yZXN1bHQ7XG5cdFx0XHRcdFx0dSAmJiAoci5pZCA9IHUuaWQsIHIudmVyc2lvbiA9IHUudmVyc2lvbiArIDEsIHIuY3JlYXRlZEF0ID0gdS5jcmVhdGVkQXQpLCBjLnB1dChyKTtcblx0XHRcdFx0fSwgYS5vbmNvbXBsZXRlID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2V4Y2hhbmdlVXBkYXRlcy5uZXh0KHIpLCBpKHIuaWQpO1xuXHRcdFx0XHR9LCBhLm9uZXJyb3IgPSAoKSA9PiBvKC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcHV0IGV4Y2hhbmdlIGRhdGFcIikpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFzeW5jIGV4Y2hhbmdlR2V0KGUpIHtcblx0XHRcdGNvbnN0IHQgPSBhd2FpdCB0aGlzLm9wZW4oKTtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgobiwgcykgPT4ge1xuXHRcdFx0XHRjb25zdCByID0gdC50cmFuc2FjdGlvbihmLkVYQ0hBTkdFLCBcInJlYWRvbmx5XCIpLm9iamVjdFN0b3JlKGYuRVhDSEFOR0UpLmluZGV4KFwia2V5XCIpLmdldChlKTtcblx0XHRcdFx0ci5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaSA9IHIucmVzdWx0O1xuXHRcdFx0XHRcdGlmICghaSkge1xuXHRcdFx0XHRcdFx0bihudWxsKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9jYW5BY2Nlc3NFeGNoYW5nZShpKSkge1xuXHRcdFx0XHRcdFx0bihudWxsKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bihpLnZhbHVlKTtcblx0XHRcdFx0fSwgci5vbmVycm9yID0gKCkgPT4gcygvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBleGNoYW5nZSBkYXRhXCIpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhc3luYyBleGNoYW5nZURlbGV0ZShlKSB7XG5cdFx0XHRjb25zdCB0ID0gYXdhaXQgdGhpcy5vcGVuKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKG4sIHMpID0+IHtcblx0XHRcdFx0Y29uc3QgciA9IHQudHJhbnNhY3Rpb24oZi5FWENIQU5HRSwgXCJyZWFkd3JpdGVcIiksIGkgPSByLm9iamVjdFN0b3JlKGYuRVhDSEFOR0UpLCBvID0gaS5pbmRleChcImtleVwiKS5nZXQoZSk7XG5cdFx0XHRcdG8ub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGEgPSBvLnJlc3VsdDtcblx0XHRcdFx0XHRpZiAoIWEpIHtcblx0XHRcdFx0XHRcdG4oITEpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYS5vd25lciAhPT0gdGhpcy5fY2hhbm5lbE5hbWUpIHtcblx0XHRcdFx0XHRcdG4oITEpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpLmRlbGV0ZShhLmlkKTtcblx0XHRcdFx0fSwgci5vbmNvbXBsZXRlID0gKCkgPT4gbighMCksIHIub25lcnJvciA9ICgpID0+IHMoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBkZWxldGUgZXhjaGFuZ2UgZGF0YVwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgZXhjaGFuZ2VMb2NrKGUsIHQgPSB7fSkge1xuXHRcdFx0Y29uc3QgbiA9IGF3YWl0IHRoaXMub3BlbigpLCBzID0gdC50aW1lb3V0ID8/IDNlNDtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgociwgaSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvID0gbi50cmFuc2FjdGlvbihmLkVYQ0hBTkdFLCBcInJlYWR3cml0ZVwiKSwgYSA9IG8ub2JqZWN0U3RvcmUoZi5FWENIQU5HRSksIGMgPSBhLmluZGV4KFwia2V5XCIpLmdldChlKTtcblx0XHRcdFx0Yy5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbCA9IGMucmVzdWx0O1xuXHRcdFx0XHRcdGlmICghbCkge1xuXHRcdFx0XHRcdFx0cighMSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsLmxvY2sgJiYgbC5sb2NrLmhvbGRlciAhPT0gdGhpcy5fY2hhbm5lbE5hbWUgJiYgbC5sb2NrLmV4cGlyZXNBdCA+IERhdGUubm93KCkpIHtcblx0XHRcdFx0XHRcdHIoITEpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsLmxvY2sgPSB7XG5cdFx0XHRcdFx0XHRob2xkZXI6IHRoaXMuX2NoYW5uZWxOYW1lLFxuXHRcdFx0XHRcdFx0YWNxdWlyZWRBdDogRGF0ZS5ub3coKSxcblx0XHRcdFx0XHRcdGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHNcblx0XHRcdFx0XHR9LCBsLnVwZGF0ZWRBdCA9IERhdGUubm93KCksIGEucHV0KGwpO1xuXHRcdFx0XHR9LCBvLm9uY29tcGxldGUgPSAoKSA9PiByKCEwKSwgby5vbmVycm9yID0gKCkgPT4gaSgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFjcXVpcmUgbG9ja1wiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YXN5bmMgZXhjaGFuZ2VVbmxvY2soZSkge1xuXHRcdFx0Y29uc3QgdCA9IGF3YWl0IHRoaXMub3BlbigpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChuLCBzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHIgPSB0LnRyYW5zYWN0aW9uKGYuRVhDSEFOR0UsIFwicmVhZHdyaXRlXCIpLCBpID0gci5vYmplY3RTdG9yZShmLkVYQ0hBTkdFKSwgbyA9IGkuaW5kZXgoXCJrZXlcIikuZ2V0KGUpO1xuXHRcdFx0XHRvLm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBhID0gby5yZXN1bHQ7XG5cdFx0XHRcdFx0YSAmJiBhLmxvY2s/LmhvbGRlciA9PT0gdGhpcy5fY2hhbm5lbE5hbWUgJiYgKGRlbGV0ZSBhLmxvY2ssIGEudXBkYXRlZEF0ID0gRGF0ZS5ub3coKSwgaS5wdXQoYSkpO1xuXHRcdFx0XHR9LCByLm9uY29tcGxldGUgPSAoKSA9PiBuKCksIHIub25lcnJvciA9ICgpID0+IHMoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byByZWxlYXNlIGxvY2tcIikpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdF9jYW5BY2Nlc3NFeGNoYW5nZShlKSB7XG5cdFx0XHRyZXR1cm4gZS5vd25lciA9PT0gdGhpcy5fY2hhbm5lbE5hbWUgfHwgZS5zaGFyZWRXaXRoLmluY2x1ZGVzKFwiKlwiKSA/ICEwIDogZS5zaGFyZWRXaXRoLmluY2x1ZGVzKHRoaXMuX2NoYW5uZWxOYW1lKTtcblx0XHR9XG5cdFx0YXN5bmMgYmVnaW5UcmFuc2FjdGlvbigpIHtcblx0XHRcdHJldHVybiBuZXcgWm4odGhpcyk7XG5cdFx0fVxuXHRcdGFzeW5jIGV4ZWN1dGVUcmFuc2FjdGlvbihlKSB7XG5cdFx0XHRjb25zdCB0ID0gYXdhaXQgdGhpcy5vcGVuKCksIG4gPSBuZXcgU2V0KGUubWFwKChzKSA9PiBzLnN0b3JlKSk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHMsIHIpID0+IHtcblx0XHRcdFx0Y29uc3QgaSA9IHQudHJhbnNhY3Rpb24oQXJyYXkuZnJvbShuKSwgXCJyZWFkd3JpdGVcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgbyBvZiBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IGkub2JqZWN0U3RvcmUoby5zdG9yZSk7XG5cdFx0XHRcdFx0c3dpdGNoIChvLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJwdXRcIjpcblx0XHRcdFx0XHRcdFx0by52YWx1ZSAhPT0gdm9pZCAwICYmIGEucHV0KG8udmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJkZWxldGVcIjpcblx0XHRcdFx0XHRcdFx0by5rZXkgIT09IHZvaWQgMCAmJiBhLmRlbGV0ZShvLmtleSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInVwZGF0ZVwiOiBpZiAoby5rZXkgIT09IHZvaWQgMCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjID0gYS5nZXQoby5rZXkpO1xuXHRcdFx0XHRcdFx0XHRjLm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjLnJlc3VsdCAmJiBvLnZhbHVlICYmIGEucHV0KHtcblx0XHRcdFx0XHRcdFx0XHRcdC4uLmMucmVzdWx0LFxuXHRcdFx0XHRcdFx0XHRcdFx0Li4uby52YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpLm9uY29tcGxldGUgPSAoKSA9PiBzKCksIGkub25lcnJvciA9ICgpID0+IHIoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIlRyYW5zYWN0aW9uIGZhaWxlZFwiKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b25NZXNzYWdlVXBkYXRlKGUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9tZXNzYWdlVXBkYXRlcy5zdWJzY3JpYmUoeyBuZXh0OiBlIH0pO1xuXHRcdH1cblx0XHRvbkV4Y2hhbmdlVXBkYXRlKGUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9leGNoYW5nZVVwZGF0ZXMuc3Vic2NyaWJlKHsgbmV4dDogZSB9KTtcblx0XHR9XG5cdFx0YXN5bmMgY2xlYW51cEV4cGlyZWQoKSB7XG5cdFx0XHRjb25zdCBlID0gYXdhaXQgdGhpcy5vcGVuKCksIHQgPSBEYXRlLm5vdygpO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChuLCBzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHIgPSBlLnRyYW5zYWN0aW9uKFtmLk1FU1NBR0VTLCBmLk1BSUxCT1hdLCBcInJlYWR3cml0ZVwiKSwgaSA9IHIub2JqZWN0U3RvcmUoZi5NRVNTQUdFUyksIG8gPSByLm9iamVjdFN0b3JlKGYuTUFJTEJPWCk7XG5cdFx0XHRcdGxldCBhID0gMDtcblx0XHRcdFx0Y29uc3QgYyA9IGkub3BlbkN1cnNvcigpO1xuXHRcdFx0XHRjLm9uc3VjY2VzcyA9ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCB1ID0gYy5yZXN1bHQ7XG5cdFx0XHRcdFx0aWYgKHUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHAgPSB1LnZhbHVlO1xuXHRcdFx0XHRcdFx0cC5leHBpcmVzQXQgJiYgcC5leHBpcmVzQXQgPCB0ICYmICh1LmRlbGV0ZSgpLCBhKyspLCB1LmNvbnRpbnVlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBsID0gby5vcGVuQ3Vyc29yKCk7XG5cdFx0XHRcdGwub25zdWNjZXNzID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHUgPSBsLnJlc3VsdDtcblx0XHRcdFx0XHRpZiAodSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcCA9IHUudmFsdWU7XG5cdFx0XHRcdFx0XHRwLmV4cGlyZXNBdCAmJiBwLmV4cGlyZXNBdCA8IHQgJiYgKHUuZGVsZXRlKCksIGErKyksIHUuY29udGludWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIHIub25jb21wbGV0ZSA9ICgpID0+IG4oYSksIHIub25lcnJvciA9ICgpID0+IHMoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkZhaWxlZCB0byBjbGVhbnVwIGV4cGlyZWRcIikpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXHR2YXIgWm4gPSBjbGFzcyB7XG5cdFx0X3N0b3JhZ2U7XG5cdFx0X29wZXJhdGlvbnMgPSBbXTtcblx0XHRfaXNDb21taXR0ZWQgPSAhMTtcblx0XHRfaXNSb2xsZWRCYWNrID0gITE7XG5cdFx0Y29uc3RydWN0b3IoZSkge1xuXHRcdFx0dGhpcy5fc3RvcmFnZSA9IGU7XG5cdFx0fVxuXHRcdHB1dChlLCB0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hlY2tTdGF0ZSgpLCB0aGlzLl9vcGVyYXRpb25zLnB1c2goe1xuXHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0dHlwZTogXCJwdXRcIixcblx0XHRcdFx0c3RvcmU6IGUsXG5cdFx0XHRcdHZhbHVlOiB0LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pLCB0aGlzO1xuXHRcdH1cblx0XHRkZWxldGUoZSwgdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoZWNrU3RhdGUoKSwgdGhpcy5fb3BlcmF0aW9ucy5wdXNoKHtcblx0XHRcdFx0aWQ6ICRlKCksXG5cdFx0XHRcdHR5cGU6IFwiZGVsZXRlXCIsXG5cdFx0XHRcdHN0b3JlOiBlLFxuXHRcdFx0XHRrZXk6IHQsXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fSksIHRoaXM7XG5cdFx0fVxuXHRcdHVwZGF0ZShlLCB0LCBuKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hlY2tTdGF0ZSgpLCB0aGlzLl9vcGVyYXRpb25zLnB1c2goe1xuXHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0dHlwZTogXCJ1cGRhdGVcIixcblx0XHRcdFx0c3RvcmU6IGUsXG5cdFx0XHRcdGtleTogdCxcblx0XHRcdFx0dmFsdWU6IG4sXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fSksIHRoaXM7XG5cdFx0fVxuXHRcdGFzeW5jIGNvbW1pdCgpIHtcblx0XHRcdGlmICh0aGlzLl9jaGVja1N0YXRlKCksIHRoaXMuX29wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuX2lzQ29tbWl0dGVkID0gITA7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX3N0b3JhZ2UuZXhlY3V0ZVRyYW5zYWN0aW9uKHRoaXMuX29wZXJhdGlvbnMpLCB0aGlzLl9pc0NvbW1pdHRlZCA9ICEwO1xuXHRcdH1cblx0XHRyb2xsYmFjaygpIHtcblx0XHRcdHRoaXMuX29wZXJhdGlvbnMgPSBbXSwgdGhpcy5faXNSb2xsZWRCYWNrID0gITA7XG5cdFx0fVxuXHRcdGdldCBvcGVyYXRpb25Db3VudCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aDtcblx0XHR9XG5cdFx0X2NoZWNrU3RhdGUoKSB7XG5cdFx0XHRpZiAodGhpcy5faXNDb21taXR0ZWQpIHRocm93IG5ldyBFcnJvcihcIlRyYW5zYWN0aW9uIGFscmVhZHkgY29tbWl0dGVkXCIpO1xuXHRcdFx0aWYgKHRoaXMuX2lzUm9sbGVkQmFjaykgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNhY3Rpb24gYWxyZWFkeSByb2xsZWQgYmFja1wiKTtcblx0XHR9XG5cdH07XG5cdHZhciBKID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0ZnVuY3Rpb24gUnQoZSkge1xuXHRcdHJldHVybiBKLmhhcyhlKSB8fCBKLnNldChlLCBuZXcgWG4oZSkpLCBKLmdldChlKTtcblx0fVxuXHR2YXIgSmUgPSBDdCgpO1xuXHR2YXIgZXMgPSBKZS5sZW5ndGggPiAwID8gbmV3IFVSTChcIi4uL3RyYW5zcG9ydC9Xb3JrZXIudHNcIiwgSmUpIDogXCJcIjtcblx0dmFyIHF0ID0gY2xhc3Mge1xuXHRcdF9jaGFubmVsO1xuXHRcdF9jb250ZXh0O1xuXHRcdF9vcHRpb25zO1xuXHRcdF9jb25uZWN0aW9uO1xuXHRcdF9zdG9yYWdlO1xuXHRcdGNvbnN0cnVjdG9yKGUsIHQsIG4gPSB7fSkge1xuXHRcdFx0dGhpcy5fY2hhbm5lbCA9IGUsIHRoaXMuX2NvbnRleHQgPSB0LCB0aGlzLl9vcHRpb25zID0gbiwgdGhpcy5fY29ubmVjdGlvbiA9IEF0KGUpLCB0aGlzLl9zdG9yYWdlID0gUnQoZSk7XG5cdFx0fVxuXHRcdGFzeW5jIHJlcXVlc3QoZSwgdCwgbiwgcyA9IHt9KSB7XG5cdFx0XHRsZXQgciA9IHR5cGVvZiBlID09IFwic3RyaW5nXCIgPyBbZV0gOiBlLCBpID0gdCwgbyA9IG47XG5cdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSAmJiBPdChlKSAmJiAocyA9IG4sIG8gPSB0LCBpID0gZSwgciA9IFtdKSwgdGhpcy5fY29udGV4dC5nZXRIb3N0KCk/LnJlcXVlc3QociwgaSwgbywgcywgdGhpcy5fY2hhbm5lbCk7XG5cdFx0fVxuXHRcdGFzeW5jIGRvSW1wb3J0TW9kdWxlKGUsIHQgPSB7fSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdChbXSwgZC5JTVBPUlQsIFtlXSwgdCk7XG5cdFx0fVxuXHRcdGFzeW5jIGRlZmVyTWVzc2FnZShlLCB0ID0ge30pIHtcblx0XHRcdHJldHVybiB0aGlzLl9zdG9yYWdlLmRlZmVyKHtcblx0XHRcdFx0Y2hhbm5lbDogdGhpcy5fY2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiB0aGlzLl9jb250ZXh0Lmhvc3ROYW1lLFxuXHRcdFx0XHR0eXBlOiBcInJlcXVlc3RcIixcblx0XHRcdFx0cGF5bG9hZDogZVxuXHRcdFx0fSwgdCk7XG5cdFx0fVxuXHRcdGFzeW5jIGdldFBlbmRpbmdNZXNzYWdlcygpIHtcblx0XHRcdHJldHVybiB0aGlzLl9zdG9yYWdlLmdldERlZmVycmVkTWVzc2FnZXModGhpcy5fY2hhbm5lbCwgeyBzdGF0dXM6IFwicGVuZGluZ1wiIH0pO1xuXHRcdH1cblx0XHRnZXQgY29ubmVjdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uO1xuXHRcdH1cblx0XHRnZXQgY2hhbm5lbE5hbWUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hhbm5lbDtcblx0XHR9XG5cdFx0Z2V0IGNvbnRleHQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dDtcblx0XHR9XG5cdH07XG5cdHZhciBBID0gY2xhc3Mge1xuXHRcdF9jaGFubmVsO1xuXHRcdF9jb250ZXh0O1xuXHRcdF9vcHRpb25zO1xuXHRcdF9jb25uZWN0aW9uO1xuXHRcdF91bmlmaWVkO1xuXHRcdGdldCBfZm9yUmVzb2x2ZXMoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5fX2dldFByaXZhdGUoXCJfcGVuZGluZ1wiKTtcblx0XHR9XG5cdFx0Z2V0IF9zdWJzY3JpcHRpb25zKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3VuaWZpZWQuX19nZXRQcml2YXRlKFwiX3N1YnNjcmlwdGlvbnNcIik7XG5cdFx0fVxuXHRcdGdldCBfYnJvYWRjYXN0cygpIHtcblx0XHRcdHJldHVybiB0aGlzLl91bmlmaWVkLl9fZ2V0UHJpdmF0ZShcIl90cmFuc3BvcnRzXCIpO1xuXHRcdH1cblx0XHRjb25zdHJ1Y3RvcihlLCB0LCBuID0ge30pIHtcblx0XHRcdHRoaXMuX2NoYW5uZWwgPSBlLCB0aGlzLl9jb250ZXh0ID0gdCwgdGhpcy5fb3B0aW9ucyA9IG4sIHRoaXMuX2Nvbm5lY3Rpb24gPSBMZSgpLmdldE9yQ3JlYXRlKGUsIFwiaW50ZXJuYWxcIiwgbiksIHRoaXMuX3VuaWZpZWQgPSBuZXcgeXQoe1xuXHRcdFx0XHRuYW1lOiBlLFxuXHRcdFx0XHRhdXRvTGlzdGVuOiAhMSxcblx0XHRcdFx0dGltZW91dDogbj8udGltZW91dFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNyZWF0ZVJlbW90ZUNoYW5uZWwoZSwgdCA9IHt9LCBuKSB7XG5cdFx0XHRjb25zdCBzID0gdHMobiA/PyB0aGlzLl9jb250ZXh0LiRjcmVhdGVPclVzZUV4aXN0aW5nUmVtb3RlKGUsIHQsIG4gPz8gbnVsbCk/Lm1lc3NhZ2VDaGFubmVsPy5wb3J0MSksIHIgPSBMdChzPy50YXJnZXQgPz8gcyk7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5saXN0ZW4ocz8udGFyZ2V0LCB7IHRhcmdldENoYW5uZWw6IGUgfSksIHMgJiYgKHRoaXMuX2Jyb2FkY2FzdHM/LnNldD8uKGUsIHMpLCByID09PSBcInNlbGZcIiAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPiBcInVcIiB8fCB0aGlzLl91bmlmaWVkLmNvbm5lY3QocywgeyB0YXJnZXRDaGFubmVsOiBlIH0pLCB0aGlzLl9jb250ZXh0LiRyZWdpc3RlckNvbm5lY3Rpb24oe1xuXHRcdFx0XHRsb2NhbENoYW5uZWw6IHRoaXMuX2NoYW5uZWwsXG5cdFx0XHRcdHJlbW90ZUNoYW5uZWw6IGUsXG5cdFx0XHRcdHNlbmRlcjogdGhpcy5fY2hhbm5lbCxcblx0XHRcdFx0ZGlyZWN0aW9uOiBcIm91dGdvaW5nXCIsXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IHJcblx0XHRcdH0pLCB0aGlzLm5vdGlmeUNoYW5uZWwoZSwge1xuXHRcdFx0XHRjb250ZXh0SWQ6IHRoaXMuX2NvbnRleHQuaWQsXG5cdFx0XHRcdGNvbnRleHROYW1lOiB0aGlzLl9jb250ZXh0Lmhvc3ROYW1lXG5cdFx0XHR9LCBcImNvbm5lY3RcIikpLCBuZXcgcXQoZSwgdGhpcy5fY29udGV4dCwgdCk7XG5cdFx0fVxuXHRcdGdldENoYW5uZWwoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hhbm5lbDtcblx0XHR9XG5cdFx0Z2V0IGNvbm5lY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbjtcblx0XHR9XG5cdFx0cmVxdWVzdChlLCB0LCBuLCBzID0ge30sIHIgPSBcIndvcmtlclwiKSB7XG5cdFx0XHRsZXQgaSA9IHR5cGVvZiBlID09IFwic3RyaW5nXCIgPyBbZV0gOiBlLCBvID0gbjtcblx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KHQpICYmIE90KGUpICYmIChyID0gcywgcyA9IG4sIG8gPSB0LCB0ID0gZSwgaSA9IFtdKSwgdGhpcy5fdW5pZmllZC5pbnZva2UociwgdCwgaSA/PyBbXSwgQXJyYXkuaXNBcnJheShvKSA/IG8gOiBbb10pO1xuXHRcdH1cblx0XHRyZXNvbHZlUmVzcG9uc2UoZSwgdCkge1xuXHRcdFx0dGhpcy5fZm9yUmVzb2x2ZXMuZ2V0KGUpPy5yZXNvbHZlPy4odCk7XG5cdFx0XHRjb25zdCBuID0gdGhpcy5fZm9yUmVzb2x2ZXMuZ2V0KGUpPy5wcm9taXNlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2ZvclJlc29sdmVzLmRlbGV0ZShlKSwgbjtcblx0XHR9XG5cdFx0YXN5bmMgaGFuZGxlQW5kUmVzcG9uc2UoZSwgdCwgbikge31cblx0XHRub3RpZnlDaGFubmVsKGUsIHQgPSB7fSwgbiA9IFwibm90aWZ5XCIpIHtcblx0XHRcdHJldHVybiB0aGlzLl91bmlmaWVkLm5vdGlmeShlLCB7XG5cdFx0XHRcdC4uLnQsXG5cdFx0XHRcdGZyb206IHRoaXMuX2NoYW5uZWwsXG5cdFx0XHRcdHRvOiBlXG5cdFx0XHR9LCBuKTtcblx0XHR9XG5cdFx0Z2V0Q29ubmVjdGVkQ2hhbm5lbHMoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5pZmllZC5jb25uZWN0ZWRDaGFubmVscztcblx0XHR9XG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goKGUpID0+IGUudW5zdWJzY3JpYmUoKSksIHRoaXMuX2ZvclJlc29sdmVzLmNsZWFyKCksIHRoaXMuX2Jyb2FkY2FzdHM/LnZhbHVlcz8uKCk/LmZvckVhY2goKGUpID0+IGUuY2xvc2U/LigpKSwgdGhpcy5fYnJvYWRjYXN0cz8uY2xlYXI/LigpLCB0aGlzLl91bmlmaWVkLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGdldCB1bmlmaWVkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3VuaWZpZWQ7XG5cdFx0fVxuXHR9O1xuXHR2YXIgTnQgPSBjbGFzcyB7XG5cdFx0X29wdGlvbnM7XG5cdFx0X2lkID0gJGUoKTtcblx0XHRfaG9zdE5hbWU7XG5cdFx0X2hvc3QgPSBudWxsO1xuXHRcdF9lbmRwb2ludHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF91bmlmaWVkQnlDaGFubmVsID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfdW5pZmllZENvbm5lY3Rpb25TdWJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfcmVtb3RlQ2hhbm5lbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRcdF9kZWZlcnJlZENoYW5uZWxzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfY29ubmVjdGlvbkV2ZW50cyA9IG5ldyBfKHsgYnVmZmVyU2l6ZTogMjAwIH0pO1xuXHRcdF9jb25uZWN0aW9uUmVnaXN0cnkgPSBuZXcgYnQoKCkgPT4gJGUoKSwgKGUpID0+IHRoaXMuX2VtaXRDb25uZWN0aW9uRXZlbnQoZSkpO1xuXHRcdF9jbG9zZWQgPSAhMTtcblx0XHRfZ2xvYmFsU2VsZiA9IG51bGw7XG5cdFx0Y29uc3RydWN0b3IoZSA9IHt9KSB7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gZSwgdGhpcy5faG9zdE5hbWUgPSBlLm5hbWUgPz8gYGN0eC0ke3RoaXMuX2lkLnNsaWNlKDAsIDgpfWAsIGUudXNlR2xvYmFsU2VsZiAhPT0gITEgJiYgKHRoaXMuX2dsb2JhbFNlbGYgPSB0eXBlb2YgZ2xvYmFsVGhpcyA8IFwidVwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiBzZWxmIDwgXCJ1XCIgPyBzZWxmIDogbnVsbCk7XG5cdFx0fVxuXHRcdGluaXRIb3N0KGUpIHtcblx0XHRcdGlmICh0aGlzLl9ob3N0ICYmICFlKSByZXR1cm4gdGhpcy5faG9zdDtcblx0XHRcdGNvbnN0IHQgPSBlID8/IHRoaXMuX2hvc3ROYW1lO1xuXHRcdFx0aWYgKHRoaXMuX2hvc3ROYW1lID0gdCwgdGhpcy5fZW5kcG9pbnRzLmhhcyh0KSkgcmV0dXJuIHRoaXMuX2hvc3QgPSB0aGlzLl9lbmRwb2ludHMuZ2V0KHQpLmhhbmRsZXIsIHRoaXMuX2hvc3Q7XG5cdFx0XHR0aGlzLl9ob3N0ID0gbmV3IEEodCwgdGhpcywgdGhpcy5fb3B0aW9ucy5kZWZhdWx0T3B0aW9ucyk7XG5cdFx0XHRjb25zdCBuID0ge1xuXHRcdFx0XHRuYW1lOiB0LFxuXHRcdFx0XHRoYW5kbGVyOiB0aGlzLl9ob3N0LFxuXHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLl9ob3N0LmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKG51bGwpLFxuXHRcdFx0XHR1bmlmaWVkOiB0aGlzLl9ob3N0LnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLnNldCh0LCBuKSwgdGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbCh0LCB0aGlzLl9ob3N0LnVuaWZpZWQpLCB0aGlzLl9ob3N0O1xuXHRcdH1cblx0XHRnZXRIb3N0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hvc3QgPz8gdGhpcy5pbml0SG9zdCgpO1xuXHRcdH1cblx0XHRnZXQgaG9zdE5hbWUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faG9zdE5hbWU7XG5cdFx0fVxuXHRcdGdldCBpZCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pZDtcblx0XHR9XG5cdFx0Z2V0IG9uQ29ubmVjdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uRXZlbnRzO1xuXHRcdH1cblx0XHRzdWJzY3JpYmVDb25uZWN0aW9ucyhlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbkV2ZW50cy5zdWJzY3JpYmUoZSk7XG5cdFx0fVxuXHRcdG5vdGlmeUNvbm5lY3Rpb25zKGUgPSB7fSwgdCA9IHt9KSB7XG5cdFx0XHRsZXQgbiA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHMgb2YgdGhpcy5fZW5kcG9pbnRzLnZhbHVlcygpKSB7XG5cdFx0XHRcdGNvbnN0IHIgPSBzLmhhbmRsZXIuZ2V0Q29ubmVjdGVkQ2hhbm5lbHMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBpIG9mIHIpIHtcblx0XHRcdFx0XHRpZiAodC5sb2NhbENoYW5uZWwgJiYgdC5sb2NhbENoYW5uZWwgIT09IHMubmFtZSB8fCB0LnJlbW90ZUNoYW5uZWwgJiYgdC5yZW1vdGVDaGFubmVsICE9PSBpKSBjb250aW51ZTtcblx0XHRcdFx0XHRjb25zdCBvID0gdGhpcy5xdWVyeUNvbm5lY3Rpb25zKHtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbm5lbDogcy5uYW1lLFxuXHRcdFx0XHRcdFx0cmVtb3RlQ2hhbm5lbDogaSxcblx0XHRcdFx0XHRcdHN0YXR1czogXCJhY3RpdmVcIlxuXHRcdFx0XHRcdH0pWzBdO1xuXHRcdFx0XHRcdHQuc2VuZGVyICYmIG8/LnNlbmRlciAhPT0gdC5zZW5kZXIgfHwgdC50cmFuc3BvcnRUeXBlICYmIG8/LnRyYW5zcG9ydFR5cGUgIT09IHQudHJhbnNwb3J0VHlwZSB8fCB0LmNoYW5uZWwgJiYgdC5jaGFubmVsICE9PSBzLm5hbWUgJiYgdC5jaGFubmVsICE9PSBpIHx8IHMuaGFuZGxlci5ub3RpZnlDaGFubmVsKGksIGUsIFwibm90aWZ5XCIpICYmIG4rKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG47XG5cdFx0fVxuXHRcdHF1ZXJ5Q29ubmVjdGlvbnMoZSA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LnF1ZXJ5KGUpLm1hcCgodCkgPT4gKHtcblx0XHRcdFx0Li4udCxcblx0XHRcdFx0Y29udGV4dElkOiB0aGlzLl9pZFxuXHRcdFx0fSkpO1xuXHRcdH1cblx0XHRjcmVhdGVDaGFubmVsKGUsIHQgPSB7fSkge1xuXHRcdFx0aWYgKHRoaXMuX2VuZHBvaW50cy5oYXMoZSkpIHJldHVybiB0aGlzLl9lbmRwb2ludHMuZ2V0KGUpO1xuXHRcdFx0Y29uc3QgbiA9IG5ldyBBKGUsIHRoaXMsIHtcblx0XHRcdFx0Li4udGhpcy5fb3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcblx0XHRcdFx0Li4udFxuXHRcdFx0fSksIHMgPSB7XG5cdFx0XHRcdG5hbWU6IGUsXG5cdFx0XHRcdGhhbmRsZXI6IG4sXG5cdFx0XHRcdGNvbm5lY3Rpb246IG4uY29ubmVjdGlvbixcblx0XHRcdFx0c3Vic2NyaXB0aW9uczogW10sXG5cdFx0XHRcdHJlYWR5OiBQcm9taXNlLnJlc29sdmUobnVsbCksXG5cdFx0XHRcdHVuaWZpZWQ6IG4udW5pZmllZFxuXHRcdFx0fTtcblx0XHRcdHJldHVybiB0aGlzLl9lbmRwb2ludHMuc2V0KGUsIHMpLCB0aGlzLl9yZWdpc3RlclVuaWZpZWRDaGFubmVsKGUsIG4udW5pZmllZCksIHM7XG5cdFx0fVxuXHRcdGNyZWF0ZUNoYW5uZWxzKGUsIHQgPSB7fSkge1xuXHRcdFx0Y29uc3QgbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0XHRmb3IgKGNvbnN0IHMgb2YgZSkgbi5zZXQocywgdGhpcy5jcmVhdGVDaGFubmVsKHMsIHQpKTtcblx0XHRcdHJldHVybiBuO1xuXHRcdH1cblx0XHRnZXRDaGFubmVsKGUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9lbmRwb2ludHMuZ2V0KGUpO1xuXHRcdH1cblx0XHRnZXRPckNyZWF0ZUNoYW5uZWwoZSwgdCA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLmdldChlKSA/PyB0aGlzLmNyZWF0ZUNoYW5uZWwoZSwgdCk7XG5cdFx0fVxuXHRcdGhhc0NoYW5uZWwoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2VuZHBvaW50cy5oYXMoZSk7XG5cdFx0fVxuXHRcdGdldENoYW5uZWxOYW1lcygpIHtcblx0XHRcdHJldHVybiBbLi4udGhpcy5fZW5kcG9pbnRzLmtleXMoKV07XG5cdFx0fVxuXHRcdGdldCBzaXplKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2VuZHBvaW50cy5zaXplO1xuXHRcdH1cblx0XHRkZWZlcihlLCB0KSB7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZENoYW5uZWxzLnNldChlLCB0KTtcblx0XHR9XG5cdFx0YXN5bmMgaW5pdERlZmVycmVkKGUpIHtcblx0XHRcdGNvbnN0IHQgPSB0aGlzLl9kZWZlcnJlZENoYW5uZWxzLmdldChlKTtcblx0XHRcdGlmICghdCkgcmV0dXJuIG51bGw7XG5cdFx0XHRjb25zdCBuID0gYXdhaXQgdCgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2VuZHBvaW50cy5zZXQoZSwgbiksIHRoaXMuX2RlZmVycmVkQ2hhbm5lbHMuZGVsZXRlKGUpLCBuO1xuXHRcdH1cblx0XHRpc0RlZmVycmVkKGUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9kZWZlcnJlZENoYW5uZWxzLmhhcyhlKTtcblx0XHR9XG5cdFx0YXN5bmMgZ2V0Q2hhbm5lbEFzeW5jKGUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9lbmRwb2ludHMuaGFzKGUpID8gdGhpcy5fZW5kcG9pbnRzLmdldChlKSA6IHRoaXMuX2RlZmVycmVkQ2hhbm5lbHMuaGFzKGUpID8gdGhpcy5pbml0RGVmZXJyZWQoZSkgOiBudWxsO1xuXHRcdH1cblx0XHRhc3luYyBhZGRXb3JrZXIoZSwgdCwgbiA9IHt9KSB7XG5cdFx0XHRjb25zdCBzID0gWGUodCk7XG5cdFx0XHRpZiAoIXMpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB3b3JrZXIgZm9yIGNoYW5uZWw6ICR7ZX1gKTtcblx0XHRcdGNvbnN0IHIgPSBuZXcgQShlLCB0aGlzLCB7XG5cdFx0XHRcdC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRcdC4uLm5cblx0XHRcdH0pLCBpID0gci5jcmVhdGVSZW1vdGVDaGFubmVsKGUsIG4sIHMpLCBvID0ge1xuXHRcdFx0XHRuYW1lOiBlLFxuXHRcdFx0XHRoYW5kbGVyOiByLFxuXHRcdFx0XHRjb25uZWN0aW9uOiByLmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcIndvcmtlclwiLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKGkpLFxuXHRcdFx0XHR1bmlmaWVkOiByLnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLnNldChlLCBvKSwgdGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChlLCByLnVuaWZpZWQpLCB0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQoZSwge1xuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLFxuXHRcdFx0XHRyZW1vdGU6IFByb21pc2UucmVzb2x2ZShpKSxcblx0XHRcdFx0dHJhbnNwb3J0OiBzLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcIndvcmtlclwiXG5cdFx0XHR9KSwgbztcblx0XHR9XG5cdFx0YXN5bmMgYWRkUG9ydChlLCB0LCBuID0ge30pIHtcblx0XHRcdGNvbnN0IHMgPSBuZXcgQShlLCB0aGlzLCB7XG5cdFx0XHRcdC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRcdC4uLm5cblx0XHRcdH0pO1xuXHRcdFx0dC5zdGFydD8uKCk7XG5cdFx0XHRjb25zdCByID0gcy5jcmVhdGVSZW1vdGVDaGFubmVsKGUsIG4sIHQpLCBpID0ge1xuXHRcdFx0XHRuYW1lOiBlLFxuXHRcdFx0XHRoYW5kbGVyOiBzLFxuXHRcdFx0XHRjb25uZWN0aW9uOiBzLmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcIm1lc3NhZ2UtcG9ydFwiLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKHIpLFxuXHRcdFx0XHR1bmlmaWVkOiBzLnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLnNldChlLCBpKSwgdGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChlLCBzLnVuaWZpZWQpLCB0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQoZSwge1xuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLFxuXHRcdFx0XHRyZW1vdGU6IFByb21pc2UucmVzb2x2ZShyKSxcblx0XHRcdFx0dHJhbnNwb3J0OiB0LFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcIm1lc3NhZ2UtcG9ydFwiXG5cdFx0XHR9KSwgaTtcblx0XHR9XG5cdFx0YXN5bmMgYWRkQnJvYWRjYXN0KGUsIHQsIG4gPSB7fSkge1xuXHRcdFx0Y29uc3QgcyA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKHQgPz8gZSksIHIgPSBuZXcgQShlLCB0aGlzLCB7XG5cdFx0XHRcdC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRcdC4uLm5cblx0XHRcdH0pLCBpID0gci5jcmVhdGVSZW1vdGVDaGFubmVsKGUsIG4sIHMpLCBvID0ge1xuXHRcdFx0XHRuYW1lOiBlLFxuXHRcdFx0XHRoYW5kbGVyOiByLFxuXHRcdFx0XHRjb25uZWN0aW9uOiByLmNvbm5lY3Rpb24sXG5cdFx0XHRcdHN1YnNjcmlwdGlvbnM6IFtdLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcImJyb2FkY2FzdFwiLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKGkpLFxuXHRcdFx0XHR1bmlmaWVkOiByLnVuaWZpZWRcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdGhpcy5fZW5kcG9pbnRzLnNldChlLCBvKSwgdGhpcy5fcmVnaXN0ZXJVbmlmaWVkQ2hhbm5lbChlLCByLnVuaWZpZWQpLCB0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQoZSwge1xuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLFxuXHRcdFx0XHRyZW1vdGU6IFByb21pc2UucmVzb2x2ZShpKSxcblx0XHRcdFx0dHJhbnNwb3J0OiBzLFxuXHRcdFx0XHR0cmFuc3BvcnRUeXBlOiBcImJyb2FkY2FzdFwiXG5cdFx0XHR9KSwgbztcblx0XHR9XG5cdFx0YWRkU2VsZkNoYW5uZWwoZSwgdCA9IHt9KSB7XG5cdFx0XHRjb25zdCBuID0gbmV3IEEoZSwgdGhpcywge1xuXHRcdFx0XHQuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0XHQuLi50XG5cdFx0XHR9KSwgcyA9IHRoaXMuX2dsb2JhbFNlbGYgPz8gKHR5cGVvZiBzZWxmIDwgXCJ1XCIgPyBzZWxmIDogbnVsbCksIHIgPSB7XG5cdFx0XHRcdG5hbWU6IGUsXG5cdFx0XHRcdGhhbmRsZXI6IG4sXG5cdFx0XHRcdGNvbm5lY3Rpb246IG4uY29ubmVjdGlvbixcblx0XHRcdFx0c3Vic2NyaXB0aW9uczogW10sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IFwic2VsZlwiLFxuXHRcdFx0XHRyZWFkeTogUHJvbWlzZS5yZXNvbHZlKHMgPyBuLmNyZWF0ZVJlbW90ZUNoYW5uZWwoZSwgdCwgcykgOiBudWxsKSxcblx0XHRcdFx0dW5pZmllZDogbi51bmlmaWVkXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHRoaXMuX2VuZHBvaW50cy5zZXQoZSwgciksIHRoaXMuX3JlZ2lzdGVyVW5pZmllZENoYW5uZWwoZSwgbi51bmlmaWVkKSwgcjtcblx0XHR9XG5cdFx0YXN5bmMgYWRkVHJhbnNwb3J0KGUsIHQpIHtcblx0XHRcdGNvbnN0IG4gPSB0Lm9wdGlvbnMgPz8ge307XG5cdFx0XHRzd2l0Y2ggKHQudHlwZSkge1xuXHRcdFx0XHRjYXNlIFwid29ya2VyXCI6XG5cdFx0XHRcdFx0aWYgKCF0LndvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHJlcXVpcmVkIGZvciB3b3JrZXIgdHJhbnNwb3J0XCIpO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFkZFdvcmtlcihlLCB0Lndvcmtlciwgbik7XG5cdFx0XHRcdGNhc2UgXCJtZXNzYWdlLXBvcnRcIjpcblx0XHRcdFx0XHRpZiAoIXQucG9ydCkgdGhyb3cgbmV3IEVycm9yKFwiUG9ydCByZXF1aXJlZCBmb3IgbWVzc2FnZS1wb3J0IHRyYW5zcG9ydFwiKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZGRQb3J0KGUsIHQucG9ydCwgbik7XG5cdFx0XHRcdGNhc2UgXCJicm9hZGNhc3RcIjpcblx0XHRcdFx0XHRjb25zdCBzID0gdHlwZW9mIHQuYnJvYWRjYXN0ID09IFwic3RyaW5nXCIgPyB0LmJyb2FkY2FzdCA6IHZvaWQgMDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZGRCcm9hZGNhc3QoZSwgcywgbik7XG5cdFx0XHRcdGNhc2UgXCJzZWxmXCI6IHJldHVybiB0aGlzLmFkZFNlbGZDaGFubmVsKGUsIG4pO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm4gdGhpcy5jcmVhdGVDaGFubmVsKGUsIG4pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjcmVhdGVDaGFubmVsUGFpcihlLCB0LCBuID0ge30pIHtcblx0XHRcdGNvbnN0IHMgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKSwgciA9IG5ldyBBKGUsIHRoaXMsIHtcblx0XHRcdFx0Li4udGhpcy5fb3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcblx0XHRcdFx0Li4ublxuXHRcdFx0fSksIGkgPSBuZXcgQSh0LCB0aGlzLCB7XG5cdFx0XHRcdC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRcdC4uLm5cblx0XHRcdH0pO1xuXHRcdFx0cy5wb3J0MS5zdGFydCgpLCBzLnBvcnQyLnN0YXJ0KCk7XG5cdFx0XHRjb25zdCBvID0gUHJvbWlzZS5yZXNvbHZlKHIuY3JlYXRlUmVtb3RlQ2hhbm5lbCh0LCBuLCBzLnBvcnQxKSksIGEgPSBQcm9taXNlLnJlc29sdmUoaS5jcmVhdGVSZW1vdGVDaGFubmVsKGUsIG4sIHMucG9ydDIpKSwgYyA9IHtcblx0XHRcdFx0bmFtZTogZSxcblx0XHRcdFx0aGFuZGxlcjogcixcblx0XHRcdFx0Y29ubmVjdGlvbjogci5jb25uZWN0aW9uLFxuXHRcdFx0XHRzdWJzY3JpcHRpb25zOiBbXSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogXCJtZXNzYWdlLXBvcnRcIixcblx0XHRcdFx0cmVhZHk6IG8sXG5cdFx0XHRcdHVuaWZpZWQ6IHIudW5pZmllZFxuXHRcdFx0fSwgbCA9IHtcblx0XHRcdFx0bmFtZTogdCxcblx0XHRcdFx0aGFuZGxlcjogaSxcblx0XHRcdFx0Y29ubmVjdGlvbjogaS5jb25uZWN0aW9uLFxuXHRcdFx0XHRzdWJzY3JpcHRpb25zOiBbXSxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogXCJtZXNzYWdlLXBvcnRcIixcblx0XHRcdFx0cmVhZHk6IGEsXG5cdFx0XHRcdHVuaWZpZWQ6IGkudW5pZmllZFxuXHRcdFx0fTtcblx0XHRcdHJldHVybiB0aGlzLl9lbmRwb2ludHMuc2V0KGUsIGMpLCB0aGlzLl9lbmRwb2ludHMuc2V0KHQsIGwpLCB0aGlzLl9yZWdpc3RlclVuaWZpZWRDaGFubmVsKGUsIHIudW5pZmllZCksIHRoaXMuX3JlZ2lzdGVyVW5pZmllZENoYW5uZWwodCwgaS51bmlmaWVkKSwge1xuXHRcdFx0XHRjaGFubmVsMTogYyxcblx0XHRcdFx0Y2hhbm5lbDI6IGwsXG5cdFx0XHRcdG1lc3NhZ2VDaGFubmVsOiBzXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRnZXQgZ2xvYmFsU2VsZigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9nbG9iYWxTZWxmO1xuXHRcdH1cblx0XHRhc3luYyBjb25uZWN0UmVtb3RlKGUsIHQgPSB7fSwgbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW5pdEhvc3QoKSwgdGhpcy5faG9zdC5jcmVhdGVSZW1vdGVDaGFubmVsKGUsIHQsIG4pO1xuXHRcdH1cblx0XHRhc3luYyBpbXBvcnRNb2R1bGVJbkNoYW5uZWwoZSwgdCwgbiA9IHt9LCBzKSB7XG5cdFx0XHRyZXR1cm4gKGF3YWl0IHRoaXMuY29ubmVjdFJlbW90ZShlLCBuLmNoYW5uZWxPcHRpb25zLCBzKSk/LmRvSW1wb3J0TW9kdWxlPy4odCwgbi5pbXBvcnRPcHRpb25zKTtcblx0XHR9XG5cdFx0JGNyZWF0ZU9yVXNlRXhpc3RpbmdSZW1vdGUoZSwgdCA9IHt9LCBuKSB7XG5cdFx0XHRpZiAoZSA9PSBudWxsIHx8IG4pIHJldHVybiBudWxsO1xuXHRcdFx0aWYgKHRoaXMuX3JlbW90ZUNoYW5uZWxzLmhhcyhlKSkgcmV0dXJuIHRoaXMuX3JlbW90ZUNoYW5uZWxzLmdldChlKTtcblx0XHRcdGNvbnN0IHMgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKSwgciA9IGhlKG5ldyBQcm9taXNlKChvKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGEgPSBYZShlcyk7XG5cdFx0XHRcdGE/LmFkZEV2ZW50TGlzdGVuZXI/LihcIm1lc3NhZ2VcIiwgKGMpID0+IHtcblx0XHRcdFx0XHRjLmRhdGEudHlwZSA9PT0gXCJjaGFubmVsQ3JlYXRlZFwiICYmIChzLnBvcnQxPy5zdGFydD8uKCksIG8obmV3IHF0KGMuZGF0YS5jaGFubmVsLCB0aGlzLCB0KSkpO1xuXHRcdFx0XHR9KSwgYT8ucG9zdE1lc3NhZ2U/Lih7XG5cdFx0XHRcdFx0dHlwZTogXCJjcmVhdGVDaGFubmVsXCIsXG5cdFx0XHRcdFx0Y2hhbm5lbDogZSxcblx0XHRcdFx0XHRzZW5kZXI6IHRoaXMuX2hvc3ROYW1lLFxuXHRcdFx0XHRcdG9wdGlvbnM6IHQsXG5cdFx0XHRcdFx0bWVzc2FnZVBvcnQ6IHMucG9ydDJcblx0XHRcdFx0fSwgeyB0cmFuc2ZlcjogW3MucG9ydDJdIH0pO1xuXHRcdFx0fSkpLCBpID0ge1xuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLFxuXHRcdFx0XHRtZXNzYWdlQ2hhbm5lbDogcyxcblx0XHRcdFx0cmVtb3RlOiByXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlbW90ZUNoYW5uZWxzLnNldChlLCBpKSwgaTtcblx0XHR9XG5cdFx0JHJlZ2lzdGVyQ29ubmVjdGlvbihlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQuLi50aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkucmVnaXN0ZXIoZSksXG5cdFx0XHRcdGNvbnRleHRJZDogdGhpcy5faWRcblx0XHRcdH07XG5cdFx0fVxuXHRcdCRtYXJrTm90aWZpZWQoZSkge1xuXHRcdFx0Y29uc3QgdCA9IHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5yZWdpc3Rlcih7XG5cdFx0XHRcdGxvY2FsQ2hhbm5lbDogZS5sb2NhbENoYW5uZWwsXG5cdFx0XHRcdHJlbW90ZUNoYW5uZWw6IGUucmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlcixcblx0XHRcdFx0ZGlyZWN0aW9uOiBlLmRpcmVjdGlvbixcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogZS50cmFuc3BvcnRUeXBlXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5tYXJrTm90aWZpZWQodCwgZS5wYXlsb2FkKTtcblx0XHR9XG5cdFx0JG9ic2VydmVTaWduYWwoZSkge1xuXHRcdFx0Y29uc3QgdCA9IChlLnBheWxvYWQ/LnR5cGUsIFwiaW5jb21pbmdcIik7XG5cdFx0XHR0aGlzLiRtYXJrTm90aWZpZWQoe1xuXHRcdFx0XHRsb2NhbENoYW5uZWw6IGUubG9jYWxDaGFubmVsLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiBlLnJlbW90ZUNoYW5uZWwsXG5cdFx0XHRcdHNlbmRlcjogZS5zZW5kZXIsXG5cdFx0XHRcdGRpcmVjdGlvbjogdCxcblx0XHRcdFx0dHJhbnNwb3J0VHlwZTogZS50cmFuc3BvcnRUeXBlLFxuXHRcdFx0XHRwYXlsb2FkOiBlLnBheWxvYWRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQkZm9yd2FyZFVuaWZpZWRDb25uZWN0aW9uRXZlbnQoZSwgdCkge1xuXHRcdFx0Y29uc3QgbiA9IHQuY29ubmVjdGlvbi50cmFuc3BvcnRUeXBlID8/IFwiaW50ZXJuYWxcIiwgcyA9IHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5yZWdpc3Rlcih7XG5cdFx0XHRcdGxvY2FsQ2hhbm5lbDogdC5jb25uZWN0aW9uLmxvY2FsQ2hhbm5lbCB8fCBlLFxuXHRcdFx0XHRyZW1vdGVDaGFubmVsOiB0LmNvbm5lY3Rpb24ucmVtb3RlQ2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiB0LmNvbm5lY3Rpb24uc2VuZGVyLFxuXHRcdFx0XHRkaXJlY3Rpb246IHQuY29ubmVjdGlvbi5kaXJlY3Rpb24sXG5cdFx0XHRcdHRyYW5zcG9ydFR5cGU6IG4sXG5cdFx0XHRcdG1ldGFkYXRhOiB0LmNvbm5lY3Rpb24ubWV0YWRhdGFcblx0XHRcdH0pO1xuXHRcdFx0dC50eXBlID09PSBcIm5vdGlmaWVkXCIgPyB0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnkubWFya05vdGlmaWVkKHMsIHQucGF5bG9hZCkgOiB0LnR5cGUgPT09IFwiZGlzY29ubmVjdGVkXCIgJiYgdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LmNsb3NlQnlDaGFubmVsKHQuY29ubmVjdGlvbi5sb2NhbENoYW5uZWwpO1xuXHRcdH1cblx0XHRjbG9zZUNoYW5uZWwoZSkge1xuXHRcdFx0Y29uc3QgdCA9IHRoaXMuX2VuZHBvaW50cy5nZXQoZSk7XG5cdFx0XHRyZXR1cm4gdCA/ICh0LnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgobikgPT4gbi51bnN1YnNjcmliZSgpKSwgdC5oYW5kbGVyLmNsb3NlKCksIHQudHJhbnNwb3J0Py5kZXRhY2goKSwgdGhpcy5fdW5pZmllZENvbm5lY3Rpb25TdWJzLmdldChlKT8udW5zdWJzY3JpYmUoKSwgdGhpcy5fdW5pZmllZENvbm5lY3Rpb25TdWJzLmRlbGV0ZShlKSwgdGhpcy5fdW5pZmllZEJ5Q2hhbm5lbC5kZWxldGUoZSksIHRoaXMuX2VuZHBvaW50cy5kZWxldGUoZSksIGUgPT09IHRoaXMuX2hvc3ROYW1lICYmICh0aGlzLl9ob3N0ID0gbnVsbCksIHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeS5jbG9zZUJ5Q2hhbm5lbChlKSwgITApIDogITE7XG5cdFx0fVxuXHRcdGNsb3NlKCkge1xuXHRcdFx0aWYgKCF0aGlzLl9jbG9zZWQpIHtcblx0XHRcdFx0dGhpcy5fY2xvc2VkID0gITA7XG5cdFx0XHRcdGZvciAoY29uc3QgW2VdIG9mIHRoaXMuX2VuZHBvaW50cykgdGhpcy5jbG9zZUNoYW5uZWwoZSk7XG5cdFx0XHRcdHRoaXMuX3JlbW90ZUNoYW5uZWxzLmNsZWFyKCksIHRoaXMuX2hvc3QgPSBudWxsLCB0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuZm9yRWFjaCgoZSkgPT4gZS51bnN1YnNjcmliZSgpKSwgdGhpcy5fdW5pZmllZENvbm5lY3Rpb25TdWJzLmNsZWFyKCksIHRoaXMuX3VuaWZpZWRCeUNoYW5uZWwuY2xlYXIoKSwgdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LmNsZWFyKCksIHRoaXMuX2Nvbm5lY3Rpb25FdmVudHMuY29tcGxldGUoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Z2V0IGNsb3NlZCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jbG9zZWQ7XG5cdFx0fVxuXHRcdF9yZWdpc3RlclVuaWZpZWRDaGFubmVsKGUsIHQpIHtcblx0XHRcdHRoaXMuX3VuaWZpZWRCeUNoYW5uZWwuc2V0KGUsIHQpLCB0aGlzLl91bmlmaWVkQ29ubmVjdGlvblN1YnMuZ2V0KGUpPy51bnN1YnNjcmliZSgpO1xuXHRcdFx0Y29uc3QgbiA9IHQuc3Vic2NyaWJlQ29ubmVjdGlvbnMoKHMpID0+IHtcblx0XHRcdFx0dGhpcy4kZm9yd2FyZFVuaWZpZWRDb25uZWN0aW9uRXZlbnQoZSwgcyk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX3VuaWZpZWRDb25uZWN0aW9uU3Vicy5zZXQoZSwgbik7XG5cdFx0fVxuXHRcdF9lbWl0Q29ubmVjdGlvbkV2ZW50KGUpIHtcblx0XHRcdHRoaXMuX2Nvbm5lY3Rpb25FdmVudHMubmV4dCh7XG5cdFx0XHRcdC4uLmUsXG5cdFx0XHRcdGNvbm5lY3Rpb246IHtcblx0XHRcdFx0XHQuLi5lLmNvbm5lY3Rpb24sXG5cdFx0XHRcdFx0Y29udGV4dElkOiB0aGlzLl9pZFxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cdGZ1bmN0aW9uIE90KGUpIHtcblx0XHRyZXR1cm4gWy4uLk9iamVjdC52YWx1ZXMoZCldLmluY2x1ZGVzKGUpO1xuXHR9XG5cdGZ1bmN0aW9uIHRzKGUpIHtcblx0XHRpZiAoIWUpIHJldHVybiBudWxsO1xuXHRcdGlmIChEdChlKSkgcmV0dXJuIGU7XG5cdFx0Y29uc3QgdCA9IGUsIG4gPSBMdCh0KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0OiB0LFxuXHRcdFx0dGFyZ2V0Q2hhbm5lbDogXCJ1bmtub3duXCIsXG5cdFx0XHR0cmFuc3BvcnRUeXBlOiBuID09PSBcImludGVybmFsXCIgPyBcInNlbGZcIiA6IG4sXG5cdFx0XHRzZW5kZXI6IChzLCByKSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgV2ViU29ja2V0IDwgXCJ1XCIgJiYgdCBpbnN0YW5jZW9mIFdlYlNvY2tldCkge1xuXHRcdFx0XHRcdHQuc2VuZChKU09OLnN0cmluZ2lmeShzKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHQucG9zdE1lc3NhZ2U/LihzLCByPy5sZW5ndGggPyB7IHRyYW5zZmVyOiByIH0gOiB2b2lkIDApO1xuXHRcdFx0fSxcblx0XHRcdHBvc3RNZXNzYWdlOiAocywgcikgPT4ge1xuXHRcdFx0XHR0LnBvc3RNZXNzYWdlPy4ocywgcik7XG5cdFx0XHR9LFxuXHRcdFx0YWRkRXZlbnRMaXN0ZW5lcjogdC5hZGRFdmVudExpc3RlbmVyPy5iaW5kKHQpLFxuXHRcdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogdC5yZW1vdmVFdmVudExpc3RlbmVyPy5iaW5kKHQpLFxuXHRcdFx0c3RhcnQ6IHQuc3RhcnQ/LmJpbmQodCksXG5cdFx0XHRjbG9zZTogdC5jbG9zZT8uYmluZCh0KVxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gRHQoZSkge1xuXHRcdHJldHVybiAhIWUgJiYgdHlwZW9mIGUgPT0gXCJvYmplY3RcIiAmJiBcInRhcmdldFwiIGluIGUgJiYgdHlwZW9mIGUucG9zdE1lc3NhZ2UgPT0gXCJmdW5jdGlvblwiO1xuXHR9XG5cdGZ1bmN0aW9uIEx0KGUpIHtcblx0XHRjb25zdCB0ID0gRHQoZSkgPyBlLnRhcmdldCA6IGU7XG5cdFx0cmV0dXJuIHQgPyB0ID09PSBcImNocm9tZS1ydW50aW1lXCIgPyBcImNocm9tZS1ydW50aW1lXCIgOiB0ID09PSBcImNocm9tZS10YWJzXCIgPyBcImNocm9tZS10YWJzXCIgOiB0ID09PSBcImNocm9tZS1wb3J0XCIgPyBcImNocm9tZS1wb3J0XCIgOiB0ID09PSBcImNocm9tZS1leHRlcm5hbFwiID8gXCJjaHJvbWUtZXh0ZXJuYWxcIiA6IHR5cGVvZiBNZXNzYWdlUG9ydCA8IFwidVwiICYmIHQgaW5zdGFuY2VvZiBNZXNzYWdlUG9ydCA/IFwibWVzc2FnZS1wb3J0XCIgOiB0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbCA8IFwidVwiICYmIHQgaW5zdGFuY2VvZiBCcm9hZGNhc3RDaGFubmVsID8gXCJicm9hZGNhc3RcIiA6IHR5cGVvZiBXb3JrZXIgPCBcInVcIiAmJiB0IGluc3RhbmNlb2YgV29ya2VyID8gXCJ3b3JrZXJcIiA6IHR5cGVvZiBXZWJTb2NrZXQgPCBcInVcIiAmJiB0IGluc3RhbmNlb2YgV2ViU29ja2V0ID8gXCJ3ZWJzb2NrZXRcIiA6IHR5cGVvZiBjaHJvbWUgPCBcInVcIiAmJiB0eXBlb2YgdCA9PSBcIm9iamVjdFwiICYmIHQgJiYgdHlwZW9mIHQucG9zdE1lc3NhZ2UgPT0gXCJmdW5jdGlvblwiICYmIHQub25NZXNzYWdlPy5hZGRMaXN0ZW5lciA/IFwiY2hyb21lLXBvcnRcIiA6IHR5cGVvZiBzZWxmIDwgXCJ1XCIgJiYgdCA9PT0gc2VsZiA/IFwic2VsZlwiIDogXCJpbnRlcm5hbFwiIDogXCJpbnRlcm5hbFwiO1xuXHR9XG5cdGZ1bmN0aW9uIFhlKGUpIHtcblx0XHRpZiAoZSBpbnN0YW5jZW9mIFdvcmtlcikgcmV0dXJuIGU7XG5cdFx0aWYgKGUgaW5zdGFuY2VvZiBVUkwpIHJldHVybiBuZXcgV29ya2VyKGUuaHJlZiwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuXHRcdGlmICh0eXBlb2YgZSA9PSBcImZ1bmN0aW9uXCIpIHRyeSB7XG5cdFx0XHRyZXR1cm4gbmV3IGUoeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGUoeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdHlwZW9mIGUgPT0gXCJzdHJpbmdcIiA/IGUuc3RhcnRzV2l0aChcIi9cIikgPyBuZXcgV29ya2VyKFAoZS5yZXBsYWNlKC9eXFwvLywgXCIuL1wiKSksIHsgdHlwZTogXCJtb2R1bGVcIiB9KSA6IFVSTC5jYW5QYXJzZShlKSB8fCBlLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IG5ldyBXb3JrZXIoUChlKSwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pIDogbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KSksIHsgdHlwZTogXCJtb2R1bGVcIiB9KSA6IGUgaW5zdGFuY2VvZiBCbG9iIHx8IGUgaW5zdGFuY2VvZiBGaWxlID8gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKGUpLCB7IHR5cGU6IFwibW9kdWxlXCIgfSkgOiBlID8/ICh0eXBlb2Ygc2VsZiA8IFwidVwiID8gc2VsZiA6IG51bGwpO1xuXHR9XG5cdHZhciBxID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0ZnVuY3Rpb24gbmUoZSA9IHt9KSB7XG5cdFx0Y29uc3QgdCA9IG5ldyBOdChlKTtcblx0XHRyZXR1cm4gZS5uYW1lICYmIHEuc2V0KGUubmFtZSwgdCksIHQ7XG5cdH1cblx0dmFyIEJ0ID0gY2xhc3Mge1xuXHRcdF9jb250ZXh0O1xuXHRcdF9jb25maWc7XG5cdFx0X3N1YnNjcmlwdGlvbnMgPSBbXTtcblx0XHRfaW5jb21pbmdDb25uZWN0aW9ucyA9IG5ldyBfKHsgYnVmZmVyU2l6ZTogMTAwIH0pO1xuXHRcdF9jaGFubmVsQ3JlYXRlZCA9IG5ldyBfKHsgYnVmZmVyU2l6ZTogMTAwIH0pO1xuXHRcdF9jaGFubmVsQ2xvc2VkID0gbmV3IF8oKTtcblx0XHRjb25zdHJ1Y3RvcihlID0ge30pIHtcblx0XHRcdHRoaXMuX2NvbmZpZyA9IHtcblx0XHRcdFx0bmFtZTogZS5uYW1lID8/IFwid29ya2VyXCIsXG5cdFx0XHRcdHdvcmtlck5hbWU6IGUud29ya2VyTmFtZSA/PyBgd29ya2VyLSR7JGUoKS5zbGljZSgwLCA4KX1gLFxuXHRcdFx0XHRhdXRvQWNjZXB0Q2hhbm5lbHM6IGUuYXV0b0FjY2VwdENoYW5uZWxzID8/ICEwLFxuXHRcdFx0XHRhbGxvd2VkQ2hhbm5lbHM6IGUuYWxsb3dlZENoYW5uZWxzID8/IFtdLFxuXHRcdFx0XHRtYXhDaGFubmVsczogZS5tYXhDaGFubmVscyA/PyAxMDAsXG5cdFx0XHRcdGF1dG9Db25uZWN0OiBlLmF1dG9Db25uZWN0ID8/ICEwLFxuXHRcdFx0XHR1c2VHbG9iYWxTZWxmOiAhMCxcblx0XHRcdFx0ZGVmYXVsdE9wdGlvbnM6IGUuZGVmYXVsdE9wdGlvbnMgPz8ge30sXG5cdFx0XHRcdGlzb2xhdGVkU3RvcmFnZTogZS5pc29sYXRlZFN0b3JhZ2UgPz8gITEsXG5cdFx0XHRcdC4uLmVcblx0XHRcdH0sIHRoaXMuX2NvbnRleHQgPSBuZSh7XG5cdFx0XHRcdG5hbWU6IHRoaXMuX2NvbmZpZy5uYW1lLFxuXHRcdFx0XHR1c2VHbG9iYWxTZWxmOiAhMCxcblx0XHRcdFx0ZGVmYXVsdE9wdGlvbnM6IGUuZGVmYXVsdE9wdGlvbnNcblx0XHRcdH0pLCB0aGlzLl9zZXR1cE1lc3NhZ2VMaXN0ZW5lcigpO1xuXHRcdH1cblx0XHRnZXQgb25Db25uZWN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2luY29taW5nQ29ubmVjdGlvbnM7XG5cdFx0fVxuXHRcdGdldCBvbkNoYW5uZWxDcmVhdGVkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxDcmVhdGVkO1xuXHRcdH1cblx0XHRnZXQgb25DaGFubmVsQ2xvc2VkKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxDbG9zZWQ7XG5cdFx0fVxuXHRcdHN1YnNjcmliZUNvbm5lY3Rpb25zKGUpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pbmNvbWluZ0Nvbm5lY3Rpb25zLnN1YnNjcmliZShlKTtcblx0XHR9XG5cdFx0c3Vic2NyaWJlQ2hhbm5lbENyZWF0ZWQoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxDcmVhdGVkLnN1YnNjcmliZShlKTtcblx0XHR9XG5cdFx0YWNjZXB0Q29ubmVjdGlvbihlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX2NhbkFjY2VwdENoYW5uZWwoZS5jaGFubmVsKSkgcmV0dXJuIG51bGw7XG5cdFx0XHRjb25zdCB0ID0gdGhpcy5fY29udGV4dC5jcmVhdGVDaGFubmVsKGUuY2hhbm5lbCwgZS5vcHRpb25zKTtcblx0XHRcdHJldHVybiBlLnBvcnQgJiYgKGUucG9ydC5zdGFydD8uKCksIHQuaGFuZGxlci5jcmVhdGVSZW1vdGVDaGFubmVsKGUuc2VuZGVyLCBlLm9wdGlvbnMsIGUucG9ydCkpLCB0aGlzLl9jaGFubmVsQ3JlYXRlZC5uZXh0KHtcblx0XHRcdFx0Y2hhbm5lbDogZS5jaGFubmVsLFxuXHRcdFx0XHRlbmRwb2ludDogdCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlcixcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpXG5cdFx0XHR9KSwgdGhpcy5fcG9zdENoYW5uZWxDcmVhdGVkKGUuY2hhbm5lbCwgZS5zZW5kZXIsIGUuaWQpLCB0O1xuXHRcdH1cblx0XHRjcmVhdGVDaGFubmVsKGUsIHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb250ZXh0LmNyZWF0ZUNoYW5uZWwoZSwgdCk7XG5cdFx0fVxuXHRcdGdldENoYW5uZWwoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQuZ2V0Q2hhbm5lbChlKTtcblx0XHR9XG5cdFx0aGFzQ2hhbm5lbChlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5oYXNDaGFubmVsKGUpO1xuXHRcdH1cblx0XHRnZXRDaGFubmVsTmFtZXMoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5nZXRDaGFubmVsTmFtZXMoKTtcblx0XHR9XG5cdFx0cXVlcnlDb25uZWN0aW9ucyhlID0ge30pIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb250ZXh0LnF1ZXJ5Q29ubmVjdGlvbnMoZSk7XG5cdFx0fVxuXHRcdG5vdGlmeUNvbm5lY3Rpb25zKGUgPSB7fSwgdCA9IHt9KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5ub3RpZnlDb25uZWN0aW9ucyhlLCB0KTtcblx0XHR9XG5cdFx0Y2xvc2VDaGFubmVsKGUpIHtcblx0XHRcdGNvbnN0IHQgPSB0aGlzLl9jb250ZXh0LmNsb3NlQ2hhbm5lbChlKTtcblx0XHRcdHJldHVybiB0ICYmIHRoaXMuX2NoYW5uZWxDbG9zZWQubmV4dCh7XG5cdFx0XHRcdGNoYW5uZWw6IGUsXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0fSksIHQ7XG5cdFx0fVxuXHRcdGdldCBjb250ZXh0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQ7XG5cdFx0fVxuXHRcdGdldCBjb25maWcoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29uZmlnO1xuXHRcdH1cblx0XHRfc2V0dXBNZXNzYWdlTGlzdGVuZXIoKSB7XG5cdFx0XHRhZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoKGUpID0+IHtcblx0XHRcdFx0dGhpcy5faGFuZGxlSW5jb21pbmdNZXNzYWdlKGUpO1xuXHRcdFx0fSkpO1xuXHRcdH1cblx0XHRfaGFuZGxlSW5jb21pbmdNZXNzYWdlKGUpIHtcblx0XHRcdGNvbnN0IHQgPSBlLmRhdGE7XG5cdFx0XHRpZiAoISghdCB8fCB0eXBlb2YgdCAhPSBcIm9iamVjdFwiKSkgc3dpdGNoICh0LnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcImNyZWF0ZUNoYW5uZWxcIjpcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVDcmVhdGVDaGFubmVsKHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiY29ubmVjdENoYW5uZWxcIjpcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVDb25uZWN0Q2hhbm5lbCh0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImFkZFBvcnRcIjpcblx0XHRcdFx0XHR0aGlzLl9oYW5kbGVBZGRQb3J0KHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibGlzdENoYW5uZWxzXCI6XG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlTGlzdENoYW5uZWxzKHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiY2xvc2VDaGFubmVsXCI6XG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlQ2xvc2VDaGFubmVsKHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicGluZ1wiOlxuXHRcdFx0XHRcdHBvc3RNZXNzYWdlKHtcblx0XHRcdFx0XHRcdHR5cGU6IFwicG9uZ1wiLFxuXHRcdFx0XHRcdFx0aWQ6IHQuaWQsXG5cdFx0XHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogdC5jaGFubmVsICYmIHRoaXMuX2NvbnRleHQuaGFzQ2hhbm5lbCh0LmNoYW5uZWwpICYmIHRoaXMuX2NvbnRleHQuZ2V0Q2hhbm5lbCh0LmNoYW5uZWwpPy5oYW5kbGVyPy5oYW5kbGVBbmRSZXNwb25zZT8uKHQucGF5bG9hZCwgdC5yZXFJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdF9oYW5kbGVDcmVhdGVDaGFubmVsKGUpIHtcblx0XHRcdGNvbnN0IHQgPSB7XG5cdFx0XHRcdGlkOiBlLnJlcUlkID8/ICRlKCksXG5cdFx0XHRcdGNoYW5uZWw6IGUuY2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlciA/PyBcInVua25vd25cIixcblx0XHRcdFx0dHlwZTogXCJjaGFubmVsXCIsXG5cdFx0XHRcdHBvcnQ6IGUubWVzc2FnZVBvcnQsXG5cdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcblx0XHRcdFx0b3B0aW9uczogZS5vcHRpb25zXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5faW5jb21pbmdDb25uZWN0aW9ucy5uZXh0KHQpLCB0aGlzLl9jb25maWcuYXV0b0FjY2VwdENoYW5uZWxzICYmIHRoaXMuYWNjZXB0Q29ubmVjdGlvbih0KTtcblx0XHR9XG5cdFx0X2hhbmRsZUNvbm5lY3RDaGFubmVsKGUpIHtcblx0XHRcdGNvbnN0IHQgPSB7XG5cdFx0XHRcdGlkOiBlLnJlcUlkID8/ICRlKCksXG5cdFx0XHRcdGNoYW5uZWw6IGUuY2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlciA/PyBcInVua25vd25cIixcblx0XHRcdFx0dHlwZTogZS5wb3J0VHlwZSA/PyBcImNoYW5uZWxcIixcblx0XHRcdFx0cG9ydDogZS5wb3J0LFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KCksXG5cdFx0XHRcdG9wdGlvbnM6IGUub3B0aW9uc1xuXHRcdFx0fTtcblx0XHRcdGlmICh0aGlzLl9pbmNvbWluZ0Nvbm5lY3Rpb25zLm5leHQodCksIHRoaXMuX2NvbmZpZy5hdXRvQWNjZXB0Q2hhbm5lbHMgJiYgdGhpcy5fY2FuQWNjZXB0Q2hhbm5lbChlLmNoYW5uZWwpKSB7XG5cdFx0XHRcdGNvbnN0IG4gPSB0aGlzLl9jb250ZXh0LmdldE9yQ3JlYXRlQ2hhbm5lbChlLmNoYW5uZWwsIGUub3B0aW9ucyk7XG5cdFx0XHRcdGUucG9ydCAmJiAoZS5wb3J0LnN0YXJ0Py4oKSwgbi5oYW5kbGVyLmNyZWF0ZVJlbW90ZUNoYW5uZWwoZS5zZW5kZXIsIGUub3B0aW9ucywgZS5wb3J0KSksIHBvc3RNZXNzYWdlKHtcblx0XHRcdFx0XHR0eXBlOiBcImNoYW5uZWxDb25uZWN0ZWRcIixcblx0XHRcdFx0XHRjaGFubmVsOiBlLmNoYW5uZWwsXG5cdFx0XHRcdFx0cmVxSWQ6IGUucmVxSWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdF9oYW5kbGVBZGRQb3J0KGUpIHtcblx0XHRcdGlmICghZS5wb3J0IHx8ICFlLmNoYW5uZWwpIHJldHVybjtcblx0XHRcdGNvbnN0IHQgPSB7XG5cdFx0XHRcdGlkOiBlLnJlcUlkID8/ICRlKCksXG5cdFx0XHRcdGNoYW5uZWw6IGUuY2hhbm5lbCxcblx0XHRcdFx0c2VuZGVyOiBlLnNlbmRlciA/PyBcInVua25vd25cIixcblx0XHRcdFx0dHlwZTogXCJwb3J0XCIsXG5cdFx0XHRcdHBvcnQ6IGUucG9ydCxcblx0XHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpLFxuXHRcdFx0XHRvcHRpb25zOiBlLm9wdGlvbnNcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9pbmNvbWluZ0Nvbm5lY3Rpb25zLm5leHQodCksIHRoaXMuX2NvbmZpZy5hdXRvQWNjZXB0Q2hhbm5lbHMgJiYgdGhpcy5hY2NlcHRDb25uZWN0aW9uKHQpO1xuXHRcdH1cblx0XHRfaGFuZGxlTGlzdENoYW5uZWxzKGUpIHtcblx0XHRcdHBvc3RNZXNzYWdlKHtcblx0XHRcdFx0dHlwZTogXCJjaGFubmVsTGlzdFwiLFxuXHRcdFx0XHRjaGFubmVsczogdGhpcy5nZXRDaGFubmVsTmFtZXMoKSxcblx0XHRcdFx0cmVxSWQ6IGUucmVxSWRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRfaGFuZGxlQ2xvc2VDaGFubmVsKGUpIHtcblx0XHRcdGUuY2hhbm5lbCAmJiAodGhpcy5jbG9zZUNoYW5uZWwoZS5jaGFubmVsKSwgcG9zdE1lc3NhZ2Uoe1xuXHRcdFx0XHR0eXBlOiBcImNoYW5uZWxDbG9zZWRcIixcblx0XHRcdFx0Y2hhbm5lbDogZS5jaGFubmVsLFxuXHRcdFx0XHRyZXFJZDogZS5yZXFJZFxuXHRcdFx0fSkpO1xuXHRcdH1cblx0XHRfY2FuQWNjZXB0Q2hhbm5lbChlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5zaXplID49IHRoaXMuX2NvbmZpZy5tYXhDaGFubmVscyA/ICExIDogdGhpcy5fY29uZmlnLmFsbG93ZWRDaGFubmVscy5sZW5ndGggPiAwID8gdGhpcy5fY29uZmlnLmFsbG93ZWRDaGFubmVscy5pbmNsdWRlcyhlKSA6ICEwO1xuXHRcdH1cblx0XHRfcG9zdENoYW5uZWxDcmVhdGVkKGUsIHQsIG4pIHtcblx0XHRcdHBvc3RNZXNzYWdlKHtcblx0XHRcdFx0dHlwZTogXCJjaGFubmVsQ3JlYXRlZFwiLFxuXHRcdFx0XHRjaGFubmVsOiBlLFxuXHRcdFx0XHRzZW5kZXI6IHQsXG5cdFx0XHRcdHJlcUlkOiBuLFxuXHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KClcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjbG9zZSgpIHtcblx0XHRcdHRoaXMuX3N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoZSkgPT4gZS51bnN1YnNjcmliZSgpKSwgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IFtdLCB0aGlzLl9pbmNvbWluZ0Nvbm5lY3Rpb25zLmNvbXBsZXRlKCksIHRoaXMuX2NoYW5uZWxDcmVhdGVkLmNvbXBsZXRlKCksIHRoaXMuX2NoYW5uZWxDbG9zZWQuY29tcGxldGUoKSwgdGhpcy5fY29udGV4dC5jbG9zZSgpO1xuXHRcdH1cblx0fTtcblx0dmFyIGogPSBudWxsO1xuXHRmdW5jdGlvbiBCZShlKSB7XG5cdFx0cmV0dXJuIGogfHwgKGogPSBuZXcgQnQoZSkpLCBqO1xuXHR9XG5cdHZhciByaSA9IEJlKHsgbmFtZTogXCJ3b3JrZXJcIiB9KTtcblx0dmFyIEIgPSBjbGFzcyB7XG5cdFx0X2NoYW5uZWxOYW1lO1xuXHRcdF9jb25maWc7XG5cdFx0X3BvcnQ7XG5cdFx0X3N1YnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdF9wZW5kaW5nID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfbGlzdGVuaW5nID0gITE7XG5cdFx0X2NsZWFudXAgPSBudWxsO1xuXHRcdF9wb3J0SWQgPSAkZSgpO1xuXHRcdF9zdGF0ZSA9IG5ldyBfKCk7XG5cdFx0X2tlZXBBbGl2ZVRpbWVyID0gbnVsbDtcblx0XHRjb25zdHJ1Y3RvcihlLCB0LCBuID0ge30pIHtcblx0XHRcdHRoaXMuX2NoYW5uZWxOYW1lID0gdCwgdGhpcy5fY29uZmlnID0gbiwgdGhpcy5fcG9ydCA9IGUsIHRoaXMuX3NldHVwUG9ydCgpLCBuLmF1dG9TdGFydCAhPT0gITEgJiYgdGhpcy5zdGFydCgpO1xuXHRcdH1cblx0XHRfc2V0dXBQb3J0KCkge1xuXHRcdFx0Y29uc3QgZSA9IChuKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHMgPSBuLmRhdGE7XG5cdFx0XHRcdGlmIChzLnR5cGUgPT09IFwicmVzcG9uc2VcIiAmJiBzLnJlcUlkKSB7XG5cdFx0XHRcdFx0Y29uc3QgciA9IHRoaXMuX3BlbmRpbmcuZ2V0KHMucmVxSWQpO1xuXHRcdFx0XHRcdGlmIChyKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9wZW5kaW5nLmRlbGV0ZShzLnJlcUlkKSwgcy5wYXlsb2FkPy5lcnJvciA/IHIucmVqZWN0KG5ldyBFcnJvcihzLnBheWxvYWQuZXJyb3IpKSA6IHIucmVzb2x2ZShzLnBheWxvYWQ/LnJlc3VsdCA/PyBzLnBheWxvYWQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocy50eXBlID09PSBcInNpZ25hbFwiICYmIHMucGF5bG9hZD8uYWN0aW9uID09PSBcInBpbmdcIikge1xuXHRcdFx0XHRcdHRoaXMuc2VuZCh7XG5cdFx0XHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0XHRcdGNoYW5uZWw6IHRoaXMuX2NoYW5uZWxOYW1lLFxuXHRcdFx0XHRcdFx0c2VuZGVyOiB0aGlzLl9wb3J0SWQsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInNpZ25hbFwiLFxuXHRcdFx0XHRcdFx0cGF5bG9hZDogeyBhY3Rpb246IFwicG9uZ1wiIH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cy5wb3J0SWQgPSBzLnBvcnRJZCA/PyB0aGlzLl9wb3J0SWQ7XG5cdFx0XHRcdGZvciAoY29uc3QgciBvZiB0aGlzLl9zdWJzKSB0cnkge1xuXHRcdFx0XHRcdHIubmV4dD8uKHMpO1xuXHRcdFx0XHR9IGNhdGNoIChpKSB7XG5cdFx0XHRcdFx0ci5lcnJvcj8uKGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0ID0gKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5uZXh0KFwiZXJyb3JcIik7XG5cdFx0XHRcdGNvbnN0IG4gPSAvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiUG9ydCBlcnJvclwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzIG9mIHRoaXMuX3N1YnMpIHMuZXJyb3I/LihuKTtcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9wb3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGUpLCB0aGlzLl9wb3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlZXJyb3JcIiwgdCksIHRoaXMuX2NsZWFudXAgPSAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX3BvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZSksIHRoaXMuX3BvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCB0KTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHN0YXJ0KCkge1xuXHRcdFx0dGhpcy5fbGlzdGVuaW5nIHx8ICh0aGlzLl9wb3J0LnN0YXJ0KCksIHRoaXMuX2xpc3RlbmluZyA9ICEwLCB0aGlzLl9zdGF0ZS5uZXh0KFwicmVhZHlcIiksIHRoaXMuX2NvbmZpZy5rZWVwQWxpdmUgJiYgdGhpcy5fc3RhcnRLZWVwQWxpdmUoKSk7XG5cdFx0fVxuXHRcdHNlbmQoZSwgdCkge1xuXHRcdFx0Y29uc3QgeyB0cmFuc2ZlcmFibGU6IG4sIC4uLnMgfSA9IGU7XG5cdFx0XHR0aGlzLl9wb3J0LnBvc3RNZXNzYWdlKHtcblx0XHRcdFx0Li4ucyxcblx0XHRcdFx0cG9ydElkOiB0aGlzLl9wb3J0SWRcblx0XHRcdH0sIHQgPz8gW10pO1xuXHRcdH1cblx0XHRyZXF1ZXN0KGUpIHtcblx0XHRcdGNvbnN0IHQgPSBlLnJlcUlkID8/ICRlKCk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKG4sIHMpID0+IHtcblx0XHRcdFx0Y29uc3QgciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3BlbmRpbmcuZGVsZXRlKHQpLCBzKC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJSZXF1ZXN0IHRpbWVvdXRcIikpO1xuXHRcdFx0XHR9LCB0aGlzLl9jb25maWcudGltZW91dCA/PyAzZTQpO1xuXHRcdFx0XHR0aGlzLl9wZW5kaW5nLnNldCh0LCB7XG5cdFx0XHRcdFx0cmVzb2x2ZTogKGkpID0+IHtcblx0XHRcdFx0XHRcdGNsZWFyVGltZW91dChyKSwgbihpKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlamVjdDogKGkpID0+IHtcblx0XHRcdFx0XHRcdGNsZWFyVGltZW91dChyKSwgcyhpKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuXHRcdFx0XHR9KSwgdGhpcy5zZW5kKHtcblx0XHRcdFx0XHQuLi5lLFxuXHRcdFx0XHRcdHJlcUlkOiB0LFxuXHRcdFx0XHRcdHR5cGU6IFwicmVxdWVzdFwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHN1YnNjcmliZShlKSB7XG5cdFx0XHRjb25zdCB0ID0gdHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBlIH0gOiBlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3N1YnMuYWRkKHQpLCB7XG5cdFx0XHRcdGNsb3NlZDogITEsXG5cdFx0XHRcdHVuc3Vic2NyaWJlOiAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fc3Vicy5kZWxldGUodCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdF9zdGFydEtlZXBBbGl2ZSgpIHtcblx0XHRcdHRoaXMuX2tlZXBBbGl2ZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnNlbmQoe1xuXHRcdFx0XHRcdGlkOiAkZSgpLFxuXHRcdFx0XHRcdGNoYW5uZWw6IHRoaXMuX2NoYW5uZWxOYW1lLFxuXHRcdFx0XHRcdHNlbmRlcjogdGhpcy5fcG9ydElkLFxuXHRcdFx0XHRcdHR5cGU6IFwic2lnbmFsXCIsXG5cdFx0XHRcdFx0cGF5bG9hZDogeyBhY3Rpb246IFwicGluZ1wiIH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LCB0aGlzLl9jb25maWcua2VlcEFsaXZlSW50ZXJ2YWwgPz8gM2U0KTtcblx0XHR9XG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9rZWVwQWxpdmVUaW1lciAmJiAoY2xlYXJJbnRlcnZhbCh0aGlzLl9rZWVwQWxpdmVUaW1lciksIHRoaXMuX2tlZXBBbGl2ZVRpbWVyID0gbnVsbCksIHRoaXMuX2NsZWFudXA/LigpLCB0aGlzLl9zdWJzLmZvckVhY2goKGUpID0+IGUuY29tcGxldGU/LigpKSwgdGhpcy5fc3Vicy5jbGVhcigpLCB0aGlzLl9wb3J0LmNsb3NlKCksIHRoaXMuX3N0YXRlLm5leHQoXCJjbG9zZWRcIik7XG5cdFx0fVxuXHRcdGdldCBwb3J0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3BvcnQ7XG5cdFx0fVxuXHRcdGdldCBwb3J0SWQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcG9ydElkO1xuXHRcdH1cblx0XHRnZXQgaXNMaXN0ZW5pbmcoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fbGlzdGVuaW5nO1xuXHRcdH1cblx0XHRnZXQgc3RhdGUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fc3RhdGU7XG5cdFx0fVxuXHRcdGdldCBjaGFubmVsTmFtZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jaGFubmVsTmFtZTtcblx0XHR9XG5cdH07XG5cdGZ1bmN0aW9uIGJlKGUsIHQpIHtcblx0XHRjb25zdCBuID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGxvY2FsOiBuZXcgQihuLnBvcnQxLCBlLCB0KSxcblx0XHRcdHJlbW90ZTogbi5wb3J0Mixcblx0XHRcdHRyYW5zZmVyOiAoKSA9PiBuLnBvcnQyXG5cdFx0fTtcblx0fVxuXHR2YXIgUXQgPSBjbGFzcyB7XG5cdFx0X2RlZmF1bHRDb25maWc7XG5cdFx0X2NoYW5uZWxzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRfbWFpblBvcnQgPSBudWxsO1xuXHRcdF9zdWJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRjb25zdHJ1Y3RvcihlID0ge30pIHtcblx0XHRcdHRoaXMuX2RlZmF1bHRDb25maWcgPSBlO1xuXHRcdH1cblx0XHRjcmVhdGUoZSwgdCkge1xuXHRcdFx0Y29uc3QgbiA9IGJlKGUsIHtcblx0XHRcdFx0Li4udGhpcy5fZGVmYXVsdENvbmZpZyxcblx0XHRcdFx0Li4udFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbi5sb2NhbC5zdWJzY3JpYmUoeyBuZXh0OiAocykgPT4ge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHIgb2YgdGhpcy5fc3VicykgdHJ5IHtcblx0XHRcdFx0XHRyLm5leHQ/LihzKTtcblx0XHRcdFx0fSBjYXRjaCAoaSkge1xuXHRcdFx0XHRcdHIuZXJyb3I/LihpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSB9KSwgdGhpcy5fY2hhbm5lbHMuc2V0KGUsIG4ubG9jYWwpLCBuO1xuXHRcdH1cblx0XHRhZGQoZSwgdCwgbikge1xuXHRcdFx0Y29uc3QgcyA9IG5ldyBCKHQsIGUsIHtcblx0XHRcdFx0Li4udGhpcy5fZGVmYXVsdENvbmZpZyxcblx0XHRcdFx0Li4ublxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcy5zdWJzY3JpYmUoeyBuZXh0OiAocikgPT4ge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGkgb2YgdGhpcy5fc3VicykgdHJ5IHtcblx0XHRcdFx0XHRpLm5leHQ/LihyKTtcblx0XHRcdFx0fSBjYXRjaCAobykge1xuXHRcdFx0XHRcdGkuZXJyb3I/LihvKTtcblx0XHRcdFx0fVxuXHRcdFx0fSB9KSwgdGhpcy5fY2hhbm5lbHMuc2V0KGUsIHMpLCBzO1xuXHRcdH1cblx0XHRnZXQoZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NoYW5uZWxzLmdldChlKTtcblx0XHR9XG5cdFx0c2VuZChlLCB0LCBuKSB7XG5cdFx0XHR0aGlzLl9jaGFubmVscy5nZXQoZSk/LnNlbmQodCwgbik7XG5cdFx0fVxuXHRcdGJyb2FkY2FzdChlLCB0KSB7XG5cdFx0XHRmb3IgKGNvbnN0IG4gb2YgdGhpcy5fY2hhbm5lbHMudmFsdWVzKCkpIG4uc2VuZChlLCB0KTtcblx0XHR9XG5cdFx0cmVxdWVzdChlLCB0KSB7XG5cdFx0XHRjb25zdCBuID0gdGhpcy5fY2hhbm5lbHMuZ2V0KGUpO1xuXHRcdFx0cmV0dXJuIG4gPyBuLnJlcXVlc3QodCkgOiBQcm9taXNlLnJlamVjdCgvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKGBDaGFubmVsICR7ZX0gbm90IGZvdW5kYCkpO1xuXHRcdH1cblx0XHRzdWJzY3JpYmUoZSkge1xuXHRcdFx0Y29uc3QgdCA9IHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIiA/IHsgbmV4dDogZSB9IDogZTtcblx0XHRcdHJldHVybiB0aGlzLl9zdWJzLmFkZCh0KSwge1xuXHRcdFx0XHRjbG9zZWQ6ICExLFxuXHRcdFx0XHR1bnN1YnNjcmliZTogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3N1YnMuZGVsZXRlKHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZW1vdmUoZSkge1xuXHRcdFx0Y29uc3QgdCA9IHRoaXMuX2NoYW5uZWxzLmdldChlKTtcblx0XHRcdHQgJiYgKHQuY2xvc2UoKSwgdGhpcy5fY2hhbm5lbHMuZGVsZXRlKGUpKTtcblx0XHR9XG5cdFx0Y2xvc2UoKSB7XG5cdFx0XHR0aGlzLl9zdWJzLmZvckVhY2goKGUpID0+IGUuY29tcGxldGU/LigpKSwgdGhpcy5fc3Vicy5jbGVhcigpO1xuXHRcdFx0Zm9yIChjb25zdCBlIG9mIHRoaXMuX2NoYW5uZWxzLnZhbHVlcygpKSBlLmNsb3NlKCk7XG5cdFx0XHR0aGlzLl9jaGFubmVscy5jbGVhcigpO1xuXHRcdH1cblx0XHRnZXQgY2hhbm5lbE5hbWVzKCkge1xuXHRcdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy5fY2hhbm5lbHMua2V5cygpKTtcblx0XHR9XG5cdFx0Z2V0IHNpemUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2hhbm5lbHMuc2l6ZTtcblx0XHR9XG5cdH07XG5cdHZhciBUZSA9IGNsYXNzIHtcblx0XHRfdGFyZ2V0O1xuXHRcdF9jaGFubmVsTmFtZTtcblx0XHRfY29uZmlnO1xuXHRcdF90cmFuc3BvcnQgPSBudWxsO1xuXHRcdF9zdGF0ZSA9IG5ldyBfKCk7XG5cdFx0X2hhbmRzaGFrZUNvbXBsZXRlID0gITE7XG5cdFx0Y29uc3RydWN0b3IoZSwgdCwgbiA9IHt9KSB7XG5cdFx0XHR0aGlzLl90YXJnZXQgPSBlLCB0aGlzLl9jaGFubmVsTmFtZSA9IHQsIHRoaXMuX2NvbmZpZyA9IG47XG5cdFx0fVxuXHRcdGFzeW5jIGNvbm5lY3QoKSB7XG5cdFx0XHRpZiAodGhpcy5fdHJhbnNwb3J0ICYmIHRoaXMuX2hhbmRzaGFrZUNvbXBsZXRlKSByZXR1cm4gdGhpcy5fdHJhbnNwb3J0O1xuXHRcdFx0dGhpcy5fc3RhdGUubmV4dChcImNvbm5lY3RpbmdcIik7XG5cdFx0XHRjb25zdCB7IGxvY2FsOiBlLCByZW1vdGU6IHQgfSA9IGJlKHRoaXMuX2NoYW5uZWxOYW1lLCB0aGlzLl9jb25maWcpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3RhcmdldC5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwicG9ydC1jb25uZWN0XCIsXG5cdFx0XHRcdGNoYW5uZWxOYW1lOiB0aGlzLl9jaGFubmVsTmFtZSxcblx0XHRcdFx0cG9ydElkOiBlLnBvcnRJZFxuXHRcdFx0fSwgdGhpcy5fY29uZmlnLnRhcmdldE9yaWdpbiA/PyBcIipcIiwgW3RdKSwgbmV3IFByb21pc2UoKG4sIHMpID0+IHtcblx0XHRcdFx0Y29uc3QgciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHMoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIkhhbmRzaGFrZSB0aW1lb3V0XCIpKSwgdGhpcy5fc3RhdGUubmV4dChcImVycm9yXCIpO1xuXHRcdFx0XHR9LCB0aGlzLl9jb25maWcuaGFuZHNoYWtlVGltZW91dCA/PyAxZTQpLCBpID0gZS5zdWJzY3JpYmUoeyBuZXh0OiAobykgPT4ge1xuXHRcdFx0XHRcdG8udHlwZSA9PT0gXCJzaWduYWxcIiAmJiBvLnBheWxvYWQ/LmFjdGlvbiA9PT0gXCJoYW5kc2hha2UtYWNrXCIgJiYgKGNsZWFyVGltZW91dChyKSwgdGhpcy5faGFuZHNoYWtlQ29tcGxldGUgPSAhMCwgdGhpcy5fdHJhbnNwb3J0ID0gZSwgdGhpcy5fc3RhdGUubmV4dChcImNvbm5lY3RlZFwiKSwgaS51bnN1YnNjcmliZSgpLCBuKGUpKTtcblx0XHRcdFx0fSB9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRzdGF0aWMgbGlzdGVuKGUsIHQsIG4pIHtcblx0XHRcdGNvbnN0IHMgPSAocikgPT4ge1xuXHRcdFx0XHRpZiAoci5kYXRhPy50eXBlICE9PSBcInBvcnQtY29ubmVjdFwiIHx8IHIuZGF0YT8uY2hhbm5lbE5hbWUgIT09IGUgfHwgIXIucG9ydHNbMF0pIHJldHVybjtcblx0XHRcdFx0Y29uc3QgaSA9IG5ldyBCKHIucG9ydHNbMF0sIGUsIG4pO1xuXHRcdFx0XHRpLnNlbmQoe1xuXHRcdFx0XHRcdGlkOiAkZSgpLFxuXHRcdFx0XHRcdGNoYW5uZWw6IGUsXG5cdFx0XHRcdFx0c2VuZGVyOiBpLnBvcnRJZCxcblx0XHRcdFx0XHR0eXBlOiBcInNpZ25hbFwiLFxuXHRcdFx0XHRcdHBheWxvYWQ6IHsgYWN0aW9uOiBcImhhbmRzaGFrZS1hY2tcIiB9XG5cdFx0XHRcdH0pLCB0KGkpO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHMpLCAoKSA9PiBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHMpO1xuXHRcdH1cblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0dGhpcy5fdHJhbnNwb3J0Py5jbG9zZSgpLCB0aGlzLl90cmFuc3BvcnQgPSBudWxsLCB0aGlzLl9oYW5kc2hha2VDb21wbGV0ZSA9ICExLCB0aGlzLl9zdGF0ZS5uZXh0KFwiZGlzY29ubmVjdGVkXCIpO1xuXHRcdH1cblx0XHRnZXQgaXNDb25uZWN0ZWQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZHNoYWtlQ29tcGxldGU7XG5cdFx0fVxuXHRcdGdldCBzdGF0ZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9zdGF0ZTtcblx0XHR9XG5cdFx0Z2V0IHRyYW5zcG9ydCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl90cmFuc3BvcnQ7XG5cdFx0fVxuXHR9O1xuXHRmdW5jdGlvbiB3cyhlLCB0ID0gW10pIHtcblx0XHRyZXR1cm4ga24oe1xuXHRcdFx0cmVxdWVzdDogKG4pID0+IGUucmVxdWVzdChuKSxcblx0XHRcdGNoYW5uZWxOYW1lOiBlLmNoYW5uZWxOYW1lLFxuXHRcdFx0c2VuZGVySWQ6IGUucG9ydElkXG5cdFx0fSwgdCk7XG5cdH1cblx0ZnVuY3Rpb24gdnMoZSwgdCkge1xuXHRcdGNvbnN0IG4gPSB4bih0KTtcblx0XHRyZXR1cm4gZS5zdWJzY3JpYmUoeyBuZXh0OiBhc3luYyAocykgPT4ge1xuXHRcdFx0aWYgKHMudHlwZSAhPT0gXCJyZXF1ZXN0XCIgfHwgIXMucGF5bG9hZD8ucGF0aCkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgeyBhY3Rpb246IHIsIHBhdGg6IGksIGFyZ3M6IG8gfSA9IHMucGF5bG9hZDtcblx0XHRcdGxldCBhLCBjO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YSA9IGF3YWl0IG4ociwgaSwgbyA/PyBbXSk7XG5cdFx0XHR9IGNhdGNoIChsKSB7XG5cdFx0XHRcdGMgPSBsIGluc3RhbmNlb2YgRXJyb3IgPyBsLm1lc3NhZ2UgOiBTdHJpbmcobCk7XG5cdFx0XHR9XG5cdFx0XHRlLnNlbmQoe1xuXHRcdFx0XHRpZDogJGUoKSxcblx0XHRcdFx0Y2hhbm5lbDogcy5zZW5kZXIsXG5cdFx0XHRcdHNlbmRlcjogZS5wb3J0SWQsXG5cdFx0XHRcdHR5cGU6IFwicmVzcG9uc2VcIixcblx0XHRcdFx0cmVxSWQ6IHMucmVxSWQsXG5cdFx0XHRcdHBheWxvYWQ6IGMgPyB7IGVycm9yOiBjIH0gOiB7IHJlc3VsdDogYSB9XG5cdFx0XHR9KTtcblx0XHR9IH0pO1xuXHR9XG5cdHZhciBnaSA9IHtcblx0XHRjcmVhdGU6IChlLCB0LCBuKSA9PiBuZXcgQihlLCB0LCBuKSxcblx0XHRjcmVhdGVQYWlyOiAoZSwgdCkgPT4gYmUoZSwgdCksXG5cdFx0Y3JlYXRlUG9vbDogKGUpID0+IG5ldyBRdChlKSxcblx0XHRjcmVhdGVXaW5kb3dDb25uZWN0b3I6IChlLCB0LCBuKSA9PiBuZXcgVGUoZSwgdCwgbiksXG5cdFx0bGlzdGVuOiBUZS5saXN0ZW4sXG5cdFx0Y3JlYXRlUHJveHk6IHdzLFxuXHRcdGV4cG9zZTogdnNcblx0fTtcblx0dmFyIHhpID0gKGUsIHQgPSBcIndvcmtlclwiKSA9PiB7XG5cdFx0Y29uc3QgbiA9IE9lKHQgPz8gXCJ3b3JrZXJcIik7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKHMpID0+IHtcblx0XHRcdGVbc107XG5cdFx0fSksIG47XG5cdH07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy91dGlscy9vcGZzL09QRlMud29ya2VyLnRzXG5cdHZhciBPUEZTX3dvcmtlcl9leHBvcnRzID0gLyogQF9fUFVSRV9fICovIF9fZXhwb3J0QWxsKHtcblx0XHRnZXREaXJIYW5kbGU6ICgpID0+IGdldERpckhhbmRsZSxcblx0XHRnZXRGaWxlU3lzdGVtUm9vdDogKCkgPT4gZ2V0RmlsZVN5c3RlbVJvb3QsXG5cdFx0aGFuZGxlcnM6ICgpID0+IGhhbmRsZXJzLFxuXHRcdG5vcm1hbGl6ZVBhdGg6ICgpID0+IG5vcm1hbGl6ZVBhdGgsXG5cdFx0cmVzb2x2ZUZpbGVTeXN0ZW1IYW5kbGU6ICgpID0+IHJlc29sdmVGaWxlU3lzdGVtSGFuZGxlXG5cdH0pO1xuXHR2YXIgbWFwcGVkUm9vdHMsIGFjdGl2ZU9ic2VydmVycywgZ2V0RmlsZVN5c3RlbVJvb3QsIG5vcm1hbGl6ZVBhdGgsIHJlc29sdmVGaWxlU3lzdGVtSGFuZGxlLCBnZXREaXJIYW5kbGUsIGhhbmRsZXJzLCBTV19CUklER0VfQ0hBTk5FTF9OQU1FLCBzd0JyaWRnZUNoYW5uZWw7XG5cdHZhciBpbml0X09QRlNfd29ya2VyID0gX19lc21NaW4oKCgpID0+IHtcblx0XHRtYXBwZWRSb290cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdFx0YWN0aXZlT2JzZXJ2ZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0XHRnZXRGaWxlU3lzdGVtUm9vdCA9IGFzeW5jIChpZCA9IFwiXCIpID0+IHtcblx0XHRcdGlmIChpZCAmJiBtYXBwZWRSb290cy5oYXMoaWQpKSByZXR1cm4gbWFwcGVkUm9vdHMuZ2V0KGlkKTtcblx0XHRcdHJldHVybiBhd2FpdCBuYXZpZ2F0b3Iuc3RvcmFnZS5nZXREaXJlY3RvcnkoKTtcblx0XHR9O1xuXHRcdG5vcm1hbGl6ZVBhdGggPSAocGF0aCkgPT4ge1xuXHRcdFx0cmV0dXJuIHBhdGg/LnRyaW0/LigpPy5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKSB8fCBcIi9cIjtcblx0XHR9O1xuXHRcdHJlc29sdmVGaWxlU3lzdGVtSGFuZGxlID0gYXN5bmMgKHJvb3QsIHBhdGgsIGNyZWF0ZSA9IGZhbHNlKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IG5vcm1hbGl6ZVBhdGgocGF0aCkuc3BsaXQoXCIvXCIpLmZpbHRlcigocCkgPT4gcCAmJiBwICE9PSBcIi5cIik7XG5cdFx0XHRsZXQgY3VycmVudCA9IHJvb3Q7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcblx0XHRcdFx0aWYgKGkgPT09IHBhcnRzLmxlbmd0aCAtIDEpIHRyeSB7XG5cdFx0XHRcdFx0cmV0dXJuIGF3YWl0IGN1cnJlbnQuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlIH0pO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGF3YWl0IGN1cnJlbnQuZ2V0RmlsZUhhbmRsZShwYXJ0LCB7IGNyZWF0ZSB9KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRpZiAoY3JlYXRlKSB0aHJvdyBlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgY3VycmVudCA9IGF3YWl0IGN1cnJlbnQuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlIH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGN1cnJlbnQ7XG5cdFx0fTtcblx0XHRnZXREaXJIYW5kbGUgPSBhc3luYyAocm9vdCwgcGF0aCwgY3JlYXRlKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IG5vcm1hbGl6ZVBhdGgocGF0aCkuc3BsaXQoXCIvXCIpLmZpbHRlcigocCkgPT4gcCk7XG5cdFx0XHRsZXQgY3VycmVudCA9IHJvb3Q7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIGN1cnJlbnQgPSBhd2FpdCBjdXJyZW50LmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZSB9KTtcblx0XHRcdHJldHVybiBjdXJyZW50O1xuXHRcdH07XG5cdFx0aGFuZGxlcnMgPSB7XG5cdFx0XHRtb3VudDogYXN5bmMgKHsgaWQsIGhhbmRsZSB9KSA9PiB7XG5cdFx0XHRcdG1hcHBlZFJvb3RzLnNldChpZCwgaGFuZGxlKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXHRcdFx0dW5tb3VudDogYXN5bmMgKHsgaWQgfSkgPT4ge1xuXHRcdFx0XHRtYXBwZWRSb290cy5kZWxldGUoaWQpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cdFx0XHRyZWFkRGlyZWN0b3J5OiBhc3luYyAoeyByb290SWQsIHBhdGgsIGNyZWF0ZSB9KSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9vdCA9IGF3YWl0IGdldEZpbGVTeXN0ZW1Sb290KHJvb3RJZCk7XG5cdFx0XHRcdFx0Y29uc3QgaGFuZGxlID0gYXdhaXQgZ2V0RGlySGFuZGxlKHJvb3QsIHBhdGgsIGNyZWF0ZSk7XG5cdFx0XHRcdFx0Y29uc3QgZW50cmllcyA9IFtdO1xuXHRcdFx0XHRcdGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBoYW5kbGUuZW50cmllcygpKSBlbnRyaWVzLnB1c2goW25hbWUsIGVudHJ5XSk7XG5cdFx0XHRcdFx0cmV0dXJuIGVudHJpZXM7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oXCJXb3JrZXIgcmVhZERpcmVjdG9yeSBlcnJvcjpcIiwgZSk7XG5cdFx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cmVhZEZpbGU6IGFzeW5jICh7IHJvb3RJZCwgcGF0aCwgdHlwZSB9KSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9vdCA9IGF3YWl0IGdldEZpbGVTeXN0ZW1Sb290KHJvb3RJZCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFydHMgPSBub3JtYWxpemVQYXRoKHBhdGgpLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHApID0+IHApO1xuXHRcdFx0XHRcdGNvbnN0IGZpbGVuYW1lID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdFx0Y29uc3QgZGlyUGF0aCA9IHBhcnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSBhd2FpdCAoYXdhaXQgKGF3YWl0IGdldERpckhhbmRsZShyb290LCBkaXJQYXRoLCBmYWxzZSkpLmdldEZpbGVIYW5kbGUoZmlsZW5hbWUsIHsgY3JlYXRlOiBmYWxzZSB9KSkuZ2V0RmlsZSgpO1xuXHRcdFx0XHRcdGlmICh0eXBlID09PSBcInRleHRcIikgcmV0dXJuIGF3YWl0IGZpbGUudGV4dCgpO1xuXHRcdFx0XHRcdGlmICh0eXBlID09PSBcImFycmF5QnVmZmVyXCIpIHJldHVybiBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCk7XG5cdFx0XHRcdFx0aWYgKHR5cGUgPT09IFwiYmxvYlwiKSByZXR1cm4gZmlsZTtcblx0XHRcdFx0XHRyZXR1cm4gZmlsZTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGNvbnNvbGUud2FybihcIldvcmtlciByZWFkRmlsZSBlcnJvcjpcIiwgZSk7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR3cml0ZUZpbGU6IGFzeW5jICh7IHJvb3RJZCwgcGF0aCwgZGF0YSB9KSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9vdCA9IGF3YWl0IGdldEZpbGVTeXN0ZW1Sb290KHJvb3RJZCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFydHMgPSBub3JtYWxpemVQYXRoKHBhdGgpLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHApID0+IHApO1xuXHRcdFx0XHRcdGNvbnN0IGZpbGVuYW1lID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdFx0Y29uc3QgZGlyUGF0aCA9IHBhcnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgKGF3YWl0IChhd2FpdCBnZXREaXJIYW5kbGUocm9vdCwgZGlyUGF0aCwgdHJ1ZSkpLmdldEZpbGVIYW5kbGUoZmlsZW5hbWUsIHsgY3JlYXRlOiB0cnVlIH0pKS5jcmVhdGVXcml0YWJsZSgpO1xuXHRcdFx0XHRcdGF3YWl0IHdyaXRhYmxlLndyaXRlKGRhdGEpO1xuXHRcdFx0XHRcdGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oXCJXb3JrZXIgd3JpdGVGaWxlIGVycm9yOlwiLCBlKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRyZW1vdmU6IGFzeW5jICh7IHJvb3RJZCwgcGF0aCwgcmVjdXJzaXZlIH0pID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCByb290ID0gYXdhaXQgZ2V0RmlsZVN5c3RlbVJvb3Qocm9vdElkKTtcblx0XHRcdFx0XHRjb25zdCBwYXJ0cyA9IG5vcm1hbGl6ZVBhdGgocGF0aCkuc3BsaXQoXCIvXCIpLmZpbHRlcigocCkgPT4gcCk7XG5cdFx0XHRcdFx0Y29uc3QgbmFtZSA9IHBhcnRzLnBvcCgpO1xuXHRcdFx0XHRcdGNvbnN0IGRpclBhdGggPSBwYXJ0cy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRhd2FpdCAoYXdhaXQgZ2V0RGlySGFuZGxlKHJvb3QsIGRpclBhdGgsIGZhbHNlKSkucmVtb3ZlRW50cnkobmFtZSwgeyByZWN1cnNpdmUgfSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRvYnNlcnZlOiBhc3luYyAoeyByb290SWQsIHBhdGgsIGlkIH0pID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRpZiAoYWN0aXZlT2JzZXJ2ZXJzLmhhcyhpZCkpIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdGNvbnN0IHJvb3QgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUm9vdChyb290SWQpO1xuXHRcdFx0XHRcdGNvbnN0IGhhbmRsZSA9IGF3YWl0IGdldERpckhhbmRsZShyb290LCBwYXRoLCBmYWxzZSk7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBGaWxlU3lzdGVtT2JzZXJ2ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IEZpbGVTeXN0ZW1PYnNlcnZlcigocmVjb3JkcykgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzID0gcmVjb3Jkcy5tYXAoKHIpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuYW1lID0gci5jaGFuZ2VkSGFuZGxlPy5uYW1lIHx8IHIucmVsYXRpdmVQYXRoQ29tcG9uZW50cz8uYXQoLTEpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiByLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0a2luZDogci5jaGFuZ2VkSGFuZGxlPy5raW5kIHx8IChuYW1lPy5pbmNsdWRlcyhcIi5cIikgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0aGFuZGxlOiByLmNoYW5nZWRIYW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXRoOiByLnJlbGF0aXZlUGF0aENvbXBvbmVudHMuam9pbihcIi9cIilcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0c2VsZi5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJvYnNlcnZhdGlvblwiLFxuXHRcdFx0XHRcdFx0XHRcdGlkLFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9ic2VydmVyLm9ic2VydmUoaGFuZGxlKTtcblx0XHRcdFx0XHRcdGFjdGl2ZU9ic2VydmVycy5zZXQoaWQsIG9ic2VydmVyKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR1bm9ic2VydmU6IGFzeW5jICh7IGlkIH0pID0+IHtcblx0XHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBhY3RpdmVPYnNlcnZlcnMuZ2V0KGlkKTtcblx0XHRcdFx0aWYgKG9ic2VydmVyKSB7XG5cdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdGFjdGl2ZU9ic2VydmVycy5kZWxldGUoaWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHRcdGNvcHk6IGFzeW5jICh7IGZyb20sIHRvIH0pID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBjb3B5UmVjdXJzaXZlID0gYXN5bmMgKHNvdXJjZSwgZGVzdCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHNvdXJjZS5raW5kID09PSBcImRpcmVjdG9yeVwiKSBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygc291cmNlLmVudHJpZXMoKSkgaWYgKGVudHJ5LmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3RGVzdCA9IGF3YWl0IGRlc3QuZ2V0RGlyZWN0b3J5SGFuZGxlKG5hbWUsIHsgY3JlYXRlOiB0cnVlIH0pO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBjb3B5UmVjdXJzaXZlKGVudHJ5LCBuZXdEZXN0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZpbGUgPSBhd2FpdCBlbnRyeS5nZXRGaWxlKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgKGF3YWl0IGRlc3QuZ2V0RmlsZUhhbmRsZShuYW1lLCB7IGNyZWF0ZTogdHJ1ZSB9KSkuY3JlYXRlV3JpdGFibGUoKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgd3JpdGFibGUud3JpdGUoZmlsZSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZmlsZSA9IGF3YWl0IHNvdXJjZS5nZXRGaWxlKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZGVzdC5jcmVhdGVXcml0YWJsZSgpO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB3cml0YWJsZS53cml0ZShmaWxlKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGF3YWl0IGNvcHlSZWN1cnNpdmUoZnJvbSwgdG8pO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKFwiV29ya2VyIGNvcHkgZXJyb3I6XCIsIGUpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0U1dfQlJJREdFX0NIQU5ORUxfTkFNRSA9IFwib3Bmcy1zdy1icmlkZ2UtdjFcIjtcblx0XHRzd0JyaWRnZUNoYW5uZWwgPSBudWxsO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAodHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0c3dCcmlkZ2VDaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoU1dfQlJJREdFX0NIQU5ORUxfTkFNRSk7XG5cdFx0XHRcdHN3QnJpZGdlQ2hhbm5lbC5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCBkYXRhID0gZXZlbnQ/LmRhdGEgfHwge307XG5cdFx0XHRcdFx0aWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG5cdFx0XHRcdFx0aWYgKGRhdGE/LnR5cGUgIT09IFwib3Bmcy1zdy1yZXF1ZXN0XCIpIHJldHVybjtcblx0XHRcdFx0XHRjb25zdCByZXF1ZXN0SWQgPSBTdHJpbmcoZGF0YT8ucmVxdWVzdElkIHx8IFwiXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGFjdGlvbiA9IFN0cmluZyhkYXRhPy5hY3Rpb24gfHwgXCJcIik7XG5cdFx0XHRcdFx0Y29uc3QgcGF5bG9hZCA9IGRhdGE/LnBheWxvYWQ7XG5cdFx0XHRcdFx0aWYgKCFyZXF1ZXN0SWQgfHwgIWFjdGlvbikgcmV0dXJuO1xuXHRcdFx0XHRcdGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1thY3Rpb25dO1xuXHRcdFx0XHRcdGlmICghaGFuZGxlcikge1xuXHRcdFx0XHRcdFx0c3dCcmlkZ2VDaGFubmVsPy5wb3N0TWVzc2FnZT8uKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJvcGZzLXN3LXJlc3BvbnNlXCIsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RJZCxcblx0XHRcdFx0XHRcdFx0b2s6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRlcnJvcjogYFVua25vd24gb3BlcmF0aW9uIHR5cGU6ICR7YWN0aW9ufWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihwYXlsb2FkKTtcblx0XHRcdFx0XHRcdHN3QnJpZGdlQ2hhbm5lbD8ucG9zdE1lc3NhZ2U/Lih7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwib3Bmcy1zdy1yZXNwb25zZVwiLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SWQsXG5cdFx0XHRcdFx0XHRcdG9rOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRyZXN1bHRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRzd0JyaWRnZUNoYW5uZWw/LnBvc3RNZXNzYWdlPy4oe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIm9wZnMtc3ctcmVzcG9uc2VcIixcblx0XHRcdFx0XHRcdFx0cmVxdWVzdElkLFxuXHRcdFx0XHRcdFx0XHRvazogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGVycm9yOiBlcnJvcj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRzd0JyaWRnZUNoYW5uZWwgPSBudWxsO1xuXHRcdH1cblx0XHRzZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jIChlKSA9PiB7XG5cdFx0XHRpZiAoIWUuZGF0YSB8fCB0eXBlb2YgZS5kYXRhICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG5cdFx0XHRjb25zdCB7IGlkLCB0eXBlLCBwYXlsb2FkIH0gPSBlLmRhdGE7XG5cdFx0XHRpZiAoaGFuZGxlcnNbdHlwZV0pIHRyeSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXJzW3R5cGVdKHBheWxvYWQpO1xuXHRcdFx0XHRzZWxmLnBvc3RNZXNzYWdlKHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRyZXN1bHRcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRzZWxmLnBvc3RNZXNzYWdlKHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRlcnJvcjogZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGlkKSBzZWxmLnBvc3RNZXNzYWdlKHtcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGVycm9yOiBgVW5rbm93biBvcGVyYXRpb24gdHlwZTogJHt0eXBlfWBcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9KSk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy91dGlscy9vcGZzL09QRlMudW5pZm9ybS53b3JrZXIudHNcblx0aW5pdF9PUEZTX3dvcmtlcigpO1xuXHRpZiAoaGFuZGxlcnMpIHhpKGhhbmRsZXJzKTtcblx0Y29uc3QgcHJvY2Vzc01lc3NhZ2UgPSBhc3luYyAoZW52ZWxvcGUpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGVudmVsb3BlLnR5cGUgPT09IFwiYmF0Y2hcIikge1xuXHRcdFx0XHRjb25zdCByZXN1bHRzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgbXNnIG9mIGVudmVsb3BlLnBheWxvYWQpIHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzU2luZ2xlTWVzc2FnZShtc2cpO1xuXHRcdFx0XHRcdHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0fSBlbHNlIHJldHVybiBhd2FpdCBwcm9jZXNzU2luZ2xlTWVzc2FnZShlbnZlbG9wZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJbT1BGUyBXb3JrZXJdIE1lc3NhZ2UgcHJvY2Vzc2luZyBlcnJvcjpcIiwgZXJyb3IpO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBwcm9jZXNzU2luZ2xlTWVzc2FnZSA9IGFzeW5jIChlbnZlbG9wZSkgPT4ge1xuXHRcdGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1tlbnZlbG9wZS50eXBlXTtcblx0XHRpZiAoIWhhbmRsZXIpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7ZW52ZWxvcGUudHlwZX1gKTtcblx0XHRyZXR1cm4gYXdhaXQgaGFuZGxlcihlbnZlbG9wZS5wYXlsb2FkKTtcblx0fTtcblx0Z2xvYmFsVGhpcy5wcm9jZXNzTWVzc2FnZSA9IHByb2Nlc3NNZXNzYWdlO1xuXHRjb25zdCBpbml0V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBoYW5kbGVycyA9IChhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X09QRlNfd29ya2VyKCksIE9QRlNfd29ya2VyX2V4cG9ydHMpKSkuaGFuZGxlcnM7XG5cdFx0XHRpZiAoaGFuZGxlcnMpIHhpKGhhbmRsZXJzKTtcblx0XHRcdGNvbnNvbGUubG9nKFwiW09QRlMgV29ya2VyXSBJbml0aWFsaXplZCB3aXRoIGhhbmRsZXJzOlwiLCBPYmplY3Qua2V5cyhoYW5kbGVycyB8fCB7fSkpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiW09QRlMgV29ya2VyXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZTpcIiwgZXJyb3IpO1xuXHRcdH1cblx0fTtcblx0aW5pdFdvcmtlcigpO1xuXG4vLyNlbmRyZWdpb25cbn0pKCk7Il0sCiAgIm1hcHBpbmdzIjogImNBQUMsVUFBVyxDQUdYLElBQUlBLEVBQVksT0FBTyxlQUNuQkMsR0FBVyxDQUFDQyxFQUFJQyxFQUFLQyxJQUFRLElBQU0sQ0FDdEMsR0FBSUEsRUFBSyxNQUFNQSxFQUFJLENBQUMsRUFDcEIsR0FBSSxDQUNILE9BQU9GLElBQU9DLEVBQU1ELEVBQUdBLEVBQUssQ0FBQyxHQUFJQyxDQUNsQyxPQUFTRSxFQUFHLENBQ1gsTUFBTUQsRUFBTSxDQUFDQyxDQUFDLEVBQUdBLENBQ2xCLENBQ0QsRUFDSUMsR0FBYyxDQUFDQyxFQUFLQyxJQUFlLENBQ3RDLElBQUlDLEVBQVMsQ0FBQyxFQUNkLFFBQVNDLEtBQVFILEVBQ2hCUCxFQUFVUyxFQUFRQyxFQUFNLENBQ3ZCLElBQUtILEVBQUlHLENBQUksRUFDYixXQUFZLEVBQ2IsQ0FBQyxFQUVGLE9BQUtGLEdBQ0pSLEVBQVVTLEVBQVEsT0FBTyxZQUFhLENBQUUsTUFBTyxRQUFTLENBQUMsRUFFbkRBLENBQ1IsRUFJQSxTQUFTRSxJQUFNLENBQ2QsTUFBTSxFQUFJLFdBQ1YsR0FBSSxPQUFPLEVBQUUsYUFBZSxXQUFZLE9BQ3hDLE1BQU0sRUFBSSxLQUFNLENBQUMsRUFBR0MsRUFBS0MsR0FBTSxDQUM5QixPQUFPLEVBQUVBLENBQUMsR0FBSyxhQUFlLEVBQUVBLENBQUMsRUFBSSxFQUN0QyxFQUNBRCxFQUFFLGFBQWEsRUFBR0EsRUFBRSxNQUFNLEVBQUdBLEVBQUUsU0FBUyxFQUFHQSxFQUFFLGFBQWEsRUFBR0EsRUFBRSxZQUFZLEVBQUdBLEVBQUUsTUFBTSxFQUFHQSxFQUFFLFNBQVMsRUFBR0EsRUFBRSxrQkFBa0IsRUFBR0EsRUFBRSxZQUFZLEVBQUdBLEVBQUUsY0FBYyxFQUFHQSxFQUFFLFVBQVUsRUFBR0EsRUFBRSxpQkFBaUIsRUFBR0EsRUFBRSxpQkFBaUIs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LENBQ25DLE1BQU1ILEVBQVMsTUFBTU0sR0FBcUJELENBQUcsRUFDN0NELEVBQVEsS0FBS0osQ0FBTSxDQUNwQixDQUNBLE9BQU9JLENBQ1IsS0FBTyxRQUFPLE1BQU1FLEdBQXFCSCxDQUFRLENBQ2xELE9BQVNGLEVBQU8sQ0FDZixjQUFRLE1BQU0sMENBQTJDQSxDQUFLLEVBQ3hEQSxDQUNQLENBQ0QsRUFDTUssR0FBdUIsTUFBT0gsR0FBYSxDQUNoRCxNQUFNSixFQUFVdkMsRUFBUzJDLEVBQVMsSUFBSSxFQUN0QyxHQUFJLENBQUNKLEVBQVMsTUFBTSxJQUFJLE1BQU0seUJBQXlCSSxFQUFTLElBQUksRUFBRSxFQUN0RSxPQUFPLE1BQU1KLEVBQVFJLEVBQVMsT0FBTyxDQUN0QyxFQUNBLFdBQVcsZUFBaUJELElBQ1QsU0FBWSxDQUM5QixHQUFJLENBQ0gsTUFBTTFDLEdBQVksTUFBTSxRQUFRLFFBQVEsRUFBRSxLQUFLLEtBQU9PLEdBQWlCLEVBQUdWLEdBQW9CLEdBQUcsU0FDN0ZHLEdBQVVKLEdBQUdJLENBQVEsRUFDekIsUUFBUSxJQUFJLDJDQUE0QyxPQUFPLEtBQUtBLEdBQVksQ0FBQyxDQUFDLENBQUMsQ0FDcEYsT0FBU3lDLEVBQU8sQ0FDZixRQUFRLE1BQU0sc0NBQXVDQSxDQUFLLENBQzNELENBQ0QsR0FDVyxDQUdaLEdBQUciLAogICJuYW1lcyI6IFsiX19kZWZQcm9wIiwgIl9fZXNtTWluIiwgImZuIiwgInJlcyIsICJlcnIiLCAiZSIsICJfX2V4cG9ydEFsbCIsICJhbGwiLCAibm9fc3ltYm9scyIsICJ0YXJnZXQiLCAibmFtZSIsICJYJDEiLCAiciIsICJuIiwgIlokMSIsICJpIiwgIkRlJDEiLCAiWSIsICJzIiwgIk5lIiwgIkYiLCAiZyIsICJRJDEiLCAiYyIsICJ0ZSQxIiwgInJlJDEiLCAiJGUiLCAiViIsICJzZSIsICJiIiwgIm9lIiwgInB0JDEiLCAiJCIsICJsZSIsICJPIiwgImYiLCAicCIsICJIJDEiLCAieWUiLCAiaGUiLCAiZCIsICJvbiIsICJhbiIsICJaIiwgIlJlIiwgInYiLCAibyIsICJhIiwgIl8iLCAidXQiLCAiSCIsICJLZSIsICJibiIsICJ5biIsICJwdCIsICJfdCIsICJDbiIsICJxbiIsICJRIiwgImVlIiwgIm10IiwgIlllIiwgImRlIiwgInhuIiwgIkxuIiwgImtuIiwgIkVuIiwgIkluIiwgIlRuIiwgImJ0IiwgInl0IiwgImZlIiwgIlB0IiwgIk10IiwgIlMiLCAicmUiLCAidGUiLCAiQyIsICJDdCIsICJQIiwgInciLCAid2UiLCAieHQiLCAia3QiLCAiQW4iLCAiRGUiLCAiT2UiLCAidWUiLCAiUm4iLCAiRCIsICJ2ZSIsICJYIiwgIkV0IiwgIkwiLCAiSXQiLCAiT24iLCAiRG4iLCAiUiIsICJUdCIsICJ1IiwgInkiLCAieCIsICJzbiIsICJCbiIsICJXbiIsICJMZSIsICJBdCIsICJZbiIsICJKbiIsICJYbiIsICJabiIsICJKIiwgIlJ0IiwgIkplIiwgImVzIiwgInF0IiwgIk90IiwgIkEiLCAidHMiLCAiTHQiLCAiTnQiLCAiWGUiLCAiRHQiLCAicSIsICJuZSIsICJCdCIsICJqIiwgIkJlIiwgInJpIiwgIkIiLCAiYmUiLCAiUXQiLCAid3MiLCAidnMiLCAiZ2kiLCAieGkiLCAiT1BGU193b3JrZXJfZXhwb3J0cyIsICJnZXREaXJIYW5kbGUiLCAiZ2V0RmlsZVN5c3RlbVJvb3QiLCAiaGFuZGxlcnMiLCAibm9ybWFsaXplUGF0aCIsICJyZXNvbHZlRmlsZVN5c3RlbUhhbmRsZSIsICJtYXBwZWRSb290cyIsICJhY3RpdmVPYnNlcnZlcnMiLCAiU1dfQlJJREdFX0NIQU5ORUxfTkFNRSIsICJzd0JyaWRnZUNoYW5uZWwiLCAiaW5pdF9PUEZTX3dvcmtlciIsICJpZCIsICJwYXRoIiwgInJvb3QiLCAiY3JlYXRlIiwgInBhcnRzIiwgImN1cnJlbnQiLCAicGFydCIsICJoYW5kbGUiLCAicm9vdElkIiwgImVudHJpZXMiLCAiZW50cnkiLCAidHlwZSIsICJmaWxlbmFtZSIsICJkaXJQYXRoIiwgImZpbGUiLCAiZGF0YSIsICJ3cml0YWJsZSIsICJyZWN1cnNpdmUiLCAib2JzZXJ2ZXIiLCAicmVjb3JkcyIsICJjaGFuZ2VzIiwgImZyb20iLCAidG8iLCAiY29weVJlY3Vyc2l2ZSIsICJzb3VyY2UiLCAiZGVzdCIsICJuZXdEZXN0IiwgImV2ZW50IiwgInJlcXVlc3RJZCIsICJhY3Rpb24iLCAicGF5bG9hZCIsICJoYW5kbGVyIiwgInJlc3VsdCIsICJlcnJvciIsICJwcm9jZXNzTWVzc2FnZSIsICJlbnZlbG9wZSIsICJyZXN1bHRzIiwgIm1zZyIsICJwcm9jZXNzU2luZ2xlTWVzc2FnZSJdCn0K