inspector-ng 0.0.7 → 0.0.10

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.
@@ -4,7 +4,8 @@ import { GUIDE_HITBOX_SIZE, GUIDE_SNAP_DISTANCE, inspector_STATE_VERSION, inspec
4
4
  import { getInspectMeasurement, getRectFromDom, getTargetElement, getVisibleTextBlocks, } from './dom';
5
5
  import { getDistanceOverlay } from './distances';
6
6
  import { clamp, getViewportSize, rectsEqual } from './geometry';
7
- import { InspectorCheckpointRegistry } from './checkpoints';
7
+ import { InspectorCheckpointService, } from './checkpoints';
8
+ import { fuzzyCheckpoints } from './checkpoint-search';
8
9
  import { createId, formatValue } from './utils';
9
10
  import * as i0 from "@angular/core";
10
11
  export class inspectorComponent {
@@ -13,13 +14,22 @@ export class inspectorComponent {
13
14
  this.formatValue = formatValue;
14
15
  this.guideHitboxSize = GUIDE_HITBOX_SIZE;
15
16
  this.overlayRoot = viewChild('overlayRoot');
17
+ this.checkpointDialog = viewChild('checkpointDialog');
18
+ this.checkpointSearch = viewChild('checkpointSearch');
16
19
  this.highlightColor = '#4f8cff';
17
20
  this.guideColor = '#ff7a00';
18
21
  this.hoverHighlightEnabled = true;
19
22
  this.persistOnReload = false;
20
- this.checkpointRegistry = inject(InspectorCheckpointRegistry, { optional: true });
21
- this.checkpointsOpen = signal(false);
23
+ this.checkpointService = inject(InspectorCheckpointService, { optional: true });
24
+ this.commandBarOpen = signal(false);
25
+ this.checkpointQuery = signal('');
26
+ this.activeCheckpointIndex = signal(0);
22
27
  this.editingCheckpointId = signal(null);
28
+ this.deletingCheckpointId = signal(null);
29
+ this.renameDraft = signal('');
30
+ this.checkpointToast = signal(null);
31
+ this.checkpointToastIsError = signal(false);
32
+ this.filteredCheckpoints = computed(() => fuzzyCheckpoints(this.checkpointService?.checkpoints() ?? [], this.checkpointQuery()));
23
33
  this.enabled = signal(true);
24
34
  this.toolMode = signal('none');
25
35
  this.guideOrientation = signal('vertical');
@@ -55,6 +65,7 @@ export class inspectorComponent {
55
65
  this.draggingGuideId = null;
56
66
  this.selectedElement = null;
57
67
  this.hoverElement = null;
68
+ this.toastTimer = null;
58
69
  this.canUndo = computed(() => this.historyIndex() > 0);
59
70
  this.canRedo = computed(() => this.historyIndex() >= 0 &&
60
71
  this.historyIndex() < this.history().length - 1);
@@ -118,6 +129,8 @@ export class inspectorComponent {
118
129
  window.removeEventListener('click', this.handleCapturedClick, {
119
130
  capture: true,
120
131
  });
132
+ if (this.toastTimer)
133
+ clearTimeout(this.toastTimer);
121
134
  }
122
135
  setToolMode(mode) {
123
136
  if (!this.enabled()) {
@@ -144,31 +157,114 @@ export class inspectorComponent {
144
157
  this.showTypography.update((value) => !value);
145
158
  this.refreshTypographyBlocks();
146
159
  }
147
- toggleCheckpoints() {
148
- this.checkpointsOpen.update((value) => !value);
149
- }
150
160
  disableInspector() {
151
161
  this.setInspectorEnabled(false);
152
162
  }
153
163
  async saveCheckpoint() {
154
- await this.checkpointRegistry?.save();
164
+ const checkpoint = await this.checkpointService?.save();
165
+ if (checkpoint) {
166
+ this.showCheckpointToast(`Saved “${checkpoint.name}”.`);
167
+ }
168
+ else if (this.checkpointService?.error()) {
169
+ this.showCheckpointToast(this.checkpointService.error(), true);
170
+ }
155
171
  }
156
- async restoreCheckpoint(checkpoint) {
157
- await this.checkpointRegistry?.restore(checkpoint.id);
172
+ async openCheckpointCommandBar() {
173
+ if (!this.checkpointService || !this.isBrowser || this.commandBarOpen())
174
+ return;
175
+ this.commandBarOpen.set(true);
176
+ this.checkpointQuery.set('');
177
+ this.activeCheckpointIndex.set(0);
178
+ this.editingCheckpointId.set(null);
179
+ this.deletingCheckpointId.set(null);
180
+ this.checkpointService.clearError();
181
+ this.checkpointDialog()?.nativeElement.showModal();
182
+ queueMicrotask(() => this.checkpointSearch()?.nativeElement.focus());
183
+ await this.checkpointService.load();
184
+ this.clampActiveCheckpoint();
185
+ }
186
+ closeCheckpointCommandBar() {
187
+ if (this.checkpointService?.busy())
188
+ return;
189
+ this.checkpointDialog()?.nativeElement.close();
190
+ this.commandBarOpen.set(false);
191
+ this.editingCheckpointId.set(null);
192
+ this.deletingCheckpointId.set(null);
193
+ }
194
+ updateCheckpointQuery(event) {
195
+ this.checkpointQuery.set(event.target.value);
196
+ this.activeCheckpointIndex.set(0);
197
+ this.editingCheckpointId.set(null);
198
+ this.deletingCheckpointId.set(null);
199
+ this.checkpointService?.clearError();
158
200
  }
159
- deleteCheckpoint(checkpoint) {
160
- this.checkpointRegistry?.delete(checkpoint.id);
201
+ setActiveCheckpoint(index) {
202
+ this.activeCheckpointIndex.set(index);
161
203
  }
162
- beginRename(checkpoint) {
204
+ async restoreCheckpoint(checkpoint) {
205
+ if (!this.checkpointService || this.checkpointService.busy())
206
+ return;
207
+ const restored = await this.checkpointService.restore(checkpoint.id);
208
+ if (!restored)
209
+ return;
210
+ this.checkpointDialog()?.nativeElement.close();
211
+ this.commandBarOpen.set(false);
212
+ this.showCheckpointToast(`Restored “${checkpoint.name}”.`);
213
+ }
214
+ beginRename(checkpoint, event) {
215
+ event?.stopPropagation();
216
+ if (this.checkpointService?.busy())
217
+ return;
163
218
  this.editingCheckpointId.set(checkpoint.id);
219
+ this.deletingCheckpointId.set(null);
220
+ this.renameDraft.set(checkpoint.name);
221
+ queueMicrotask(() => {
222
+ const input = this.checkpointDialog()?.nativeElement.querySelector('.inspector-command-row__rename');
223
+ input?.focus();
224
+ input?.select();
225
+ });
164
226
  }
165
- finishRename(checkpoint, event) {
166
- const input = event.target;
167
- this.checkpointRegistry?.rename(checkpoint.id, input.value);
168
- this.editingCheckpointId.set(null);
227
+ updateRenameDraft(event) {
228
+ this.renameDraft.set(event.target.value);
229
+ this.checkpointService?.clearError();
230
+ }
231
+ async finishRename(checkpoint) {
232
+ if (await this.checkpointService?.rename(checkpoint.id, this.renameDraft())) {
233
+ this.editingCheckpointId.set(null);
234
+ this.checkpointSearch()?.nativeElement.focus();
235
+ }
169
236
  }
170
237
  cancelRename() {
171
238
  this.editingCheckpointId.set(null);
239
+ this.checkpointService?.clearError();
240
+ this.checkpointSearch()?.nativeElement.focus();
241
+ }
242
+ beginDelete(checkpoint, event) {
243
+ event?.stopPropagation();
244
+ if (this.checkpointService?.busy())
245
+ return;
246
+ this.deletingCheckpointId.set(checkpoint.id);
247
+ this.editingCheckpointId.set(null);
248
+ }
249
+ cancelDelete(event) {
250
+ event?.stopPropagation();
251
+ this.deletingCheckpointId.set(null);
252
+ this.checkpointSearch()?.nativeElement.focus();
253
+ }
254
+ async confirmDelete(checkpoint, event) {
255
+ event?.stopPropagation();
256
+ if (!await this.checkpointService?.delete(checkpoint.id))
257
+ return;
258
+ this.deletingCheckpointId.set(null);
259
+ this.clampActiveCheckpoint();
260
+ this.checkpointSearch()?.nativeElement.focus();
261
+ }
262
+ handleCheckpointDialogClick(event) {
263
+ if (event.target === this.checkpointDialog()?.nativeElement &&
264
+ !this.checkpointService?.busy() &&
265
+ !this.deletingCheckpointId()) {
266
+ this.closeCheckpointCommandBar();
267
+ }
172
268
  }
173
269
  clearGuides() {
174
270
  this.guides.set([]);
@@ -189,12 +285,24 @@ export class inspectorComponent {
189
285
  }
190
286
  handleKeydown(event) {
191
287
  const key = event.key.toLowerCase();
192
- if (key === 'm') {
193
- const target = event.target;
194
- if (target?.matches('input, textarea, select') ||
195
- target?.isContentEditable) {
196
- return;
197
- }
288
+ if (this.checkpointService &&
289
+ !event.repeat &&
290
+ (event.metaKey || event.ctrlKey) &&
291
+ event.shiftKey &&
292
+ key === 'p') {
293
+ event.preventDefault();
294
+ this.commandBarOpen() ? this.closeCheckpointCommandBar() : void this.openCheckpointCommandBar();
295
+ return;
296
+ }
297
+ if (this.commandBarOpen()) {
298
+ this.handleCommandBarKeydown(event, key);
299
+ return;
300
+ }
301
+ if (this.blocksInspectorShortcut(event.target) || event.repeat) {
302
+ return;
303
+ }
304
+ const hasShortcutModifier = event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;
305
+ if (key === 'm' && !hasShortcutModifier) {
198
306
  event.preventDefault();
199
307
  this.setInspectorEnabled(!this.enabled());
200
308
  return;
@@ -207,6 +315,14 @@ export class inspectorComponent {
207
315
  event.shiftKey ? this.redo() : this.undo();
208
316
  return;
209
317
  }
318
+ if (event.key === 'Alt') {
319
+ this.altPressed.set(true);
320
+ this.updateDistanceOverlay();
321
+ return;
322
+ }
323
+ if (hasShortcutModifier) {
324
+ return;
325
+ }
210
326
  if (key === 's') {
211
327
  event.preventDefault();
212
328
  this.setToolMode('select');
@@ -227,11 +343,6 @@ export class inspectorComponent {
227
343
  this.setGuideOrientation('vertical');
228
344
  return;
229
345
  }
230
- if (event.key === 'Alt') {
231
- this.altPressed.set(true);
232
- this.updateDistanceOverlay();
233
- return;
234
- }
235
346
  if (key === 'escape') {
236
347
  event.preventDefault();
237
348
  this.selectedMeasurement.set(null);
@@ -361,7 +472,6 @@ export class inspectorComponent {
361
472
  this.distanceOverlay.set(null);
362
473
  this.textBlocks.set([]);
363
474
  this.guidePreview.set(null);
364
- this.checkpointsOpen.set(false);
365
475
  this.altPressed.set(false);
366
476
  this.selectedElement = null;
367
477
  this.hoverElement = null;
@@ -369,6 +479,82 @@ export class inspectorComponent {
369
479
  }
370
480
  this.refreshTypographyBlocks();
371
481
  }
482
+ handleCommandBarKeydown(event, key) {
483
+ const checkpoints = this.filteredCheckpoints();
484
+ const active = checkpoints[this.activeCheckpointIndex()];
485
+ const target = event.target;
486
+ const isRenameInput = target?.classList?.contains('inspector-command-row__rename') ?? false;
487
+ if (key === 'escape') {
488
+ event.preventDefault();
489
+ if (this.editingCheckpointId())
490
+ this.cancelRename();
491
+ else if (this.deletingCheckpointId())
492
+ this.cancelDelete();
493
+ else
494
+ this.closeCheckpointCommandBar();
495
+ return;
496
+ }
497
+ if (this.checkpointService?.busy())
498
+ return;
499
+ const editingCheckpoint = checkpoints.find(({ id }) => id === this.editingCheckpointId());
500
+ if (isRenameInput && key === 'enter' && editingCheckpoint) {
501
+ event.preventDefault();
502
+ void this.finishRename(editingCheckpoint);
503
+ return;
504
+ }
505
+ if (isRenameInput)
506
+ return;
507
+ if (key === 'arrowdown') {
508
+ event.preventDefault();
509
+ this.activeCheckpointIndex.set(Math.min(this.activeCheckpointIndex() + 1, Math.max(0, checkpoints.length - 1)));
510
+ this.scrollActiveCheckpointIntoView();
511
+ return;
512
+ }
513
+ if (key === 'arrowup') {
514
+ event.preventDefault();
515
+ this.activeCheckpointIndex.set(Math.max(0, this.activeCheckpointIndex() - 1));
516
+ this.scrollActiveCheckpointIntoView();
517
+ return;
518
+ }
519
+ if (key === 'enter' && active && !this.deletingCheckpointId()) {
520
+ event.preventDefault();
521
+ void this.restoreCheckpoint(active);
522
+ return;
523
+ }
524
+ if (key === 'f2' && active) {
525
+ event.preventDefault();
526
+ this.beginRename(active);
527
+ return;
528
+ }
529
+ if (key === 'delete' && active) {
530
+ event.preventDefault();
531
+ this.beginDelete(active);
532
+ }
533
+ }
534
+ blocksInspectorShortcut(target) {
535
+ if (!(target instanceof HTMLElement))
536
+ return false;
537
+ return target.closest('form, input, textarea, select, option, [contenteditable]:not([contenteditable="false"]), [role="textbox"]') !== null;
538
+ }
539
+ clampActiveCheckpoint() {
540
+ this.activeCheckpointIndex.set(Math.min(this.activeCheckpointIndex(), Math.max(0, this.filteredCheckpoints().length - 1)));
541
+ }
542
+ scrollActiveCheckpointIntoView() {
543
+ queueMicrotask(() => {
544
+ const row = this.checkpointDialog()?.nativeElement.querySelector(`[data-checkpoint-index="${this.activeCheckpointIndex()}"]`);
545
+ row?.scrollIntoView({ block: 'nearest' });
546
+ });
547
+ }
548
+ showCheckpointToast(message, isError = false) {
549
+ if (this.toastTimer)
550
+ clearTimeout(this.toastTimer);
551
+ this.checkpointToastIsError.set(isError);
552
+ this.checkpointToast.set(message);
553
+ this.toastTimer = setTimeout(() => {
554
+ this.checkpointToast.set(null);
555
+ this.checkpointToastIsError.set(false);
556
+ }, 2500);
557
+ }
372
558
  selectElementAtPoint(event) {
373
559
  const overlay = this.overlayRoot()?.nativeElement ?? null;
374
560
  const target = getTargetElement({ x: event.clientX, y: event.clientY }, overlay);
@@ -513,11 +699,11 @@ export class inspectorComponent {
513
699
  return null;
514
700
  }
515
701
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled", persistOnReload: "persistOnReload" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (enabled()) {\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n aria-label=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Select</span>\n </button>\n\n @if (checkpointRegistry) {\n <div class=\"inspector-checkpoint-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"checkpointsOpen()\"\n (click)=\"toggleCheckpoints()\"\n aria-label=\"Checkpoints\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2.5h10v11H3zm2 2v2h6v-2zm0 4v2h4v-2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Checkpoints</span>\n </button>\n\n @if (checkpointsOpen()) {\n <section class=\"inspector-checkpoint-panel\" aria-label=\"Saved checkpoints\">\n <header class=\"inspector-checkpoint-panel__header\">\n <div>\n <strong>Checkpoints</strong>\n <span>{{ checkpointRegistry.checkpoints().length }}</span>\n </div>\n <button\n type=\"button\"\n class=\"inspector-checkpoint-save\"\n (click)=\"saveCheckpoint()\"\n [disabled]=\"checkpointRegistry.isBusy()\"\n >\n {{ checkpointRegistry.isBusy() ? 'Working\u2026' : 'Save current' }}\n </button>\n </header>\n\n @if (checkpointRegistry.error(); as error) {\n <p class=\"inspector-checkpoint-message inspector-checkpoint-message--error\">{{ error }}</p>\n }\n @if (checkpointRegistry.warning(); as warning) {\n <p class=\"inspector-checkpoint-message\">{{ warning }}</p>\n }\n\n @if (checkpointRegistry.checkpoints().length) {\n <div class=\"inspector-checkpoint-list\">\n @for (checkpoint of checkpointRegistry.checkpoints(); track checkpoint.id) {\n <article class=\"inspector-checkpoint-item\">\n <div class=\"inspector-checkpoint-item__main\">\n @if (editingCheckpointId() === checkpoint.id) {\n <input\n #checkpointName\n class=\"inspector-checkpoint-name-input\"\n [value]=\"checkpoint.name\"\n (keydown.enter)=\"finishRename(checkpoint, $event)\"\n (keydown.escape)=\"cancelRename()\"\n (blur)=\"finishRename(checkpoint, $event)\"\n aria-label=\"Checkpoint name\"\n autofocus\n />\n } @else {\n <button type=\"button\" class=\"inspector-checkpoint-name\" (click)=\"beginRename(checkpoint)\">\n {{ checkpoint.name }}\n </button>\n }\n </div>\n <div class=\"inspector-checkpoint-actions\">\n <button type=\"button\" (click)=\"restoreCheckpoint(checkpoint)\" [disabled]=\"checkpointRegistry.isBusy()\">Restore</button>\n <button type=\"button\" (click)=\"deleteCheckpoint(checkpoint)\" [disabled]=\"checkpointRegistry.isBusy()\">Delete</button>\n </div>\n </article>\n }\n </div>\n } @else {\n <p class=\"inspector-checkpoint-empty\">No checkpoints yet.</p>\n }\n </section>\n }\n </div>\n }\n\n <div class=\"inspector-toolbar__secondary\">\n <div class=\"inspector-toolbar__reveal\">\n <div class=\"inspector-toolbar__reveal-inner\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n aria-label=\"Typography overlay\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Typography</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'vertical'\"\n (click)=\"activateGuideOrientation('vertical')\"\n aria-label=\"Vertical guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Vertical guides</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'horizontal'\"\n (click)=\"activateGuideOrientation('horizontal')\"\n aria-label=\"Horizontal guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Horizontal guides</span>\n </button>\n </div>\n </div>\n </div>\n\n <span class=\"inspector-toolbar__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--power\"\n (click)=\"disableInspector()\"\n aria-label=\"Disable inspector; press M to enable\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Disable</span>\n </button>\n </div>\n </div>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:12px;right:12px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail{display:flex;flex-direction:column;align-items:center;gap:2px;width:30px;padding:2px;border-radius:4px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__divider{width:16px;height:1px;margin-block:2px;background:var(--inspector-panel-edge)}.inspector-toolbar__secondary{display:grid;width:24px}.inspector-toolbar__reveal{display:grid;grid-template-rows:0fr;opacity:0;transform:translateY(-4px);transition:grid-template-rows .18s cubic-bezier(.16,1,.3,1),opacity .12s cubic-bezier(.16,1,.3,1),transform .18s cubic-bezier(.16,1,.3,1)}.inspector-toolbar__reveal-inner{display:grid;gap:2px;min-height:0;overflow:hidden}.inspector-toolbar__rail:hover .inspector-toolbar__reveal,.inspector-toolbar__rail:focus-within .inspector-toolbar__reveal{grid-template-rows:1fr;opacity:1;transform:translateY(2px)}.inspector-checkpoint-group{position:relative;width:24px;height:24px}.inspector-checkpoint-panel{position:absolute;top:0;right:calc(100% + 8px);width:min(300px,calc(100vw - 24px));max-height:min(420px,calc(100vh - 64px));overflow:auto;border:1px solid var(--inspector-panel-edge);border-radius:8px;background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;color:var(--inspector-text)}.inspector-checkpoint-panel__header,.inspector-checkpoint-item,.inspector-checkpoint-actions{display:flex;align-items:center}.inspector-checkpoint-panel__header{justify-content:space-between;gap:8px;padding:6px 8px;border-bottom:1px solid var(--inspector-panel-edge)}.inspector-checkpoint-panel__header strong,.inspector-checkpoint-panel__header span{display:inline}.inspector-checkpoint-panel__header strong{font-size:12px}.inspector-checkpoint-panel__header span{margin-left:5px}.inspector-checkpoint-panel__header span,.inspector-checkpoint-empty,.inspector-checkpoint-message{color:var(--inspector-muted);font-size:10px;line-height:1.4}.inspector-checkpoint-save,.inspector-checkpoint-actions button,.inspector-checkpoint-name{border:0;background:transparent;color:inherit;cursor:pointer;font:inherit}.inspector-checkpoint-save{padding:5px 7px;border-radius:5px;background:#4f8cff2e;color:#dbeafe;font-size:10px}.inspector-checkpoint-list{display:grid}.inspector-checkpoint-item{justify-content:space-between;gap:8px;padding:5px 8px;border-bottom:1px solid rgba(255,255,255,.05)}.inspector-checkpoint-item__main{flex:1 1 auto;min-width:0}.inspector-checkpoint-name,.inspector-checkpoint-name-input{display:block;max-width:100%;overflow:hidden;padding:0;color:var(--inspector-text);font-size:11px;font-weight:600;text-align:left;text-overflow:ellipsis;white-space:nowrap}.inspector-checkpoint-name-input{width:100%;border:1px solid rgba(79,140,255,.6);border-radius:3px;background:#0003;outline:none}.inspector-checkpoint-actions{gap:2px;flex:0 0 auto}.inspector-checkpoint-actions button{padding:4px;border-radius:4px;color:var(--inspector-muted);font-size:10px}.inspector-checkpoint-actions button:hover,.inspector-checkpoint-name:hover,.inspector-checkpoint-save:hover{color:var(--inspector-text);background:#ffffff14}.inspector-checkpoint-empty,.inspector-checkpoint-message{margin:0;padding:12px 10px}.inspector-checkpoint-message--error{color:#fecaca}.inspector-icon-button{display:inline-flex;align-items:center;justify-content:center;height:24px;border:0;border-radius:3px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .1s cubic-bezier(.16,1,.3,1),color .1s cubic-bezier(.16,1,.3,1),transform .1s cubic-bezier(.16,1,.3,1);font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{position:relative;width:24px}.inspector-icon-button svg{width:13px;height:13px;fill:currentColor}.inspector-icon-button:active{transform:translateY(1px)}.inspector-icon-button:focus-visible{outline:2px solid var(--inspector-blue);outline-offset:2px}.inspector-icon-button:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--power:hover{background:#ef444429;color:#fecaca}.inspector-tooltip{position:absolute;top:50%;right:calc(100% + 7px);z-index:20;width:max-content;padding:4px 6px;border:1px solid var(--inspector-panel-edge);border-radius:3px;background:#111318fa;color:var(--inspector-text);font-size:10px;font-weight:600;line-height:1.2;opacity:0;pointer-events:none;transform:translate(3px,-50%);transition:opacity .12s cubic-bezier(.16,1,.3,1),transform .12s cubic-bezier(.16,1,.3,1);white-space:nowrap}.inspector-icon-button:hover .inspector-tooltip,.inspector-icon-button:focus-visible .inspector-tooltip{opacity:1;transform:translateY(-50%)}@media (prefers-reduced-motion: reduce){.inspector-toolbar__reveal,.inspector-icon-button,.inspector-tooltip{transition-duration:.01ms}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
702
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled", persistOnReload: "persistOnReload" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }, { propertyName: "checkpointDialog", first: true, predicate: ["checkpointDialog"], descendants: true, isSignal: true }, { propertyName: "checkpointSearch", first: true, predicate: ["checkpointSearch"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (enabled()) {\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n aria-label=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Select</span>\n </button>\n\n @if (checkpointService) {\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n (click)=\"saveCheckpoint()\"\n [disabled]=\"checkpointService.busy()\"\n aria-label=\"Save checkpoint\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Save checkpoint</span>\n </button>\n }\n\n <div class=\"inspector-toolbar__secondary\">\n <div class=\"inspector-toolbar__reveal\">\n <div class=\"inspector-toolbar__reveal-inner\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n aria-label=\"Typography overlay\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Typography</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'vertical'\"\n (click)=\"activateGuideOrientation('vertical')\"\n aria-label=\"Vertical guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Vertical guides</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'horizontal'\"\n (click)=\"activateGuideOrientation('horizontal')\"\n aria-label=\"Horizontal guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Horizontal guides</span>\n </button>\n </div>\n </div>\n </div>\n\n <span class=\"inspector-toolbar__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--power\"\n (click)=\"disableInspector()\"\n aria-label=\"Disable inspector; press M to enable\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Disable</span>\n </button>\n </div>\n </div>\n }\n\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label id=\"inspector-command-title\" class=\"inspector-visually-hidden\" for=\"inspector-checkpoint-search\">\n Search checkpoints\n </label>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"Find a checkpoint\u2026\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results'\"\n [attr.aria-activedescendant]=\"filteredCheckpoints().length ? 'inspector-checkpoint-' + filteredCheckpoints()[activeCheckpointIndex()].id : null\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p class=\"inspector-command__message inspector-command__message--error\" role=\"alert\">{{ error }}</p>\n }\n\n <div id=\"inspector-checkpoint-results\" class=\"inspector-command__results\" role=\"listbox\" aria-label=\"Saved checkpoints\">\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading checkpoints\u2026</p>\n } @else if (!checkpointService.checkpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoints yet. Save one from the Inspector toolbar.</p>\n } @else if (!filteredCheckpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoint matches \u201C{{ checkpointQuery() }}\u201D.</p>\n } @else {\n @for (checkpoint of filteredCheckpoints(); track checkpoint.id; let index = $index) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-checkpoint-index]=\"index\"\n [attr.aria-selected]=\"activeCheckpointIndex() === index\"\n [class.is-active]=\"activeCheckpointIndex() === index\"\n [class.is-busy]=\"checkpointService.busy() && activeCheckpointIndex() === index\"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"deletingCheckpointId() === checkpoint.id || editingCheckpointId() === checkpoint.id ? null : restoreCheckpoint(checkpoint)\"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\">Delete \u201C{{ checkpoint.name }}\u201D?</span>\n <span class=\"inspector-command-row__confirm-actions\">\n <button type=\"button\" class=\"is-danger\" (click)=\"confirmDelete(checkpoint, $event)\">Delete checkpoint</button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">Keep checkpoint</button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__name\">\n @if (checkpointService.busy() && activeCheckpointIndex() === index) {\n Restoring \u201C{{ checkpoint.name }}\u201D\u2026\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__actions\">\n <button type=\"button\" (click)=\"beginRename(checkpoint, $event)\" [attr.aria-label]=\"'Rename ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\" /></svg>\n </button>\n <button type=\"button\" (click)=\"beginDelete(checkpoint, $event)\" [attr.aria-label]=\"'Delete ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\" /></svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >{{ toast }}</p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:12px;right:12px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail{display:flex;flex-direction:column;align-items:center;gap:2px;width:30px;padding:2px;border-radius:4px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__divider{width:16px;height:1px;margin-block:2px;background:var(--inspector-panel-edge)}.inspector-toolbar__secondary{display:grid;width:24px}.inspector-toolbar__reveal{display:grid;grid-template-rows:0fr;opacity:0;transform:translateY(-4px);transition:grid-template-rows .18s cubic-bezier(.16,1,.3,1),opacity .12s cubic-bezier(.16,1,.3,1),transform .18s cubic-bezier(.16,1,.3,1)}.inspector-toolbar__reveal-inner{display:grid;gap:2px;min-height:0;overflow:hidden}.inspector-toolbar__rail:hover .inspector-toolbar__reveal,.inspector-toolbar__rail:focus-within .inspector-toolbar__reveal{grid-template-rows:1fr;opacity:1;transform:translateY(2px)}.inspector-command-dialog{--command-surface: oklch(20% .012 270);--command-surface-raised: oklch(25% .014 270);--command-surface-active: oklch(27% .018 270);--command-edge: oklch(39% .014 270);--command-text: oklch(95% .008 270);--command-muted: oklch(73% .018 270);--command-accent: oklch(76% .08 260);--command-danger: oklch(71% .17 25);box-sizing:border-box;inset-block-start:max(40px,10vh);width:min(480px,calc(100vw - 24px));max-width:none;max-height:min(400px,calc(100vh - 64px));margin:0 auto;padding:0;overflow:hidden;border:1px solid var(--command-edge);border-radius:4px;background:var(--command-surface);color:var(--command-text);box-shadow:0 20px 56px #0102038f;opacity:0;pointer-events:auto;transform:translateY(-6px);transition:opacity .12s cubic-bezier(.7,0,.84,0),transform .12s cubic-bezier(.7,0,.84,0),overlay .12s allow-discrete,display .12s allow-discrete}.inspector-command-dialog[open]{opacity:1;transform:translateY(0);transition-duration:.16s;transition-timing-function:cubic-bezier(.16,1,.3,1)}@starting-style{.inspector-command-dialog[open]{opacity:0;transform:translateY(-6px)}}.inspector-command-dialog::backdrop{background:#0102037a}.inspector-command{display:grid;min-width:0}.inspector-command__search{min-height:44px;padding-inline:12px;border-bottom:1px solid var(--command-edge)}.inspector-command__search input,.inspector-command-row__rename{min-width:0;border:0;outline:0;background:transparent;color:var(--command-text);font:inherit}.inspector-command__search input{width:100%;height:43px;padding:0;font-size:14px;line-height:1.45}.inspector-command__search:has(input:focus-visible){box-shadow:inset 0 -2px var(--command-accent)}.inspector-command__search input::placeholder{color:var(--command-muted);opacity:1}.inspector-command__search input::-webkit-search-cancel-button{display:none}.inspector-command__results{max-height:304px;overflow:auto;padding-block:3px;scrollbar-color:var(--command-edge) transparent}.inspector-command-row{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;min-height:38px;padding-inline:12px 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.inspector-command-row.is-active{background:var(--command-surface-active)}.inspector-command-row.is-busy{cursor:wait;pointer-events:none}.inspector-command-row__name{overflow:hidden;color:var(--command-text);font-size:12px;font-weight:540;line-height:1.45;text-overflow:ellipsis;white-space:nowrap}.inspector-command-row.is-active .inspector-command-row__name{font-weight:700}.inspector-command-row__actions,.inspector-command-row__confirm-actions{display:flex;align-items:center;gap:4px}.inspector-command-row__actions{opacity:0;pointer-events:none}.inspector-command-row:hover .inspector-command-row__actions,.inspector-command-row:focus-within .inspector-command-row__actions{opacity:1;pointer-events:auto}.inspector-command-row button{display:inline-grid;width:26px;min-height:26px;padding:5px;place-items:center;border:1px solid transparent;border-radius:3px;background:transparent;color:var(--command-muted);cursor:pointer;font-family:inherit;font-size:10px;font-weight:600;line-height:1.3}.inspector-command-row button svg{width:12px;height:12px;fill:currentColor}.inspector-command-row button:hover{border-color:var(--command-edge);background:var(--command-surface-raised);color:var(--command-text)}.inspector-command-row button.is-danger{color:var(--command-danger)}.inspector-command-row button:focus-visible,.inspector-command-row__rename:focus-visible{outline:2px solid var(--command-accent);outline-offset:2px}.inspector-command-row__confirm{grid-column:1;color:var(--command-text);font-size:12px;font-weight:620}.inspector-command-row__rename{grid-column:1 / -1;min-height:30px;padding-inline:8px;border:1px solid var(--command-accent);border-radius:3px;background:var(--command-surface-raised);font-size:12px}.inspector-command__message{margin:0;padding:20px 12px;color:var(--command-muted);font-size:12px;line-height:1.55;text-align:center}.inspector-command__message--error{padding-block:9px;border-bottom:1px solid oklch(45% .1 25);background:#3f1917;color:oklch(89% .06 25);text-align:left}.inspector-visually-hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.inspector-checkpoint-toast{position:fixed;top:12px;left:50%;z-index:500;margin:0;padding:8px 12px;border:1px solid oklch(48% .04 150);border-radius:4px;background:#152619;color:#cfe9d4;box-shadow:0 16px 40px #01020375;font-size:11px;font-weight:620;line-height:1.35;pointer-events:none;transform:translate(-50%)}.inspector-checkpoint-toast--error{border-color:#9c433f;background:#431614;color:oklch(92% .05 25)}.inspector-icon-button{display:inline-flex;align-items:center;justify-content:center;height:24px;border:0;border-radius:3px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .1s cubic-bezier(.16,1,.3,1),color .1s cubic-bezier(.16,1,.3,1),transform .1s cubic-bezier(.16,1,.3,1);font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{position:relative;width:24px}.inspector-icon-button svg{width:13px;height:13px;fill:currentColor}.inspector-icon-button:active{transform:translateY(1px)}.inspector-icon-button:focus-visible{outline:2px solid var(--inspector-blue);outline-offset:2px}.inspector-icon-button:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--power:hover{background:#ef444429;color:#fecaca}.inspector-tooltip{position:absolute;top:50%;right:calc(100% + 7px);z-index:20;width:max-content;padding:4px 6px;border:1px solid var(--inspector-panel-edge);border-radius:3px;background:#111318fa;color:var(--inspector-text);font-size:10px;font-weight:600;line-height:1.2;opacity:0;pointer-events:none;transform:translate(3px,-50%);transition:opacity .12s cubic-bezier(.16,1,.3,1),transform .12s cubic-bezier(.16,1,.3,1);white-space:nowrap}.inspector-icon-button:hover .inspector-tooltip,.inspector-icon-button:focus-visible .inspector-tooltip{opacity:1;transform:translateY(-50%)}@media (prefers-reduced-motion: reduce){.inspector-toolbar__reveal,.inspector-icon-button,.inspector-tooltip,.inspector-command-dialog,.inspector-command-row__marker{transition-duration:.01ms}.inspector-command-dialog,.inspector-command-dialog[open]{transform:none}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
517
703
  }
518
704
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, decorators: [{
519
705
  type: Component,
520
- args: [{ selector: 'inspector-overlay', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (enabled()) {\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n aria-label=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Select</span>\n </button>\n\n @if (checkpointRegistry) {\n <div class=\"inspector-checkpoint-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"checkpointsOpen()\"\n (click)=\"toggleCheckpoints()\"\n aria-label=\"Checkpoints\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2.5h10v11H3zm2 2v2h6v-2zm0 4v2h4v-2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Checkpoints</span>\n </button>\n\n @if (checkpointsOpen()) {\n <section class=\"inspector-checkpoint-panel\" aria-label=\"Saved checkpoints\">\n <header class=\"inspector-checkpoint-panel__header\">\n <div>\n <strong>Checkpoints</strong>\n <span>{{ checkpointRegistry.checkpoints().length }}</span>\n </div>\n <button\n type=\"button\"\n class=\"inspector-checkpoint-save\"\n (click)=\"saveCheckpoint()\"\n [disabled]=\"checkpointRegistry.isBusy()\"\n >\n {{ checkpointRegistry.isBusy() ? 'Working\u2026' : 'Save current' }}\n </button>\n </header>\n\n @if (checkpointRegistry.error(); as error) {\n <p class=\"inspector-checkpoint-message inspector-checkpoint-message--error\">{{ error }}</p>\n }\n @if (checkpointRegistry.warning(); as warning) {\n <p class=\"inspector-checkpoint-message\">{{ warning }}</p>\n }\n\n @if (checkpointRegistry.checkpoints().length) {\n <div class=\"inspector-checkpoint-list\">\n @for (checkpoint of checkpointRegistry.checkpoints(); track checkpoint.id) {\n <article class=\"inspector-checkpoint-item\">\n <div class=\"inspector-checkpoint-item__main\">\n @if (editingCheckpointId() === checkpoint.id) {\n <input\n #checkpointName\n class=\"inspector-checkpoint-name-input\"\n [value]=\"checkpoint.name\"\n (keydown.enter)=\"finishRename(checkpoint, $event)\"\n (keydown.escape)=\"cancelRename()\"\n (blur)=\"finishRename(checkpoint, $event)\"\n aria-label=\"Checkpoint name\"\n autofocus\n />\n } @else {\n <button type=\"button\" class=\"inspector-checkpoint-name\" (click)=\"beginRename(checkpoint)\">\n {{ checkpoint.name }}\n </button>\n }\n </div>\n <div class=\"inspector-checkpoint-actions\">\n <button type=\"button\" (click)=\"restoreCheckpoint(checkpoint)\" [disabled]=\"checkpointRegistry.isBusy()\">Restore</button>\n <button type=\"button\" (click)=\"deleteCheckpoint(checkpoint)\" [disabled]=\"checkpointRegistry.isBusy()\">Delete</button>\n </div>\n </article>\n }\n </div>\n } @else {\n <p class=\"inspector-checkpoint-empty\">No checkpoints yet.</p>\n }\n </section>\n }\n </div>\n }\n\n <div class=\"inspector-toolbar__secondary\">\n <div class=\"inspector-toolbar__reveal\">\n <div class=\"inspector-toolbar__reveal-inner\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n aria-label=\"Typography overlay\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Typography</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'vertical'\"\n (click)=\"activateGuideOrientation('vertical')\"\n aria-label=\"Vertical guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Vertical guides</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'horizontal'\"\n (click)=\"activateGuideOrientation('horizontal')\"\n aria-label=\"Horizontal guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Horizontal guides</span>\n </button>\n </div>\n </div>\n </div>\n\n <span class=\"inspector-toolbar__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--power\"\n (click)=\"disableInspector()\"\n aria-label=\"Disable inspector; press M to enable\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Disable</span>\n </button>\n </div>\n </div>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:12px;right:12px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail{display:flex;flex-direction:column;align-items:center;gap:2px;width:30px;padding:2px;border-radius:4px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__divider{width:16px;height:1px;margin-block:2px;background:var(--inspector-panel-edge)}.inspector-toolbar__secondary{display:grid;width:24px}.inspector-toolbar__reveal{display:grid;grid-template-rows:0fr;opacity:0;transform:translateY(-4px);transition:grid-template-rows .18s cubic-bezier(.16,1,.3,1),opacity .12s cubic-bezier(.16,1,.3,1),transform .18s cubic-bezier(.16,1,.3,1)}.inspector-toolbar__reveal-inner{display:grid;gap:2px;min-height:0;overflow:hidden}.inspector-toolbar__rail:hover .inspector-toolbar__reveal,.inspector-toolbar__rail:focus-within .inspector-toolbar__reveal{grid-template-rows:1fr;opacity:1;transform:translateY(2px)}.inspector-checkpoint-group{position:relative;width:24px;height:24px}.inspector-checkpoint-panel{position:absolute;top:0;right:calc(100% + 8px);width:min(300px,calc(100vw - 24px));max-height:min(420px,calc(100vh - 64px));overflow:auto;border:1px solid var(--inspector-panel-edge);border-radius:8px;background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;color:var(--inspector-text)}.inspector-checkpoint-panel__header,.inspector-checkpoint-item,.inspector-checkpoint-actions{display:flex;align-items:center}.inspector-checkpoint-panel__header{justify-content:space-between;gap:8px;padding:6px 8px;border-bottom:1px solid var(--inspector-panel-edge)}.inspector-checkpoint-panel__header strong,.inspector-checkpoint-panel__header span{display:inline}.inspector-checkpoint-panel__header strong{font-size:12px}.inspector-checkpoint-panel__header span{margin-left:5px}.inspector-checkpoint-panel__header span,.inspector-checkpoint-empty,.inspector-checkpoint-message{color:var(--inspector-muted);font-size:10px;line-height:1.4}.inspector-checkpoint-save,.inspector-checkpoint-actions button,.inspector-checkpoint-name{border:0;background:transparent;color:inherit;cursor:pointer;font:inherit}.inspector-checkpoint-save{padding:5px 7px;border-radius:5px;background:#4f8cff2e;color:#dbeafe;font-size:10px}.inspector-checkpoint-list{display:grid}.inspector-checkpoint-item{justify-content:space-between;gap:8px;padding:5px 8px;border-bottom:1px solid rgba(255,255,255,.05)}.inspector-checkpoint-item__main{flex:1 1 auto;min-width:0}.inspector-checkpoint-name,.inspector-checkpoint-name-input{display:block;max-width:100%;overflow:hidden;padding:0;color:var(--inspector-text);font-size:11px;font-weight:600;text-align:left;text-overflow:ellipsis;white-space:nowrap}.inspector-checkpoint-name-input{width:100%;border:1px solid rgba(79,140,255,.6);border-radius:3px;background:#0003;outline:none}.inspector-checkpoint-actions{gap:2px;flex:0 0 auto}.inspector-checkpoint-actions button{padding:4px;border-radius:4px;color:var(--inspector-muted);font-size:10px}.inspector-checkpoint-actions button:hover,.inspector-checkpoint-name:hover,.inspector-checkpoint-save:hover{color:var(--inspector-text);background:#ffffff14}.inspector-checkpoint-empty,.inspector-checkpoint-message{margin:0;padding:12px 10px}.inspector-checkpoint-message--error{color:#fecaca}.inspector-icon-button{display:inline-flex;align-items:center;justify-content:center;height:24px;border:0;border-radius:3px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .1s cubic-bezier(.16,1,.3,1),color .1s cubic-bezier(.16,1,.3,1),transform .1s cubic-bezier(.16,1,.3,1);font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{position:relative;width:24px}.inspector-icon-button svg{width:13px;height:13px;fill:currentColor}.inspector-icon-button:active{transform:translateY(1px)}.inspector-icon-button:focus-visible{outline:2px solid var(--inspector-blue);outline-offset:2px}.inspector-icon-button:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--power:hover{background:#ef444429;color:#fecaca}.inspector-tooltip{position:absolute;top:50%;right:calc(100% + 7px);z-index:20;width:max-content;padding:4px 6px;border:1px solid var(--inspector-panel-edge);border-radius:3px;background:#111318fa;color:var(--inspector-text);font-size:10px;font-weight:600;line-height:1.2;opacity:0;pointer-events:none;transform:translate(3px,-50%);transition:opacity .12s cubic-bezier(.16,1,.3,1),transform .12s cubic-bezier(.16,1,.3,1);white-space:nowrap}.inspector-icon-button:hover .inspector-tooltip,.inspector-icon-button:focus-visible .inspector-tooltip{opacity:1;transform:translateY(-50%)}@media (prefers-reduced-motion: reduce){.inspector-toolbar__reveal,.inspector-icon-button,.inspector-tooltip{transition-duration:.01ms}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"] }]
706
+ args: [{ selector: 'inspector-overlay', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inspector-root\" #overlayRoot>\n @if (enabled()) {\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n aria-label=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Select</span>\n </button>\n\n @if (checkpointService) {\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n (click)=\"saveCheckpoint()\"\n [disabled]=\"checkpointService.busy()\"\n aria-label=\"Save checkpoint\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Save checkpoint</span>\n </button>\n }\n\n <div class=\"inspector-toolbar__secondary\">\n <div class=\"inspector-toolbar__reveal\">\n <div class=\"inspector-toolbar__reveal-inner\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n aria-label=\"Typography overlay\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Typography</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'vertical'\"\n (click)=\"activateGuideOrientation('vertical')\"\n aria-label=\"Vertical guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Vertical guides</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'horizontal'\"\n (click)=\"activateGuideOrientation('horizontal')\"\n aria-label=\"Horizontal guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Horizontal guides</span>\n </button>\n </div>\n </div>\n </div>\n\n <span class=\"inspector-toolbar__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--power\"\n (click)=\"disableInspector()\"\n aria-label=\"Disable inspector; press M to enable\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Disable</span>\n </button>\n </div>\n </div>\n }\n\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label id=\"inspector-command-title\" class=\"inspector-visually-hidden\" for=\"inspector-checkpoint-search\">\n Search checkpoints\n </label>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"Find a checkpoint\u2026\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results'\"\n [attr.aria-activedescendant]=\"filteredCheckpoints().length ? 'inspector-checkpoint-' + filteredCheckpoints()[activeCheckpointIndex()].id : null\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p class=\"inspector-command__message inspector-command__message--error\" role=\"alert\">{{ error }}</p>\n }\n\n <div id=\"inspector-checkpoint-results\" class=\"inspector-command__results\" role=\"listbox\" aria-label=\"Saved checkpoints\">\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading checkpoints\u2026</p>\n } @else if (!checkpointService.checkpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoints yet. Save one from the Inspector toolbar.</p>\n } @else if (!filteredCheckpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoint matches \u201C{{ checkpointQuery() }}\u201D.</p>\n } @else {\n @for (checkpoint of filteredCheckpoints(); track checkpoint.id; let index = $index) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-checkpoint-index]=\"index\"\n [attr.aria-selected]=\"activeCheckpointIndex() === index\"\n [class.is-active]=\"activeCheckpointIndex() === index\"\n [class.is-busy]=\"checkpointService.busy() && activeCheckpointIndex() === index\"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"deletingCheckpointId() === checkpoint.id || editingCheckpointId() === checkpoint.id ? null : restoreCheckpoint(checkpoint)\"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\">Delete \u201C{{ checkpoint.name }}\u201D?</span>\n <span class=\"inspector-command-row__confirm-actions\">\n <button type=\"button\" class=\"is-danger\" (click)=\"confirmDelete(checkpoint, $event)\">Delete checkpoint</button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">Keep checkpoint</button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__name\">\n @if (checkpointService.busy() && activeCheckpointIndex() === index) {\n Restoring \u201C{{ checkpoint.name }}\u201D\u2026\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__actions\">\n <button type=\"button\" (click)=\"beginRename(checkpoint, $event)\" [attr.aria-label]=\"'Rename ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\" /></svg>\n </button>\n <button type=\"button\" (click)=\"beginDelete(checkpoint, $event)\" [attr.aria-label]=\"'Delete ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\" /></svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >{{ toast }}</p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:12px;right:12px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail{display:flex;flex-direction:column;align-items:center;gap:2px;width:30px;padding:2px;border-radius:4px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__divider{width:16px;height:1px;margin-block:2px;background:var(--inspector-panel-edge)}.inspector-toolbar__secondary{display:grid;width:24px}.inspector-toolbar__reveal{display:grid;grid-template-rows:0fr;opacity:0;transform:translateY(-4px);transition:grid-template-rows .18s cubic-bezier(.16,1,.3,1),opacity .12s cubic-bezier(.16,1,.3,1),transform .18s cubic-bezier(.16,1,.3,1)}.inspector-toolbar__reveal-inner{display:grid;gap:2px;min-height:0;overflow:hidden}.inspector-toolbar__rail:hover .inspector-toolbar__reveal,.inspector-toolbar__rail:focus-within .inspector-toolbar__reveal{grid-template-rows:1fr;opacity:1;transform:translateY(2px)}.inspector-command-dialog{--command-surface: oklch(20% .012 270);--command-surface-raised: oklch(25% .014 270);--command-surface-active: oklch(27% .018 270);--command-edge: oklch(39% .014 270);--command-text: oklch(95% .008 270);--command-muted: oklch(73% .018 270);--command-accent: oklch(76% .08 260);--command-danger: oklch(71% .17 25);box-sizing:border-box;inset-block-start:max(40px,10vh);width:min(480px,calc(100vw - 24px));max-width:none;max-height:min(400px,calc(100vh - 64px));margin:0 auto;padding:0;overflow:hidden;border:1px solid var(--command-edge);border-radius:4px;background:var(--command-surface);color:var(--command-text);box-shadow:0 20px 56px #0102038f;opacity:0;pointer-events:auto;transform:translateY(-6px);transition:opacity .12s cubic-bezier(.7,0,.84,0),transform .12s cubic-bezier(.7,0,.84,0),overlay .12s allow-discrete,display .12s allow-discrete}.inspector-command-dialog[open]{opacity:1;transform:translateY(0);transition-duration:.16s;transition-timing-function:cubic-bezier(.16,1,.3,1)}@starting-style{.inspector-command-dialog[open]{opacity:0;transform:translateY(-6px)}}.inspector-command-dialog::backdrop{background:#0102037a}.inspector-command{display:grid;min-width:0}.inspector-command__search{min-height:44px;padding-inline:12px;border-bottom:1px solid var(--command-edge)}.inspector-command__search input,.inspector-command-row__rename{min-width:0;border:0;outline:0;background:transparent;color:var(--command-text);font:inherit}.inspector-command__search input{width:100%;height:43px;padding:0;font-size:14px;line-height:1.45}.inspector-command__search:has(input:focus-visible){box-shadow:inset 0 -2px var(--command-accent)}.inspector-command__search input::placeholder{color:var(--command-muted);opacity:1}.inspector-command__search input::-webkit-search-cancel-button{display:none}.inspector-command__results{max-height:304px;overflow:auto;padding-block:3px;scrollbar-color:var(--command-edge) transparent}.inspector-command-row{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;min-height:38px;padding-inline:12px 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.inspector-command-row.is-active{background:var(--command-surface-active)}.inspector-command-row.is-busy{cursor:wait;pointer-events:none}.inspector-command-row__name{overflow:hidden;color:var(--command-text);font-size:12px;font-weight:540;line-height:1.45;text-overflow:ellipsis;white-space:nowrap}.inspector-command-row.is-active .inspector-command-row__name{font-weight:700}.inspector-command-row__actions,.inspector-command-row__confirm-actions{display:flex;align-items:center;gap:4px}.inspector-command-row__actions{opacity:0;pointer-events:none}.inspector-command-row:hover .inspector-command-row__actions,.inspector-command-row:focus-within .inspector-command-row__actions{opacity:1;pointer-events:auto}.inspector-command-row button{display:inline-grid;width:26px;min-height:26px;padding:5px;place-items:center;border:1px solid transparent;border-radius:3px;background:transparent;color:var(--command-muted);cursor:pointer;font-family:inherit;font-size:10px;font-weight:600;line-height:1.3}.inspector-command-row button svg{width:12px;height:12px;fill:currentColor}.inspector-command-row button:hover{border-color:var(--command-edge);background:var(--command-surface-raised);color:var(--command-text)}.inspector-command-row button.is-danger{color:var(--command-danger)}.inspector-command-row button:focus-visible,.inspector-command-row__rename:focus-visible{outline:2px solid var(--command-accent);outline-offset:2px}.inspector-command-row__confirm{grid-column:1;color:var(--command-text);font-size:12px;font-weight:620}.inspector-command-row__rename{grid-column:1 / -1;min-height:30px;padding-inline:8px;border:1px solid var(--command-accent);border-radius:3px;background:var(--command-surface-raised);font-size:12px}.inspector-command__message{margin:0;padding:20px 12px;color:var(--command-muted);font-size:12px;line-height:1.55;text-align:center}.inspector-command__message--error{padding-block:9px;border-bottom:1px solid oklch(45% .1 25);background:#3f1917;color:oklch(89% .06 25);text-align:left}.inspector-visually-hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.inspector-checkpoint-toast{position:fixed;top:12px;left:50%;z-index:500;margin:0;padding:8px 12px;border:1px solid oklch(48% .04 150);border-radius:4px;background:#152619;color:#cfe9d4;box-shadow:0 16px 40px #01020375;font-size:11px;font-weight:620;line-height:1.35;pointer-events:none;transform:translate(-50%)}.inspector-checkpoint-toast--error{border-color:#9c433f;background:#431614;color:oklch(92% .05 25)}.inspector-icon-button{display:inline-flex;align-items:center;justify-content:center;height:24px;border:0;border-radius:3px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .1s cubic-bezier(.16,1,.3,1),color .1s cubic-bezier(.16,1,.3,1),transform .1s cubic-bezier(.16,1,.3,1);font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{position:relative;width:24px}.inspector-icon-button svg{width:13px;height:13px;fill:currentColor}.inspector-icon-button:active{transform:translateY(1px)}.inspector-icon-button:focus-visible{outline:2px solid var(--inspector-blue);outline-offset:2px}.inspector-icon-button:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--power:hover{background:#ef444429;color:#fecaca}.inspector-tooltip{position:absolute;top:50%;right:calc(100% + 7px);z-index:20;width:max-content;padding:4px 6px;border:1px solid var(--inspector-panel-edge);border-radius:3px;background:#111318fa;color:var(--inspector-text);font-size:10px;font-weight:600;line-height:1.2;opacity:0;pointer-events:none;transform:translate(3px,-50%);transition:opacity .12s cubic-bezier(.16,1,.3,1),transform .12s cubic-bezier(.16,1,.3,1);white-space:nowrap}.inspector-icon-button:hover .inspector-tooltip,.inspector-icon-button:focus-visible .inspector-tooltip{opacity:1;transform:translateY(-50%)}@media (prefers-reduced-motion: reduce){.inspector-toolbar__reveal,.inspector-icon-button,.inspector-tooltip,.inspector-command-dialog,.inspector-command-row__marker{transition-duration:.01ms}.inspector-command-dialog,.inspector-command-dialog[open]{transform:none}}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"] }]
521
707
  }], ctorParameters: () => [{ type: undefined, decorators: [{
522
708
  type: Inject,
523
709
  args: [PLATFORM_ID]
@@ -551,4 +737,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
551
737
  type: HostListener,
552
738
  args: ['window:scroll']
553
739
  }] } });
554
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVloRSxPQUFPLEVBQXVCLDJCQUEyQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBZ0U3QixZQUFpQyxVQUFrQjtRQS9EMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsaUJBQWlC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QztZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7K0dBaHBCVSxrQkFBa0Isa0JBZ0VULFdBQVc7bUdBaEVwQixrQkFBa0IseXFCQ3BEL0IsNHZjQTBXQTs7NEZEdFRhLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLEVBQUUsbUJBR00sdUJBQXVCLENBQUMsTUFBTTs7MEJBa0VsQyxNQUFNOzJCQUFDLFdBQVc7eUNBMUR0QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBaU9OLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtRjFDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3hDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF3RTlDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBVWhDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkJ4QyxvQkFBb0I7c0JBRm5CLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBQTEFURk9STV9JRCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBHVUlERV9ISVRCT1hfU0laRSxcbiAgR1VJREVfU05BUF9ESVNUQU5DRSxcbiAgaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zcGVjdE1lYXN1cmVtZW50LFxuICBnZXRSZWN0RnJvbURvbSxcbiAgZ2V0VGFyZ2V0RWxlbWVudCxcbiAgZ2V0VmlzaWJsZVRleHRCbG9ja3MsXG59IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gJy4vZGlzdGFuY2VzJztcbmltcG9ydCB7IGNsYW1wLCBnZXRWaWV3cG9ydFNpemUsIHJlY3RzRXF1YWwgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIERpc3RhbmNlT3ZlcmxheSxcbiAgR3VpZGUsXG4gIEd1aWRlT3JpZW50YXRpb24sXG4gIEluc3BlY3RNZWFzdXJlbWVudCxcbiAgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGUsXG4gIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlLFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBJbnNwZWN0b3JDaGVja3BvaW50LCBJbnNwZWN0b3JDaGVja3BvaW50UmVnaXN0cnkgfSBmcm9tICcuL2NoZWNrcG9pbnRzJztcbmltcG9ydCB7IGNyZWF0ZUlkLCBmb3JtYXRWYWx1ZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbnNwZWN0b3Itb3ZlcmxheScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5zcGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIGluc3BlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IE1hdGggPSBNYXRoO1xuICByZWFkb25seSBmb3JtYXRWYWx1ZSA9IGZvcm1hdFZhbHVlO1xuICByZWFkb25seSBndWlkZUhpdGJveFNpemUgPSBHVUlERV9ISVRCT1hfU0laRTtcbiAgcmVhZG9ubHkgb3ZlcmxheVJvb3QgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdvdmVybGF5Um9vdCcpO1xuXG4gIEBJbnB1dCgpIGhpZ2hsaWdodENvbG9yID0gJyM0ZjhjZmYnO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gJyNmZjdhMDAnO1xuICBASW5wdXQoKSBob3ZlckhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJzaXN0T25SZWxvYWQgPSBmYWxzZTtcblxuICByZWFkb25seSBjaGVja3BvaW50UmVnaXN0cnkgPSBpbmplY3QoSW5zcGVjdG9yQ2hlY2twb2ludFJlZ2lzdHJ5LCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICByZWFkb25seSBjaGVja3BvaW50c09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlZGl0aW5nQ2hlY2twb2ludElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHRvb2xNb2RlID0gc2lnbmFsPFRvb2xNb2RlPignbm9uZScpO1xuICByZWFkb25seSBndWlkZU9yaWVudGF0aW9uID0gc2lnbmFsPEd1aWRlT3JpZW50YXRpb24+KCd2ZXJ0aWNhbCcpO1xuICByZWFkb25seSBndWlkZXMgPSBzaWduYWw8R3VpZGVbXT4oW10pO1xuICByZWFkb25seSBob3ZlclJlY3QgPSBzaWduYWw8UmVjdCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZEd1aWRlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkTWVhc3VyZW1lbnQgPSBzaWduYWw8SW5zcGVjdE1lYXN1cmVtZW50IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNob3dUeXBvZ3JhcGh5ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYWx0UHJlc3NlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc3RhbmNlT3ZlcmxheSA9IHNpZ25hbDxEaXN0YW5jZU92ZXJsYXkgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdGV4dEJsb2NrcyA9IHNpZ25hbDxUZXh0QmxvY2tBbm5vdGF0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgZ3VpZGVQcmV2aWV3ID0gc2lnbmFsPEd1aWRlIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZXRhTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudCgpO1xuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3NlbGVjdGVkLmxhYmVsfSDCtyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3Qud2lkdGgpfSB4ICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQucmVjdC5oZWlnaHQpfSDCtyAke3NlbGVjdGVkLnN0eWxlcy5mb250U2l6ZX0gLyAke3NlbGVjdGVkLnN0eWxlcy5saW5lSGVpZ2h0fSAvICR7c2VsZWN0ZWQuc3R5bGVzLmNvbG9yfWA7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGh5ZHJhdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5ID0gc2lnbmFsPEd1aWRlW11bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnlJbmRleCA9IHNpZ25hbCgtMSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2FwdHVyZWRDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFldmVudC5zaGlmdEtleSB8fFxuICAgICAgIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSB8fFxuICAgICAgIXRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfTtcbiAgcHJpdmF0ZSBkcmFnZ2luZ0d1aWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPiAwKTtcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCgpID49IDAgJiZcbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPCB0aGlzLmhpc3RvcnkoKS5sZW5ndGggLSAxLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBlcnNpc3RPblJlbG9hZCB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMuaHlkcmF0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQ6IGluc3BlY3RvclBlcnNpc3RlZFN0YXRlID0ge1xuICAgICAgICB2ZXJzaW9uOiBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTixcbiAgICAgICAgZW5hYmxlZDogdGhpcy5lbmFibGVkKCksXG4gICAgICAgIHRvb2xNb2RlOiB0aGlzLnRvb2xNb2RlKCksXG4gICAgICAgIGd1aWRlT3JpZW50YXRpb246IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpLFxuICAgICAgICBndWlkZXM6IHRoaXMuZ3VpZGVzKCksXG4gICAgICAgIHNob3dUeXBvZ3JhcGh5OiB0aGlzLnNob3dUeXBvZ3JhcGh5KCksXG4gICAgICB9O1xuXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYXB0dXJlZENsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLnBlcnNpc3RPblJlbG9hZCkge1xuICAgICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGluc3BlY3Rvcl9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFzdG9yZWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0b3JlZCkgYXNcbiAgICAgICAgfCBpbnNwZWN0b3JQZXJzaXN0ZWRTdGF0ZVxuICAgICAgICB8IGluc3BlY3RvckxlZ2FjeVBlcnNpc3RlZFN0YXRlO1xuICAgICAgaWYgKHBhcnNlZC52ZXJzaW9uID09PSBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTiB8fCBwYXJzZWQudmVyc2lvbiA9PT0gMSkge1xuICAgICAgICB0aGlzLmVuYWJsZWQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnRvb2xNb2RlLnNldChwYXJzZWQudG9vbE1vZGUpO1xuICAgICAgICB0aGlzLmd1aWRlT3JpZW50YXRpb24uc2V0KHBhcnNlZC5ndWlkZU9yaWVudGF0aW9uKTtcbiAgICAgICAgdGhpcy5ndWlkZXMuc2V0KHBhcnNlZC5ndWlkZXMgPz8gW10pO1xuICAgICAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnNldChcbiAgICAgICAgICBwYXJzZWQudmVyc2lvbiA9PT0gMSA/IGZhbHNlIDogKHBhcnNlZC5zaG93VHlwb2dyYXBoeSA/PyBmYWxzZSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVjb3JkSGlzdG9yeShwYXJzZWQuZ3VpZGVzID8/IFtdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBtYWxmb3JtZWQgc3RhdGVcbiAgICB9XG5cbiAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYXB0dXJlZENsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0VG9vbE1vZGUobW9kZTogVG9vbE1vZGUpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZWQuc2V0KHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMudG9vbE1vZGUuc2V0KHRoaXMudG9vbE1vZGUoKSA9PT0gbW9kZSA/ICdub25lJyA6IG1vZGUpO1xuICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHNldEd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb246IEd1aWRlT3JpZW50YXRpb24pIHtcbiAgICB0aGlzLmd1aWRlT3JpZW50YXRpb24uc2V0KG9yaWVudGF0aW9uKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gIH1cblxuICBhY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb246IEd1aWRlT3JpZW50YXRpb24pIHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycgJiYgdGhpcy5ndWlkZU9yaWVudGF0aW9uKCkgPT09IG9yaWVudGF0aW9uO1xuICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbik7XG4gICAgaWYgKGlzQWN0aXZlIHx8IHRoaXMudG9vbE1vZGUoKSAhPT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ2d1aWRlcycpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVR5cG9ncmFwaHkoKSB7XG4gICAgdGhpcy5zaG93VHlwb2dyYXBoeS51cGRhdGUoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHRvZ2dsZUNoZWNrcG9pbnRzKCkge1xuICAgIHRoaXMuY2hlY2twb2ludHNPcGVuLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gIH1cblxuICBkaXNhYmxlSW5zcGVjdG9yKCkge1xuICAgIHRoaXMuc2V0SW5zcGVjdG9yRW5hYmxlZChmYWxzZSk7XG4gIH1cblxuICBhc3luYyBzYXZlQ2hlY2twb2ludCgpIHtcbiAgICBhd2FpdCB0aGlzLmNoZWNrcG9pbnRSZWdpc3RyeT8uc2F2ZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVzdG9yZUNoZWNrcG9pbnQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludCkge1xuICAgIGF3YWl0IHRoaXMuY2hlY2twb2ludFJlZ2lzdHJ5Py5yZXN0b3JlKGNoZWNrcG9pbnQuaWQpO1xuICB9XG5cbiAgZGVsZXRlQ2hlY2twb2ludChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50KSB7XG4gICAgdGhpcy5jaGVja3BvaW50UmVnaXN0cnk/LmRlbGV0ZShjaGVja3BvaW50LmlkKTtcbiAgfVxuXG4gIGJlZ2luUmVuYW1lKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnQpIHtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICB9XG5cbiAgZmluaXNoUmVuYW1lKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnQsIGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5jaGVja3BvaW50UmVnaXN0cnk/LnJlbmFtZShjaGVja3BvaW50LmlkLCBpbnB1dC52YWx1ZSk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgfVxuXG4gIGNhbmNlbFJlbmFtZSgpIHtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICB9XG5cbiAgY2xlYXJHdWlkZXMoKSB7XG4gICAgdGhpcy5ndWlkZXMuc2V0KFtdKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KFtdKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ11bbnVtYmVyXSxcbiAgKSA9PiBgJHtjb25uZWN0b3IueDF9OiR7Y29ubmVjdG9yLnkxfToke2Nvbm5lY3Rvci54Mn06JHtjb25uZWN0b3IueTJ9YDtcblxuICBzdGFydEd1aWRlRHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBndWlkZTogR3VpZGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gZ3VpZGUuaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIGZvcm1hdEVkZ2VzKGVkZ2VzOiBJbnNwZWN0TWVhc3VyZW1lbnRbJ3BhZGRpbmcnXSkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShlZGdlcy50b3ApfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLnJpZ2h0KX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5ib3R0b20pfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmxlZnQpfWA7XG4gIH1cblxuICBmb3JtYXRHYXAoc2VsZWN0ZWQ6IEluc3BlY3RNZWFzdXJlbWVudCkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5nYXAucm93KX0gLyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5jb2x1bW4pfWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChcbiAgICAgICAgdGFyZ2V0Py5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCcpIHx8XG4gICAgICAgIHRhcmdldD8uaXNDb250ZW50RWRpdGFibGVcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRJbnNwZWN0b3JFbmFibGVkKCF0aGlzLmVuYWJsZWQoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBrZXkgPT09ICd6Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5yZWRvKCkgOiB0aGlzLnVuZG8oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAncycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdzZWxlY3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdndWlkZXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAndicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgIHRoaXMuY2xlYXJHdWlkZXMoKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKGtleSA9PT0gJ2JhY2tzcGFjZScgfHwga2V5ID09PSAnZGVsZXRlJykgJiYgdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5leHRHdWlkZXMgPSB0aGlzLmd1aWRlcygpLmZpbHRlcihcbiAgICAgICAgKGd1aWRlKSA9PiBndWlkZS5pZCAhPT0gdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQWx0Jykge1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KFxuICAgICAgICB0aGlzLmd1aWRlcygpLm1hcCgoZ3VpZGUpID0+IHtcbiAgICAgICAgICBpZiAoZ3VpZGUuaWQgIT09IHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3VpZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZ3VpZGUsIHBvc2l0aW9uOiBjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID8/XG4gICAgICAgIGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldCh0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnIHx8ICF0aGlzLmhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmFsdFByZXNzZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBnZXRSZWN0RnJvbURvbSh0YXJnZXQpO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghcmVjdHNFcXVhbChyZWN0LCB0aGlzLmhvdmVyUmVjdCgpKSkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnKVxuICBoYW5kbGVQb2ludGVyVXAoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZEhpc3RvcnkodGhpcy5ndWlkZXMoKSk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBudWxsO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICBpZiAob3ZlcmxheSAmJiBvdmVybGF5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBndWlkZSA9IHRoaXMuZ2V0R3VpZGVQcmV2aWV3KGV2ZW50KTtcbiAgICAgIHRoaXMuYWRkR3VpZGUoeyAuLi5ndWlkZSwgaWQ6IGNyZWF0ZUlkKCkgfSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQoZ3VpZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jYW5JbnNwZWN0Q2xpY2soZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50QXRQb2ludChldmVudCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIGhhbmRsZVZpZXdwb3J0Q2hhbmdlKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCAmJiBkb2N1bWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5JbnNwZWN0Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3NlciB8fCB0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICAgIHJldHVybiAhKG92ZXJsYXkgJiYgb3ZlcmxheS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnNwZWN0b3JFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVuYWJsZWQuc2V0KGVuYWJsZWQpO1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgdGhpcy50b29sTW9kZS5zZXQoJ25vbmUnKTtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHNPcGVuLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RFbGVtZW50QXRQb2ludChldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXRFbGVtZW50KFxuICAgICAgeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sXG4gICAgICBvdmVybGF5LFxuICAgICk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ3RybCtjbGljazogc2VsZWN0IHRoZSBtaW5pbXVtIGNvbW1vbiBwYXJlbnQgb2YgY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsaWNrZWQgZWxlbWVudFxuICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiB0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgY29tbW9uUGFyZW50ID0gdGhpcy5maW5kTWluaW11bUNvbW1vblBhcmVudChcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1vblBhcmVudCAmJlxuICAgICAgICBjb21tb25QYXJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiZcbiAgICAgICAgY29tbW9uUGFyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudChjb21tb25QYXJlbnQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBjb21tb25QYXJlbnQ7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQodGFyZ2V0KSk7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KFxuICAgICAgdGhpcy5maW5kR3VpZGVBdFBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hbHRQcmVzc2VkKCkgfHxcbiAgICAgICF0aGlzLnNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgIXRoaXMuaG92ZXJFbGVtZW50IHx8XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9PT0gdGhpcy5ob3ZlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LmNvbnRhaW5zKHRoaXMuaG92ZXJFbGVtZW50KSB8fFxuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpXG4gICAgKSB7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KFxuICAgICAgZ2V0RGlzdGFuY2VPdmVybGF5KFxuICAgICAgICBnZXRSZWN0RnJvbURvbSh0aGlzLnNlbGVjdGVkRWxlbWVudCksXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuaG92ZXJFbGVtZW50KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuc2hvd1R5cG9ncmFwaHkoKSkge1xuICAgICAgdGhpcy50ZXh0QmxvY2tzLnNldChbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFxuICAgICAgZ2V0VmlzaWJsZVRleHRCbG9ja3ModGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PlxuICAgICAgICAgICAgYmxvY2sucmVjdC50b3AgPj0gMCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC50b3AgPD0gdmlld3BvcnQuaGVpZ2h0ICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPj0gMCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC5sZWZ0IDw9IHZpZXdwb3J0LndpZHRoLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGJsb2NrKSA9PiAoe1xuICAgICAgICAgIC4uLmJsb2NrLFxuICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgIC4uLmJsb2NrLnJlY3QsXG4gICAgICAgICAgICBsZWZ0OiBjbGFtcChibG9jay5yZWN0LmxlZnQsIDAsIHZpZXdwb3J0LndpZHRoIC0gMTIpLFxuICAgICAgICAgICAgdG9wOiBjbGFtcChibG9jay5yZWN0LnRvcCwgMTQsIHZpZXdwb3J0LmhlaWdodCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZEd1aWRlKGd1aWRlOiBHdWlkZSkge1xuICAgIGNvbnN0IG5leHRHdWlkZXMgPSBbLi4udGhpcy5ndWlkZXMoKSwgZ3VpZGVdO1xuICAgIHRoaXMuZ3VpZGVzLnNldChuZXh0R3VpZGVzKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoZ3VpZGUuaWQpO1xuICAgIHRoaXMucmVjb3JkSGlzdG9yeShuZXh0R3VpZGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3VpZGVQcmV2aWV3KGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50KTogR3VpZGUge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLmd1aWRlT3JpZW50YXRpb24oKTtcbiAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgIGNvbnN0IG1heCA9IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdwcmV2aWV3JyxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgcG9zaXRpb246IHRoaXMuc25hcEd1aWRlKGNsYW1wKHJhd1Bvc2l0aW9uLCAwLCBtYXgpKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzbmFwR3VpZGUocG9zaXRpb246IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0gcG9zaXRpb24pIDw9IEdVSURFX1NOQVBfRElTVEFOQ0UpIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLnBvc2l0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGZpbmRHdWlkZUF0UG9pbnQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IGd1aWRlIG9mIHRoaXMuZ3VpZGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiZcbiAgICAgICAgTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSB4KSA8PSBHVUlERV9ISVRCT1hfU0laRVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5pZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHkpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdW5kbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuVW5kbygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgLSAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgIHRoaXMuZ3VpZGVzLnNldCh0aGlzLmNsb25lR3VpZGVzKHRoaXMuaGlzdG9yeSgpW25leHRJbmRleF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgIHRoaXMuZ3VpZGVzLnNldCh0aGlzLmNsb25lR3VpZGVzKHRoaXMuaGlzdG9yeSgpW25leHRJbmRleF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb3JkSGlzdG9yeShndWlkZXM6IEd1aWRlW10pIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5oaXN0b3J5KCkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXgoKSArIDEpO1xuICAgIGJhc2UucHVzaCh0aGlzLmNsb25lR3VpZGVzKGd1aWRlcykpO1xuICAgIHRoaXMuaGlzdG9yeS5zZXQoYmFzZSk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KGJhc2UubGVuZ3RoIC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lR3VpZGVzKGd1aWRlczogR3VpZGVbXSkge1xuICAgIHJldHVybiBndWlkZXMubWFwKChndWlkZSkgPT4gKHsgLi4uZ3VpZGUgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWluaW11bUNvbW1vblBhcmVudChcbiAgICBlbGVtZW50QTogSFRNTEVsZW1lbnQsXG4gICAgZWxlbWVudEI6IEhUTUxFbGVtZW50LFxuICApOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIC8vIEJ1aWxkIGFuY2VzdG9yIGNoYWluIGZvciBlbGVtZW50IEFcbiAgICBjb25zdCBhbmNlc3RvcnNBID0gbmV3IFNldDxFbGVtZW50PigpO1xuICAgIGxldCBjdXJyZW50OiBFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnRBO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBhbmNlc3RvcnNBLmFkZChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gV2FsayB1cCBmcm9tIGVsZW1lbnRCIHVudGlsIHdlIGZpbmQgYSBjb21tb24gYW5jZXN0b3JcbiAgICBjdXJyZW50ID0gZWxlbWVudEI7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChhbmNlc3RvcnNBLmhhcyhjdXJyZW50KSkge1xuICAgICAgICByZXR1cm4gY3VycmVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnNwZWN0b3Itcm9vdFwiICNvdmVybGF5Um9vdD5cbiAgQGlmIChlbmFibGVkKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXRvb2xiYXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fcmFpbFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUb29sTW9kZSgnc2VsZWN0JylcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgbW9kZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAybDggOC0zIC43TDYuNyAxMyA2IDEwIDMgMnpcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlNlbGVjdDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgQGlmIChjaGVja3BvaW50UmVnaXN0cnkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJjaGVja3BvaW50c09wZW4oKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDaGVja3BvaW50cygpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNoZWNrcG9pbnRzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDIuNWgxMHYxMUgzem0yIDJ2Mmg2di0yem0wIDR2Mmg0di0yelwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj5DaGVja3BvaW50czwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICBAaWYgKGNoZWNrcG9pbnRzT3BlbigpKSB7XG4gICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtcGFuZWxcIiBhcmlhLWxhYmVsPVwiU2F2ZWQgY2hlY2twb2ludHNcIj5cbiAgICAgICAgICAgICAgICA8aGVhZGVyIGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtcGFuZWxfX2hlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5DaGVja3BvaW50czwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjaGVja3BvaW50UmVnaXN0cnkuY2hlY2twb2ludHMoKS5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtc2F2ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ2hlY2twb2ludCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNoZWNrcG9pbnRSZWdpc3RyeS5pc0J1c3koKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNoZWNrcG9pbnRSZWdpc3RyeS5pc0J1c3koKSA/ICdXb3JraW5n4oCmJyA6ICdTYXZlIGN1cnJlbnQnIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICAgICAgICAgIEBpZiAoY2hlY2twb2ludFJlZ2lzdHJ5LmVycm9yKCk7IGFzIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LW1lc3NhZ2UgaW5zcGVjdG9yLWNoZWNrcG9pbnQtbWVzc2FnZS0tZXJyb3JcIj57eyBlcnJvciB9fTwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChjaGVja3BvaW50UmVnaXN0cnkud2FybmluZygpOyBhcyB3YXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LW1lc3NhZ2VcIj57eyB3YXJuaW5nIH19PC9wPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEBpZiAoY2hlY2twb2ludFJlZ2lzdHJ5LmNoZWNrcG9pbnRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGVja3BvaW50IG9mIGNoZWNrcG9pbnRSZWdpc3RyeS5jaGVja3BvaW50cygpOyB0cmFjayBjaGVja3BvaW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGFydGljbGUgY2xhc3M9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtaXRlbV9fbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVkaXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NoZWNrcG9pbnROYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LW5hbWUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNoZWNrcG9pbnQubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaW5pc2hSZW5hbWUoY2hlY2twb2ludCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiY2FuY2VsUmVuYW1lKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiZmluaXNoUmVuYW1lKGNoZWNrcG9pbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNoZWNrcG9pbnQgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LW5hbWVcIiAoY2xpY2spPVwiYmVnaW5SZW5hbWUoY2hlY2twb2ludClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoZWNrcG9pbnQubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZXN0b3JlQ2hlY2twb2ludChjaGVja3BvaW50KVwiIFtkaXNhYmxlZF09XCJjaGVja3BvaW50UmVnaXN0cnkuaXNCdXN5KClcIj5SZXN0b3JlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWxldGVDaGVja3BvaW50KGNoZWNrcG9pbnQpXCIgW2Rpc2FibGVkXT1cImNoZWNrcG9pbnRSZWdpc3RyeS5pc0J1c3koKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9hcnRpY2xlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtZW1wdHlcIj5ObyBjaGVja3BvaW50cyB5ZXQuPC9wPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19zZWNvbmRhcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXRvb2xiYXJfX3JldmVhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yZXZlYWwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInNob3dUeXBvZ3JhcGh5KClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVUeXBvZ3JhcGh5KClcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUeXBvZ3JhcGh5IG92ZXJsYXlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNFYyaDEwdjJoLTR2MTBIN1Y0elwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+VHlwb2dyYXBoeTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdndWlkZXMnICYmIGd1aWRlT3JpZW50YXRpb24oKSA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlR3VpZGVPcmllbnRhdGlvbigndmVydGljYWwnKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlZlcnRpY2FsIGd1aWRlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNSAyaDEuNXYxMmgtMS41elwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+VmVydGljYWwgZ3VpZGVzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycgJiYgZ3VpZGVPcmllbnRhdGlvbigpID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkhvcml6b250YWwgZ3VpZGVzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDcuMjVoMTJ2MS41SDJ6XCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj5Ib3Jpem9udGFsIGd1aWRlczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fZGl2aWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uIGluc3BlY3Rvci1pY29uLWJ1dHRvbi0tcG93ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJkaXNhYmxlSW5zcGVjdG9yKClcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJEaXNhYmxlIGluc3BlY3RvcjsgcHJlc3MgTSB0byBlbmFibGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjUgMS41aDEuNXY2aC0xLjV6TTQuMSAzLjM1bC45NiAxLjE1QTQuMjUgNC4yNSAwIDEgMCAxMC45NCA0LjVsLjk2LTEuMTVBNS43NSA1Ljc1IDAgMSAxIDQuMSAzLjM1elwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+RGlzYWJsZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHRvb2xNb2RlKCkgPT09IFwic2VsZWN0XCIpIHtcbiAgICBAaWYgKGhvdmVyUmVjdCgpICYmIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0taG92ZXJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJob3ZlclJlY3QoKSEubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiaG92ZXJSZWN0KCkhLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJob3ZlclJlY3QoKSEud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhvdmVyUmVjdCgpIS5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID48L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKHNlbGVjdGVkTWVhc3VyZW1lbnQoKTsgYXMgc2VsZWN0ZWQpIHtcbiAgICAgIEBpZiAoc2VsZWN0ZWQuZ2FwLmFjdGl2ZSAmJiBzZWxlY3RlZC5wYXJlbnRSZWN0KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3BcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QuaGVpZ2h0XCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tZ2FwXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmxlZnRcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC50b3AgLSA4XCJcbiAgICAgICAgPlxuICAgICAgICAgIEcge3sgZm9ybWF0R2FwKHNlbGVjdGVkKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLW1hcmdpblwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgTSB7eyBmb3JtYXRFZGdlcyhzZWxlY3RlZC5tYXJnaW4pIH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tc2VsZWN0ZWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5yZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWFjY2VudF09XCJoaWdobGlnaHRDb2xvclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItbGFiZWxcIj57eyBzZWxlY3RlZE1ldGFMaW5lKCkgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1wYWRkaW5nXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHRcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1wYWRkaW5nXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgc2VsZWN0ZWQucGFkZGluZ1JlY3QudG9wICsgc2VsZWN0ZWQucGFkZGluZ1JlY3QuaGVpZ2h0ICsgOFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBQIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLnBhZGRpbmcpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSAmJiBzaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgQGZvciAoYmxvY2sgb2YgdGV4dEJsb2NrcygpOyB0cmFjayBibG9jay5pZCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJibG9jay5yZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImJsb2NrLnJlY3QudG9wIC0gOFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItdGV4dC1jaGlwX19zd2F0Y2hcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJsb2NrLnN0eWxlcy5jb2xvclwiXG4gICAgICAgID48L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5mb250U2l6ZSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmxpbmVIZWlnaHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5jb2xvciB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIGFsdFByZXNzZWQoKSAmJiBkaXN0YW5jZU92ZXJsYXkoKTsgYXMgZGlzdGFuY2UpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZGlzdGFuY2VcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UucmVjdEEubGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLnJlY3RBLnRvcFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZGlzdGFuY2UucmVjdEEud2lkdGhcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkaXN0YW5jZS5yZWN0QS5oZWlnaHRcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tZGlzdGFuY2VcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UucmVjdEIubGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLnJlY3RCLnRvcFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiZGlzdGFuY2UucmVjdEIud2lkdGhcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkaXN0YW5jZS5yZWN0Qi5oZWlnaHRcIlxuICAgID48L2Rpdj5cblxuICAgIEBmb3IgKFxuICAgICAgY29ubmVjdG9yIG9mIGRpc3RhbmNlLmNvbm5lY3RvcnM7XG4gICAgICB0cmFjayB0cmFja0Nvbm5lY3RvcigkaW5kZXgsIGNvbm5lY3RvcilcbiAgICApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29ubmVjdG9yXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1jb25uZWN0b3ItLXZlcnRpY2FsXT1cImNvbm5lY3Rvci54MSA9PT0gY29ubmVjdG9yLngyXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1jb25uZWN0b3ItLWhvcml6b250YWxdPVwiY29ubmVjdG9yLnkxID09PSBjb25uZWN0b3IueTJcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJNYXRoLm1pbihjb25uZWN0b3IueDEsIGNvbm5lY3Rvci54MilcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci55MSwgY29ubmVjdG9yLnkyKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueDIgLSBjb25uZWN0b3IueDEpKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiTWF0aC5tYXgoMSwgTWF0aC5hYnMoY29ubmVjdG9yLnkyIC0gY29ubmVjdG9yLnkxKSlcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UuaG9yaXpvbnRhbCAmJiBkaXN0YW5jZS5ob3Jpem9udGFsLnZhbHVlID4gMCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS1saW5lIGluc3BlY3Rvci1kaXN0YW5jZS1saW5lLS1ob3Jpem9udGFsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgTWF0aC5taW4oZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEsIGRpc3RhbmNlLmhvcml6b250YWwueDIhKVxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLmhvcml6b250YWwueSFcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEgLSBkaXN0YW5jZS5ob3Jpem9udGFsLngxISlcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgKGRpc3RhbmNlLmhvcml6b250YWwueDEhICsgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpIC8gMlxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRpc3RhbmNlLmhvcml6b250YWwueSEgKyAxMFwiXG4gICAgICA+XG4gICAgICAgIHt7IGZvcm1hdFZhbHVlKGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGRpc3RhbmNlLnZlcnRpY2FsICYmIGRpc3RhbmNlLnZlcnRpY2FsLnZhbHVlID4gMCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS1saW5lIGluc3BlY3Rvci1kaXN0YW5jZS1saW5lLS12ZXJ0aWNhbFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnZlcnRpY2FsLnghXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJNYXRoLm1pbihkaXN0YW5jZS52ZXJ0aWNhbC55MSEsIGRpc3RhbmNlLnZlcnRpY2FsLnkyISlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIlxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnZlcnRpY2FsLnkyISAtIGRpc3RhbmNlLnZlcnRpY2FsLnkxISlcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtdGFnIGluc3BlY3Rvci1kaXN0YW5jZS10YWctLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCEgKyAxMFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGRpc3RhbmNlLnZlcnRpY2FsLnkxISArIGRpc3RhbmNlLnZlcnRpY2FsLnkyISkgLyAyXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UudmVydGljYWwudmFsdWUpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSkge1xuICAgIEBpZiAodG9vbE1vZGUoKSA9PT0gXCJndWlkZXNcIikge1xuICAgICAgQGlmIChndWlkZVByZXZpZXcoKTsgYXMgcHJldmlldykge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUgaW5zcGVjdG9yLWd1aWRlLS1wcmV2aWV3XCJcbiAgICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAndmVydGljYWwnXCJcbiAgICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1ob3Jpem9udGFsXT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBwcmV2aWV3LnBvc2l0aW9uIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ndWlkZS1saW5lXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yIChndWlkZSBvZiBndWlkZXMoKTsgdHJhY2sgZ3VpZGUuaWQpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0tdmVydGljYWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1ob3Jpem9udGFsXT1cImd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS1zZWxlY3RlZF09XCJzZWxlY3RlZEd1aWRlSWQoKSA9PT0gZ3VpZGUuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBndWlkZS5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWd1aWRlXT1cImd1aWRlQ29sb3JcIlxuICAgICAgICAocG9pbnRlcmRvd24pPVwic3RhcnRHdWlkZURyYWcoJGV2ZW50LCBndWlkZSlcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1ndWlkZS1saW5lXCI+PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICB9XG48L2Rpdj5cbiJdfQ==
740
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVloRSxPQUFPLEVBRUwsMEJBQTBCLEdBQzNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBK0U3QixZQUFpQyxVQUFrQjtRQTlFMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNa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T0FBTyxHQUFHLFFBQVEsQ0FBQztRQUNuQixPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sT0FBc0IsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDbEMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0ExMUJVLGtCQUFrQixrQkErRVQsV0FBVzttR0EvRXBCLGtCQUFrQix1NUJDeEQvQix1eWdCQStZQTs7NEZEdlZhLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLEVBQUUsbUJBR00sdUJBQXVCLENBQUMsTUFBTTs7MEJBaUZsQyxNQUFNOzJCQUFDLFdBQVc7eUNBdkV0QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBcVVOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1RzFDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3hDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF3RTlDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBVWhDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkJ4QyxvQkFBb0I7c0JBRm5CLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBQTEFURk9STV9JRCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBHVUlERV9ISVRCT1hfU0laRSxcbiAgR1VJREVfU05BUF9ESVNUQU5DRSxcbiAgaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zcGVjdE1lYXN1cmVtZW50LFxuICBnZXRSZWN0RnJvbURvbSxcbiAgZ2V0VGFyZ2V0RWxlbWVudCxcbiAgZ2V0VmlzaWJsZVRleHRCbG9ja3MsXG59IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gJy4vZGlzdGFuY2VzJztcbmltcG9ydCB7IGNsYW1wLCBnZXRWaWV3cG9ydFNpemUsIHJlY3RzRXF1YWwgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIERpc3RhbmNlT3ZlcmxheSxcbiAgR3VpZGUsXG4gIEd1aWRlT3JpZW50YXRpb24sXG4gIEluc3BlY3RNZWFzdXJlbWVudCxcbiAgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGUsXG4gIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlLFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuICBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSxcbn0gZnJvbSAnLi9jaGVja3BvaW50cyc7XG5pbXBvcnQgeyBmdXp6eUNoZWNrcG9pbnRzIH0gZnJvbSAnLi9jaGVja3BvaW50LXNlYXJjaCc7XG5pbXBvcnQgeyBjcmVhdGVJZCwgZm9ybWF0VmFsdWUgfSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW5zcGVjdG9yLW92ZXJsYXknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbnNwZWN0b3IuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBpbnNwZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSBNYXRoID0gTWF0aDtcbiAgcmVhZG9ubHkgZm9ybWF0VmFsdWUgPSBmb3JtYXRWYWx1ZTtcbiAgcmVhZG9ubHkgZ3VpZGVIaXRib3hTaXplID0gR1VJREVfSElUQk9YX1NJWkU7XG4gIHJlYWRvbmx5IG92ZXJsYXlSb290ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3ZlcmxheVJvb3QnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludERpYWxvZyA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaWFsb2dFbGVtZW50Pj4oJ2NoZWNrcG9pbnREaWFsb2cnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFNlYXJjaCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignY2hlY2twb2ludFNlYXJjaCcpO1xuXG4gIEBJbnB1dCgpIGhpZ2hsaWdodENvbG9yID0gJyM0ZjhjZmYnO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gJyNmZjdhMDAnO1xuICBASW5wdXQoKSBob3ZlckhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJzaXN0T25SZWxvYWQgPSBmYWxzZTtcblxuICByZWFkb25seSBjaGVja3BvaW50U2VydmljZSA9IGluamVjdChJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgY29tbWFuZEJhck9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBjaGVja3BvaW50UXVlcnkgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBhY3RpdmVDaGVja3BvaW50SW5kZXggPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IGVkaXRpbmdDaGVja3BvaW50SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbGV0aW5nQ2hlY2twb2ludElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSByZW5hbWVEcmFmdCA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRUb2FzdCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFRvYXN0SXNFcnJvciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGZpbHRlcmVkQ2hlY2twb2ludHMgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZ1enp5Q2hlY2twb2ludHMoXG4gICAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jaGVja3BvaW50cygpID8/IFtdLFxuICAgICAgdGhpcy5jaGVja3BvaW50UXVlcnkoKSxcbiAgICApLFxuICApO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHRvb2xNb2RlID0gc2lnbmFsPFRvb2xNb2RlPignbm9uZScpO1xuICByZWFkb25seSBndWlkZU9yaWVudGF0aW9uID0gc2lnbmFsPEd1aWRlT3JpZW50YXRpb24+KCd2ZXJ0aWNhbCcpO1xuICByZWFkb25seSBndWlkZXMgPSBzaWduYWw8R3VpZGVbXT4oW10pO1xuICByZWFkb25seSBob3ZlclJlY3QgPSBzaWduYWw8UmVjdCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZEd1aWRlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkTWVhc3VyZW1lbnQgPSBzaWduYWw8SW5zcGVjdE1lYXN1cmVtZW50IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNob3dUeXBvZ3JhcGh5ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYWx0UHJlc3NlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc3RhbmNlT3ZlcmxheSA9IHNpZ25hbDxEaXN0YW5jZU92ZXJsYXkgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdGV4dEJsb2NrcyA9IHNpZ25hbDxUZXh0QmxvY2tBbm5vdGF0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgZ3VpZGVQcmV2aWV3ID0gc2lnbmFsPEd1aWRlIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZXRhTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudCgpO1xuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3NlbGVjdGVkLmxhYmVsfSDCtyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3Qud2lkdGgpfSB4ICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQucmVjdC5oZWlnaHQpfSDCtyAke3NlbGVjdGVkLnN0eWxlcy5mb250U2l6ZX0gLyAke3NlbGVjdGVkLnN0eWxlcy5saW5lSGVpZ2h0fSAvICR7c2VsZWN0ZWQuc3R5bGVzLmNvbG9yfWA7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGh5ZHJhdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5ID0gc2lnbmFsPEd1aWRlW11bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnlJbmRleCA9IHNpZ25hbCgtMSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2FwdHVyZWRDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFldmVudC5zaGlmdEtleSB8fFxuICAgICAgIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSB8fFxuICAgICAgIXRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfTtcbiAgcHJpdmF0ZSBkcmFnZ2luZ0d1aWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdG9hc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBjYW5VbmRvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5SW5kZXgoKSA+IDApO1xuICByZWFkb25seSBjYW5SZWRvID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJlxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEsXG4gICk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkIHx8ICF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5oeWRyYXRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZDogaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGUgPSB7XG4gICAgICAgIHZlcnNpb246IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OLFxuICAgICAgICBlbmFibGVkOiB0aGlzLmVuYWJsZWQoKSxcbiAgICAgICAgdG9vbE1vZGU6IHRoaXMudG9vbE1vZGUoKSxcbiAgICAgICAgZ3VpZGVPcmllbnRhdGlvbjogdGhpcy5ndWlkZU9yaWVudGF0aW9uKCksXG4gICAgICAgIGd1aWRlczogdGhpcy5ndWlkZXMoKSxcbiAgICAgICAgc2hvd1R5cG9ncmFwaHk6IHRoaXMuc2hvd1R5cG9ncmFwaHkoKSxcbiAgICAgIH07XG5cbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgaW5zcGVjdG9yX1NUT1JBR0VfS0VZLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oaW5zcGVjdG9yX1NUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXN0b3JlZCkge1xuICAgICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RvcmVkKSBhc1xuICAgICAgICB8IGluc3BlY3RvclBlcnNpc3RlZFN0YXRlXG4gICAgICAgIHwgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGU7XG4gICAgICBpZiAocGFyc2VkLnZlcnNpb24gPT09IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OIHx8IHBhcnNlZC52ZXJzaW9uID09PSAxKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KHBhcnNlZC50b29sTW9kZSk7XG4gICAgICAgIHRoaXMuZ3VpZGVPcmllbnRhdGlvbi5zZXQocGFyc2VkLmd1aWRlT3JpZW50YXRpb24pO1xuICAgICAgICB0aGlzLmd1aWRlcy5zZXQocGFyc2VkLmd1aWRlcyA/PyBbXSk7XG4gICAgICAgIHRoaXMuc2hvd1R5cG9ncmFwaHkuc2V0KFxuICAgICAgICAgIHBhcnNlZC52ZXJzaW9uID09PSAxID8gZmFsc2UgOiAocGFyc2VkLnNob3dUeXBvZ3JhcGh5ID8/IGZhbHNlKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWNvcmRIaXN0b3J5KHBhcnNlZC5ndWlkZXMgPz8gW10pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIG1hbGZvcm1lZCBzdGF0ZVxuICAgIH1cblxuICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMudG9hc3RUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RUaW1lcik7XG4gIH1cblxuICBzZXRUb29sTW9kZShtb2RlOiBUb29sTW9kZSkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy50b29sTW9kZS5zZXQodGhpcy50b29sTW9kZSgpID09PSBtb2RlID8gJ25vbmUnIDogbW9kZSk7XG4gICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgc2V0R3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbikge1xuICAgIHRoaXMuZ3VpZGVPcmllbnRhdGlvbi5zZXQob3JpZW50YXRpb24pO1xuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgfVxuXG4gIGFjdGl2YXRlR3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbikge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJiB0aGlzLmd1aWRlT3JpZW50YXRpb24oKSA9PT0gb3JpZW50YXRpb247XG4gICAgdGhpcy5zZXRHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTtcbiAgICBpZiAoaXNBY3RpdmUgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnZ3VpZGVzJykge1xuICAgICAgdGhpcy5zZXRUb29sTW9kZSgnZ3VpZGVzJyk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVHlwb2dyYXBoeSgpIHtcbiAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgZGlzYWJsZUluc3BlY3RvcigpIHtcbiAgICB0aGlzLnNldEluc3BlY3RvckVuYWJsZWQoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZUNoZWNrcG9pbnQoKSB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnNhdmUoKTtcbiAgICBpZiAoY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBTYXZlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5lcnJvcigpKSB7XG4gICAgICB0aGlzLnNob3dDaGVja3BvaW50VG9hc3QodGhpcy5jaGVja3BvaW50U2VydmljZS5lcnJvcigpISwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkNoZWNrcG9pbnRDb21tYW5kQmFyKCkge1xuICAgIGlmICghdGhpcy5jaGVja3BvaW50U2VydmljZSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy5jb21tYW5kQmFyT3BlbigpKSByZXR1cm47XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQodHJ1ZSk7XG4gICAgdGhpcy5jaGVja3BvaW50UXVlcnkuc2V0KCcnKTtcbiAgICB0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleC5zZXQoMCk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5zaG93TW9kYWwoKTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICBhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmxvYWQoKTtcbiAgICB0aGlzLmNsYW1wQWN0aXZlQ2hlY2twb2ludCgpO1xuICB9XG5cbiAgY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpIHtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgfVxuXG4gIHVwZGF0ZUNoZWNrcG9pbnRRdWVyeShldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLmNoZWNrcG9pbnRRdWVyeS5zZXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KDApO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VydmljZT8uY2xlYXJFcnJvcigpO1xuICB9XG5cbiAgc2V0QWN0aXZlQ2hlY2twb2ludChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KGluZGV4KTtcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmVDaGVja3BvaW50KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2twb2ludFNlcnZpY2UgfHwgdGhpcy5jaGVja3BvaW50U2VydmljZS5idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCByZXN0b3JlZCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2UucmVzdG9yZShjaGVja3BvaW50LmlkKTtcbiAgICBpZiAoIXJlc3RvcmVkKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBSZXN0b3JlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gIH1cblxuICBiZWdpblJlbmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMucmVuYW1lRHJhZnQuc2V0KGNoZWNrcG9pbnQubmFtZSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICAnLmluc3BlY3Rvci1jb21tYW5kLXJvd19fcmVuYW1lJyxcbiAgICAgICk7XG4gICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIGlucHV0Py5zZWxlY3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVJlbmFtZURyYWZ0KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVuYW1lRHJhZnQuc2V0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmNsZWFyRXJyb3IoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJlbmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnJlbmFtZShjaGVja3BvaW50LmlkLCB0aGlzLnJlbmFtZURyYWZ0KCkpKSB7XG4gICAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWxSZW5hbWUoKSB7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jbGVhckVycm9yKCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGJlZ2luRGVsZXRlKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gIH1cblxuICBjYW5jZWxEZWxldGUoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybURlbGV0ZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZT8uZGVsZXRlKGNoZWNrcG9pbnQuaWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jbGFtcEFjdGl2ZUNoZWNrcG9pbnQoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgaGFuZGxlQ2hlY2twb2ludERpYWxvZ0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQudGFyZ2V0ID09PSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudCAmJlxuICAgICAgIXRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSAmJlxuICAgICAgIXRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQoKVxuICAgICkge1xuICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJHdWlkZXMoKSB7XG4gICAgdGhpcy5ndWlkZXMuc2V0KFtdKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KFtdKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ11bbnVtYmVyXSxcbiAgKSA9PiBgJHtjb25uZWN0b3IueDF9OiR7Y29ubmVjdG9yLnkxfToke2Nvbm5lY3Rvci54Mn06JHtjb25uZWN0b3IueTJ9YDtcblxuICBzdGFydEd1aWRlRHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBndWlkZTogR3VpZGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gZ3VpZGUuaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIGZvcm1hdEVkZ2VzKGVkZ2VzOiBJbnNwZWN0TWVhc3VyZW1lbnRbJ3BhZGRpbmcnXSkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShlZGdlcy50b3ApfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLnJpZ2h0KX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5ib3R0b20pfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmxlZnQpfWA7XG4gIH1cblxuICBmb3JtYXRHYXAoc2VsZWN0ZWQ6IEluc3BlY3RNZWFzdXJlbWVudCkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5nYXAucm93KX0gLyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5jb2x1bW4pfWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2UgJiZcbiAgICAgICFldmVudC5yZXBlYXQgJiZcbiAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAga2V5ID09PSAncCdcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNvbW1hbmRCYXJPcGVuKCkgPyB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKSA6IHZvaWQgdGhpcy5vcGVuQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21tYW5kQmFyT3BlbigpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbW1hbmRCYXJLZXlkb3duKGV2ZW50LCBrZXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJsb2Nrc0luc3BlY3RvclNob3J0Y3V0KGV2ZW50LnRhcmdldCkgfHwgZXZlbnQucmVwZWF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU2hvcnRjdXRNb2RpZmllciA9IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAoa2V5ID09PSAnbScgJiYgIWhhc1Nob3J0Y3V0TW9kaWZpZXIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEluc3BlY3RvckVuYWJsZWQoIXRoaXMuZW5hYmxlZCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmIGtleSA9PT0gJ3onKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc2hpZnRLZXkgPyB0aGlzLnJlZG8oKSA6IHRoaXMudW5kbygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdBbHQnKSB7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaGFzU2hvcnRjdXRNb2RpZmllcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ3NlbGVjdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdnJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ2d1aWRlcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbignaG9yaXpvbnRhbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICd2Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbigndmVydGljYWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmNsZWFyR3VpZGVzKCk7XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChrZXkgPT09ICdiYWNrc3BhY2UnIHx8IGtleSA9PT0gJ2RlbGV0ZScpICYmIHRoaXMuc2VsZWN0ZWRHdWlkZUlkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBuZXh0R3VpZGVzID0gdGhpcy5ndWlkZXMoKS5maWx0ZXIoXG4gICAgICAgIChndWlkZSkgPT4gZ3VpZGUuaWQgIT09IHRoaXMuc2VsZWN0ZWRHdWlkZUlkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICAgIHRoaXMuZ3VpZGVzLnNldChcbiAgICAgICAgdGhpcy5ndWlkZXMoKS5tYXAoKGd1aWRlKSA9PiB7XG4gICAgICAgICAgaWYgKGd1aWRlLmlkICE9PSB0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGd1aWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgICAgICAgIGNvbnN0IG1heCA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgIHJldHVybiB7IC4uLmd1aWRlLCBwb3NpdGlvbjogY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSA/P1xuICAgICAgICBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQodGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0JyB8fCAhdGhpcy5ob3ZlckhpZ2hsaWdodEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5hbHRQcmVzc2VkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsLFxuICAgICk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gZ2V0UmVjdEZyb21Eb20odGFyZ2V0KTtcbiAgICB0aGlzLmhvdmVyRWxlbWVudCA9IHRhcmdldDtcbiAgICBpZiAoIXJlY3RzRXF1YWwocmVjdCwgdGhpcy5ob3ZlclJlY3QoKSkpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChyZWN0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cG9pbnRlcnVwJylcbiAgaGFuZGxlUG9pbnRlclVwKCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZ0d1aWRlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KHRoaXMuZ3VpZGVzKCkpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJykge1xuICAgICAgaWYgKG92ZXJsYXkgJiYgb3ZlcmxheS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3VpZGUgPSB0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCk7XG4gICAgICB0aGlzLmFkZEd1aWRlKHsgLi4uZ3VpZGUsIGlkOiBjcmVhdGVJZCgpIH0pO1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KGd1aWRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuSW5zcGVjdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICByZXR1cm4gIShvdmVybGF5ICYmIG92ZXJsYXkuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5zcGVjdG9yRW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5lbmFibGVkLnNldChlbmFibGVkKTtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy50ZXh0QmxvY2tzLnNldChbXSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb21tYW5kQmFyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjaGVja3BvaW50cyA9IHRoaXMuZmlsdGVyZWRDaGVja3BvaW50cygpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IGNoZWNrcG9pbnRzW3RoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCldO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgaXNSZW5hbWVJbnB1dCA9IHRhcmdldD8uY2xhc3NMaXN0Py5jb250YWlucygnaW5zcGVjdG9yLWNvbW1hbmQtcm93X19yZW5hbWUnKSA/PyBmYWxzZTtcblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZCgpKSB0aGlzLmNhbmNlbFJlbmFtZSgpO1xuICAgICAgZWxzZSBpZiAodGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpKSB0aGlzLmNhbmNlbERlbGV0ZSgpO1xuICAgICAgZWxzZSB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIGNvbnN0IGVkaXRpbmdDaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoeyBpZCB9KSA9PiBpZCA9PT0gdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkKCkpO1xuICAgIGlmIChpc1JlbmFtZUlucHV0ICYmIGtleSA9PT0gJ2VudGVyJyAmJiBlZGl0aW5nQ2hlY2twb2ludCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZvaWQgdGhpcy5maW5pc2hSZW5hbWUoZWRpdGluZ0NoZWNrcG9pbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNSZW5hbWVJbnB1dCkgcmV0dXJuO1xuICAgIGlmIChrZXkgPT09ICdhcnJvd2Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KE1hdGgubWluKHRoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgKyAxLCBNYXRoLm1heCgwLCBjaGVja3BvaW50cy5sZW5ndGggLSAxKSkpO1xuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVDaGVja3BvaW50SW50b1ZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2Fycm93dXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KE1hdGgubWF4KDAsIHRoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgLSAxKSk7XG4gICAgICB0aGlzLnNjcm9sbEFjdGl2ZUNoZWNrcG9pbnRJbnRvVmlldygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnZW50ZXInICYmIGFjdGl2ZSAmJiAhdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdm9pZCB0aGlzLnJlc3RvcmVDaGVja3BvaW50KGFjdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdmMicgJiYgYWN0aXZlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5iZWdpblJlbmFtZShhY3RpdmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnZGVsZXRlJyAmJiBhY3RpdmUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmJlZ2luRGVsZXRlKGFjdGl2ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBibG9ja3NJbnNwZWN0b3JTaG9ydGN1dCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0YXJnZXQuY2xvc2VzdChcbiAgICAgICdmb3JtLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uLCBbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKSwgW3JvbGU9XCJ0ZXh0Ym94XCJdJyxcbiAgICApICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcEFjdGl2ZUNoZWNrcG9pbnQoKSB7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KFxuICAgICAgTWF0aC5taW4odGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXgoKSwgTWF0aC5tYXgoMCwgdGhpcy5maWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoIC0gMSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEFjdGl2ZUNoZWNrcG9pbnRJbnRvVmlldygpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgYFtkYXRhLWNoZWNrcG9pbnQtaW5kZXg9XCIke3RoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCl9XCJdYCxcbiAgICAgICk7XG4gICAgICByb3c/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0NoZWNrcG9pbnRUb2FzdChtZXNzYWdlOiBzdHJpbmcsIGlzRXJyb3IgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnRvYXN0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0VGltZXIpO1xuICAgIHRoaXMuY2hlY2twb2ludFRvYXN0SXNFcnJvci5zZXQoaXNFcnJvcik7XG4gICAgdGhpcy5jaGVja3BvaW50VG9hc3Quc2V0KG1lc3NhZ2UpO1xuICAgIHRoaXMudG9hc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGVja3BvaW50VG9hc3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5jaGVja3BvaW50VG9hc3RJc0Vycm9yLnNldChmYWxzZSk7XG4gICAgfSwgMjUwMCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEVsZW1lbnRBdFBvaW50KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIG92ZXJsYXksXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDdHJsK2NsaWNrOiBzZWxlY3QgdGhlIG1pbmltdW0gY29tbW9uIHBhcmVudCBvZiBjdXJyZW50IHNlbGVjdGlvbiBhbmQgY2xpY2tlZCBlbGVtZW50XG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBjb21tb25QYXJlbnQgPSB0aGlzLmZpbmRNaW5pbXVtQ29tbW9uUGFyZW50KFxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29tbW9uUGFyZW50ICYmXG4gICAgICAgIGNvbW1vblBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJlxuICAgICAgICBjb21tb25QYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KGNvbW1vblBhcmVudCkpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGNvbW1vblBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0YXJnZXQpKTtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IHRhcmdldDtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoXG4gICAgICB0aGlzLmZpbmRHdWlkZUF0UG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSksXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzdGFuY2VPdmVybGF5KCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFsdFByZXNzZWQoKSB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8XG4gICAgICAhdGhpcy5ob3ZlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID09PSB0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuY29udGFpbnModGhpcy5ob3ZlckVsZW1lbnQpIHx8XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQoXG4gICAgICBnZXREaXN0YW5jZU92ZXJsYXkoXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5ob3ZlckVsZW1lbnQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5zaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoXG4gICAgICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyh0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbClcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+XG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA8PSB2aWV3cG9ydC5oZWlnaHQgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPD0gdmlld3BvcnQud2lkdGgsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmxvY2spID0+ICh7XG4gICAgICAgICAgLi4uYmxvY2ssXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgLi4uYmxvY2sucmVjdCxcbiAgICAgICAgICAgIGxlZnQ6IGNsYW1wKGJsb2NrLnJlY3QubGVmdCwgMCwgdmlld3BvcnQud2lkdGggLSAxMiksXG4gICAgICAgICAgICB0b3A6IGNsYW1wKGJsb2NrLnJlY3QudG9wLCAxNCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkR3VpZGUoZ3VpZGU6IEd1aWRlKSB7XG4gICAgY29uc3QgbmV4dEd1aWRlcyA9IFsuLi50aGlzLmd1aWRlcygpLCBndWlkZV07XG4gICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChndWlkZS5pZCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHdWlkZVByZXZpZXcoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQpOiBHdWlkZSB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpO1xuICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgIG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgbWF4ID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyB2aWV3cG9ydC53aWR0aCA6IHZpZXdwb3J0LmhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3ByZXZpZXcnLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBwb3NpdGlvbjogdGhpcy5zbmFwR3VpZGUoY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNuYXBHdWlkZShwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSBwb3NpdGlvbikgPD0gR1VJREVfU05BUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gZ3VpZGUucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEd1aWRlQXRQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHgpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geSkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmRvKCkge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSAtIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRvKCkge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSArIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvcmRIaXN0b3J5KGd1aWRlczogR3VpZGVbXSkge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmhpc3RvcnkoKS5zbGljZSgwLCB0aGlzLmhpc3RvcnlJbmRleCgpICsgMSk7XG4gICAgYmFzZS5wdXNoKHRoaXMuY2xvbmVHdWlkZXMoZ3VpZGVzKSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChiYXNlKTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQoYmFzZS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVHdWlkZXMoZ3VpZGVzOiBHdWlkZVtdKSB7XG4gICAgcmV0dXJuIGd1aWRlcy5tYXAoKGd1aWRlKSA9PiAoeyAuLi5ndWlkZSB9KSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNaW5pbXVtQ29tbW9uUGFyZW50KFxuICAgIGVsZW1lbnRBOiBIVE1MRWxlbWVudCxcbiAgICBlbGVtZW50QjogSFRNTEVsZW1lbnQsXG4gICk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgLy8gQnVpbGQgYW5jZXN0b3IgY2hhaW4gZm9yIGVsZW1lbnQgQVxuICAgIGNvbnN0IGFuY2VzdG9yc0EgPSBuZXcgU2V0PEVsZW1lbnQ+KCk7XG4gICAgbGV0IGN1cnJlbnQ6IEVsZW1lbnQgfCBudWxsID0gZWxlbWVudEE7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGFuY2VzdG9yc0EuYWRkKGN1cnJlbnQpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHVwIGZyb20gZWxlbWVudEIgdW50aWwgd2UgZmluZCBhIGNvbW1vbiBhbmNlc3RvclxuICAgIGN1cnJlbnQgPSBlbGVtZW50QjtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGFuY2VzdG9yc0EuaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImluc3BlY3Rvci1yb290XCIgI292ZXJsYXlSb290PlxuICBAaWYgKGVuYWJsZWQoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yYWlsXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJ0b29sTW9kZSgpID09PSAnc2VsZWN0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRvb2xNb2RlKCdzZWxlY3QnKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCBtb2RlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJsOCA4LTMgLjdMNi43IDEzIDYgMTAgMyAyelwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+U2VsZWN0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZUNoZWNrcG9pbnQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIGNoZWNrcG9pbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuNSAyaDkuNmwxLjQgMS40VjE0aC0xMXptMiAxLjV2M2g2di0zem0uNSA2VjEyaDZWOS41elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlNhdmUgY2hlY2twb2ludDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yZXZlYWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fcmV2ZWFsLWlubmVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJzaG93VHlwb2dyYXBoeSgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlVHlwb2dyYXBoeSgpXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVHlwb2dyYXBoeSBvdmVybGF5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDRWMmgxMHYyaC00djEwSDdWNHpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlR5cG9ncmFwaHk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJ0b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJiBndWlkZU9yaWVudGF0aW9uKCkgPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWZXJ0aWNhbCBndWlkZXNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjUgMmgxLjV2MTJoLTEuNXpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlZlcnRpY2FsIGd1aWRlczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdndWlkZXMnICYmIGd1aWRlT3JpZW50YXRpb24oKSA9PT0gJ2hvcml6b250YWwnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVHdWlkZU9yaWVudGF0aW9uKCdob3Jpem9udGFsJylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJIb3Jpem9udGFsIGd1aWRlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiA3LjI1aDEydjEuNUgyelwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+SG9yaXpvbnRhbCBndWlkZXM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2xiYXJfX2RpdmlkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvbiBpbnNwZWN0b3ItaWNvbi1idXR0b24tLXBvd2VyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZGlzYWJsZUluc3BlY3RvcigpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGlzYWJsZSBpbnNwZWN0b3I7IHByZXNzIE0gdG8gZW5hYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjI1IDEuNWgxLjV2NmgtMS41ek00LjEgMy4zNWwuOTYgMS4xNUE0LjI1IDQuMjUgMCAxIDAgMTAuOTQgNC41bC45Ni0xLjE1QTUuNzUgNS43NSAwIDEgMSA0LjEgMy4zNXpcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPkRpc2FibGU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlKSB7XG4gICAgPGRpYWxvZ1xuICAgICAgI2NoZWNrcG9pbnREaWFsb2dcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtZGlhbG9nXCJcbiAgICAgIGFyaWEtbGFiZWxsZWRieT1cImluc3BlY3Rvci1jb21tYW5kLXRpdGxlXCJcbiAgICAgIChjYW5jZWwpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2hlY2twb2ludERpYWxvZ0NsaWNrKCRldmVudClcIlxuICAgID5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fc2VhcmNoXCI+XG4gICAgICAgICAgPGxhYmVsIGlkPVwiaW5zcGVjdG9yLWNvbW1hbmQtdGl0bGVcIiBjbGFzcz1cImluc3BlY3Rvci12aXN1YWxseS1oaWRkZW5cIiBmb3I9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1zZWFyY2hcIj5cbiAgICAgICAgICAgIFNlYXJjaCBjaGVja3BvaW50c1xuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjY2hlY2twb2ludFNlYXJjaFxuICAgICAgICAgICAgaWQ9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1zZWFyY2hcIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmluZCBhIGNoZWNrcG9pbnTigKZcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNoZWNrcG9pbnRRdWVyeSgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2luc3BlY3Rvci1jaGVja3BvaW50LXJlc3VsdHMnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJmaWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoID8gJ2luc3BlY3Rvci1jaGVja3BvaW50LScgKyBmaWx0ZXJlZENoZWNrcG9pbnRzKClbYWN0aXZlQ2hlY2twb2ludEluZGV4KCldLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlQ2hlY2twb2ludFF1ZXJ5KCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIEBpZiAoY2hlY2twb2ludFNlcnZpY2UuZXJyb3IoKTsgYXMgZXJyb3IpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlIGluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlLS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yIH19PC9wPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBpZD1cImluc3BlY3Rvci1jaGVja3BvaW50LXJlc3VsdHNcIiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19yZXN1bHRzXCIgcm9sZT1cImxpc3Rib3hcIiBhcmlhLWxhYmVsPVwiU2F2ZWQgY2hlY2twb2ludHNcIj5cbiAgICAgICAgICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlLmxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5Mb2FkaW5nIGNoZWNrcG9pbnRz4oCmPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKCFjaGVja3BvaW50U2VydmljZS5jaGVja3BvaW50cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5ObyBjaGVja3BvaW50cyB5ZXQuIFNhdmUgb25lIGZyb20gdGhlIEluc3BlY3RvciB0b29sYmFyLjwvcD5cbiAgICAgICAgICB9IEBlbHNlIGlmICghZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5ObyBjaGVja3BvaW50IG1hdGNoZXMg4oCce3sgY2hlY2twb2ludFF1ZXJ5KCkgfX3igJ0uPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAoY2hlY2twb2ludCBvZiBmaWx0ZXJlZENoZWNrcG9pbnRzKCk7IHRyYWNrIGNoZWNrcG9pbnQuaWQ7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInaW5zcGVjdG9yLWNoZWNrcG9pbnQtJyArIGNoZWNrcG9pbnQuaWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2hlY2twb2ludC1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhY3RpdmVDaGVja3BvaW50SW5kZXgoKSA9PT0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgPT09IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYnVzeV09XCJjaGVja3BvaW50U2VydmljZS5idXN5KCkgJiYgYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgPT09IGluZGV4XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRBY3RpdmVDaGVja3BvaW50KGluZGV4KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0aW5nQ2hlY2twb2ludElkKCkgPT09IGNoZWNrcG9pbnQuaWQgfHwgZWRpdGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkID8gbnVsbCA6IHJlc3RvcmVDaGVja3BvaW50KGNoZWNrcG9pbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoZGVsZXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2NvbmZpcm1cIj5EZWxldGUg4oCce3sgY2hlY2twb2ludC5uYW1lIH194oCdPzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19jb25maXJtLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpcy1kYW5nZXJcIiAoY2xpY2spPVwiY29uZmlybURlbGV0ZShjaGVja3BvaW50LCAkZXZlbnQpXCI+RGVsZXRlIGNoZWNrcG9pbnQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbERlbGV0ZSgkZXZlbnQpXCI+S2VlcCBjaGVja3BvaW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZWRpdGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX3JlbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaGVja3BvaW50IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicmVuYW1lRHJhZnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJ1cGRhdGVSZW5hbWVEcmFmdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX25hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjaGVja3BvaW50U2VydmljZS5idXN5KCkgJiYgYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgUmVzdG9yaW5nIOKAnHt7IGNoZWNrcG9pbnQubmFtZSB9feKAneKAplxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGVja3BvaW50Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImJlZ2luUmVuYW1lKGNoZWNrcG9pbnQsICRldmVudClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW5hbWUgJyArIGNoZWNrcG9pbnQubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJtMTEuOCAxLjggMi40IDIuNC04LjMgOC4zLTMuMS43LjctMy4xem0tOCAxMC40IDEuNS0uMy0xLjItMS4yelwiIC8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYmVnaW5EZWxldGUoY2hlY2twb2ludCwgJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZSAnICsgY2hlY2twb2ludC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIk01LjUgMmg1bC41IDFIMTR2MS4yNUgyVjNoM3ptLTIgMy4yNWg5TDEyIDE0SDR6XCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGlhbG9nPlxuICB9XG5cbiAgQGlmIChjaGVja3BvaW50VG9hc3QoKTsgYXMgdG9hc3QpIHtcbiAgICA8cFxuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY2hlY2twb2ludC10b2FzdFwiXG4gICAgICBbY2xhc3MuaW5zcGVjdG9yLWNoZWNrcG9pbnQtdG9hc3QtLWVycm9yXT1cImNoZWNrcG9pbnRUb2FzdElzRXJyb3IoKVwiXG4gICAgICBbYXR0ci5yb2xlXT1cImNoZWNrcG9pbnRUb2FzdElzRXJyb3IoKSA/ICdhbGVydCcgOiAnc3RhdHVzJ1wiXG4gICAgPnt7IHRvYXN0IH19PC9wPlxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgdG9vbE1vZGUoKSA9PT0gXCJzZWxlY3RcIikge1xuICAgIEBpZiAoaG92ZXJSZWN0KCkgJiYgaG92ZXJIaWdobGlnaHRFbmFibGVkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1ob3ZlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdmVyUmVjdCgpIS5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJob3ZlclJlY3QoKSEudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhvdmVyUmVjdCgpIS53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaG92ZXJSZWN0KCkhLmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoc2VsZWN0ZWRNZWFzdXJlbWVudCgpOyBhcyBzZWxlY3RlZCkge1xuICAgICAgQGlmIChzZWxlY3RlZC5nYXAuYWN0aXZlICYmIHNlbGVjdGVkLnBhcmVudFJlY3QpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3Qud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5oZWlnaHRcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcCAtIDhcIlxuICAgICAgICA+XG4gICAgICAgICAgRyB7eyBmb3JtYXRHYXAoc2VsZWN0ZWQpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1tYXJnaW5cIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICBNIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLm1hcmdpbikgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1zZWxlY3RlZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucmVjdC5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci1sYWJlbFwiPnt7IHNlbGVjdGVkTWV0YUxpbmUoKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICBzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3AgKyBzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHQgKyA4XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIFAge3sgZm9ybWF0RWRnZXMoc2VsZWN0ZWQucGFkZGluZykgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICBAZm9yIChibG9jayBvZiB0ZXh0QmxvY2tzKCk7IHRyYWNrIGJsb2NrLmlkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImJsb2NrLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmxvY2sucmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBfX3N3YXRjaFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiYmxvY2suc3R5bGVzLmNvbG9yXCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmZvbnRTaXplIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMubGluZUhlaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmNvbG9yIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgYWx0UHJlc3NlZCgpICYmIGRpc3RhbmNlT3ZlcmxheSgpOyBhcyBkaXN0YW5jZSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0QS5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEEudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0QS53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0Qi5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEIudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0Qi53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICBjb25uZWN0b3Igb2YgZGlzdGFuY2UuY29ubmVjdG9ycztcbiAgICAgIHRyYWNrIHRyYWNrQ29ubmVjdG9yKCRpbmRleCwgY29ubmVjdG9yKVxuICAgICkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb25uZWN0b3JcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0tdmVydGljYWxdPVwiY29ubmVjdG9yLngxID09PSBjb25uZWN0b3IueDJcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0taG9yaXpvbnRhbF09XCJjb25uZWN0b3IueTEgPT09IGNvbm5lY3Rvci55MlwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci54MSwgY29ubmVjdG9yLngyKVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLnkxLCBjb25uZWN0b3IueTIpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci54MiAtIGNvbm5lY3Rvci54MSkpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueTIgLSBjb25uZWN0b3IueTEpKVwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChkaXN0YW5jZS5ob3Jpem9udGFsICYmIGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLWhvcml6b250YWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBNYXRoLm1pbihkaXN0YW5jZS5ob3Jpem9udGFsLngxISwgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55IVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJcbiAgICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS5ob3Jpem9udGFsLngyISAtIGRpc3RhbmNlLmhvcml6b250YWwueDEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAoZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEgKyBkaXN0YW5jZS5ob3Jpem9udGFsLngyISkgLyAyXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55ISArIDEwXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UuaG9yaXpvbnRhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UudmVydGljYWwgJiYgZGlzdGFuY2UudmVydGljYWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCFcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGRpc3RhbmNlLnZlcnRpY2FsLnkxISwgZGlzdGFuY2UudmVydGljYWwueTIhKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UudmVydGljYWwueTIhIC0gZGlzdGFuY2UudmVydGljYWwueTEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWcgaW5zcGVjdG9yLWRpc3RhbmNlLXRhZy0tdmVydGljYWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS52ZXJ0aWNhbC54ISArIDEwXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZGlzdGFuY2UudmVydGljYWwueTEhICsgZGlzdGFuY2UudmVydGljYWwueTIhKSAvIDJcIlxuICAgICAgPlxuICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS52ZXJ0aWNhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgQGlmICh0b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICBAaWYgKGd1aWRlUHJldmlldygpOyBhcyBwcmV2aWV3KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZSBpbnNwZWN0b3ItZ3VpZGUtLXByZXZpZXdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cInByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKGd1aWRlIG9mIGd1aWRlcygpOyB0cmFjayBndWlkZS5pZCkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGVcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXNlbGVjdGVkXT1cInNlbGVjdGVkR3VpZGVJZCgpID09PSBndWlkZS5pZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJzdGFydEd1aWRlRHJhZygkZXZlbnQsIGd1aWRlKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19