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