angular-debug-recorder 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -9
- package/esm2022/angular-debug-recorder.mjs +1 -1
- package/esm2022/lib/action-list/action-list.component.mjs +1 -1
- package/esm2022/lib/debug-panel/debug-panel.component.mjs +1 -1
- package/esm2022/lib/models/recorded-action.model.mjs +1 -1
- package/esm2022/lib/services/ai-generator.service.mjs +1 -1
- package/esm2022/lib/services/recorder.service.mjs +162 -71
- package/esm2022/lib/services/rrweb-recorder.service.mjs +1 -1
- package/esm2022/lib/session-replay/session-replay.component.mjs +83 -3
- package/esm2022/lib/settings-dialog/settings-dialog.component.mjs +1 -1
- package/esm2022/lib/test-preview/test-preview.component.mjs +1 -1
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/angular-debug-recorder.mjs +243 -72
- package/fesm2022/angular-debug-recorder.mjs.map +1 -1
- package/lib/services/recorder.service.d.ts +38 -2
- package/lib/session-replay/session-replay.component.d.ts +3 -0
- package/package.json +1 -1
|
@@ -1,8 +1,37 @@
|
|
|
1
1
|
import { Injectable, signal, computed } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Performance notes
|
|
5
|
+
* ─────────────────
|
|
6
|
+
* All DOM event listeners are registered **outside Angular's NgZone**
|
|
7
|
+
* (zone.runOutsideAngular). This means a click, input, or scroll never
|
|
8
|
+
* triggers Angular Change Detection by itself.
|
|
9
|
+
*
|
|
10
|
+
* Recorded actions are batched in a plain array and flushed once per
|
|
11
|
+
* animation frame via requestAnimationFrame. Only the RAF callback runs
|
|
12
|
+
* inside zone.run() → at most one CD cycle per frame, regardless of how
|
|
13
|
+
* many events fired.
|
|
14
|
+
*
|
|
15
|
+
* Why this matters for OnPush host apps
|
|
16
|
+
* ──────────────────────────────────────
|
|
17
|
+
* When this recorder is embedded in a library used inside an OnPush app,
|
|
18
|
+
* the old zone.run()-per-event approach caused the host app's CD to run
|
|
19
|
+
* on every user interaction. With this implementation the host app is
|
|
20
|
+
* completely unaffected — only the recorder's own signals trigger CD.
|
|
21
|
+
*
|
|
22
|
+
* F5 / page-reload survival
|
|
23
|
+
* ─────────────────────────
|
|
24
|
+
* The active recording session is written to sessionStorage on
|
|
25
|
+
* beforeunload and restored in the constructor. If the user accidentally
|
|
26
|
+
* refreshes mid-recording, no actions are lost.
|
|
27
|
+
*/
|
|
3
28
|
export class RecorderService {
|
|
29
|
+
// ─── SessionStorage keys ──────────────────────────────────────────────
|
|
30
|
+
static { this.SESSION_KEY = 'dr_active_session'; }
|
|
31
|
+
static { this.SESSIONS_KEY = 'dr_sessions'; }
|
|
4
32
|
constructor(zone) {
|
|
5
33
|
this.zone = zone;
|
|
34
|
+
// ─── Reactive state ───────────────────────────────────────────────────
|
|
6
35
|
this._isRecording = signal(false);
|
|
7
36
|
this._currentSession = signal(null);
|
|
8
37
|
this._sessions = signal([]);
|
|
@@ -12,9 +41,19 @@ export class RecorderService {
|
|
|
12
41
|
this.currentSession = computed(() => this._currentSession());
|
|
13
42
|
this.sessions = computed(() => this._sessions());
|
|
14
43
|
this.actionCount = computed(() => this._currentSession()?.actions.length ?? 0);
|
|
44
|
+
// ─── RAF batch buffer ─────────────────────────────────────────────────
|
|
45
|
+
this.pendingActions = [];
|
|
46
|
+
// ─── Listener registry ────────────────────────────────────────────────
|
|
15
47
|
this.listeners = [];
|
|
16
48
|
this.lastScrollTime = 0;
|
|
49
|
+
this.restoreFromStorage();
|
|
50
|
+
// Register outside Angular zone — zone.js intercepts beforeunload
|
|
51
|
+
// inside the zone and may suppress it (dialog-return handling).
|
|
52
|
+
this.zone.runOutsideAngular(() => {
|
|
53
|
+
window.addEventListener('beforeunload', () => this.persistToStorage());
|
|
54
|
+
});
|
|
17
55
|
}
|
|
56
|
+
// ─── Public API ───────────────────────────────────────────────────────
|
|
18
57
|
startRecording(name, description) {
|
|
19
58
|
const session = {
|
|
20
59
|
id: this.generateId(),
|
|
@@ -29,9 +68,15 @@ export class RecorderService {
|
|
|
29
68
|
this._isRecording.set(true);
|
|
30
69
|
this._isPaused.set(false);
|
|
31
70
|
this.attachListeners();
|
|
32
|
-
this.recordNavigation(
|
|
71
|
+
this.recordNavigation(window.location.href);
|
|
33
72
|
}
|
|
34
73
|
stopRecording() {
|
|
74
|
+
// Flush pending actions synchronously before tearing down
|
|
75
|
+
if (this.rafId !== undefined) {
|
|
76
|
+
cancelAnimationFrame(this.rafId);
|
|
77
|
+
this.rafId = undefined;
|
|
78
|
+
}
|
|
79
|
+
this.flushPending();
|
|
35
80
|
const session = this._currentSession();
|
|
36
81
|
if (!session)
|
|
37
82
|
return null;
|
|
@@ -41,6 +86,7 @@ export class RecorderService {
|
|
|
41
86
|
this._isRecording.set(false);
|
|
42
87
|
this._isPaused.set(false);
|
|
43
88
|
this.detachListeners();
|
|
89
|
+
this.persistToStorage();
|
|
44
90
|
return completed;
|
|
45
91
|
}
|
|
46
92
|
pauseRecording() {
|
|
@@ -55,10 +101,7 @@ export class RecorderService {
|
|
|
55
101
|
this._currentSession.update(s => s ? { ...s, actions: s.actions.filter(a => a.id !== actionId) } : null);
|
|
56
102
|
}
|
|
57
103
|
addNote(actionId, note) {
|
|
58
|
-
this._currentSession.update(s => s ? {
|
|
59
|
-
...s,
|
|
60
|
-
actions: s.actions.map(a => a.id === actionId ? { ...a, note } : a)
|
|
61
|
-
} : null);
|
|
104
|
+
this._currentSession.update(s => s ? { ...s, actions: s.actions.map(a => a.id === actionId ? { ...a, note } : a) } : null);
|
|
62
105
|
}
|
|
63
106
|
deleteSession(sessionId) {
|
|
64
107
|
this._sessions.update(s => s.filter(x => x.id !== sessionId));
|
|
@@ -66,23 +109,71 @@ export class RecorderService {
|
|
|
66
109
|
loadSession(session) {
|
|
67
110
|
this._currentSession.set(session);
|
|
68
111
|
}
|
|
69
|
-
// ───
|
|
112
|
+
// ─── RAF batch flush ──────────────────────────────────────────────────
|
|
113
|
+
/**
|
|
114
|
+
* Schedule one signal update at the next animation frame.
|
|
115
|
+
* Multiple events within a single frame are coalesced → one CD cycle.
|
|
116
|
+
*/
|
|
117
|
+
scheduleFlush() {
|
|
118
|
+
if (this.rafId !== undefined)
|
|
119
|
+
return;
|
|
120
|
+
this.rafId = requestAnimationFrame(() => {
|
|
121
|
+
this.rafId = undefined;
|
|
122
|
+
this.flushPending();
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
flushPending() {
|
|
126
|
+
if (!this.pendingActions.length)
|
|
127
|
+
return;
|
|
128
|
+
const batch = this.pendingActions.splice(0);
|
|
129
|
+
this.zone.run(() => {
|
|
130
|
+
this._currentSession.update(s => {
|
|
131
|
+
if (!s)
|
|
132
|
+
return s;
|
|
133
|
+
let actions = [...s.actions];
|
|
134
|
+
for (const action of batch) {
|
|
135
|
+
// Deduplicate consecutive inputs: keep only the latest value
|
|
136
|
+
if (action.type === 'input') {
|
|
137
|
+
const last = actions[actions.length - 1];
|
|
138
|
+
if (last?.type === 'input' && last.selector === action.selector) {
|
|
139
|
+
actions[actions.length - 1] = action;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
actions.push(action);
|
|
144
|
+
}
|
|
145
|
+
return { ...s, actions };
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// ─── Event listeners (registered outside NgZone) ──────────────────────
|
|
70
150
|
attachListeners() {
|
|
71
151
|
const opts = { capture: true, passive: true };
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
152
|
+
// Handlers run completely outside Angular Zone — zero CD impact per event.
|
|
153
|
+
// Only the RAF flush (above) re-enters the zone.
|
|
154
|
+
const onClick = (e) => { if (this.shouldRecord(e.target))
|
|
155
|
+
this.handleClick(e); };
|
|
156
|
+
const onDblClick = (e) => { if (this.shouldRecord(e.target))
|
|
157
|
+
this.handleDblClick(e); };
|
|
158
|
+
const onInput = (e) => { if (this.shouldRecord(e.target))
|
|
159
|
+
this.handleInput(e); };
|
|
160
|
+
const onChange = (e) => { if (this.shouldRecord(e.target))
|
|
161
|
+
this.handleChange(e); };
|
|
162
|
+
const onSubmit = (e) => { if (this.shouldRecord(e.target))
|
|
163
|
+
this.handleSubmit(e); };
|
|
164
|
+
const onKeydown = (e) => { if (this.shouldRecord(e.target))
|
|
165
|
+
this.handleKeydown(e); };
|
|
166
|
+
const onScroll = (e) => { if (this.shouldRecord(e.target))
|
|
167
|
+
this.handleScroll(e); };
|
|
168
|
+
this.zone.runOutsideAngular(() => {
|
|
169
|
+
document.addEventListener('click', onClick, opts);
|
|
170
|
+
document.addEventListener('dblclick', onDblClick, opts);
|
|
171
|
+
document.addEventListener('input', onInput, opts);
|
|
172
|
+
document.addEventListener('change', onChange, opts);
|
|
173
|
+
document.addEventListener('submit', onSubmit, opts);
|
|
174
|
+
document.addEventListener('keydown', onKeydown, opts);
|
|
175
|
+
document.addEventListener('scroll', onScroll, { capture: true, passive: true });
|
|
176
|
+
});
|
|
86
177
|
this.listeners = [
|
|
87
178
|
{ type: 'click', fn: onClick },
|
|
88
179
|
{ type: 'dblclick', fn: onDblClick },
|
|
@@ -96,48 +187,38 @@ export class RecorderService {
|
|
|
96
187
|
detachListeners() {
|
|
97
188
|
this.listeners.forEach(({ type, fn }) => document.removeEventListener(type, fn, true));
|
|
98
189
|
this.listeners = [];
|
|
99
|
-
this.mutationObserver?.disconnect();
|
|
100
190
|
}
|
|
101
|
-
// ─── Handlers
|
|
191
|
+
// ─── Handlers (run outside NgZone, call addAction which batches) ──────
|
|
102
192
|
handleClick(e) {
|
|
103
|
-
if (!this.shouldRecord(e.target))
|
|
104
|
-
return;
|
|
105
193
|
const el = e.target;
|
|
106
194
|
const info = this.getElementInfo(el);
|
|
107
|
-
const selector = this.buildSelector(el);
|
|
108
195
|
this.addAction({
|
|
109
196
|
type: 'click',
|
|
110
|
-
selector,
|
|
197
|
+
selector: this.buildSelector(el),
|
|
111
198
|
selectorStrategy: this.getSelectorStrategy(el),
|
|
112
199
|
element: info,
|
|
113
200
|
description: `Click on ${this.describeElement(info)}`,
|
|
114
201
|
});
|
|
115
202
|
}
|
|
116
203
|
handleDblClick(e) {
|
|
117
|
-
if (!this.shouldRecord(e.target))
|
|
118
|
-
return;
|
|
119
204
|
const el = e.target;
|
|
120
205
|
const info = this.getElementInfo(el);
|
|
121
|
-
const selector = this.buildSelector(el);
|
|
122
206
|
this.addAction({
|
|
123
207
|
type: 'dblclick',
|
|
124
|
-
selector,
|
|
208
|
+
selector: this.buildSelector(el),
|
|
125
209
|
selectorStrategy: this.getSelectorStrategy(el),
|
|
126
210
|
element: info,
|
|
127
211
|
description: `Double-click on ${this.describeElement(info)}`,
|
|
128
212
|
});
|
|
129
213
|
}
|
|
130
214
|
handleInput(e) {
|
|
131
|
-
if (!this.shouldRecord(e.target))
|
|
132
|
-
return;
|
|
133
215
|
const el = e.target;
|
|
134
216
|
if (['checkbox', 'radio'].includes(el.type))
|
|
135
217
|
return; // handled by change
|
|
136
218
|
const info = this.getElementInfo(el);
|
|
137
|
-
const selector = this.buildSelector(el);
|
|
138
219
|
this.addAction({
|
|
139
220
|
type: 'input',
|
|
140
|
-
selector,
|
|
221
|
+
selector: this.buildSelector(el),
|
|
141
222
|
selectorStrategy: this.getSelectorStrategy(el),
|
|
142
223
|
element: info,
|
|
143
224
|
value: el.value,
|
|
@@ -145,8 +226,6 @@ export class RecorderService {
|
|
|
145
226
|
});
|
|
146
227
|
}
|
|
147
228
|
handleChange(e) {
|
|
148
|
-
if (!this.shouldRecord(e.target))
|
|
149
|
-
return;
|
|
150
229
|
const el = e.target;
|
|
151
230
|
const info = this.getElementInfo(el);
|
|
152
231
|
const selector = this.buildSelector(el);
|
|
@@ -172,31 +251,26 @@ export class RecorderService {
|
|
|
172
251
|
}
|
|
173
252
|
}
|
|
174
253
|
handleSubmit(e) {
|
|
175
|
-
if (!this.shouldRecord(e.target))
|
|
176
|
-
return;
|
|
177
254
|
const form = e.target;
|
|
178
255
|
const info = this.getElementInfo(form);
|
|
179
|
-
const selector = this.buildSelector(form);
|
|
180
256
|
this.addAction({
|
|
181
257
|
type: 'submit',
|
|
182
|
-
selector,
|
|
258
|
+
selector: this.buildSelector(form),
|
|
183
259
|
selectorStrategy: this.getSelectorStrategy(form),
|
|
184
260
|
element: info,
|
|
185
|
-
description: `Submit form ${info.id ? '#' + info.id : info.name
|
|
261
|
+
description: `Submit form ${info.id ? '#' + info.id : info.name ?? ''}`.trim(),
|
|
186
262
|
});
|
|
187
263
|
}
|
|
188
264
|
handleScroll(e) {
|
|
189
|
-
if (!this.shouldRecord(e.target))
|
|
190
|
-
return;
|
|
191
265
|
const now = Date.now();
|
|
192
266
|
if (now - this.lastScrollTime < 1000)
|
|
193
|
-
return; // debounce
|
|
267
|
+
return; // debounce 1 s
|
|
194
268
|
this.lastScrollTime = now;
|
|
195
269
|
const el = e.target;
|
|
196
270
|
const isDoc = !el.tagName || el.tagName === 'HTML';
|
|
197
271
|
const scrollY = isDoc ? window.scrollY : el.scrollTop;
|
|
198
272
|
const scrollX = isDoc ? window.scrollX : el.scrollLeft;
|
|
199
|
-
const selector = el.tagName === 'HTML' || el.tagName === 'BODY'
|
|
273
|
+
const selector = (el.tagName === 'HTML' || el.tagName === 'BODY')
|
|
200
274
|
? 'window'
|
|
201
275
|
: this.buildSelector(el);
|
|
202
276
|
this.addAction({
|
|
@@ -211,33 +285,30 @@ export class RecorderService {
|
|
|
211
285
|
const specialKeys = ['Enter', 'Escape', 'Tab', 'F5', 'F12'];
|
|
212
286
|
if (!specialKeys.includes(e.key))
|
|
213
287
|
return;
|
|
214
|
-
if (!this.shouldRecord(e.target))
|
|
215
|
-
return;
|
|
216
288
|
const el = e.target;
|
|
217
|
-
const selector = this.buildSelector(el);
|
|
218
289
|
this.addAction({
|
|
219
290
|
type: 'keypress',
|
|
220
|
-
selector,
|
|
291
|
+
selector: this.buildSelector(el),
|
|
221
292
|
selectorStrategy: this.getSelectorStrategy(el),
|
|
222
293
|
value: e.key,
|
|
223
294
|
description: `Press "${e.key}" on ${el.tagName.toLowerCase()}`,
|
|
224
295
|
});
|
|
225
296
|
}
|
|
226
|
-
recordNavigation(
|
|
297
|
+
recordNavigation(navUrl) {
|
|
298
|
+
// Navigation is always added synchronously (no pending batch needed)
|
|
227
299
|
const action = {
|
|
228
300
|
id: this.generateId(),
|
|
229
301
|
timestamp: Date.now(),
|
|
230
302
|
url: navUrl,
|
|
231
|
-
type,
|
|
303
|
+
type: 'navigation',
|
|
232
304
|
selector: 'window',
|
|
233
305
|
selectorStrategy: 'combined',
|
|
234
306
|
description: `Navigate to ${navUrl}`,
|
|
235
307
|
};
|
|
236
308
|
this._currentSession.update(s => s ? { ...s, actions: [...s.actions, action] } : s);
|
|
237
309
|
}
|
|
238
|
-
// ─── Selector
|
|
310
|
+
// ─── Selector building ────────────────────────────────────────────────
|
|
239
311
|
buildSelector(el) {
|
|
240
|
-
// Priority: data-testid > data-cy > id > name > aria-label > combined
|
|
241
312
|
const testId = el.getAttribute('data-testid');
|
|
242
313
|
if (testId)
|
|
243
314
|
return `[data-testid="${testId}"]`;
|
|
@@ -252,14 +323,12 @@ export class RecorderService {
|
|
|
252
323
|
const ariaLabel = el.getAttribute('aria-label');
|
|
253
324
|
if (ariaLabel)
|
|
254
325
|
return `[aria-label="${ariaLabel}"]`;
|
|
255
|
-
// Class-based fallback
|
|
256
326
|
const relevantClasses = Array.from(el.classList)
|
|
257
327
|
.filter(c => !c.startsWith('ng-') && !c.startsWith('cdk-') && c.length > 0)
|
|
258
328
|
.slice(0, 3);
|
|
259
329
|
if (relevantClasses.length > 0) {
|
|
260
330
|
return `${el.tagName.toLowerCase()}.${relevantClasses.join('.')}`;
|
|
261
331
|
}
|
|
262
|
-
// Text content for buttons/links
|
|
263
332
|
if (['BUTTON', 'A'].includes(el.tagName)) {
|
|
264
333
|
const text = el.textContent?.trim().slice(0, 30);
|
|
265
334
|
if (text)
|
|
@@ -308,17 +377,17 @@ export class RecorderService {
|
|
|
308
377
|
return `"${info.text}"`;
|
|
309
378
|
return info.tagName;
|
|
310
379
|
}
|
|
311
|
-
// ───
|
|
380
|
+
// ─── Guard ────────────────────────────────────────────────────────────
|
|
312
381
|
shouldRecord(target) {
|
|
313
382
|
if (!this._isRecording() || this._isPaused())
|
|
314
383
|
return false;
|
|
315
384
|
if (!target)
|
|
316
385
|
return false;
|
|
317
|
-
// Ignore the debug panel itself
|
|
318
386
|
if (target.closest('[data-debug-panel]'))
|
|
319
387
|
return false;
|
|
320
388
|
return true;
|
|
321
389
|
}
|
|
390
|
+
// ─── Batch buffer ─────────────────────────────────────────────────────
|
|
322
391
|
addAction(partial) {
|
|
323
392
|
const action = {
|
|
324
393
|
id: this.generateId(),
|
|
@@ -326,21 +395,43 @@ export class RecorderService {
|
|
|
326
395
|
url: window.location.href,
|
|
327
396
|
...partial,
|
|
328
397
|
};
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
398
|
+
this.pendingActions.push(action);
|
|
399
|
+
this.scheduleFlush();
|
|
400
|
+
}
|
|
401
|
+
// ─── SessionStorage (F5 survival) ─────────────────────────────────────
|
|
402
|
+
persistToStorage() {
|
|
403
|
+
try {
|
|
404
|
+
const session = this._currentSession();
|
|
405
|
+
if (session && this._isRecording()) {
|
|
406
|
+
sessionStorage.setItem(RecorderService.SESSION_KEY, JSON.stringify({ session, isPaused: this._isPaused() }));
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
sessionStorage.removeItem(RecorderService.SESSION_KEY);
|
|
410
|
+
}
|
|
411
|
+
const sessions = this._sessions();
|
|
412
|
+
if (sessions.length > 0) {
|
|
413
|
+
sessionStorage.setItem(RecorderService.SESSIONS_KEY, JSON.stringify(sessions));
|
|
414
|
+
}
|
|
341
415
|
}
|
|
342
|
-
|
|
416
|
+
catch { /* storage quota exceeded or private browsing */ }
|
|
417
|
+
}
|
|
418
|
+
restoreFromStorage() {
|
|
419
|
+
try {
|
|
420
|
+
const savedSessions = sessionStorage.getItem(RecorderService.SESSIONS_KEY);
|
|
421
|
+
if (savedSessions)
|
|
422
|
+
this._sessions.set(JSON.parse(savedSessions));
|
|
423
|
+
const savedActive = sessionStorage.getItem(RecorderService.SESSION_KEY);
|
|
424
|
+
if (savedActive) {
|
|
425
|
+
const { session, isPaused } = JSON.parse(savedActive);
|
|
426
|
+
this._currentSession.set(session);
|
|
427
|
+
this._isRecording.set(true);
|
|
428
|
+
this._isPaused.set(isPaused);
|
|
429
|
+
this.attachListeners(); // resume recording after reload
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
catch { /* corrupt or missing storage */ }
|
|
343
433
|
}
|
|
434
|
+
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
344
435
|
generateId() {
|
|
345
436
|
return Math.random().toString(36).slice(2, 11);
|
|
346
437
|
}
|
|
@@ -351,4 +442,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
351
442
|
type: Injectable,
|
|
352
443
|
args: [{ providedIn: 'root' }]
|
|
353
444
|
}], ctorParameters: () => [{ type: i0.NgZone }] });
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RlYnVnLXJlY29yZGVyL3NyYy9saWIvc2VydmljZXMvcmVjb3JkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSXJFLE1BQU0sT0FBTyxlQUFlO0lBZTFCLFlBQW9CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBZHhCLGlCQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztRQUN4RCxjQUFTLEdBQUcsTUFBTSxDQUFxQixFQUFFLENBQUMsQ0FBQztRQUMzQyxjQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxDLGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELGFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDNUMsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDeEQsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVsRSxjQUFTLEdBQStDLEVBQUUsQ0FBQztRQXdNM0QsbUJBQWMsR0FBRyxDQUFD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TUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBzaWduYWwsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGlvblR5cGUsIEVsZW1lbnRJbmZvLCBSZWNvcmRlZEFjdGlvbiwgUmVjb3JkaW5nU2Vzc2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWNvcmRlZC1hY3Rpb24ubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfaXNSZWNvcmRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRTZXNzaW9uID0gc2lnbmFsPFJlY29yZGluZ1Nlc3Npb24gfCBudWxsPihudWxsKTtcclxuICBwcml2YXRlIF9zZXNzaW9ucyA9IHNpZ25hbDxSZWNvcmRpbmdTZXNzaW9uW10+KFtdKTtcclxuICBwcml2YXRlIF9pc1BhdXNlZCA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIGlzUmVjb3JkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXNSZWNvcmRpbmcoKSk7XHJcbiAgaXNQYXVzZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9pc1BhdXNlZCgpKTtcclxuICBjdXJyZW50U2Vzc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2N1cnJlbnRTZXNzaW9uKCkpO1xyXG4gIHNlc3Npb25zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc2Vzc2lvbnMoKSk7XHJcbiAgYWN0aW9uQ291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jdXJyZW50U2Vzc2lvbigpPy5hY3Rpb25zLmxlbmd0aCA/PyAwKTtcclxuXHJcbiAgcHJpdmF0ZSBsaXN0ZW5lcnM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBmbjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xyXG4gIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lKSB7fVxyXG5cclxuICBzdGFydFJlY29yZGluZyhuYW1lPzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2Vzc2lvbjogUmVjb3JkaW5nU2Vzc2lvbiA9IHtcclxuICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVJZCgpLFxyXG4gICAgICBuYW1lOiBuYW1lIHx8IGBTZXNzaW9uICR7bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKX1gLFxyXG4gICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxyXG4gICAgICBzdGFydFVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXHJcbiAgICAgIGFjdGlvbnM6IFtdLFxyXG4gICAgICB0YWdzOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb24uc2V0KHNlc3Npb24pO1xyXG4gICAgdGhpcy5faXNSZWNvcmRpbmcuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5faXNQYXVzZWQuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLnJlY29yZE5hdmlnYXRpb24oJ25hdmlnYXRpb24nLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nKCk6IFJlY29yZGluZ1Nlc3Npb24gfCBudWxsIHtcclxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jdXJyZW50U2Vzc2lvbigpO1xyXG4gICAgaWYgKCFzZXNzaW9uKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBjb21wbGV0ZWQgPSB7IC4uLnNlc3Npb24sIGVuZFRpbWU6IERhdGUubm93KCkgfTtcclxuICAgIHRoaXMuX3Nlc3Npb25zLnVwZGF0ZShzID0+IFsuLi5zLCBjb21wbGV0ZWRdKTtcclxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnNldChudWxsKTtcclxuICAgIHRoaXMuX2lzUmVjb3JkaW5nLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLl9pc1BhdXNlZC5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5kZXRhY2hMaXN0ZW5lcnMoKTtcclxuICAgIHJldHVybiBjb21wbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICBwYXVzZVJlY29yZGluZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pc1JlY29yZGluZygpKSB7XHJcbiAgICAgIHRoaXMuX2lzUGF1c2VkLnNldCghdGhpcy5faXNQYXVzZWQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhckN1cnJlbnRTZXNzaW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb24udXBkYXRlKHMgPT4gcyA/IHsgLi4ucywgYWN0aW9uczogW10gfSA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQWN0aW9uKGFjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnVwZGF0ZShzID0+XHJcbiAgICAgIHMgPyB7IC4uLnMsIGFjdGlvbnM6IHMuYWN0aW9ucy5maWx0ZXIoYSA9PiBhLmlkICE9PSBhY3Rpb25JZCkgfSA6IG51bGxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGROb3RlKGFjdGlvbklkOiBzdHJpbmcsIG5vdGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb24udXBkYXRlKHMgPT5cclxuICAgICAgcyA/IHtcclxuICAgICAgICAuLi5zLFxyXG4gICAgICAgIGFjdGlvbnM6IHMuYWN0aW9ucy5tYXAoYSA9PiBhLmlkID09PSBhY3Rpb25JZCA/IHsgLi4uYSwgbm90ZSB9IDogYSlcclxuICAgICAgfSA6IG51bGxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXNzaW9ucy51cGRhdGUocyA9PiBzLmZpbHRlcih4ID0+IHguaWQgIT09IHNlc3Npb25JZCkpO1xyXG4gIH1cclxuXHJcbiAgbG9hZFNlc3Npb24oc2Vzc2lvbjogUmVjb3JkaW5nU2Vzc2lvbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb24uc2V0KHNlc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEV2ZW50IExpc3RlbmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2hMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRzID0geyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH07XHJcblxyXG4gICAgY29uc3Qgb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlQ2xpY2soZSkpO1xyXG4gICAgY29uc3Qgb25EYmxDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlRGJsQ2xpY2soZSkpO1xyXG4gICAgY29uc3Qgb25JbnB1dCA9IChlOiBFdmVudCkgPT4gdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZUlucHV0KGUpKTtcclxuICAgIGNvbnN0IG9uQ2hhbmdlID0gKGU6IEV2ZW50KSA9PiB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlQ2hhbmdlKGUpKTtcclxuICAgIGNvbnN0IG9uU3VibWl0ID0gKGU6IFN1Ym1pdEV2ZW50KSA9PiB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlU3VibWl0KGUpKTtcclxuICAgIGNvbnN0IG9uS2V5ZG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlS2V5ZG93bihlKSk7XHJcbiAgICBjb25zdCBvblNjcm9sbCA9IChlOiBFdmVudCkgPT4gdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVNjcm9sbChlKSk7XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCBvcHRzKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgb25EYmxDbGljaywgb3B0cyk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIG9uSW5wdXQsIG9wdHMpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25DaGFuZ2UsIG9wdHMpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0Jywgb25TdWJtaXQsIG9wdHMpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5ZG93biwgb3B0cyk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgIHRoaXMubGlzdGVuZXJzID0gW1xyXG4gICAgICB7IHR5cGU6ICdjbGljaycsIGZuOiBvbkNsaWNrIGFzIEV2ZW50TGlzdGVuZXIgfSxcclxuICAgICAgeyB0eXBlOiAnZGJsY2xpY2snLCBmbjogb25EYmxDbGljayBhcyBFdmVudExpc3RlbmVyIH0sXHJcbiAgICAgIHsgdHlwZTogJ2lucHV0JywgZm46IG9uSW5wdXQgYXMgRXZlbnRMaXN0ZW5lciB9LFxyXG4gICAgICB7IHR5cGU6ICdjaGFuZ2UnLCBmbjogb25DaGFuZ2UgYXMgRXZlbnRMaXN0ZW5lciB9LFxyXG4gICAgICB7IHR5cGU6ICdzdWJtaXQnLCBmbjogb25TdWJtaXQgYXMgRXZlbnRMaXN0ZW5lciB9LFxyXG4gICAgICB7IHR5cGU6ICdrZXlkb3duJywgZm46IG9uS2V5ZG93biBhcyBFdmVudExpc3RlbmVyIH0sXHJcbiAgICAgIHsgdHlwZTogJ3Njcm9sbCcsIGZuOiBvblNjcm9sbCBhcyBFdmVudExpc3RlbmVyIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXRhY2hMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKCh7IHR5cGUsIGZuIH0pID0+XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIHRydWUpXHJcbiAgICApO1xyXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcclxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEhhbmRsZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIGhhbmRsZUNsaWNrKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZS50YXJnZXQgYXMgRWxlbWVudCkpIHJldHVybjtcclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpbmZvID0gdGhpcy5nZXRFbGVtZW50SW5mbyhlbCk7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuYnVpbGRTZWxlY3RvcihlbCk7XHJcblxyXG4gICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICB0eXBlOiAnY2xpY2snLFxyXG4gICAgICBzZWxlY3RvcixcclxuICAgICAgc2VsZWN0b3JTdHJhdGVneTogdGhpcy5nZXRTZWxlY3RvclN0cmF0ZWd5KGVsKSxcclxuICAgICAgZWxlbWVudDogaW5mbyxcclxuICAgICAgZGVzY3JpcHRpb246IGBDbGljayBvbiAke3RoaXMuZGVzY3JpYmVFbGVtZW50KGluZm8pfWAsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRGJsQ2xpY2soZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChlLnRhcmdldCBhcyBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgY29uc3QgZWwgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmdldEVsZW1lbnRJbmZvKGVsKTtcclxuICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5idWlsZFNlbGVjdG9yKGVsKTtcclxuXHJcbiAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgIHR5cGU6ICdkYmxjbGljaycsXHJcbiAgICAgIHNlbGVjdG9yLFxyXG4gICAgICBzZWxlY3RvclN0cmF0ZWd5OiB0aGlzLmdldFNlbGVjdG9yU3RyYXRlZ3koZWwpLFxyXG4gICAgICBlbGVtZW50OiBpbmZvLFxyXG4gICAgICBkZXNjcmlwdGlvbjogYERvdWJsZS1jbGljayBvbiAke3RoaXMuZGVzY3JpYmVFbGVtZW50KGluZm8pfWAsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZS50YXJnZXQgYXMgRWxlbWVudCkpIHJldHVybjtcclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICBpZiAoWydjaGVja2JveCcsICdyYWRpbyddLmluY2x1ZGVzKGVsLnR5cGUpKSByZXR1cm47IC8vIGhhbmRsZWQgYnkgY2hhbmdlXHJcbiAgICBjb25zdCBpbmZvID0gdGhpcy5nZXRFbGVtZW50SW5mbyhlbCk7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuYnVpbGRTZWxlY3RvcihlbCk7XHJcblxyXG4gICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBzZWxlY3RvcixcclxuICAgICAgc2VsZWN0b3JTdHJhdGVneTogdGhpcy5nZXRTZWxlY3RvclN0cmF0ZWd5KGVsKSxcclxuICAgICAgZWxlbWVudDogaW5mbyxcclxuICAgICAgdmFsdWU6IGVsLnZhbHVlLFxyXG4gICAgICBkZXNjcmlwdGlvbjogYFR5cGUgXCIke2VsLnZhbHVlfVwiIGluICR7dGhpcy5kZXNjcmliZUVsZW1lbnQoaW5mbyl9YCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2UoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZS50YXJnZXQgYXMgRWxlbWVudCkpIHJldHVybjtcclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuZ2V0RWxlbWVudEluZm8oZWwpO1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmJ1aWxkU2VsZWN0b3IoZWwpO1xyXG5cclxuICAgIGlmIChlbC50YWdOYW1lID09PSAnU0VMRUNUJykge1xyXG4gICAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXHJcbiAgICAgICAgc2VsZWN0b3IsXHJcbiAgICAgICAgc2VsZWN0b3JTdHJhdGVneTogdGhpcy5nZXRTZWxlY3RvclN0cmF0ZWd5KGVsKSxcclxuICAgICAgICBlbGVtZW50OiBpbmZvLFxyXG4gICAgICAgIHZhbHVlOiBlbC52YWx1ZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlbGVjdCBcIiR7ZWwudmFsdWV9XCIgaW4gJHt0aGlzLmRlc2NyaWJlRWxlbWVudChpbmZvKX1gLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoKGVsIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICAgIHR5cGU6ICdjbGljaycsXHJcbiAgICAgICAgc2VsZWN0b3IsXHJcbiAgICAgICAgc2VsZWN0b3JTdHJhdGVneTogdGhpcy5nZXRTZWxlY3RvclN0cmF0ZWd5KGVsKSxcclxuICAgICAgICBlbGVtZW50OiBpbmZvLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcoKGVsIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQpLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHsoZWwgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCA/ICdDaGVjaycgOiAnVW5jaGVjayd9ICR7dGhpcy5kZXNjcmliZUVsZW1lbnQoaW5mbyl9YCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVN1Ym1pdChlOiBTdWJtaXRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChlLnRhcmdldCBhcyBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0IGFzIEhUTUxGb3JtRWxlbWVudDtcclxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmdldEVsZW1lbnRJbmZvKGZvcm0pO1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmJ1aWxkU2VsZWN0b3IoZm9ybSk7XHJcblxyXG4gICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICB0eXBlOiAnc3VibWl0JyxcclxuICAgICAgc2VsZWN0b3IsXHJcbiAgICAgIHNlbGVjdG9yU3RyYXRlZ3k6IHRoaXMuZ2V0U2VsZWN0b3JTdHJhdGVneShmb3JtKSxcclxuICAgICAgZWxlbWVudDogaW5mbyxcclxuICAgICAgZGVzY3JpcHRpb246IGBTdWJtaXQgZm9ybSAke2luZm8uaWQgPyAnIycgKyBpbmZvLmlkIDogaW5mby5uYW1lID8gaW5mby5uYW1lIDogJyd9YC50cmltKCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGFzdFNjcm9sbFRpbWUgPSAwO1xyXG4gIHByaXZhdGUgaGFuZGxlU2Nyb2xsKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2hvdWxkUmVjb3JkKGUudGFyZ2V0IGFzIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgaWYgKG5vdyAtIHRoaXMubGFzdFNjcm9sbFRpbWUgPCAxMDAwKSByZXR1cm47IC8vIGRlYm91bmNlIDFzXHJcbiAgICB0aGlzLmxhc3RTY3JvbGxUaW1lID0gbm93O1xyXG5cclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpc0RvYyA9ICFlbC50YWdOYW1lIHx8IGVsLnRhZ05hbWUgPT09ICdIVE1MJztcclxuICAgIGNvbnN0IHNjcm9sbFkgPSBpc0RvYyA/IHdpbmRvdy5zY3JvbGxZIDogZWwuc2Nyb2xsVG9wO1xyXG4gICAgY29uc3Qgc2Nyb2xsWCA9IGlzRG9jID8gd2luZG93LnNjcm9sbFggOiBlbC5zY3JvbGxMZWZ0O1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdG9yID0gZWwudGFnTmFtZSA9PT0gJ0hUTUwnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJ1xyXG4gICAgICA/ICd3aW5kb3cnXHJcbiAgICAgIDogdGhpcy5idWlsZFNlbGVjdG9yKGVsKTtcclxuXHJcbiAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgIHR5cGU6ICdzY3JvbGwnLFxyXG4gICAgICBzZWxlY3RvcixcclxuICAgICAgc2VsZWN0b3JTdHJhdGVneTogJ2NvbWJpbmVkJyxcclxuICAgICAgdmFsdWU6IGAke3Njcm9sbFh9LCR7c2Nyb2xsWX1gLFxyXG4gICAgICBkZXNjcmlwdGlvbjogYFNjcm9sbCB0byAoJHtzY3JvbGxYfSwgJHtzY3JvbGxZfSlgLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUtleWRvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3BlY2lhbEtleXMgPSBbJ0VudGVyJywgJ0VzY2FwZScsICdUYWInLCAnRjUnLCAnRjEyJ107XHJcbiAgICBpZiAoIXNwZWNpYWxLZXlzLmluY2x1ZGVzKGUua2V5KSkgcmV0dXJuO1xyXG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChlLnRhcmdldCBhcyBFbGVtZW50KSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuYnVpbGRTZWxlY3RvcihlbCk7XHJcblxyXG4gICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICB0eXBlOiAna2V5cHJlc3MnLFxyXG4gICAgICBzZWxlY3RvcixcclxuICAgICAgc2VsZWN0b3JTdHJhdGVneTogdGhpcy5nZXRTZWxlY3RvclN0cmF0ZWd5KGVsKSxcclxuICAgICAgdmFsdWU6IGUua2V5LFxyXG4gICAgICBkZXNjcmlwdGlvbjogYFByZXNzIFwiJHtlLmtleX1cIiBvbiAke2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKX1gLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29yZE5hdmlnYXRpb24odHlwZTogQWN0aW9uVHlwZSwgbmF2VXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFjdGlvbjogUmVjb3JkZWRBY3Rpb24gPSB7XHJcbiAgICAgIGlkOiB0aGlzLmdlbmVyYXRlSWQoKSxcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICB1cmw6IG5hdlVybCxcclxuICAgICAgdHlwZSxcclxuICAgICAgc2VsZWN0b3I6ICd3aW5kb3cnLFxyXG4gICAgICBzZWxlY3RvclN0cmF0ZWd5OiAnY29tYmluZWQnLFxyXG4gICAgICBkZXNjcmlwdGlvbjogYE5hdmlnYXRlIHRvICR7bmF2VXJsfWAsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb24udXBkYXRlKHMgPT5cclxuICAgICAgcyA/IHsgLi4ucywgYWN0aW9uczogWy4uLnMuYWN0aW9ucywgYWN0aW9uXSB9IDogc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBTZWxlY3RvciBCdWlsZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBidWlsZFNlbGVjdG9yKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XHJcbiAgICAvLyBQcmlvcml0eTogZGF0YS10ZXN0aWQgPiBkYXRhLWN5ID4gaWQgPiBuYW1lID4gYXJpYS1sYWJlbCA+IGNvbWJpbmVkXHJcbiAgICBjb25zdCB0ZXN0SWQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGVzdGlkJyk7XHJcbiAgICBpZiAodGVzdElkKSByZXR1cm4gYFtkYXRhLXRlc3RpZD1cIiR7dGVzdElkfVwiXWA7XHJcblxyXG4gICAgY29uc3QgY3kgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3knKTtcclxuICAgIGlmIChjeSkgcmV0dXJuIGBbZGF0YS1jeT1cIiR7Y3l9XCJdYDtcclxuXHJcbiAgICBpZiAoZWwuaWQgJiYgIWVsLmlkLmluY2x1ZGVzKCc6JykpIHJldHVybiBgIyR7ZWwuaWR9YDtcclxuXHJcbiAgICBjb25zdCBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKCduYW1lJyk7XHJcbiAgICBpZiAobmFtZSkgcmV0dXJuIGAke2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKX1bbmFtZT1cIiR7bmFtZX1cIl1gO1xyXG5cclxuICAgIGNvbnN0IGFyaWFMYWJlbCA9IGVsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xyXG4gICAgaWYgKGFyaWFMYWJlbCkgcmV0dXJuIGBbYXJpYS1sYWJlbD1cIiR7YXJpYUxhYmVsfVwiXWA7XHJcblxyXG4gICAgLy8gQ2xhc3MtYmFzZWQgZmFsbGJhY2tcclxuICAgIGNvbnN0IHJlbGV2YW50Q2xhc3NlcyA9IEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KVxyXG4gICAgICAuZmlsdGVyKGMgPT4gIWMuc3RhcnRzV2l0aCgnbmctJykgJiYgIWMuc3RhcnRzV2l0aCgnY2RrLScpICYmIGMubGVuZ3RoID4gMClcclxuICAgICAgLnNsaWNlKDAsIDMpO1xyXG4gICAgaWYgKHJlbGV2YW50Q2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBgJHtlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCl9LiR7cmVsZXZhbnRDbGFzc2VzLmpvaW4oJy4nKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRleHQgY29udGVudCBmb3IgYnV0dG9ucy9saW5rc1xyXG4gICAgaWYgKFsnQlVUVE9OJywgJ0EnXS5pbmNsdWRlcyhlbC50YWdOYW1lKSkge1xyXG4gICAgICBjb25zdCB0ZXh0ID0gZWwudGV4dENvbnRlbnQ/LnRyaW0oKS5zbGljZSgwLCAzMCk7XHJcbiAgICAgIGlmICh0ZXh0KSByZXR1cm4gYCR7ZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpfTpjb250YWlucyhcIiR7dGV4dH1cIilgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlbGVjdG9yU3RyYXRlZ3koZWw6IEhUTUxFbGVtZW50KTogUmVjb3JkZWRBY3Rpb25bJ3NlbGVjdG9yU3RyYXRlZ3knXSB7XHJcbiAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRlc3RpZCcpKSByZXR1cm4gJ2RhdGEtdGVzdGlkJztcclxuICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3knKSkgcmV0dXJuICdkYXRhLWN5JztcclxuICAgIGlmIChlbC5pZCkgcmV0dXJuICdpZCc7XHJcbiAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCduYW1lJykpIHJldHVybiAnbmFtZSc7XHJcbiAgICByZXR1cm4gJ2NsYXNzJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RWxlbWVudEluZm8oZWw6IEhUTUxFbGVtZW50KTogRWxlbWVudEluZm8ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGFnTmFtZTogZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBpZDogZWwuaWQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICBjbGFzc2VzOiBBcnJheS5mcm9tKGVsLmNsYXNzTGlzdCkuZmlsdGVyKGMgPT4gIWMuc3RhcnRzV2l0aCgnbmctJykpLFxyXG4gICAgICBkYXRhVGVzdElkOiBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGVzdGlkJykgfHwgdW5kZWZpbmVkLFxyXG4gICAgICBkYXRhQ3k6IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jeScpIHx8IHVuZGVmaW5lZCxcclxuICAgICAgbmFtZTogZWwuZ2V0QXR0cmlidXRlKCduYW1lJykgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB0eXBlOiBlbC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiBlbC5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJykgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB0ZXh0OiBlbC50ZXh0Q29udGVudD8udHJpbSgpLnNsaWNlKDAsIDUwKSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIGhyZWY6IChlbCBhcyBIVE1MQW5jaG9yRWxlbWVudCkuaHJlZiB8fCB1bmRlZmluZWQsXHJcbiAgICAgIGFyaWFMYWJlbDogZWwuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgfHwgdW5kZWZpbmVkLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVzY3JpYmVFbGVtZW50KGluZm86IEVsZW1lbnRJbmZvKTogc3RyaW5nIHtcclxuICAgIGlmIChpbmZvLmRhdGFUZXN0SWQpIHJldHVybiBgW2RhdGEtdGVzdGlkPVwiJHtpbmZvLmRhdGFUZXN0SWR9XCJdYDtcclxuICAgIGlmIChpbmZvLmRhdGFDeSkgcmV0dXJuIGBbZGF0YS1jeT1cIiR7aW5mby5kYXRhQ3l9XCJdYDtcclxuICAgIGlmIChpbmZvLmlkKSByZXR1cm4gYCMke2luZm8uaWR9YDtcclxuICAgIGlmIChpbmZvLmFyaWFMYWJlbCkgcmV0dXJuIGBcIiR7aW5mby5hcmlhTGFiZWx9XCJgO1xyXG4gICAgaWYgKGluZm8ucGxhY2Vob2xkZXIpIHJldHVybiBgXCIke2luZm8ucGxhY2Vob2xkZXJ9XCIgaW5wdXRgO1xyXG4gICAgaWYgKGluZm8udGV4dCkgcmV0dXJuIGBcIiR7aW5mby50ZXh0fVwiYDtcclxuICAgIHJldHVybiBpbmZvLnRhZ05hbWU7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBzaG91bGRSZWNvcmQodGFyZ2V0OiBFbGVtZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLl9pc1JlY29yZGluZygpIHx8IHRoaXMuX2lzUGF1c2VkKCkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyBJZ25vcmUgdGhlIGRlYnVnIHBhbmVsIGl0c2VsZlxyXG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCdbZGF0YS1kZWJ1Zy1wYW5lbF0nKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZEFjdGlvbihwYXJ0aWFsOiBPbWl0PFJlY29yZGVkQWN0aW9uLCAnaWQnIHwgJ3RpbWVzdGFtcCcgfCAndXJsJz4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGFjdGlvbjogUmVjb3JkZWRBY3Rpb24gPSB7XHJcbiAgICAgIGlkOiB0aGlzLmdlbmVyYXRlSWQoKSxcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxyXG4gICAgICAuLi5wYXJ0aWFsLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25zZWN1dGl2ZSBpZGVudGljYWwgaW5wdXRzIChrZWVwIG9ubHkgbGF0ZXN0IHZhbHVlKVxyXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnaW5wdXQnKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnVwZGF0ZShzID0+IHtcclxuICAgICAgICBpZiAoIXMpIHJldHVybiBzO1xyXG4gICAgICAgIGNvbnN0IGxhc3QgPSBzLmFjdGlvbnNbcy5hY3Rpb25zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnaW5wdXQnICYmIGxhc3Quc2VsZWN0b3IgPT09IGFjdGlvbi5zZWxlY3Rvcikge1xyXG4gICAgICAgICAgcmV0dXJuIHsgLi4ucywgYWN0aW9uczogWy4uLnMuYWN0aW9ucy5zbGljZSgwLCAtMSksIGFjdGlvbl0gfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ucywgYWN0aW9uczogWy4uLnMuYWN0aW9ucywgYWN0aW9uXSB9O1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnVwZGF0ZShzID0+XHJcbiAgICAgIHMgPyB7IC4uLnMsIGFjdGlvbnM6IFsuLi5zLmFjdGlvbnMsIGFjdGlvbl0gfSA6IHNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
445
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvcmVjb3JkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBR3JFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFHSCxNQUFNLE9BQU8sZUFBZTtJQXlCMUIseUVBQXlFO2FBRWpELGdCQUFXLEdBQUksbUJBQW1CLEFBQXZCLENBQXdCO2FBQ25DLGlCQUFZLEdBQUcsYUFBYSxBQUFoQixDQUFpQjtJQUVyRCxZQUFvQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQTVCaEMseUVBQXlFO1FBRWpFLGlCQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztRQUN4RCxjQUFTLEdBQUcsTUFBTSxDQUFxQixFQUFFLENBQUMsQ0FBQztRQUMzQyxjQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxDLGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELGFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDNUMsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDeEQsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJ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cm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aW9uVHlwZSwgRWxlbWVudEluZm8sIFJlY29yZGVkQWN0aW9uLCBSZWNvcmRpbmdTZXNzaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlY29yZGVkLWFjdGlvbi5tb2RlbCc7XHJcblxyXG4vKipcclxuICogUGVyZm9ybWFuY2Ugbm90ZXNcclxuICog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAqIEFsbCBET00gZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkICoqb3V0c2lkZSBBbmd1bGFyJ3MgTmdab25lKipcclxuICogKHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIpLiBUaGlzIG1lYW5zIGEgY2xpY2ssIGlucHV0LCBvciBzY3JvbGwgbmV2ZXJcclxuICogdHJpZ2dlcnMgQW5ndWxhciBDaGFuZ2UgRGV0ZWN0aW9uIGJ5IGl0c2VsZi5cclxuICpcclxuICogUmVjb3JkZWQgYWN0aW9ucyBhcmUgYmF0Y2hlZCBpbiBhIHBsYWluIGFycmF5IGFuZCBmbHVzaGVkIG9uY2UgcGVyXHJcbiAqIGFuaW1hdGlvbiBmcmFtZSB2aWEgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBPbmx5IHRoZSBSQUYgY2FsbGJhY2sgcnVuc1xyXG4gKiBpbnNpZGUgem9uZS5ydW4oKSDihpIgYXQgbW9zdCBvbmUgQ0QgY3ljbGUgcGVyIGZyYW1lLCByZWdhcmRsZXNzIG9mIGhvd1xyXG4gKiBtYW55IGV2ZW50cyBmaXJlZC5cclxuICpcclxuICogV2h5IHRoaXMgbWF0dGVycyBmb3IgT25QdXNoIGhvc3QgYXBwc1xyXG4gKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICogV2hlbiB0aGlzIHJlY29yZGVyIGlzIGVtYmVkZGVkIGluIGEgbGlicmFyeSB1c2VkIGluc2lkZSBhbiBPblB1c2ggYXBwLFxyXG4gKiB0aGUgb2xkIHpvbmUucnVuKCktcGVyLWV2ZW50IGFwcHJvYWNoIGNhdXNlZCB0aGUgaG9zdCBhcHAncyBDRCB0byBydW5cclxuICogb24gZXZlcnkgdXNlciBpbnRlcmFjdGlvbi4gV2l0aCB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBob3N0IGFwcCBpc1xyXG4gKiBjb21wbGV0ZWx5IHVuYWZmZWN0ZWQg4oCUIG9ubHkgdGhlIHJlY29yZGVyJ3Mgb3duIHNpZ25hbHMgdHJpZ2dlciBDRC5cclxuICpcclxuICogRjUgLyBwYWdlLXJlbG9hZCBzdXJ2aXZhbFxyXG4gKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICogVGhlIGFjdGl2ZSByZWNvcmRpbmcgc2Vzc2lvbiBpcyB3cml0dGVuIHRvIHNlc3Npb25TdG9yYWdlIG9uXHJcbiAqIGJlZm9yZXVubG9hZCBhbmQgcmVzdG9yZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBJZiB0aGUgdXNlciBhY2NpZGVudGFsbHlcclxuICogcmVmcmVzaGVzIG1pZC1yZWNvcmRpbmcsIG5vIGFjdGlvbnMgYXJlIGxvc3QuXHJcbiAqL1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGVyU2VydmljZSB7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBSZWFjdGl2ZSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBfaXNSZWNvcmRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRTZXNzaW9uID0gc2lnbmFsPFJlY29yZGluZ1Nlc3Npb24gfCBudWxsPihudWxsKTtcclxuICBwcml2YXRlIF9zZXNzaW9ucyA9IHNpZ25hbDxSZWNvcmRpbmdTZXNzaW9uW10+KFtdKTtcclxuICBwcml2YXRlIF9pc1BhdXNlZCA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIGlzUmVjb3JkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXNSZWNvcmRpbmcoKSk7XHJcbiAgaXNQYXVzZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9pc1BhdXNlZCgpKTtcclxuICBjdXJyZW50U2Vzc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2N1cnJlbnRTZXNzaW9uKCkpO1xyXG4gIHNlc3Npb25zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc2Vzc2lvbnMoKSk7XHJcbiAgYWN0aW9uQ291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jdXJyZW50U2Vzc2lvbigpPy5hY3Rpb25zLmxlbmd0aCA/PyAwKTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIFJBRiBiYXRjaCBidWZmZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgcGVuZGluZ0FjdGlvbnM6IFJlY29yZGVkQWN0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIHJhZklkPzogbnVtYmVyO1xyXG5cclxuICAvLyDilIDilIDilIAgTGlzdGVuZXIgcmVnaXN0cnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgZm46IEV2ZW50TGlzdGVuZXIgfT4gPSBbXTtcclxuICBwcml2YXRlIGxhc3RTY3JvbGxUaW1lID0gMDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIFNlc3Npb25TdG9yYWdlIGtleXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFU1NJT05fS0VZICA9ICdkcl9hY3RpdmVfc2Vzc2lvbic7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VTU0lPTlNfS0VZID0gJ2RyX3Nlc3Npb25zJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHtcclxuICAgIHRoaXMucmVzdG9yZUZyb21TdG9yYWdlKCk7XHJcbiAgICAvLyBSZWdpc3RlciBvdXRzaWRlIEFuZ3VsYXIgem9uZSDigJQgem9uZS5qcyBpbnRlcmNlcHRzIGJlZm9yZXVubG9hZFxyXG4gICAgLy8gaW5zaWRlIHRoZSB6b25lIGFuZCBtYXkgc3VwcHJlc3MgaXQgKGRpYWxvZy1yZXR1cm4gaGFuZGxpbmcpLlxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHRoaXMucGVyc2lzdFRvU3RvcmFnZSgpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHN0YXJ0UmVjb3JkaW5nKG5hbWU/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZXNzaW9uOiBSZWNvcmRpbmdTZXNzaW9uID0ge1xyXG4gICAgICBpZDogdGhpcy5nZW5lcmF0ZUlkKCksXHJcbiAgICAgIG5hbWU6IG5hbWUgfHwgYFNlc3Npb24gJHtuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpfWAsXHJcbiAgICAgIGRlc2NyaXB0aW9uLFxyXG4gICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXHJcbiAgICAgIHN0YXJ0VXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcclxuICAgICAgYWN0aW9uczogW10sXHJcbiAgICAgIHRhZ3M6IFtdLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9jdXJyZW50U2Vzc2lvbi5zZXQoc2Vzc2lvbik7XHJcbiAgICB0aGlzLl9pc1JlY29yZGluZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLl9pc1BhdXNlZC5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5hdHRhY2hMaXN0ZW5lcnMoKTtcclxuICAgIHRoaXMucmVjb3JkTmF2aWdhdGlvbih3aW5kb3cubG9jYXRpb24uaHJlZik7XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nKCk6IFJlY29yZGluZ1Nlc3Npb24gfCBudWxsIHtcclxuICAgIC8vIEZsdXNoIHBlbmRpbmcgYWN0aW9ucyBzeW5jaHJvbm91c2x5IGJlZm9yZSB0ZWFyaW5nIGRvd25cclxuICAgIGlmICh0aGlzLnJhZklkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yYWZJZCk7XHJcbiAgICAgIHRoaXMucmFmSWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZsdXNoUGVuZGluZygpO1xyXG5cclxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jdXJyZW50U2Vzc2lvbigpO1xyXG4gICAgaWYgKCFzZXNzaW9uKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBjb21wbGV0ZWQgPSB7IC4uLnNlc3Npb24sIGVuZFRpbWU6IERhdGUubm93KCkgfTtcclxuICAgIHRoaXMuX3Nlc3Npb25zLnVwZGF0ZShzID0+IFsuLi5zLCBjb21wbGV0ZWRdKTtcclxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnNldChudWxsKTtcclxuICAgIHRoaXMuX2lzUmVjb3JkaW5nLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLl9pc1BhdXNlZC5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5kZXRhY2hMaXN0ZW5lcnMoKTtcclxuICAgIHRoaXMucGVyc2lzdFRvU3RvcmFnZSgpO1xyXG4gICAgcmV0dXJuIGNvbXBsZXRlZDtcclxuICB9XHJcblxyXG4gIHBhdXNlUmVjb3JkaW5nKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzUmVjb3JkaW5nKCkpIHtcclxuICAgICAgdGhpcy5faXNQYXVzZWQuc2V0KCF0aGlzLl9pc1BhdXNlZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyQ3VycmVudFNlc3Npb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyZW50U2Vzc2lvbi51cGRhdGUocyA9PiBzID8geyAuLi5zLCBhY3Rpb25zOiBbXSB9IDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVBY3Rpb24oYWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb24udXBkYXRlKHMgPT5cclxuICAgICAgcyA/IHsgLi4ucywgYWN0aW9uczogcy5hY3Rpb25zLmZpbHRlcihhID0+IGEuaWQgIT09IGFjdGlvbklkKSB9IDogbnVsbFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFkZE5vdGUoYWN0aW9uSWQ6IHN0cmluZywgbm90ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyZW50U2Vzc2lvbi51cGRhdGUocyA9PlxyXG4gICAgICBzID8geyAuLi5zLCBhY3Rpb25zOiBzLmFjdGlvbnMubWFwKGEgPT4gYS5pZCA9PT0gYWN0aW9uSWQgPyB7IC4uLmEsIG5vdGUgfSA6IGEpIH0gOiBudWxsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2Vzc2lvbnMudXBkYXRlKHMgPT4gcy5maWx0ZXIoeCA9PiB4LmlkICE9PSBzZXNzaW9uSWQpKTtcclxuICB9XHJcblxyXG4gIGxvYWRTZXNzaW9uKHNlc3Npb246IFJlY29yZGluZ1Nlc3Npb24pOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnNldChzZXNzaW9uKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBSQUYgYmF0Y2ggZmx1c2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFNjaGVkdWxlIG9uZSBzaWduYWwgdXBkYXRlIGF0IHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZS5cclxuICAgKiBNdWx0aXBsZSBldmVudHMgd2l0aGluIGEgc2luZ2xlIGZyYW1lIGFyZSBjb2FsZXNjZWQg4oaSIG9uZSBDRCBjeWNsZS5cclxuICAgKi9cclxuICBwcml2YXRlIHNjaGVkdWxlRmx1c2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yYWZJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICB0aGlzLnJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgdGhpcy5yYWZJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5mbHVzaFBlbmRpbmcoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmbHVzaFBlbmRpbmcoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucGVuZGluZ0FjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMucGVuZGluZ0FjdGlvbnMuc3BsaWNlKDApO1xyXG5cclxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLl9jdXJyZW50U2Vzc2lvbi51cGRhdGUocyA9PiB7XHJcbiAgICAgICAgaWYgKCFzKSByZXR1cm4gcztcclxuICAgICAgICBsZXQgYWN0aW9ucyA9IFsuLi5zLmFjdGlvbnNdO1xyXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGJhdGNoKSB7XHJcbiAgICAgICAgICAvLyBEZWR1cGxpY2F0ZSBjb25zZWN1dGl2ZSBpbnB1dHM6IGtlZXAgb25seSB0aGUgbGF0ZXN0IHZhbHVlXHJcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnB1dCcpIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdCA9IGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgaWYgKGxhc3Q/LnR5cGUgPT09ICdpbnB1dCcgJiYgbGFzdC5zZWxlY3RvciA9PT0gYWN0aW9uLnNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdID0gYWN0aW9uO1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ucywgYWN0aW9ucyB9O1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEV2ZW50IGxpc3RlbmVycyAocmVnaXN0ZXJlZCBvdXRzaWRlIE5nWm9uZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0cyA9IHsgY2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogdHJ1ZSB9O1xyXG5cclxuICAgIC8vIEhhbmRsZXJzIHJ1biBjb21wbGV0ZWx5IG91dHNpZGUgQW5ndWxhciBab25lIOKAlCB6ZXJvIENEIGltcGFjdCBwZXIgZXZlbnQuXHJcbiAgICAvLyBPbmx5IHRoZSBSQUYgZmx1c2ggKGFib3ZlKSByZS1lbnRlcnMgdGhlIHpvbmUuXHJcbiAgICBjb25zdCBvbkNsaWNrICAgID0gKGU6IE1vdXNlRXZlbnQpICAgID0+IHsgaWYgKHRoaXMuc2hvdWxkUmVjb3JkKGUudGFyZ2V0IGFzIEVsZW1lbnQpKSB0aGlzLmhhbmRsZUNsaWNrKGUpOyB9O1xyXG4gICAgY29uc3Qgb25EYmxDbGljayA9IChlOiBNb3VzZUV2ZW50KSAgICA9PiB7IGlmICh0aGlzLnNob3VsZFJlY29yZChlLnRhcmdldCBhcyBFbGVtZW50KSkgdGhpcy5oYW5kbGVEYmxDbGljayhlKTsgfTtcclxuICAgIGNvbnN0IG9uSW5wdXQgICAgPSAoZTogRXZlbnQpICAgICAgICAgPT4geyBpZiAodGhpcy5zaG91bGRSZWNvcmQoZS50YXJnZXQgYXMgRWxlbWVudCkpIHRoaXMuaGFuZGxlSW5wdXQoZSk7IH07XHJcbiAgICBjb25zdCBvbkNoYW5nZSAgID0gKGU6IEV2ZW50KSAgICAgICAgID0+IHsgaWYgKHRoaXMuc2hvdWxkUmVjb3JkKGUudGFyZ2V0IGFzIEVsZW1lbnQpKSB0aGlzLmhhbmRsZUNoYW5nZShlKTsgfTtcclxuICAgIGNvbnN0IG9uU3VibWl0ICAgPSAoZTogRXZlbnQpICAgICAgICAgPT4geyBpZiAodGhpcy5zaG91bGRSZWNvcmQoZS50YXJnZXQgYXMgRWxlbWVudCkpIHRoaXMuaGFuZGxlU3VibWl0KGUpOyB9O1xyXG4gICAgY29uc3Qgb25LZXlkb3duICA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7IGlmICh0aGlzLnNob3VsZFJlY29yZChlLnRhcmdldCBhcyBFbGVtZW50KSkgdGhpcy5oYW5kbGVLZXlkb3duKGUpOyB9O1xyXG4gICAgY29uc3Qgb25TY3JvbGwgICA9IChlOiBFdmVudCkgICAgICAgICA9PiB7IGlmICh0aGlzLnNob3VsZFJlY29yZChlLnRhcmdldCBhcyBFbGVtZW50KSkgdGhpcy5oYW5kbGVTY3JvbGwoZSk7IH07XHJcblxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAgIG9uQ2xpY2sgICAgYXMgRXZlbnRMaXN0ZW5lciwgb3B0cyk7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJyxvbkRibENsaWNrIGFzIEV2ZW50TGlzdGVuZXIsIG9wdHMpO1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICAgb25JbnB1dCwgICAgICAgICAgICAgICAgICAgICBvcHRzKTtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgIG9uQ2hhbmdlLCAgICAgICAgICAgICAgICAgICAgb3B0cyk7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsICBvblN1Ym1pdCwgICAgICAgICAgICAgICAgICAgIG9wdHMpO1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlkb3duICBhcyBFdmVudExpc3RlbmVyLCBvcHRzKTtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgIG9uU2Nyb2xsLCAgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXHJcbiAgICAgIHsgdHlwZTogJ2NsaWNrJywgICAgZm46IG9uQ2xpY2sgICAgYXMgRXZlbnRMaXN0ZW5lciB9LFxyXG4gICAgICB7IHR5cGU6ICdkYmxjbGljaycsIGZuOiBvbkRibENsaWNrIGFzIEV2ZW50TGlzdGVuZXIgfSxcclxuICAgICAgeyB0eXBlOiAnaW5wdXQnLCAgICBmbjogb25JbnB1dCAgICBhcyBFdmVudExpc3RlbmVyIH0sXHJcbiAgICAgIHsgdHlwZTogJ2NoYW5nZScsICAgZm46IG9uQ2hhbmdlICAgYXMgRXZlbnRMaXN0ZW5lciB9LFxyXG4gICAgICB7IHR5cGU6ICdzdWJtaXQnLCAgIGZuOiBvblN1Ym1pdCAgIGFzIEV2ZW50TGlzdGVuZXIgfSxcclxuICAgICAgeyB0eXBlOiAna2V5ZG93bicsICBmbjogb25LZXlkb3duICBhcyBFdmVudExpc3RlbmVyIH0sXHJcbiAgICAgIHsgdHlwZTogJ3Njcm9sbCcsICAgZm46IG9uU2Nyb2xsICAgYXMgRXZlbnRMaXN0ZW5lciB9LFxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGV0YWNoTGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgoeyB0eXBlLCBmbiB9KSA9PlxyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuLCB0cnVlKVxyXG4gICAgKTtcclxuICAgIHRoaXMubGlzdGVuZXJzID0gW107XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgSGFuZGxlcnMgKHJ1biBvdXRzaWRlIE5nWm9uZSwgY2FsbCBhZGRBY3Rpb24gd2hpY2ggYmF0Y2hlcykg4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQ2xpY2soZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmdldEVsZW1lbnRJbmZvKGVsKTtcclxuICAgIHRoaXMuYWRkQWN0aW9uKHtcclxuICAgICAgdHlwZTogJ2NsaWNrJyxcclxuICAgICAgc2VsZWN0b3I6IHRoaXMuYnVpbGRTZWxlY3RvcihlbCksXHJcbiAgICAgIHNlbGVjdG9yU3RyYXRlZ3k6IHRoaXMuZ2V0U2VsZWN0b3JTdHJhdGVneShlbCksXHJcbiAgICAgIGVsZW1lbnQ6IGluZm8sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBgQ2xpY2sgb24gJHt0aGlzLmRlc2NyaWJlRWxlbWVudChpbmZvKX1gLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZURibENsaWNrKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpbmZvID0gdGhpcy5nZXRFbGVtZW50SW5mbyhlbCk7XHJcbiAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgIHR5cGU6ICdkYmxjbGljaycsXHJcbiAgICAgIHNlbGVjdG9yOiB0aGlzLmJ1aWxkU2VsZWN0b3IoZWwpLFxyXG4gICAgICBzZWxlY3RvclN0cmF0ZWd5OiB0aGlzLmdldFNlbGVjdG9yU3RyYXRlZ3koZWwpLFxyXG4gICAgICBlbGVtZW50OiBpbmZvLFxyXG4gICAgICBkZXNjcmlwdGlvbjogYERvdWJsZS1jbGljayBvbiAke3RoaXMuZGVzY3JpYmVFbGVtZW50KGluZm8pfWAsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICBpZiAoWydjaGVja2JveCcsICdyYWRpbyddLmluY2x1ZGVzKGVsLnR5cGUpKSByZXR1cm47IC8vIGhhbmRsZWQgYnkgY2hhbmdlXHJcbiAgICBjb25zdCBpbmZvID0gdGhpcy5nZXRFbGVtZW50SW5mbyhlbCk7XHJcbiAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIHNlbGVjdG9yOiB0aGlzLmJ1aWxkU2VsZWN0b3IoZWwpLFxyXG4gICAgICBzZWxlY3RvclN0cmF0ZWd5OiB0aGlzLmdldFNlbGVjdG9yU3RyYXRlZ3koZWwpLFxyXG4gICAgICBlbGVtZW50OiBpbmZvLFxyXG4gICAgICB2YWx1ZTogZWwudmFsdWUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBgVHlwZSBcIiR7ZWwudmFsdWV9XCIgaW4gJHt0aGlzLmRlc2NyaWJlRWxlbWVudChpbmZvKX1gLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUNoYW5nZShlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSBlLnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpbmZvID0gdGhpcy5nZXRFbGVtZW50SW5mbyhlbCk7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuYnVpbGRTZWxlY3RvcihlbCk7XHJcblxyXG4gICAgaWYgKGVsLnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XHJcbiAgICAgIHRoaXMuYWRkQWN0aW9uKHtcclxuICAgICAgICB0eXBlOiAnc2VsZWN0JyxcclxuICAgICAgICBzZWxlY3RvcixcclxuICAgICAgICBzZWxlY3RvclN0cmF0ZWd5OiB0aGlzLmdldFNlbGVjdG9yU3RyYXRlZ3koZWwpLFxyXG4gICAgICAgIGVsZW1lbnQ6IGluZm8sXHJcbiAgICAgICAgdmFsdWU6IGVsLnZhbHVlLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgU2VsZWN0IFwiJHtlbC52YWx1ZX1cIiBpbiAke3RoaXMuZGVzY3JpYmVFbGVtZW50KGluZm8pfWAsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICgoZWwgYXMgSFRNTElucHV0RWxlbWVudCkudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcclxuICAgICAgICBzZWxlY3RvcixcclxuICAgICAgICBzZWxlY3RvclN0cmF0ZWd5OiB0aGlzLmdldFNlbGVjdG9yU3RyYXRlZ3koZWwpLFxyXG4gICAgICAgIGVsZW1lbnQ6IGluZm8sXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZygoZWwgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCksXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGAkeyhlbCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkID8gJ0NoZWNrJyA6ICdVbmNoZWNrJ30gJHt0aGlzLmRlc2NyaWJlRWxlbWVudChpbmZvKX1gLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtID0gZS50YXJnZXQgYXMgSFRNTEZvcm1FbGVtZW50O1xyXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuZ2V0RWxlbWVudEluZm8oZm9ybSk7XHJcbiAgICB0aGlzLmFkZEFjdGlvbih7XHJcbiAgICAgIHR5cGU6ICdzdWJtaXQnLFxyXG4gICAgICBzZWxlY3RvcjogdGhpcy5idWlsZFNlbGVjdG9yKGZvcm0pLFxyXG4gICAgICBzZWxlY3RvclN0cmF0ZWd5OiB0aGlzLmdldFNlbGVjdG9yU3RyYXRlZ3koZm9ybSksXHJcbiAgICAgIGVsZW1lbnQ6IGluZm8sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBgU3VibWl0IGZvcm0gJHtpbmZvLmlkID8gJyMnICsgaW5mby5pZCA6IGluZm8ubmFtZSA/PyAnJ31gLnRyaW0oKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVTY3JvbGwoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2Nyb2xsVGltZSA8IDEwMDApIHJldHVybjsgLy8gZGVib3VuY2UgMSBzXHJcbiAgICB0aGlzLmxhc3RTY3JvbGxUaW1lID0gbm93O1xyXG5cclxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpc0RvYyA9ICFlbC50YWdOYW1lIHx8IGVsLnRhZ05hbWUgPT09ICdIVE1MJztcclxuICAgIGNvbnN0IHNjcm9sbFkgPSBpc0RvYyA/IHdpbmRvdy5zY3JvbGxZIDogZWwuc2Nyb2xsVG9wO1xyXG4gICAgY29uc3Qgc2Nyb2xsWCA9IGlzRG9jID8gd2luZG93LnNjcm9sbFggOiBlbC5zY3JvbGxMZWZ0O1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSAoZWwudGFnTmFtZSA9PT0gJ0hUTUwnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJylcclxuICAgICAgPyAnd2luZG93J1xyXG4gICAgICA6IHRoaXMuYnVpbGRTZWxlY3RvcihlbCk7XHJcblxyXG4gICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICB0eXBlOiAnc2Nyb2xsJyxcclxuICAgICAgc2VsZWN0b3IsXHJcbiAgICAgIHNlbGVjdG9yU3RyYXRlZ3k6ICdjb21iaW5lZCcsXHJcbiAgICAgIHZhbHVlOiBgJHtzY3JvbGxYfSwke3Njcm9sbFl9YCxcclxuICAgICAgZGVzY3JpcHRpb246IGBTY3JvbGwgdG8gKCR7c2Nyb2xsWH0sICR7c2Nyb2xsWX0pYCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwZWNpYWxLZXlzID0gWydFbnRlcicsICdFc2NhcGUnLCAnVGFiJywgJ0Y1JywgJ0YxMiddO1xyXG4gICAgaWYgKCFzcGVjaWFsS2V5cy5pbmNsdWRlcyhlLmtleSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBlbCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy5hZGRBY3Rpb24oe1xyXG4gICAgICB0eXBlOiAna2V5cHJlc3MnLFxyXG4gICAgICBzZWxlY3RvcjogdGhpcy5idWlsZFNlbGVjdG9yKGVsKSxcclxuICAgICAgc2VsZWN0b3JTdHJhdGVneTogdGhpcy5nZXRTZWxlY3RvclN0cmF0ZWd5KGVsKSxcclxuICAgICAgdmFsdWU6IGUua2V5LFxyXG4gICAgICBkZXNjcmlwdGlvbjogYFByZXNzIFwiJHtlLmtleX1cIiBvbiAke2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKX1gLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29yZE5hdmlnYXRpb24obmF2VXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIE5hdmlnYXRpb24gaXMgYWx3YXlzIGFkZGVkIHN5bmNocm9ub3VzbHkgKG5vIHBlbmRpbmcgYmF0Y2ggbmVlZGVkKVxyXG4gICAgY29uc3QgYWN0aW9uOiBSZWNvcmRlZEFjdGlvbiA9IHtcclxuICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVJZCgpLFxyXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgIHVybDogbmF2VXJsLFxyXG4gICAgICB0eXBlOiAnbmF2aWdhdGlvbicsXHJcbiAgICAgIHNlbGVjdG9yOiAnd2luZG93JyxcclxuICAgICAgc2VsZWN0b3JTdHJhdGVneTogJ2NvbWJpbmVkJyxcclxuICAgICAgZGVzY3JpcHRpb246IGBOYXZpZ2F0ZSB0byAke25hdlVybH1gLFxyXG4gICAgfTtcclxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uLnVwZGF0ZShzID0+XHJcbiAgICAgIHMgPyB7IC4uLnMsIGFjdGlvbnM6IFsuLi5zLmFjdGlvbnMsIGFjdGlvbl0gfSA6IHNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgU2VsZWN0b3IgYnVpbGRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RvcihlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGVzdElkID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRlc3RpZCcpO1xyXG4gICAgaWYgKHRlc3RJZCkgcmV0dXJuIGBbZGF0YS10ZXN0aWQ9XCIke3Rlc3RJZH1cIl1gO1xyXG5cclxuICAgIGNvbnN0IGN5ID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWN5Jyk7XHJcbiAgICBpZiAoY3kpIHJldHVybiBgW2RhdGEtY3k9XCIke2N5fVwiXWA7XHJcblxyXG4gICAgaWYgKGVsLmlkICYmICFlbC5pZC5pbmNsdWRlcygnOicpKSByZXR1cm4gYCMke2VsLmlkfWA7XHJcblxyXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xyXG4gICAgaWYgKG5hbWUpIHJldHVybiBgJHtlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCl9W25hbWU9XCIke25hbWV9XCJdYDtcclxuXHJcbiAgICBjb25zdCBhcmlhTGFiZWwgPSBlbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcclxuICAgIGlmIChhcmlhTGFiZWwpIHJldHVybiBgW2FyaWEtbGFiZWw9XCIke2FyaWFMYWJlbH1cIl1gO1xyXG5cclxuICAgIGNvbnN0IHJlbGV2YW50Q2xhc3NlcyA9IEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KVxyXG4gICAgICAuZmlsdGVyKGMgPT4gIWMuc3RhcnRzV2l0aCgnbmctJykgJiYgIWMuc3RhcnRzV2l0aCgnY2RrLScpICYmIGMubGVuZ3RoID4gMClcclxuICAgICAgLnNsaWNlKDAsIDMpO1xyXG4gICAgaWYgKHJlbGV2YW50Q2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBgJHtlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCl9LiR7cmVsZXZhbnRDbGFzc2VzLmpvaW4oJy4nKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChbJ0JVVFRPTicsICdBJ10uaW5jbHVkZXMoZWwudGFnTmFtZSkpIHtcclxuICAgICAgY29uc3QgdGV4dCA9IGVsLnRleHRDb250ZW50Py50cmltKCkuc2xpY2UoMCwgMzApO1xyXG4gICAgICBpZiAodGV4dCkgcmV0dXJuIGAke2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKX06Y29udGFpbnMoXCIke3RleHR9XCIpYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWxlY3RvclN0cmF0ZWd5KGVsOiBIVE1MRWxlbWVudCk6IFJlY29yZGVkQWN0aW9uWydzZWxlY3RvclN0cmF0ZWd5J10ge1xyXG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS10ZXN0aWQnKSkgcmV0dXJuICdkYXRhLXRlc3RpZCc7XHJcbiAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWN5JykpIHJldHVybiAnZGF0YS1jeSc7XHJcbiAgICBpZiAoZWwuaWQpIHJldHVybiAnaWQnO1xyXG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSgnbmFtZScpKSByZXR1cm4gJ25hbWUnO1xyXG4gICAgcmV0dXJuICdjbGFzcyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVsZW1lbnRJbmZvKGVsOiBIVE1MRWxlbWVudCk6IEVsZW1lbnRJbmZvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRhZ05hbWU6IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgaWQ6IGVsLmlkIHx8IHVuZGVmaW5lZCxcclxuICAgICAgY2xhc3NlczogQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbHRlcihjID0+ICFjLnN0YXJ0c1dpdGgoJ25nLScpKSxcclxuICAgICAgZGF0YVRlc3RJZDogZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRlc3RpZCcpIHx8IHVuZGVmaW5lZCxcclxuICAgICAgZGF0YUN5OiBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3knKSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIG5hbWU6IGVsLmdldEF0dHJpYnV0ZSgnbmFtZScpIHx8IHVuZGVmaW5lZCxcclxuICAgICAgdHlwZTogZWwuZ2V0QXR0cmlidXRlKCd0eXBlJykgfHwgdW5kZWZpbmVkLFxyXG4gICAgICBwbGFjZWhvbGRlcjogZWwuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8IHVuZGVmaW5lZCxcclxuICAgICAgdGV4dDogZWwudGV4dENvbnRlbnQ/LnRyaW0oKS5zbGljZSgwLCA1MCkgfHwgdW5kZWZpbmVkLFxyXG4gICAgICBocmVmOiAoZWwgYXMgSFRNTEFuY2hvckVsZW1lbnQpLmhyZWYgfHwgdW5kZWZpbmVkLFxyXG4gICAgICBhcmlhTGFiZWw6IGVsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpIHx8IHVuZGVmaW5lZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlc2NyaWJlRWxlbWVudChpbmZvOiBFbGVtZW50SW5mbyk6IHN0cmluZyB7XHJcbiAgICBpZiAoaW5mby5kYXRhVGVzdElkKSByZXR1cm4gYFtkYXRhLXRlc3RpZD1cIiR7aW5mby5kYXRhVGVzdElkfVwiXWA7XHJcbiAgICBpZiAoaW5mby5kYXRhQ3kpIHJldHVybiBgW2RhdGEtY3k9XCIke2luZm8uZGF0YUN5fVwiXWA7XHJcbiAgICBpZiAoaW5mby5pZCkgcmV0dXJuIGAjJHtpbmZvLmlkfWA7XHJcbiAgICBpZiAoaW5mby5hcmlhTGFiZWwpIHJldHVybiBgXCIke2luZm8uYXJpYUxhYmVsfVwiYDtcclxuICAgIGlmIChpbmZvLnBsYWNlaG9sZGVyKSByZXR1cm4gYFwiJHtpbmZvLnBsYWNlaG9sZGVyfVwiIGlucHV0YDtcclxuICAgIGlmIChpbmZvLnRleHQpIHJldHVybiBgXCIke2luZm8udGV4dH1cImA7XHJcbiAgICByZXR1cm4gaW5mby50YWdOYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEd1YXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIHNob3VsZFJlY29yZCh0YXJnZXQ6IEVsZW1lbnQgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuX2lzUmVjb3JkaW5nKCkgfHwgdGhpcy5faXNQYXVzZWQoKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKCF0YXJnZXQpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnW2RhdGEtZGVidWctcGFuZWxdJykpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEJhdGNoIGJ1ZmZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBhZGRBY3Rpb24ocGFydGlhbDogT21pdDxSZWNvcmRlZEFjdGlvbiwgJ2lkJyB8ICd0aW1lc3RhbXAnIHwgJ3VybCc+KTogdm9pZCB7XHJcbiAgICBjb25zdCBhY3Rpb246IFJlY29yZGVkQWN0aW9uID0ge1xyXG4gICAgICBpZDogdGhpcy5nZW5lcmF0ZUlkKCksXHJcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcclxuICAgICAgLi4ucGFydGlhbCxcclxuICAgIH07XHJcbiAgICB0aGlzLnBlbmRpbmdBY3Rpb25zLnB1c2goYWN0aW9uKTtcclxuICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFNlc3Npb25TdG9yYWdlIChGNSBzdXJ2aXZhbCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgcGVyc2lzdFRvU3RvcmFnZSgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jdXJyZW50U2Vzc2lvbigpO1xyXG4gICAgICBpZiAoc2Vzc2lvbiAmJiB0aGlzLl9pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgIFJlY29yZGVyU2VydmljZS5TRVNTSU9OX0tFWSxcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgc2Vzc2lvbiwgaXNQYXVzZWQ6IHRoaXMuX2lzUGF1c2VkKCkgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUmVjb3JkZXJTZXJ2aWNlLlNFU1NJT05fS0VZKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzZXNzaW9ucyA9IHRoaXMuX3Nlc3Npb25zKCk7XHJcbiAgICAgIGlmIChzZXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShSZWNvcmRlclNlcnZpY2UuU0VTU0lPTlNfS0VZLCBKU09OLnN0cmluZ2lmeShzZXNzaW9ucykpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIHsgLyogc3RvcmFnZSBxdW90YSBleGNlZWRlZCBvciBwcml2YXRlIGJyb3dzaW5nICovIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzdG9yZUZyb21TdG9yYWdlKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2F2ZWRTZXNzaW9ucyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUmVjb3JkZXJTZXJ2aWNlLlNFU1NJT05TX0tFWSk7XHJcbiAgICAgIGlmIChzYXZlZFNlc3Npb25zKSB0aGlzLl9zZXNzaW9ucy5zZXQoSlNPTi5wYXJzZShzYXZlZFNlc3Npb25zKSk7XHJcblxyXG4gICAgICBjb25zdCBzYXZlZEFjdGl2ZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUmVjb3JkZXJTZXJ2aWNlLlNFU1NJT05fS0VZKTtcclxuICAgICAgaWYgKHNhdmVkQWN0aXZlKSB7XHJcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uLCBpc1BhdXNlZCB9ID0gSlNPTi5wYXJzZShzYXZlZEFjdGl2ZSkgYXMge1xyXG4gICAgICAgICAgc2Vzc2lvbjogUmVjb3JkaW5nU2Vzc2lvbjtcclxuICAgICAgICAgIGlzUGF1c2VkOiBib29sZWFuO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFNlc3Npb24uc2V0KHNlc3Npb24pO1xyXG4gICAgICAgIHRoaXMuX2lzUmVjb3JkaW5nLnNldCh0cnVlKTtcclxuICAgICAgICB0aGlzLl9pc1BhdXNlZC5zZXQoaXNQYXVzZWQpO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7IC8vIHJlc3VtZSByZWNvcmRpbmcgYWZ0ZXIgcmVsb2FkXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggeyAvKiBjb3JydXB0IG9yIG1pc3Npbmcgc3RvcmFnZSAqLyB9XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTEpO1xyXG4gIH1cclxufVxyXG4iXX0=
|