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.
@@ -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('navigation', window.location.href);
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
- // ─── Event Listeners ──────────────────────────────────────────────────────
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
- const onClick = (e) => this.zone.run(() => this.handleClick(e));
73
- const onDblClick = (e) => this.zone.run(() => this.handleDblClick(e));
74
- const onInput = (e) => this.zone.run(() => this.handleInput(e));
75
- const onChange = (e) => this.zone.run(() => this.handleChange(e));
76
- const onSubmit = (e) => this.zone.run(() => this.handleSubmit(e));
77
- const onKeydown = (e) => this.zone.run(() => this.handleKeydown(e));
78
- const onScroll = (e) => this.zone.run(() => this.handleScroll(e));
79
- document.addEventListener('click', onClick, opts);
80
- document.addEventListener('dblclick', onDblClick, opts);
81
- document.addEventListener('input', onInput, opts);
82
- document.addEventListener('change', onChange, opts);
83
- document.addEventListener('submit', onSubmit, opts);
84
- document.addEventListener('keydown', onKeydown, opts);
85
- document.addEventListener('scroll', onScroll, { capture: true, passive: true });
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 ? info.name : ''}`.trim(),
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 1s
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(type, navUrl) {
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 Building ────────────────────────────────────────────────────
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
- // ─── Helpers ──────────────────────────────────────────────────────────────
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
- // Deduplicate consecutive identical inputs (keep only latest value)
330
- if (action.type === 'input') {
331
- this._currentSession.update(s => {
332
- if (!s)
333
- return s;
334
- const last = s.actions[s.actions.length - 1];
335
- if (last?.type === 'input' && last.selector === action.selector) {
336
- return { ...s, actions: [...s.actions.slice(0, -1), action] };
337
- }
338
- return { ...s, actions: [...s.actions, action] };
339
- });
340
- return;
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
- this._currentSession.update(s => s ? { ...s, actions: [...s.actions, action] } : s);
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=