@firestitch/report 18.10.0 → 18.10.2

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.
Files changed (66) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +1 -0
  2. package/app/reports/components/component-text/value-embed.plugin.d.ts +25 -1
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +12 -0
  4. package/app/reports/components/report-component/report-component.component.d.ts +1 -0
  5. package/app/reports/data/report.data.d.ts +5 -7
  6. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +13 -1
  7. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +30 -2
  8. package/app/reports/export/report-export-collector.service.d.ts +13 -5
  9. package/app/reports/export/report-filter-lines.d.ts +3 -0
  10. package/app/reports/filter-settings-rules.d.ts +4 -0
  11. package/app/reports/filter-text.d.ts +8 -0
  12. package/app/reports/format.d.ts +1 -0
  13. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +1 -0
  14. package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
  15. package/app/reports/interfaces/report.interface.d.ts +1 -14
  16. package/app/reports/report-filter-items.d.ts +11 -8
  17. package/app/reports/report-view-config.d.ts +1 -3
  18. package/app/reports/services/report-filter-state.service.d.ts +5 -14
  19. package/app/reports/services/report-view.service.d.ts +1 -13
  20. package/app/reports/text.d.ts +16 -0
  21. package/app/reports/views/report/fs-ai-report.component.d.ts +2 -8
  22. package/esm2022/app/reports/canvas-landing-page.mjs +7 -6
  23. package/esm2022/app/reports/components/component-list/component-list.component.mjs +5 -5
  24. package/esm2022/app/reports/components/component-text/component-text.component.mjs +34 -22
  25. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +254 -42
  26. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +130 -24
  27. package/esm2022/app/reports/components/report-component/report-component.component.mjs +38 -19
  28. package/esm2022/app/reports/data/report.data.mjs +19 -11
  29. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +57 -14
  30. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +169 -21
  31. package/esm2022/app/reports/export/report-export-collector.service.mjs +84 -33
  32. package/esm2022/app/reports/export/report-filter-lines.mjs +25 -8
  33. package/esm2022/app/reports/export/report-pdf.service.mjs +31 -21
  34. package/esm2022/app/reports/export/report-pptx.service.mjs +21 -11
  35. package/esm2022/app/reports/filter-settings-rules.mjs +8 -1
  36. package/esm2022/app/reports/filter-text.mjs +154 -0
  37. package/esm2022/app/reports/format.mjs +3 -2
  38. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  39. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +1 -1
  40. package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
  41. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  42. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +1 -1
  43. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  44. package/esm2022/app/reports/report-date-presets.mjs +2 -2
  45. package/esm2022/app/reports/report-filter-items.mjs +48 -106
  46. package/esm2022/app/reports/report-view-config.mjs +6 -116
  47. package/esm2022/app/reports/services/report-filter-state.service.mjs +92 -269
  48. package/esm2022/app/reports/services/report-view.service.mjs +25 -165
  49. package/esm2022/app/reports/text.mjs +59 -13
  50. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +69 -130
  51. package/esm2022/app/reports/views/report/report.component.mjs +25 -19
  52. package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs → firestitch-report-echarts-CyHkFToO.mjs} +2 -2
  53. package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs.map → firestitch-report-echarts-CyHkFToO.mjs.map} +1 -1
  54. package/fesm2022/{firestitch-report-firestitch-report-B1keNrcK.mjs → firestitch-report-firestitch-report-DftB7M1o.mjs} +2936 -3254
  55. package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +1 -0
  56. package/fesm2022/firestitch-report.mjs +1 -1
  57. package/package.json +1 -1
  58. package/app/reports/interfaces/report-url-link.interface.d.ts +0 -4
  59. package/app/reports/interfaces/report-url-value-name.type.d.ts +0 -1
  60. package/app/reports/interfaces/report-url-write.interface.d.ts +0 -4
  61. package/app/reports/report-url-state.d.ts +0 -36
  62. package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +0 -2
  63. package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +0 -2
  64. package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +0 -2
  65. package/esm2022/app/reports/report-url-state.mjs +0 -677
  66. package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, NgZone, ViewChild, computed, effect, inject, input, output, signal, untracked, } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { ActivatedRoute, Router } from '@angular/router';
3
+ import { ActivatedRoute } from '@angular/router';
4
4
  import { MatButtonModule } from '@angular/material/button';
5
5
  import { MatDialog } from '@angular/material/dialog';
6
6
  import { MatIconModule } from '@angular/material/icon';
@@ -8,15 +8,15 @@ import { MatTooltipModule } from '@angular/material/tooltip';
8
8
  import { FsFilterModule } from '@firestitch/filter';
9
9
  import { FsMenuModule } from '@firestitch/menu';
10
10
  import { FsProcess } from '@firestitch/process';
11
- import { Subject, merge, of } from 'rxjs';
12
- import { auditTime, map, switchMap, takeUntil, tap } from 'rxjs/operators';
11
+ import { of } from 'rxjs';
12
+ import { map, switchMap, takeUntil } from 'rxjs/operators';
13
13
  import { provideEchartsCore } from 'ngx-echarts';
14
14
  import { FsAiChatComponent, FsAiChatData } from '@firestitch/ai';
15
15
  import { ReportCanvasComponent } from '../../components/report-canvas/report-canvas.component';
16
16
  import { ReportViewPickerComponent } from '../../components/report-view-picker/report-view-picker.component';
17
17
  import { ReportAiChatData } from '../../data/report-ai-chat.data';
18
18
  import { ReportData } from '../../data/report.data';
19
- import { ComponentSettingsComponent } from '../../dialogs/component-settings/component-settings.component';
19
+ import { ComponentSettingsComponent, } from '../../dialogs/component-settings/component-settings.component';
20
20
  import { ReportSettingsComponent } from '../../dialogs/report-settings/report-settings.component';
21
21
  import { ReportExportCollectorService } from '../../export/report-export-collector.service';
22
22
  import { ReportExportService } from '../../export/report-export.service';
@@ -26,7 +26,6 @@ import { ReportTextLayoutService } from '../../export/report-text-layout.service
26
26
  import { chatViewerDrills, chatViewerMatch } from '../../report-chat-viewer-state';
27
27
  import { provideReportDatePicker } from '../../report-date-presets';
28
28
  import { GROUP_BY_ITEM, filterItemForGroup, groupByFilterItem, groupBySignature, groupValuesFromQuery, hasPageGroup, isGranularityOffered, matchFilterItem, matchFromQuery, reportBarGroups, } from '../../report-filter-items';
29
- import { buildReportUrlParams, readReportUrlParams } from '../../report-url-state';
30
29
  import { chatViewFields } from '../../report-view-config';
31
30
  import { ReportFilterOptionsService } from '../../services/report-filter-options.service';
32
31
  import { ReportFilterStateService, defaultSignature } from '../../services/report-filter-state.service';
@@ -47,32 +46,29 @@ export class FsAiReportComponent {
47
46
  reportId = input(null);
48
47
  // API base for the reports + chat endpoints; override to mount elsewhere.
49
48
  basePath = input('reports');
50
- // The query param that carries the open page's id. Deep linking is on by
51
- // default; a host that mounts several reports on one route, or wants no URL
52
- // writes at all, sets this to null to turn it off.
49
+ // The query param a report reads its opening page from (a link in a ticket
50
+ // can name a page: ?page=7). It is read once, when a report opens, and
51
+ // never written: a report keeps no state in the browser URL. Its filters,
52
+ // the page on screen and the rest live in the report's state
53
+ // (ReportFilterStateService), so a reload opens the report on its defaults,
54
+ // or on the viewer's default view. A host that wants no page read sets this
55
+ // to null.
53
56
  pageQueryParam = input('page');
54
- // Whether the viewer's filters, group-by grain and list sorts live in the URL
55
- // (region=, excludeRegion=, unitsMin=, groupBy, s<componentId>; see
56
- // report-url-state.ts), so a refresh or a shared link opens the report as
57
- // it was seen. On by default; a host that mounts several reports on one
58
- // route, or keeps query keys of its own that a filter group's label or a
59
- // tile key (s<n>) could take, turns it off.
60
- urlState = input(true);
61
57
  // The report was deleted from its settings dialog — the host routes back to
62
58
  // the listing.
63
59
  deleted = output();
64
60
  // The report was renamed (settings, or the agent) — the host can refresh a
65
61
  // breadcrumb / document title.
66
62
  renamed = output();
67
- // The viewer moved to another page. This view writes the URL itself (right
68
- // after this fires) — this is for hosts that track the open page for their
69
- // own reasons.
63
+ // The viewer moved to another page — for hosts that track the open page for
64
+ // their own reasons. Nothing is written to the URL.
70
65
  pageChanged = output();
71
66
  report = signal(null);
72
67
  editMode = signal(false);
73
- // The page the canvas should open on, read from the URL once per report.
74
- // Cleared as soon as the canvas reports back, so a later in-app page change
75
- // is never fought by a stale value.
68
+ // The page the canvas should open on: the ?page= the report opened with
69
+ // (read once per report), or an opened view's page. Cleared as soon as the
70
+ // canvas reports back, so a later in-app page change is never fought by a
71
+ // stale value.
76
72
  pageId = signal(null);
77
73
  // The page the chat is bound to: the one on screen. A report conversation
78
74
  // belongs to exactly one page, so this both scopes the conversation list and
@@ -139,7 +135,6 @@ export class FsAiReportComponent {
139
135
  _canvas;
140
136
  _reportData = inject(ReportData);
141
137
  _reportAiChatData = inject(ReportAiChatData);
142
- _router = inject(Router);
143
138
  _route = inject(ActivatedRoute);
144
139
  _filterState = inject(ReportFilterStateService);
145
140
  _filterOptions = inject(ReportFilterOptionsService);
@@ -150,29 +145,16 @@ export class FsAiReportComponent {
150
145
  _dialog = inject(MatDialog);
151
146
  _destroyRef = inject(DestroyRef);
152
147
  _zone = inject(NgZone);
153
- // The report whose URL state has been read. The URL is read only on a
154
- // report's first load; a reload after a chat or dialog edit keeps the state
155
- // in memory, which is newer than anything the URL holds.
156
- _restoredReportId = null;
157
- // Whether the canvas has reported the open page for this report. Until it
158
- // has, the page param in the URL is the deep link still being honored, and
159
- // the URL writer leaves it alone.
160
- _pageReported = false;
161
- // The canvas moved to another page. Merged into the single URL writer.
162
- _pageWrite$ = new Subject();
148
+ // The report that has been opened (its default view, else its defaults).
149
+ // A report opens once; a reload after a chat or dialog edit keeps the state
150
+ // in memory.
151
+ _openedReportId = null;
163
152
  // The state version the bar was last built for (reportFilterKey).
164
153
  _barVersion = signal(0);
165
154
  constructor() {
166
155
  // Each chat turn carries what the viewer has on screen. Only the function
167
156
  // is set here; it is called when a turn is sent.
168
157
  this._reportAiChatData.turnData = () => ({ viewerState: this._chatViewerState() });
169
- // The ONE writer of this view's query params. Page moves and viewer-state
170
- // changes both funnel here, and auditTime(0) folds a burst (a bar re-sets
171
- // every group it shows) into a single write. Every write carries the whole
172
- // state, so a write that supersedes another loses nothing.
173
- merge(this._filterState.urlChanges(), this._pageWrite$)
174
- .pipe(auditTime(0), tap(() => this._writeUrl()), takeUntilDestroyed(this._destroyRef))
175
- .subscribe();
176
158
  // Point the shared data gateway at the configured base first (before any
177
159
  // load below reads it).
178
160
  effect(() => {
@@ -181,9 +163,9 @@ export class FsAiReportComponent {
181
163
  // (Re)load whenever the host switches the report id.
182
164
  effect(() => {
183
165
  const reportId = this.reportId();
184
- // Seed the open page from the URL for this report. Read per load rather
185
- // than once at construction: the host may swap reports on the same route,
186
- // and each arrival carries its own ?page=.
166
+ // The page this report opens on, from the ?page= the URL already holds.
167
+ // Read per report rather than once at construction: the host may swap
168
+ // reports on the same route, and each arrival carries its own ?page=.
187
169
  const pageId = this._pageIdFromUrl();
188
170
  // Only the report id and the page param re-run this. The view state below
189
171
  // is written here and read by the config build, so it stays untracked.
@@ -193,14 +175,13 @@ export class FsAiReportComponent {
193
175
  // until its canvas says which page it landed on.
194
176
  this.chatPageId.set(null);
195
177
  this.pageId.set(pageId);
196
- this._pageReported = false;
197
178
  if (reportId != null) {
198
179
  this._loadReport(reportId);
199
180
  }
200
181
  else {
201
- // Forget the restored report, so a host that comes back to it reads
202
- // the URL again.
203
- this._restoredReportId = null;
182
+ // Forget the opened report, so a host that comes back to it opens
183
+ // it again.
184
+ this._openedReportId = null;
204
185
  this.report.set(null);
205
186
  this._buildReportConfig();
206
187
  }
@@ -247,18 +228,21 @@ export class FsAiReportComponent {
247
228
  return;
248
229
  }
249
230
  const reportId = report.id;
250
- this._dialog.open(ReportSettingsComponent, {
231
+ const dialogRef = this._dialog.open(ReportSettingsComponent, {
251
232
  data: { report },
252
233
  width: '460px',
253
- })
254
- .afterClosed()
234
+ });
235
+ const settings = dialogRef.componentInstance;
236
+ dialogRef.afterClosed()
255
237
  .pipe(takeUntilDestroyed(this._destroyRef))
256
238
  .subscribe((result) => {
257
239
  if (result?.action === 'deleted') {
258
240
  this.deleted.emit(reportId);
259
241
  return;
260
242
  }
261
- if (result?.action === 'saved') {
243
+ // A save that failed part way (a refused name) may still have stored
244
+ // the filters before it, so a dismissed dialog that wrote reloads too.
245
+ if (result?.action === 'saved' || settings.wrote()) {
262
246
  this._loadReport(reportId, true);
263
247
  }
264
248
  });
@@ -267,12 +251,14 @@ export class FsAiReportComponent {
267
251
  // (SQL, config, filter wiring).
268
252
  componentSettings(component) {
269
253
  const report = this.report();
270
- if (!report) {
254
+ if (!report || !this._canvas) {
271
255
  return;
272
256
  }
273
257
  const reportId = report.id;
258
+ // The dialog gets what the component's title tokens fill with where it is
259
+ // drawn, for the title's Insert field menu and the line saying how it reads.
274
260
  const dialogRef = this._dialog.open(ComponentSettingsComponent, {
275
- data: { report, component },
261
+ data: { report, component, tokens: this._canvas.componentTokens(component) },
276
262
  width: '640px',
277
263
  });
278
264
  // Filter add/remove/level changes persist immediately inside the dialog (no
@@ -307,17 +293,15 @@ export class FsAiReportComponent {
307
293
  }
308
294
  });
309
295
  }
310
- // The canvas moved to another page: reflect it in the URL so a refresh or a
311
- // shared link comes back here (the write itself is _writeUrl's).
296
+ // The canvas moved to another page. The report-level filters stay as they
297
+ // are (they live in the state service), and the URL is left alone.
312
298
  onCanvasPageChanged(pageId) {
313
- // The deep link has been consumed; from here the canvas owns the page.
299
+ // The asked-for page has been consumed; from here the canvas owns the page.
314
300
  this.pageId.set(null);
315
301
  this.chatPageId.set(pageId);
316
- this._pageReported = true;
317
302
  // The open page is part of the screen a view saves.
318
303
  this._filterState.setPage(pageId);
319
304
  this.pageChanged.emit(pageId);
320
- this._pageWrite$.next();
321
305
  // The bar shows the page groups of the page on screen.
322
306
  if (hasPageGroup(this.report())) {
323
307
  this._buildReportConfig();
@@ -355,12 +339,13 @@ export class FsAiReportComponent {
355
339
  // Each file carries its tile's own state (zipExportStates): a list's sort,
356
340
  // search and hidden columns, a chart's drill path and the groups that match
357
341
  // 'any'; a server that does not read it uses each list's saved sort. The
358
- // notes get the filter lines as the cover words them (filterLines; a This
342
+ // notes get the filter lines as the cover words them (exportLines; a This
359
343
  // Page zip names only the groups that reach the page) and the open view,
360
- // which the server names. All of it is read once, when the export starts.
361
- // `thisPage` narrows it to the page the canvas is showing. Unlike the
362
- // PDF/PowerPoint exports the files are written server-side, so they are not
363
- // capped by what a slide can hold.
344
+ // which the server names, and each file is named after its tile's title as
345
+ // the canvas header reads it (titles). All of it is read once, when the
346
+ // export starts (exportWording). `thisPage` narrows it to the page the
347
+ // canvas is showing. Unlike the PDF/PowerPoint exports the files are
348
+ // written server-side, so they are not capped by what a slide can hold.
364
349
  exportData(thisPage = false) {
365
350
  const report = this.report();
366
351
  if (!report) {
@@ -373,8 +358,8 @@ export class FsAiReportComponent {
373
358
  const states = zipExportStates(report, snapshot.view, pageId);
374
359
  const viewId = this._views.openView()?.id ?? null;
375
360
  const viewChanged = this._views.viewChanged();
376
- this._process.download('Exporting data', this._collector.filterLines(report, snapshot, pageId)
377
- .pipe(switchMap((lines) => this._reportData.exportReport(report.id, filters, pageId, frequency, lines, states, viewId, viewChanged))));
361
+ this._process.download('Exporting data', this._collector.exportWording(report, snapshot, pageId)
362
+ .pipe(switchMap(({ lines, titles }) => this._reportData.exportReport(report.id, filters, pageId, frequency, lines, states, viewId, viewChanged, titles))));
378
363
  }
379
364
  // React to each chat turn (fs-chat handles the request + persistence); we
380
365
  // only care about the report side effects this context's backend flags.
@@ -438,8 +423,8 @@ export class FsAiReportComponent {
438
423
  const clamped = Math.min(0.8, Math.max(0.2, ratio));
439
424
  this._chatPanel.nativeElement.style.flexBasis = `${clamped * 100}%`;
440
425
  }
441
- // The page id sitting in the URL right now, or null when deep linking is off
442
- // or the value is not a usable id.
426
+ // The page id the URL holds right now (?page=, read only), or null when the
427
+ // page param is off or the value is not a usable id.
443
428
  _pageIdFromUrl() {
444
429
  const param = this.pageQueryParam();
445
430
  if (!param) {
@@ -448,34 +433,6 @@ export class FsAiReportComponent {
448
433
  const pageId = Number(this._route.snapshot.queryParamMap.get(param));
449
434
  return Number.isFinite(pageId) && pageId > 0 ? pageId : null;
450
435
  }
451
- // Writes the open page and the viewer state into the URL in one go. Only
452
- // the keys this view owns are touched ('merge'), and replaceUrl keeps the
453
- // writes out of the browser history: Back leaves the report rather than
454
- // walking every page and filter visited.
455
- _writeUrl() {
456
- const report = this.report();
457
- // A report still on screen while the host's next one loads must not write
458
- // its state over the new report's URL.
459
- if (!report || report.id !== this.reportId()) {
460
- return;
461
- }
462
- const queryParams = this.urlState()
463
- ? this._urlParams(report)
464
- : {};
465
- const pageParam = this.pageQueryParam();
466
- if (pageParam && this._pageReported) {
467
- queryParams[pageParam] = this.chatPageId();
468
- }
469
- if (!Object.keys(queryParams).length) {
470
- return;
471
- }
472
- this._router.navigate([], {
473
- relativeTo: this._route,
474
- queryParams,
475
- queryParamsHandling: 'merge',
476
- replaceUrl: true,
477
- });
478
- }
479
436
  _loadReport(reportId, emitRenamed = false) {
480
437
  this._reportData.get(reportId)
481
438
  .pipe(switchMap((report) => this._openReport(report).pipe(map(() => report))), takeUntilDestroyed(this._destroyRef))
@@ -488,19 +445,15 @@ export class FsAiReportComponent {
488
445
  }
489
446
  });
490
447
  }
491
- // Sets the viewer state up for a loaded report. The URL is read once per
492
- // report, on its first load; every later load keeps the state in memory.
493
- // A server that keeps saved views opens the report in the view service's
494
- // order (a link, else the viewer's default view, else the defaults), which
495
- // may wait for that view; any other reads the URL as it always did.
448
+ // Sets the viewer state up for a loaded report. On its first load a server
449
+ // that keeps saved views opens it on the viewer's default view, else on the
450
+ // defaults (which waits for the list of views); any other server opens it
451
+ // on the defaults. Every later load keeps the state in memory.
496
452
  _openReport(report) {
497
- const firstLoad = report.id !== this._restoredReportId;
498
- this._restoredReportId = report.id;
453
+ const firstLoad = report.id !== this._openedReportId;
454
+ this._openedReportId = report.id;
499
455
  if (!this._views.serves(report)) {
500
- const restore = this.urlState() && firstLoad
501
- ? readReportUrlParams(this._route.snapshot.queryParamMap, report.filterGroups ?? [])
502
- : null;
503
- this._filterState.init(report, restore);
456
+ this._filterState.init(report);
504
457
  return of(undefined);
505
458
  }
506
459
  if (!firstLoad) {
@@ -508,21 +461,11 @@ export class FsAiReportComponent {
508
461
  this._views.refresh(report);
509
462
  return of(undefined);
510
463
  }
511
- return this._views.open(report, this.urlState() ? this._route.snapshot.queryParams : {}, this.pageId());
512
- }
513
- // The query params of the screen: through the view service for a server
514
- // that keeps saved views, else the link this viewer always wrote.
515
- _urlParams(report) {
516
- const current = this._route.snapshot.queryParamMap;
517
- // A select's picks are written as value:name, with the names the bars
518
- // have read.
519
- const name = (groupId, value) => this._filterOptions.label(groupId, value);
520
- return this._views.serves(report)
521
- ? this._views.urlParams(current, name)
522
- : buildReportUrlParams(this._filterState.urlSnapshot(report), current, report.filterGroups ?? [], name);
464
+ return this._views.open(report, this.pageId());
523
465
  }
524
- // Moves the canvas to the page an opened view put on screen (a page in a
525
- // link already won inside apply()). A reset, or a reload, leaves the page.
466
+ // Moves the canvas to the page an opened view put on screen (a ?page= the
467
+ // report opened with already won inside apply()). A reset, or a reload,
468
+ // leaves the page.
526
469
  _openAppliedPage() {
527
470
  const pageId = this._filterState.page();
528
471
  if (pageId && pageId !== this.chatPageId()) {
@@ -564,10 +507,8 @@ export class FsAiReportComponent {
564
507
  }
565
508
  this._barVersion.set(this._filterState.stateVersion());
566
509
  this.reportFilterConfig.set({
567
- // fs-filter never touches the URL or persists filter state: its keys are
568
- // not namespaced, it writes outside the router, and it would freeze a
569
- // rolling range as two dates. ReportFilterStateService owns the values,
570
- // and _writeUrl is the one writer of the URL.
510
+ // fs-filter never touches the URL or persists filter state: a report
511
+ // keeps no state in the URL. ReportFilterStateService owns the values.
571
512
  queryParam: false,
572
513
  persist: false,
573
514
  items,
@@ -587,7 +528,7 @@ export class FsAiReportComponent {
587
528
  // The bar's values into the state: every group it shows, the grain and,
588
529
  // when the bar has the control, the match.
589
530
  _barChanged(query, hasMatch) {
590
- for (const { groupId, value } of groupValuesFromQuery(query, this._reportGroups(), this.report())) {
531
+ for (const { groupId, value } of groupValuesFromQuery(query, this._reportGroups())) {
591
532
  this._filterState.setValue(groupId, value);
592
533
  }
593
534
  // Not a filter group — the grain is read straight off the query.
@@ -612,14 +553,13 @@ export class FsAiReportComponent {
612
553
  return matchFilterItem(this.report(), this._reportGroups(), this.chatPageId(), this._filterState.match());
613
554
  }
614
555
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
615
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FsAiReportComponent, isStandalone: true, selector: "fs-ai-report", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, pageQueryParam: { classPropertyName: "pageQueryParam", publicName: "pageQueryParam", isSignal: true, isRequired: false, transformFunction: null }, urlState: { classPropertyName: "urlState", publicName: "urlState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { deleted: "deleted", renamed: "renamed", pageChanged: "pageChanged" }, providers: [
556
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FsAiReportComponent, isStandalone: true, selector: "fs-ai-report", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, pageQueryParam: { classPropertyName: "pageQueryParam", publicName: "pageQueryParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { deleted: "deleted", renamed: "renamed", pageChanged: "pageChanged" }, providers: [
616
557
  // Session filter state is per-open-report, not app-global; the export
617
558
  // services resolve filters through it, so they live at the same level.
618
559
  ReportFilterStateService,
619
560
  // The bars' select lists, narrowed by the other filters; per open report.
620
561
  ReportFilterOptionsService,
621
- // The report's saved views, the order it opens in and its link; per
622
- // open report.
562
+ // The report's saved views and the order it opens in; per open report.
623
563
  ReportViewService,
624
564
  ReportExportCollectorService,
625
565
  ReportPptxService,
@@ -645,8 +585,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
645
585
  ReportFilterStateService,
646
586
  // The bars' select lists, narrowed by the other filters; per open report.
647
587
  ReportFilterOptionsService,
648
- // The report's saved views, the order it opens in and its link; per
649
- // open report.
588
+ // The report's saved views and the order it opens in; per open report.
650
589
  ReportViewService,
651
590
  ReportExportCollectorService,
652
591
  ReportPptxService,
@@ -682,4 +621,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
682
621
  type: ViewChild,
683
622
  args: [ReportCanvasComponent]
684
623
  }] } });
685
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFnQixjQUFjLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQWMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FB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QUNoQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFO3dCQUN4RCxzRUFBc0U7d0JBQ3RFLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ3JHLDJFQUEyRTt3QkFDM0Usd0NBQXdDO3dCQUN4Qyx1QkFBdUIsRUFBRTtxQkFDMUIsV0FDUTt3QkFDUCxjQUFjO3dCQUNkLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLHlCQUF5QjtxQkFDMUI7d0RBOEdPLE1BQU07c0JBRGIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk1QixVQUFVO3NCQURqQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFNbEQsT0FBTztzQkFEZCxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIE5nWm9uZSwgVmlld0NoaWxkLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGaWx0ZXJDb25maWcsIEZzRmlsdGVyTW9kdWxlLCBJRmlsdGVyQ29uZmlnSXRlbSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzUHJvY2VzcyB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBtZXJnZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBwcm92aWRlRWNoYXJ0c0NvcmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IEZzQWlDaGF0Q29tcG9uZW50LCBGc0FpQ2hhdERhdGEsIEZzQWlDaGF0UmVzcG9uc2UgfSBmcm9tICdAZmlyZXN0aXRjaC9haSc7XG5cbmltcG9ydCB7IFJlcG9ydENhbnZhc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3UGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9yZXBvcnQtdmlldy1waWNrZXIvcmVwb3J0LXZpZXctcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRBaUNoYXREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQtYWktY2hhdC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIFJlcG9ydFNldHRpbmdzUmVzdWx0IH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9yZXBvcnQtc2V0dGluZ3MvcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UGRmU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UHB0eFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBwdHguc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtdGV4dC1sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyU3RhdGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1jaGF0LXZpZXdlci1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0LCBSZXBvcnRDaGF0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBjaGF0Vmlld2VyRHJpbGxzLCBjaGF0Vmlld2VyTWF0Y2ggfSBmcm9tICcuLi8uLi9yZXBvcnQtY2hhdC12aWV3ZXItc3RhdGUnO1xuaW1wb3J0IHsgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIgfSBmcm9tICcuLi8uLi9yZXBvcnQtZGF0ZS1wcmVzZXRzJztcbmltcG9ydCB7XG4gIEdST1VQX0JZX0lURU0sIGZpbHRlckl0ZW1Gb3JHcm91cCwgZ3JvdXBCeUZpbHRlckl0ZW0sIGdyb3VwQnlTaWduYXR1cmUsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5LFxuICBoYXNQYWdlR3JvdXAsIGlzR3JhbnVsYXJpdHlPZmZlcmVkLCBtYXRjaEZpbHRlckl0ZW0sIG1hdGNoRnJvbVF1ZXJ5LCByZXBvcnRCYXJHcm91cHMsXG59IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgYnVpbGRSZXBvcnRVcmxQYXJhbXMsIHJlYWRSZXBvcnRVcmxQYXJhbXMgfSBmcm9tICcuLi8uLi9yZXBvcnQtdXJsLXN0YXRlJztcbmltcG9ydCB7IGNoYXRWaWV3RmllbGRzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LXZpZXctY29uZmlnJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLCBkZWZhdWx0U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LXZpZXcuc2VydmljZSc7XG5pbXBvcnQgeyB6aXBFeHBvcnRTdGF0ZXMgfSBmcm9tICcuLi8uLi90aWxlLWRhdGEtc3RhdGUnO1xuXG5cbi8vIEEgc2luZ2xlIHJlcG9ydDogdGhlIEFJIGNoYXQgb24gdGhlIGxlZnQsIHRoZSByZXBvcnQgY2FudmFzIG9uIHRoZSByaWdodCxcbi8vIHVuZGVyIGFuIEgyIHRpdGxlICsgc2V0dGluZ3MgZ2Vhci4gVGhlIGhvc3Qgc3VwcGxpZXMgW3JlcG9ydElkXSAoZnJvbSBpdHNcbi8vIHJvdXRlKSBhbmQgc3dpdGNoZXMgcmVwb3J0cyB0aHJvdWdoIGl0cyBvd24gcm91dGVzIOKAlCB0aGlzIGNvbXBvbmVudCBuZXZlclxuLy8gcGlja3Mgb25lLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBTZXNzaW9uIGZpbHRlciBzdGF0ZSBpcyBwZXItb3Blbi1yZXBvcnQsIG5vdCBhcHAtZ2xvYmFsOyB0aGUgZXhwb3J0XG4gICAgLy8gc2VydmljZXMgcmVzb2x2ZSBmaWx0ZXJzIHRocm91Z2ggaXQsIHNvIHRoZXkgbGl2ZSBhdCB0aGUgc2FtZSBsZXZlbC5cbiAgICBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsXG4gICAgLy8gVGhlIGJhcnMnIHNlbGVjdCBsaXN0cywgbmFycm93ZWQgYnkgdGhlIG90aGVyIGZpbHRlcnM7IHBlciBvcGVuIHJlcG9ydC5cbiAgICBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgICAvLyBUaGUgcmVwb3J0J3Mgc2F2ZWQgdmlld3MsIHRoZSBvcmRlciBpdCBvcGVucyBpbiBhbmQgaXRzIGxpbms7IHBlclxuICAgIC8vIG9wZW4gcmVwb3J0LlxuICAgIFJlcG9ydFZpZXdTZXJ2aWNlLFxuICAgIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UsXG4gICAgUmVwb3J0UHB0eFNlcnZpY2UsXG4gICAgUmVwb3J0UGRmU2VydmljZSxcbiAgICBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRTZXJ2aWNlLFxuICAgIC8vIGZzLWFpLWNoYXQgc2l0cyBpbiB0aGlzIHRlbXBsYXRlLCBzbyBpdCByZXNvbHZlcyBpdHMgZ2F0ZXdheSBoZXJlOiB0aGVcbiAgICAvLyByZXBvcnQgb25lLCB3aGljaCBhZGRzIHRoZSB2aWV3ZXIncyBzdGF0ZSB0byBlYWNoIHR1cm4gaXQgc2VuZHMuXG4gICAgUmVwb3J0QWlDaGF0RGF0YSxcbiAgICB7IHByb3ZpZGU6IEZzQWlDaGF0RGF0YSwgdXNlRXhpc3Rpbmc6IFJlcG9ydEFpQ2hhdERhdGEgfSxcbiAgICAvLyBUcmVlLXNoYWtlbiBFQ2hhcnRzIGNvcmUgKyB0aGUgJ3JlcG9ydCcgaG91c2UgdGhlbWUsIGxvYWRlZCBsYXppbHkuXG4gICAgcHJvdmlkZUVjaGFydHNDb3JlKHsgZWNoYXJ0czogKCkgPT4gaW1wb3J0KCcuLi8uLi90aGVtZS9lY2hhcnRzJykudGhlbigobW9kdWxlKSA9PiBtb2R1bGUuZGVmYXVsdCkgfSksXG4gICAgLy8gVGhlIGJhcidzIGRhdGUgcGlja2VycyBzdGFydCB0aGVpciB3ZWVrcyBvbiBNb25kYXkgYW5kIGxpc3QgdGhlIGJ1aWx0LWluXG4gICAgLy8gcHJlc2V0czsgYSBwcmVzZXQgb25seSBzZXRzIHRoZSBkYXlzLlxuICAgIHByb3ZpZGVSZXBvcnREYXRlUGlja2VyKCksXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBGc0ZpbHRlck1vZHVsZSxcbiAgICBGc01lbnVNb2R1bGUsXG4gICAgRnNBaUNoYXRDb21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBSZXBvcnRDYW52YXNDb21wb25lbnQsXG4gICAgUmVwb3J0Vmlld1BpY2tlckNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNBaVJlcG9ydENvbXBvbmVudCB7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGlzIHZpZXcgaXMgZm9jdXNlZCBvbiDigJQgc3VwcGxpZWQgYnkgdGhlIGhvc3QgZnJvbSB0aGUgcm91dGUuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEFQSSBiYXNlIGZvciB0aGUgcmVwb3J0cyArIGNoYXQgZW5kcG9pbnRzOyBvdmVycmlkZSB0byBtb3VudCBlbHNld2hlcmUuXG4gIHB1YmxpYyByZWFkb25seSBiYXNlUGF0aCA9IGlucHV0PHN0cmluZz4oJ3JlcG9ydHMnKTtcblxuICAvLyBUaGUgcXVlcnkgcGFyYW0gdGhhdCBjYXJyaWVzIHRoZSBvcGVuIHBhZ2UncyBpZC4gRGVlcCBsaW5raW5nIGlzIG9uIGJ5XG4gIC8vIGRlZmF1bHQ7IGEgaG9zdCB0aGF0IG1vdW50cyBzZXZlcmFsIHJlcG9ydHMgb24gb25lIHJvdXRlLCBvciB3YW50cyBubyBVUkxcbiAgLy8gd3JpdGVzIGF0IGFsbCwgc2V0cyB0aGlzIHRvIG51bGwgdG8gdHVybiBpdCBvZmYuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlUXVlcnlQYXJhbSA9IGlucHV0PHN0cmluZyB8IG51bGw+KCdwYWdlJyk7XG5cbiAgLy8gV2hldGhlciB0aGUgdmlld2VyJ3MgZmlsdGVycywgZ3JvdXAtYnkgZ3JhaW4gYW5kIGxpc3Qgc29ydHMgbGl2ZSBpbiB0aGUgVVJMXG4gIC8vIChyZWdpb249LCBleGNsdWRlUmVnaW9uPSwgdW5pdHNNaW49LCBncm91cEJ5LCBzPGNvbXBvbmVudElkPjsgc2VlXG4gIC8vIHJlcG9ydC11cmwtc3RhdGUudHMpLCBzbyBhIHJlZnJlc2ggb3IgYSBzaGFyZWQgbGluayBvcGVucyB0aGUgcmVwb3J0IGFzXG4gIC8vIGl0IHdhcyBzZWVuLiBPbiBieSBkZWZhdWx0OyBhIGhvc3QgdGhhdCBtb3VudHMgc2V2ZXJhbCByZXBvcnRzIG9uIG9uZVxuICAvLyByb3V0ZSwgb3Iga2VlcHMgcXVlcnkga2V5cyBvZiBpdHMgb3duIHRoYXQgYSBmaWx0ZXIgZ3JvdXAncyBsYWJlbCBvciBhXG4gIC8vIHRpbGUga2V5IChzPG4+KSBjb3VsZCB0YWtlLCB0dXJucyBpdCBvZmYuXG4gIHB1YmxpYyByZWFkb25seSB1cmxTdGF0ZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8vIFRoZSByZXBvcnQgd2FzIGRlbGV0ZWQgZnJvbSBpdHMgc2V0dGluZ3MgZGlhbG9nIOKAlCB0aGUgaG9zdCByb3V0ZXMgYmFjayB0b1xuICAvLyB0aGUgbGlzdGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZWQgPSBvdXRwdXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQgd2FzIHJlbmFtZWQgKHNldHRpbmdzLCBvciB0aGUgYWdlbnQpIOKAlCB0aGUgaG9zdCBjYW4gcmVmcmVzaCBhXG4gIC8vIGJyZWFkY3J1bWIgLyBkb2N1bWVudCB0aXRsZS5cbiAgcHVibGljIHJlYWRvbmx5IHJlbmFtZWQgPSBvdXRwdXQ8UmVwb3J0PigpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgbW92ZWQgdG8gYW5vdGhlciBwYWdlLiBUaGlzIHZpZXcgd3JpdGVzIHRoZSBVUkwgaXRzZWxmIChyaWdodFxuICAvLyBhZnRlciB0aGlzIGZpcmVzKSDigJQgdGhpcyBpcyBmb3IgaG9zdHMgdGhhdCB0cmFjayB0aGUgb3BlbiBwYWdlIGZvciB0aGVpclxuICAvLyBvd24gcmVhc29ucy5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VDaGFuZ2VkID0gb3V0cHV0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydCA9IHNpZ25hbDxSZXBvcnQgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRNb2RlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUaGUgcGFnZSB0aGUgY2FudmFzIHNob3VsZCBvcGVuIG9uLCByZWFkIGZyb20gdGhlIFVSTCBvbmNlIHBlciByZXBvcnQuXG4gIC8vIENsZWFyZWQgYXMgc29vbiBhcyB0aGUgY2FudmFzIHJlcG9ydHMgYmFjaywgc28gYSBsYXRlciBpbi1hcHAgcGFnZSBjaGFuZ2VcbiAgLy8gaXMgbmV2ZXIgZm91Z2h0IGJ5IGEgc3RhbGUgdmFsdWUuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGNoYXQgaXMgYm91bmQgdG86IHRoZSBvbmUgb24gc2NyZWVuLiBBIHJlcG9ydCBjb252ZXJzYXRpb25cbiAgLy8gYmVsb25ncyB0byBleGFjdGx5IG9uZSBwYWdlLCBzbyB0aGlzIGJvdGggc2NvcGVzIHRoZSBjb252ZXJzYXRpb24gbGlzdCBhbmRcbiAgLy8gYmVjb21lcyB0aGUgbmV3IGNvbnZlcnNhdGlvbidzIHBhZ2UuIEEgc2lnbmFsIGJlY2F1c2UgaXQgZmVlZHNcbiAgLy8gW3JlcXVlc3REYXRhXSDigJQgY2hhbmdpbmcgaXQgaXMgd2hhdCByZWxvYWRzIHRoZSBwYW5lbCBvbnRvIHRoZSBuZXcgcGFnZSdzXG4gIC8vIGNvbnZlcnNhdGlvbnMuIE51bGwgdW50aWwgdGhlIGNhbnZhcyByZXBvcnRzIHdoaWNoIHBhZ2UgaXQgb3BlbmVkIG9uLCB3aGljaFxuICAvLyBrZWVwcyB0aGUgY2hhdCBmcm9tIGxpc3RpbmcgYWdhaW5zdCBhIHBhZ2UgZ3Vlc3MuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFdoYXQgdGhlIGNoYXQgc2VuZHMgd2l0aCBldmVyeSBjb252ZXJzYXRpb24gY2FsbDogdGhlIHJlcG9ydCwgYW5kIHRoZSBwYWdlXG4gIC8vIGl0IGlzIGJvdW5kIHRvLlxuICAvL1xuICAvLyByZXBvcnRQYWdlSWQgaXMgT01JVFRFRCwgbm90IHNlbnQgYXMgbnVsbCwgd2hpbGUgdGhlIG9wZW4gcGFnZSBpcyB1bmtub3duLlxuICAvLyBUaGUgYmFja2VuZCByZWFkcyBhIFBSRVNFTlQgcmVwb3J0UGFnZUlkIG9mIDAvbnVsbCBhcyBcInRoZSByZXBvcnQncyBlYXJsaWVyLFxuICAvLyBwYWdlLWxlc3MgY29udmVyc2F0aW9uc1wiLCBzbyBzZW5kaW5nIG51bGwgYmVmb3JlIHRoZSBjYW52YXMgaGFzIHJlcG9ydGVkIGluXG4gIC8vIHdvdWxkIGFzayBmb3IgdGhlIHdyb25nIGxpc3Qg4oCUIGFuZCwgd29yc2UsIHdvdWxkIGJpbmQgYSBjb252ZXJzYXRpb24gc3RhcnRlZFxuICAvLyBpbiB0aGF0IHdpbmRvdyB0byBubyBwYWdlIGF0IGFsbC5cbiAgLy9cbiAgLy8gVGhlIGNoYXQgaXMgYWxzbyBoZWxkIGNsb3NlZCAoW3JlYWR5XSBpbiB0aGUgdGVtcGxhdGUpIHVudGlsIHRoZSBwYWdlIGlzXG4gIC8vIGtub3duLCBzbyB0aGlzIHBhcnRpYWwgY29udGV4dCBpcyBuZXZlciBhY3R1YWxseSBzZW50OiBvbiBhIGZyZXNoIGxvYWQgdGhlXG4gIC8vIHJlcG9ydCBoYXMgdG8gYXJyaXZlIGFuZCB0aGUgY2FudmFzIGhhcyB0byByZW5kZXIgYmVmb3JlIGFueSBwYWdlIGV4aXN0cyxcbiAgLy8gYW5kIGEgbGlzdCBmZXRjaGVkIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIHRoZSB3aG9sZSByZXBvcnQncyBjb252ZXJzYXRpb25zXG4gIC8vIOKAlCB0aGUgdW5zY29wZWQgbGlzdCwgc2hvd24gYW5kIGF1dG8tc2VsZWN0ZWQgYmVmb3JlIHRoZSByZWFsIG9uZSBsYW5kcy5cbiAgcHVibGljIHJlYWRvbmx5IGNoYXRSZXF1ZXN0RGF0YSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0UGFnZUlkID0gdGhpcy5jaGF0UGFnZUlkKCk7XG5cbiAgICByZXR1cm4gcmVwb3J0UGFnZUlkID09PSBudWxsXG4gICAgICA/IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSB9XG4gICAgICA6IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSwgcmVwb3J0UGFnZUlkIH07XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHRvb2xiYXIgKGZzLWZpbHRlcikuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZFxuICAvLyByZXBvcnQgKGFuZCB0aHVzIGl0cyBncm91cHMpIGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJDb25maWcgPSBzaWduYWw8RmlsdGVyQ29uZmlnIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gR2F0ZXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIHNvIGl0IGlzbid0IHJlbmRlcmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICAvLyBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gIH0pO1xuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSAoYXQgaW5pdCkuIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZVxuICAvLyB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZCAoYW5kIHJlLXJlYWRzIHRoZVxuICAvLyByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBiYXIgd2FzIGJ1aWx0IGZvcjogYW4gYXBwbGllZCB2aWV3LCBvciBhIHJlc2V0XG4gICAgICAvLyB0byB0aGUgYmFzZSwgcmVwbGFjZXMgZXZlcnkgdmFsdWUgYXQgb25jZS5cbiAgICAgIHRoaXMuX2JhclZlcnNpb24oKSxcbiAgICAgIC8vIFRoZSBlZmZlY3RpdmUgem9uZSBpcyBwYXJ0IG9mIGl0IHRvbzogYSB6b25lIGNoYW5nZSByZS1yZXNvbHZlcyByZWxhdGl2ZVxuICAgICAgLy8gcHJlc2V0cywgYW5kIHRoZSBiYXIgbXVzdCBiZSByZWNyZWF0ZWQgdG8gc2hvdyB0aGUgbmV3IGRheXMuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgICAgLy8gVGhlIHN0b3JlZCBkZWZhdWx0IGlzIHBhcnQgb2YgdGhlIHNpZ25hdHVyZTogc2F2aW5nIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0XG4gICAgICAvLyBzZXR0aW5ncyByZWJ1aWxkcyB0aGUgY29uZmlnLCBidXQgd2l0aG91dCBhIGtleSBjaGFuZ2UgZnMtZmlsdGVyIGtlZXBzXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgICAgIGdyb3VwQnlTaWduYXR1cmUodGhpcy5yZXBvcnQoKSksXG4gICAgICAuLi50aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBgJHtncm91cC5pZH06JHtncm91cC5sZXZlbH06JHtncm91cC5sYWJlbH06JHtkZWZhdWx0U2lnbmF0dXJlKGdyb3VwKX1gKSxcbiAgICAgIC8vIEEgcGFnZSBncm91cCBzaG93cyBvbiBpdHMgb3duIHBhZ2Ugb25seSwgc28gc3VjaCBhIGJhciBpcyByZWNyZWF0ZWRcbiAgICAgIC8vIHdoZW4gdGhlIHBhZ2Ugb24gc2NyZWVuIGNoYW5nZXMuXG4gICAgICAuLi4oaGFzUGFnZUdyb3VwKHRoaXMucmVwb3J0KCkpID8gW2BwYWdlOiR7dGhpcy5jaGF0UGFnZUlkKCl9YF0gOiBbXSksXG4gICAgXS5qb2luKCd8Jyk7XG4gIH0pO1xuXG4gIC8vIFRoZSBzZXJ2ZXIga2VlcHMgc2F2ZWQgdmlld3MgZm9yIHRoaXMgcmVwb3J0LCBzbyB0aGUgVmlld3MgcGlja2VyIHNob3dzLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld3NTZXJ2ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl92aWV3cy5zZXJ2ZXModGhpcy5yZXBvcnQoKSkpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NwbGl0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfc3BsaXQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdjaGF0UGFuZWwnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIF9jaGF0UGFuZWwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvLyBPbmx5IHRoZSBjYW52YXMga25vd3Mgd2hpY2ggcGFnZSBpcyBvbiBzY3JlZW4sIGFuZCBhIHBhZ2Utc2NvcGVkIGV4cG9ydFxuICAvLyBoYXMgdG8gYXNrIGl0LlxuICBAVmlld0NoaWxkKFJlcG9ydENhbnZhc0NvbXBvbmVudClcbiAgcHJpdmF0ZSBfY2FudmFzPzogUmVwb3J0Q2FudmFzQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX3JlcG9ydEFpQ2hhdERhdGEgPSBpbmplY3QoUmVwb3J0QWlDaGF0RGF0YSk7XG4gIHByaXZhdGUgX3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIF9yb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2ZpbHRlck9wdGlvbnMgPSBpbmplY3QoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIF92aWV3cyA9IGluamVjdChSZXBvcnRWaWV3U2VydmljZSk7XG4gIHByaXZhdGUgX2V4cG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0RXhwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgX2NvbGxlY3RvciA9IGluamVjdChSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIC8vIFRoZSByZXBvcnQgd2hvc2UgVVJMIHN0YXRlIGhhcyBiZWVuIHJlYWQuIFRoZSBVUkwgaXMgcmVhZCBvbmx5IG9uIGFcbiAgLy8gcmVwb3J0J3MgZmlyc3QgbG9hZDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IGtlZXBzIHRoZSBzdGF0ZVxuICAvLyBpbiBtZW1vcnksIHdoaWNoIGlzIG5ld2VyIHRoYW4gYW55dGhpbmcgdGhlIFVSTCBob2xkcy5cbiAgcHJpdmF0ZSBfcmVzdG9yZWRSZXBvcnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gV2hldGhlciB0aGUgY2FudmFzIGhhcyByZXBvcnRlZCB0aGUgb3BlbiBwYWdlIGZvciB0aGlzIHJlcG9ydC4gVW50aWwgaXRcbiAgLy8gaGFzLCB0aGUgcGFnZSBwYXJhbSBpbiB0aGUgVVJMIGlzIHRoZSBkZWVwIGxpbmsgc3RpbGwgYmVpbmcgaG9ub3JlZCwgYW5kXG4gIC8vIHRoZSBVUkwgd3JpdGVyIGxlYXZlcyBpdCBhbG9uZS5cbiAgcHJpdmF0ZSBfcGFnZVJlcG9ydGVkID0gZmFsc2U7XG5cbiAgLy8gVGhlIGNhbnZhcyBtb3ZlZCB0byBhbm90aGVyIHBhZ2UuIE1lcmdlZCBpbnRvIHRoZSBzaW5nbGUgVVJMIHdyaXRlci5cbiAgcHJpdmF0ZSBfcGFnZVdyaXRlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gVGhlIHN0YXRlIHZlcnNpb24gdGhlIGJhciB3YXMgbGFzdCBidWlsdCBmb3IgKHJlcG9ydEZpbHRlcktleSkuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2JhclZlcnNpb24gPSBzaWduYWwoMCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWFjaCBjaGF0IHR1cm4gY2FycmllcyB3aGF0IHRoZSB2aWV3ZXIgaGFzIG9uIHNjcmVlbi4gT25seSB0aGUgZnVuY3Rpb25cbiAgICAvLyBpcyBzZXQgaGVyZTsgaXQgaXMgY2FsbGVkIHdoZW4gYSB0dXJuIGlzIHNlbnQuXG4gICAgdGhpcy5fcmVwb3J0QWlDaGF0RGF0YS50dXJuRGF0YSA9ICgpID0+ICh7IHZpZXdlclN0YXRlOiB0aGlzLl9jaGF0Vmlld2VyU3RhdGUoKSB9KTtcblxuICAgIC8vIFRoZSBPTkUgd3JpdGVyIG9mIHRoaXMgdmlldydzIHF1ZXJ5IHBhcmFtcy4gUGFnZSBtb3ZlcyBhbmQgdmlld2VyLXN0YXRlXG4gICAgLy8gY2hhbmdlcyBib3RoIGZ1bm5lbCBoZXJlLCBhbmQgYXVkaXRUaW1lKDApIGZvbGRzIGEgYnVyc3QgKGEgYmFyIHJlLXNldHNcbiAgICAvLyBldmVyeSBncm91cCBpdCBzaG93cykgaW50byBhIHNpbmdsZSB3cml0ZS4gRXZlcnkgd3JpdGUgY2FycmllcyB0aGUgd2hvbGVcbiAgICAvLyBzdGF0ZSwgc28gYSB3cml0ZSB0aGF0IHN1cGVyc2VkZXMgYW5vdGhlciBsb3NlcyBub3RoaW5nLlxuICAgIG1lcmdlKHRoaXMuX2ZpbHRlclN0YXRlLnVybENoYW5nZXMoKSwgdGhpcy5fcGFnZVdyaXRlJClcbiAgICAgIC5waXBlKFxuICAgICAgICBhdWRpdFRpbWUoMCksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl93cml0ZVVybCgpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gUG9pbnQgdGhlIHNoYXJlZCBkYXRhIGdhdGV3YXkgYXQgdGhlIGNvbmZpZ3VyZWQgYmFzZSBmaXJzdCAoYmVmb3JlIGFueVxuICAgIC8vIGxvYWQgYmVsb3cgcmVhZHMgaXQpLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aCgpO1xuICAgIH0pO1xuXG4gICAgLy8gKFJlKWxvYWQgd2hlbmV2ZXIgdGhlIGhvc3Qgc3dpdGNoZXMgdGhlIHJlcG9ydCBpZC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydElkKCk7XG5cbiAgICAgIC8vIFNlZWQgdGhlIG9wZW4gcGFnZSBmcm9tIHRoZSBVUkwgZm9yIHRoaXMgcmVwb3J0LiBSZWFkIHBlciBsb2FkIHJhdGhlclxuICAgICAgLy8gdGhhbiBvbmNlIGF0IGNvbnN0cnVjdGlvbjogdGhlIGhvc3QgbWF5IHN3YXAgcmVwb3J0cyBvbiB0aGUgc2FtZSByb3V0ZSxcbiAgICAgIC8vIGFuZCBlYWNoIGFycml2YWwgY2FycmllcyBpdHMgb3duID9wYWdlPS5cbiAgICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXMuX3BhZ2VJZEZyb21VcmwoKTtcblxuICAgICAgLy8gT25seSB0aGUgcmVwb3J0IGlkIGFuZCB0aGUgcGFnZSBwYXJhbSByZS1ydW4gdGhpcy4gVGhlIHZpZXcgc3RhdGUgYmVsb3dcbiAgICAgIC8vIGlzIHdyaXR0ZW4gaGVyZSBhbmQgcmVhZCBieSB0aGUgY29uZmlnIGJ1aWxkLCBzbyBpdCBzdGF5cyB1bnRyYWNrZWQuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRNb2RlLnNldChmYWxzZSk7XG5cbiAgICAgICAgLy8gQSBuZXcgcmVwb3J0J3MgcGFnZXMgYXJlIG5vdCB0aGlzIHJlcG9ydCdzIHBhZ2VzIOKAlCBkcm9wIHRoZSBiaW5kaW5nXG4gICAgICAgIC8vIHVudGlsIGl0cyBjYW52YXMgc2F5cyB3aGljaCBwYWdlIGl0IGxhbmRlZCBvbi5cbiAgICAgICAgdGhpcy5jaGF0UGFnZUlkLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5wYWdlSWQuc2V0KHBhZ2VJZCk7XG4gICAgICAgIHRoaXMuX3BhZ2VSZXBvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChyZXBvcnRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yZ2V0IHRoZSByZXN0b3JlZCByZXBvcnQsIHNvIGEgaG9zdCB0aGF0IGNvbWVzIGJhY2sgdG8gaXQgcmVhZHNcbiAgICAgICAgICAvLyB0aGUgVVJMIGFnYWluLlxuICAgICAgICAgIHRoaXMuX3Jlc3RvcmVkUmVwb3J0SWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5KCkgYW5kIHJlc2V0VG9CYXNlKCkgbW92ZSB0aGUgc3RhdGUgdmVyc2lvbi4gVGhlIGJhciBpcyBidWlsdFxuICAgIC8vIGFnYWluIGZvciBpdCwgYW5kIHJlcG9ydEZpbHRlcktleSwgd2hpY2ggY2FycmllcyBpdCwgcmVjcmVhdGVzXG4gICAgLy8gZnMtZmlsdGVyOiBpdCByZWFkcyBpdHMgY29uZmlnIG9uY2UuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IHRoaXMuX2JhclZlcnNpb24oKSkge1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQW4gb3BlbmVkIHZpZXcgKGEgc2F2ZWQgdmlldyBwaWNrZWQsIG9yIHRoZSByZXBvcnQncyBkZWZhdWx0cykgb3BlbnNcbiAgICAvLyBvbiBpdHMgcGFnZS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuYXBwbGllZFZlcnNpb24oKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuX29wZW5BcHBsaWVkUGFnZSgpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS51cGRhdGUoKGVkaXRNb2RlKSA9PiAhZWRpdE1vZGUpO1xuICB9XG5cbiAgLy8gVGhlIGVkaXQgdG9vbHMgbGl2ZSBpbiB0aGlzIHRvb2xiYXIsIGJ1dCB0aGUgY2FudmFzIG93bnMgd2hhdCB0aGV5IGFjdCBvblxuICAvLyAodGhlIGFjdGl2ZSBwYWdlLCB0aGUgaGVhZGVyL2Zvb3RlciBiYW5kcywgd2hpY2ggbGF5ZXIgaXMgbGl2ZSkuXG4gIHB1YmxpYyBnZXQgaXNNYXN0ZXJNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW52YXM/Lm1hc3Rlck1vZGUoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8uYWRkVGV4dCgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1hc3Rlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy50b2dnbGVNYXN0ZXJNb2RlKCk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3Mg4oCUIG5hbWUsIHBhZ2Ugc2l6ZSwgZGVsZXRlLiBUaGVcbiAgLy8gZGlhbG9nIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmOyB3ZSByZWFjdCB0byB3aGF0IGl0IHJlcG9ydHMgYmFjay5cbiAgcHVibGljIHJlcG9ydFNldHRpbmdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIHRoaXMuX2RpYWxvZy5vcGVuPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4oUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgcmVwb3J0IH0sXG4gICAgICB3aWR0aDogJzQ2MHB4JyxcbiAgICB9KVxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdkZWxldGVkJykge1xuICAgICAgICAgIHRoaXMuZGVsZXRlZC5lbWl0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ3NhdmVkJykge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBzZXR0aW5ncyDigJQgdGl0bGUsIGV4YWN0IGdlb21ldHJ5LCBhbmQgdGhlIGRpYWdub3N0aWMgdmlld3NcbiAgLy8gKFNRTCwgY29uZmlnLCBmaWx0ZXIgd2lyaW5nKS5cbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50TW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2cub3BlbjxDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgdW5rbm93biwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+KFxuICAgICAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGRhdGE6IHsgcmVwb3J0LCBjb21wb25lbnQgfSxcbiAgICAgICAgd2lkdGg6ICc2NDBweCcsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBGaWx0ZXIgYWRkL3JlbW92ZS9sZXZlbCBjaGFuZ2VzIHBlcnNpc3QgaW1tZWRpYXRlbHkgaW5zaWRlIHRoZSBkaWFsb2cgKG5vXG4gICAgLy8gXCJzYXZlXCIpIGFuZCBjYW4gbGVhdmUgaXQgYnkgYW4gZXhpdCB0aGF0IGNhcnJpZXMgbm8gcmVzdWx0LCBzbyB0aGV5IGFyZVxuICAgIC8vIGFubm91bmNlZCBhcyB0aGV5IGxhbmQuIFRoZSByZWxvYWQgd2FpdHMgZm9yIHRoZSBjbG9zZSBzbyB0aGUgY2FudmFzIGlzbid0XG4gICAgLy8gcmUtcmVuZGVyaW5nIHVuZGVybmVhdGggYW4gb3BlbiBkaWFsb2cuXG4gICAgbGV0IGZpbHRlcnNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmZpbHRlcnNDaGFuZ2VkXG4gICAgICAucGlwZSh0YWtlVW50aWwoZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiBmaWx0ZXJzQ2hhbmdlZCA9IHRydWUpO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAvLyBUaGUgZGlhbG9nIGNvbmZpcm1zICsgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGYuIFRoZSBjb21wb25lbnQgaXNcbiAgICAgICAgLy8gZ29uZSBmcm9tIHRoZSByZXBvcnQsIHNvIHJlbG9hZCByYXRoZXIgdGhhbiBwYXRjaGluZyBpdCBvdXQgbG9jYWxseSDigJRcbiAgICAgICAgLy8gaXRzIGZpbHRlcnMgd2VudCB3aXRoIGl0LCB3aGljaCB0aGUgcmVwb3J0IGJhciBoYXMgdG8gYmUgcmVidWlsdCBmb3IuXG4gICAgICAgIGlmIChyZXN1bHQ/LmRlbGV0ZWQpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzIGNoYW5nZWQsIHNvIHRoZSByZXBvcnQgYmFyIGFuZCB0aGVcbiAgICAgICAgLy8gb24tY29tcG9uZW50IHN0cmlwcyBoYXZlIHRvIGJlIHJlYnVpbHQgZnJvbSBhIGZyZXNoIHJlcG9ydC5cbiAgICAgICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RoaW5nIGVsc2UgaW4gdGhlIGRpYWxvZyB0b3VjaGVzIHRoZSBxdWVyeSDigJQgdGl0bGUgYW5kIHBhZGRpbmcgYXJlXG4gICAgICAgIC8vIHByZXNlbnRhdGlvbi4gUmVwYWludCB0aGUgb25lIGNvbXBvbmVudCBpdCB3YXMgb3BlbmVkIGZvciBhbmQgbGVhdmVcbiAgICAgICAgLy8gZXZlcnkgb3RoZXIgY29tcG9uZW50J3MgZGF0YSwgYW5kIGl0cyBxdWVyeSwgYWxvbmUuXG4gICAgICAgIGlmIChyZXN1bHQ/LnNldHRpbmdzKSB7XG4gICAgICAgICAgdGhpcy5fY2FudmFzPy5hcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudC5pZCwgcmVzdWx0LnNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIG1vdmVkIHRvIGFub3RoZXIgcGFnZTogcmVmbGVjdCBpdCBpbiB0aGUgVVJMIHNvIGEgcmVmcmVzaCBvciBhXG4gIC8vIHNoYXJlZCBsaW5rIGNvbWVzIGJhY2sgaGVyZSAodGhlIHdyaXRlIGl0c2VsZiBpcyBfd3JpdGVVcmwncykuXG4gIHB1YmxpYyBvbkNhbnZhc1BhZ2VDaGFuZ2VkKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIFRoZSBkZWVwIGxpbmsgaGFzIGJlZW4gY29uc3VtZWQ7IGZyb20gaGVyZSB0aGUgY2FudmFzIG93bnMgdGhlIHBhZ2UuXG4gICAgdGhpcy5wYWdlSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICB0aGlzLl9wYWdlUmVwb3J0ZWQgPSB0cnVlO1xuICAgIC8vIFRoZSBvcGVuIHBhZ2UgaXMgcGFydCBvZiB0aGUgc2NyZWVuIGEgdmlldyBzYXZlcy5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRQYWdlKHBhZ2VJZCk7XG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2VJZCk7XG4gICAgdGhpcy5fcGFnZVdyaXRlJC5uZXh0KCk7XG5cbiAgICAvLyBUaGUgYmFyIHNob3dzIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4uXG4gICAgaWYgKGhhc1BhZ2VHcm91cCh0aGlzLnJlcG9ydCgpKSkge1xuICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIGNoYW5nZWQgdGhlIHJlcG9ydCdzIHN0cnVjdHVyZSAoYWRkZWQgYSBwYWdlKSDigJQgcmUtZmV0Y2ggc28gdGhlXG4gIC8vIG5ldyBwYWdlIHJlbmRlcnM7IHRoZSBjYW52YXMgbGFuZHMgdGhlIHZpZXcgb24gaXQuXG4gIHB1YmxpYyBvbkNhbnZhc1JlcG9ydENoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAocmVwb3J0KSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSByZXBvcnQgdG8gUG93ZXJQb2ludCwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG5hdGl2ZSBlZGl0YWJsZVxuICAvLyBjaGFydHM7IHBhZ2UgPSBzbGlkZSkuIFRoZSBkb2NrIHNob3dzIHByb2dyZXNzIHVudGlsIHRoZSBmaWxlIHNhdmVzLlxuICBwdWJsaWMgZXhwb3J0UG93ZXJwb2ludCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBvd2VyUG9pbnQnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wb3dlcnBvaW50KHJlcG9ydCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0byBQREYsIGVudGlyZWx5IGNsaWVudC1zaWRlIChvZmZzY3JlZW4gRUNoYXJ0cyBhdCAzw5c7IHBhZ2UgPSBQREYgcGFnZSkuXG4gIHB1YmxpYyBleHBvcnRQZGYoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQREYnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wZGYocmVwb3J0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHdob2xlIHJlcG9ydCBhcyBmaWxlcyBpbiBvbmUgYWN0aW9uOiB0aGUgc2VydmVyIHdyaXRlcyBvbmUgQ1NWIHBlclxuICAvLyBjb21wb25lbnQsIGVhY2ggd2hhdCB0aGUgc2NyZWVuIHNob3dzIChhIGNoYXJ0IG9yIEtQSSBhcyBkcmF3biwgYXQgdGhlXG4gIC8vIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluOyBhIGxpc3QgaW4gZnVsbCksIGFuZCB6aXBzIHRoZW0gZm9sZGVyZWQgYnkgcGFnZVxuICAvLyB3aXRoIGFuIEV4cG9ydCBOb3Rlcy50eHQgdGhhdCByZWNvcmRzIHRoZSBmaWx0ZXJzIGFzIHRoZSBiYXIgcmVhZHMgdGhlbS5cbiAgLy8gRWFjaCBmaWxlIGNhcnJpZXMgaXRzIHRpbGUncyBvd24gc3RhdGUgKHppcEV4cG9ydFN0YXRlcyk6IGEgbGlzdCdzIHNvcnQsXG4gIC8vIHNlYXJjaCBhbmQgaGlkZGVuIGNvbHVtbnMsIGEgY2hhcnQncyBkcmlsbCBwYXRoIGFuZCB0aGUgZ3JvdXBzIHRoYXQgbWF0Y2hcbiAgLy8gJ2FueSc7IGEgc2VydmVyIHRoYXQgZG9lcyBub3QgcmVhZCBpdCB1c2VzIGVhY2ggbGlzdCdzIHNhdmVkIHNvcnQuIFRoZVxuICAvLyBub3RlcyBnZXQgdGhlIGZpbHRlciBsaW5lcyBhcyB0aGUgY292ZXIgd29yZHMgdGhlbSAoZmlsdGVyTGluZXM7IGEgVGhpc1xuICAvLyBQYWdlIHppcCBuYW1lcyBvbmx5IHRoZSBncm91cHMgdGhhdCByZWFjaCB0aGUgcGFnZSkgYW5kIHRoZSBvcGVuIHZpZXcsXG4gIC8vIHdoaWNoIHRoZSBzZXJ2ZXIgbmFtZXMuIEFsbCBvZiBpdCBpcyByZWFkIG9uY2UsIHdoZW4gdGhlIGV4cG9ydCBzdGFydHMuXG4gIC8vIGB0aGlzUGFnZWAgbmFycm93cyBpdCB0byB0aGUgcGFnZSB0aGUgY2FudmFzIGlzIHNob3dpbmcuIFVubGlrZSB0aGVcbiAgLy8gUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gc2VydmVyLXNpZGUsIHNvIHRoZXkgYXJlIG5vdFxuICAvLyBjYXBwZWQgYnkgd2hhdCBhIHNsaWRlIGNhbiBob2xkLlxuICBwdWJsaWMgZXhwb3J0RGF0YSh0aGlzUGFnZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXNQYWdlID8gdGhpcy5fY2FudmFzPy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvclJlcG9ydChyZXBvcnQsIHBhZ2VJZCk7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9jb2xsZWN0b3Iuc25hcHNob3QocmVwb3J0KTtcbiAgICBjb25zdCBzdGF0ZXMgPSB6aXBFeHBvcnRTdGF0ZXMocmVwb3J0LCBzbmFwc2hvdC52aWV3LCBwYWdlSWQpO1xuICAgIGNvbnN0IHZpZXdJZCA9IHRoaXMuX3ZpZXdzLm9wZW5WaWV3KCk/LmlkID8/IG51bGw7XG4gICAgY29uc3Qgdmlld0NoYW5nZWQgPSB0aGlzLl92aWV3cy52aWV3Q2hhbmdlZCgpO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgICdFeHBvcnRpbmcgZGF0YScsXG4gICAgICB0aGlzLl9jb2xsZWN0b3IuZmlsdGVyTGluZXMocmVwb3J0LCBzbmFwc2hvdCwgcGFnZUlkKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGxpbmVzKSA9PiB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFJlcG9ydChcbiAgICAgICAgICAgIHJlcG9ydC5pZCxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0YXRlcyxcbiAgICAgICAgICAgIHZpZXdJZCxcbiAgICAgICAgICAgIHZpZXdDaGFuZ2VkLFxuICAgICAgICAgICkpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBSZWFjdCB0byBlYWNoIGNoYXQgdHVybiAoZnMtY2hhdCBoYW5kbGVzIHRoZSByZXF1ZXN0ICsgcGVyc2lzdGVuY2UpOyB3ZVxuICAvLyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlcG9ydCBzaWRlIGVmZmVjdHMgdGhpcyBjb250ZXh0J3MgYmFja2VuZCBmbGFncy5cbiAgcHVibGljIG9uQ2hhdFJlc3BvbnNlKHJlc3BvbnNlOiBGc0FpQ2hhdFJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgaWYgKHJlcG9ydElkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRSZXNwb25zZSA9IHJlc3BvbnNlIGFzIEZzQWlDaGF0UmVzcG9uc2UgJiBSZXBvcnRDaGF0UmVzcG9uc2U7XG5cbiAgICAvLyBBIHN0cnVjdHVyYWwgY2hhbmdlIG9yIGEgcmVuYW1lIGJvdGggcmUtZmV0Y2ggdGhlIHJlcG9ydCAoc2Vzc2lvbiBmaWx0ZXJcbiAgICAvLyB2YWx1ZXMgc3Vydml2ZSk7IGEgcmVuYW1lIGFkZGl0aW9uYWxseSBub3RpZmllcyB0aGUgaG9zdCBzbyBpdCBjYW5cbiAgICAvLyByZWZyZXNoIGEgYnJlYWRjcnVtYiAvIHRpdGxlLlxuICAgIGlmIChyZXBvcnRSZXNwb25zZS5yZXBvcnRDaGFuZ2VkIHx8IHJlcG9ydFJlc3BvbnNlLnJlcG9ydFJlbmFtZWQpIHtcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsICEhcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJhZyB0aGUgZGl2aWRlciBiZXR3ZWVuIHRoZSBjaGF0IGFuZCBjYW52YXMgcGFuZXMgKHBvaW50ZXItY2FwdHVyZSBsb29wXG4gIC8vIG91dHNpZGUgQW5ndWxhcikuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVzaXppbmcnKTtcblxuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHRoaXMuX3Jlc2l6ZVRvKGUuY2xpZW50WCk7XG4gICAgICBjb25zdCBlbmQgPSAoKSA9PiB7XG4gICAgICAgIGhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIG9uIHNjcmVlbiBhcyBhIGNoYXQgdHVybiBzZW5kcyBpdC4gVGhlIGNhbnZhc1xuICAvLyBzZWxlY3Rpb24gY291bnRzIG9ubHkgaW4gZWRpdCBtb2RlOiBpdCBpcyBkcmF3biBvbmx5IHRoZW4sIGFuZCBpdCBpcyBrZXB0XG4gIC8vIChub3QgY2xlYXJlZCkgd2hlbiBlZGl0IG1vZGUgaXMgbGVmdC4gVGhlIG1hdGNoIGlzIHNlbnQgb25seSB3aGlsZSBpdCBpc1xuICAvLyAnYW55JywgdGhlIGRyaWxsZWQgY2hhcnRzIG9ubHkgd2hlbiBvbmUgaXMgZHJpbGxlZCwgYW5kIHRoZSBvcGVuIHZpZXdcbiAgLy8gKGFuZCB3aGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIGl0KSBvbmx5IHdoaWxlIG9uZSBpcyBvcGVuLlxuICBwcml2YXRlIF9jaGF0Vmlld2VyU3RhdGUoKTogUmVwb3J0Q2hhdFZpZXdlclN0YXRlIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCk7XG4gICAgY29uc3QgZHJpbGxzID0gY2hhdFZpZXdlckRyaWxscyhzbmFwc2hvdCwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnVsYXJpdHk6IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpLFxuICAgICAgc2VsZWN0ZWRDb21wb25lbnRJZDogdGhpcy5lZGl0TW9kZSgpID8gdGhpcy5fY2FudmFzPy5zZWxlY3RlZENvbXBvbmVudElkKCkgPz8gbnVsbCA6IG51bGwsXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3ZXJGaWx0ZXJzKCksXG4gICAgICAuLi5jaGF0Vmlld2VyTWF0Y2goc25hcHNob3QpLFxuICAgICAgLi4uKGRyaWxscy5sZW5ndGggPyB7IGRyaWxscyB9IDoge30pLFxuICAgICAgLi4uY2hhdFZpZXdGaWVsZHModGhpcy5fdmlld3Mub3BlblZpZXcoKSwgdGhpcy5fdmlld3Mudmlld0NoYW5nZWQoKSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2UgaWQgc2l0dGluZyBpbiB0aGUgVVJMIHJpZ2h0IG5vdywgb3IgbnVsbCB3aGVuIGRlZXAgbGlua2luZyBpcyBvZmZcbiAgLy8gb3IgdGhlIHZhbHVlIGlzIG5vdCBhIHVzYWJsZSBpZC5cbiAgcHJpdmF0ZSBfcGFnZUlkRnJvbVVybCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAoIXBhcmFtKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBOdW1iZXIodGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQocGFyYW0pKTtcblxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFnZUlkKSAmJiBwYWdlSWQgPiAwID8gcGFnZUlkIDogbnVsbDtcbiAgfVxuXG4gIC8vIFdyaXRlcyB0aGUgb3BlbiBwYWdlIGFuZCB0aGUgdmlld2VyIHN0YXRlIGludG8gdGhlIFVSTCBpbiBvbmUgZ28uIE9ubHlcbiAgLy8gdGhlIGtleXMgdGhpcyB2aWV3IG93bnMgYXJlIHRvdWNoZWQgKCdtZXJnZScpLCBhbmQgcmVwbGFjZVVybCBrZWVwcyB0aGVcbiAgLy8gd3JpdGVzIG91dCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5OiBCYWNrIGxlYXZlcyB0aGUgcmVwb3J0IHJhdGhlciB0aGFuXG4gIC8vIHdhbGtpbmcgZXZlcnkgcGFnZSBhbmQgZmlsdGVyIHZpc2l0ZWQuXG4gIHByaXZhdGUgX3dyaXRlVXJsKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICAvLyBBIHJlcG9ydCBzdGlsbCBvbiBzY3JlZW4gd2hpbGUgdGhlIGhvc3QncyBuZXh0IG9uZSBsb2FkcyBtdXN0IG5vdCB3cml0ZVxuICAgIC8vIGl0cyBzdGF0ZSBvdmVyIHRoZSBuZXcgcmVwb3J0J3MgVVJMLlxuICAgIGlmICghcmVwb3J0IHx8IHJlcG9ydC5pZCAhPT0gdGhpcy5yZXBvcnRJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IFBhcmFtcyA9IHRoaXMudXJsU3RhdGUoKVxuICAgICAgPyB0aGlzLl91cmxQYXJhbXMocmVwb3J0KVxuICAgICAgOiB7fTtcblxuICAgIGNvbnN0IHBhZ2VQYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAocGFnZVBhcmFtICYmIHRoaXMuX3BhZ2VSZXBvcnRlZCkge1xuICAgICAgcXVlcnlQYXJhbXNbcGFnZVBhcmFtXSA9IHRoaXMuY2hhdFBhZ2VJZCgpO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUsXG4gICAgICBxdWVyeVBhcmFtcyxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXBvcnQ6IFJlcG9ydCkgPT4gdGhpcy5fb3BlblJlcG9ydChyZXBvcnQpLnBpcGUobWFwKCgpID0+IHJlcG9ydCkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX29wZW5BcHBsaWVkUGFnZSgpO1xuICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuXG4gICAgICAgIGlmIChlbWl0UmVuYW1lZCkge1xuICAgICAgICAgIHRoaXMucmVuYW1lZC5lbWl0KHJlcG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gU2V0cyB0aGUgdmlld2VyIHN0YXRlIHVwIGZvciBhIGxvYWRlZCByZXBvcnQuIFRoZSBVUkwgaXMgcmVhZCBvbmNlIHBlclxuICAvLyByZXBvcnQsIG9uIGl0cyBmaXJzdCBsb2FkOyBldmVyeSBsYXRlciBsb2FkIGtlZXBzIHRoZSBzdGF0ZSBpbiBtZW1vcnkuXG4gIC8vIEEgc2VydmVyIHRoYXQga2VlcHMgc2F2ZWQgdmlld3Mgb3BlbnMgdGhlIHJlcG9ydCBpbiB0aGUgdmlldyBzZXJ2aWNlJ3NcbiAgLy8gb3JkZXIgKGEgbGluaywgZWxzZSB0aGUgdmlld2VyJ3MgZGVmYXVsdCB2aWV3LCBlbHNlIHRoZSBkZWZhdWx0cyksIHdoaWNoXG4gIC8vIG1heSB3YWl0IGZvciB0aGF0IHZpZXc7IGFueSBvdGhlciByZWFkcyB0aGUgVVJMIGFzIGl0IGFsd2F5cyBkaWQuXG4gIHByaXZhdGUgX29wZW5SZXBvcnQocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdExvYWQgPSByZXBvcnQuaWQgIT09IHRoaXMuX3Jlc3RvcmVkUmVwb3J0SWQ7XG4gICAgdGhpcy5fcmVzdG9yZWRSZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIGlmICghdGhpcy5fdmlld3Muc2VydmVzKHJlcG9ydCkpIHtcbiAgICAgIGNvbnN0IHJlc3RvcmUgPSB0aGlzLnVybFN0YXRlKCkgJiYgZmlyc3RMb2FkXG4gICAgICAgID8gcmVhZFJlcG9ydFVybFBhcmFtcyh0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLCByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKVxuICAgICAgICA6IG51bGw7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5pbml0KHJlcG9ydCwgcmVzdG9yZSk7XG5cbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGlmICghZmlyc3RMb2FkKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5pbml0KHJlcG9ydCk7XG4gICAgICB0aGlzLl92aWV3cy5yZWZyZXNoKHJlcG9ydCk7XG5cbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92aWV3cy5vcGVuKHJlcG9ydCwgdGhpcy51cmxTdGF0ZSgpID8gdGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgOiB7fSwgdGhpcy5wYWdlSWQoKSk7XG4gIH1cblxuICAvLyBUaGUgcXVlcnkgcGFyYW1zIG9mIHRoZSBzY3JlZW46IHRocm91Z2ggdGhlIHZpZXcgc2VydmljZSBmb3IgYSBzZXJ2ZXJcbiAgLy8gdGhhdCBrZWVwcyBzYXZlZCB2aWV3cywgZWxzZSB0aGUgbGluayB0aGlzIHZpZXdlciBhbHdheXMgd3JvdGUuXG4gIHByaXZhdGUgX3VybFBhcmFtcyhyZXBvcnQ6IFJlcG9ydCk6IFBhcmFtcyB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXA7XG4gICAgLy8gQSBzZWxlY3QncyBwaWNrcyBhcmUgd3JpdHRlbiBhcyB2YWx1ZTpuYW1lLCB3aXRoIHRoZSBuYW1lcyB0aGUgYmFyc1xuICAgIC8vIGhhdmUgcmVhZC5cbiAgICBjb25zdCBuYW1lID0gKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IHVua25vd24pID0+IHRoaXMuX2ZpbHRlck9wdGlvbnMubGFiZWwoZ3JvdXBJZCwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdzLnNlcnZlcyhyZXBvcnQpXG4gICAgICA/IHRoaXMuX3ZpZXdzLnVybFBhcmFtcyhjdXJyZW50LCBuYW1lKVxuICAgICAgOiBidWlsZFJlcG9ydFVybFBhcmFtcyh0aGlzLl9maWx0ZXJTdGF0ZS51cmxTbmFwc2hvdChyZXBvcnQpLCBjdXJyZW50LCByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdLCBuYW1lKTtcbiAgfVxuXG4gIC8vIE1vdmVzIHRoZSBjYW52YXMgdG8gdGhlIHBhZ2UgYW4gb3BlbmVkIHZpZXcgcHV0IG9uIHNjcmVlbiAoYSBwYWdlIGluIGFcbiAgLy8gbGluayBhbHJlYWR5IHdvbiBpbnNpZGUgYXBwbHkoKSkuIEEgcmVzZXQsIG9yIGEgcmVsb2FkLCBsZWF2ZXMgdGhlIHBhZ2UuXG4gIHByaXZhdGUgX29wZW5BcHBsaWVkUGFnZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwYWdlSWQgPSB0aGlzLl9maWx0ZXJTdGF0ZS5wYWdlKCk7XG5cbiAgICBpZiAocGFnZUlkICYmIHBhZ2VJZCAhPT0gdGhpcy5jaGF0UGFnZUlkKCkpIHtcbiAgICAgIHRoaXMucGFnZUlkLnNldChwYWdlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyIOKAlCB0aGUgb25lcyB0aGF0IHJlbmRlciBpblxuICAvLyB0aGUgdG9vbGJhciAoY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgb24gdGhlaXIgY29tcG9uZW50cyksIHdpdGhcbiAgLy8gdGhlIHBhZ2UgZ3JvdXBzIG9mIHRoZSBwYWdlIG9uIHNjcmVlbi5cbiAgcHJpdmF0ZSBfcmVwb3J0R3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIHJldHVybiByZXBvcnRCYXJHcm91cHModGhpcy5yZXBvcnQoKSwgdGhpcy5jaGF0UGFnZUlkKCkpO1xuICB9XG5cbiAgLy8gKFJlKWJ1aWxkIHRoZSB0b29sYmFyIGZzLWZpbHRlciBjb25maWcg4oCUIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIGl0ZW1zIGFuZFxuICAvLyB0aGVuIHRoZSBncm91cC1ieSBjb250cm9sLlxuICBwcml2YXRlIF9idWlsZFJlcG9ydENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGNvbnN0IHJlcG9ydElkID0gcmVwb3J0Py5pZCA/PyBudWxsO1xuXG4gICAgLy8gRHJvcCBhIGdyYWluIHRoZSBjb250cm9sIG5vIGxvbmdlciBvZmZlcnMg4oCUIHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0XG4gICAgLy8gbWlkLXNlc3Npb24sIGFuZCBhbiBvdmVycmlkZSB0aGUgdmlld2VyIGNhbid0IHNlZSBpcyB3b3JzZSB0aGFuIG5vbmUuXG4gICAgaWYgKHJlcG9ydCAmJiAhaXNHcmFudWxhcml0eU9mZmVyZWQocmVwb3J0LCB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeShudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcG9ydD8udmlld2VyRmVhdHVyZXMgPz8gW107XG4gICAgY29uc3QgaXRlbXMgPSByZXBvcnRJZFxuICAgICAgPyB0aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PlxuICAgICAgICBmaWx0ZXJJdGVtRm9yR3JvdXAoZ3JvdXAsIHRoaXMuX2ZpbHRlck9wdGlvbnMsIHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpLCBmZWF0dXJlcykpXG4gICAgICA6IFtdO1xuXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wgbGVhZHMgdGhlIGJhciwgYWhlYWQgb2YgZXZlcnkgZmlsdGVyOiBpdCBzZXRzIHRoZVxuICAgIC8vIGdyYWluIHRoZSB3aG9sZSByZXBvcnQgaXMgcmVhZCBhdCwgc28gaXQgaXMgdGhlIGZpcnN0IHRoaW5nIGEgdmlld2VyXG4gICAgLy8gZGVjaWRlcy4gSXQgaXMgbm90IGEgZmlsdGVyIGdyb3VwIOKAlCBpdCByZS1idWNrZXRzIHJvd3MgcmF0aGVyIHRoYW5cbiAgICAvLyBuYXJyb3dpbmcgdGhlbSDigJQgc28gaXQgaXMgcGxhY2VkIGhlcmUgcmF0aGVyIHRoYW4gb3JkZXJlZCBhbW9uZyB0aGVtLlxuICAgIGNvbnN0IGdyb3VwQnlJdGVtID0gdGhpcy5fZ3JvdXBCeUl0ZW0oKTtcbiAgICBpZiAoZ3JvdXBCeUl0ZW0pIHtcbiAgICAgIGl0ZW1zLnVuc2hpZnQoZ3JvdXBCeUl0ZW0pO1xuICAgIH1cblxuICAgIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUgY2xvc2VzIHRoZSBiYXIuXG4gICAgY29uc3QgbWF0Y2hJdGVtID0gdGhpcy5fbWF0Y2hJdGVtKCk7XG4gICAgaWYgKG1hdGNoSXRlbSkge1xuICAgICAgaXRlbXMucHVzaChtYXRjaEl0ZW0pO1xuICAgIH1cblxuICAgIHRoaXMuX2JhclZlcnNpb24uc2V0KHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKTtcbiAgICB0aGlzLnJlcG9ydEZpbHRlckNvbmZpZy5zZXQoe1xuICAgICAgLy8gZnMtZmlsdGVyIG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBmaWx0ZXIgc3RhdGU6IGl0cyBrZXlzIGFyZVxuICAgICAgLy8gbm90IG5hbWVzcGFjZWQsIGl0IHdyaXRlcyBvdXRzaWRlIHRoZSByb3V0ZXIsIGFuZCBpdCB3b3VsZCBmcmVlemUgYVxuICAgICAgLy8gcm9sbGluZyByYW5nZSBhcyB0d28gZGF0ZXMuIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSBvd25zIHRoZSB2YWx1ZXMsXG4gICAgICAvLyBhbmQgX3dyaXRlVXJsIGlzIHRoZSBvbmUgd3JpdGVyIG9mIHRoZSBVUkwuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgaXRlbXMsXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4gdGhpcy5fYmFyQ2hhbmdlZChxdWVyeSA/PyB7fSwgISFtYXRjaEl0ZW0pLFxuICAgICAgLy8gJ0NsZWFyIGZpbHRlcnMnIHB1dHMgdGhlIHNjcmVlbiBiYWNrIG9uIHRoZSBvcGVuIHZpZXcsIGVsc2Ugb24gdGhlXG4gICAgICAvLyByZXBvcnQncyBkZWZhdWx0cywgYW5kIGRyb3BzIHRoZSB0ZW1wb3JhcnkgbGF5ZXIuIGZzLWZpbHRlciByZXBvcnRzXG4gICAgICAvLyBpdHMgb3duIGNsZWFyZWQgaXRlbXMgKGNoYW5nZSkganVzdCBiZWZvcmUgdGhpcywgc28gdGhlIHJlc2V0IHdpbnMuXG4gICAgICAvLyBBIHNlcnZlciB3aXRob3V0IHNhdmVkIHZpZXdzIGtlZXBzIHRoZSBjbGVhciBpdCBhbHdheXMgaGFkOiB0aGVcbiAgICAgIC8vIGJhcidzIGl0ZW1zIG9ubHkuXG4gICAgICBjbGVhcjogdGhpcy5fdmlld3Muc2VydmVzKHJlcG9ydCkgPyAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNldFRvQmFzZSgpIDogdW5kZWZpbmVkLFxuICAgICAgLy8gVGhlIGNoaXAgc2hvd3MgZXhhY3RseSB3aGlsZSB0aGUgc2NyZWVuIGRpZmZlcnMgZnJvbSB3aGF0IGEgY2xlYXJcbiAgICAgIC8vIHJldHVybnMgdG8gKEM1KTogcmlnaHQgYWZ0ZXIgYSBzYXZlIGl0IGhpZGVzLCBhbmQgb25jZSB0aGUgb3BlbiB2aWV3XG4gICAgICAvLyBpcyBkZWxldGVkIGl0IHNob3dzIGZvciB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gICAgICBjbGVhclZpc2libGU6IHRoaXMuX3ZpZXdzLnNlcnZlcyhyZXBvcnQpID8gKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUudmlld0NoYW5nZWQoKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBiYXIncyB2YWx1ZXMgaW50byB0aGUgc3RhdGU6IGV2ZXJ5IGdyb3VwIGl0IHNob3dzLCB0aGUgZ3JhaW4gYW5kLFxuICAvLyB3aGVuIHRoZSBiYXIgaGFzIHRoZSBjb250cm9sLCB0aGUgbWF0Y2guXG4gIHByaXZhdGUgX2JhckNoYW5nZWQocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoYXNNYXRjaDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBncm91cElkLCB2YWx1ZSB9IG9mIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5LCB0aGlzLl9yZXBvcnRHcm91cHMoKSwgdGhpcy5yZXBvcnQoKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gTm90IGEgZmlsdGVyIGdyb3VwIOKAlCB0aGUgZ3JhaW4gaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIHF1ZXJ5LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeSgocXVlcnlbR1JPVVBfQllfSVRFTV0gYXMgQ2hhcnRHcmFudWxhcml0eSkgfHwgbnVsbCk7XG4gICAgLy8gTm9yIGlzIHRoZSBtYXRjaDsgYSBiYXIgd2l0aG91dCB0aGUgY29udHJvbCBsZWF2ZXMgaXQgYXMgaXQgaXMuXG4gICAgaWYgKGhhc01hdGNoKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRNYXRjaChtYXRjaEZyb21RdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIGFzIGFuIGZzLWZpbHRlciBpdGVtLCBvciBudWxsIHdoZW4gdGhlIHJlcG9ydFxuICAvLyBoYXMgbm9uZSB0byBzaG93LiBTZWVkZWQgZnJvbSB0aGUgc2Vzc2lvbiBzdGF0ZSBzbyB0aGUgZ3JhaW4gdGhlIHZpZXdlclxuICAvLyBwaWNrZWQgc3Vydml2ZXMgdGhlIHJlcG9ydCBiZWluZyByZS1mZXRjaGVkIGFmdGVyIGEgY2hhdCBlZGl0LlxuICBwcml2YXRlIF9ncm91cEJ5SXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICByZXR1cm4gcmVwb3J0XG4gICAgICA/IGdyb3VwQnlGaWx0ZXJJdGVtKHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgTWF0Y2ggY29udHJvbCwgc2VlZGVkIHdpdGggdGhlIG1hdGNoIG9uIHNjcmVlbiwgb3IgbnVsbCB3aGVuXG4gIC8vIHRoZSBiYXIgaG9sZHMgZmV3ZXIgdGhhbiB0d28gZ3JvdXBzIHRoYXQgY29tYmluZS5cbiAgcHJpdmF0ZSBfbWF0Y2hJdGVtKCk6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG1hdGNoRmlsdGVySXRlbSh0aGlzLnJlcG9ydCgpLCB0aGlzLl9yZXBvcnRHcm91cHMoKSwgdGhpcy5jaGF0UGFnZUlkKCksIHRoaXMuX2ZpbHRlclN0YXRlLm1hdGNoKCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0IGZzLWNvbHVtblwiPlxuXG4gIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2hlYWRlciBmcy1yb3cuYWxpZ24tY2VudGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aXRsZSBmcy1mbGV4XCI+e3sgcmVwb3J0KCk/Lm5hbWUgfX08L2gyPlxuXG4gICAgPCEtLSBUaGUgc2F2ZWQgdmlld3M6IHNob3duIG9ubHkgd2hlbiB0aGUgc2VydmVyIGtlZXBzIHRoZW0uIC0tPlxuICAgIEBpZiAodmlld3NTZXJ2ZWQoKSkge1xuICAgICAgPGFwcC1yZXBvcnQtdmlldy1waWNrZXI+PC9hcHAtcmVwb3J0LXZpZXctcGlja2VyPlxuICAgIH1cblxuICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgIDwhLS0gUmVwb3J0LWxldmVsIGZpbHRlcnMsIGlubGluZSB3aXRoIHRoZSB0b29sYmFyIGFjdGlvbnMuIGZzLWZpbHRlclxuICAgICAgICAgICByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCwgc28gaXQncyBrZXllZCBvbiB0aGUgZmlsdGVyXG4gICAgICAgICAgIHNpZ25hdHVyZTogd2hlbiB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXQgY2hhbmdlcyB0aGUgYmxvY2sgaXNcbiAgICAgICAgICAgcmVjcmVhdGVkIGFuZCByZS1yZWFkcyB0aGUgcmVidWlsdCBjb25maWcuIC0tPlxuICAgICAgQGlmIChyZXBvcnRIYXNGaWx0ZXJzKCkpIHtcbiAgICAgICAgQGZvciAoa2V5IG9mIFtyZXBvcnRGaWx0ZXJLZXkoKV07IHRyYWNrIGtleSkge1xuICAgICAgICAgIDxmcy1maWx0ZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2ZpbHRlcnNcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInJlcG9ydEZpbHRlckNvbmZpZygpXCI+XG4gICAgICAgICAgPC9mcy1maWx0ZXI+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSBXaGF0IGxheW91dCBlZGl0aW5nIGNhbiBhZGQgb3Igc3dpdGNoIHRvLCBhbmQgdGhlIHdheSBvdXQgb2YgaXQuXG4gICAgICAgICAgIE9uZSBzdHlsZSBmb3IgYWxsIHRocmVlIOKAlCBvdXRsaW5lZCwgaWNvbiBhbmQgdGV4dC4gXCJIZWFkZXIgJiBmb290ZXJcIlxuICAgICAgICAgICBpcyBhIHRvZ2dsZTogaXQga2VlcHMgaXRzIGxhYmVsIGFuZCB0dXJucyBncmF5IHdoaWxlIGl0IGlzIG9uLiAtLT5cbiAgICAgIEBpZiAoZWRpdE1vZGUoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0X19lZGl0LXRvb2xzIGZzLXJvdy5hbGlnbi1jZW50ZXIuZ2FwLXhzXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgYSBibG9jayBvZiB0ZXh0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRleHQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnRpdGxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIEFkZCB0ZXh0XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19tYXN0ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzTWFzdGVyTW9kZVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImlzTWFzdGVyTW9kZSA/ICdCYWNrIHRvIGVkaXRpbmcgdGhpcyBwYWdlJyA6ICdFZGl0IHRoZSBoZWFkZXIgYW5kIGZvb3RlciBzaG93biBvbiBldmVyeSBwYWdlJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNYXN0ZXJNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgSGVhZGVyICYgZm9vdGVyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgRG9uZSBlZGl0aW5nXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIE9uZSBpY29uIGZvciBib3RoIHN0YXRlczogaXQgcmVhZHMgYXMgcHJlc3NlZCB3aGlsZSBlZGl0aW5nIHJhdGhlclxuICAgICAgICAgICB0aGFuIHN3YXBwaW5nIHRvIHNvbWV0aGluZyBlbHNlLiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fdG9nZ2xlXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImVkaXRNb2RlKClcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cImVkaXRNb2RlKCkgPyAnRG9uZSBlZGl0aW5nJyA6ICdFZGl0IGxheW91dCdcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5kYXNoYm9hcmRfY3VzdG9taXplPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIkV4cG9ydFwiXG4gICAgICAgICAgW2ZzTWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0TWVudVwiPlxuICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZnMtbWVudSAjZXhwb3J0TWVudT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQb3dlcnBvaW50KClcIj5cbiAgICAgICAgICBFeHBvcnQgUG93ZXJQb2ludFxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBkZigpXCI+XG4gICAgICAgICAgRXhwb3J0IFBERlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEoKVwiPlxuICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICBAaWYgKChyZXBvcnQoKT8ucGFnZXM/Lmxlbmd0aCA/PyAwKSA+IDEpIHtcbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKHRydWUpXCI+XG4gICAgICAgICAgICBFeHBvcnQgUmF3IERhdGEgKFRoaXMgUGFnZSlcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICA8L2ZzLW1lbnU+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiUmVwb3J0IHNldHRpbmdzXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVwb3J0U2V0dGluZ3MoKVwiPlxuICAgICAgICA8bWF0LWljb24+c2V0dGluZ3M8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgICAjc3BsaXRcbiAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19zcGxpdCBmcy1yb3cuYWxpZ24tc3RhcnRcIj5cbiAgICA8ZnMtYWktY2hhdFxuICAgICAgICAjY2hhdFBhbmVsXG4gICAgICAgIGNsYXNzPVwiY2hhdFwiXG4gICAgICAgIFtiYXNlUGF0aF09XCJiYXNlUGF0aCgpXCJcbiAgICAgICAgW3JlcXVlc3REYXRhXT1cImNoYXRSZXF1ZXN0RGF0YSgpXCJcbiAgICAgICAgW3JlYWR5XT1cImNoYXRQYWdlSWQoKSAhPT0gbnVsbFwiXG4gICAgICAgIChyZXNwb25zZSk9XCJvbkNoYXRSZXNwb25zZSgkZXZlbnQpXCI+XG4gICAgPC9mcy1haS1jaGF0PlxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInJlc2l6ZXJcIlxuICAgICAgICAocG9pbnRlcmRvd24pPVwib25SZXNpemVTdGFydCgkZXZlbnQpXCI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidmlld2VyIGZzLWZsZXggZnMtY29sdW1uXCI+XG4gICAgICBAaWYgKHJlcG9ydCgpKSB7XG4gICAgICAgIDxhcHAtcmVwb3J0LWNhbnZhc1xuICAgICAgICAgICAgW3JlcG9ydF09XCJyZXBvcnQoKVwiXG4gICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgICAgICBbcGFnZUlkXT1cInBhZ2VJZCgpXCJcbiAgICAgICAgICAgIChjb21wb25lbnRTZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncygkZXZlbnQpXCJcbiAgICAgICAgICAgIChyZXBvcnRDaGFuZ2VkKT1cIm9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlZCk9XCJvbkNhbnZhc1BhZ2VDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgPC9hcHAtcmVwb3J0LWNhbnZhcz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
624
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQWdCLGNBQWMsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FB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QkFDMUIsV0FDUTt3QkFDUCxjQUFjO3dCQUNkLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLHlCQUF5QjtxQkFDMUI7d0RBMEdPLE1BQU07c0JBRGIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk1QixVQUFVO3NCQURqQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFNbEQsT0FBTztzQkFEZCxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIE5nWm9uZSwgVmlld0NoaWxkLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIElGaWx0ZXJDb25maWdJdGVtIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcbmltcG9ydCB7IEZzTWVudU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lbnUnO1xuaW1wb3J0IHsgRnNQcm9jZXNzIH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBwcm92aWRlRWNoYXJ0c0NvcmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IEZzQWlDaGF0Q29tcG9uZW50LCBGc0FpQ2hhdERhdGEsIEZzQWlDaGF0UmVzcG9uc2UgfSBmcm9tICdAZmlyZXN0aXRjaC9haSc7XG5cbmltcG9ydCB7IFJlcG9ydENhbnZhc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3UGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9yZXBvcnQtdmlldy1waWNrZXIvcmVwb3J0LXZpZXctcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRBaUNoYXREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQtYWktY2hhdC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc0RpYWxvZ0RhdGEsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlclN0YXRlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksIFJlcG9ydCwgUmVwb3J0Q2hhdFJlc3BvbnNlLFxuICBSZXBvcnRDb21wb25lbnQgYXMgUmVwb3J0Q29tcG9uZW50TW9kZWwsIFJlcG9ydEZpbHRlckdyb3VwLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2hhdFZpZXdlckRyaWxscywgY2hhdFZpZXdlck1hdGNoIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWNoYXQtdmlld2VyLXN0YXRlJztcbmltcG9ydCB7IHByb3ZpZGVSZXBvcnREYXRlUGlja2VyIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWRhdGUtcHJlc2V0cyc7XG5pbXBvcnQge1xuICBHUk9VUF9CWV9JVEVNLCBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwQnlGaWx0ZXJJdGVtLCBncm91cEJ5U2lnbmF0dXJlLCBncm91cFZhbHVlc0Zyb21RdWVyeSxcbiAgaGFzUGFnZUdyb3VwLCBpc0dyYW51bGFyaXR5T2ZmZXJlZCwgbWF0Y2hGaWx0ZXJJdGVtLCBtYXRjaEZyb21RdWVyeSwgcmVwb3J0QmFyR3JvdXBzLFxufSBmcm9tICcuLi8uLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGNoYXRWaWV3RmllbGRzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LXZpZXctY29uZmlnJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLCBkZWZhdWx0U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LXZpZXcuc2VydmljZSc7XG5pbXBvcnQgeyB6aXBFeHBvcnRTdGF0ZXMgfSBmcm9tICcuLi8uLi90aWxlLWRhdGEtc3RhdGUnO1xuXG5cbi8vIEEgc2luZ2xlIHJlcG9ydDogdGhlIEFJIGNoYXQgb24gdGhlIGxlZnQsIHRoZSByZXBvcnQgY2FudmFzIG9uIHRoZSByaWdodCxcbi8vIHVuZGVyIGFuIEgyIHRpdGxlICsgc2V0dGluZ3MgZ2Vhci4gVGhlIGhvc3Qgc3VwcGxpZXMgW3JlcG9ydElkXSAoZnJvbSBpdHNcbi8vIHJvdXRlKSBhbmQgc3dpdGNoZXMgcmVwb3J0cyB0aHJvdWdoIGl0cyBvd24gcm91dGVzIOKAlCB0aGlzIGNvbXBvbmVudCBuZXZlclxuLy8gcGlja3Mgb25lLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBTZXNzaW9uIGZpbHRlciBzdGF0ZSBpcyBwZXItb3Blbi1yZXBvcnQsIG5vdCBhcHAtZ2xvYmFsOyB0aGUgZXhwb3J0XG4gICAgLy8gc2VydmljZXMgcmVzb2x2ZSBmaWx0ZXJzIHRocm91Z2ggaXQsIHNvIHRoZXkgbGl2ZSBhdCB0aGUgc2FtZSBsZXZlbC5cbiAgICBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsXG4gICAgLy8gVGhlIGJhcnMnIHNlbGVjdCBsaXN0cywgbmFycm93ZWQgYnkgdGhlIG90aGVyIGZpbHRlcnM7IHBlciBvcGVuIHJlcG9ydC5cbiAgICBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgICAvLyBUaGUgcmVwb3J0J3Mgc2F2ZWQgdmlld3MgYW5kIHRoZSBvcmRlciBpdCBvcGVucyBpbjsgcGVyIG9wZW4gcmVwb3J0LlxuICAgIFJlcG9ydFZpZXdTZXJ2aWNlLFxuICAgIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UsXG4gICAgUmVwb3J0UHB0eFNlcnZpY2UsXG4gICAgUmVwb3J0UGRmU2VydmljZSxcbiAgICBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRTZXJ2aWNlLFxuICAgIC8vIGZzLWFpLWNoYXQgc2l0cyBpbiB0aGlzIHRlbXBsYXRlLCBzbyBpdCByZXNvbHZlcyBpdHMgZ2F0ZXdheSBoZXJlOiB0aGVcbiAgICAvLyByZXBvcnQgb25lLCB3aGljaCBhZGRzIHRoZSB2aWV3ZXIncyBzdGF0ZSB0byBlYWNoIHR1cm4gaXQgc2VuZHMuXG4gICAgUmVwb3J0QWlDaGF0RGF0YSxcbiAgICB7IHByb3ZpZGU6IEZzQWlDaGF0RGF0YSwgdXNlRXhpc3Rpbmc6IFJlcG9ydEFpQ2hhdERhdGEgfSxcbiAgICAvLyBUcmVlLXNoYWtlbiBFQ2hhcnRzIGNvcmUgKyB0aGUgJ3JlcG9ydCcgaG91c2UgdGhlbWUsIGxvYWRlZCBsYXppbHkuXG4gICAgcHJvdmlkZUVjaGFydHNDb3JlKHsgZWNoYXJ0czogKCkgPT4gaW1wb3J0KCcuLi8uLi90aGVtZS9lY2hhcnRzJykudGhlbigobW9kdWxlKSA9PiBtb2R1bGUuZGVmYXVsdCkgfSksXG4gICAgLy8gVGhlIGJhcidzIGRhdGUgcGlja2VycyBzdGFydCB0aGVpciB3ZWVrcyBvbiBNb25kYXkgYW5kIGxpc3QgdGhlIGJ1aWx0LWluXG4gICAgLy8gcHJlc2V0czsgYSBwcmVzZXQgb25seSBzZXRzIHRoZSBkYXlzLlxuICAgIHByb3ZpZGVSZXBvcnREYXRlUGlja2VyKCksXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBGc0ZpbHRlck1vZHVsZSxcbiAgICBGc01lbnVNb2R1bGUsXG4gICAgRnNBaUNoYXRDb21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBSZXBvcnRDYW52YXNDb21wb25lbnQsXG4gICAgUmVwb3J0Vmlld1BpY2tlckNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNBaVJlcG9ydENvbXBvbmVudCB7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGlzIHZpZXcgaXMgZm9jdXNlZCBvbiDigJQgc3VwcGxpZWQgYnkgdGhlIGhvc3QgZnJvbSB0aGUgcm91dGUuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEFQSSBiYXNlIGZvciB0aGUgcmVwb3J0cyArIGNoYXQgZW5kcG9pbnRzOyBvdmVycmlkZSB0byBtb3VudCBlbHNld2hlcmUuXG4gIHB1YmxpYyByZWFkb25seSBiYXNlUGF0aCA9IGlucHV0PHN0cmluZz4oJ3JlcG9ydHMnKTtcblxuICAvLyBUaGUgcXVlcnkgcGFyYW0gYSByZXBvcnQgcmVhZHMgaXRzIG9wZW5pbmcgcGFnZSBmcm9tIChhIGxpbmsgaW4gYSB0aWNrZXRcbiAgLy8gY2FuIG5hbWUgYSBwYWdlOiA/cGFnZT03KS4gSXQgaXMgcmVhZCBvbmNlLCB3aGVuIGEgcmVwb3J0IG9wZW5zLCBhbmRcbiAgLy8gbmV2ZXIgd3JpdHRlbjogYSByZXBvcnQga2VlcHMgbm8gc3RhdGUgaW4gdGhlIGJyb3dzZXIgVVJMLiBJdHMgZmlsdGVycyxcbiAgLy8gdGhlIHBhZ2Ugb24gc2NyZWVuIGFuZCB0aGUgcmVzdCBsaXZlIGluIHRoZSByZXBvcnQncyBzdGF0ZVxuICAvLyAoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKSwgc28gYSByZWxvYWQgb3BlbnMgdGhlIHJlcG9ydCBvbiBpdHMgZGVmYXVsdHMsXG4gIC8vIG9yIG9uIHRoZSB2aWV3ZXIncyBkZWZhdWx0IHZpZXcuIEEgaG9zdCB0aGF0IHdhbnRzIG5vIHBhZ2UgcmVhZCBzZXRzIHRoaXNcbiAgLy8gdG8gbnVsbC5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VRdWVyeVBhcmFtID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4oJ3BhZ2UnKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyBkZWxldGVkIGZyb20gaXRzIHNldHRpbmdzIGRpYWxvZyDigJQgdGhlIGhvc3Qgcm91dGVzIGJhY2sgdG9cbiAgLy8gdGhlIGxpc3RpbmcuXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyByZW5hbWVkIChzZXR0aW5ncywgb3IgdGhlIGFnZW50KSDigJQgdGhlIGhvc3QgY2FuIHJlZnJlc2ggYVxuICAvLyBicmVhZGNydW1iIC8gZG9jdW1lbnQgdGl0bGUuXG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVkID0gb3V0cHV0PFJlcG9ydD4oKTtcblxuICAvLyBUaGUgdmlld2VyIG1vdmVkIHRvIGFub3RoZXIgcGFnZSDigJQgZm9yIGhvc3RzIHRoYXQgdHJhY2sgdGhlIG9wZW4gcGFnZSBmb3JcbiAgLy8gdGhlaXIgb3duIHJlYXNvbnMuIE5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgVVJMLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZUNoYW5nZWQgPSBvdXRwdXQ8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdE1vZGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSBwYWdlIHRoZSBjYW52YXMgc2hvdWxkIG9wZW4gb246IHRoZSA/cGFnZT0gdGhlIHJlcG9ydCBvcGVuZWQgd2l0aFxuICAvLyAocmVhZCBvbmNlIHBlciByZXBvcnQpLCBvciBhbiBvcGVuZWQgdmlldydzIHBhZ2UuIENsZWFyZWQgYXMgc29vbiBhcyB0aGVcbiAgLy8gY2FudmFzIHJlcG9ydHMgYmFjaywgc28gYSBsYXRlciBpbi1hcHAgcGFnZSBjaGFuZ2UgaXMgbmV2ZXIgZm91Z2h0IGJ5IGFcbiAgLy8gc3RhbGUgdmFsdWUuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGNoYXQgaXMgYm91bmQgdG86IHRoZSBvbmUgb24gc2NyZWVuLiBBIHJlcG9ydCBjb252ZXJzYXRpb25cbiAgLy8gYmVsb25ncyB0byBleGFjdGx5IG9uZSBwYWdlLCBzbyB0aGlzIGJvdGggc2NvcGVzIHRoZSBjb252ZXJzYXRpb24gbGlzdCBhbmRcbiAgLy8gYmVjb21lcyB0aGUgbmV3IGNvbnZlcnNhdGlvbidzIHBhZ2UuIEEgc2lnbmFsIGJlY2F1c2UgaXQgZmVlZHNcbiAgLy8gW3JlcXVlc3REYXRhXSDigJQgY2hhbmdpbmcgaXQgaXMgd2hhdCByZWxvYWRzIHRoZSBwYW5lbCBvbnRvIHRoZSBuZXcgcGFnZSdzXG4gIC8vIGNvbnZlcnNhdGlvbnMuIE51bGwgdW50aWwgdGhlIGNhbnZhcyByZXBvcnRzIHdoaWNoIHBhZ2UgaXQgb3BlbmVkIG9uLCB3aGljaFxuICAvLyBrZWVwcyB0aGUgY2hhdCBmcm9tIGxpc3RpbmcgYWdhaW5zdCBhIHBhZ2UgZ3Vlc3MuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFdoYXQgdGhlIGNoYXQgc2VuZHMgd2l0aCBldmVyeSBjb252ZXJzYXRpb24gY2FsbDogdGhlIHJlcG9ydCwgYW5kIHRoZSBwYWdlXG4gIC8vIGl0IGlzIGJvdW5kIHRvLlxuICAvL1xuICAvLyByZXBvcnRQYWdlSWQgaXMgT01JVFRFRCwgbm90IHNlbnQgYXMgbnVsbCwgd2hpbGUgdGhlIG9wZW4gcGFnZSBpcyB1bmtub3duLlxuICAvLyBUaGUgYmFja2VuZCByZWFkcyBhIFBSRVNFTlQgcmVwb3J0UGFnZUlkIG9mIDAvbnVsbCBhcyBcInRoZSByZXBvcnQncyBlYXJsaWVyLFxuICAvLyBwYWdlLWxlc3MgY29udmVyc2F0aW9uc1wiLCBzbyBzZW5kaW5nIG51bGwgYmVmb3JlIHRoZSBjYW52YXMgaGFzIHJlcG9ydGVkIGluXG4gIC8vIHdvdWxkIGFzayBmb3IgdGhlIHdyb25nIGxpc3Qg4oCUIGFuZCwgd29yc2UsIHdvdWxkIGJpbmQgYSBjb252ZXJzYXRpb24gc3RhcnRlZFxuICAvLyBpbiB0aGF0IHdpbmRvdyB0byBubyBwYWdlIGF0IGFsbC5cbiAgLy9cbiAgLy8gVGhlIGNoYXQgaXMgYWxzbyBoZWxkIGNsb3NlZCAoW3JlYWR5XSBpbiB0aGUgdGVtcGxhdGUpIHVudGlsIHRoZSBwYWdlIGlzXG4gIC8vIGtub3duLCBzbyB0aGlzIHBhcnRpYWwgY29udGV4dCBpcyBuZXZlciBhY3R1YWxseSBzZW50OiBvbiBhIGZyZXNoIGxvYWQgdGhlXG4gIC8vIHJlcG9ydCBoYXMgdG8gYXJyaXZlIGFuZCB0aGUgY2FudmFzIGhhcyB0byByZW5kZXIgYmVmb3JlIGFueSBwYWdlIGV4aXN0cyxcbiAgLy8gYW5kIGEgbGlzdCBmZXRjaGVkIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIHRoZSB3aG9sZSByZXBvcnQncyBjb252ZXJzYXRpb25zXG4gIC8vIOKAlCB0aGUgdW5zY29wZWQgbGlzdCwgc2hvd24gYW5kIGF1dG8tc2VsZWN0ZWQgYmVmb3JlIHRoZSByZWFsIG9uZSBsYW5kcy5cbiAgcHVibGljIHJlYWRvbmx5IGNoYXRSZXF1ZXN0RGF0YSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0UGFnZUlkID0gdGhpcy5jaGF0UGFnZUlkKCk7XG5cbiAgICByZXR1cm4gcmVwb3J0UGFnZUlkID09PSBudWxsXG4gICAgICA/IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSB9XG4gICAgICA6IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSwgcmVwb3J0UGFnZUlkIH07XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHRvb2xiYXIgKGZzLWZpbHRlcikuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZFxuICAvLyByZXBvcnQgKGFuZCB0aHVzIGl0cyBncm91cHMpIGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJDb25maWcgPSBzaWduYWw8RmlsdGVyQ29uZmlnIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gR2F0ZXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIHNvIGl0IGlzbid0IHJlbmRlcmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICAvLyBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gIH0pO1xuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSAoYXQgaW5pdCkuIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZVxuICAvLyB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZCAoYW5kIHJlLXJlYWRzIHRoZVxuICAvLyByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBiYXIgd2FzIGJ1aWx0IGZvcjogYW4gYXBwbGllZCB2aWV3LCBvciBhIHJlc2V0XG4gICAgICAvLyB0byB0aGUgYmFzZSwgcmVwbGFjZXMgZXZlcnkgdmFsdWUgYXQgb25jZS5cbiAgICAgIHRoaXMuX2JhclZlcnNpb24oKSxcbiAgICAgIC8vIFRoZSBlZmZlY3RpdmUgem9uZSBpcyBwYXJ0IG9mIGl0IHRvbzogYSB6b25lIGNoYW5nZSByZS1yZXNvbHZlcyByZWxhdGl2ZVxuICAgICAgLy8gcHJlc2V0cywgYW5kIHRoZSBiYXIgbXVzdCBiZSByZWNyZWF0ZWQgdG8gc2hvdyB0aGUgbmV3IGRheXMuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgICAgLy8gVGhlIHN0b3JlZCBkZWZhdWx0IGlzIHBhcnQgb2YgdGhlIHNpZ25hdHVyZTogc2F2aW5nIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0XG4gICAgICAvLyBzZXR0aW5ncyByZWJ1aWxkcyB0aGUgY29uZmlnLCBidXQgd2l0aG91dCBhIGtleSBjaGFuZ2UgZnMtZmlsdGVyIGtlZXBzXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgICAgIGdyb3VwQnlTaWduYXR1cmUodGhpcy5yZXBvcnQoKSksXG4gICAgICAuLi50aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBgJHtncm91cC5pZH06JHtncm91cC5sZXZlbH06JHtncm91cC5sYWJlbH06JHtkZWZhdWx0U2lnbmF0dXJlKGdyb3VwKX1gKSxcbiAgICAgIC8vIEEgcGFnZSBncm91cCBzaG93cyBvbiBpdHMgb3duIHBhZ2Ugb25seSwgc28gc3VjaCBhIGJhciBpcyByZWNyZWF0ZWRcbiAgICAgIC8vIHdoZW4gdGhlIHBhZ2Ugb24gc2NyZWVuIGNoYW5nZXMuXG4gICAgICAuLi4oaGFzUGFnZUdyb3VwKHRoaXMucmVwb3J0KCkpID8gW2BwYWdlOiR7dGhpcy5jaGF0UGFnZUlkKCl9YF0gOiBbXSksXG4gICAgXS5qb2luKCd8Jyk7XG4gIH0pO1xuXG4gIC8vIFRoZSBzZXJ2ZXIga2VlcHMgc2F2ZWQgdmlld3MgZm9yIHRoaXMgcmVwb3J0LCBzbyB0aGUgVmlld3MgcGlja2VyIHNob3dzLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld3NTZXJ2ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl92aWV3cy5zZXJ2ZXModGhpcy5yZXBvcnQoKSkpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NwbGl0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfc3BsaXQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdjaGF0UGFuZWwnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIF9jaGF0UGFuZWwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvLyBPbmx5IHRoZSBjYW52YXMga25vd3Mgd2hpY2ggcGFnZSBpcyBvbiBzY3JlZW4sIGFuZCBhIHBhZ2Utc2NvcGVkIGV4cG9ydFxuICAvLyBoYXMgdG8gYXNrIGl0LlxuICBAVmlld0NoaWxkKFJlcG9ydENhbnZhc0NvbXBvbmVudClcbiAgcHJpdmF0ZSBfY2FudmFzPzogUmVwb3J0Q2FudmFzQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX3JlcG9ydEFpQ2hhdERhdGEgPSBpbmplY3QoUmVwb3J0QWlDaGF0RGF0YSk7XG4gIHByaXZhdGUgX3JvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9ucyA9IGluamVjdChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgX3ZpZXdzID0gaW5qZWN0KFJlcG9ydFZpZXdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZXhwb3J0U2VydmljZSA9IGluamVjdChSZXBvcnRFeHBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfY29sbGVjdG9yID0gaW5qZWN0KFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UpO1xuICBwcml2YXRlIF9wcm9jZXNzID0gaW5qZWN0KEZzUHJvY2Vzcyk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGF0IGhhcyBiZWVuIG9wZW5lZCAoaXRzIGRlZmF1bHQgdmlldywgZWxzZSBpdHMgZGVmYXVsdHMpLlxuICAvLyBBIHJlcG9ydCBvcGVucyBvbmNlOyBhIHJlbG9hZCBhZnRlciBhIGNoYXQgb3IgZGlhbG9nIGVkaXQga2VlcHMgdGhlIHN0YXRlXG4gIC8vIGluIG1lbW9yeS5cbiAgcHJpdmF0ZSBfb3BlbmVkUmVwb3J0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBiYXIgd2FzIGxhc3QgYnVpbHQgZm9yIChyZXBvcnRGaWx0ZXJLZXkpLlxuICBwcml2YXRlIHJlYWRvbmx5IF9iYXJWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVhY2ggY2hhdCB0dXJuIGNhcnJpZXMgd2hhdCB0aGUgdmlld2VyIGhhcyBvbiBzY3JlZW4uIE9ubHkgdGhlIGZ1bmN0aW9uXG4gICAgLy8gaXMgc2V0IGhlcmU7IGl0IGlzIGNhbGxlZCB3aGVuIGEgdHVybiBpcyBzZW50LlxuICAgIHRoaXMuX3JlcG9ydEFpQ2hhdERhdGEudHVybkRhdGEgPSAoKSA9PiAoeyB2aWV3ZXJTdGF0ZTogdGhpcy5fY2hhdFZpZXdlclN0YXRlKCkgfSk7XG5cbiAgICAvLyBQb2ludCB0aGUgc2hhcmVkIGRhdGEgZ2F0ZXdheSBhdCB0aGUgY29uZmlndXJlZCBiYXNlIGZpcnN0IChiZWZvcmUgYW55XG4gICAgLy8gbG9hZCBiZWxvdyByZWFkcyBpdCkuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XG4gICAgfSk7XG5cbiAgICAvLyAoUmUpbG9hZCB3aGVuZXZlciB0aGUgaG9zdCBzd2l0Y2hlcyB0aGUgcmVwb3J0IGlkLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcblxuICAgICAgLy8gVGhlIHBhZ2UgdGhpcyByZXBvcnQgb3BlbnMgb24sIGZyb20gdGhlID9wYWdlPSB0aGUgVVJMIGFscmVhZHkgaG9sZHMuXG4gICAgICAvLyBSZWFkIHBlciByZXBvcnQgcmF0aGVyIHRoYW4gb25jZSBhdCBjb25zdHJ1Y3Rpb246IHRoZSBob3N0IG1heSBzd2FwXG4gICAgICAvLyByZXBvcnRzIG9uIHRoZSBzYW1lIHJvdXRlLCBhbmQgZWFjaCBhcnJpdmFsIGNhcnJpZXMgaXRzIG93biA/cGFnZT0uXG4gICAgICBjb25zdCBwYWdlSWQgPSB0aGlzLl9wYWdlSWRGcm9tVXJsKCk7XG5cbiAgICAgIC8vIE9ubHkgdGhlIHJlcG9ydCBpZCBhbmQgdGhlIHBhZ2UgcGFyYW0gcmUtcnVuIHRoaXMuIFRoZSB2aWV3IHN0YXRlIGJlbG93XG4gICAgICAvLyBpcyB3cml0dGVuIGhlcmUgYW5kIHJlYWQgYnkgdGhlIGNvbmZpZyBidWlsZCwgc28gaXQgc3RheXMgdW50cmFja2VkLlxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5lZGl0TW9kZS5zZXQoZmFsc2UpO1xuXG4gICAgICAgIC8vIEEgbmV3IHJlcG9ydCdzIHBhZ2VzIGFyZSBub3QgdGhpcyByZXBvcnQncyBwYWdlcyDigJQgZHJvcCB0aGUgYmluZGluZ1xuICAgICAgICAvLyB1bnRpbCBpdHMgY2FudmFzIHNheXMgd2hpY2ggcGFnZSBpdCBsYW5kZWQgb24uXG4gICAgICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMucGFnZUlkLnNldChwYWdlSWQpO1xuXG4gICAgICAgIGlmIChyZXBvcnRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yZ2V0IHRoZSBvcGVuZWQgcmVwb3J0LCBzbyBhIGhvc3QgdGhhdCBjb21lcyBiYWNrIHRvIGl0IG9wZW5zXG4gICAgICAgICAgLy8gaXQgYWdhaW4uXG4gICAgICAgICAgdGhpcy5fb3BlbmVkUmVwb3J0SWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5KCkgYW5kIHJlc2V0VG9CYXNlKCkgbW92ZSB0aGUgc3RhdGUgdmVyc2lvbi4gVGhlIGJhciBpcyBidWlsdFxuICAgIC8vIGFnYWluIGZvciBpdCwgYW5kIHJlcG9ydEZpbHRlcktleSwgd2hpY2ggY2FycmllcyBpdCwgcmVjcmVhdGVzXG4gICAgLy8gZnMtZmlsdGVyOiBpdCByZWFkcyBpdHMgY29uZmlnIG9uY2UuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IHRoaXMuX2JhclZlcnNpb24oKSkge1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQW4gb3BlbmVkIHZpZXcgKGEgc2F2ZWQgdmlldyBwaWNrZWQsIG9yIHRoZSByZXBvcnQncyBkZWZhdWx0cykgb3BlbnNcbiAgICAvLyBvbiBpdHMgcGFnZS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuYXBwbGllZFZlcnNpb24oKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuX29wZW5BcHBsaWVkUGFnZSgpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS51cGRhdGUoKGVkaXRNb2RlKSA9PiAhZWRpdE1vZGUpO1xuICB9XG5cbiAgLy8gVGhlIGVkaXQgdG9vbHMgbGl2ZSBpbiB0aGlzIHRvb2xiYXIsIGJ1dCB0aGUgY2FudmFzIG93bnMgd2hhdCB0aGV5IGFjdCBvblxuICAvLyAodGhlIGFjdGl2ZSBwYWdlLCB0aGUgaGVhZGVyL2Zvb3RlciBiYW5kcywgd2hpY2ggbGF5ZXIgaXMgbGl2ZSkuXG4gIHB1YmxpYyBnZXQgaXNNYXN0ZXJNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW52YXM/Lm1hc3Rlck1vZGUoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8uYWRkVGV4dCgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1hc3Rlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy50b2dnbGVNYXN0ZXJNb2RlKCk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3Mg4oCUIG5hbWUsIHBhZ2Ugc2l6ZSwgZGVsZXRlLiBUaGVcbiAgLy8gZGlhbG9nIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmOyB3ZSByZWFjdCB0byB3aGF0IGl0IHJlcG9ydHMgYmFjay5cbiAgcHVibGljIHJlcG9ydFNldHRpbmdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4oUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgcmVwb3J0IH0sXG4gICAgICB3aWR0aDogJzQ2MHB4JyxcbiAgICB9KTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnZGVsZXRlZCcpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZWQuZW1pdChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIHNhdmUgdGhhdCBmYWlsZWQgcGFydCB3YXkgKGEgcmVmdXNlZCBuYW1lKSBtYXkgc3RpbGwgaGF2ZSBzdG9yZWRcbiAgICAgICAgLy8gdGhlIGZpbHRlcnMgYmVmb3JlIGl0LCBzbyBhIGRpc21pc3NlZCBkaWFsb2cgdGhhdCB3cm90ZSByZWxvYWRzIHRvby5cbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2F2ZWQnIHx8IHNldHRpbmdzLndyb3RlKCkpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3Mg4oCUIHRpdGxlLCBleGFjdCBnZW9tZXRyeSwgYW5kIHRoZSBkaWFnbm9zdGljIHZpZXdzXG4gIC8vIChTUUwsIGNvbmZpZywgZmlsdGVyIHdpcmluZykuXG4gIHB1YmxpYyBjb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCB8fCAhdGhpcy5fY2FudmFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICAvLyBUaGUgZGlhbG9nIGdldHMgd2hhdCB0aGUgY29tcG9uZW50J3MgdGl0bGUgdG9rZW5zIGZpbGwgd2l0aCB3aGVyZSBpdCBpc1xuICAgIC8vIGRyYXduLCBmb3IgdGhlIHRpdGxlJ3MgSW5zZXJ0IGZpZWxkIG1lbnUgYW5kIHRoZSBsaW5lIHNheWluZyBob3cgaXQgcmVhZHMuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzRGlhbG9nRGF0YSwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+KFxuICAgICAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGRhdGE6IHsgcmVwb3J0LCBjb21wb25lbnQsIHRva2VuczogdGhpcy5fY2FudmFzLmNvbXBvbmVudFRva2Vucyhjb21wb25lbnQpIH0sXG4gICAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlsdGVyIGFkZC9yZW1vdmUvbGV2ZWwgY2hhbmdlcyBwZXJzaXN0IGltbWVkaWF0ZWx5IGluc2lkZSB0aGUgZGlhbG9nIChub1xuICAgIC8vIFwic2F2ZVwiKSBhbmQgY2FuIGxlYXZlIGl0IGJ5IGFuIGV4aXQgdGhhdCBjYXJyaWVzIG5vIHJlc3VsdCwgc28gdGhleSBhcmVcbiAgICAvLyBhbm5vdW5jZWQgYXMgdGhleSBsYW5kLiBUaGUgcmVsb2FkIHdhaXRzIGZvciB0aGUgY2xvc2Ugc28gdGhlIGNhbnZhcyBpc24ndFxuICAgIC8vIHJlLXJlbmRlcmluZyB1bmRlcm5lYXRoIGFuIG9wZW4gZGlhbG9nLlxuICAgIGxldCBmaWx0ZXJzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5maWx0ZXJzQ2hhbmdlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZmlsdGVyc0NoYW5nZWQgPSB0cnVlKTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gVGhlIGRpYWxvZyBjb25maXJtcyArIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmLiBUaGUgY29tcG9uZW50IGlzXG4gICAgICAgIC8vIGdvbmUgZnJvbSB0aGUgcmVwb3J0LCBzbyByZWxvYWQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgaXQgb3V0IGxvY2FsbHkg4oCUXG4gICAgICAgIC8vIGl0cyBmaWx0ZXJzIHdlbnQgd2l0aCBpdCwgd2hpY2ggdGhlIHJlcG9ydCBiYXIgaGFzIHRvIGJlIHJlYnVpbHQgZm9yLlxuICAgICAgICBpZiAocmVzdWx0Py5kZWxldGVkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVwb3J0J3MgZmlsdGVyIGdyb3VwcyBjaGFuZ2VkLCBzbyB0aGUgcmVwb3J0IGJhciBhbmQgdGhlXG4gICAgICAgIC8vIG9uLWNvbXBvbmVudCBzdHJpcHMgaGF2ZSB0byBiZSByZWJ1aWx0IGZyb20gYSBmcmVzaCByZXBvcnQuXG4gICAgICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aGluZyBlbHNlIGluIHRoZSBkaWFsb2cgdG91Y2hlcyB0aGUgcXVlcnkg4oCUIHRpdGxlIGFuZCBwYWRkaW5nIGFyZVxuICAgICAgICAvLyBwcmVzZW50YXRpb24uIFJlcGFpbnQgdGhlIG9uZSBjb21wb25lbnQgaXQgd2FzIG9wZW5lZCBmb3IgYW5kIGxlYXZlXG4gICAgICAgIC8vIGV2ZXJ5IG90aGVyIGNvbXBvbmVudCdzIGRhdGEsIGFuZCBpdHMgcXVlcnksIGFsb25lLlxuICAgICAgICBpZiAocmVzdWx0Py5zZXR0aW5ncykge1xuICAgICAgICAgIHRoaXMuX2NhbnZhcz8uYXBwbHlDb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQuaWQsIHJlc3VsdC5zZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBtb3ZlZCB0byBhbm90aGVyIHBhZ2UuIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVycyBzdGF5IGFzIHRoZXlcbiAgLy8gYXJlICh0aGV5IGxpdmUgaW4gdGhlIHN0YXRlIHNlcnZpY2UpLCBhbmQgdGhlIFVSTCBpcyBsZWZ0IGFsb25lLlxuICBwdWJsaWMgb25DYW52YXNQYWdlQ2hhbmdlZChwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBUaGUgYXNrZWQtZm9yIHBhZ2UgaGFzIGJlZW4gY29uc3VtZWQ7IGZyb20gaGVyZSB0aGUgY2FudmFzIG93bnMgdGhlIHBhZ2UuXG4gICAgdGhpcy5wYWdlSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAvLyBUaGUgb3BlbiBwYWdlIGlzIHBhcnQgb2YgdGhlIHNjcmVlbiBhIHZpZXcgc2F2ZXMuXG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0UGFnZShwYWdlSWQpO1xuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChwYWdlSWQpO1xuXG4gICAgLy8gVGhlIGJhciBzaG93cyB0aGUgcGFnZSBncm91cHMgb2YgdGhlIHBhZ2Ugb24gc2NyZWVuLlxuICAgIGlmIChoYXNQYWdlR3JvdXAodGhpcy5yZXBvcnQoKSkpIHtcbiAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBjaGFuZ2VkIHRoZSByZXBvcnQncyBzdHJ1Y3R1cmUgKGFkZGVkIGEgcGFnZSkg4oCUIHJlLWZldGNoIHNvIHRoZVxuICAvLyBuZXcgcGFnZSByZW5kZXJzOyB0aGUgY2FudmFzIGxhbmRzIHRoZSB2aWV3IG9uIGl0LlxuICBwdWJsaWMgb25DYW52YXNSZXBvcnRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKHJlcG9ydCkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgcmVwb3J0IHRvIFBvd2VyUG9pbnQsIGVudGlyZWx5IGNsaWVudC1zaWRlIChuYXRpdmUgZWRpdGFibGVcbiAgLy8gY2hhcnRzOyBwYWdlID0gc2xpZGUpLiBUaGUgZG9jayBzaG93cyBwcm9ncmVzcyB1bnRpbCB0aGUgZmlsZSBzYXZlcy5cbiAgcHVibGljIGV4cG9ydFBvd2VycG9pbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQb3dlclBvaW50JyxcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucG93ZXJwb2ludChyZXBvcnQpLFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnQgdG8gUERGLCBlbnRpcmVseSBjbGllbnQtc2lkZSAob2Zmc2NyZWVuIEVDaGFydHMgYXQgM8OXOyBwYWdlID0gUERGIHBhZ2UpLlxuICBwdWJsaWMgZXhwb3J0UGRmKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdFeHBvcnRpbmcgUERGJyxcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucGRmKHJlcG9ydCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB3aG9sZSByZXBvcnQgYXMgZmlsZXMgaW4gb25lIGFjdGlvbjogdGhlIHNlcnZlciB3cml0ZXMgb25lIENTViBwZXJcbiAgLy8gY29tcG9uZW50LCBlYWNoIHdoYXQgdGhlIHNjcmVlbiBzaG93cyAoYSBjaGFydCBvciBLUEkgYXMgZHJhd24sIGF0IHRoZVxuICAvLyB2aWV3ZXIncyBncm91cC1ieSBncmFpbjsgYSBsaXN0IGluIGZ1bGwpLCBhbmQgemlwcyB0aGVtIGZvbGRlcmVkIGJ5IHBhZ2VcbiAgLy8gd2l0aCBhbiBFeHBvcnQgTm90ZXMudHh0IHRoYXQgcmVjb3JkcyB0aGUgZmlsdGVycyBhcyB0aGUgYmFyIHJlYWRzIHRoZW0uXG4gIC8vIEVhY2ggZmlsZSBjYXJyaWVzIGl0cyB0aWxlJ3Mgb3duIHN0YXRlICh6aXBFeHBvcnRTdGF0ZXMpOiBhIGxpc3QncyBzb3J0LFxuICAvLyBzZWFyY2ggYW5kIGhpZGRlbiBjb2x1bW5zLCBhIGNoYXJ0J3MgZHJpbGwgcGF0aCBhbmQgdGhlIGdyb3VwcyB0aGF0IG1hdGNoXG4gIC8vICdhbnknOyBhIHNlcnZlciB0aGF0IGRvZXMgbm90IHJlYWQgaXQgdXNlcyBlYWNoIGxpc3QncyBzYXZlZCBzb3J0LiBUaGVcbiAgLy8gbm90ZXMgZ2V0IHRoZSBmaWx0ZXIgbGluZXMgYXMgdGhlIGNvdmVyIHdvcmRzIHRoZW0gKGV4cG9ydExpbmVzOyBhIFRoaXNcbiAgLy8gUGFnZSB6aXAgbmFtZXMgb25seSB0aGUgZ3JvdXBzIHRoYXQgcmVhY2ggdGhlIHBhZ2UpIGFuZCB0aGUgb3BlbiB2aWV3LFxuICAvLyB3aGljaCB0aGUgc2VydmVyIG5hbWVzLCBhbmQgZWFjaCBmaWxlIGlzIG5hbWVkIGFmdGVyIGl0cyB0aWxlJ3MgdGl0bGUgYXNcbiAgLy8gdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQgKHRpdGxlcykuIEFsbCBvZiBpdCBpcyByZWFkIG9uY2UsIHdoZW4gdGhlXG4gIC8vIGV4cG9ydCBzdGFydHMgKGV4cG9ydFdvcmRpbmcpLiBgdGhpc1BhZ2VgIG5hcnJvd3MgaXQgdG8gdGhlIHBhZ2UgdGhlXG4gIC8vIGNhbnZhcyBpcyBzaG93aW5nLiBVbmxpa2UgdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdGhlIGZpbGVzIGFyZVxuICAvLyB3cml0dGVuIHNlcnZlci1zaWRlLCBzbyB0aGV5IGFyZSBub3QgY2FwcGVkIGJ5IHdoYXQgYSBzbGlkZSBjYW4gaG9sZC5cbiAgcHVibGljIGV4cG9ydERhdGEodGhpc1BhZ2UgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSB0aGlzUGFnZSA/IHRoaXMuX2NhbnZhcz8uYWN0aXZlUGFnZT8uaWQgPz8gbnVsbCA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JSZXBvcnQocmVwb3J0LCBwYWdlSWQpO1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fY29sbGVjdG9yLnNuYXBzaG90KHJlcG9ydCk7XG4gICAgY29uc3Qgc3RhdGVzID0gemlwRXhwb3J0U3RhdGVzKHJlcG9ydCwgc25hcHNob3QudmlldywgcGFnZUlkKTtcbiAgICBjb25zdCB2aWV3SWQgPSB0aGlzLl92aWV3cy5vcGVuVmlldygpPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IHZpZXdDaGFuZ2VkID0gdGhpcy5fdmlld3Mudmlld0NoYW5nZWQoKTtcblxuICAgIHRoaXMuX3Byb2Nlc3MuZG93bmxvYWQoXG4gICAgICAnRXhwb3J0aW5nIGRhdGEnLFxuICAgICAgdGhpcy5fY29sbGVjdG9yLmV4cG9ydFdvcmRpbmcocmVwb3J0LCBzbmFwc2hvdCwgcGFnZUlkKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKHsgbGluZXMsIHRpdGxlcyB9KSA9PiB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFJlcG9ydChcbiAgICAgICAgICAgIHJlcG9ydC5pZCxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0YXRlcyxcbiAgICAgICAgICAgIHZpZXdJZCxcbiAgICAgICAgICAgIHZpZXdDaGFuZ2VkLFxuICAgICAgICAgICAgdGl0bGVzLFxuICAgICAgICAgICkpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBSZWFjdCB0byBlYWNoIGNoYXQgdHVybiAoZnMtY2hhdCBoYW5kbGVzIHRoZSByZXF1ZXN0ICsgcGVyc2lzdGVuY2UpOyB3ZVxuICAvLyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlcG9ydCBzaWRlIGVmZmVjdHMgdGhpcyBjb250ZXh0J3MgYmFja2VuZCBmbGFncy5cbiAgcHVibGljIG9uQ2hhdFJlc3BvbnNlKHJlc3BvbnNlOiBGc0FpQ2hhdFJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgaWYgKHJlcG9ydElkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRSZXNwb25zZSA9IHJlc3BvbnNlIGFzIEZzQWlDaGF0UmVzcG9uc2UgJiBSZXBvcnRDaGF0UmVzcG9uc2U7XG5cbiAgICAvLyBBIHN0cnVjdHVyYWwgY2hhbmdlIG9yIGEgcmVuYW1lIGJvdGggcmUtZmV0Y2ggdGhlIHJlcG9ydCAoc2Vzc2lvbiBmaWx0ZXJcbiAgICAvLyB2YWx1ZXMgc3Vydml2ZSk7IGEgcmVuYW1lIGFkZGl0aW9uYWxseSBub3RpZmllcyB0aGUgaG9zdCBzbyBpdCBjYW5cbiAgICAvLyByZWZyZXNoIGEgYnJlYWRjcnVtYiAvIHRpdGxlLlxuICAgIGlmIChyZXBvcnRSZXNwb25zZS5yZXBvcnRDaGFuZ2VkIHx8IHJlcG9ydFJlc3BvbnNlLnJlcG9ydFJlbmFtZWQpIHtcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsICEhcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJhZyB0aGUgZGl2aWRlciBiZXR3ZWVuIHRoZSBjaGF0IGFuZCBjYW52YXMgcGFuZXMgKHBvaW50ZXItY2FwdHVyZSBsb29wXG4gIC8vIG91dHNpZGUgQW5ndWxhcikuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVzaXppbmcnKTtcblxuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHRoaXMuX3Jlc2l6ZVRvKGUuY2xpZW50WCk7XG4gICAgICBjb25zdCBlbmQgPSAoKSA9PiB7XG4gICAgICAgIGhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIG9uIHNjcmVlbiBhcyBhIGNoYXQgdHVybiBzZW5kcyBpdC4gVGhlIGNhbnZhc1xuICAvLyBzZWxlY3Rpb24gY291bnRzIG9ubHkgaW4gZWRpdCBtb2RlOiBpdCBpcyBkcmF3biBvbmx5IHRoZW4sIGFuZCBpdCBpcyBrZXB0XG4gIC8vIChub3QgY2xlYXJlZCkgd2hlbiBlZGl0IG1vZGUgaXMgbGVmdC4gVGhlIG1hdGNoIGlzIHNlbnQgb25seSB3aGlsZSBpdCBpc1xuICAvLyAnYW55JywgdGhlIGRyaWxsZWQgY2hhcnRzIG9ubHkgd2hlbiBvbmUgaXMgZHJpbGxlZCwgYW5kIHRoZSBvcGVuIHZpZXdcbiAgLy8gKGFuZCB3aGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIGl0KSBvbmx5IHdoaWxlIG9uZSBpcyBvcGVuLlxuICBwcml2YXRlIF9jaGF0Vmlld2VyU3RhdGUoKTogUmVwb3J0Q2hhdFZpZXdlclN0YXRlIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCk7XG4gICAgY29uc3QgZHJpbGxzID0gY2hhdFZpZXdlckRyaWxscyhzbmFwc2hvdCwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnVsYXJpdHk6IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpLFxuICAgICAgc2VsZWN0ZWRDb21wb25lbnRJZDogdGhpcy5lZGl0TW9kZSgpID8gdGhpcy5fY2FudmFzPy5zZWxlY3RlZENvbXBvbmVudElkKCkgPz8gbnVsbCA6IG51bGwsXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3ZXJGaWx0ZXJzKCksXG4gICAgICAuLi5jaGF0Vmlld2VyTWF0Y2goc25hcHNob3QpLFxuICAgICAgLi4uKGRyaWxscy5sZW5ndGggPyB7IGRyaWxscyB9IDoge30pLFxuICAgICAgLi4uY2hhdFZpZXdGaWVsZHModGhpcy5fdmlld3Mub3BlblZpZXcoKSwgdGhpcy5fdmlld3Mudmlld0NoYW5nZWQoKSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2UgaWQgdGhlIFVSTCBob2xkcyByaWdodCBub3cgKD9wYWdlPSwgcmVhZCBvbmx5KSwgb3IgbnVsbCB3aGVuIHRoZVxuICAvLyBwYWdlIHBhcmFtIGlzIG9mZiBvciB0aGUgdmFsdWUgaXMgbm90IGEgdXNhYmxlIGlkLlxuICBwcml2YXRlIF9wYWdlSWRGcm9tVXJsKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYWdlUXVlcnlQYXJhbSgpO1xuICAgIGlmICghcGFyYW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IE51bWJlcih0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChwYXJhbSkpO1xuXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYWdlSWQpICYmIHBhZ2VJZCA+IDAgPyBwYWdlSWQgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXBvcnQ6IFJlcG9ydCkgPT4gdGhpcy5fb3BlblJlcG9ydChyZXBvcnQpLnBpcGUobWFwKCgpID0+IHJlcG9ydCkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX29wZW5BcHBsaWVkUGFnZSgpO1xuICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuXG4gICAgICAgIGlmIChlbWl0UmVuYW1lZCkge1xuICAgICAgICAgIHRoaXMucmVuYW1lZC5lbWl0KHJlcG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gU2V0cyB0aGUgdmlld2VyIHN0YXRlIHVwIGZvciBhIGxvYWRlZCByZXBvcnQuIE9uIGl0cyBmaXJzdCBsb2FkIGEgc2VydmVyXG4gIC8vIHRoYXQga2VlcHMgc2F2ZWQgdmlld3Mgb3BlbnMgaXQgb24gdGhlIHZpZXdlcidzIGRlZmF1bHQgdmlldywgZWxzZSBvbiB0aGVcbiAgLy8gZGVmYXVsdHMgKHdoaWNoIHdhaXRzIGZvciB0aGUgbGlzdCBvZiB2aWV3cyk7IGFueSBvdGhlciBzZXJ2ZXIgb3BlbnMgaXRcbiAgLy8gb24gdGhlIGRlZmF1bHRzLiBFdmVyeSBsYXRlciBsb2FkIGtlZXBzIHRoZSBzdGF0ZSBpbiBtZW1vcnkuXG4gIHByaXZhdGUgX29wZW5SZXBvcnQocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdExvYWQgPSByZXBvcnQuaWQgIT09IHRoaXMuX29wZW5lZFJlcG9ydElkO1xuICAgIHRoaXMuX29wZW5lZFJlcG9ydElkID0gcmVwb3J0LmlkO1xuXG4gICAgaWYgKCF0aGlzLl92aWV3cy5zZXJ2ZXMocmVwb3J0KSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuaW5pdChyZXBvcnQpO1xuXG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBpZiAoIWZpcnN0TG9hZCkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuaW5pdChyZXBvcnQpO1xuICAgICAgdGhpcy5fdmlld3MucmVmcmVzaChyZXBvcnQpO1xuXG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmlld3Mub3BlbihyZXBvcnQsIHRoaXMucGFnZUlkKCkpO1xuICB9XG5cbiAgLy8gTW92ZXMgdGhlIGNhbnZhcyB0byB0aGUgcGFnZSBhbiBvcGVuZWQgdmlldyBwdXQgb24gc2NyZWVuIChhID9wYWdlPSB0aGVcbiAgLy8gcmVwb3J0IG9wZW5lZCB3aXRoIGFscmVhZHkgd29uIGluc2lkZSBhcHBseSgpKS4gQSByZXNldCwgb3IgYSByZWxvYWQsXG4gIC8vIGxlYXZlcyB0aGUgcGFnZS5cbiAgcHJpdmF0ZSBfb3BlbkFwcGxpZWRQYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXMuX2ZpbHRlclN0YXRlLnBhZ2UoKTtcblxuICAgIGlmIChwYWdlSWQgJiYgcGFnZUlkICE9PSB0aGlzLmNoYXRQYWdlSWQoKSkge1xuICAgICAgdGhpcy5wYWdlSWQuc2V0KHBhZ2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVwb3J0LWxldmVsIGZpbHRlciBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXIg4oCUIHRoZSBvbmVzIHRoYXQgcmVuZGVyIGluXG4gIC8vIHRoZSB0b29sYmFyIChjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBvbiB0aGVpciBjb21wb25lbnRzKSwgd2l0aFxuICAvLyB0aGUgcGFnZSBncm91cHMgb2YgdGhlIHBhZ2Ugb24gc2NyZWVuLlxuICBwcml2YXRlIF9yZXBvcnRHcm91cHMoKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XG4gICAgcmV0dXJuIHJlcG9ydEJhckdyb3Vwcyh0aGlzLnJlcG9ydCgpLCB0aGlzLmNoYXRQYWdlSWQoKSk7XG4gIH1cblxuICAvLyAoUmUpYnVpbGQgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIGNvbmZpZyDigJQgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgaXRlbXMgYW5kXG4gIC8vIHRoZW4gdGhlIGdyb3VwLWJ5IGNvbnRyb2wuXG4gIHByaXZhdGUgX2J1aWxkUmVwb3J0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQ/LmlkID8/IG51bGw7XG5cbiAgICAvLyBEcm9wIGEgZ3JhaW4gdGhlIGNvbnRyb2wgbm8gbG9uZ2VyIG9mZmVycyDigJQgdGhlIGFnZW50IGNhbiBuYXJyb3cgdGhlIGxpc3RcbiAgICAvLyBtaWQtc2Vzc2lvbiwgYW5kIGFuIG92ZXJyaWRlIHRoZSB2aWV3ZXIgY2FuJ3Qgc2VlIGlzIHdvcnNlIHRoYW4gbm9uZS5cbiAgICBpZiAocmVwb3J0ICYmICFpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVwb3J0Py52aWV3ZXJGZWF0dXJlcyA/PyBbXTtcbiAgICBjb25zdCBpdGVtcyA9IHJlcG9ydElkXG4gICAgICA/IHRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+XG4gICAgICAgIGZpbHRlckl0ZW1Gb3JHcm91cChncm91cCwgdGhpcy5fZmlsdGVyT3B0aW9ucywgcmVwb3J0LCB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCksIGZlYXR1cmVzKSlcbiAgICAgIDogW107XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgY29udHJvbCBsZWFkcyB0aGUgYmFyLCBhaGVhZCBvZiBldmVyeSBmaWx0ZXI6IGl0IHNldHMgdGhlXG4gICAgLy8gZ3JhaW4gdGhlIHdob2xlIHJlcG9ydCBpcyByZWFkIGF0LCBzbyBpdCBpcyB0aGUgZmlyc3QgdGhpbmcgYSB2aWV3ZXJcbiAgICAvLyBkZWNpZGVzLiBJdCBpcyBub3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIGl0IHJlLWJ1Y2tldHMgcm93cyByYXRoZXIgdGhhblxuICAgIC8vIG5hcnJvd2luZyB0aGVtIOKAlCBzbyBpdCBpcyBwbGFjZWQgaGVyZSByYXRoZXIgdGhhbiBvcmRlcmVkIGFtb25nIHRoZW0uXG4gICAgY29uc3QgZ3JvdXBCeUl0ZW0gPSB0aGlzLl9ncm91cEJ5SXRlbSgpO1xuICAgIGlmIChncm91cEJ5SXRlbSkge1xuICAgICAgaXRlbXMudW5zaGlmdChncm91cEJ5SXRlbSk7XG4gICAgfVxuXG4gICAgLy8gSG93IHRoZSBncm91cHMgY29tYmluZSBjbG9zZXMgdGhlIGJhci5cbiAgICBjb25zdCBtYXRjaEl0ZW0gPSB0aGlzLl9tYXRjaEl0ZW0oKTtcbiAgICBpZiAobWF0Y2hJdGVtKSB7XG4gICAgICBpdGVtcy5wdXNoKG1hdGNoSXRlbSk7XG4gICAgfVxuXG4gICAgdGhpcy5fYmFyVmVyc2lvbi5zZXQodGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCkpO1xuICAgIHRoaXMucmVwb3J0RmlsdGVyQ29uZmlnLnNldCh7XG4gICAgICAvLyBmcy1maWx0ZXIgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIGZpbHRlciBzdGF0ZTogYSByZXBvcnRcbiAgICAgIC8vIGtlZXBzIG5vIHN0YXRlIGluIHRoZSBVUkwuIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSBvd25zIHRoZSB2YWx1ZXMuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgaXRlbXMsXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4gdGhpcy5fYmFyQ2hhbmdlZChxdWVyeSA/PyB7fSwgISFtYXRjaEl0ZW0pLFxuICAgICAgLy8gJ0NsZWFyIGZpbHRlcnMnIHB1dHMgdGhlIHNjcmVlbiBiYWNrIG9uIHRoZSBvcGVuIHZpZXcsIGVsc2Ugb24gdGhlXG4gICAgICAvLyByZXBvcnQncyBkZWZhdWx0cywgYW5kIGRyb3BzIHRoZSB0ZW1wb3JhcnkgbGF5ZXIuIGZzLWZpbHRlciByZXBvcnRzXG4gICAgICAvLyBpdHMgb3duIGNsZWFyZWQgaXRlbXMgKGNoYW5nZSkganVzdCBiZWZvcmUgdGhpcywgc28gdGhlIHJlc2V0IHdpbnMuXG4gICAgICAvLyBBIHNlcnZlciB3aXRob3V0IHNhdmVkIHZpZXdzIGtlZXBzIHRoZSBjbGVhciBpdCBhbHdheXMgaGFkOiB0aGVcbiAgICAgIC8vIGJhcidzIGl0ZW1zIG9ubHkuXG4gICAgICBjbGVhcjogdGhpcy5fdmlld3Muc2VydmVzKHJlcG9ydCkgPyAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNldFRvQmFzZSgpIDogdW5kZWZpbmVkLFxuICAgICAgLy8gVGhlIGNoaXAgc2hvd3MgZXhhY3RseSB3aGlsZSB0aGUgc2NyZWVuIGRpZmZlcnMgZnJvbSB3aGF0IGEgY2xlYXJcbiAgICAgIC8vIHJldHVybnMgdG8gKEM1KTogcmlnaHQgYWZ0ZXIgYSBzYXZlIGl0IGhpZGVzLCBhbmQgb25jZSB0aGUgb3BlbiB2aWV3XG4gICAgICAvLyBpcyBkZWxldGVkIGl0IHNob3dzIGZvciB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gICAgICBjbGVhclZpc2libGU6IHRoaXMuX3ZpZXdzLnNlcnZlcyhyZXBvcnQpID8gKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUudmlld0NoYW5nZWQoKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBiYXIncyB2YWx1ZXMgaW50byB0aGUgc3RhdGU6IGV2ZXJ5IGdyb3VwIGl0IHNob3dzLCB0aGUgZ3JhaW4gYW5kLFxuICAvLyB3aGVuIHRoZSBiYXIgaGFzIHRoZSBjb250cm9sLCB0aGUgbWF0Y2guXG4gIHByaXZhdGUgX2JhckNoYW5nZWQocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoYXNNYXRjaDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBncm91cElkLCB2YWx1ZSB9IG9mIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5LCB0aGlzLl9yZXBvcnRHcm91cHMoKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gTm90IGEgZmlsdGVyIGdyb3VwIOKAlCB0aGUgZ3JhaW4gaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIHF1ZXJ5LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeSgocXVlcnlbR1JPVVBfQllfSVRFTV0gYXMgQ2hhcnRHcmFudWxhcml0eSkgfHwgbnVsbCk7XG4gICAgLy8gTm9yIGlzIHRoZSBtYXRjaDsgYSBiYXIgd2l0aG91dCB0aGUgY29udHJvbCBsZWF2ZXMgaXQgYXMgaXQgaXMuXG4gICAgaWYgKGhhc01hdGNoKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRNYXRjaChtYXRjaEZyb21RdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIGFzIGFuIGZzLWZpbHRlciBpdGVtLCBvciBudWxsIHdoZW4gdGhlIHJlcG9ydFxuICAvLyBoYXMgbm9uZSB0byBzaG93LiBTZWVkZWQgZnJvbSB0aGUgc2Vzc2lvbiBzdGF0ZSBzbyB0aGUgZ3JhaW4gdGhlIHZpZXdlclxuICAvLyBwaWNrZWQgc3Vydml2ZXMgdGhlIHJlcG9ydCBiZWluZyByZS1mZXRjaGVkIGFmdGVyIGEgY2hhdCBlZGl0LlxuICBwcml2YXRlIF9ncm91cEJ5SXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICByZXR1cm4gcmVwb3J0XG4gICAgICA/IGdyb3VwQnlGaWx0ZXJJdGVtKHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgTWF0Y2ggY29udHJvbCwgc2VlZGVkIHdpdGggdGhlIG1hdGNoIG9uIHNjcmVlbiwgb3IgbnVsbCB3aGVuXG4gIC8vIHRoZSBiYXIgaG9sZHMgZmV3ZXIgdGhhbiB0d28gZ3JvdXBzIHRoYXQgY29tYmluZS5cbiAgcHJpdmF0ZSBfbWF0Y2hJdGVtKCk6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG1hdGNoRmlsdGVySXRlbSh0aGlzLnJlcG9ydCgpLCB0aGlzLl9yZXBvcnRHcm91cHMoKSwgdGhpcy5jaGF0UGFnZUlkKCksIHRoaXMuX2ZpbHRlclN0YXRlLm1hdGNoKCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0IGZzLWNvbHVtblwiPlxuXG4gIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2hlYWRlciBmcy1yb3cuYWxpZ24tY2VudGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aXRsZSBmcy1mbGV4XCI+e3sgcmVwb3J0KCk/Lm5hbWUgfX08L2gyPlxuXG4gICAgPCEtLSBUaGUgc2F2ZWQgdmlld3M6IHNob3duIG9ubHkgd2hlbiB0aGUgc2VydmVyIGtlZXBzIHRoZW0uIC0tPlxuICAgIEBpZiAodmlld3NTZXJ2ZWQoKSkge1xuICAgICAgPGFwcC1yZXBvcnQtdmlldy1waWNrZXI+PC9hcHAtcmVwb3J0LXZpZXctcGlja2VyPlxuICAgIH1cblxuICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgIDwhLS0gUmVwb3J0LWxldmVsIGZpbHRlcnMsIGlubGluZSB3aXRoIHRoZSB0b29sYmFyIGFjdGlvbnMuIGZzLWZpbHRlclxuICAgICAgICAgICByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCwgc28gaXQncyBrZXllZCBvbiB0aGUgZmlsdGVyXG4gICAgICAgICAgIHNpZ25hdHVyZTogd2hlbiB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXQgY2hhbmdlcyB0aGUgYmxvY2sgaXNcbiAgICAgICAgICAgcmVjcmVhdGVkIGFuZCByZS1yZWFkcyB0aGUgcmVidWlsdCBjb25maWcuIC0tPlxuICAgICAgQGlmIChyZXBvcnRIYXNGaWx0ZXJzKCkpIHtcbiAgICAgICAgQGZvciAoa2V5IG9mIFtyZXBvcnRGaWx0ZXJLZXkoKV07IHRyYWNrIGtleSkge1xuICAgICAgICAgIDxmcy1maWx0ZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2ZpbHRlcnNcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInJlcG9ydEZpbHRlckNvbmZpZygpXCI+XG4gICAgICAgICAgPC9mcy1maWx0ZXI+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSBXaGF0IGxheW91dCBlZGl0aW5nIGNhbiBhZGQgb3Igc3dpdGNoIHRvLCBhbmQgdGhlIHdheSBvdXQgb2YgaXQuXG4gICAgICAgICAgIE9uZSBzdHlsZSBmb3IgYWxsIHRocmVlIOKAlCBvdXRsaW5lZCwgaWNvbiBhbmQgdGV4dC4gXCJIZWFkZXIgJiBmb290ZXJcIlxuICAgICAgICAgICBpcyBhIHRvZ2dsZTogaXQga2VlcHMgaXRzIGxhYmVsIGFuZCB0dXJucyBncmF5IHdoaWxlIGl0IGlzIG9uLiAtLT5cbiAgICAgIEBpZiAoZWRpdE1vZGUoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0X19lZGl0LXRvb2xzIGZzLXJvdy5hbGlnbi1jZW50ZXIuZ2FwLXhzXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgYSBibG9jayBvZiB0ZXh0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRleHQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnRpdGxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIEFkZCB0ZXh0XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19tYXN0ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzTWFzdGVyTW9kZVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImlzTWFzdGVyTW9kZSA/ICdCYWNrIHRvIGVkaXRpbmcgdGhpcyBwYWdlJyA6ICdFZGl0IHRoZSBoZWFkZXIgYW5kIGZvb3RlciBzaG93biBvbiBldmVyeSBwYWdlJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNYXN0ZXJNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgSGVhZGVyICYgZm9vdGVyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgRG9uZSBlZGl0aW5nXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIE9uZSBpY29uIGZvciBib3RoIHN0YXRlczogaXQgcmVhZHMgYXMgcHJlc3NlZCB3aGlsZSBlZGl0aW5nIHJhdGhlclxuICAgICAgICAgICB0aGFuIHN3YXBwaW5nIHRvIHNvbWV0aGluZyBlbHNlLiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fdG9nZ2xlXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImVkaXRNb2RlKClcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cImVkaXRNb2RlKCkgPyAnRG9uZSBlZGl0aW5nJyA6ICdFZGl0IGxheW91dCdcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5kYXNoYm9hcmRfY3VzdG9taXplPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIkV4cG9ydFwiXG4gICAgICAgICAgW2ZzTWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0TWVudVwiPlxuICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZnMtbWVudSAjZXhwb3J0TWVudT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQb3dlcnBvaW50KClcIj5cbiAgICAgICAgICBFeHBvcnQgUG93ZXJQb2ludFxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBkZigpXCI+XG4gICAgICAgICAgRXhwb3J0IFBERlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEoKVwiPlxuICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICBAaWYgKChyZXBvcnQoKT8ucGFnZXM/Lmxlbmd0aCA/PyAwKSA+IDEpIHtcbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKHRydWUpXCI+XG4gICAgICAgICAgICBFeHBvcnQgUmF3IERhdGEgKFRoaXMgUGFnZSlcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICA8L2ZzLW1lbnU+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiUmVwb3J0IHNldHRpbmdzXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVwb3J0U2V0dGluZ3MoKVwiPlxuICAgICAgICA8bWF0LWljb24+c2V0dGluZ3M8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgICAjc3BsaXRcbiAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19zcGxpdCBmcy1yb3cuYWxpZ24tc3RhcnRcIj5cbiAgICA8ZnMtYWktY2hhdFxuICAgICAgICAjY2hhdFBhbmVsXG4gICAgICAgIGNsYXNzPVwiY2hhdFwiXG4gICAgICAgIFtiYXNlUGF0aF09XCJiYXNlUGF0aCgpXCJcbiAgICAgICAgW3JlcXVlc3REYXRhXT1cImNoYXRSZXF1ZXN0RGF0YSgpXCJcbiAgICAgICAgW3JlYWR5XT1cImNoYXRQYWdlSWQoKSAhPT0gbnVsbFwiXG4gICAgICAgIChyZXNwb25zZSk9XCJvbkNoYXRSZXNwb25zZSgkZXZlbnQpXCI+XG4gICAgPC9mcy1haS1jaGF0PlxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInJlc2l6ZXJcIlxuICAgICAgICAocG9pbnRlcmRvd24pPVwib25SZXNpemVTdGFydCgkZXZlbnQpXCI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidmlld2VyIGZzLWZsZXggZnMtY29sdW1uXCI+XG4gICAgICBAaWYgKHJlcG9ydCgpKSB7XG4gICAgICAgIDxhcHAtcmVwb3J0LWNhbnZhc1xuICAgICAgICAgICAgW3JlcG9ydF09XCJyZXBvcnQoKVwiXG4gICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgICAgICBbcGFnZUlkXT1cInBhZ2VJZCgpXCJcbiAgICAgICAgICAgIChjb21wb25lbnRTZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncygkZXZlbnQpXCJcbiAgICAgICAgICAgIChyZXBvcnRDaGFuZ2VkKT1cIm9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlZCk9XCJvbkNhbnZhc1BhZ2VDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgPC9hcHAtcmVwb3J0LWNhbnZhcz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==