@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,43 +1,27 @@
1
1
  import { HttpContext } from '@angular/common/http';
2
2
  import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { DisplayApiError, ProcessApiError } from '@firestitch/api';
4
+ import { DisplayApiError } from '@firestitch/api';
5
5
  import { FsMessage } from '@firestitch/message';
6
6
  import { EMPTY, of } from 'rxjs';
7
- import { catchError, map, switchMap, tap } from 'rxjs/operators';
7
+ import { catchError, map, tap } from 'rxjs/operators';
8
8
  import { ReportData } from '../data/report.data';
9
- import { listSortTerms } from '../list-config';
10
- import { URL_TOO_LONG_MESSAGE, hasReportUrlState, paramsToViewConfig, readReportUrlLink, reportParamsToClear, urlValueNames, viewConfigToParams, } from '../report-url-state';
11
- import { REPORT_VIEW_CONFIG_VERSION, VIEW_NOT_AVAILABLE_MESSAGE, toStoredGroupValue, viewConfigDiff, viewDroppedCount, viewDroppedMessage, withStoredKeys, } from '../report-view-config';
9
+ import { viewDroppedCount, viewDroppedMessage, withStoredKeys } from '../report-view-config';
12
10
  import { ReportFilterStateService } from './report-filter-state.service';
13
11
  import * as i0 from "@angular/core";
14
12
  // The open report's saved views, per open report beside the state service:
15
13
  // the list the viewer may see, the view that is open, the order a report
16
- // opens in, the calls that change a view, and the link the screen writes.
17
- // The viewer state stays ReportFilterStateService's: this service puts a
18
- // view on screen through apply() and reads the screen through snapshot(),
19
- // base and viewChanged. Nothing here runs for a report whose server does not
20
- // list 'views' (serves()); such a report keeps the link it always had.
14
+ // opens in and the calls that change a view. The viewer state stays
15
+ // ReportFilterStateService's: this service puts a view on screen through
16
+ // apply() and reads the screen through snapshot(), base and viewChanged.
17
+ // Nothing here runs for a report whose server does not list 'views'
18
+ // (serves()). A view is opened from the Views menu only: a report keeps no
19
+ // state in the browser URL, so there is no link to a view.
21
20
  //
22
21
  // The order a report opens in (open(), on its first load only):
23
- // 1. A link that carries state (any owned key, match or rv). rv names the shared
24
- // view it is a diff from; one the viewer cannot open leaves the diff on
25
- // the report's defaults, with a note. rpv never changes the screen: when
26
- // the viewer owns that view it is the open view, and the screen is
27
- // compared with it. The tiles wait for that one view only; the list loads
28
- // behind them. A link with rpv and no state (the owner's view was open on
29
- // the report's defaults) is a link for the owner only; for anyone else
30
- // it is no link.
31
- // 2. Else the viewer's default view.
32
- // 3. Else the report's authored defaults.
33
- // A page in the link beats a view's page.
34
- //
35
- // The link (urlParams): while a shared view is open, rv and what differs
36
- // from it; while one of the viewer's own views is open, or when the screen
37
- // went back to something a link cannot say on top of the shared view (see
38
- // viewConfigDiff), everything that differs from the report's defaults, and
39
- // rpv when the viewer owns the open view. Sharing the open view, or no
40
- // longer sharing it, writes the link again.
22
+ // 1. The viewer's default view.
23
+ // 2. Else the report's authored defaults.
24
+ // A ?page= the report opened with beats the default view's page.
41
25
  export class ReportViewService {
42
26
  // The views the viewer may see, names and flags only: its own first, then
43
27
  // the ones others share. Empty until the list is read.
@@ -58,42 +42,24 @@ export class ReportViewService {
58
42
  _openView = signal(null);
59
43
  // The report the views belong to.
60
44
  _reportId = null;
61
- // The note that the screen is too long for a link shows once per report.
62
- _tooLongShown = false;
63
45
  // Whether the open report's server keeps saved views.
64
46
  serves(report) {
65
47
  return !!report?.viewerFeatures?.includes('views');
66
48
  }
67
49
  // A report's first load, in the open order above: the state service is
68
- // set up for `report` (init) and the screen opened on a link (`params`,
69
- // the URL's query params), a default view or the report's defaults.
70
- // `pageId` is the page the link names, which beats a view's page. Ends
71
- // once the screen is set; the list may still be loading behind it.
72
- open(report, params, pageId) {
50
+ // set up for `report` (init) once the list is read, and the screen opened
51
+ // on the viewer's default view, else on the report's defaults. `pageId` is
52
+ // the ?page= the report opened with, which beats the view's page. Ends once
53
+ // the screen is set.
54
+ open(report, pageId) {
73
55
  this._start(report);
74
- const page = pageId ? { v: REPORT_VIEW_CONFIG_VERSION, pageId } : null;
75
- const link = readReportUrlLink(params);
76
- const state = hasReportUrlState(params, report.filterGroups ?? []);
77
- if (!state && !link.personalViewId) {
78
- return this._openDefault(report, page);
79
- }
80
- const linkDiff = { ...paramsToViewConfig(params, report.filterGroups ?? []), ...page };
81
- const viewId = link.viewId ?? link.personalViewId;
82
- return (viewId ? this._readView(report.id, viewId) : of(null))
83
- .pipe(switchMap((view) => {
84
- // A link that names only a personal view (its screen was the
85
- // report's defaults) is the owner's link; for anyone else it says
86
- // nothing, and the report opens as it would with no link.
87
- if (!state && !view?.mine) {
88
- return this._openDefault(report, page);
89
- }
56
+ return this._readViews(report)
57
+ .pipe(tap((list) => {
90
58
  this._filterState.init(report);
91
- this._openLink(link, view, linkDiff);
92
- this._readViews(report)
93
- .pipe(takeUntilDestroyed(this._destroyRef))
94
- .subscribe();
95
- return of(undefined);
96
- }));
59
+ if (list?.myDefault) {
60
+ this._openOn(list.myDefault, () => this._filterState.apply(list.myDefault.config, pageId));
61
+ }
62
+ }), map(() => undefined));
97
63
  }
98
64
  // A later load of the open report (a chat edit, a settings save): the
99
65
  // screen and the open view stay, and the list is read again behind them so
@@ -166,20 +132,6 @@ export class ReportViewService {
166
132
  this._message.success('View deleted');
167
133
  }));
168
134
  }
169
- // The query params that make the URL carry the screen (see the class
170
- // comment), spread over the owned keys `current` carries so the ones the
171
- // screen no longer needs are removed. The host adds its page key.
172
- // A select's value is named by `name`, else by the name `current` carries
173
- // for it.
174
- urlParams(current, name = () => null) {
175
- const currentName = urlValueNames(current, this._reportGroups());
176
- const write = this._linkWrite((groupId, value) => name(groupId, value) ?? currentName(groupId, value));
177
- if (write.tooLong && !this._tooLongShown) {
178
- this._tooLongShown = true;
179
- this._message.warning(URL_TOO_LONG_MESSAGE);
180
- }
181
- return { ...reportParamsToClear(current, this._reportGroups()), ...write.params };
182
- }
183
135
  // Starts over for another report: no list and no open view.
184
136
  _start(report) {
185
137
  if (report.id === this._reportId) {
@@ -189,35 +141,6 @@ export class ReportViewService {
189
141
  this._views.set([]);
190
142
  this._canShare.set(false);
191
143
  this._openView.set(null);
192
- this._tooLongShown = false;
193
- }
194
- // No link: the viewer's default view, else the report's defaults, once the
195
- // list is read.
196
- _openDefault(report, page) {
197
- return this._readViews(report)
198
- .pipe(tap((list) => {
199
- this._filterState.init(report);
200
- if (list?.myDefault) {
201
- this._openOn(list.myDefault, () => this._filterState.apply(list.myDefault.config, page));
202
- }
203
- }), map(() => undefined));
204
- }
205
- // A link with state: on the shared view rv names, else on the report's
206
- // defaults; rpv's view is the open view only when the viewer owns it.
207
- _openLink(link, view, linkDiff) {
208
- if (link.viewId && view) {
209
- this._openOn(view, () => this._filterState.apply(view.config, linkDiff));
210
- return;
211
- }
212
- if (!link.viewId && view?.mine) {
213
- this._openOn(view, () => this._filterState.apply(null, linkDiff, view.config));
214
- return;
215
- }
216
- this._openView.set(null);
217
- this._filterState.apply(null, linkDiff);
218
- if (link.viewId) {
219
- this._message.warning(VIEW_NOT_AVAILABLE_MESSAGE);
220
- }
221
144
  }
222
145
  // Makes `view` the open view, puts it on screen (`applyView`), and says
223
146
  // how many of its settings no longer apply (and to save it, when the
@@ -231,9 +154,7 @@ export class ReportViewService {
231
154
  }
232
155
  }
233
156
  // Runs a change on the open view and takes its answer as the open view
234
- // and its row in the list. A change of who may see the view (shared, or
235
- // whose it is) changes the key a link names it by, so the URL is written
236
- // again.
157
+ // and its row in the list.
237
158
  _changeOpen(change) {
238
159
  const open = this._openView();
239
160
  if (!open) {
@@ -243,9 +164,6 @@ export class ReportViewService {
243
164
  .pipe(tap((view) => {
244
165
  this._openView.set(view);
245
166
  this._putRow(view);
246
- if (view.shared !== open.shared || view.mine !== open.mine) {
247
- this._filterState.rewriteUrl();
248
- }
249
167
  }));
250
168
  }
251
169
  // A view's row in the list, replaced or added. A new default clears the
@@ -277,64 +195,6 @@ export class ReportViewService {
277
195
  }
278
196
  }));
279
197
  }
280
- // A view a link names; null when the viewer cannot open it. The server
281
- // answers 'View not found' for one it cannot see, which must not move the
282
- // host to its not-found page.
283
- _readView(reportId, reportViewId) {
284
- return this._reportData.view(reportId, reportViewId, { context: new HttpContext().set(ProcessApiError, false) })
285
- .pipe(catchError(() => of(null)));
286
- }
287
- // The params the screen writes (see the class comment).
288
- _linkWrite(name) {
289
- const open = this._openView();
290
- const screen = this._filterState.snapshot();
291
- const authored = this._filterState.authoredConfig();
292
- const authoredSort = (componentId) => this._authoredSort(componentId);
293
- if (open?.shared) {
294
- // A group the view holds that the base let go of (its authored default
295
- // changed while the view was open, and the screen took the new one)
296
- // is still the view's value when a link opens the view, so it is
297
- // compared with that value and written when the screen differs.
298
- const base = this._filterState.base();
299
- const linkBase = { ...base, groups: { ...open.config?.groups, ...base.groups } };
300
- const diff = viewConfigDiff(linkBase, screen, authored, authoredSort);
301
- if (diff) {
302
- return viewConfigToParams(this._linkDays(diff), this._reportGroups(), { viewId: open.id }, name);
303
- }
304
- }
305
- const full = viewConfigDiff(authored, screen, authored, authoredSort) ?? screen;
306
- const link = open?.mine ? { personalViewId: open.id } : {};
307
- return viewConfigToParams(this._linkDays(full), this._reportGroups(), link, name);
308
- }
309
- // `config` with each rolling range (a relative name, which a view keeps) as
310
- // the days it gives today in the report's zone: a link carries days, never a
311
- // preset name. A name the report does not know is left as it is, and the
312
- // link leaves that group out.
313
- _linkDays(config) {
314
- if (!config.groups) {
315
- return config;
316
- }
317
- const groups = Object.entries(config.groups)
318
- .map(([groupId, value]) => [groupId, this._groupDays(value)]);
319
- return { ...config, groups: Object.fromEntries(groups) };
320
- }
321
- _groupDays(value) {
322
- const range = value?.relative ? this._filterState.resolveRelative(value.relative) : null;
323
- return range ? toStoredGroupValue('dateRange', { start: range.start, end: range.end }) : value;
324
- }
325
- // Every filter group of the open report: the link keys each by its label.
326
- _reportGroups() {
327
- return this._filterState.report()?.filterGroups ?? [];
328
- }
329
- // A list's authored first sort term, or null for any other component.
330
- _authoredSort(componentId) {
331
- const report = this._filterState.report();
332
- const component = [
333
- ...(report?.pages ?? []).flatMap((page) => page.components ?? []),
334
- ...(report?.master?.components ?? []),
335
- ].find((candidate) => candidate.id === componentId);
336
- return component?.type === 'list' ? listSortTerms(component.config)[0] ?? null : null;
337
- }
338
198
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
339
199
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService });
340
200
  }
@@ -355,4 +215,4 @@ function viewSummary(view) {
355
215
  modifyDate: view.modifyDate,
356
216
  };
357
217
  }
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9zZXJ2aWNlcy9yZXBvcnQtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBV2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQ25HLGFBQWEsRUFBRSxrQkFBa0IsR0FDbEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUM1RyxrQkFBa0IsRUFBRSxjQUFjLEdBQ25DLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBR3pFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsMEVBQTBFO0FBQzFFLHlFQUF5RTtBQUN6RSwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLHVFQUF1RTtBQUN2RSxFQUFFO0FBQ0YsZ0VBQWdFO0FBQ2hFLGlGQUFpRjtBQUNqRiwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLHNFQUFzRTtBQUN0RSw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSxvQkFBb0I7QUFDcEIscUNBQXFDO0FBQ3JDLDBDQUEwQztBQUMxQywwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSx1RUFBdUU7QUFDdkUsNENBQTRDO0FBRTVDLE1BQU0sT0FBTyxpQkFBaUI7SUFFNUIsMEVBQTBFO0lBQzFFLHVEQUF1RDtJQUN2QyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRXRELGdEQUFnRDtJQUNoQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRTVELHlFQUF5RTtJQUN6RSxzQ0FBc0M7SUFDdEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUU1RCx1RUFBdUU7SUFDdkQsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUU1RixXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNoRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakMsTUFBTSxHQUFHLE1BQU0sQ0FBc0IsRUFBRSxDQUFDLENBQUM7SUFDekMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixTQUFTLEdBQUcsTUFBTSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUVwRCxrQ0FBa0M7SUFDMUIsU0FBUyxHQUFrQixJQUFJLENBQUM7SUFFeEMseUVBQXlFO0lBQ2pFLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFOUIsc0RBQXNEO0lBQy9DLE1BQU0sQ0FBQyxNQUFxQjtRQUNqQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSxvRUFBb0U7SUFDcEUsdUVBQXVFO0lBQ3ZFLG1FQUFtRTtJQUM1RCxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxNQUFxQjtRQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxHQUE0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEcsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBcUIsRUFBRSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDekcsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWxELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzNELElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqQiw2REFBNkQ7WUFDN0Qsa0VBQWtFO1lBQ2xFLDBEQUEwRDtZQUMxRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUMxQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7aUJBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzFDLFNBQVMsRUFBRSxDQUFDO1lBRWYsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsMkVBQTJFO0lBQzNFLHNDQUFzQztJQUMvQixPQUFPLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDMUMsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELDZEQUE2RDtJQUN0RCxJQUFJLENBQUMsWUFBb0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQzthQUN2RCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUM5RSxDQUFDO0lBQ04sQ0FBQztJQUVELHFFQUFxRTtJQUM5RCxZQUFZO1FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsb0RBQW9EO0lBQzdDLFNBQVMsQ0FBQyxJQUFzQztRQUNyRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO2FBQ2xHLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELHlFQUF5RTtJQUN6RSw2QkFBNkI7SUFDdEIsV0FBVztRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDL0gsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRU0sTUFBTSxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ2pFLEtBQUssQ0FBQyxNQUFlO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBRUQsNEVBQTRFO0lBQ3JFLFVBQVUsQ0FBQyxlQUF3QjtRQUN4QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSw0QkFBNEI7SUFDckIsVUFBVTtRQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUN4RCxJQUFJLENBQ0gsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRCxxRUFBcUU7SUFDckUseUVBQXlFO0lBQ3pFLGtFQUFrRTtJQUNsRSwwRUFBMEU7SUFDMUUsVUFBVTtJQUNILFNBQVMsQ0FBQyxPQUFpQixFQUFFLE9BQTJCLEdBQUcsRUFBRSxDQUFDLElBQUk7UUFDdkUsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFdkcsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sRUFBRSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwRixDQUFDO0lBRUQsNERBQTREO0lBQ3BELE1BQU0sQ0FBQyxNQUFjO1FBQzNCLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxnQkFBZ0I7SUFDUixZQUFZLENBQUMsTUFBYyxFQUFFLElBQTZCO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDM0IsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsSUFBSSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNGLENBQUM7UUFDSCxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQ3JCLENBQUM7SUFDTixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLHNFQUFzRTtJQUM5RCxTQUFTLENBQUMsSUFBbUIsRUFBRSxJQUF1QixFQUFFLFFBQTBCO1FBQ3hGLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFekUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUUvRSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHFFQUFxRTtJQUNyRSxlQUFlO0lBQ1AsT0FBTyxDQUFDLElBQWdCLEVBQUUsU0FBcUI7UUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsU0FBUyxFQUFFLENBQUM7UUFFWixNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUN6RSxTQUFTO0lBQ0QsV0FBVyxDQUFDLE1BQXdEO1FBQzFFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQ25CLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUsU0FBUztJQUNELE9BQU8sQ0FBQyxJQUFnQjtRQUM5QixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFMUQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyRSxPQUFPLFFBQVEsR0FBRyxDQUFDO2dCQUNqQixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUM7Z0JBQ3BCLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxvREFBb0Q7SUFDNUMsVUFBVSxDQUFDLE1BQWM7UUFDL0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ2pHLElBQUksQ0FDSCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1gsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLDBFQUEwRTtJQUMxRSw4QkFBOEI7SUFDdEIsU0FBUyxDQUFDLFFBQWdCLEVBQUUsWUFBb0I7UUFDdEQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQzdHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsd0RBQXdEO0lBQ2hELFVBQVUsQ0FBQyxJQUF3QjtRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5RSxJQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNqQix1RUFBdUU7WUFDdkUsb0VBQW9FO1lBQ3BFLGlFQUFpRTtZQUNqRSxnRUFBZ0U7WUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFFBQVEsR0FBcUIsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDbkcsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRXRFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkcsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDO1FBRWhGLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTNELE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUN6RSw4QkFBOEI7SUFDdEIsU0FBUyxDQUFDLE1BQXdCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUN6QyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEUsT0FBTyxFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFnQztRQUNqRCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUV6RixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakcsQ0FBQztJQUVELDBFQUEwRTtJQUNsRSxhQUFhO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsYUFBYSxDQUFDLFdBQW1CO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUc7WUFDaEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUNqRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO1NBQ3RDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBRXBELE9BQU8sU0FBUyxFQUFFLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEYsQ0FBQzt3R0ExWFUsaUJBQWlCOzRHQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7O0FBK1hYLGlFQUFpRTtBQUNqRSxTQUFTLFdBQVcsQ0FBQyxJQUFnQjtJQUNuQyxPQUFPO1FBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtRQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztRQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7S0FDNUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IERlc3Ryb3lSZWYsIEluamVjdGFibGUsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgUGFyYW1NYXAsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciwgUHJvY2Vzc0FwaUVycm9yIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydFVybExpbmsgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC11cmwtbGluay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VXJsVmFsdWVOYW1lIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdXJsLXZhbHVlLW5hbWUudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRVcmxXcml0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXVybC13cml0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0NvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3Q3JlYXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlldy1jcmVhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdEZWxldGVkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlldy1kZWxldGVkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3U3VtbWFyeSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctc3VtbWFyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VmlldyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlld3MuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbHRlckdyb3VwRGVmYXVsdCwgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0U29ydCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHtcbiAgVVJMX1RPT19MT05HX01FU1NBR0UsIGhhc1JlcG9ydFVybFN0YXRlLCBwYXJhbXNUb1ZpZXdDb25maWcsIHJlYWRSZXBvcnRVcmxMaW5rLCByZXBvcnRQYXJhbXNUb0NsZWFyLFxuICB1cmxWYWx1ZU5hbWVzLCB2aWV3Q29uZmlnVG9QYXJhbXMsXG59IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuaW1wb3J0IHtcbiAgUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIFZJRVdfTk9UX0FWQUlMQUJMRV9NRVNTQUdFLCB0b1N0b3JlZEdyb3VwVmFsdWUsIHZpZXdDb25maWdEaWZmLCB2aWV3RHJvcHBlZENvdW50LFxuICB2aWV3RHJvcHBlZE1lc3NhZ2UsIHdpdGhTdG9yZWRLZXlzLFxufSBmcm9tICcuLi9yZXBvcnQtdmlldy1jb25maWcnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbi8vIFRoZSBvcGVuIHJlcG9ydCdzIHNhdmVkIHZpZXdzLCBwZXIgb3BlbiByZXBvcnQgYmVzaWRlIHRoZSBzdGF0ZSBzZXJ2aWNlOlxuLy8gdGhlIGxpc3QgdGhlIHZpZXdlciBtYXkgc2VlLCB0aGUgdmlldyB0aGF0IGlzIG9wZW4sIHRoZSBvcmRlciBhIHJlcG9ydFxuLy8gb3BlbnMgaW4sIHRoZSBjYWxscyB0aGF0IGNoYW5nZSBhIHZpZXcsIGFuZCB0aGUgbGluayB0aGUgc2NyZWVuIHdyaXRlcy5cbi8vIFRoZSB2aWV3ZXIgc3RhdGUgc3RheXMgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlJ3M6IHRoaXMgc2VydmljZSBwdXRzIGFcbi8vIHZpZXcgb24gc2NyZWVuIHRocm91Z2ggYXBwbHkoKSBhbmQgcmVhZHMgdGhlIHNjcmVlbiB0aHJvdWdoIHNuYXBzaG90KCksXG4vLyBiYXNlIGFuZCB2aWV3Q2hhbmdlZC4gTm90aGluZyBoZXJlIHJ1bnMgZm9yIGEgcmVwb3J0IHdob3NlIHNlcnZlciBkb2VzIG5vdFxuLy8gbGlzdCAndmlld3MnIChzZXJ2ZXMoKSk7IHN1Y2ggYSByZXBvcnQga2VlcHMgdGhlIGxpbmsgaXQgYWx3YXlzIGhhZC5cbi8vXG4vLyBUaGUgb3JkZXIgYSByZXBvcnQgb3BlbnMgaW4gKG9wZW4oKSwgb24gaXRzIGZpcnN0IGxvYWQgb25seSk6XG4vLyAxLiBBIGxpbmsgdGhhdCBjYXJyaWVzIHN0YXRlIChhbnkgb3duZWQga2V5LCBtYXRjaCBvciBydikuIHJ2IG5hbWVzIHRoZSBzaGFyZWRcbi8vICAgIHZpZXcgaXQgaXMgYSBkaWZmIGZyb207IG9uZSB0aGUgdmlld2VyIGNhbm5vdCBvcGVuIGxlYXZlcyB0aGUgZGlmZiBvblxuLy8gICAgdGhlIHJlcG9ydCdzIGRlZmF1bHRzLCB3aXRoIGEgbm90ZS4gcnB2IG5ldmVyIGNoYW5nZXMgdGhlIHNjcmVlbjogd2hlblxuLy8gICAgdGhlIHZpZXdlciBvd25zIHRoYXQgdmlldyBpdCBpcyB0aGUgb3BlbiB2aWV3LCBhbmQgdGhlIHNjcmVlbiBpc1xuLy8gICAgY29tcGFyZWQgd2l0aCBpdC4gVGhlIHRpbGVzIHdhaXQgZm9yIHRoYXQgb25lIHZpZXcgb25seTsgdGhlIGxpc3QgbG9hZHNcbi8vICAgIGJlaGluZCB0aGVtLiBBIGxpbmsgd2l0aCBycHYgYW5kIG5vIHN0YXRlICh0aGUgb3duZXIncyB2aWV3IHdhcyBvcGVuIG9uXG4vLyAgICB0aGUgcmVwb3J0J3MgZGVmYXVsdHMpIGlzIGEgbGluayBmb3IgdGhlIG93bmVyIG9ubHk7IGZvciBhbnlvbmUgZWxzZVxuLy8gICAgaXQgaXMgbm8gbGluay5cbi8vIDIuIEVsc2UgdGhlIHZpZXdlcidzIGRlZmF1bHQgdmlldy5cbi8vIDMuIEVsc2UgdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzLlxuLy8gQSBwYWdlIGluIHRoZSBsaW5rIGJlYXRzIGEgdmlldydzIHBhZ2UuXG4vL1xuLy8gVGhlIGxpbmsgKHVybFBhcmFtcyk6IHdoaWxlIGEgc2hhcmVkIHZpZXcgaXMgb3BlbiwgcnYgYW5kIHdoYXQgZGlmZmVyc1xuLy8gZnJvbSBpdDsgd2hpbGUgb25lIG9mIHRoZSB2aWV3ZXIncyBvd24gdmlld3MgaXMgb3Blbiwgb3Igd2hlbiB0aGUgc2NyZWVuXG4vLyB3ZW50IGJhY2sgdG8gc29tZXRoaW5nIGEgbGluayBjYW5ub3Qgc2F5IG9uIHRvcCBvZiB0aGUgc2hhcmVkIHZpZXcgKHNlZVxuLy8gdmlld0NvbmZpZ0RpZmYpLCBldmVyeXRoaW5nIHRoYXQgZGlmZmVycyBmcm9tIHRoZSByZXBvcnQncyBkZWZhdWx0cywgYW5kXG4vLyBycHYgd2hlbiB0aGUgdmlld2VyIG93bnMgdGhlIG9wZW4gdmlldy4gU2hhcmluZyB0aGUgb3BlbiB2aWV3LCBvciBub1xuLy8gbG9uZ2VyIHNoYXJpbmcgaXQsIHdyaXRlcyB0aGUgbGluayBhZ2Fpbi5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRWaWV3U2VydmljZSB7XG5cbiAgLy8gVGhlIHZpZXdzIHRoZSB2aWV3ZXIgbWF5IHNlZSwgbmFtZXMgYW5kIGZsYWdzIG9ubHk6IGl0cyBvd24gZmlyc3QsIHRoZW5cbiAgLy8gdGhlIG9uZXMgb3RoZXJzIHNoYXJlLiBFbXB0eSB1bnRpbCB0aGUgbGlzdCBpcyByZWFkLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld3MgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl92aWV3cygpKTtcblxuICAvLyBUaGUgdmlld2VyIG1heSBzaGFyZSBpdHMgdmlld3Mgd2l0aCBldmVyeW9uZS5cbiAgcHVibGljIHJlYWRvbmx5IGNhblNoYXJlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fY2FuU2hhcmUoKSk7XG5cbiAgLy8gVGhlIG9wZW4gdmlldywgd2l0aCBpdHMgY29uZmlnIGFzIGl0IHdhcyByZWFkIG9yIHNhdmVkOyBudWxsIHdoaWxlIHRoZVxuICAvLyBzY3JlZW4gaXMgb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICBwdWJsaWMgcmVhZG9ubHkgb3BlblZpZXcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9vcGVuVmlldygpKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIHRoZSBvcGVuIHZpZXc7IGZhbHNlIHdpdGggbm9uZSBvcGVuLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld0NoYW5nZWQgPSBjb21wdXRlZCgoKSA9PiAhIXRoaXMuX29wZW5WaWV3KCkgJiYgdGhpcy5fZmlsdGVyU3RhdGUudmlld0NoYW5nZWQoKSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgX3ZpZXdzID0gc2lnbmFsPFJlcG9ydFZpZXdTdW1tYXJ5W10+KFtdKTtcbiAgcHJpdmF0ZSBfY2FuU2hhcmUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9vcGVuVmlldyA9IHNpZ25hbDxSZXBvcnRWaWV3IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGUgdmlld3MgYmVsb25nIHRvLlxuICBwcml2YXRlIF9yZXBvcnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIG5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIHRvbyBsb25nIGZvciBhIGxpbmsgc2hvd3Mgb25jZSBwZXIgcmVwb3J0LlxuICBwcml2YXRlIF90b29Mb25nU2hvd24gPSBmYWxzZTtcblxuICAvLyBXaGV0aGVyIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBrZWVwcyBzYXZlZCB2aWV3cy5cbiAgcHVibGljIHNlcnZlcyhyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFyZXBvcnQ/LnZpZXdlckZlYXR1cmVzPy5pbmNsdWRlcygndmlld3MnKTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0J3MgZmlyc3QgbG9hZCwgaW4gdGhlIG9wZW4gb3JkZXIgYWJvdmU6IHRoZSBzdGF0ZSBzZXJ2aWNlIGlzXG4gIC8vIHNldCB1cCBmb3IgYHJlcG9ydGAgKGluaXQpIGFuZCB0aGUgc2NyZWVuIG9wZW5lZCBvbiBhIGxpbmsgKGBwYXJhbXNgLFxuICAvLyB0aGUgVVJMJ3MgcXVlcnkgcGFyYW1zKSwgYSBkZWZhdWx0IHZpZXcgb3IgdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICAvLyBgcGFnZUlkYCBpcyB0aGUgcGFnZSB0aGUgbGluayBuYW1lcywgd2hpY2ggYmVhdHMgYSB2aWV3J3MgcGFnZS4gRW5kc1xuICAvLyBvbmNlIHRoZSBzY3JlZW4gaXMgc2V0OyB0aGUgbGlzdCBtYXkgc3RpbGwgYmUgbG9hZGluZyBiZWhpbmQgaXQuXG4gIHB1YmxpYyBvcGVuKHJlcG9ydDogUmVwb3J0LCBwYXJhbXM6IFBhcmFtcywgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RhcnQocmVwb3J0KTtcbiAgICBjb25zdCBwYWdlOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCA9IHBhZ2VJZCA/IHsgdjogUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIHBhZ2VJZCB9IDogbnVsbDtcbiAgICBjb25zdCBsaW5rID0gcmVhZFJlcG9ydFVybExpbmsocGFyYW1zKTtcbiAgICBjb25zdCBzdGF0ZSA9IGhhc1JlcG9ydFVybFN0YXRlKHBhcmFtcywgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSk7XG5cbiAgICBpZiAoIXN0YXRlICYmICFsaW5rLnBlcnNvbmFsVmlld0lkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb3BlbkRlZmF1bHQocmVwb3J0LCBwYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5rRGlmZjogUmVwb3J0Vmlld0NvbmZpZyA9IHsgLi4ucGFyYW1zVG9WaWV3Q29uZmlnKHBhcmFtcywgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSksIC4uLnBhZ2UgfTtcbiAgICBjb25zdCB2aWV3SWQgPSBsaW5rLnZpZXdJZCA/PyBsaW5rLnBlcnNvbmFsVmlld0lkO1xuXG4gICAgcmV0dXJuICh2aWV3SWQgPyB0aGlzLl9yZWFkVmlldyhyZXBvcnQuaWQsIHZpZXdJZCkgOiBvZihudWxsKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHZpZXcpID0+IHtcbiAgICAgICAgICAvLyBBIGxpbmsgdGhhdCBuYW1lcyBvbmx5IGEgcGVyc29uYWwgdmlldyAoaXRzIHNjcmVlbiB3YXMgdGhlXG4gICAgICAgICAgLy8gcmVwb3J0J3MgZGVmYXVsdHMpIGlzIHRoZSBvd25lcidzIGxpbms7IGZvciBhbnlvbmUgZWxzZSBpdCBzYXlzXG4gICAgICAgICAgLy8gbm90aGluZywgYW5kIHRoZSByZXBvcnQgb3BlbnMgYXMgaXQgd291bGQgd2l0aCBubyBsaW5rLlxuICAgICAgICAgIGlmICghc3RhdGUgJiYgIXZpZXc/Lm1pbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuRGVmYXVsdChyZXBvcnQsIHBhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICB0aGlzLl9vcGVuTGluayhsaW5rLCB2aWV3LCBsaW5rRGlmZik7XG4gICAgICAgICAgdGhpcy5fcmVhZFZpZXdzKHJlcG9ydClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIGxhdGVyIGxvYWQgb2YgdGhlIG9wZW4gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBzZXR0aW5ncyBzYXZlKTogdGhlXG4gIC8vIHNjcmVlbiBhbmQgdGhlIG9wZW4gdmlldyBzdGF5LCBhbmQgdGhlIGxpc3QgaXMgcmVhZCBhZ2FpbiBiZWhpbmQgdGhlbSBzb1xuICAvLyBpdCBuYW1lcyB3aGF0IHRoZSBzZXJ2ZXIgaG9sZHMgbm93LlxuICBwdWJsaWMgcmVmcmVzaChyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXJ0KHJlcG9ydCk7XG4gICAgdGhpcy5fcmVhZFZpZXdzKHJlcG9ydClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIE9wZW5zIGEgdmlldyBwaWNrZWQgZnJvbSB0aGUgbGlzdDsgaXRzIGNvbmZpZyBpcyByZWFkIG5vdy5cbiAgcHVibGljIHBpY2socmVwb3J0Vmlld0lkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh2aWV3KSA9PiB0aGlzLl9vcGVuT24odmlldywgKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuYXBwbHkodmlldy5jb25maWcpKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQ2xvc2VzIHRoZSBvcGVuIHZpZXcgYW5kIHB1dHMgdGhlIHNjcmVlbiBvbiB0aGUgcmVwb3J0J3MgZGVmYXVsdHMuXG4gIHB1YmxpYyBvcGVuRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KG51bGwpO1xuICB9XG5cbiAgLy8gU2F2ZXMgdGhlIHNjcmVlbiBhcyBhIG5ldyB2aWV3LCB3aGljaCBiZWNvbWVzIHRoZSBvcGVuIHZpZXcuIFRoZSBzY3JlZW5cbiAgLy8gaXMgYWxyZWFkeSB0aGUgdmlldywgc28gbm90aGluZyBpcyBhcHBsaWVkIGFnYWluLlxuICBwdWJsaWMgc2F2ZUFzTmV3KHZpZXc6IE9taXQ8UmVwb3J0Vmlld0NyZWF0ZSwgJ2NvbmZpZyc+KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgeyAuLi52aWV3LCBjb25maWc6IHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHNhdmVkKSA9PiB7XG4gICAgICAgICAgdGhpcy5fb3BlblZpZXcuc2V0KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9wdXRSb3coc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEJhc2VUb1NjcmVlbigpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnVmlldyBzYXZlZCcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBTYXZlcyB0aGUgc2NyZWVuIG92ZXIgdGhlIG9wZW4gdmlldywga2VlcGluZyB0aGUga2V5cyB0aGlzIHZpZXdlciBkb2VzXG4gIC8vIG5vdCBrbm93ICh3aXRoU3RvcmVkS2V5cykuXG4gIHB1YmxpYyBzYXZlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICBjb25zdCBvcGVuID0gdGhpcy5fb3BlblZpZXcoKTtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVWaWV3KHRoaXMuX3JlcG9ydElkLCBvcGVuLmlkLCB7IGNvbmZpZzogd2l0aFN0b3JlZEtleXMob3Blbi5jb25maWcsIHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCkpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChzYXZlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRCYXNlVG9TY3JlZW4oKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgc2F2ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlT3BlbigocmVwb3J0Vmlld0lkKSA9PiB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgeyBuYW1lIH0pKTtcbiAgfVxuXG4gIC8vIFNoYXJlcyB0aGUgb3BlbiB2aWV3IHdpdGggZXZlcnlvbmUgd2hvIG1heSBvcGVuIHRoZSByZXBvcnQsIG9yIHN0b3BzLlxuICBwdWJsaWMgc2hhcmUoc2hhcmVkOiBib29sZWFuKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZU9wZW4oKHJlcG9ydFZpZXdJZCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5zaGFyZVZpZXcodGhpcy5fcmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgc2hhcmVkKSk7XG4gIH1cblxuICAvLyBNYWtlcyB0aGUgb3BlbiB2aWV3IHRoZSB2aWV3ZXIncyBkZWZhdWx0LCBvciBzdG9wcyBvcGVuaW5nIGl0IGJ5IGRlZmF1bHQuXG4gIHB1YmxpYyBzZXREZWZhdWx0KHBlcnNvbmFsRGVmYXVsdDogYm9vbGVhbik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VPcGVuKChyZXBvcnRWaWV3SWQpID0+IHRoaXMuX3JlcG9ydERhdGEuc2V0Vmlld0RlZmF1bHQodGhpcy5fcmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgcGVyc29uYWxEZWZhdWx0KSk7XG4gIH1cblxuICAvLyBEZWxldGVzIHRoZSBvcGVuIHZpZXcuIFRoZSBzY3JlZW4gc3RheXM7IHRoZSByZXBvcnQncyBkZWZhdWx0cyBiZWNvbWVcbiAgLy8gd2hhdCBpdCBpcyBjb21wYXJlZCB3aXRoLlxuICBwdWJsaWMgZGVsZXRlT3BlbigpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXdEZWxldGVkPiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgb3Blbi5pZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLl92aWV3cy51cGRhdGUoKHZpZXdzKSA9PiB2aWV3cy5maWx0ZXIoKHZpZXcpID0+IHZpZXcuaWQgIT09IG9wZW4uaWQpKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jbGVhckJhc2UoKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgZGVsZXRlZCcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgcXVlcnkgcGFyYW1zIHRoYXQgbWFrZSB0aGUgVVJMIGNhcnJ5IHRoZSBzY3JlZW4gKHNlZSB0aGUgY2xhc3NcbiAgLy8gY29tbWVudCksIHNwcmVhZCBvdmVyIHRoZSBvd25lZCBrZXlzIGBjdXJyZW50YCBjYXJyaWVzIHNvIHRoZSBvbmVzIHRoZVxuICAvLyBzY3JlZW4gbm8gbG9uZ2VyIG5lZWRzIGFyZSByZW1vdmVkLiBUaGUgaG9zdCBhZGRzIGl0cyBwYWdlIGtleS5cbiAgLy8gQSBzZWxlY3QncyB2YWx1ZSBpcyBuYW1lZCBieSBgbmFtZWAsIGVsc2UgYnkgdGhlIG5hbWUgYGN1cnJlbnRgIGNhcnJpZXNcbiAgLy8gZm9yIGl0LlxuICBwdWJsaWMgdXJsUGFyYW1zKGN1cnJlbnQ6IFBhcmFtTWFwLCBuYW1lOiBSZXBvcnRVcmxWYWx1ZU5hbWUgPSAoKSA9PiBudWxsKTogUGFyYW1zIHtcbiAgICBjb25zdCBjdXJyZW50TmFtZSA9IHVybFZhbHVlTmFtZXMoY3VycmVudCwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpO1xuICAgIGNvbnN0IHdyaXRlID0gdGhpcy5fbGlua1dyaXRlKChncm91cElkLCB2YWx1ZSkgPT4gbmFtZShncm91cElkLCB2YWx1ZSkgPz8gY3VycmVudE5hbWUoZ3JvdXBJZCwgdmFsdWUpKTtcblxuICAgIGlmICh3cml0ZS50b29Mb25nICYmICF0aGlzLl90b29Mb25nU2hvd24pIHtcbiAgICAgIHRoaXMuX3Rvb0xvbmdTaG93biA9IHRydWU7XG4gICAgICB0aGlzLl9tZXNzYWdlLndhcm5pbmcoVVJMX1RPT19MT05HX01FU1NBR0UpO1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLnJlcG9ydFBhcmFtc1RvQ2xlYXIoY3VycmVudCwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpLCAuLi53cml0ZS5wYXJhbXMgfTtcbiAgfVxuXG4gIC8vIFN0YXJ0cyBvdmVyIGZvciBhbm90aGVyIHJlcG9ydDogbm8gbGlzdCBhbmQgbm8gb3BlbiB2aWV3LlxuICBwcml2YXRlIF9zdGFydChyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGlmIChyZXBvcnQuaWQgPT09IHRoaXMuX3JlcG9ydElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG4gICAgdGhpcy5fdmlld3Muc2V0KFtdKTtcbiAgICB0aGlzLl9jYW5TaGFyZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICB0aGlzLl90b29Mb25nU2hvd24gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vIGxpbms6IHRoZSB2aWV3ZXIncyBkZWZhdWx0IHZpZXcsIGVsc2UgdGhlIHJlcG9ydCdzIGRlZmF1bHRzLCBvbmNlIHRoZVxuICAvLyBsaXN0IGlzIHJlYWQuXG4gIHByaXZhdGUgX29wZW5EZWZhdWx0KHJlcG9ydDogUmVwb3J0LCBwYWdlOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkVmlld3MocmVwb3J0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICBpZiAobGlzdD8ubXlEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuT24obGlzdC5teURlZmF1bHQsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KGxpc3QubXlEZWZhdWx0LmNvbmZpZywgcGFnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEEgbGluayB3aXRoIHN0YXRlOiBvbiB0aGUgc2hhcmVkIHZpZXcgcnYgbmFtZXMsIGVsc2Ugb24gdGhlIHJlcG9ydCdzXG4gIC8vIGRlZmF1bHRzOyBycHYncyB2aWV3IGlzIHRoZSBvcGVuIHZpZXcgb25seSB3aGVuIHRoZSB2aWV3ZXIgb3ducyBpdC5cbiAgcHJpdmF0ZSBfb3BlbkxpbmsobGluazogUmVwb3J0VXJsTGluaywgdmlldzogUmVwb3J0VmlldyB8IG51bGwsIGxpbmtEaWZmOiBSZXBvcnRWaWV3Q29uZmlnKTogdm9pZCB7XG4gICAgaWYgKGxpbmsudmlld0lkICYmIHZpZXcpIHtcbiAgICAgIHRoaXMuX29wZW5Pbih2aWV3LCAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5hcHBseSh2aWV3LmNvbmZpZywgbGlua0RpZmYpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbGluay52aWV3SWQgJiYgdmlldz8ubWluZSkge1xuICAgICAgdGhpcy5fb3Blbk9uKHZpZXcsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KG51bGwsIGxpbmtEaWZmLCB2aWV3LmNvbmZpZykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KG51bGwsIGxpbmtEaWZmKTtcblxuICAgIGlmIChsaW5rLnZpZXdJZCkge1xuICAgICAgdGhpcy5fbWVzc2FnZS53YXJuaW5nKFZJRVdfTk9UX0FWQUlMQUJMRV9NRVNTQUdFKTtcbiAgICB9XG4gIH1cblxuICAvLyBNYWtlcyBgdmlld2AgdGhlIG9wZW4gdmlldywgcHV0cyBpdCBvbiBzY3JlZW4gKGBhcHBseVZpZXdgKSwgYW5kIHNheXNcbiAgLy8gaG93IG1hbnkgb2YgaXRzIHNldHRpbmdzIG5vIGxvbmdlciBhcHBseSAoYW5kIHRvIHNhdmUgaXQsIHdoZW4gdGhlXG4gIC8vIHZpZXdlciBtYXkpLlxuICBwcml2YXRlIF9vcGVuT24odmlldzogUmVwb3J0VmlldywgYXBwbHlWaWV3OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KHZpZXcpO1xuICAgIGFwcGx5VmlldygpO1xuXG4gICAgY29uc3Qgbm90ZSA9IHZpZXdEcm9wcGVkTWVzc2FnZSh2aWV3RHJvcHBlZENvdW50KHZpZXcsIHRoaXMuX2ZpbHRlclN0YXRlLmJhc2UoKSksIHZpZXcuY2FuQ2hhbmdlKTtcbiAgICBpZiAobm90ZSkge1xuICAgICAgdGhpcy5fbWVzc2FnZS53YXJuaW5nKG5vdGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJ1bnMgYSBjaGFuZ2Ugb24gdGhlIG9wZW4gdmlldyBhbmQgdGFrZXMgaXRzIGFuc3dlciBhcyB0aGUgb3BlbiB2aWV3XG4gIC8vIGFuZCBpdHMgcm93IGluIHRoZSBsaXN0LiBBIGNoYW5nZSBvZiB3aG8gbWF5IHNlZSB0aGUgdmlldyAoc2hhcmVkLCBvclxuICAvLyB3aG9zZSBpdCBpcykgY2hhbmdlcyB0aGUga2V5IGEgbGluayBuYW1lcyBpdCBieSwgc28gdGhlIFVSTCBpcyB3cml0dGVuXG4gIC8vIGFnYWluLlxuICBwcml2YXRlIF9jaGFuZ2VPcGVuKGNoYW5nZTogKHJlcG9ydFZpZXdJZDogbnVtYmVyKSA9PiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZShvcGVuLmlkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmlldykgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldCh2aWV3KTtcbiAgICAgICAgICB0aGlzLl9wdXRSb3codmlldyk7XG5cbiAgICAgICAgICBpZiAodmlldy5zaGFyZWQgIT09IG9wZW4uc2hhcmVkIHx8IHZpZXcubWluZSAhPT0gb3Blbi5taW5lKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5yZXdyaXRlVXJsKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIHZpZXcncyByb3cgaW4gdGhlIGxpc3QsIHJlcGxhY2VkIG9yIGFkZGVkLiBBIG5ldyBkZWZhdWx0IGNsZWFycyB0aGVcbiAgLy8gZmxhZyBvbiB0aGUgdmlld2VyJ3Mgb3RoZXIgdmlld3MsIGFzIHRoZSBzZXJ2ZXIgZG9lcy4gQSBuZXcgcm93IGtlZXBzXG4gIC8vIHRoZSBsaXN0J3Mgb3JkZXI6IHRoZSB2aWV3ZXIncyBvd24gdmlld3MgZmlyc3QsIHRoZW4gdGhlIG9uZXMgb3RoZXJzXG4gIC8vIHNoYXJlLlxuICBwcml2YXRlIF9wdXRSb3codmlldzogUmVwb3J0Vmlldyk6IHZvaWQge1xuICAgIGNvbnN0IHN1bW1hcnkgPSB2aWV3U3VtbWFyeSh2aWV3KTtcblxuICAgIHRoaXMuX3ZpZXdzLnVwZGF0ZSgodmlld3MpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSB2aWV3cy5tYXAoKHJvdykgPT4gKHZpZXcucGVyc29uYWxEZWZhdWx0ICYmIHJvdy5wZXJzb25hbERlZmF1bHQgPyB7IC4uLnJvdywgcGVyc29uYWxEZWZhdWx0OiBmYWxzZSB9IDogcm93KSk7XG4gICAgICBjb25zdCBpbmRleCA9IHJvd3MuZmluZEluZGV4KChyb3cpID0+IHJvdy5pZCA9PT0gdmlldy5pZCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93LCBhdCkgPT4gKGF0ID09PSBpbmRleCA/IHN1bW1hcnkgOiByb3cpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3RoZXJzQXQgPSB2aWV3Lm1pbmUgPyByb3dzLmZpbmRJbmRleCgocm93KSA9PiAhcm93Lm1pbmUpIDogLTE7XG5cbiAgICAgIHJldHVybiBvdGhlcnNBdCA8IDBcbiAgICAgICAgPyBbLi4ucm93cywgc3VtbWFyeV1cbiAgICAgICAgOiBbLi4ucm93cy5zbGljZSgwLCBvdGhlcnNBdCksIHN1bW1hcnksIC4uLnJvd3Muc2xpY2Uob3RoZXJzQXQpXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBsaXN0LCByZWFkIGZvciBgcmVwb3J0YDsgbnVsbCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLiBJdHMgYW5zd2VyIGlzXG4gIC8vIGtlcHQgb25seSB3aGlsZSB0aGUgcmVwb3J0IGlzIHN0aWxsIHRoZSBvcGVuIG9uZS5cbiAgcHJpdmF0ZSBfcmVhZFZpZXdzKHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3cyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3cyhyZXBvcnQuaWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ICYmIHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnNldChsaXN0LnZpZXdzID8/IFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2NhblNoYXJlLnNldCghIWxpc3QuY2FuU2hhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSB2aWV3IGEgbGluayBuYW1lczsgbnVsbCB3aGVuIHRoZSB2aWV3ZXIgY2Fubm90IG9wZW4gaXQuIFRoZSBzZXJ2ZXJcbiAgLy8gYW5zd2VycyAnVmlldyBub3QgZm91bmQnIGZvciBvbmUgaXQgY2Fubm90IHNlZSwgd2hpY2ggbXVzdCBub3QgbW92ZSB0aGVcbiAgLy8gaG9zdCB0byBpdHMgbm90LWZvdW5kIHBhZ2UuXG4gIHByaXZhdGUgX3JlYWRWaWV3KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydFZpZXdJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLnZpZXcocmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgeyBjb250ZXh0OiBuZXcgSHR0cENvbnRleHQoKS5zZXQoUHJvY2Vzc0FwaUVycm9yLCBmYWxzZSkgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKTtcbiAgfVxuXG4gIC8vIFRoZSBwYXJhbXMgdGhlIHNjcmVlbiB3cml0ZXMgKHNlZSB0aGUgY2xhc3MgY29tbWVudCkuXG4gIHByaXZhdGUgX2xpbmtXcml0ZShuYW1lOiBSZXBvcnRVcmxWYWx1ZU5hbWUpOiBSZXBvcnRVcmxXcml0ZSB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgY29uc3Qgc2NyZWVuID0gdGhpcy5fZmlsdGVyU3RhdGUuc25hcHNob3QoKTtcbiAgICBjb25zdCBhdXRob3JlZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmF1dGhvcmVkQ29uZmlnKCk7XG4gICAgY29uc3QgYXV0aG9yZWRTb3J0ID0gKGNvbXBvbmVudElkOiBudW1iZXIpID0+IHRoaXMuX2F1dGhvcmVkU29ydChjb21wb25lbnRJZCk7XG5cbiAgICBpZiAob3Blbj8uc2hhcmVkKSB7XG4gICAgICAvLyBBIGdyb3VwIHRoZSB2aWV3IGhvbGRzIHRoYXQgdGhlIGJhc2UgbGV0IGdvIG9mIChpdHMgYXV0aG9yZWQgZGVmYXVsdFxuICAgICAgLy8gY2hhbmdlZCB3aGlsZSB0aGUgdmlldyB3YXMgb3BlbiwgYW5kIHRoZSBzY3JlZW4gdG9vayB0aGUgbmV3IG9uZSlcbiAgICAgIC8vIGlzIHN0aWxsIHRoZSB2aWV3J3MgdmFsdWUgd2hlbiBhIGxpbmsgb3BlbnMgdGhlIHZpZXcsIHNvIGl0IGlzXG4gICAgICAvLyBjb21wYXJlZCB3aXRoIHRoYXQgdmFsdWUgYW5kIHdyaXR0ZW4gd2hlbiB0aGUgc2NyZWVuIGRpZmZlcnMuXG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5fZmlsdGVyU3RhdGUuYmFzZSgpO1xuICAgICAgY29uc3QgbGlua0Jhc2U6IFJlcG9ydFZpZXdDb25maWcgPSB7IC4uLmJhc2UsIGdyb3VwczogeyAuLi5vcGVuLmNvbmZpZz8uZ3JvdXBzLCAuLi5iYXNlLmdyb3VwcyB9IH07XG4gICAgICBjb25zdCBkaWZmID0gdmlld0NvbmZpZ0RpZmYobGlua0Jhc2UsIHNjcmVlbiwgYXV0aG9yZWQsIGF1dGhvcmVkU29ydCk7XG5cbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIHJldHVybiB2aWV3Q29uZmlnVG9QYXJhbXModGhpcy5fbGlua0RheXMoZGlmZiksIHRoaXMuX3JlcG9ydEdyb3VwcygpLCB7IHZpZXdJZDogb3Blbi5pZCB9LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmdWxsID0gdmlld0NvbmZpZ0RpZmYoYXV0aG9yZWQsIHNjcmVlbiwgYXV0aG9yZWQsIGF1dGhvcmVkU29ydCkgPz8gc2NyZWVuO1xuXG4gICAgY29uc3QgbGluayA9IG9wZW4/Lm1pbmUgPyB7IHBlcnNvbmFsVmlld0lkOiBvcGVuLmlkIH0gOiB7fTtcblxuICAgIHJldHVybiB2aWV3Q29uZmlnVG9QYXJhbXModGhpcy5fbGlua0RheXMoZnVsbCksIHRoaXMuX3JlcG9ydEdyb3VwcygpLCBsaW5rLCBuYW1lKTtcbiAgfVxuXG4gIC8vIGBjb25maWdgIHdpdGggZWFjaCByb2xsaW5nIHJhbmdlIChhIHJlbGF0aXZlIG5hbWUsIHdoaWNoIGEgdmlldyBrZWVwcykgYXNcbiAgLy8gdGhlIGRheXMgaXQgZ2l2ZXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmU6IGEgbGluayBjYXJyaWVzIGRheXMsIG5ldmVyIGFcbiAgLy8gcHJlc2V0IG5hbWUuIEEgbmFtZSB0aGUgcmVwb3J0IGRvZXMgbm90IGtub3cgaXMgbGVmdCBhcyBpdCBpcywgYW5kIHRoZVxuICAvLyBsaW5rIGxlYXZlcyB0aGF0IGdyb3VwIG91dC5cbiAgcHJpdmF0ZSBfbGlua0RheXMoY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnKTogUmVwb3J0Vmlld0NvbmZpZyB7XG4gICAgaWYgKCFjb25maWcuZ3JvdXBzKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5lbnRyaWVzKGNvbmZpZy5ncm91cHMpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiBbZ3JvdXBJZCwgdGhpcy5fZ3JvdXBEYXlzKHZhbHVlKV0pO1xuXG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBncm91cHM6IE9iamVjdC5mcm9tRW50cmllcyhncm91cHMpIH07XG4gIH1cblxuICBwcml2YXRlIF9ncm91cERheXModmFsdWU6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwpOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHtcbiAgICBjb25zdCByYW5nZSA9IHZhbHVlPy5yZWxhdGl2ZSA/IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVSZWxhdGl2ZSh2YWx1ZS5yZWxhdGl2ZSkgOiBudWxsO1xuXG4gICAgcmV0dXJuIHJhbmdlID8gdG9TdG9yZWRHcm91cFZhbHVlKCdkYXRlUmFuZ2UnLCB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQgfSkgOiB2YWx1ZTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGZpbHRlciBncm91cCBvZiB0aGUgb3BlbiByZXBvcnQ6IHRoZSBsaW5rIGtleXMgZWFjaCBieSBpdHMgbGFiZWwuXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyU3RhdGUucmVwb3J0KCk/LmZpbHRlckdyb3VwcyA/PyBbXTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIGF1dGhvcmVkIGZpcnN0IHNvcnQgdGVybSwgb3IgbnVsbCBmb3IgYW55IG90aGVyIGNvbXBvbmVudC5cbiAgcHJpdmF0ZSBfYXV0aG9yZWRTb3J0KGNvbXBvbmVudElkOiBudW1iZXIpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZmlsdGVyU3RhdGUucmVwb3J0KCk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gW1xuICAgICAgLi4uKHJlcG9ydD8ucGFnZXMgPz8gW10pLmZsYXRNYXAoKHBhZ2UpID0+IHBhZ2UuY29tcG9uZW50cyA/PyBbXSksXG4gICAgICAuLi4ocmVwb3J0Py5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIF0uZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGNvbXBvbmVudElkKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ/LnR5cGUgPT09ICdsaXN0JyA/IGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCA6IG51bGw7XG4gIH1cbn1cblxuXG4vLyBBIHZpZXcncyByb3cgYXMgdGhlIGxpc3QgaG9sZHMgaXQ6IG5hbWVzIGFuZCBmbGFncywgbm8gY29uZmlnLlxuZnVuY3Rpb24gdmlld1N1bW1hcnkodmlldzogUmVwb3J0Vmlldyk6IFJlcG9ydFZpZXdTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmlldy5pZCxcbiAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgc2hhcmVkOiB2aWV3LnNoYXJlZCxcbiAgICBtaW5lOiB2aWV3Lm1pbmUsXG4gICAgcGVyc29uYWxEZWZhdWx0OiB2aWV3LnBlcnNvbmFsRGVmYXVsdCxcbiAgICBvd25lck5hbWU6IHZpZXcub3duZXJOYW1lLFxuICAgIGNhbkNoYW5nZTogdmlldy5jYW5DaGFuZ2UsXG4gICAgY2FuRGVsZXRlOiB2aWV3LmNhbkRlbGV0ZSxcbiAgICBtb2RpZnlEYXRlOiB2aWV3Lm1vZGlmeURhdGUsXG4gIH07XG59XG4iXX0=
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9zZXJ2aWNlcy9yZXBvcnQtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU9qRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBR3pFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUMzRSwyREFBMkQ7QUFDM0QsRUFBRTtBQUNGLGdFQUFnRTtBQUNoRSxnQ0FBZ0M7QUFDaEMsMENBQTBDO0FBQzFDLGlFQUFpRTtBQUVqRSxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLDBFQUEwRTtJQUMxRSx1REFBdUQ7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IjpbImltcG9ydCB7IEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGVzdHJveVJlZiwgSW5qZWN0YWJsZSwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcblxuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0NyZWF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctY3JlYXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3RGVsZXRlZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctZGVsZXRlZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld1N1bW1hcnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LXN1bW1hcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3cyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgdmlld0Ryb3BwZWRDb3VudCwgdmlld0Ryb3BwZWRNZXNzYWdlLCB3aXRoU3RvcmVkS2V5cyB9IGZyb20gJy4uL3JlcG9ydC12aWV3LWNvbmZpZyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gVGhlIG9wZW4gcmVwb3J0J3Mgc2F2ZWQgdmlld3MsIHBlciBvcGVuIHJlcG9ydCBiZXNpZGUgdGhlIHN0YXRlIHNlcnZpY2U6XG4vLyB0aGUgbGlzdCB0aGUgdmlld2VyIG1heSBzZWUsIHRoZSB2aWV3IHRoYXQgaXMgb3BlbiwgdGhlIG9yZGVyIGEgcmVwb3J0XG4vLyBvcGVucyBpbiBhbmQgdGhlIGNhbGxzIHRoYXQgY2hhbmdlIGEgdmlldy4gVGhlIHZpZXdlciBzdGF0ZSBzdGF5c1xuLy8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlJ3M6IHRoaXMgc2VydmljZSBwdXRzIGEgdmlldyBvbiBzY3JlZW4gdGhyb3VnaFxuLy8gYXBwbHkoKSBhbmQgcmVhZHMgdGhlIHNjcmVlbiB0aHJvdWdoIHNuYXBzaG90KCksIGJhc2UgYW5kIHZpZXdDaGFuZ2VkLlxuLy8gTm90aGluZyBoZXJlIHJ1bnMgZm9yIGEgcmVwb3J0IHdob3NlIHNlcnZlciBkb2VzIG5vdCBsaXN0ICd2aWV3cydcbi8vIChzZXJ2ZXMoKSkuIEEgdmlldyBpcyBvcGVuZWQgZnJvbSB0aGUgVmlld3MgbWVudSBvbmx5OiBhIHJlcG9ydCBrZWVwcyBub1xuLy8gc3RhdGUgaW4gdGhlIGJyb3dzZXIgVVJMLCBzbyB0aGVyZSBpcyBubyBsaW5rIHRvIGEgdmlldy5cbi8vXG4vLyBUaGUgb3JkZXIgYSByZXBvcnQgb3BlbnMgaW4gKG9wZW4oKSwgb24gaXRzIGZpcnN0IGxvYWQgb25seSk6XG4vLyAxLiBUaGUgdmlld2VyJ3MgZGVmYXVsdCB2aWV3LlxuLy8gMi4gRWxzZSB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMuXG4vLyBBID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoIGJlYXRzIHRoZSBkZWZhdWx0IHZpZXcncyBwYWdlLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydFZpZXdTZXJ2aWNlIHtcblxuICAvLyBUaGUgdmlld3MgdGhlIHZpZXdlciBtYXkgc2VlLCBuYW1lcyBhbmQgZmxhZ3Mgb25seTogaXRzIG93biBmaXJzdCwgdGhlblxuICAvLyB0aGUgb25lcyBvdGhlcnMgc2hhcmUuIEVtcHR5IHVudGlsIHRoZSBsaXN0IGlzIHJlYWQuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3ZpZXdzKCkpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgbWF5IHNoYXJlIGl0cyB2aWV3cyB3aXRoIGV2ZXJ5b25lLlxuICBwdWJsaWMgcmVhZG9ubHkgY2FuU2hhcmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jYW5TaGFyZSgpKTtcblxuICAvLyBUaGUgb3BlbiB2aWV3LCB3aXRoIGl0cyBjb25maWcgYXMgaXQgd2FzIHJlYWQgb3Igc2F2ZWQ7IG51bGwgd2hpbGUgdGhlXG4gIC8vIHNjcmVlbiBpcyBvbiB0aGUgcmVwb3J0J3MgZGVmYXVsdHMuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuVmlldyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX29wZW5WaWV3KCkpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIG9wZW4gdmlldzsgZmFsc2Ugd2l0aCBub25lIG9wZW4uXG4gIHB1YmxpYyByZWFkb25seSB2aWV3Q2hhbmdlZCA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5fb3BlblZpZXcoKSAmJiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3Q2hhbmdlZCgpKTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSBfdmlld3MgPSBzaWduYWw8UmVwb3J0Vmlld1N1bW1hcnlbXT4oW10pO1xuICBwcml2YXRlIF9jYW5TaGFyZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX29wZW5WaWV3ID0gc2lnbmFsPFJlcG9ydFZpZXcgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgcmVwb3J0IHRoZSB2aWV3cyBiZWxvbmcgdG8uXG4gIHByaXZhdGUgX3JlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBXaGV0aGVyIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBrZWVwcyBzYXZlZCB2aWV3cy5cbiAgcHVibGljIHNlcnZlcyhyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFyZXBvcnQ/LnZpZXdlckZlYXR1cmVzPy5pbmNsdWRlcygndmlld3MnKTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0J3MgZmlyc3QgbG9hZCwgaW4gdGhlIG9wZW4gb3JkZXIgYWJvdmU6IHRoZSBzdGF0ZSBzZXJ2aWNlIGlzXG4gIC8vIHNldCB1cCBmb3IgYHJlcG9ydGAgKGluaXQpIG9uY2UgdGhlIGxpc3QgaXMgcmVhZCwgYW5kIHRoZSBzY3JlZW4gb3BlbmVkXG4gIC8vIG9uIHRoZSB2aWV3ZXIncyBkZWZhdWx0IHZpZXcsIGVsc2Ugb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLiBgcGFnZUlkYCBpc1xuICAvLyB0aGUgP3BhZ2U9IHRoZSByZXBvcnQgb3BlbmVkIHdpdGgsIHdoaWNoIGJlYXRzIHRoZSB2aWV3J3MgcGFnZS4gRW5kcyBvbmNlXG4gIC8vIHRoZSBzY3JlZW4gaXMgc2V0LlxuICBwdWJsaWMgb3BlbihyZXBvcnQ6IFJlcG9ydCwgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RhcnQocmVwb3J0KTtcblxuICAgIHJldHVybiB0aGlzLl9yZWFkVmlld3MocmVwb3J0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICBpZiAobGlzdD8ubXlEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuT24obGlzdC5teURlZmF1bHQsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KGxpc3QubXlEZWZhdWx0LmNvbmZpZywgcGFnZUlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBsYXRlciBsb2FkIG9mIHRoZSBvcGVuIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgc2V0dGluZ3Mgc2F2ZSk6IHRoZVxuICAvLyBzY3JlZW4gYW5kIHRoZSBvcGVuIHZpZXcgc3RheSwgYW5kIHRoZSBsaXN0IGlzIHJlYWQgYWdhaW4gYmVoaW5kIHRoZW0gc29cbiAgLy8gaXQgbmFtZXMgd2hhdCB0aGUgc2VydmVyIGhvbGRzIG5vdy5cbiAgcHVibGljIHJlZnJlc2gocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydChyZXBvcnQpO1xuICAgIHRoaXMuX3JlYWRWaWV3cyhyZXBvcnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBPcGVucyBhIHZpZXcgcGlja2VkIGZyb20gdGhlIGxpc3Q7IGl0cyBjb25maWcgaXMgcmVhZCBub3cuXG4gIHB1YmxpYyBwaWNrKHJlcG9ydFZpZXdJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudmlldyh0aGlzLl9yZXBvcnRJZCwgcmVwb3J0Vmlld0lkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmlldykgPT4gdGhpcy5fb3Blbk9uKHZpZXcsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KHZpZXcuY29uZmlnKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIENsb3NlcyB0aGUgb3BlbiB2aWV3IGFuZCBwdXRzIHRoZSBzY3JlZW4gb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICBwdWJsaWMgb3BlbkRlZmF1bHRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5hcHBseShudWxsKTtcbiAgfVxuXG4gIC8vIFNhdmVzIHRoZSBzY3JlZW4gYXMgYSBuZXcgdmlldywgd2hpY2ggYmVjb21lcyB0aGUgb3BlbiB2aWV3LiBUaGUgc2NyZWVuXG4gIC8vIGlzIGFscmVhZHkgdGhlIHZpZXcsIHNvIG5vdGhpbmcgaXMgYXBwbGllZCBhZ2Fpbi5cbiAgcHVibGljIHNhdmVBc05ldyh2aWV3OiBPbWl0PFJlcG9ydFZpZXdDcmVhdGUsICdjb25maWcnPik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIHsgLi4udmlldywgY29uZmlnOiB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChzYXZlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRCYXNlVG9TY3JlZW4oKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgc2F2ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU2F2ZXMgdGhlIHNjcmVlbiBvdmVyIHRoZSBvcGVuIHZpZXcsIGtlZXBpbmcgdGhlIGtleXMgdGhpcyB2aWV3ZXIgZG9lc1xuICAvLyBub3Qga25vdyAod2l0aFN0b3JlZEtleXMpLlxuICBwdWJsaWMgc2F2ZUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudXBkYXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgb3Blbi5pZCwgeyBjb25maWc6IHdpdGhTdG9yZWRLZXlzKG9wZW4uY29uZmlnLCB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpKSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc2F2ZWQpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQoc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuX3B1dFJvdyhzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0QmFzZVRvU2NyZWVuKCk7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdWaWV3IHNhdmVkJyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZU9wZW4oKHJlcG9ydFZpZXdJZCkgPT4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVWaWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHsgbmFtZSB9KSk7XG4gIH1cblxuICAvLyBTaGFyZXMgdGhlIG9wZW4gdmlldyB3aXRoIGV2ZXJ5b25lIHdobyBtYXkgb3BlbiB0aGUgcmVwb3J0LCBvciBzdG9wcy5cbiAgcHVibGljIHNoYXJlKHNoYXJlZDogYm9vbGVhbik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VPcGVuKChyZXBvcnRWaWV3SWQpID0+IHRoaXMuX3JlcG9ydERhdGEuc2hhcmVWaWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHNoYXJlZCkpO1xuICB9XG5cbiAgLy8gTWFrZXMgdGhlIG9wZW4gdmlldyB0aGUgdmlld2VyJ3MgZGVmYXVsdCwgb3Igc3RvcHMgb3BlbmluZyBpdCBieSBkZWZhdWx0LlxuICBwdWJsaWMgc2V0RGVmYXVsdChwZXJzb25hbERlZmF1bHQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlT3BlbigocmVwb3J0Vmlld0lkKSA9PiB0aGlzLl9yZXBvcnREYXRhLnNldFZpZXdEZWZhdWx0KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHBlcnNvbmFsRGVmYXVsdCkpO1xuICB9XG5cbiAgLy8gRGVsZXRlcyB0aGUgb3BlbiB2aWV3LiBUaGUgc2NyZWVuIHN0YXlzOyB0aGUgcmVwb3J0J3MgZGVmYXVsdHMgYmVjb21lXG4gIC8vIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aC5cbiAgcHVibGljIGRlbGV0ZU9wZW4oKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3RGVsZXRlZD4ge1xuICAgIGNvbnN0IG9wZW4gPSB0aGlzLl9vcGVuVmlldygpO1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIG9wZW4uaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5fdmlld3MudXBkYXRlKCh2aWV3cykgPT4gdmlld3MuZmlsdGVyKCh2aWV3KSA9PiB2aWV3LmlkICE9PSBvcGVuLmlkKSk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuY2xlYXJCYXNlKCk7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdWaWV3IGRlbGV0ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU3RhcnRzIG92ZXIgZm9yIGFub3RoZXIgcmVwb3J0OiBubyBsaXN0IGFuZCBubyBvcGVuIHZpZXcuXG4gIHByaXZhdGUgX3N0YXJ0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgaWYgKHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnRJZCA9IHJlcG9ydC5pZDtcbiAgICB0aGlzLl92aWV3cy5zZXQoW10pO1xuICAgIHRoaXMuX2NhblNoYXJlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gTWFrZXMgYHZpZXdgIHRoZSBvcGVuIHZpZXcsIHB1dHMgaXQgb24gc2NyZWVuIChgYXBwbHlWaWV3YCksIGFuZCBzYXlzXG4gIC8vIGhvdyBtYW55IG9mIGl0cyBzZXR0aW5ncyBubyBsb25nZXIgYXBwbHkgKGFuZCB0byBzYXZlIGl0LCB3aGVuIHRoZVxuICAvLyB2aWV3ZXIgbWF5KS5cbiAgcHJpdmF0ZSBfb3Blbk9uKHZpZXc6IFJlcG9ydFZpZXcsIGFwcGx5VmlldzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5WaWV3LnNldCh2aWV3KTtcbiAgICBhcHBseVZpZXcoKTtcblxuICAgIGNvbnN0IG5vdGUgPSB2aWV3RHJvcHBlZE1lc3NhZ2Uodmlld0Ryb3BwZWRDb3VudCh2aWV3LCB0aGlzLl9maWx0ZXJTdGF0ZS5iYXNlKCkpLCB2aWV3LmNhbkNoYW5nZSk7XG4gICAgaWYgKG5vdGUpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2Uud2FybmluZyhub3RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSdW5zIGEgY2hhbmdlIG9uIHRoZSBvcGVuIHZpZXcgYW5kIHRha2VzIGl0cyBhbnN3ZXIgYXMgdGhlIG9wZW4gdmlld1xuICAvLyBhbmQgaXRzIHJvdyBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfY2hhbmdlT3BlbihjaGFuZ2U6IChyZXBvcnRWaWV3SWQ6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxSZXBvcnRWaWV3Pik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIGNvbnN0IG9wZW4gPSB0aGlzLl9vcGVuVmlldygpO1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2Uob3Blbi5pZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHZpZXcpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQodmlldyk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHZpZXcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIHZpZXcncyByb3cgaW4gdGhlIGxpc3QsIHJlcGxhY2VkIG9yIGFkZGVkLiBBIG5ldyBkZWZhdWx0IGNsZWFycyB0aGVcbiAgLy8gZmxhZyBvbiB0aGUgdmlld2VyJ3Mgb3RoZXIgdmlld3MsIGFzIHRoZSBzZXJ2ZXIgZG9lcy4gQSBuZXcgcm93IGtlZXBzXG4gIC8vIHRoZSBsaXN0J3Mgb3JkZXI6IHRoZSB2aWV3ZXIncyBvd24gdmlld3MgZmlyc3QsIHRoZW4gdGhlIG9uZXMgb3RoZXJzXG4gIC8vIHNoYXJlLlxuICBwcml2YXRlIF9wdXRSb3codmlldzogUmVwb3J0Vmlldyk6IHZvaWQge1xuICAgIGNvbnN0IHN1bW1hcnkgPSB2aWV3U3VtbWFyeSh2aWV3KTtcblxuICAgIHRoaXMuX3ZpZXdzLnVwZGF0ZSgodmlld3MpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSB2aWV3cy5tYXAoKHJvdykgPT4gKHZpZXcucGVyc29uYWxEZWZhdWx0ICYmIHJvdy5wZXJzb25hbERlZmF1bHQgPyB7IC4uLnJvdywgcGVyc29uYWxEZWZhdWx0OiBmYWxzZSB9IDogcm93KSk7XG4gICAgICBjb25zdCBpbmRleCA9IHJvd3MuZmluZEluZGV4KChyb3cpID0+IHJvdy5pZCA9PT0gdmlldy5pZCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93LCBhdCkgPT4gKGF0ID09PSBpbmRleCA/IHN1bW1hcnkgOiByb3cpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3RoZXJzQXQgPSB2aWV3Lm1pbmUgPyByb3dzLmZpbmRJbmRleCgocm93KSA9PiAhcm93Lm1pbmUpIDogLTE7XG5cbiAgICAgIHJldHVybiBvdGhlcnNBdCA8IDBcbiAgICAgICAgPyBbLi4ucm93cywgc3VtbWFyeV1cbiAgICAgICAgOiBbLi4ucm93cy5zbGljZSgwLCBvdGhlcnNBdCksIHN1bW1hcnksIC4uLnJvd3Muc2xpY2Uob3RoZXJzQXQpXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBsaXN0LCByZWFkIGZvciBgcmVwb3J0YDsgbnVsbCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLiBJdHMgYW5zd2VyIGlzXG4gIC8vIGtlcHQgb25seSB3aGlsZSB0aGUgcmVwb3J0IGlzIHN0aWxsIHRoZSBvcGVuIG9uZS5cbiAgcHJpdmF0ZSBfcmVhZFZpZXdzKHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3cyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3cyhyZXBvcnQuaWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ICYmIHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnNldChsaXN0LnZpZXdzID8/IFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2NhblNoYXJlLnNldCghIWxpc3QuY2FuU2hhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbn1cblxuXG4vLyBBIHZpZXcncyByb3cgYXMgdGhlIGxpc3QgaG9sZHMgaXQ6IG5hbWVzIGFuZCBmbGFncywgbm8gY29uZmlnLlxuZnVuY3Rpb24gdmlld1N1bW1hcnkodmlldzogUmVwb3J0Vmlldyk6IFJlcG9ydFZpZXdTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmlldy5pZCxcbiAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgc2hhcmVkOiB2aWV3LnNoYXJlZCxcbiAgICBtaW5lOiB2aWV3Lm1pbmUsXG4gICAgcGVyc29uYWxEZWZhdWx0OiB2aWV3LnBlcnNvbmFsRGVmYXVsdCxcbiAgICBvd25lck5hbWU6IHZpZXcub3duZXJOYW1lLFxuICAgIGNhbkNoYW5nZTogdmlldy5jYW5DaGFuZ2UsXG4gICAgY2FuRGVsZXRlOiB2aWV3LmNhbkRlbGV0ZSxcbiAgICBtb2RpZnlEYXRlOiB2aWV3Lm1vZGlmeURhdGUsXG4gIH07XG59XG4iXX0=