@wavemaker/app-ng-runtime 11.9.0-rc.5804 → 11.9.0-rc.5807

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 (38) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +5 -1
  2. app-ng-runtime/build-task/esm2022/input/file-upload/file-upload.build.mjs +6 -2
  3. app-ng-runtime/build-task/fesm2022/index.mjs +5 -1
  4. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  5. app-ng-runtime/components/data/table/bundles/index.umd.js +5 -1
  6. app-ng-runtime/components/data/table/esm2022/table.component.mjs +5 -2
  7. app-ng-runtime/components/data/table/esm2022/table.props.mjs +2 -1
  8. app-ng-runtime/components/data/table/fesm2022/index.mjs +5 -1
  9. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  10. app-ng-runtime/components/data/table/table.component.d.ts +2 -0
  11. app-ng-runtime/components/input/default/bundles/index.umd.js +5 -5
  12. app-ng-runtime/components/input/default/esm2022/number/number.component.mjs +4 -4
  13. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +4 -4
  14. app-ng-runtime/components/input/default/fesm2022/index.mjs +6 -6
  15. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  16. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +70 -17
  17. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +72 -19
  18. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +70 -17
  19. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  20. app-ng-runtime/components/input/file-upload/file-upload.component.d.ts +8 -3
  21. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +118 -11
  22. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +120 -13
  23. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs +118 -11
  24. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  25. app-ng-runtime/components/navigation/popover/popover.component.d.ts +12 -3
  26. app-ng-runtime/core/bundles/index.umd.js +4 -2
  27. app-ng-runtime/core/esm2022/public_api.mjs +2 -2
  28. app-ng-runtime/core/esm2022/utils/utils.mjs +3 -3
  29. app-ng-runtime/core/fesm2022/index.mjs +4 -3
  30. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  31. app-ng-runtime/core/public_api.d.ts +1 -1
  32. app-ng-runtime/core/utils/utils.d.ts +1 -0
  33. app-ng-runtime/package.json +1 -1
  34. app-ng-runtime/runtime/base/bundles/index.umd.js +1 -1
  35. app-ng-runtime/runtime/base/esm2022/guards/can-deactivate-page.guard.mjs +2 -2
  36. app-ng-runtime/runtime/base/fesm2022/index.mjs +1 -1
  37. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  38. app-ng-runtime/scripts/datatable/datatable.js +23 -26
@@ -77,25 +77,105 @@
77
77
  let activePopover;
78
78
  class PopoverComponent extends base.StylableComponent {
79
79
  static { this.initializeProps = registerProps(); }
80
- constructor(inj, app, explicitContext) {
80
+ static { this.activePopovers = []; }
81
+ constructor(inj, app, explicitContext, cdr) {
81
82
  super(inj, WIDGET_CONFIG, explicitContext);
82
83
  this.app = app;
84
+ this.cdr = cdr;
83
85
  this.isOpen = false;
84
86
  this.canPopoverOpen = true;
87
+ this.isClosingProgrammatically = false;
85
88
  this.popoverContainerCls = `app-popover-${this.widgetId}`;
86
89
  }
90
+ setupDocumentClickHandler() {
91
+ if (this.documentClickHandler) {
92
+ document.removeEventListener('click', this.documentClickHandler, true);
93
+ }
94
+ this.documentClickHandler = (event) => {
95
+ if (!this.isOpen)
96
+ return;
97
+ const target = event.target;
98
+ // Check if the clicked element or any of its parents is part of the datepicker, dropdown, or typeahead containers
99
+ const isInsideSpecialContainer = !!(target.closest('.bs-datepicker-container') ||
100
+ target.closest(".dropdown-menu"));
101
+ if (isInsideSpecialContainer) {
102
+ // If the click was inside one of these containers, we do not close the popover
103
+ return;
104
+ }
105
+ const clickedPopoverIndex = PopoverComponent.activePopovers.findIndex(popover => {
106
+ const popoverContainer = document.querySelector(`.${popover.popoverContainerCls}`);
107
+ return popoverContainer?.contains(target);
108
+ });
109
+ if (this.anchorRef.nativeElement.contains(target)) {
110
+ event.preventDefault();
111
+ event.stopPropagation();
112
+ this.isOpen ? this.close() : this.open();
113
+ return;
114
+ }
115
+ if (clickedPopoverIndex === -1) {
116
+ // Click is outside all popovers
117
+ if (this.outsideclick) {
118
+ this.closeAllPopovers();
119
+ }
120
+ }
121
+ else {
122
+ // Click is inside a popover
123
+ this.closeInnerPopovers(clickedPopoverIndex);
124
+ }
125
+ };
126
+ document.addEventListener('click', this.documentClickHandler, true);
127
+ }
128
+ closeAllPopovers() {
129
+ PopoverComponent.activePopovers.forEach(popover => {
130
+ if (popover.outsideclick) {
131
+ popover.isClosingProgrammatically = true;
132
+ popover.close();
133
+ }
134
+ });
135
+ }
136
+ closeInnerPopovers(clickedIndex) {
137
+ for (let i = clickedIndex + 1; i < PopoverComponent.activePopovers.length; i++) {
138
+ const popover = PopoverComponent.activePopovers[i];
139
+ if (popover.outsideclick) {
140
+ popover.isClosingProgrammatically = true;
141
+ popover.close();
142
+ }
143
+ }
144
+ }
145
+ isChildPopover() {
146
+ return !!$(this.nativeElement).closest('.popover').length;
147
+ }
87
148
  // This mehtod is used to show/open the popover. This refers to the same method showPopover.
88
149
  open() {
89
150
  this.showPopover();
151
+ if (!PopoverComponent.activePopovers.includes(this)) {
152
+ PopoverComponent.activePopovers.push(this);
153
+ }
154
+ this.cdr.detectChanges();
90
155
  }
91
156
  // This mehtod is used to hide/close the popover.
92
157
  close() {
93
- this.isOpen = false;
158
+ if (this.isOpen) {
159
+ this.isClosingProgrammatically = true;
160
+ this.isOpen = false;
161
+ this.bsPopoverDirective.hide();
162
+ const index = PopoverComponent.activePopovers.indexOf(this);
163
+ if (index > -1) {
164
+ PopoverComponent.activePopovers.splice(index, 1);
165
+ }
166
+ this.cdr.detectChanges();
167
+ }
94
168
  }
95
169
  // Trigger on hiding popover
96
170
  onHidden() {
97
- this.invokeEventCallback('hide', { $event: { type: 'hide' } });
98
- this.isOpen = false;
171
+ if (!this.isChildPopover() || this.isClosingProgrammatically) {
172
+ this.invokeEventCallback('hide', { $event: { type: 'hide' } });
173
+ this.isOpen = false;
174
+ if (activePopover === this) {
175
+ activePopover = null;
176
+ }
177
+ }
178
+ this.isClosingProgrammatically = false;
99
179
  }
100
180
  setFocusToPopoverLink() {
101
181
  setTimeout(() => this.anchorRef.nativeElement.focus(), 10);
@@ -147,12 +227,26 @@
147
227
  $('body > popover-container').wrap('<' + root + '/>');
148
228
  }
149
229
  // Fix for [WMS-25125]: Not closing the existing opened popovers when the autoclose property is DISABLED
150
- if (activePopover && activePopover.isOpen && activePopover.autoclose !== base.AUTOCLOSE_TYPE.DISABLED) {
151
- activePopover.isOpen = false;
230
+ if (!this.isChildPopover()) {
231
+ if (activePopover && activePopover !== this &&
232
+ activePopover.autoclose !== base.AUTOCLOSE_TYPE.DISABLED) {
233
+ activePopover.isClosingProgrammatically = true;
234
+ activePopover.close();
235
+ }
236
+ activePopover = this;
237
+ }
238
+ this.isOpen = true;
239
+ if (!PopoverComponent.activePopovers.includes(this)) {
240
+ PopoverComponent.activePopovers.push(this);
152
241
  }
153
- activePopover = this;
154
- activePopover.isOpen = true;
155
242
  const popoverContainer = document.querySelector(`.${this.popoverContainerCls}`);
243
+ if (popoverContainer) {
244
+ popoverContainer.setAttribute('data-popover-id', this.widgetId);
245
+ // Add click event listener to stop propagation
246
+ popoverContainer.addEventListener('click', (event) => {
247
+ event.stopPropagation();
248
+ });
249
+ }
156
250
  i1.setCSSFromObj(popoverContainer, {
157
251
  height: this.popoverheight,
158
252
  minWidth: this.popoverwidth,
@@ -169,6 +263,9 @@
169
263
  this.anchorRef.nativeElement.onmouseenter = () => clearTimeout(this.closePopoverTimeout);
170
264
  this.anchorRef.nativeElement.onmouseleave = () => this.hidePopover();
171
265
  }
266
+ if (this.outsideclick) {
267
+ this.setupDocumentClickHandler();
268
+ }
172
269
  setTimeout(() => {
173
270
  this.anchorRef.nativeElement.removeAttribute('aria-describedby');
174
271
  });
@@ -235,6 +332,7 @@
235
332
  }
236
333
  }
237
334
  hidePopover() {
335
+ this.isClosingProgrammatically = true;
238
336
  this.closePopoverTimeout = setTimeout(() => this.isOpen = false, 500);
239
337
  }
240
338
  showPopover() {
@@ -288,7 +386,16 @@
288
386
  // Hide the popover container while attaching the next component as part of page reuse strategy.
289
387
  this.bsPopoverDirective.hide();
290
388
  }
291
- static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0__namespace.ɵɵdirectiveInject(i0__namespace.Injector), i0__namespace.ɵɵdirectiveInject(i1__namespace.App), i0__namespace.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
389
+ OnDestroy() {
390
+ if (this.documentClickHandler) {
391
+ document.removeEventListener('click', this.documentClickHandler, true);
392
+ }
393
+ const index = PopoverComponent.activePopovers.indexOf(this);
394
+ if (index > -1) {
395
+ PopoverComponent.activePopovers.splice(index, 1);
396
+ }
397
+ }
398
+ static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0__namespace.ɵɵdirectiveInject(i0__namespace.Injector), i0__namespace.ɵɵdirectiveInject(i1__namespace.App), i0__namespace.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8), i0__namespace.ɵɵdirectiveInject(i0__namespace.ChangeDetectorRef)); }; }
292
399
  static { this.ɵcmp = /*@__PURE__*/ i0__namespace.ɵɵdefineComponent({ type: PopoverComponent, selectors: [["wm-popover"]], contentQueries: function PopoverComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
293
400
  i0__namespace.ɵɵcontentQuery(dirIndex, i0.TemplateRef, 5);
294
401
  i0__namespace.ɵɵcontentQuery(dirIndex, _c0, 5);
@@ -327,7 +434,7 @@
327
434
  args: ['EXPLICIT_CONTEXT']
328
435
  }, {
329
436
  type: i0.Optional
330
- }] }], { bsPopoverDirective: [{
437
+ }] }, { type: i0__namespace.ChangeDetectorRef }], { bsPopoverDirective: [{
331
438
  type: i0.ViewChild,
332
439
  args: [i4.PopoverDirective]
333
440
  }], anchorRef: [{
@@ -340,7 +447,7 @@
340
447
  type: i0.ContentChild,
341
448
  args: ['partial']
342
449
  }] }); })();
343
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassDebugInfo(PopoverComponent, { className: "PopoverComponent", filePath: "popover.component.ts", lineNumber: 59 }); })();
450
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassDebugInfo(PopoverComponent, { className: "PopoverComponent", filePath: "popover.component.ts", lineNumber: 60 }); })();
344
451
 
345
452
  const components = [
346
453
  PopoverComponent
@@ -1,4 +1,4 @@
1
- import { Component, ContentChild, ElementRef, Inject, Injector, Optional, TemplateRef, ViewChild } from '@angular/core';
1
+ import { ChangeDetectorRef, Component, ContentChild, ElementRef, Inject, Injector, Optional, TemplateRef, ViewChild } from '@angular/core';
2
2
  import { PopoverDirective } from 'ngx-bootstrap/popover';
3
3
  import { addClass, adjustContainerPosition, adjustContainerRightEdges, App, findRootContainer, setCSSFromObj } from '@wm/core';
4
4
  import { AUTOCLOSE_TYPE, getContainerTargetClass, provideAsWidgetRef, StylableComponent, styler } from '@wm/components/base';
@@ -24,25 +24,105 @@ const eventsMap = {
24
24
  let activePopover;
25
25
  export class PopoverComponent extends StylableComponent {
26
26
  static { this.initializeProps = registerProps(); }
27
- constructor(inj, app, explicitContext) {
27
+ static { this.activePopovers = []; }
28
+ constructor(inj, app, explicitContext, cdr) {
28
29
  super(inj, WIDGET_CONFIG, explicitContext);
29
30
  this.app = app;
31
+ this.cdr = cdr;
30
32
  this.isOpen = false;
31
33
  this.canPopoverOpen = true;
34
+ this.isClosingProgrammatically = false;
32
35
  this.popoverContainerCls = `app-popover-${this.widgetId}`;
33
36
  }
37
+ setupDocumentClickHandler() {
38
+ if (this.documentClickHandler) {
39
+ document.removeEventListener('click', this.documentClickHandler, true);
40
+ }
41
+ this.documentClickHandler = (event) => {
42
+ if (!this.isOpen)
43
+ return;
44
+ const target = event.target;
45
+ // Check if the clicked element or any of its parents is part of the datepicker, dropdown, or typeahead containers
46
+ const isInsideSpecialContainer = !!(target.closest('.bs-datepicker-container') ||
47
+ target.closest(".dropdown-menu"));
48
+ if (isInsideSpecialContainer) {
49
+ // If the click was inside one of these containers, we do not close the popover
50
+ return;
51
+ }
52
+ const clickedPopoverIndex = PopoverComponent.activePopovers.findIndex(popover => {
53
+ const popoverContainer = document.querySelector(`.${popover.popoverContainerCls}`);
54
+ return popoverContainer?.contains(target);
55
+ });
56
+ if (this.anchorRef.nativeElement.contains(target)) {
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ this.isOpen ? this.close() : this.open();
60
+ return;
61
+ }
62
+ if (clickedPopoverIndex === -1) {
63
+ // Click is outside all popovers
64
+ if (this.outsideclick) {
65
+ this.closeAllPopovers();
66
+ }
67
+ }
68
+ else {
69
+ // Click is inside a popover
70
+ this.closeInnerPopovers(clickedPopoverIndex);
71
+ }
72
+ };
73
+ document.addEventListener('click', this.documentClickHandler, true);
74
+ }
75
+ closeAllPopovers() {
76
+ PopoverComponent.activePopovers.forEach(popover => {
77
+ if (popover.outsideclick) {
78
+ popover.isClosingProgrammatically = true;
79
+ popover.close();
80
+ }
81
+ });
82
+ }
83
+ closeInnerPopovers(clickedIndex) {
84
+ for (let i = clickedIndex + 1; i < PopoverComponent.activePopovers.length; i++) {
85
+ const popover = PopoverComponent.activePopovers[i];
86
+ if (popover.outsideclick) {
87
+ popover.isClosingProgrammatically = true;
88
+ popover.close();
89
+ }
90
+ }
91
+ }
92
+ isChildPopover() {
93
+ return !!$(this.nativeElement).closest('.popover').length;
94
+ }
34
95
  // This mehtod is used to show/open the popover. This refers to the same method showPopover.
35
96
  open() {
36
97
  this.showPopover();
98
+ if (!PopoverComponent.activePopovers.includes(this)) {
99
+ PopoverComponent.activePopovers.push(this);
100
+ }
101
+ this.cdr.detectChanges();
37
102
  }
38
103
  // This mehtod is used to hide/close the popover.
39
104
  close() {
40
- this.isOpen = false;
105
+ if (this.isOpen) {
106
+ this.isClosingProgrammatically = true;
107
+ this.isOpen = false;
108
+ this.bsPopoverDirective.hide();
109
+ const index = PopoverComponent.activePopovers.indexOf(this);
110
+ if (index > -1) {
111
+ PopoverComponent.activePopovers.splice(index, 1);
112
+ }
113
+ this.cdr.detectChanges();
114
+ }
41
115
  }
42
116
  // Trigger on hiding popover
43
117
  onHidden() {
44
- this.invokeEventCallback('hide', { $event: { type: 'hide' } });
45
- this.isOpen = false;
118
+ if (!this.isChildPopover() || this.isClosingProgrammatically) {
119
+ this.invokeEventCallback('hide', { $event: { type: 'hide' } });
120
+ this.isOpen = false;
121
+ if (activePopover === this) {
122
+ activePopover = null;
123
+ }
124
+ }
125
+ this.isClosingProgrammatically = false;
46
126
  }
47
127
  setFocusToPopoverLink() {
48
128
  setTimeout(() => this.anchorRef.nativeElement.focus(), 10);
@@ -94,12 +174,26 @@ export class PopoverComponent extends StylableComponent {
94
174
  $('body > popover-container').wrap('<' + root + '/>');
95
175
  }
96
176
  // Fix for [WMS-25125]: Not closing the existing opened popovers when the autoclose property is DISABLED
97
- if (activePopover && activePopover.isOpen && activePopover.autoclose !== AUTOCLOSE_TYPE.DISABLED) {
98
- activePopover.isOpen = false;
177
+ if (!this.isChildPopover()) {
178
+ if (activePopover && activePopover !== this &&
179
+ activePopover.autoclose !== AUTOCLOSE_TYPE.DISABLED) {
180
+ activePopover.isClosingProgrammatically = true;
181
+ activePopover.close();
182
+ }
183
+ activePopover = this;
184
+ }
185
+ this.isOpen = true;
186
+ if (!PopoverComponent.activePopovers.includes(this)) {
187
+ PopoverComponent.activePopovers.push(this);
99
188
  }
100
- activePopover = this;
101
- activePopover.isOpen = true;
102
189
  const popoverContainer = document.querySelector(`.${this.popoverContainerCls}`);
190
+ if (popoverContainer) {
191
+ popoverContainer.setAttribute('data-popover-id', this.widgetId);
192
+ // Add click event listener to stop propagation
193
+ popoverContainer.addEventListener('click', (event) => {
194
+ event.stopPropagation();
195
+ });
196
+ }
103
197
  setCSSFromObj(popoverContainer, {
104
198
  height: this.popoverheight,
105
199
  minWidth: this.popoverwidth,
@@ -116,6 +210,9 @@ export class PopoverComponent extends StylableComponent {
116
210
  this.anchorRef.nativeElement.onmouseenter = () => clearTimeout(this.closePopoverTimeout);
117
211
  this.anchorRef.nativeElement.onmouseleave = () => this.hidePopover();
118
212
  }
213
+ if (this.outsideclick) {
214
+ this.setupDocumentClickHandler();
215
+ }
119
216
  setTimeout(() => {
120
217
  this.anchorRef.nativeElement.removeAttribute('aria-describedby');
121
218
  });
@@ -182,6 +279,7 @@ export class PopoverComponent extends StylableComponent {
182
279
  }
183
280
  }
184
281
  hidePopover() {
282
+ this.isClosingProgrammatically = true;
185
283
  this.closePopoverTimeout = setTimeout(() => this.isOpen = false, 500);
186
284
  }
187
285
  showPopover() {
@@ -235,7 +333,16 @@ export class PopoverComponent extends StylableComponent {
235
333
  // Hide the popover container while attaching the next component as part of page reuse strategy.
236
334
  this.bsPopoverDirective.hide();
237
335
  }
238
- static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
336
+ OnDestroy() {
337
+ if (this.documentClickHandler) {
338
+ document.removeEventListener('click', this.documentClickHandler, true);
339
+ }
340
+ const index = PopoverComponent.activePopovers.indexOf(this);
341
+ if (index > -1) {
342
+ PopoverComponent.activePopovers.splice(index, 1);
343
+ }
344
+ }
345
+ static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
239
346
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PopoverComponent, selectors: [["wm-popover"]], contentQueries: function PopoverComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
240
347
  i0.ɵɵcontentQuery(dirIndex, TemplateRef, 5);
241
348
  i0.ɵɵcontentQuery(dirIndex, _c0, 5);
@@ -274,7 +381,7 @@ export class PopoverComponent extends StylableComponent {
274
381
  args: ['EXPLICIT_CONTEXT']
275
382
  }, {
276
383
  type: Optional
277
- }] }], { bsPopoverDirective: [{
384
+ }] }, { type: i0.ChangeDetectorRef }], { bsPopoverDirective: [{
278
385
  type: ViewChild,
279
386
  args: [PopoverDirective]
280
387
  }], anchorRef: [{
@@ -287,5 +394,5 @@ export class PopoverComponent extends StylableComponent {
287
394
  type: ContentChild,
288
395
  args: ['partial']
289
396
  }] }); })();
290
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PopoverComponent, { className: "PopoverComponent", filePath: "popover.component.ts", lineNumber: 59 }); })();
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvbmF2aWdhdGlvbi9wb3BvdmVyL3NyYy9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9uYXZpZ2F0aW9uL3BvcG92ZXIvc3JjL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBRVIsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUNILFFBQVEsRUFDUix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLEdBQUcsRUFDSCxpQkFBaUIsRUFDakIsYUFBYSxFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQ0gsY0FBYyxFQUNkLHVCQUF1QixFQUV2QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDVCxNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBSTlDLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBQzFDLE1BQU0sYUFBYSxHQUFrQjtJQUNqQyxVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztDQUN6QixDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxrQkFBa0I7SUFDekIsT0FBTyxFQUFFLGtCQUFrQjtDQUM5QixDQUFDO0FBRUYsSUFBSSxhQUErQixDQUFDO0FB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a0JBQWxDLFlBQVk7bUJBQUMsU0FBUzs7a0ZBckNkLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7UG9wb3ZlckRpcmVjdGl2ZX0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wb3BvdmVyJztcblxuaW1wb3J0IHtcbiAgICBhZGRDbGFzcyxcbiAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbixcbiAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzLFxuICAgIEFwcCxcbiAgICBmaW5kUm9vdENvbnRhaW5lcixcbiAgICBzZXRDU1NGcm9tT2JqXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7XG4gICAgQVVUT0NMT1NFX1RZUEUsXG4gICAgZ2V0Q29udGFpbmVyVGFyZ2V0Q2xhc3MsXG4gICAgSVdpZGdldENvbmZpZyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgU3R5bGFibGVDb21wb25lbnQsXG4gICAgc3R5bGVyXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQge3JlZ2lzdGVyUHJvcHN9IGZyb20gJy4vcG9wb3Zlci5wcm9wcyc7XG5cbmRlY2xhcmUgY29uc3QgJDtcblxuY29uc3QgREVGQVVMVF9DTFMgPSAnYXBwLXBvcG92ZXItd3JhcHBlcic7XG5jb25zdCBXSURHRVRfQ09ORklHOiBJV2lkZ2V0Q29uZmlnID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1wb3BvdmVyJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5jb25zdCBldmVudHNNYXAgPSB7XG4gICAgY2xpY2s6ICdjbGljaycsXG4gICAgaG92ZXI6ICdtb3VzZWVudGVyOmNsaWNrJyxcbiAgICBkZWZhdWx0OiAnY2xpY2sgbW91c2VlbnRlcidcbn07XG5cbmxldCBhY3RpdmVQb3BvdmVyOiBQb3BvdmVyQ29tcG9uZW50O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3dtLXBvcG92ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKFBvcG92ZXJDb21wb25lbnQpXG4gICAgXVxufSlcblxuZXhwb3J0IGNsYXNzIFBvcG92ZXJDb21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcblxuICAgIHB1YmxpYyBldmVudDogc3RyaW5nO1xuICAgIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGNsb3NlUG9wb3ZlclRpbWVvdXQ7XG4gICAgcHVibGljIHJlYWRvbmx5IHBvcG92ZXJDb250YWluZXJDbHM7XG4gICAgcHVibGljIGNhblBvcG92ZXJPcGVuID0gdHJ1ZTtcbiAgICBwcml2YXRlIFdpZGdldHM7XG4gICAgcHJpdmF0ZSBWYXJpYWJsZXM7XG4gICAgcHJpdmF0ZSBBY3Rpb25zO1xuXG4gICAgcHVibGljIGludGVyYWN0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHBvcG92ZXJhcnJvdzogYm9vbGVhbjtcbiAgICBwdWJsaWMgcG9wb3ZlcndpZHRoOiBzdHJpbmc7XG4gICAgcHVibGljIHBvcG92ZXJoZWlnaHQ6IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudGFuaW1hdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBjb250ZW50c291cmNlOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbnRlbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgcG9wb3ZlcnBsYWNlbWVudDogc3RyaW5nO1xuICAgIHB1YmxpYyBvdXRzaWRlY2xpY2s6IGJvb2xlYW47XG4gICAgcHVibGljIGF1dG9jbG9zZTogc3RyaW5nO1xuXG4gICAgcHVibGljIGNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIHRhYmluZGV4OiBhbnk7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgYWRhcHRpdmVwb3NpdGlvbjpib29sZWFuO1xuICAgIHB1YmxpYyBjb250YWluZXJUYXJnZXQ6IHN0cmluZztcbiAgICBwdWJsaWMgaGludDogc3RyaW5nO1xuICAgIHB1YmxpYyBhcmlhbGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgY2FwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBiYWRnZXZhbHVlOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKFBvcG92ZXJEaXJlY3RpdmUpIHByaXZhdGUgYnNQb3BvdmVyRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ2FuY2hvcicsIHsgc3RhdGljOiB0cnVlIH0pIGFuY2hvclJlZjogRWxlbWVudFJlZjtcbiAgICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKSBwb3BvdmVyVGVtcGxhdGU7XG4gICAgQENvbnRlbnRDaGlsZCgncGFydGlhbCcpIHBhcnRpYWxSZWY7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbmo6IEluamVjdG9yLCBwcml2YXRlIGFwcDogQXBwLCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuICAgICAgICB0aGlzLnBvcG92ZXJDb250YWluZXJDbHMgPSBgYXBwLXBvcG92ZXItJHt0aGlzLndpZGdldElkfWA7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZWh0b2QgaXMgdXNlZCB0byBzaG93L29wZW4gdGhlIHBvcG92ZXIuIFRoaXMgcmVmZXJzIHRvIHRoZSBzYW1lIG1ldGhvZCBzaG93UG9wb3Zlci5cbiAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wb3ZlcigpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWVodG9kIGlzIHVzZWQgdG8gaGlkZS9jbG9zZSB0aGUgcG9wb3Zlci5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbiBoaWRpbmcgcG9wb3ZlclxuICAgIHB1YmxpYyBvbkhpZGRlbigpIHtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdoaWRlJywgeyRldmVudDoge3R5cGU6ICdoaWRlJ319KTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvY3VzVG9Qb3BvdmVyTGluaygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCksIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkanVzdFBvcG92ZXJBcnJvd1Bvc2l0aW9uKHBvcG92ZXJFbGVtLCBwb3BvdmVyTGVmdFNoaWZ0KSB7XG4gICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyLl9uZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHBvcG92ZXJFbGVtLmZpbmQoJy5wb3BvdmVyLWFycm93JykuY3NzKCdsZWZ0JywgcG9wb3ZlckxlZnRTaGlmdCArICdweCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvcG92ZXJQb3N0aW9uKGVsZW1lbnQpIHtcblxuICAgICAgICBjb25zdCBwb3BvdmVyRWxlbSA9ICQoZWxlbWVudCk7XG4gICAgICAgIGxldCBwb3BvdmVyTGVmdCA9ICBwb3BvdmVyRWxlbS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICBjb25zdCBwb3BvdmVyV2lkdGggPSBwb3BvdmVyRWxlbVswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgdmlld1BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICBjb25zdCBwYXJlbnREaW1lc2lvbiA9IHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIEFkanVzdGluZyBwb3BvdmVyIHBvc2l0aW9uLCBpZiBpdCBpcyBub3QgdmlzaWJsZSBhdCBsZWZ0IHNpZGVcbiAgICAgICAgaWYgKHBvcG92ZXJMZWZ0IDwgMCkge1xuICAgICAgICAgICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24ocG9wb3ZlckVsZW0sIHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcy5ic1BvcG92ZXJEaXJlY3RpdmUuX3BvcG92ZXIpO1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlckxlZnRTaGlmdCA9IDQ7XG4gICAgICAgICAgICBjb25zdCBhcnJvd0xlZnRTaGlmdCA9IChwYXJlbnREaW1lc2lvbi5sZWZ0ICsgKHBhcmVudERpbWVzaW9uLndpZHRoIC8gMikpIC0gcG9wb3ZlckxlZnRTaGlmdDtcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9wb3ZlckFycm93UG9zaXRpb24ocG9wb3ZlckVsZW0sIGFycm93TGVmdFNoaWZ0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3RpbmcgcG9wb3ZlciBwb3NpdGlvbiwgaWYgaXQgaXMgbm90IHZpc2libGUgYXQgcmlnaHQgc2lkZVxuICAgICAgICBpZiAocG9wb3ZlckxlZnQgKyBwb3BvdmVyV2lkdGggPiB2aWV3UG9ydFdpZHRoKSB7XG4gICAgICAgICAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzKHBvcG92ZXJFbGVtLCB0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBvcG92ZXJMZWZ0ID0gcG9wb3ZlckVsZW0ub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3BvdmVyTGVmdEFkanVzdCA9IChwb3BvdmVyTGVmdCArIHBvcG92ZXJXaWR0aCkgLSB2aWV3UG9ydFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcG92ZXJMZWZ0U2hpZnQgPSAgcG9wb3ZlckxlZnQgLSBwb3BvdmVyTGVmdEFkanVzdDtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0U2hpZnQgO1xuICAgICAgICAgICAgICAgIGlmKHBvcG92ZXJMZWZ0PD0xMDApe1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCA9ICAocGFyZW50RGltZXNpb24ubGVmdCArIChwYXJlbnREaW1lc2lvbi53aWR0aCAvIDIpKSAtIHBvcG92ZXJMZWZ0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCA9IChwYXJlbnREaW1lc2lvbi5sZWZ0ICsgKHBhcmVudERpbWVzaW9uLndpZHRoIC8gMikpIC0gcG9wb3ZlckxlZnRTaGlmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodmlld1BvcnRXaWR0aCA+IDUwMCl7XG4gICAgICAgICAgICAgICAgICAgIGFycm93TGVmdFNoaWZ0ICs9IDMwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9wb3ZlckFycm93UG9zaXRpb24ocG9wb3ZlckVsZW0sIGFycm93TGVmdFNoaWZ0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbiBzaG93aW5nIHBvcG92ZXJcbiAgICBwdWJsaWMgb25TaG93bigpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGZpbmRSb290Q29udGFpbmVyKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAvLyBpZiBwYWdlIHN0eWxlcyBoYXZlIHRvIGJlIGFwcGxpZWQgdG8gcG9wb3ZlciB0aGVuIHBvcG92ZXIgaGFzIHRvIGJlIGNoaWxkIG9mIHBhZ2UgZWxlbWVudC5cbiAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICQoJ2JvZHkgPiBwb3BvdmVyLWNvbnRhaW5lcicpLndyYXAoJzwnICsgcm9vdCArICcvPicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpeCBmb3IgW1dNUy0yNTEyNV06IE5vdCBjbG9zaW5nIHRoZSBleGlzdGluZyBvcGVuZWQgcG9wb3ZlcnMgd2hlbiB0aGUgYXV0b2Nsb3NlIHByb3BlcnR5IGlzIERJU0FCTEVEXG4gICAgICAgIGlmIChhY3RpdmVQb3BvdmVyICYmIGFjdGl2ZVBvcG92ZXIuaXNPcGVuICYmIGFjdGl2ZVBvcG92ZXIuYXV0b2Nsb3NlICE9PSBBVVRPQ0xPU0VfVFlQRS5ESVNBQkxFRCkge1xuICAgICAgICAgICAgYWN0aXZlUG9wb3Zlci5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjdGl2ZVBvcG92ZXIgPSB0aGlzO1xuICAgICAgICBhY3RpdmVQb3BvdmVyLmlzT3BlbiA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcG9wb3ZlckNvbnRhaW5lciAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLnBvcG92ZXJDb250YWluZXJDbHN9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHNldENTU0Zyb21PYmoocG9wb3ZlckNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnBvcG92ZXJoZWlnaHQsXG4gICAgICAgICAgICBtaW5XaWR0aDogdGhpcy5wb3BvdmVyd2lkdGgsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5wb3BvdmVyd2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyYXJyb3cpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKHBvcG92ZXJDb250YWluZXIucXVlcnlTZWxlY3RvcignLmFycm93JykgYXMgSFRNTEVsZW1lbnQsICdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbiA9PT0gJ2hvdmVyJyB8fCB0aGlzLmludGVyYWN0aW9uID09PSAnZGVmYXVsdCcpIHtcblxuICAgICAgICAgICAgLy8gZG8gbm90IHVzZSBhZGRFdmVudExpc3RlbmVyIGhlcmVcbiAgICAgICAgICAgIC8vIGF0dGFjaGluZyB0aGUgZXZlbnQgdGhpcyB3YXkgd2lsbCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIub25tb3VzZWVudGVyID0gKCkgPT4gY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCk7XG4gICAgICAgICAgICBwb3BvdmVyQ29udGFpbmVyLm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQub25tb3VzZWVudGVyID0gKCkgPT4gY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50Lm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkZVJlZ2lzdGVyID0gdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihwb3BvdmVyQ29udGFpbmVyLCAna2V5ZG93bi5lc2MnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1c1RvUG9wb3ZlckxpbmsoKTtcbiAgICAgICAgICAgIGRlUmVnaXN0ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBvcG92ZXJTdGFydEJ0bjogSFRNTEVsZW1lbnQgPSBwb3BvdmVyQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLXN0YXJ0Jyk7XG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbmRCdG46IEhUTUxFbGVtZW50ID0gcG9wb3ZlckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucG9wb3Zlci1lbmQnKTtcbiAgICAgICAgcG9wb3ZlclN0YXJ0QnRuLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFNoaWZ0K1RhYiBrZXlcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1BvcG92ZXJEaXJlY3RpdmUuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c1RvUG9wb3ZlckxpbmsoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOyAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcG9wb3ZlckVuZEJ0bi5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBUYWIga2V5XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzVG9Qb3BvdmVyTGluaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7ICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vV2hlbmV2ZXIgYXV0b2Nsb3NlIHByb3BlcnR5IGlzIHNldCB0byAnYWx3YXlzJywgYWRkaW5nIHRoZSBvbmNsaWNrIGxpc3RlbmVyIHRvIHRoZSBwb3BvdmVyIGNvbnRhaW5lciB0byBjbG9zZSB0aGUgcG9wb3Zlci5cbiAgICAgICAgaWYgKHRoaXMuYXV0b2Nsb3NlID09PSBBVVRPQ0xPU0VfVFlQRS5BTFdBWVMpIHtcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIub25jbGljayA9ICgpID0+IHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcG9wb3ZlclN0YXJ0QnRuLmZvY3VzKCksIDUwKTtcbiAgICAgICAgLy8gQWRqdXN0aW5nIHBvcG92ZXIgcG9zaXRpb24gaWYgdGhlIHBvcG92ZXIgcGxhY2VtZW50IGlzIHRvcCBvciBib3R0b21cbiAgICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFkYXB0aXZlcG9zaXRpb24gKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3BvdmVyUG9zdGlvbihwb3BvdmVyQ29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyaWdnZXJpbmcgb25sb2FkIGFuZCBvbnNob3cgZXZlbnRzIGFmdGVyIHBvcG92ZXIgY29udGVudCBoYXMgcmVuZGVyZWRcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclBvcG92ZXJFdmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpZ2dlclBvcG92ZXJFdmVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzb3VyY2UgPT09ICdwYXJ0aWFsJykge1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsU3Vic2NyaXB0aW9uID0gdGhpcy5hcHAuc3Vic2NyaWJlKCdwYXJ0aWFsTG9hZGVkJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJFbGUgPSB0aGlzLnBhcnRpYWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBsZXQgcGFydGlhbFNjb3BlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhckVsZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsU2NvcGUgID0gcGFyRWxlLndpZGdldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5XaWRnZXRzICAgPSBwYXJ0aWFsU2NvcGUuV2lkZ2V0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WYXJpYWJsZXMgPSBwYXJ0aWFsU2NvcGUuVmFyaWFibGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkFjdGlvbnMgICA9IHBhcnRpYWxTY29wZS5BY3Rpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2xvYWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzaG93JywgeyRldmVudDoge3R5cGU6ICdzaG93J319KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FuY2VsU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuV2lkZ2V0cyAgID0gdGhpcy52aWV3UGFyZW50LldpZGdldHM7XG4gICAgICAgICAgICB0aGlzLlZhcmlhYmxlcyA9IHRoaXMudmlld1BhcmVudC5WYXJpYWJsZXM7XG4gICAgICAgICAgICB0aGlzLkFjdGlvbnMgICA9IHRoaXMudmlld1BhcmVudC5BY3Rpb25zO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzaG93JywgeyRldmVudDoge3R5cGU6ICdzaG93J319KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZVBvcG92ZXIoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pc09wZW4gPSBmYWxzZSwgNTAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dQb3BvdmVyKCkge1xuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5zaG93KCk7XG4gICAgfVxuXG4gICAgb25Qb3BvdmVyQW5jaG9yS2V5ZG93bigkZXZlbnQpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGVudCBhdmFpbGFibGUsIHRoZSBwb3BvdmVyIHNob3VsZCBub3Qgb3BlbiB0aHJvdWdoIGVudGVyIGtleS4gU28gY2hlY2tpbmcgd2hldGhlciB0aGUgY2FuUG9wb3Zlck9wZW4gZmxhZyBpcyB0cnVlIG9yIG5vdC5cbiAgICAgICAgaWYgKCF0aGlzLmNhblBvcG92ZXJPcGVuKSB7XG4gICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnY2xhc3MnIHx8IGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdjb250ZW50c291cmNlJykge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcGFydGlhbCBjb250ZW50IGF2YWlsYWJsZSwgdGhlIHBvcG92ZXIgc2hvdWxkIG5vdCBvcGVuXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50c291cmNlID09PSAncGFydGlhbCcgJiYgIXRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuUG9wb3Zlck9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgbnYpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuUG9wb3Zlck9wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdhdXRvY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzLm91dHNpZGVjbGljayA9IChudiA9PT0gQVVUT0NMT1NFX1RZUEUuT1VUU0lERUNMSUNLIHx8IG52ID09PSBBVVRPQ0xPU0VfVFlQRS5BTFdBWVMpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnRzTWFwW3RoaXMuaW50ZXJhY3Rpb25dO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHN0eWxlcih0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJUYXJnZXQgPSBnZXRDb250YWluZXJUYXJnZXRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAvLyBsZXQgcGFyZW50RWxlbVBvcG92ZXIgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkucGFyZW50cygpO1xuICAgICAgICAvLyBpZiAocGFyZW50RWxlbVBvcG92ZXIuY2xvc2VzdCgnW3dtVGFibGVdJykubGVuZ3RoIHx8XG4gICAgICAgIC8vICAgICBwYXJlbnRFbGVtUG9wb3Zlci5jbG9zZXN0KCdbd210YWJzXScpLmxlbmd0aCB8fFxuICAgICAgICAvLyAgICAgcGFyZW50RWxlbVBvcG92ZXIuY2xvc2VzdCgnbW9kYWwtY29udGFpbmVyJykubGVuZ3RoKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmFkYXB0aXZlcG9zaXRpb24gPSBmYWxzZTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIG5nT25EZXRhY2goKSB7XG4gICAgICAgIC8vIEhpZGUgdGhlIHBvcG92ZXIgY29udGFpbmVyIHdoaWxlIGF0dGFjaGluZyB0aGUgbmV4dCBjb21wb25lbnQgYXMgcGFydCBvZiBwYWdlIHJldXNlIHN0cmF0ZWd5LlxuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgfVxufVxuIiwiPGEgW3BvcG92ZXJdPVwicG9wb3ZlclRlbXBsYXRlXCJcbiAgICBbcG9wb3ZlckNvbnRleHRdPVwiY29udGV4dFwiXG4gICAgW3BvcG92ZXJUaXRsZV09XCJ0aXRsZVwiXG4gICAgW3BsYWNlbWVudF09XCJwb3BvdmVycGxhY2VtZW50XCJcbiAgICBbb3V0c2lkZUNsaWNrXT1cIm91dHNpZGVjbGlja1wiXG4gICAgW3RyaWdnZXJzXT1cImV2ZW50XCJcbiAgICAob25TaG93bik9XCJvblNob3duKClcIlxuICAgIChvbkhpZGRlbik9XCJvbkhpZGRlbigpXCJcbiAgICBjb250YWluZXJDbGFzcz1cImFwcC1wb3BvdmVyIGFuaW1hdGVkIHt7Y29udGVudGFuaW1hdGlvbn19IHt7cG9wb3ZlckNvbnRhaW5lckNsc319XCJcbiAgICBbY29udGFpbmVyXT1cImNvbnRhaW5lclRhcmdldCB8fCAnLndtLWFwcCdcIlxuICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgIFtjbGFzc109XCJjbGFzc1wiXG4gICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLXBvcG92ZXInOiAhY2FuUG9wb3Zlck9wZW59XCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJhZGFwdGl2ZXBvc2l0aW9uXCJcbiAgIGJvdW5kYXJpZXNFbGVtZW50PVwid2luZG93XCJcbiAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8IChiYWRnZXZhbHVlID8gY2FwdGlvbiArICcgJyArIGJhZGdldmFsdWUgOiBjYXB0aW9uKSB8fCAnUG9wb3ZlciBtZW51J1wiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgIHJvbGU9XCJidXR0b25cIlxuICAgICNhbmNob3JcbiAgICBuYW1lLmJpbmQ9XCJuYW1lXCJcbiAgICB3bUFuY2hvclxuICAgIGFuaW1hdGlvbi5iaW5kPVwiYW5pbWF0aW9uXCJcbiAgICBiYWRnZXZhbHVlLmJpbmQ9XCJiYWRnZXZhbHVlXCJcbiAgICBjYXB0aW9uLmJpbmQ9XCJjYXB0aW9uXCJcbiAgICBlbmNvZGV1cmwuYmluZD1cImVuY29kZXVybFwiXG4gICAgaGludC5iaW5kPVwiaGludFwiXG4gICAgaHlwZXJsaW5rLmJpbmQ9XCJoeXBlcmxpbmtcIlxuICAgIGljb251cmwuYmluZD1cImljb251cmxcIlxuICAgIGljb253aWR0aC5iaW5kPVwiaWNvbndpZHRoXCJcbiAgICBpY29uaGVpZ2h0LmJpbmQ9XCJpY29uaGVpZ2h0XCJcbiAgICBpY29ubWFyZ2luLmJpbmQ9XCJpY29ubWFyZ2luXCJcbiAgICBpY29uY2xhc3MuYmluZD1cImljb25jbGFzc1wiXG4gICAgaWNvbnBvc2l0aW9uLmJpbmQ9XCJpY29ucG9zaXRpb25cIlxuICAgIHNob3J0Y3V0a2V5LmJpbmQ9XCJzaG9ydGN1dGtleVwiXG4gICAgdGFiaW5kZXguYmluZD1cInRhYmluZGV4XCJcbiAgICAoa2V5ZG93bik9XCJvblBvcG92ZXJBbmNob3JLZXlkb3duKCRldmVudClcIj5cbjwvYT5cbiJdfQ==
397
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PopoverComponent, { className: "PopoverComponent", filePath: "popover.component.ts", lineNumber: 60 }); })();
398
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvbmF2aWdhdGlvbi9wb3BvdmVyL3NyYy9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9uYXZpZ2F0aW9uL3BvcG92ZXIvc3JjL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUVSLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE9BQU8sRUFDSCxRQUFRLEVBQ1IsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixHQUFHLEVBQ0gsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDaEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILGNBQWMsRUFDZCx1QkFBdUIsRUFFdkIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixNQUFNLEVBQ1QsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7OztBQUk5QyxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBa0I7SUFDakMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsU0FBUyxFQUFFLFdBQVc7Q0FDekIsQ0FBQztBQUVGLE1BQU0sU0FBUyxHQUFHO0lBQ2QsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsa0JBQWtCO0lBQ3pCLE9BQU8sRUFBRSxrQkFBa0I7Q0FDOUIsQ0FBQztBQUVGLElBQUksYUFBK0IsQ0FBQztBQVVwQyxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsaUJBQWlCO2FBQzVDLG9CQUFlLEdBQUcsYUFBYSxFQUFFLEFBQWxCLENBQW1CO2FBa0MxQixtQkFBYyxHQUF1QixFQUFFLEFBQXpCLENBQTBCO0lBT3ZELFlBQVksR0FBYSxFQUFVLEdBQVEsRUFBMEMsZUFBb0IsRUFBVSxHQUFzQjtRQUNySSxLQUFLLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQURaLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFBd0UsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF0Q2xJLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFHZixtQkFBYyxHQUFHLElBQUksQ0FBQztRQTJCckIsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBVXRDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxlQUFlLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRU8seUJBQXlCO1FBQzdCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUV6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztZQUUzQyxrSEFBa0g7WUFDbEgsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUMsQ0FDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQztnQkFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNuQyxDQUFDO1lBRUYsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO2dCQUMzQiwrRUFBK0U7Z0JBQy9FLE9BQU87WUFDWCxDQUFDO1lBRUQsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM1RSxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixPQUFPLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDeEMsT0FBTztZQUNYLENBQUM7WUFFRCxJQUFJLG1CQUFtQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLGdDQUFnQztnQkFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1QixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLDRCQUE0QjtnQkFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFHTyxnQkFBZ0I7UUFDcEIsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM5QyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztnQkFDekMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxZQUFvQjtRQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3RSxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBQ0QsNEZBQTRGO0lBQ3JGLElBQUk7UUFDUCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxpREFBaUQ7SUFDMUMsS0FBSztRQUNSLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNiLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRUQsNEJBQTRCO0lBQ3JCLFFBQVE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksYUFBYSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN6QixhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsV0FBVyxFQUFFLGdCQUFnQjtRQUM1RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM3RCxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM1RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxPQUFPO1FBRW5DLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixJQUFJLFdBQVcsR0FBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDNUUsZ0VBQWdFO1FBQ2hFLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xCLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUMzQixNQUFNLGNBQWMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7WUFDN0YsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsaUVBQWlFO1FBQ2pFLElBQUksV0FBVyxHQUFHLFlBQVksR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUM3Qyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0YsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDeEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsR0FBRyxhQUFhLENBQUM7Z0JBQ3ZFLE1BQU0sZ0JBQWdCLEdBQUksV0FBVyxHQUFHLGlCQUFpQixDQUFDO2dCQUMxRCxJQUFJLGNBQWMsQ0FBRTtnQkFDcEIsSUFBRyxXQUFXLElBQUUsR0FBRyxFQUFDLENBQUM7b0JBQ2pCLGNBQWMsR0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUN2RixDQUFDO3FCQUFJLENBQUM7b0JBQ0YsY0FBYyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDM0YsQ0FBQztnQkFDRCxJQUFHLGFBQWEsR0FBRyxHQUFHLEVBQUMsQ0FBQztvQkFDcEIsY0FBYyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsQ0FBQztnQkFDRixJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCw2QkFBNkI7SUFDdEIsT0FBTztRQUNWLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5Qyw2RkFBNkY7UUFDN0YsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCx3R0FBd0c7UUFDeEcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLElBQUksYUFBYSxJQUFJLGFBQWEsS0FBSyxJQUFJO2dCQUN2QyxhQUFhLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEQsYUFBYSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztnQkFDL0MsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFDRCxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xELGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFnQixDQUFDO1FBQ2hHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWhFLCtDQUErQztZQUMvQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBRTtnQkFDeEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRTtZQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFFakUsbUNBQW1DO1lBQ25DLHlFQUF5RTtZQUN6RSxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdFLGdCQUFnQixDQUFDLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ3hGLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQWdCLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sYUFBYSxHQUFnQixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEYsZUFBZSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xDLDBCQUEwQjtZQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUFZLENBQUM7UUFDekMsQ0FBQyxDQUFDO1FBQ0YsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2hDLG9CQUFvQjtZQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQy9CLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQVksQ0FBQztRQUN6QyxDQUFDLENBQUM7UUFFRiw0SEFBNEg7UUFDNUgsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xELENBQUM7UUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLHVFQUF1RTtRQUN2RSxVQUFVLENBQUUsR0FBRyxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRyxDQUFDO2dCQUMxQixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QseUVBQXlFO1lBQ3pFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7Z0JBQzdDLElBQUksWUFBWSxDQUFDO2dCQUVqQixJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNULFlBQVksR0FBSSxNQUFNLENBQUMsTUFBTSxDQUFDO29CQUM5QixJQUFJLENBQUMsT0FBTyxHQUFLLFlBQVksQ0FBQyxPQUFPLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDO29CQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDO2dCQUNELGtCQUFrQixFQUFFLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxPQUFPLEdBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDTCxDQUFDO0lBRU8sV0FBVztRQUNmLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sV0FBVztRQUNmLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsTUFBTTtRQUN6QiwrSUFBK0k7UUFDL0ksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1YsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVcsRUFBRSxFQUFPLEVBQUUsRUFBUTtRQUMzQyxJQUFJLEdBQUcsS0FBSyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxHQUFHLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDMUIsd0VBQXdFO1lBQ3hFLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRSxLQUFLLGNBQWMsQ0FBQyxZQUFZLElBQUksRUFBRSxLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDNUcsQ0FBQztRQUNELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsZUFBZTtRQUNYLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkUsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxzREFBc0Q7UUFDdEQsNkRBQTZEO1FBQzdELHFDQUFxQztRQUNyQyxJQUFJO0lBQ1IsQ0FBQztJQUVELFVBQVU7UUFDTixnR0FBZ0c7UUFDaEcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxTQUFTO1FBQ0wsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixRQUFRLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2IsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNMLENBQUM7aUZBaFlRLGdCQUFnQix3RkEwQzRCLGtCQUFrQjtvRUExQzlELGdCQUFnQjt3Q0F1Q1gsV0FBVzs7Ozs7OzsyQkFGZCxnQkFBZ0I7Ozs7Ozs4Q0ExQ2hCO2dCQUNQLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDO2FBQ3ZDOztZQ3hETCwrQkFxQytDO1lBQTNDLEFBOUJBLEFBREEsa0lBQVcsYUFBUyxLQUFDLHVIQUNULGNBQVUsS0FBQywySEE4Qlosa0NBQThCLEtBQUM7WUFDOUMsaUJBQUk7O1lBekJBLHdCQUFlO1lBTGYsNEhBQWtGO1lBT2xGLEFBREEsQUFGQSxBQURBLEFBREEsQUFEQSxBQUpBLEFBREEsQUFEQSxBQURBLEFBREEsQUFERCw2Q0FBMkIsK0JBQ0EsMkJBQ0osbUNBQ1Esa0NBQ0QsdUJBQ1gsK0NBSXdCLHNCQUN6QiwwQkFDSSxrQkFDUiw2REFFbUMsMENBQ1g7Ozs7aUZENEM1QixnQkFBZ0I7Y0FSNUIsU0FBUzsyQkFDSSxZQUFZLGFBRVg7b0JBQ1Asa0JBQWtCLGtCQUFrQjtpQkFDdkM7O3NCQTZDNkMsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cURBTDdDLGtCQUFrQjtrQkFBdEQsU0FBUzttQkFBQyxnQkFBZ0I7WUFDWSxTQUFTO2tCQUEvQyxTQUFTO21CQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDVixlQUFlO2tCQUF6QyxZQUFZO21CQUFDLFdBQVc7WUFDQSxVQUFVO2tCQUFsQyxZQUFZO21CQUFDLFNBQVM7O2tGQXhDZCxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1BvcG92ZXJEaXJlY3RpdmV9IGZyb20gJ25neC1ib290c3RyYXAvcG9wb3Zlcic7XG5cbmltcG9ydCB7XG4gICAgYWRkQ2xhc3MsXG4gICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sXG4gICAgYWRqdXN0Q29udGFpbmVyUmlnaHRFZGdlcyxcbiAgICBBcHAsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgc2V0Q1NTRnJvbU9ialxufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIEFVVE9DTE9TRV9UWVBFLFxuICAgIGdldENvbnRhaW5lclRhcmdldENsYXNzLFxuICAgIElXaWRnZXRDb25maWcsXG4gICAgcHJvdmlkZUFzV2lkZ2V0UmVmLFxuICAgIFN0eWxhYmxlQ29tcG9uZW50LFxuICAgIHN0eWxlclxufSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL3BvcG92ZXIucHJvcHMnO1xuXG5kZWNsYXJlIGNvbnN0ICQ7XG5cbmNvbnN0IERFRkFVTFRfQ0xTID0gJ2FwcC1wb3BvdmVyLXdyYXBwZXInO1xuY29uc3QgV0lER0VUX0NPTkZJRzogSVdpZGdldENvbmZpZyA9IHtcbiAgICB3aWRnZXRUeXBlOiAnd20tcG9wb3ZlcicsXG4gICAgaG9zdENsYXNzOiBERUZBVUxUX0NMU1xufTtcblxuY29uc3QgZXZlbnRzTWFwID0ge1xuICAgIGNsaWNrOiAnY2xpY2snLFxuICAgIGhvdmVyOiAnbW91c2VlbnRlcjpjbGljaycsXG4gICAgZGVmYXVsdDogJ2NsaWNrIG1vdXNlZW50ZXInXG59O1xuXG5sZXQgYWN0aXZlUG9wb3ZlcjogUG9wb3ZlckNvbXBvbmVudDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd3bS1wb3BvdmVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihQb3BvdmVyQ29tcG9uZW50KVxuICAgIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBQb3BvdmVyQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG5cbiAgICBwdWJsaWMgZXZlbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjbG9zZVBvcG92ZXJUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBwb3BvdmVyQ29udGFpbmVyQ2xzO1xuICAgIHB1YmxpYyBjYW5Qb3BvdmVyT3BlbiA9IHRydWU7XG4gICAgcHJpdmF0ZSBXaWRnZXRzO1xuICAgIHByaXZhdGUgVmFyaWFibGVzO1xuICAgIHByaXZhdGUgQWN0aW9ucztcblxuICAgIHB1YmxpYyBpbnRlcmFjdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBwb3BvdmVyYXJyb3c6IGJvb2xlYW47XG4gICAgcHVibGljIHBvcG92ZXJ3aWR0aDogc3RyaW5nO1xuICAgIHB1YmxpYyBwb3BvdmVyaGVpZ2h0OiBzdHJpbmc7XG4gICAgcHVibGljIGNvbnRlbnRhbmltYXRpb246IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudHNvdXJjZTogc3RyaW5nO1xuICAgIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG4gICAgcHVibGljIHBvcG92ZXJwbGFjZW1lbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgb3V0c2lkZWNsaWNrOiBib29sZWFuO1xuICAgIHB1YmxpYyBhdXRvY2xvc2U6IHN0cmluZztcblxuICAgIHB1YmxpYyBjbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWJpbmRleDogYW55O1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGFkYXB0aXZlcG9zaXRpb246Ym9vbGVhbjtcbiAgICBwdWJsaWMgY29udGFpbmVyVGFyZ2V0OiBzdHJpbmc7XG4gICAgcHVibGljIGhpbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgYXJpYWxhYmVsOiBzdHJpbmc7XG4gICAgcHVibGljIGNhcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgYmFkZ2V2YWx1ZTogc3RyaW5nO1xuICAgIHByaXZhdGUgZG9jdW1lbnRDbGlja0hhbmRsZXI6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgaXNDbG9zaW5nUHJvZ3JhbW1hdGljYWxseSA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIGFjdGl2ZVBvcG92ZXJzOiBQb3BvdmVyQ29tcG9uZW50W10gPSBbXTtcblxuICAgIEBWaWV3Q2hpbGQoUG9wb3ZlckRpcmVjdGl2ZSkgcHJpdmF0ZSBic1BvcG92ZXJEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgnYW5jaG9yJywgeyBzdGF0aWM6IHRydWUgfSkgYW5jaG9yUmVmOiBFbGVtZW50UmVmO1xuICAgIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIHBvcG92ZXJUZW1wbGF0ZTtcbiAgICBAQ29udGVudENoaWxkKCdwYXJ0aWFsJykgcGFydGlhbFJlZjtcblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0KTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29udGFpbmVyQ2xzID0gYGFwcC1wb3BvdmVyLSR7dGhpcy53aWRnZXRJZH1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBEb2N1bWVudENsaWNrSGFuZGxlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrZWQgZWxlbWVudCBvciBhbnkgb2YgaXRzIHBhcmVudHMgaXMgcGFydCBvZiB0aGUgZGF0ZXBpY2tlciwgZHJvcGRvd24sIG9yIHR5cGVhaGVhZCBjb250YWluZXJzXG4gICAgICAgICAgICBjb25zdCBpc0luc2lkZVNwZWNpYWxDb250YWluZXIgPSAhIShcbiAgICAgICAgICAgICAgICB0YXJnZXQuY2xvc2VzdCgnLmJzLWRhdGVwaWNrZXItY29udGFpbmVyJykgfHwgXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmNsb3Nlc3QoXCIuZHJvcGRvd24tbWVudVwiKVxuICAgICAgICAgICAgKTtcbiAgICBcbiAgICAgICAgICAgIGlmIChpc0luc2lkZVNwZWNpYWxDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2xpY2sgd2FzIGluc2lkZSBvbmUgb2YgdGhlc2UgY29udGFpbmVycywgd2UgZG8gbm90IGNsb3NlIHRoZSBwb3BvdmVyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgY2xpY2tlZFBvcG92ZXJJbmRleCA9IFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuZmluZEluZGV4KHBvcG92ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcG92ZXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtwb3BvdmVyLnBvcG92ZXJDb250YWluZXJDbHN9YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcG92ZXJDb250YWluZXI/LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGlmIChjbGlja2VkUG9wb3ZlckluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIENsaWNrIGlzIG91dHNpZGUgYWxsIHBvcG92ZXJzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3V0c2lkZWNsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxQb3BvdmVycygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xpY2sgaXMgaW5zaWRlIGEgcG9wb3ZlclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VJbm5lclBvcG92ZXJzKGNsaWNrZWRQb3BvdmVySW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgIH1cbiAgICBcblxuICAgIHByaXZhdGUgY2xvc2VBbGxQb3BvdmVycygpIHtcbiAgICAgICAgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5mb3JFYWNoKHBvcG92ZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHBvcG92ZXIub3V0c2lkZWNsaWNrKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5pc0Nsb3NpbmdQcm9ncmFtbWF0aWNhbGx5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VJbm5lclBvcG92ZXJzKGNsaWNrZWRJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBjbGlja2VkSW5kZXggKyAxOyBpIDwgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlciA9IFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnNbaV07XG4gICAgICAgICAgICBpZiAocG9wb3Zlci5vdXRzaWRlY2xpY2spIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmlzQ2xvc2luZ1Byb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNDaGlsZFBvcG92ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhISQodGhpcy5uYXRpdmVFbGVtZW50KS5jbG9zZXN0KCcucG9wb3ZlcicpLmxlbmd0aDtcbiAgICB9XG4gICAgLy8gVGhpcyBtZWh0b2QgaXMgdXNlZCB0byBzaG93L29wZW4gdGhlIHBvcG92ZXIuIFRoaXMgcmVmZXJzIHRvIHRoZSBzYW1lIG1ldGhvZCBzaG93UG9wb3Zlci5cbiAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wb3ZlcigpO1xuICAgICAgICBpZiAoIVBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuaW5jbHVkZXModGhpcykpIHtcbiAgICAgICAgICAgIFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMucHVzaCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZWh0b2QgaXMgdXNlZCB0byBoaWRlL2Nsb3NlIHRoZSBwb3BvdmVyLlxuICAgIHB1YmxpYyBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ2xvc2luZ1Byb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLmhpZGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5pbmRleE9mKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBQb3BvdmVyQ29tcG9uZW50LmFjdGl2ZVBvcG92ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIG9uIGhpZGluZyBwb3BvdmVyXG4gICAgcHVibGljIG9uSGlkZGVuKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaGlsZFBvcG92ZXIoKSB8fCB0aGlzLmlzQ2xvc2luZ1Byb2dyYW1tYXRpY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnaGlkZScsIHskZXZlbnQ6IHt0eXBlOiAnaGlkZSd9fSk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGFjdGl2ZVBvcG92ZXIgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVQb3BvdmVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2xvc2luZ1Byb2dyYW1tYXRpY2FsbHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvY3VzVG9Qb3BvdmVyTGluaygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCksIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkanVzdFBvcG92ZXJBcnJvd1Bvc2l0aW9uKHBvcG92ZXJFbGVtLCBwb3BvdmVyTGVmdFNoaWZ0KSB7XG4gICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyLl9uZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHBvcG92ZXJFbGVtLmZpbmQoJy5wb3BvdmVyLWFycm93JykuY3NzKCdsZWZ0JywgcG9wb3ZlckxlZnRTaGlmdCArICdweCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvcG92ZXJQb3N0aW9uKGVsZW1lbnQpIHtcblxuICAgICAgICBjb25zdCBwb3BvdmVyRWxlbSA9ICQoZWxlbWVudCk7XG4gICAgICAgIGxldCBwb3BvdmVyTGVmdCA9ICBwb3BvdmVyRWxlbS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICBjb25zdCBwb3BvdmVyV2lkdGggPSBwb3BvdmVyRWxlbVswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgdmlld1BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICBjb25zdCBwYXJlbnREaW1lc2lvbiA9IHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIEFkanVzdGluZyBwb3BvdmVyIHBvc2l0aW9uLCBpZiBpdCBpcyBub3QgdmlzaWJsZSBhdCBsZWZ0IHNpZGVcbiAgICAgICAgaWYgKHBvcG92ZXJMZWZ0IDwgMCkge1xuICAgICAgICAgICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24ocG9wb3ZlckVsZW0sIHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcy5ic1BvcG92ZXJEaXJlY3RpdmUuX3BvcG92ZXIpO1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlckxlZnRTaGlmdCA9IDQ7XG4gICAgICAgICAgICBjb25zdCBhcnJvd0xlZnRTaGlmdCA9IChwYXJlbnREaW1lc2lvbi5sZWZ0ICsgKHBhcmVudERpbWVzaW9uLndpZHRoIC8gMikpIC0gcG9wb3ZlckxlZnRTaGlmdDtcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9wb3ZlckFycm93UG9zaXRpb24ocG9wb3ZlckVsZW0sIGFycm93TGVmdFNoaWZ0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3RpbmcgcG9wb3ZlciBwb3NpdGlvbiwgaWYgaXQgaXMgbm90IHZpc2libGUgYXQgcmlnaHQgc2lkZVxuICAgICAgICBpZiAocG9wb3ZlckxlZnQgKyBwb3BvdmVyV2lkdGggPiB2aWV3UG9ydFdpZHRoKSB7XG4gICAgICAgICAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzKHBvcG92ZXJFbGVtLCB0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBvcG92ZXJMZWZ0ID0gcG9wb3ZlckVsZW0ub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3BvdmVyTGVmdEFkanVzdCA9IChwb3BvdmVyTGVmdCArIHBvcG92ZXJXaWR0aCkgLSB2aWV3UG9ydFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcG92ZXJMZWZ0U2hpZnQgPSAgcG9wb3ZlckxlZnQgLSBwb3BvdmVyTGVmdEFkanVzdDtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0U2hpZnQgO1xuICAgICAgICAgICAgICAgIGlmKHBvcG92ZXJMZWZ0PD0xMDApe1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCA9ICAocGFyZW50RGltZXNpb24ubGVmdCArIChwYXJlbnREaW1lc2lvbi53aWR0aCAvIDIpKSAtIHBvcG92ZXJMZWZ0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCA9IChwYXJlbnREaW1lc2lvbi5sZWZ0ICsgKHBhcmVudERpbWVzaW9uLndpZHRoIC8gMikpIC0gcG9wb3ZlckxlZnRTaGlmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodmlld1BvcnRXaWR0aCA+IDUwMCl7XG4gICAgICAgICAgICAgICAgICAgIGFycm93TGVmdFNoaWZ0ICs9IDMwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9wb3ZlckFycm93UG9zaXRpb24ocG9wb3ZlckVsZW0sIGFycm93TGVmdFNoaWZ0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbiBzaG93aW5nIHBvcG92ZXJcbiAgICBwdWJsaWMgb25TaG93bigpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGZpbmRSb290Q29udGFpbmVyKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAvLyBpZiBwYWdlIHN0eWxlcyBoYXZlIHRvIGJlIGFwcGxpZWQgdG8gcG9wb3ZlciB0aGVuIHBvcG92ZXIgaGFzIHRvIGJlIGNoaWxkIG9mIHBhZ2UgZWxlbWVudC5cbiAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICQoJ2JvZHkgPiBwb3BvdmVyLWNvbnRhaW5lcicpLndyYXAoJzwnICsgcm9vdCArICcvPicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpeCBmb3IgW1dNUy0yNTEyNV06IE5vdCBjbG9zaW5nIHRoZSBleGlzdGluZyBvcGVuZWQgcG9wb3ZlcnMgd2hlbiB0aGUgYXV0b2Nsb3NlIHByb3BlcnR5IGlzIERJU0FCTEVEXG4gICAgICAgIGlmICghdGhpcy5pc0NoaWxkUG9wb3ZlcigpKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlUG9wb3ZlciAmJiBhY3RpdmVQb3BvdmVyICE9PSB0aGlzICYmIFxuICAgICAgICAgICAgICAgIGFjdGl2ZVBvcG92ZXIuYXV0b2Nsb3NlICE9PSBBVVRPQ0xPU0VfVFlQRS5ESVNBQkxFRCkge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVBvcG92ZXIuaXNDbG9zaW5nUHJvZ3JhbW1hdGljYWxseSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWN0aXZlUG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWN0aXZlUG9wb3ZlciA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgIGlmICghUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5pbmNsdWRlcyh0aGlzKSkge1xuICAgICAgICAgICAgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvcG92ZXJDb250YWluZXIgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7dGhpcy5wb3BvdmVyQ29udGFpbmVyQ2xzfWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocG9wb3ZlckNvbnRhaW5lcikge1xuICAgICAgICAgICAgcG9wb3ZlckNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtcG9wb3Zlci1pZCcsIHRoaXMud2lkZ2V0SWQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBZGQgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gc3RvcCBwcm9wYWdhdGlvblxuICAgICAgICAgICAgcG9wb3ZlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldENTU0Zyb21PYmoocG9wb3ZlckNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnBvcG92ZXJoZWlnaHQsXG4gICAgICAgICAgICBtaW5XaWR0aDogdGhpcy5wb3BvdmVyd2lkdGgsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5wb3BvdmVyd2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyYXJyb3cpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKHBvcG92ZXJDb250YWluZXIucXVlcnlTZWxlY3RvcignLmFycm93JykgYXMgSFRNTEVsZW1lbnQsICdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbiA9PT0gJ2hvdmVyJyB8fCB0aGlzLmludGVyYWN0aW9uID09PSAnZGVmYXVsdCcpIHtcblxuICAgICAgICAgICAgLy8gZG8gbm90IHVzZSBhZGRFdmVudExpc3RlbmVyIGhlcmVcbiAgICAgICAgICAgIC8vIGF0dGFjaGluZyB0aGUgZXZlbnQgdGhpcyB3YXkgd2lsbCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIub25tb3VzZWVudGVyID0gKCkgPT4gY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCk7XG4gICAgICAgICAgICBwb3BvdmVyQ29udGFpbmVyLm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQub25tb3VzZWVudGVyID0gKCkgPT4gY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50Lm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vdXRzaWRlY2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBEb2N1bWVudENsaWNrSGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbmNob3JSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRlUmVnaXN0ZXIgPSB0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHBvcG92ZXJDb250YWluZXIsICdrZXlkb3duLmVzYycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldEZvY3VzVG9Qb3BvdmVyTGluaygpO1xuICAgICAgICAgICAgZGVSZWdpc3RlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcG9wb3ZlclN0YXJ0QnRuOiBIVE1MRWxlbWVudCA9IHBvcG92ZXJDb250YWluZXIucXVlcnlTZWxlY3RvcignLnBvcG92ZXItc3RhcnQnKTtcbiAgICAgICAgY29uc3QgcG9wb3ZlckVuZEJ0bjogSFRNTEVsZW1lbnQgPSBwb3BvdmVyQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLWVuZCcpO1xuICAgICAgICBwb3BvdmVyU3RhcnRCdG4ub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgU2hpZnQrVGFiIGtleVxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzVG9Qb3BvdmVyTGluaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7ICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwb3BvdmVyRW5kQnRuLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFRhYiBrZXlcbiAgICAgICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLmhpZGUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXNUb1BvcG92ZXJMaW5rKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTsgICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9XaGVuZXZlciBhdXRvY2xvc2UgcHJvcGVydHkgaXMgc2V0IHRvICdhbHdheXMnLCBhZGRpbmcgdGhlIG9uY2xpY2sgbGlzdGVuZXIgdG8gdGhlIHBvcG92ZXIgY29udGFpbmVyIHRvIGNsb3NlIHRoZSBwb3BvdmVyLlxuICAgICAgICBpZiAodGhpcy5hdXRvY2xvc2UgPT09IEFVVE9DTE9TRV9UWVBFLkFMV0FZUykge1xuICAgICAgICAgICAgcG9wb3ZlckNvbnRhaW5lci5vbmNsaWNrID0gKCkgPT4gdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBwb3BvdmVyU3RhcnRCdG4uZm9jdXMoKSwgNTApO1xuICAgICAgICAvLyBBZGp1c3RpbmcgcG9wb3ZlciBwb3NpdGlvbiBpZiB0aGUgcG9wb3ZlciBwbGFjZW1lbnQgaXMgdG9wIG9yIGJvdHRvbVxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRhcHRpdmVwb3NpdGlvbiApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvcG92ZXJQb3N0aW9uKHBvcG92ZXJDb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdHJpZ2dlcmluZyBvbmxvYWQgYW5kIG9uc2hvdyBldmVudHMgYWZ0ZXIgcG9wb3ZlciBjb250ZW50IGhhcyByZW5kZXJlZFxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyUG9wb3ZlckV2ZW50cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyUG9wb3ZlckV2ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudHNvdXJjZSA9PT0gJ3BhcnRpYWwnKSB7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxTdWJzY3JpcHRpb24gPSB0aGlzLmFwcC5zdWJzY3JpYmUoJ3BhcnRpYWxMb2FkZWQnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhckVsZSA9IHRoaXMucGFydGlhbFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsU2NvcGU7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyRWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTY29wZSAgPSBwYXJFbGUud2lkZ2V0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLldpZGdldHMgICA9IHBhcnRpYWxTY29wZS5XaWRnZXRzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLlZhcmlhYmxlcyA9IHBhcnRpYWxTY29wZS5WYXJpYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWN0aW9ucyAgID0gcGFydGlhbFNjb3BlLkFjdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnbG9hZCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Nob3cnLCB7JGV2ZW50OiB7dHlwZTogJ3Nob3cnfX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYW5jZWxTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5XaWRnZXRzICAgPSB0aGlzLnZpZXdQYXJlbnQuV2lkZ2V0cztcbiAgICAgICAgICAgIHRoaXMuVmFyaWFibGVzID0gdGhpcy52aWV3UGFyZW50LlZhcmlhYmxlcztcbiAgICAgICAgICAgIHRoaXMuQWN0aW9ucyAgID0gdGhpcy52aWV3UGFyZW50LkFjdGlvbnM7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Nob3cnLCB7JGV2ZW50OiB7dHlwZTogJ3Nob3cnfX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlUG9wb3ZlcigpIHtcbiAgICAgICAgdGhpcy5pc0Nsb3NpbmdQcm9ncmFtbWF0aWNhbGx5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbG9zZVBvcG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmlzT3BlbiA9IGZhbHNlLCA1MDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd1BvcG92ZXIoKSB7XG4gICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLnNob3coKTtcbiAgICB9XG5cbiAgICBvblBvcG92ZXJBbmNob3JLZXlkb3duKCRldmVudCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb250ZW50IGF2YWlsYWJsZSwgdGhlIHBvcG92ZXIgc2hvdWxkIG5vdCBvcGVuIHRocm91Z2ggZW50ZXIga2V5LiBTbyBjaGVja2luZyB3aGV0aGVyIHRoZSBjYW5Qb3BvdmVyT3BlbiBmbGFnIGlzIHRydWUgb3Igbm90LlxuICAgICAgICBpZiAoIXRoaXMuY2FuUG9wb3Zlck9wZW4pIHtcbiAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcG92ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5OiBzdHJpbmcsIG52OiBhbnksIG92PzogYW55KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdjbGFzcycgfHwga2V5ID09PSAndGFiaW5kZXgnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NvbnRlbnRzb3VyY2UnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBwYXJ0aWFsIGNvbnRlbnQgYXZhaWxhYmxlLCB0aGUgcG9wb3ZlciBzaG91bGQgbm90IG9wZW5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRzb3VyY2UgPT09ICdwYXJ0aWFsJyAmJiAhdGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5Qb3BvdmVyT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdjb250ZW50JyAmJiBudikge1xuICAgICAgICAgICAgdGhpcy5jYW5Qb3BvdmVyT3BlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2F1dG9jbG9zZScpIHtcbiAgICAgICAgICAgIHRoaXMub3V0c2lkZWNsaWNrID0gKG52ID09PSBBVVRPQ0xPU0VfVFlQRS5PVVRTSURFQ0xJQ0sgfHwgbnYgPT09IEFVVE9DTE9TRV9UWVBFLkFMV0FZUykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudHNNYXBbdGhpcy5pbnRlcmFjdGlvbl07XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgc3R5bGVyKHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclRhcmdldCA9IGdldENvbnRhaW5lclRhcmdldENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIC8vIGxldCBwYXJlbnRFbGVtUG9wb3ZlciA9ICQodGhpcy5uYXRpdmVFbGVtZW50KS5wYXJlbnRzKCk7XG4gICAgICAgIC8vIGlmIChwYXJlbnRFbGVtUG9wb3Zlci5jbG9zZXN0KCdbd21UYWJsZV0nKS5sZW5ndGggfHxcbiAgICAgICAgLy8gICAgIHBhcmVudEVsZW1Qb3BvdmVyLmNsb3Nlc3QoJ1t3bXRhYnNdJykubGVuZ3RoIHx8XG4gICAgICAgIC8vICAgICBwYXJlbnRFbGVtUG9wb3Zlci5jbG9zZXN0KCdtb2RhbC1jb250YWluZXInKS5sZW5ndGgpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYWRhcHRpdmVwb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgbmdPbkRldGFjaCgpIHtcbiAgICAgICAgLy8gSGlkZSB0aGUgcG9wb3ZlciBjb250YWluZXIgd2hpbGUgYXR0YWNoaW5nIHRoZSBuZXh0IGNvbXBvbmVudCBhcyBwYXJ0IG9mIHBhZ2UgcmV1c2Ugc3RyYXRlZ3kuXG4gICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLmhpZGUoKTtcbiAgICB9XG5cbiAgICBPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tIYW5kbGVyKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5pbmRleE9mKHRoaXMpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGEgW3BvcG92ZXJdPVwicG9wb3ZlclRlbXBsYXRlXCJcbiAgICBbcG9wb3ZlckNvbnRleHRdPVwiY29udGV4dFwiXG4gICAgW3BvcG92ZXJUaXRsZV09XCJ0aXRsZVwiXG4gICAgW3BsYWNlbWVudF09XCJwb3BvdmVycGxhY2VtZW50XCJcbiAgICBbb3V0c2lkZUNsaWNrXT1cIm91dHNpZGVjbGlja1wiXG4gICAgW3RyaWdnZXJzXT1cImV2ZW50XCJcbiAgICAob25TaG93bik9XCJvblNob3duKClcIlxuICAgIChvbkhpZGRlbik9XCJvbkhpZGRlbigpXCJcbiAgICBjb250YWluZXJDbGFzcz1cImFwcC1wb3BvdmVyIGFuaW1hdGVkIHt7Y29udGVudGFuaW1hdGlvbn19IHt7cG9wb3ZlckNvbnRhaW5lckNsc319XCJcbiAgICBbY29udGFpbmVyXT1cImNvbnRhaW5lclRhcmdldCB8fCAnLndtLWFwcCdcIlxuICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgIFtjbGFzc109XCJjbGFzc1wiXG4gICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLXBvcG92ZXInOiAhY2FuUG9wb3Zlck9wZW59XCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJhZGFwdGl2ZXBvc2l0aW9uXCJcbiAgIGJvdW5kYXJpZXNFbGVtZW50PVwid2luZG93XCJcbiAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8IChiYWRnZXZhbHVlID8gY2FwdGlvbiArICcgJyArIGJhZGdldmFsdWUgOiBjYXB0aW9uKSB8fCAnUG9wb3ZlciBtZW51J1wiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgIHJvbGU9XCJidXR0b25cIlxuICAgICNhbmNob3JcbiAgICBuYW1lLmJpbmQ9XCJuYW1lXCJcbiAgICB3bUFuY2hvclxuICAgIGFuaW1hdGlvbi5iaW5kPVwiYW5pbWF0aW9uXCJcbiAgICBiYWRnZXZhbHVlLmJpbmQ9XCJiYWRnZXZhbHVlXCJcbiAgICBjYXB0aW9uLmJpbmQ9XCJjYXB0aW9uXCJcbiAgICBlbmNvZGV1cmwuYmluZD1cImVuY29kZXVybFwiXG4gICAgaGludC5iaW5kPVwiaGludFwiXG4gICAgaHlwZXJsaW5rLmJpbmQ9XCJoeXBlcmxpbmtcIlxuICAgIGljb251cmwuYmluZD1cImljb251cmxcIlxuICAgIGljb253aWR0aC5iaW5kPVwiaWNvbndpZHRoXCJcbiAgICBpY29uaGVpZ2h0LmJpbmQ9XCJpY29uaGVpZ2h0XCJcbiAgICBpY29ubWFyZ2luLmJpbmQ9XCJpY29ubWFyZ2luXCJcbiAgICBpY29uY2xhc3MuYmluZD1cImljb25jbGFzc1wiXG4gICAgaWNvbnBvc2l0aW9uLmJpbmQ9XCJpY29ucG9zaXRpb25cIlxuICAgIHNob3J0Y3V0a2V5LmJpbmQ9XCJzaG9ydGN1dGtleVwiXG4gICAgdGFiaW5kZXguYmluZD1cInRhYmluZGV4XCJcbiAgICAoa2V5ZG93bik9XCJvblBvcG92ZXJBbmNob3JLZXlkb3duKCRldmVudClcIj5cbjwvYT5cbiJdfQ==