@cuby-ui/core 0.0.596 → 0.0.598

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, output, viewChild } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, output, signal, viewChild } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { CuiIdService } from '@cuby-ui/cdk';
4
4
  import EditorJS from '@editorjs/editorjs';
5
- import { concatMap, delay, finalize, fromEvent, map, Subject, takeWhile, tap, throttleTime, timer, toArray } from 'rxjs';
5
+ import { catchError, concatMap, EMPTY, finalize, map, Subject, tap, timer, toArray } from 'rxjs';
6
6
  import { CUI_JTEXT_API_SERVICE, CuiJTextApiService } from '@cuby-ui/api';
7
7
  import { getEditorConfig } from './config';
8
8
  import { COMBINED_TEXT_BLOCK_NAME, COMBINED_TEXT_BLOCK_PART, DEFAULT_CONFIG } from './constants/editor.constants';
@@ -17,59 +17,115 @@ export class CuiEditorComponent {
17
17
  this.editorService = inject(CuiEditorService);
18
18
  this.jTextService = inject(CUI_JTEXT_API_SERVICE);
19
19
  this.POOLING_DELAY = 100;
20
- this.ELEMENT_SPACE_TO_BOTTOM = 150;
21
- this.SCROLL_THROTTLE_TIME = 200;
20
+ this.RETRY_DELAY = 3000;
22
21
  this.emptyQueue = new Subject();
23
22
  this.initChain = Promise.resolve();
23
+ this.lazyLoadObserver = null;
24
+ this.lazyLoadSubscription = null;
24
25
  this.isSkipCombinedBlockOnChange = [];
25
26
  this.isFirst = true;
26
27
  this.isChanging = false;
27
28
  this.isSkip = false;
28
29
  this.isRequested = false;
29
30
  this.isDestroyed = false;
31
+ this.isPreloadFinished = false;
32
+ this.hasEndLeftZone = false;
30
33
  // Нужен для соотношения локального ID и основного ID после создания элемента
31
34
  this.blockIdsMap = new Map();
32
35
  this.combinedBlocks = new Map();
33
36
  this.index = 0;
34
37
  this.page = 0;
38
+ this.lazyLoadVersion = 0;
35
39
  this.addedBlocks = [];
36
40
  this.updatedBlocks = [];
37
41
  this.removedBlocksIds = [];
38
42
  this.changesQueue = [];
39
43
  this.abortController = new AbortController();
40
- this.editorId = this.cuiIdService.generate();
41
44
  this.isReadonly = computed(() => this.config()?.readOnly);
42
45
  this.requestOptions = computed(() => this.config()?.requestOptions);
46
+ this.editorEndRef = viewChild.required('editorEnd');
47
+ this.isEditorReady = signal(false);
48
+ this.editorId = this.cuiIdService.generate();
43
49
  this.editorRef = viewChild.required('editor');
44
50
  this.editorApiId = input.required();
45
51
  this.config = input(DEFAULT_CONFIG);
46
52
  this.requestSize = input(40);
47
53
  this.editorEmpty = output();
54
+ this.editorReady = output();
48
55
  this.initEditorEffect();
49
56
  }
50
57
  ngOnDestroy() {
51
58
  this.isDestroyed = true;
52
59
  this.enqueueInit(() => this.teardownEditor());
53
60
  }
54
- onScrollEvent(element) {
55
- const overallHeight = element.scrollHeight - this.ELEMENT_SPACE_TO_BOTTOM;
56
- const currentHeight = element.scrollTop + element.clientHeight;
57
- if (currentHeight < overallHeight || this.isRequested) {
58
- return;
59
- }
61
+ loadPage() {
60
62
  this.isRequested = true;
63
+ const version = this.lazyLoadVersion;
61
64
  const size = this.requestSize();
62
65
  let blocksCount = 0;
63
- this.getBlocks(this.page, size)
64
- .pipe(tap((blocks) => (blocksCount = blocks.length)), finalize(() => {
65
- this.isRequested = false;
66
- if (blocksCount >= size) {
67
- return;
68
- }
69
- this.scrollSubscription.unsubscribe();
70
- }))
66
+ let isFailed = false;
67
+ this.lazyLoadSubscription = this.getBlocks(this.page, size)
68
+ .pipe(tap((blocks) => (blocksCount = blocks.length)), catchError(() => {
69
+ isFailed = true;
70
+ return EMPTY;
71
+ }), finalize(() => this.finishPageLoad(blocksCount, size, version, isFailed)))
71
72
  .subscribe();
73
+ }
74
+ finishPageLoad(blocksCount, size, version, isFailed) {
75
+ this.isRequested = false;
76
+ if (this.isDestroyed || version !== this.lazyLoadVersion) {
77
+ return;
78
+ }
79
+ if (isFailed) {
80
+ this.retryPageLoad(version);
81
+ return;
82
+ }
72
83
  this.page++;
84
+ this.scheduleNextPage(blocksCount, size, version);
85
+ }
86
+ retryPageLoad(version) {
87
+ this.isRequested = true;
88
+ timer(this.RETRY_DELAY)
89
+ .pipe(takeUntilDestroyed(this.destroy))
90
+ .subscribe(() => {
91
+ if (this.isDestroyed || version !== this.lazyLoadVersion) {
92
+ return;
93
+ }
94
+ this.loadPage();
95
+ });
96
+ }
97
+ scheduleNextPage(blocksCount, size, version) {
98
+ if (blocksCount < size) {
99
+ this.lazyLoadObserver?.disconnect();
100
+ this.finishPreload();
101
+ return;
102
+ }
103
+ timer(this.POOLING_DELAY)
104
+ .pipe(takeUntilDestroyed(this.destroy))
105
+ .subscribe(() => this.continueLazyLoad(version));
106
+ }
107
+ continueLazyLoad(version) {
108
+ if (this.isDestroyed || version !== this.lazyLoadVersion) {
109
+ return;
110
+ }
111
+ if (this.config()?.withoutPreload) {
112
+ this.finishPreload();
113
+ }
114
+ this.observeEditorEnd();
115
+ }
116
+ finishPreload() {
117
+ if (this.isPreloadFinished) {
118
+ return;
119
+ }
120
+ this.isPreloadFinished = true;
121
+ this.setStartBlock();
122
+ }
123
+ finishFirstRender(version) {
124
+ if (this.isDestroyed || version !== this.lazyLoadVersion || this.isEditorReady()) {
125
+ return;
126
+ }
127
+ this.isEditorReady.set(true);
128
+ this.editorReady.emit();
73
129
  }
74
130
  onEditorChange(_, event) {
75
131
  if (this.isReadonly() || this.isDestroyed) {
@@ -107,6 +163,30 @@ export class CuiEditorComponent {
107
163
  }
108
164
  this.recalculateAllBlocksAfterRemoval(blockIds);
109
165
  }
166
+ onEditorEndMove(entry) {
167
+ if (this.isRequested) {
168
+ return;
169
+ }
170
+ if (!entry.isIntersecting) {
171
+ this.hasEndLeftZone = true;
172
+ this.finishPreload();
173
+ return;
174
+ }
175
+ if (this.config()?.withoutPreload && !this.hasEndLeftZone) {
176
+ return;
177
+ }
178
+ this.loadPage();
179
+ }
180
+ initEditorEffect() {
181
+ effect(() => {
182
+ if (this.editorApiId() || this.config()) {
183
+ this.initEditorChanges();
184
+ }
185
+ }, { allowSignalWrites: true });
186
+ }
187
+ initEditorChanges() {
188
+ this.enqueueInit(() => this.runEditorInit());
189
+ }
110
190
  recalculateAllBlocksAfterRemoval(blockIds) {
111
191
  const remainingRemovedBlockIds = new Set(blockIds);
112
192
  this.updatedBlocks = this.updatedBlocks.filter((updatedBlock) => !remainingRemovedBlockIds.has(updatedBlock.id ?? ''));
@@ -119,25 +199,19 @@ export class CuiEditorComponent {
119
199
  });
120
200
  this.removedBlocksIds.push(...remainingRemovedBlockIds.values());
121
201
  }
122
- initEditorEffect() {
123
- effect(() => {
124
- if (this.editorApiId() || this.config()) {
125
- this.initEditorChanges();
126
- }
127
- }, { allowSignalWrites: true });
202
+ observeEditorEnd() {
203
+ const editorEndElement = this.editorEndRef().nativeElement;
204
+ this.lazyLoadObserver ??= this.createLazyLoadObserver();
205
+ this.lazyLoadObserver.unobserve(editorEndElement);
206
+ this.lazyLoadObserver.observe(editorEndElement);
128
207
  }
129
- initEditorChanges() {
130
- this.enqueueInit(() => this.runEditorInit());
208
+ createLazyLoadObserver() {
209
+ return new IntersectionObserver((entries) => this.onEditorEndMove(entries[entries.length - 1]), {
210
+ root: this.getViewportElement()
211
+ });
131
212
  }
132
- initScrollObserver() {
133
- const element = this.config()?.element ?? this.editorElement;
134
- const scrollObserver = fromEvent(element, 'scroll');
135
- this.scrollSubscription = scrollObserver
136
- .pipe(takeUntilDestroyed(this.destroy), throttleTime(this.SCROLL_THROTTLE_TIME, undefined, {
137
- leading: true,
138
- trailing: true
139
- }), map(() => this.onScrollEvent(element)))
140
- .subscribe();
213
+ getViewportElement() {
214
+ return this.config()?.element ?? this.editorElement;
141
215
  }
142
216
  initEditorEvents(element) {
143
217
  const readOnly = this.isReadonly();
@@ -146,20 +220,6 @@ export class CuiEditorComponent {
146
220
  }
147
221
  setEditorEvents(element, this.abortController.signal);
148
222
  }
149
- startPooling(size) {
150
- const scrollElement = this.config()?.element ?? this.editorElement;
151
- const withoutPreload = this.config()?.withoutPreload;
152
- this.poolingSubscription = timer(0, this.POOLING_DELAY)
153
- .pipe(concatMap(() => this.getBlocks(this.page, size).pipe(delay(this.POOLING_DELAY))), tap(() => this.page++), takeWhile((blocks) => !withoutPreload &&
154
- scrollElement.scrollHeight <= scrollElement.clientHeight &&
155
- blocks.length >= size), finalize(() => {
156
- if (this.isDestroyed) {
157
- return;
158
- }
159
- this.setStartBlock();
160
- }))
161
- .subscribe();
162
- }
163
223
  teardownEditor() {
164
224
  this.abortController.abort();
165
225
  this.resetData();
@@ -189,8 +249,7 @@ export class CuiEditorComponent {
189
249
  wireEditor() {
190
250
  this.editorElement = this.editorRef().nativeElement;
191
251
  this.initEditorEvents(this.editorElement);
192
- this.initScrollObserver();
193
- this.startPooling(this.requestSize());
252
+ this.loadPage();
194
253
  this.setListenersOnCustomBlockChanges();
195
254
  }
196
255
  setListenersOnCustomBlockChanges() {
@@ -294,6 +353,9 @@ export class CuiEditorComponent {
294
353
  if (typeof block.type !== 'string') {
295
354
  return;
296
355
  }
356
+ if (this.blockIdsMap.has(block.id)) {
357
+ return;
358
+ }
297
359
  this.blockIdsMap.set(block.id, block.id);
298
360
  this.insert(block);
299
361
  }
@@ -316,13 +378,20 @@ export class CuiEditorComponent {
316
378
  this.editor.blocks.insert(block.type, block.data, {}, this.index, false, false, block.id);
317
379
  return;
318
380
  }
381
+ const version = this.lazyLoadVersion;
319
382
  // TODO: есть варик что что то пойдет не так
320
- this.editor.blocks.render({ blocks: [block] }).then(() => (this.isSkip = false));
383
+ this.editor.blocks.render({ blocks: [block] }).then(() => {
384
+ this.isSkip = false;
385
+ this.finishFirstRender(version);
386
+ });
321
387
  this.isFirst = false;
322
388
  }
323
389
  setCombinedBlock(block) {
324
390
  const combinedBlockData = block.data;
325
391
  const parent = this.combinedBlocks.get(combinedBlockData.parentId);
392
+ if (parent && this.blockIdsMap.has(block.id)) {
393
+ return parent;
394
+ }
326
395
  this.blockIdsMap.set(block.id, block.id);
327
396
  if (parent) {
328
397
  const parentData = parent.data;
@@ -364,14 +433,21 @@ export class CuiEditorComponent {
364
433
  this.editorEmpty.emit(this.checkIsEmpty());
365
434
  return;
366
435
  }
436
+ const version = this.lazyLoadVersion;
367
437
  if (this.isReadonly()) {
368
- this.editor.render({ blocks: [] });
438
+ this.editor.render({ blocks: [] }).then(() => this.finishFirstRender(version));
369
439
  return;
370
440
  }
371
- this.editorService.setStartBlock(this.editorApiId(), this.requestOptions(), async (block, id) => {
372
- this.blockIdsMap.set(id, id);
373
- this.isSkipCombinedBlockOnChange.push(true);
374
- await this.editor.render({ blocks: [block] });
441
+ this.editorService.setStartBlock(this.editorApiId(), this.requestOptions(), (block, id) => this.renderStartBlock(block, id, version));
442
+ }
443
+ async renderStartBlock(block, id, version) {
444
+ if (this.isDestroyed || version !== this.lazyLoadVersion) {
445
+ return;
446
+ }
447
+ this.blockIdsMap.set(id, id);
448
+ this.isSkipCombinedBlockOnChange.push(true);
449
+ this.editor.render({ blocks: [block] }).then(() => {
450
+ this.finishFirstRender(version);
375
451
  this.setFocus();
376
452
  recalculateIndexes(this.editor.blocks);
377
453
  });
@@ -392,31 +468,40 @@ export class CuiEditorComponent {
392
468
  return !redactorTextContent;
393
469
  }
394
470
  resetData() {
395
- this.scrollSubscription?.unsubscribe();
396
- this.poolingSubscription?.unsubscribe();
471
+ this.resetLazyLoad();
472
+ this.isEditorReady.set(false);
397
473
  this.isSkipCombinedBlockOnChange = [];
398
474
  this.isFirst = true;
399
475
  this.isChanging = false;
400
476
  this.isSkip = false;
401
- this.isRequested = false;
402
477
  this.blockIdsMap = new Map();
403
478
  this.combinedBlocks = new Map();
404
479
  this.index = 0;
405
- this.page = 0;
406
480
  this.addedBlocks = [];
407
481
  this.updatedBlocks = [];
408
482
  this.removedBlocksIds = [];
409
483
  this.changesQueue = [];
410
484
  this.abortController = new AbortController();
411
485
  }
486
+ resetLazyLoad() {
487
+ this.lazyLoadVersion++;
488
+ this.lazyLoadObserver?.disconnect();
489
+ this.lazyLoadObserver = null;
490
+ this.lazyLoadSubscription?.unsubscribe();
491
+ this.lazyLoadSubscription = null;
492
+ this.isRequested = false;
493
+ this.isPreloadFinished = false;
494
+ this.hasEndLeftZone = false;
495
+ this.page = 0;
496
+ }
412
497
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
413
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: CuiEditorComponent, isStandalone: true, selector: "cui-editor", inputs: { editorApiId: { classPropertyName: "editorApiId", publicName: "editorApiId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, requestSize: { classPropertyName: "requestSize", publicName: "requestSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editorEmpty: "editorEmpty" }, providers: [
498
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: CuiEditorComponent, isStandalone: true, selector: "cui-editor", inputs: { editorApiId: { classPropertyName: "editorApiId", publicName: "editorApiId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, requestSize: { classPropertyName: "requestSize", publicName: "requestSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editorEmpty: "editorEmpty", editorReady: "editorReady" }, providers: [
414
499
  CuiEditorService,
415
500
  {
416
501
  provide: CUI_JTEXT_API_SERVICE,
417
502
  useFactory: () => inject(CUI_JTEXT_API_SERVICE, { optional: true, skipSelf: true }) ?? new CuiJTextApiService()
418
503
  }
419
- ], viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #editor\n [id]=\"editorId\"\n data-editor\n [class._readonly]=\"config().readOnly\"\n></div>\n", styles: [":host{--textColor: var(--cui-base-900);--menuBackground: var(--cui-base-0);--menuBorder: var(--cui-base-200);--menuItemHover: var(--cui-base-10);--menuItemBackground: var(cui-base-900);--menuIconBackground: var(--cui-base-50);--menuIconHover: var(--cui-base-10);font-weight:400;font-size:14px;line-height:20px;font-family:var(--cui-main-font)}:host ::ng-deep .ce-popover{--color-background: var(--menuBackground);--color-text-primary: var(--textColor);--color-border: var(--menuBorder);--color-border-icon: var(--menuBorder);--color-background-item: var(--menuItemBackground);--color-background-item-hover: var(--menuItemHover)}:host ::ng-deep .ce-popover__search{background:var(--menuIconBackground)}:host ::ng-deep .ce-popover .ce-popover-item__icon{background:var(--menuIconBackground)}:host ::ng-deep .ce-conversion-toolbar{background-color:var(--menuBackground);border-color:var(--menuBorder)}:host ::ng-deep .ce-conversion-toolbar__tools{padding:0 6px 6px}:host ::ng-deep .ce-conversion-tool{padding:3px;border-radius:6px}:host ::ng-deep .ce-conversion-tool__icon{border:1px solid var(--menuBorder);background-color:var(--menuIconBackground);box-shadow:none}:host ::ng-deep .ce-conversion-tool:hover{background-color:var(--menuItemHover)}:host ::ng-deep .ce-conversion-tool:hover .ce-conversion-tool__icon{border-color:var(--menuIconHover)}:host ::ng-deep .combined-text-block{padding:.4em 0;line-height:1.6em;outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part{outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child,:host ::ng-deep .combined-text-block .combined-text-block-part._selected{display:list-item}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child::marker,:host ::ng-deep .combined-text-block .combined-text-block-part._selected::marker{content:\"\"}:host ::ng-deep .image-tool__image{border:1px solid var(--cui-base-200);background-color:var(--cui-base-0)}:host ::ng-deep .image-tool__image-preloader{background-color:var(--cui-base-200)}:host ::ng-deep .image-tool__image-preloader:after{border:1px solid var(--cui-base-200);border-top:1px solid var(--cui-blue-600)}:host ::ng-deep .cdx-button{border-radius:8px;border:1px solid var(--cui-base-200);color:var(--textColor);background-color:var(--cui-base-10);box-shadow:none}:host ::ng-deep .ce-inline-toolbar{border-color:var(--cui-base-100);color:var(--textColor);background-color:var(--cui-base-0)}:host ::ng-deep .ce-inline-toolbar__dropdown:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-inline-tool:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{color:var(--cui-base-500)}:host ::ng-deep .ce-toolbar__plus:hover,:host ::ng-deep .ce-toolbar__settings-btn:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__actions{right:100%}:host ::ng-deep .ce-toolbar__content{max-width:none}@media (max-width: 650px){:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{border-color:var(--menuBorder);background-color:var(--menuBackground)}:host ::ng-deep .ce-toolbar__actions{inset:0 auto auto 0}}:host ::ng-deep .ce-block--selected .ce-block__content{background-color:var(--cui-base-200)}:host ::ng-deep .ce-block__content{max-width:100%}:host ::ng-deep .ce-block:only-of-type .combined-text-block[data-placeholder-active][data-empty=true]:before{content:attr(data-placeholder-active);position:absolute;color:var(--cui-base-400)}:host ::ng-deep [data-editor]{padding-right:4px;width:100%;height:100%;min-height:200px;overflow:hidden auto;scrollbar-gutter:stable}:host ::ng-deep [data-editor] .codex-editor{margin-left:60px}:host ::ng-deep [data-editor] .codex-editor--narrow .ce-popover{right:auto}:host ::ng-deep [data-editor] .codex-editor__redactor{margin-right:auto;padding-bottom:260px!important}@media (max-width: 650px){:host ::ng-deep [data-editor] .codex-editor{margin-left:0}}:host ::ng-deep [data-editor]._readonly{min-height:auto}:host ::ng-deep [data-editor]._readonly .codex-editor{margin:auto}:host ::ng-deep [data-editor]._readonly .codex-editor__redactor{padding-bottom:0!important}:host ::ng-deep [data-editor]._readonly .combined-text-block{padding:0}:host ::ng-deep [data-editor] [data-item-name=move-up],:host ::ng-deep [data-editor] [data-item-name=move-down],:host ::ng-deep [data-editor] [data-tool=paragraph]{display:none}:host ::ng-deep [data-editor] *::selection{background:var(--cui-base-200)}:host ::ng-deep [data-editor] a{color:var(--cui-light-blue-600)}:host ::ng-deep .marker{cursor:pointer;text-decoration:underline;color:var(--cui-light-blue-600);background-color:transparent}:host ::ng-deep .tool-marker,:host ::ng-deep .role-marker{margin:0 5px}:host ::ng-deep .tool-marker{color:#e97c00}:host ::ng-deep .role-marker{color:#8803f1}.form{height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
504
+ ], viewQueries: [{ propertyName: "editorEndRef", first: true, predicate: ["editorEnd"], descendants: true, isSignal: true }, { propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #editor\n data-editor\n [class._readonly]=\"config().readOnly\"\n [class._loading]=\"!isEditorReady()\"\n>\n <div [id]=\"editorId\"></div>\n <div\n #editorEnd\n class=\"editor-end\"\n ></div>\n</div>\n", styles: [":host{--textColor: var(--cui-base-900);--menuBackground: var(--cui-base-0);--menuBorder: var(--cui-base-200);--menuItemHover: var(--cui-base-10);--menuItemBackground: var(cui-base-900);--menuIconBackground: var(--cui-base-50);--menuIconHover: var(--cui-base-10);font-weight:400;font-size:14px;line-height:20px;font-family:var(--cui-main-font)}:host ::ng-deep .ce-popover{--color-background: var(--menuBackground);--color-text-primary: var(--textColor);--color-border: var(--menuBorder);--color-border-icon: var(--menuBorder);--color-background-item: var(--menuItemBackground);--color-background-item-hover: var(--menuItemHover)}:host ::ng-deep .ce-popover__search{background:var(--menuIconBackground)}:host ::ng-deep .ce-popover .ce-popover-item__icon{background:var(--menuIconBackground)}:host ::ng-deep .ce-conversion-toolbar{background-color:var(--menuBackground);border-color:var(--menuBorder)}:host ::ng-deep .ce-conversion-toolbar__tools{padding:0 6px 6px}:host ::ng-deep .ce-conversion-tool{padding:3px;border-radius:6px}:host ::ng-deep .ce-conversion-tool__icon{border:1px solid var(--menuBorder);background-color:var(--menuIconBackground);box-shadow:none}:host ::ng-deep .ce-conversion-tool:hover{background-color:var(--menuItemHover)}:host ::ng-deep .ce-conversion-tool:hover .ce-conversion-tool__icon{border-color:var(--menuIconHover)}:host ::ng-deep .combined-text-block{padding:.4em 0;line-height:1.6em;outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part{outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child,:host ::ng-deep .combined-text-block .combined-text-block-part._selected{display:list-item}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child::marker,:host ::ng-deep .combined-text-block .combined-text-block-part._selected::marker{content:\"\"}:host ::ng-deep .image-tool__image{border:1px solid var(--cui-base-200);background-color:var(--cui-base-0)}:host ::ng-deep .image-tool__image-preloader{background-color:var(--cui-base-200)}:host ::ng-deep .image-tool__image-preloader:after{border:1px solid var(--cui-base-200);border-top:1px solid var(--cui-blue-600)}:host ::ng-deep .cdx-button{border-radius:8px;border:1px solid var(--cui-base-200);color:var(--textColor);background-color:var(--cui-base-10);box-shadow:none}:host ::ng-deep .ce-inline-toolbar{border-color:var(--cui-base-100);color:var(--textColor);background-color:var(--cui-base-0)}:host ::ng-deep .ce-inline-toolbar__dropdown:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-inline-tool:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{color:var(--cui-base-500)}:host ::ng-deep .ce-toolbar__plus:hover,:host ::ng-deep .ce-toolbar__settings-btn:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__actions{right:100%}:host ::ng-deep .ce-toolbar__content{max-width:none}@media (max-width: 650px){:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{border-color:var(--menuBorder);background-color:var(--menuBackground)}:host ::ng-deep .ce-toolbar__actions{inset:0 auto auto 0}}:host ::ng-deep .ce-block--selected .ce-block__content{background-color:var(--cui-base-200)}:host ::ng-deep .ce-block__content{max-width:100%}:host ::ng-deep .ce-block:only-of-type .combined-text-block[data-placeholder-active][data-empty=true]:before{content:attr(data-placeholder-active);position:absolute;color:var(--cui-base-400)}:host ::ng-deep [data-editor]{padding-right:4px;width:100%;height:100%;min-height:200px;overflow:hidden auto;scrollbar-gutter:stable}:host ::ng-deep [data-editor] .codex-editor{margin-left:60px}:host ::ng-deep [data-editor] .codex-editor--narrow .ce-popover{right:auto}:host ::ng-deep [data-editor] .codex-editor__redactor{margin-right:auto;padding-bottom:260px!important}@media (max-width: 650px){:host ::ng-deep [data-editor] .codex-editor{margin-left:0}}:host ::ng-deep [data-editor]._readonly{min-height:auto}:host ::ng-deep [data-editor]._readonly .codex-editor{margin:auto}:host ::ng-deep [data-editor]._readonly .codex-editor__redactor{padding-bottom:0!important}:host ::ng-deep [data-editor]._readonly .combined-text-block{padding:0}:host ::ng-deep [data-editor]._loading{pointer-events:none;-webkit-user-select:none;user-select:none}:host ::ng-deep [data-editor]._loading .combined-text-block[data-placeholder-active][data-empty=true]:before{content:none}:host ::ng-deep [data-editor] [data-item-name=move-up],:host ::ng-deep [data-editor] [data-item-name=move-down],:host ::ng-deep [data-editor] [data-tool=paragraph]{display:none}:host ::ng-deep [data-editor] *::selection{background:var(--cui-base-200)}:host ::ng-deep [data-editor] a{color:var(--cui-light-blue-600)}:host ::ng-deep .marker{cursor:pointer;text-decoration:underline;color:var(--cui-light-blue-600);background-color:transparent}:host ::ng-deep .tool-marker,:host ::ng-deep .role-marker{margin:0 5px}:host ::ng-deep .tool-marker{color:var(--cui-warning)}:host ::ng-deep .role-marker{color:var(--cui-info)}.editor-end{margin-top:-150px;height:150px;pointer-events:none}.form{height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
420
505
  }
421
506
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiEditorComponent, decorators: [{
422
507
  type: Component,
@@ -426,6 +511,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
426
511
  provide: CUI_JTEXT_API_SERVICE,
427
512
  useFactory: () => inject(CUI_JTEXT_API_SERVICE, { optional: true, skipSelf: true }) ?? new CuiJTextApiService()
428
513
  }
429
- ], template: "<div\n #editor\n [id]=\"editorId\"\n data-editor\n [class._readonly]=\"config().readOnly\"\n></div>\n", styles: [":host{--textColor: var(--cui-base-900);--menuBackground: var(--cui-base-0);--menuBorder: var(--cui-base-200);--menuItemHover: var(--cui-base-10);--menuItemBackground: var(cui-base-900);--menuIconBackground: var(--cui-base-50);--menuIconHover: var(--cui-base-10);font-weight:400;font-size:14px;line-height:20px;font-family:var(--cui-main-font)}:host ::ng-deep .ce-popover{--color-background: var(--menuBackground);--color-text-primary: var(--textColor);--color-border: var(--menuBorder);--color-border-icon: var(--menuBorder);--color-background-item: var(--menuItemBackground);--color-background-item-hover: var(--menuItemHover)}:host ::ng-deep .ce-popover__search{background:var(--menuIconBackground)}:host ::ng-deep .ce-popover .ce-popover-item__icon{background:var(--menuIconBackground)}:host ::ng-deep .ce-conversion-toolbar{background-color:var(--menuBackground);border-color:var(--menuBorder)}:host ::ng-deep .ce-conversion-toolbar__tools{padding:0 6px 6px}:host ::ng-deep .ce-conversion-tool{padding:3px;border-radius:6px}:host ::ng-deep .ce-conversion-tool__icon{border:1px solid var(--menuBorder);background-color:var(--menuIconBackground);box-shadow:none}:host ::ng-deep .ce-conversion-tool:hover{background-color:var(--menuItemHover)}:host ::ng-deep .ce-conversion-tool:hover .ce-conversion-tool__icon{border-color:var(--menuIconHover)}:host ::ng-deep .combined-text-block{padding:.4em 0;line-height:1.6em;outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part{outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child,:host ::ng-deep .combined-text-block .combined-text-block-part._selected{display:list-item}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child::marker,:host ::ng-deep .combined-text-block .combined-text-block-part._selected::marker{content:\"\"}:host ::ng-deep .image-tool__image{border:1px solid var(--cui-base-200);background-color:var(--cui-base-0)}:host ::ng-deep .image-tool__image-preloader{background-color:var(--cui-base-200)}:host ::ng-deep .image-tool__image-preloader:after{border:1px solid var(--cui-base-200);border-top:1px solid var(--cui-blue-600)}:host ::ng-deep .cdx-button{border-radius:8px;border:1px solid var(--cui-base-200);color:var(--textColor);background-color:var(--cui-base-10);box-shadow:none}:host ::ng-deep .ce-inline-toolbar{border-color:var(--cui-base-100);color:var(--textColor);background-color:var(--cui-base-0)}:host ::ng-deep .ce-inline-toolbar__dropdown:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-inline-tool:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{color:var(--cui-base-500)}:host ::ng-deep .ce-toolbar__plus:hover,:host ::ng-deep .ce-toolbar__settings-btn:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__actions{right:100%}:host ::ng-deep .ce-toolbar__content{max-width:none}@media (max-width: 650px){:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{border-color:var(--menuBorder);background-color:var(--menuBackground)}:host ::ng-deep .ce-toolbar__actions{inset:0 auto auto 0}}:host ::ng-deep .ce-block--selected .ce-block__content{background-color:var(--cui-base-200)}:host ::ng-deep .ce-block__content{max-width:100%}:host ::ng-deep .ce-block:only-of-type .combined-text-block[data-placeholder-active][data-empty=true]:before{content:attr(data-placeholder-active);position:absolute;color:var(--cui-base-400)}:host ::ng-deep [data-editor]{padding-right:4px;width:100%;height:100%;min-height:200px;overflow:hidden auto;scrollbar-gutter:stable}:host ::ng-deep [data-editor] .codex-editor{margin-left:60px}:host ::ng-deep [data-editor] .codex-editor--narrow .ce-popover{right:auto}:host ::ng-deep [data-editor] .codex-editor__redactor{margin-right:auto;padding-bottom:260px!important}@media (max-width: 650px){:host ::ng-deep [data-editor] .codex-editor{margin-left:0}}:host ::ng-deep [data-editor]._readonly{min-height:auto}:host ::ng-deep [data-editor]._readonly .codex-editor{margin:auto}:host ::ng-deep [data-editor]._readonly .codex-editor__redactor{padding-bottom:0!important}:host ::ng-deep [data-editor]._readonly .combined-text-block{padding:0}:host ::ng-deep [data-editor] [data-item-name=move-up],:host ::ng-deep [data-editor] [data-item-name=move-down],:host ::ng-deep [data-editor] [data-tool=paragraph]{display:none}:host ::ng-deep [data-editor] *::selection{background:var(--cui-base-200)}:host ::ng-deep [data-editor] a{color:var(--cui-light-blue-600)}:host ::ng-deep .marker{cursor:pointer;text-decoration:underline;color:var(--cui-light-blue-600);background-color:transparent}:host ::ng-deep .tool-marker,:host ::ng-deep .role-marker{margin:0 5px}:host ::ng-deep .tool-marker{color:#e97c00}:host ::ng-deep .role-marker{color:#8803f1}.form{height:100%}\n"] }]
514
+ ], template: "<div\n #editor\n data-editor\n [class._readonly]=\"config().readOnly\"\n [class._loading]=\"!isEditorReady()\"\n>\n <div [id]=\"editorId\"></div>\n <div\n #editorEnd\n class=\"editor-end\"\n ></div>\n</div>\n", styles: [":host{--textColor: var(--cui-base-900);--menuBackground: var(--cui-base-0);--menuBorder: var(--cui-base-200);--menuItemHover: var(--cui-base-10);--menuItemBackground: var(cui-base-900);--menuIconBackground: var(--cui-base-50);--menuIconHover: var(--cui-base-10);font-weight:400;font-size:14px;line-height:20px;font-family:var(--cui-main-font)}:host ::ng-deep .ce-popover{--color-background: var(--menuBackground);--color-text-primary: var(--textColor);--color-border: var(--menuBorder);--color-border-icon: var(--menuBorder);--color-background-item: var(--menuItemBackground);--color-background-item-hover: var(--menuItemHover)}:host ::ng-deep .ce-popover__search{background:var(--menuIconBackground)}:host ::ng-deep .ce-popover .ce-popover-item__icon{background:var(--menuIconBackground)}:host ::ng-deep .ce-conversion-toolbar{background-color:var(--menuBackground);border-color:var(--menuBorder)}:host ::ng-deep .ce-conversion-toolbar__tools{padding:0 6px 6px}:host ::ng-deep .ce-conversion-tool{padding:3px;border-radius:6px}:host ::ng-deep .ce-conversion-tool__icon{border:1px solid var(--menuBorder);background-color:var(--menuIconBackground);box-shadow:none}:host ::ng-deep .ce-conversion-tool:hover{background-color:var(--menuItemHover)}:host ::ng-deep .ce-conversion-tool:hover .ce-conversion-tool__icon{border-color:var(--menuIconHover)}:host ::ng-deep .combined-text-block{padding:.4em 0;line-height:1.6em;outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part{outline:none}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child,:host ::ng-deep .combined-text-block .combined-text-block-part._selected{display:list-item}:host ::ng-deep .combined-text-block .combined-text-block-part:only-child::marker,:host ::ng-deep .combined-text-block .combined-text-block-part._selected::marker{content:\"\"}:host ::ng-deep .image-tool__image{border:1px solid var(--cui-base-200);background-color:var(--cui-base-0)}:host ::ng-deep .image-tool__image-preloader{background-color:var(--cui-base-200)}:host ::ng-deep .image-tool__image-preloader:after{border:1px solid var(--cui-base-200);border-top:1px solid var(--cui-blue-600)}:host ::ng-deep .cdx-button{border-radius:8px;border:1px solid var(--cui-base-200);color:var(--textColor);background-color:var(--cui-base-10);box-shadow:none}:host ::ng-deep .ce-inline-toolbar{border-color:var(--cui-base-100);color:var(--textColor);background-color:var(--cui-base-0)}:host ::ng-deep .ce-inline-toolbar__dropdown:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-inline-tool:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{color:var(--cui-base-500)}:host ::ng-deep .ce-toolbar__plus:hover,:host ::ng-deep .ce-toolbar__settings-btn:hover{background-color:var(--cui-base-100)}:host ::ng-deep .ce-toolbar__actions{right:100%}:host ::ng-deep .ce-toolbar__content{max-width:none}@media (max-width: 650px){:host ::ng-deep .ce-toolbar__plus,:host ::ng-deep .ce-toolbar__settings-btn{border-color:var(--menuBorder);background-color:var(--menuBackground)}:host ::ng-deep .ce-toolbar__actions{inset:0 auto auto 0}}:host ::ng-deep .ce-block--selected .ce-block__content{background-color:var(--cui-base-200)}:host ::ng-deep .ce-block__content{max-width:100%}:host ::ng-deep .ce-block:only-of-type .combined-text-block[data-placeholder-active][data-empty=true]:before{content:attr(data-placeholder-active);position:absolute;color:var(--cui-base-400)}:host ::ng-deep [data-editor]{padding-right:4px;width:100%;height:100%;min-height:200px;overflow:hidden auto;scrollbar-gutter:stable}:host ::ng-deep [data-editor] .codex-editor{margin-left:60px}:host ::ng-deep [data-editor] .codex-editor--narrow .ce-popover{right:auto}:host ::ng-deep [data-editor] .codex-editor__redactor{margin-right:auto;padding-bottom:260px!important}@media (max-width: 650px){:host ::ng-deep [data-editor] .codex-editor{margin-left:0}}:host ::ng-deep [data-editor]._readonly{min-height:auto}:host ::ng-deep [data-editor]._readonly .codex-editor{margin:auto}:host ::ng-deep [data-editor]._readonly .codex-editor__redactor{padding-bottom:0!important}:host ::ng-deep [data-editor]._readonly .combined-text-block{padding:0}:host ::ng-deep [data-editor]._loading{pointer-events:none;-webkit-user-select:none;user-select:none}:host ::ng-deep [data-editor]._loading .combined-text-block[data-placeholder-active][data-empty=true]:before{content:none}:host ::ng-deep [data-editor] [data-item-name=move-up],:host ::ng-deep [data-editor] [data-item-name=move-down],:host ::ng-deep [data-editor] [data-tool=paragraph]{display:none}:host ::ng-deep [data-editor] *::selection{background:var(--cui-base-200)}:host ::ng-deep [data-editor] a{color:var(--cui-light-blue-600)}:host ::ng-deep .marker{cursor:pointer;text-decoration:underline;color:var(--cui-light-blue-600);background-color:transparent}:host ::ng-deep .tool-marker,:host ::ng-deep .role-marker{margin:0 5px}:host ::ng-deep .tool-marker{color:var(--cui-warning)}:host ::ng-deep .role-marker{color:var(--cui-info)}.editor-end{margin-top:-150px;height:150px;pointer-events:none}.form{height:100%}\n"] }]
430
515
  }], ctorParameters: () => [] });
431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2VkaXRvci9lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFNUMsT0FBTyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxHQUFHLEVBQ0gsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEVBQ0gsWUFBWSxFQUNaLEtBQUssRUFDTCxPQUFPLEVBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUscUJBQXFCLEVBQVksa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBVzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxZQUFZLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBaUJqRSxNQUFNLE9BQU8s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QUNwRztTQUNKLCtJQzlETCxtSEFNQTs7NEZEMERhLGtCQUFrQjtrQkFmOUIsU0FBUzsrQkFDSSxZQUFZLGNBQ1YsSUFBSSxtQkFHQyx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQLGdCQUFnQjt3QkFDaEI7NEJBQ0ksT0FBTyxFQUFFLHFCQUFxQjs0QkFDOUIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUNiLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRTt5QkFDcEc7cUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVsZW1lbnRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRGVzdHJveVJlZixcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG91dHB1dCxcbiAgICB2aWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgdHlwZSB7IEN1aU51bGxhYmxlIH0gZnJvbSAnQGN1YnktdWkvY2RrJztcbmltcG9ydCB7IEN1aUlkU2VydmljZSB9IGZyb20gJ0BjdWJ5LXVpL2Nkayc7XG5pbXBvcnQgdHlwZSB7IEFQSSwgQmxvY2tNdXRhdGlvbkV2ZW50LCBPdXRwdXREYXRhIH0gZnJvbSAnQGVkaXRvcmpzL2VkaXRvcmpzJztcbmltcG9ydCBFZGl0b3JKUyBmcm9tICdAZWRpdG9yanMvZWRpdG9yanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgY29uY2F0TWFwLFxuICAgIGRlbGF5LFxuICAgIGZpbmFsaXplLFxuICAgIGZyb21FdmVudCxcbiAgICBtYXAsXG4gICAgU3ViamVjdCxcbiAgICB0YWtlV2hpbGUsXG4gICAgdGFwLFxuICAgIHRocm90dGxlVGltZSxcbiAgICB0aW1lcixcbiAgICB0b0FycmF5XG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ1VJX0pURVhUX0FQSV9TRVJWSUNFLCBDdWlCbG9jaywgQ3VpSlRleHRBcGlTZXJ2aWNlIH0gZnJvbSAnQGN1YnktdWkvYXBpJztcblxuaW1wb3J0IHsgZ2V0RWRpdG9yQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgQ09NQklORURfVEVYVF9CTE9DS19OQU1FLCBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsIERFRkFVTFRfQ09ORklHIH0gZnJvbSAnLi9jb25zdGFudHMvZWRpdG9yLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBzZXRFZGl0b3JFdmVudHMgfSBmcm9tICcuL2V2ZW50cy9zZXQtZWRpdG9yLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQ3VpQmxvY2tEYXRhLFxuICAgIEN1aUJsb2Nrc1JlcXVlc3REYXRhLFxuICAgIEN1aUNvbWJpbmVkQmxvY2tBZGRpbmdFdmVudCxcbiAgICBDdWlDb21iaW5lZEJsb2NrVG9vbERhdGEsXG4gICAgQ3VpQ29tYmluZWRQYXJ0QmxvY2ssXG4gICAgQ3VpRWRpdG9yQ29uZmlnLFxuICAgIEN1aUV2ZW50QWN0aW9uRGF0YSxcbiAgICBDdWlGdWxsQmxvY2tEYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDdWlFZGl0b3JTZXJ2aWNlLCBFdmVudEFjdGlvbnMgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IHJlY2FsY3VsYXRlSW5kZXhlcyB9IGZyb20gJy4vdXRpbHMvcmVjYWxjdWxhdGUtaW5kZXhlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY3VpLWVkaXRvcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ3VpRWRpdG9yU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ1VJX0pURVhUX0FQSV9TRVJWSUNFLFxuICAgICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT5cbiAgICAgICAgICAgICAgICBpbmplY3QoQ1VJX0pURVhUX0FQSV9TRVJWSUNFLCB7IG9wdGlvbmFsOiB0cnVlLCBza2lwU2VsZjogdHJ1ZSB9KSA/PyBuZXcgQ3VpSlRleHRBcGlTZXJ2aWNlKClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgQ3VpRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdWlJZFNlcnZpY2UgPSBpbmplY3QoQ3VpSWRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvclNlcnZpY2UgPSBpbmplY3QoQ3VpRWRpdG9yU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBqVGV4dFNlcnZpY2UgPSBpbmplY3QoQ1VJX0pURVhUX0FQSV9TRVJWSUNFKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgUE9PTElOR19ERUxBWSA9IDEwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IEVMRU1FTlRfU1BBQ0VfVE9fQk9UVE9NID0gMTUwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgU0NST0xMX1RIUk9UVExFX1RJTUUgPSAyMDA7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5UXVldWUgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgcHJpdmF0ZSBpbml0Q2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIHBvb2xpbmdTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBzY3JvbGxTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBpc1NraXBDb21iaW5lZEJsb2NrT25DaGFuZ2U6IGJvb2xlYW5bXSA9IFtdO1xuICAgIHByaXZhdGUgaXNGaXJzdCA9IHRydWU7XG4gICAgcHJpdmF0ZSBpc0NoYW5naW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc1NraXAgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIC8vINCd0YPQttC10L0g0LTQu9GPINGB0L7QvtGC0L3QvtGI0LXQvdC40Y8g0LvQvtC60LDQu9GM0L3QvtCz0L4gSUQg0Lgg0L7RgdC90L7QstC90L7Qs9C+IElEINC/0L7RgdC70LUg0YHQvtC30LTQsNC90LjRjyDRjdC70LXQvNC10L3RgtCwXG4gICAgcHJpdmF0ZSBibG9ja0lkc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBjb21iaW5lZEJsb2NrcyA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGluZGV4ID0gMDtcbiAgICBwcml2YXRlIHBhZ2UgPSAwO1xuICAgIHByaXZhdGUgYWRkZWRCbG9ja3M6IEN1aUJsb2NrRGF0YVtdID0gW107XG4gICAgcHJpdmF0ZSB1cGRhdGVkQmxvY2tzOiBDdWlCbG9ja1tdID0gW107XG4gICAgcHJpdmF0ZSByZW1vdmVkQmxvY2tzSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgY2hhbmdlc1F1ZXVlOiBCbG9ja011dGF0aW9uRXZlbnRbXVtdID0gW107XG4gICAgcHJpdmF0ZSBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWRpdG9ySWQgPSB0aGlzLmN1aUlkU2VydmljZS5nZW5lcmF0ZSgpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1JlYWRvbmx5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWcoKT8ucmVhZE9ubHkpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbmZpZygpPy5yZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWRpdG9yUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PignZWRpdG9yJyk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZWRpdG9yQXBpSWQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PEN1aUVkaXRvckNvbmZpZz4oREVGQVVMVF9DT05GSUcpO1xuICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0U2l6ZSA9IGlucHV0PG51bWJlcj4oNDApO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGVkaXRvckVtcHR5ID0gb3V0cHV0PGJvb2xlYW4+KCk7XG5cbiAgICBwdWJsaWMgZWRpdG9yITogRWRpdG9ySlM7XG4gICAgcHVibGljIGVkaXRvckVsZW1lbnQhOiBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluaXRFZGl0b3JFZmZlY3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZW5xdWV1ZUluaXQoKCkgPT4gdGhpcy50ZWFyZG93bkVkaXRvcigpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU2Nyb2xsRXZlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3ZlcmFsbEhlaWdodCA9IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5FTEVNRU5UX1NQQUNFX1RPX0JPVFRPTTtcbiAgICAgICAgY29uc3QgY3VycmVudEhlaWdodCA9IGVsZW1lbnQuc2Nyb2xsVG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgPCBvdmVyYWxsSGVpZ2h0IHx8IHRoaXMuaXNSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNSZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnJlcXVlc3RTaXplKCk7XG4gICAgICAgIGxldCBibG9ja3NDb3VudCA9IDA7XG5cbiAgICAgICAgdGhpcy5nZXRCbG9ja3ModGhpcy5wYWdlLCBzaXplKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChibG9ja3MpID0+IChibG9ja3NDb3VudCA9IGJsb2Nrcy5sZW5ndGgpKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tzQ291bnQgPj0gc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMucGFnZSsrO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FZGl0b3JDaGFuZ2UoXzogQVBJLCBldmVudDogQmxvY2tNdXRhdGlvbkV2ZW50IHwgQmxvY2tNdXRhdGlvbkV2ZW50W10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkb25seSgpIHx8IHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50ID0gW2V2ZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQ2hhbmdpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlc1F1ZXVlLnVuc2hpZnQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGFydENoYW5nZXMoZXZlbnQpO1xuICAgICAgICB0aGlzLmVkaXRvckVtcHR5LmVtaXQodGhpcy5jaGVja0lzRW1wdHkoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkFkZGVkQ29tYmluZWRCbG9jayhkYXRhOiBDdWlDb21iaW5lZEJsb2NrQWRkaW5nRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTa2lwQ29tYmluZWRCbG9ja09uQ2hhbmdlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1NraXBDb21iaW5lZEJsb2NrT25DaGFuZ2UucG9wKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJsb2Nrc1dpdGhvdXRJZCA9IGRhdGEuYmxvY2tzLm1hcCgoYmxvY2spID0+ICh7XG4gICAgICAgICAgICBibG9jazogeyAuLi5ibG9jaywgaWQ6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgaWQ6IGJsb2NrLmlkIVxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5hZGRlZEJsb2Nrcy5wdXNoKC4uLmJsb2Nrc1dpdGhvdXRJZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblVwZGF0ZWRDb21iaW5lZEJsb2NrKHVwZGF0ZWRCbG9ja3M6IEN1aUJsb2NrW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF1cGRhdGVkQmxvY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVkQmxvY2tzLnB1c2goLi4udXBkYXRlZEJsb2Nrcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlbW92ZWRDb21iaW5lZEJsb2NrKGJsb2NrSWRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWJsb2NrSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWNhbGN1bGF0ZUFsbEJsb2Nrc0FmdGVyUmVtb3ZhbChibG9ja0lkcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWNhbGN1bGF0ZUFsbEJsb2Nrc0FmdGVyUmVtb3ZhbChibG9ja0lkczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nUmVtb3ZlZEJsb2NrSWRzID0gbmV3IFNldChibG9ja0lkcyk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVkQmxvY2tzID0gdGhpcy51cGRhdGVkQmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAgICh1cGRhdGVkQmxvY2spID0+ICFyZW1haW5pbmdSZW1vdmVkQmxvY2tJZHMuaGFzKHVwZGF0ZWRCbG9jay5pZCA/PyAnJylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRlZEJsb2NrcyA9IHRoaXMuYWRkZWRCbG9ja3MuZmlsdGVyKChhZGRlZEJsb2NrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZ1JlbW92ZWRCbG9ja0lkcy5oYXMoYWRkZWRCbG9jay5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVtYWluaW5nUmVtb3ZlZEJsb2NrSWRzLmRlbGV0ZShhZGRlZEJsb2NrLmlkKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlbW92ZWRCbG9ja3NJZHMucHVzaCguLi5yZW1haW5pbmdSZW1vdmVkQmxvY2tJZHMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEVkaXRvckVmZmVjdCgpOiB2b2lkIHtcbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvckFwaUlkKCkgfHwgdGhpcy5jb25maWcoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRFZGl0b3JDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEVkaXRvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5xdWV1ZUluaXQoKCkgPT4gdGhpcy5ydW5FZGl0b3JJbml0KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNjcm9sbE9ic2VydmVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb25maWcoKT8uZWxlbWVudCA/PyB0aGlzLmVkaXRvckVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbE9ic2VydmVyID0gZnJvbUV2ZW50KGVsZW1lbnQsICdzY3JvbGwnKTtcblxuICAgICAgICB0aGlzLnNjcm9sbFN1YnNjcmlwdGlvbiA9IHNjcm9sbE9ic2VydmVyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95KSxcbiAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWUodGhpcy5TQ1JPTExfVEhST1RUTEVfVElNRSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nOiB0cnVlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMub25TY3JvbGxFdmVudChlbGVtZW50KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRFZGl0b3JFdmVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZG9ubHkoKTtcblxuICAgICAgICBpZiAocmVhZE9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEVkaXRvckV2ZW50cyhlbGVtZW50LCB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRQb29saW5nKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5jb25maWcoKT8uZWxlbWVudCA/PyB0aGlzLmVkaXRvckVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHdpdGhvdXRQcmVsb2FkID0gdGhpcy5jb25maWcoKT8ud2l0aG91dFByZWxvYWQ7XG5cbiAgICAgICAgdGhpcy5wb29saW5nU3Vic2NyaXB0aW9uID0gdGltZXIoMCwgdGhpcy5QT09MSU5HX0RFTEFZKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0QmxvY2tzKHRoaXMucGFnZSwgc2l6ZSkucGlwZShkZWxheSh0aGlzLlBPT0xJTkdfREVMQVkpKSksXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucGFnZSsrKSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoXG4gICAgICAgICAgICAgICAgICAgIChibG9ja3MpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAhd2l0aG91dFByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IHNjcm9sbEVsZW1lbnQuY2xpZW50SGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MubGVuZ3RoID49IHNpemVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhcnRCbG9jaygpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZWFyZG93bkVkaXRvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcblxuICAgICAgICB0aGlzLmVkaXRvcj8uZGVzdHJveT8uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnF1ZXVlSW5pdChjYWxsYmFjazogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0Q2hhaW4gPSB0aGlzLmluaXRDaGFpbi5jYXRjaCgoKSA9PiB1bmRlZmluZWQpLnRoZW4oY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcnVuRWRpdG9ySW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy50ZWFyZG93bkVkaXRvcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVkaXRvciA9IHRoaXMuYnVpbGRFZGl0b3IodGhpcy5lZGl0b3JJZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lZGl0b3IuaXNSZWFkeTtcblxuICAgICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53aXJlRWRpdG9yKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZEVkaXRvcihpZDogc3RyaW5nKTogRWRpdG9ySlMge1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvckpTKHtcbiAgICAgICAgICAgIC4uLmdldEVkaXRvckNvbmZpZyhpZCwgdGhpcy5jb25maWcoKSksXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkVkaXRvckNoYW5nZS5iaW5kKHRoaXMpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd2lyZUVkaXRvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3JFbGVtZW50ID0gdGhpcy5lZGl0b3JSZWYoKS5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuaW5pdEVkaXRvckV2ZW50cyh0aGlzLmVkaXRvckVsZW1lbnQpO1xuICAgICAgICB0aGlzLmluaXRTY3JvbGxPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLnN0YXJ0UG9vbGluZyh0aGlzLnJlcXVlc3RTaXplKCkpO1xuICAgICAgICB0aGlzLnNldExpc3RlbmVyc09uQ3VzdG9tQmxvY2tDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMaXN0ZW5lcnNPbkN1c3RvbUJsb2NrQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldExpc3RlbmVyc09uQ3VzdG9tQmxvY2tDaGFuZ2VzKHRoaXMuZWRpdG9yLCB7XG4gICAgICAgICAgICByZW1vdmVkQ2FsbGJhY2s6IHRoaXMub25SZW1vdmVkQ29tYmluZWRCbG9jay5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdXBkYXRlZENhbGxiYWNrOiB0aGlzLm9uVXBkYXRlZENvbWJpbmVkQmxvY2suYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFkZGVkQ2FsbGJhY2s6IHRoaXMub25BZGRlZENvbWJpbmVkQmxvY2suYmluZCh0aGlzKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0Q2hhbmdlcyhldmVudDogQmxvY2tNdXRhdGlvbkV2ZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNTa2lwIHx8IHRoaXMuaXNDaGFuZ2luZykge1xuICAgICAgICAgICAgdGhpcy5pc1NraXAgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0NoYW5naW5nID0gdHJ1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZWRpdG9yT3V0cHV0ID0gYXdhaXQgdGhpcy5lZGl0b3Iuc2F2ZSgpO1xuXG4gICAgICAgICAgICByZWNhbGN1bGF0ZUluZGV4ZXModGhpcy5lZGl0b3IuYmxvY2tzKTtcblxuICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnQuZmlsdGVyKChkYXRhKSA9PiBkYXRhLmRldGFpbC50YXJnZXQubmFtZSAhPT0gQ09NQklORURfVEVYVF9CTE9DS19OQU1FKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrcyA9IHRoaXMuZWRpdG9yU2VydmljZS5zb3J0RXZlbnRzQnlUeXBlcyhldmVudHMpO1xuICAgICAgICAgICAgY29uc3QgeyBhZGRCbG9ja3MkLCBhZGRlZEJsb2NrcyB9ID0gdGhpcy5jb2xsZWN0QWRkZWRCbG9ja3NSZXF1ZXN0KGJsb2NrcywgZWRpdG9yT3V0cHV0KTtcblxuICAgICAgICAgICAgdGhpcy5hZGRlZEJsb2NrcyA9IFtdO1xuXG4gICAgICAgICAgICBhZGRCbG9ja3MkXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRhcCgoYmxvY2tJZHMpID0+IHRoaXMuc2V0QmxvY2tJZHNUb01hcChibG9ja0lkcywgYWRkZWRCbG9ja3MpKSxcbiAgICAgICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuY29sbGVjdFVwZGF0ZWRCbG9ja3NSZXF1ZXN0KGJsb2NrcywgZWRpdG9yT3V0cHV0KSksXG4gICAgICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmNvbGxlY3RSZW1vdmVkQmxvY2tzUmVxdWVzdChibG9ja3MpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHRoaXMuc3RhcnROZXh0Q2hhbmdlKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnN0YXJ0TmV4dENoYW5nZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnROZXh0Q2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzQ2hhbmdpbmcgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXh0RXZlbnRzID0gdGhpcy5jaGFuZ2VzUXVldWUucG9wKCk7XG5cbiAgICAgICAgaWYgKG5leHRFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDaGFuZ2VzKG5leHRFdmVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbXB0eVF1ZXVlLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0QWRkZWRCbG9ja3NSZXF1ZXN0KGJsb2NrczogQ3VpRXZlbnRBY3Rpb25EYXRhLCBlZGl0b3JPdXRwdXQ6IE91dHB1dERhdGEpOiBDdWlCbG9ja3NSZXF1ZXN0RGF0YSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRCbG9ja3NXaXRoSW5kZXggPSBibG9ja3NbRXZlbnRBY3Rpb25zLmFkZF0ubWFwKChhZGRlZEJsb2NrKSA9PlxuICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEZ1bGxCbG9ja0RhdGEoYWRkZWRCbG9jaywgZWRpdG9yT3V0cHV0KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2Nrc1dpdGhJbmRleCA9IHRoaXMuYWRkZWRCbG9ja3MubWFwKChibG9jaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWRpdG9yRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7YmxvY2suaWR9XCJdYCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihlbGVtZW50Py5kYXRhc2V0WydpbmRleCddKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmxvY2ssIGluZGV4IH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFkZGVkQmxvY2tzID0gWy4uLmRlZmF1bHRCbG9ja3NXaXRoSW5kZXgsIC4uLmNvbWJpbmVkQmxvY2tzV2l0aEluZGV4XS5zb3J0KFxuICAgICAgICAgICAgKGZpcnN0LCBzZWNvbmQpID0+IGZpcnN0LmluZGV4IC0gc2Vjb25kLmluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGFkZEJsb2NrcyQgPSB0aGlzLmVkaXRvclNlcnZpY2UuY29sbGVjdEFkZGVkQmxvY2tzUmVxdWVzdChcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQXBpSWQoKSxcbiAgICAgICAgICAgIGFkZGVkQmxvY2tzLFxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0T3B0aW9ucygpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZGVkQmxvY2tzLFxuICAgICAgICAgICAgYWRkQmxvY2tzJFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFVwZGF0ZWRCbG9ja3NSZXF1ZXN0KGJsb2NrczogQ3VpRXZlbnRBY3Rpb25EYXRhLCBlZGl0b3JPdXRwdXQ6IE91dHB1dERhdGEpOiBPYnNlcnZhYmxlPEN1aUJsb2NrW10+IHtcbiAgICAgICAgYmxvY2tzW0V2ZW50QWN0aW9ucy51cGRhdGVdLmZvckVhY2goKHVwZGF0ZUJsb2NrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGlkLCBibG9jayB9ID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEZ1bGxCbG9ja0RhdGEodXBkYXRlQmxvY2ssIGVkaXRvck91dHB1dCk7XG4gICAgICAgICAgICBibG9jay5pZCA9IGlkO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZWRCbG9ja3MucHVzaChibG9jayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZUJsb2NrcyQgPSB0aGlzLmVkaXRvclNlcnZpY2UuY29sbGVjdFVwZGF0ZWRCbG9ja3NSZXF1ZXN0KFxuICAgICAgICAgICAgdGhpcy51cGRhdGVkQmxvY2tzLFxuICAgICAgICAgICAgdGhpcy5ibG9ja0lkc01hcCxcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMoKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudXBkYXRlZEJsb2NrcyA9IFtdO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVCbG9ja3MkO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFJlbW92ZWRCbG9ja3NSZXF1ZXN0KGJsb2NrczogQ3VpRXZlbnRBY3Rpb25EYXRhKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGJsb2Nrc1tFdmVudEFjdGlvbnMucmVtb3ZlXS5mb3JFYWNoKChibG9jaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBibG9jay5kZXRhaWwudGFyZ2V0LmlkO1xuXG4gICAgICAgICAgICB0aGlzLnJlbW92ZWRCbG9ja3NJZHMucHVzaChpZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlbW92ZUJsb2NrcyQgPSB0aGlzLmVkaXRvclNlcnZpY2UuY29sbGVjdFJlbW92ZWRCbG9ja3NSZXF1ZXN0KFxuICAgICAgICAgICAgdGhpcy5lZGl0b3JBcGlJZCgpLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkQmxvY2tzSWRzLFxuICAgICAgICAgICAgdGhpcy5ibG9ja0lkc01hcCxcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMoKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbW92ZWRCbG9ja3NJZHMgPSBbXTtcblxuICAgICAgICByZXR1cm4gcmVtb3ZlQmxvY2tzJDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJsb2NrcyhwYWdlID0gMCwgc2l6ZSA9IDQwKTogT2JzZXJ2YWJsZTxDdWlCbG9ja1tdPiB7XG4gICAgICAgIGxldCBjb21iaW5lZEJsb2NrOiBDdWlOdWxsYWJsZTxDdWlCbG9jaz47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMualRleHRTZXJ2aWNlLmdldEJsb2Nrcyh0aGlzLmVkaXRvckFwaUlkKCksIHBhZ2UsIHNpemUsIHRoaXMucmVxdWVzdE9wdGlvbnMoKSkucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3kpLFxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21iaW5lZEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tYmluZWRCbG9jayhjb21iaW5lZEJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRCbG9jayA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVJbmRleGVzKHRoaXMuZWRpdG9yLmJsb2Nrcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gQ09NQklORURfVEVYVF9CTE9DS19QQVJUKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrRGF0YSA9IGJsb2NrLmRhdGEgYXMgeyBwYXJlbnRJZDogc3RyaW5nIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbWJpbmVkQmxvY2sgJiYgYmxvY2tEYXRhLnBhcmVudElkISAhPT0gY29tYmluZWRCbG9jaz8uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tYmluZWRCbG9jayhjb21iaW5lZEJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQmxvY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRCbG9jayA9IHRoaXMuc2V0Q29tYmluZWRCbG9jayhibG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21iaW5lZEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tYmluZWRCbG9jayhjb21iaW5lZEJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRCbG9jayA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRCbG9jayhibG9jayk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRvQXJyYXkoKVxuICAgICAgICApIGFzIHVua25vd24gYXMgT2JzZXJ2YWJsZTxDdWlCbG9ja1tdPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEJsb2NrKGJsb2NrOiBDdWlCbG9jayk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIGJsb2NrLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJsb2NrSWRzTWFwLnNldChibG9jay5pZCEsIGJsb2NrLmlkISk7XG4gICAgICAgIHRoaXMuaW5zZXJ0KGJsb2NrKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZENvbWJpbmVkQmxvY2soY29tYmluZWRCbG9jazogQ3VpQmxvY2spOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1NraXBDb21iaW5lZEJsb2NrT25DaGFuZ2UucHVzaCh0cnVlKTtcbiAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmVkaXRvci5ibG9ja3MuZ2V0QnlJZChjb21iaW5lZEJsb2NrLmlkIHx8ICcnKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmJsb2Nrcy51cGRhdGUoYmxvY2suaWQsIGNvbWJpbmVkQmxvY2suZGF0YSBhcyBDdWlDb21iaW5lZFBhcnRCbG9jayk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5zZXJ0KGNvbWJpbmVkQmxvY2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5zZXJ0KGJsb2NrOiBDdWlCbG9jayk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoZWNrRmlyc3QoYmxvY2spO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0ZpcnN0KGJsb2NrOiBDdWlCbG9jayk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNGaXJzdCkge1xuICAgICAgICAgICAgdGhpcy5pc1NraXAgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IuYmxvY2tzLmluc2VydChibG9jay50eXBlLCBibG9jay5kYXRhLCB7fSwgdGhpcy5pbmRleCwgZmFsc2UsIGZhbHNlLCBibG9jay5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86INC10YHRgtGMINCy0LDRgNC40Log0YfRgtC+INGH0YLQviDRgtC+INC/0L7QudC00LXRgiDQvdC1INGC0LDQulxuICAgICAgICB0aGlzLmVkaXRvci5ibG9ja3MucmVuZGVyKHsgYmxvY2tzOiBbYmxvY2tdIH0pLnRoZW4oKCkgPT4gKHRoaXMuaXNTa2lwID0gZmFsc2UpKTtcbiAgICAgICAgdGhpcy5pc0ZpcnN0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDb21iaW5lZEJsb2NrKGJsb2NrOiBDdWlCbG9jayk6IEN1aUJsb2NrIHtcbiAgICAgICAgY29uc3QgY29tYmluZWRCbG9ja0RhdGEgPSBibG9jay5kYXRhIGFzIHsgcGFyZW50SWQ6IHN0cmluZyB9O1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmNvbWJpbmVkQmxvY2tzLmdldChjb21iaW5lZEJsb2NrRGF0YS5wYXJlbnRJZCk7XG5cbiAgICAgICAgdGhpcy5ibG9ja0lkc01hcC5zZXQoYmxvY2suaWQhLCBibG9jay5pZCEpO1xuXG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBwYXJlbnQuZGF0YSBhcyB7IHRleHRCbG9ja3M6IEN1aUJsb2NrW10gfTtcbiAgICAgICAgICAgIHBhcmVudERhdGEudGV4dEJsb2Nrcy5wdXNoKGJsb2NrKTtcblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudE9iamVjdDogQ3VpQmxvY2sgPSB7XG4gICAgICAgICAgICBpZDogY29tYmluZWRCbG9ja0RhdGEucGFyZW50SWQsXG4gICAgICAgICAgICB0eXBlOiBDT01CSU5FRF9URVhUX0JMT0NLX05BTUUsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGNvbWJpbmVkQmxvY2tEYXRhLnBhcmVudElkLFxuICAgICAgICAgICAgICAgIHRleHRCbG9ja3M6IFtibG9ja11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNvbWJpbmVkQmxvY2tzLnNldChjb21iaW5lZEJsb2NrRGF0YS5wYXJlbnRJZCwgcGFyZW50T2JqZWN0KTtcblxuICAgICAgICByZXR1cm4gcGFyZW50T2JqZWN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0QmxvY2tJZHNUb01hcChibG9ja0lkczogc3RyaW5nW10sIGFkZGVkQmxvY2tzOiBDdWlGdWxsQmxvY2tEYXRhW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFibG9ja0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudExvY2FsSWRXaXRoTWFpbklkKGJsb2NrSWRzLCBhZGRlZEJsb2Nrcyk7XG4gICAgICAgIGFkZGVkQmxvY2tzLmZvckVhY2goKGJsb2NrRGF0YSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tJZHNNYXAuc2V0KGJsb2NrRGF0YS5pZCwgYmxvY2tJZHNbaW5kZXhdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVFbGVtZW50TG9jYWxJZFdpdGhNYWluSWQoYmxvY2tJZHM6IHN0cmluZ1tdLCBibG9ja3M6IEN1aUZ1bGxCbG9ja0RhdGFbXSk6IHZvaWQge1xuICAgICAgICBibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lZGl0b3JFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS1pZD1cIiR7YmxvY2suaWR9XCJdYCk7XG5cbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0WydpZCddID0gYmxvY2tJZHNbaW5kZXhdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFN0YXJ0QmxvY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmJsb2NrSWRzTWFwLnNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRW1wdHkuZW1pdCh0aGlzLmNoZWNrSXNFbXB0eSgpKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkb25seSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5yZW5kZXIoeyBibG9ja3M6IFtdIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0U3RhcnRCbG9jayhcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQXBpSWQoKSxcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMoKSxcbiAgICAgICAgICAgIGFzeW5jIChibG9jazogQ3VpQmxvY2s8Q3VpQ29tYmluZWRCbG9ja1Rvb2xEYXRhPiwgaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tJZHNNYXAuc2V0KGlkLCBpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NraXBDb21iaW5lZEJsb2NrT25DaGFuZ2UucHVzaCh0cnVlKTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZWRpdG9yLnJlbmRlcih7IGJsb2NrczogW2Jsb2NrXSB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZWNhbGN1bGF0ZUluZGV4ZXModGhpcy5lZGl0b3IuYmxvY2tzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnKCk/LmF1dG9mb2N1cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lZGl0b3IuY2FyZXQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrSXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYmxvY2tzQ291bnQgPSB0aGlzLmVkaXRvci5ibG9ja3M/LmdldEJsb2Nrc0NvdW50KCkgPz8gMDtcblxuICAgICAgICBpZiAoIWJsb2Nrc0NvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFJFREFDVE9SX1NFTEVDVE9SID0gJy5jb2RleC1lZGl0b3JfX3JlZGFjdG9yJztcbiAgICAgICAgY29uc3QgcmVkYWN0b3JUZXh0Q29udGVudCA9IHRoaXMuZWRpdG9yRWxlbWVudC5xdWVyeVNlbGVjdG9yKFJFREFDVE9SX1NFTEVDVE9SKT8udGV4dENvbnRlbnQ/LnRyaW0oKTtcblxuICAgICAgICByZXR1cm4gIXJlZGFjdG9yVGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldERhdGEoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnBvb2xpbmdTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuaXNTa2lwQ29tYmluZWRCbG9ja09uQ2hhbmdlID0gW107XG4gICAgICAgIHRoaXMuaXNGaXJzdCA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNDaGFuZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU2tpcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYmxvY2tJZHNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICB0aGlzLmNvbWJpbmVkQmxvY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wYWdlID0gMDtcbiAgICAgICAgdGhpcy5hZGRlZEJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLnVwZGF0ZWRCbG9ja3MgPSBbXTtcbiAgICAgICAgdGhpcy5yZW1vdmVkQmxvY2tzSWRzID0gW107XG4gICAgICAgIHRoaXMuY2hhbmdlc1F1ZXVlID0gW107XG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjZWRpdG9yXG4gICAgW2lkXT1cImVkaXRvcklkXCJcbiAgICBkYXRhLWVkaXRvclxuICAgIFtjbGFzcy5fcmVhZG9ubHldPVwiY29uZmlnKCkucmVhZE9ubHlcIlxuPjwvZGl2PlxuIl19
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2VkaXRvci9lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVDLE9BQU8sUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRTFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRyxPQUFPLEVBQUUscUJBQXFCLEVBQVksa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBVzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxZQUFZLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBaUJqRSxNQUFNLE9BQU8sa0JBQWtCO0lBcUQzQjtRQXBEaUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFN0Msa0JBQWEsR0FBRyxHQUFHLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFcEMsY0FBUyxHQUFrQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MscUJBQWdCLEdBQXNDLElBQUksQ0FBQztRQUMzRCx5QkFBb0IsR0FBOEIsSUFBSSxDQUFDO1FBQ3ZELGdDQUEyQixHQUFjLEVBQUUsQ0FBQztRQUM1QyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQy9CLDZFQUE2RTtRQUNyRSxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3hDLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMzQixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLGdCQUFXLEdBQW1CLEVBQUUsQ0FBQztRQUNqQyxrQkFBYSxHQUFlLEVBQUUsQ0FBQztRQUMvQixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBQzFDLG9CQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUUvQixlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyRCxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFL0QsaUJBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUEwQixXQUFXLENBQUMsQ0FBQztRQUV0RSxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixhQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxjQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBMEIsUUFBUSxDQUFDLENBQUM7UUFFckUsZ0JBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7UUFDdkMsV0FBTSxHQUFHLEtBQUssQ0FBa0IsY0FBYyxDQUFDLENBQUM7UUFDaEQsZ0JBQVcsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFFaEMsZ0JBQVcsR0FBRyxNQUFNLEVBQVcsQ0FBQztRQUNoQyxnQkFBVyxHQUFHLE1BQU0sRUFBUSxDQUFDO1FBTXpDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sUUFBUTtRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXhCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFckIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7YUFDdEQsSUFBSSxDQUNELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzlDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBRWhCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQzVFO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxXQUFtQixFQUFFLElBQVksRUFBRSxPQUFlLEVBQUUsUUFBaUI7UUFDeEYsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkQsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU1QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxhQUFhLENBQUMsT0FBZTtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3RDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkQsT0FBTztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsV0FBbUIsRUFBRSxJQUFZLEVBQUUsT0FBZTtRQUN2RSxJQUFJLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJCLE9BQU87UUFDWCxDQUFDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN0QyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQWU7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkQsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDTyxhQUFhO1FBQ2pCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8saUJBQWlCLENBQUMsT0FBZTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDL0UsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFHTyxjQUFjLENBQUMsQ0FBTSxFQUFFLEtBQWdEO1FBQzNFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUFpQztRQUMxRCxJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFdkMsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFO1lBQ2xDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRztTQUNoQixDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLGFBQXlCO1FBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxRQUFrQjtRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxlQUFlLENBQUMsS0FBZ0M7UUFDcEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUVyQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLE1BQU0sQ0FDRixHQUFHLEVBQUU7WUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNMLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVPLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxRQUFrQjtRQUN2RCxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQzFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUN6RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3RELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFFRCx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFFM0QsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixPQUFPLElBQUksb0JBQW9CLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1RixJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1NBQ2xDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDeEQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQW9CO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVuQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ1gsT0FBTztRQUNYLENBQUM7UUFFRCxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxXQUFXLENBQUMsUUFBb0M7UUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sV0FBVyxDQUFDLEVBQVU7UUFDMUIsT0FBTyxJQUFJLFFBQVEsQ0FBQztZQUNoQixHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDM0MsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFFcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVPLGdDQUFnQztRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDN0QsZUFBZSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZELGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2RCxhQUFhLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdEQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBMkI7UUFDbEQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUVwQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXZCLElBQUksQ0FBQztZQUNELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU5QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXZDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRXpGLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBRXRCLFVBQVU7aUJBQ0wsSUFBSSxDQUNELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUMvRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUN2RSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQzVEO2lCQUNBLFNBQVMsQ0FBQztnQkFDUCxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7YUFDdEMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPO1FBQ1gsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXhCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFM0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxNQUEwQixFQUFFLFlBQXdCO1FBQ2xGLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxzQ0FBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FDaEUsQ0FBQztRQUNGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBZ0IsQ0FBQztZQUMzRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRWhELE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxzQkFBc0IsRUFBRSxHQUFHLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUM1RSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FDaEQsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbEIsV0FBVyxFQUNYLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FDeEIsQ0FBQztRQUVGLE9BQU87WUFDSCxXQUFXO1lBQ1gsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDO0lBRU8sMkJBQTJCLENBQUMsTUFBMEIsRUFBRSxZQUF3QjtRQUNwRixNQUFNLDJDQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2hELE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDckYsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFFZCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQ2hFLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXhCLE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxNQUEwQjtRQUMxRCxNQUFNLDJDQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUVsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FDaEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNsQixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFM0IsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2pDLElBQUksYUFBb0MsQ0FBQztRQUV6QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDMUYsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUNoQyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNyQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1YsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHdCQUF3QixFQUFFLENBQUM7Z0JBQzFDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUE0QixDQUFDO2dCQUVyRCxJQUFJLGFBQWEsSUFBSSxTQUFTLENBQUMsUUFBUyxLQUFLLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixDQUFDO2dCQUVELGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTdDLE9BQU87WUFDWCxDQUFDO1lBRUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNyQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxFQUNGLE9BQU8sRUFBRSxDQUN5QixDQUFDO0lBQzNDLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBZTtRQUM1QixJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRyxFQUFFLEtBQUssQ0FBQyxFQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxhQUF1QjtRQUM1QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsSUFBNEIsQ0FBQyxDQUFDO1lBRWhGLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQWU7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFlO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUUxRixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFlO1FBQ3BDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLElBQTRCLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkUsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUcsQ0FBQyxDQUFDO1FBRTNDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBa0MsQ0FBQztZQUM3RCxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVsQyxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQWE7WUFDM0IsRUFBRSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7WUFDOUIsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixJQUFJLEVBQUU7Z0JBQ0YsRUFBRSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7Z0JBQzlCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQzthQUN0QjtTQUNKLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFbEUsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsV0FBK0I7UUFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDhCQUE4QixDQUFDLFFBQWtCLEVBQUUsTUFBMEI7UUFDakYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBYyxhQUFhLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXpGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDWCxPQUFPO1lBQ1gsQ0FBQztZQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUUzQyxPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFckMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUUvRSxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ2xCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDckIsQ0FBQyxLQUF5QyxFQUFFLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQ3ZHLENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUMxQixLQUF5QyxFQUN6QyxFQUFVLEVBQ1YsT0FBZTtRQUVmLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZELE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sUUFBUTtRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sWUFBWTtRQUNoQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0saUJBQWlCLEdBQUcseUJBQXlCLENBQUM7UUFDcEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUVyRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFDaEMsQ0FBQztJQUVPLFNBQVM7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7K0dBdnFCUSxrQkFBa0I7bUdBQWxCLGtCQUFrQix3aEJBVGhCO1lBQ1AsZ0JBQWdCO1lBQ2hCO2dCQUNJLE9BQU8sRUFBRSxxQkFBcUI7Z0JBQzlCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FDYixNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUU7YUFDcEc7U0FDSiwyUENuREwscVBBWUE7OzRGRHlDYSxrQkFBa0I7a0JBZjlCLFNBQVM7K0JBQ0ksWUFBWSxjQUNWLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUCxnQkFBZ0I7d0JBQ2hCOzRCQUNJLE9BQU8sRUFBRSxxQkFBcUI7NEJBQzlCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FDYixNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUU7eUJBQ3BHO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbGVtZW50UmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgZWZmZWN0LFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB0eXBlIHsgQ3VpTnVsbGFibGUgfSBmcm9tICdAY3VieS11aS9jZGsnO1xuaW1wb3J0IHsgQ3VpSWRTZXJ2aWNlIH0gZnJvbSAnQGN1YnktdWkvY2RrJztcbmltcG9ydCB0eXBlIHsgQVBJLCBCbG9ja011dGF0aW9uRXZlbnQsIE91dHB1dERhdGEgfSBmcm9tICdAZWRpdG9yanMvZWRpdG9yanMnO1xuaW1wb3J0IEVkaXRvckpTIGZyb20gJ0BlZGl0b3Jqcy9lZGl0b3Jqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBFTVBUWSwgZmluYWxpemUsIG1hcCwgU3ViamVjdCwgdGFwLCB0aW1lciwgdG9BcnJheSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ1VJX0pURVhUX0FQSV9TRVJWSUNFLCBDdWlCbG9jaywgQ3VpSlRleHRBcGlTZXJ2aWNlIH0gZnJvbSAnQGN1YnktdWkvYXBpJztcblxuaW1wb3J0IHsgZ2V0RWRpdG9yQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgQ09NQklORURfVEVYVF9CTE9DS19OQU1FLCBDT01CSU5FRF9URVhUX0JMT0NLX1BBUlQsIERFRkFVTFRfQ09ORklHIH0gZnJvbSAnLi9jb25zdGFudHMvZWRpdG9yLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBzZXRFZGl0b3JFdmVudHMgfSBmcm9tICcuL2V2ZW50cy9zZXQtZWRpdG9yLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQ3VpQmxvY2tEYXRhLFxuICAgIEN1aUJsb2Nrc1JlcXVlc3REYXRhLFxuICAgIEN1aUNvbWJpbmVkQmxvY2tBZGRpbmdFdmVudCxcbiAgICBDdWlDb21iaW5lZEJsb2NrVG9vbERhdGEsXG4gICAgQ3VpQ29tYmluZWRQYXJ0QmxvY2ssXG4gICAgQ3VpRWRpdG9yQ29uZmlnLFxuICAgIEN1aUV2ZW50QWN0aW9uRGF0YSxcbiAgICBDdWlGdWxsQmxvY2tEYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDdWlFZGl0b3JTZXJ2aWNlLCBFdmVudEFjdGlvbnMgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IHJlY2FsY3VsYXRlSW5kZXhlcyB9IGZyb20gJy4vdXRpbHMvcmVjYWxjdWxhdGUtaW5kZXhlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY3VpLWVkaXRvcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ3VpRWRpdG9yU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ1VJX0pURVhUX0FQSV9TRVJWSUNFLFxuICAgICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT5cbiAgICAgICAgICAgICAgICBpbmplY3QoQ1VJX0pURVhUX0FQSV9TRVJWSUNFLCB7IG9wdGlvbmFsOiB0cnVlLCBza2lwU2VsZjogdHJ1ZSB9KSA/PyBuZXcgQ3VpSlRleHRBcGlTZXJ2aWNlKClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgQ3VpRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdWlJZFNlcnZpY2UgPSBpbmplY3QoQ3VpSWRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvclNlcnZpY2UgPSBpbmplY3QoQ3VpRWRpdG9yU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBqVGV4dFNlcnZpY2UgPSBpbmplY3QoQ1VJX0pURVhUX0FQSV9TRVJWSUNFKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgUE9PTElOR19ERUxBWSA9IDEwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFJFVFJZX0RFTEFZID0gMzAwMDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW1wdHlRdWV1ZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBwcml2YXRlIGluaXRDaGFpbjogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHByaXZhdGUgbGF6eUxvYWRPYnNlcnZlcjogQ3VpTnVsbGFibGU8SW50ZXJzZWN0aW9uT2JzZXJ2ZXI+ID0gbnVsbDtcbiAgICBwcml2YXRlIGxhenlMb2FkU3Vic2NyaXB0aW9uOiBDdWlOdWxsYWJsZTxTdWJzY3JpcHRpb24+ID0gbnVsbDtcbiAgICBwcml2YXRlIGlzU2tpcENvbWJpbmVkQmxvY2tPbkNoYW5nZTogYm9vbGVhbltdID0gW107XG4gICAgcHJpdmF0ZSBpc0ZpcnN0ID0gdHJ1ZTtcbiAgICBwcml2YXRlIGlzQ2hhbmdpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzU2tpcCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc1ByZWxvYWRGaW5pc2hlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGFzRW5kTGVmdFpvbmUgPSBmYWxzZTtcbiAgICAvLyDQndGD0LbQtdC9INC00LvRjyDRgdC+0L7RgtC90L7RiNC10L3QuNGPINC70L7QutCw0LvRjNC90L7Qs9C+IElEINC4INC+0YHQvdC+0LLQvdC+0LPQviBJRCDQv9C+0YHQu9C1INGB0L7Qt9C00LDQvdC40Y8g0Y3Qu9C10LzQtdC90YLQsFxuICAgIHByaXZhdGUgYmxvY2tJZHNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHByaXZhdGUgY29tYmluZWRCbG9ja3MgPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBpbmRleCA9IDA7XG4gICAgcHJpdmF0ZSBwYWdlID0gMDtcbiAgICBwcml2YXRlIGxhenlMb2FkVmVyc2lvbiA9IDA7XG4gICAgcHJpdmF0ZSBhZGRlZEJsb2NrczogQ3VpQmxvY2tEYXRhW10gPSBbXTtcbiAgICBwcml2YXRlIHVwZGF0ZWRCbG9ja3M6IEN1aUJsb2NrW10gPSBbXTtcbiAgICBwcml2YXRlIHJlbW92ZWRCbG9ja3NJZHM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBjaGFuZ2VzUXVldWU6IEJsb2NrTXV0YXRpb25FdmVudFtdW10gPSBbXTtcbiAgICBwcml2YXRlIGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNSZWFkb25seSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29uZmlnKCk/LnJlYWRPbmx5KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWcoKT8ucmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlZGl0b3JFbmRSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdlZGl0b3JFbmQnKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0VkaXRvclJlYWR5ID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWRpdG9ySWQgPSB0aGlzLmN1aUlkU2VydmljZS5nZW5lcmF0ZSgpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlZGl0b3JSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdlZGl0b3InKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBlZGl0b3JBcGlJZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQ8Q3VpRWRpdG9yQ29uZmlnPihERUZBVUxUX0NPTkZJRyk7XG4gICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3RTaXplID0gaW5wdXQ8bnVtYmVyPig0MCk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZWRpdG9yRW1wdHkgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWRpdG9yUmVhZHkgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIHB1YmxpYyBlZGl0b3IhOiBFZGl0b3JKUztcbiAgICBwdWJsaWMgZWRpdG9yRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5pdEVkaXRvckVmZmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5lbnF1ZXVlSW5pdCgoKSA9PiB0aGlzLnRlYXJkb3duRWRpdG9yKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNSZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmxhenlMb2FkVmVyc2lvbjtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVxdWVzdFNpemUoKTtcbiAgICAgICAgbGV0IGJsb2Nrc0NvdW50ID0gMDtcbiAgICAgICAgbGV0IGlzRmFpbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5sYXp5TG9hZFN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0QmxvY2tzKHRoaXMucGFnZSwgc2l6ZSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoYmxvY2tzKSA9PiAoYmxvY2tzQ291bnQgPSBibG9ja3MubGVuZ3RoKSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlzRmFpbGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5maW5pc2hQYWdlTG9hZChibG9ja3NDb3VudCwgc2l6ZSwgdmVyc2lvbiwgaXNGYWlsZWQpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluaXNoUGFnZUxvYWQoYmxvY2tzQ291bnQ6IG51bWJlciwgc2l6ZTogbnVtYmVyLCB2ZXJzaW9uOiBudW1iZXIsIGlzRmFpbGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCB8fCB2ZXJzaW9uICE9PSB0aGlzLmxhenlMb2FkVmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRmFpbGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJldHJ5UGFnZUxvYWQodmVyc2lvbik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFnZSsrO1xuICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dFBhZ2UoYmxvY2tzQ291bnQsIHNpemUsIHZlcnNpb24pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmV0cnlQYWdlTG9hZCh2ZXJzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1JlcXVlc3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGltZXIodGhpcy5SRVRSWV9ERUxBWSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3kpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQgfHwgdmVyc2lvbiAhPT0gdGhpcy5sYXp5TG9hZFZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFBhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVOZXh0UGFnZShibG9ja3NDb3VudDogbnVtYmVyLCBzaXplOiBudW1iZXIsIHZlcnNpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoYmxvY2tzQ291bnQgPCBzaXplKSB7XG4gICAgICAgICAgICB0aGlzLmxhenlMb2FkT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoUHJlbG9hZCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lcih0aGlzLlBPT0xJTkdfREVMQVkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb250aW51ZUxhenlMb2FkKHZlcnNpb24pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnRpbnVlTGF6eUxvYWQodmVyc2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkIHx8IHZlcnNpb24gIT09IHRoaXMubGF6eUxvYWRWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcoKT8ud2l0aG91dFByZWxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoUHJlbG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlRWRpdG9yRW5kKCk7XG4gICAgfVxuICAgIHByaXZhdGUgZmluaXNoUHJlbG9hZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQcmVsb2FkRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNQcmVsb2FkRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldFN0YXJ0QmxvY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmlzaEZpcnN0UmVuZGVyKHZlcnNpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCB8fCB2ZXJzaW9uICE9PSB0aGlzLmxhenlMb2FkVmVyc2lvbiB8fCB0aGlzLmlzRWRpdG9yUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0VkaXRvclJlYWR5LnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5lZGl0b3JSZWFkeS5lbWl0KCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIG9uRWRpdG9yQ2hhbmdlKF86IEFQSSwgZXZlbnQ6IEJsb2NrTXV0YXRpb25FdmVudCB8IEJsb2NrTXV0YXRpb25FdmVudFtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZG9ubHkoKSB8fCB0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudCA9IFtldmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0NoYW5naW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZXNRdWV1ZS51bnNoaWZ0KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRDaGFuZ2VzKGV2ZW50KTtcbiAgICAgICAgdGhpcy5lZGl0b3JFbXB0eS5lbWl0KHRoaXMuY2hlY2tJc0VtcHR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25BZGRlZENvbWJpbmVkQmxvY2soZGF0YTogQ3VpQ29tYmluZWRCbG9ja0FkZGluZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2tpcENvbWJpbmVkQmxvY2tPbkNoYW5nZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTa2lwQ29tYmluZWRCbG9ja09uQ2hhbmdlLnBvcCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBibG9ja3NXaXRob3V0SWQgPSBkYXRhLmJsb2Nrcy5tYXAoKGJsb2NrKSA9PiAoe1xuICAgICAgICAgICAgYmxvY2s6IHsgLi4uYmxvY2ssIGlkOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIGlkOiBibG9jay5pZCFcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHRoaXMuYWRkZWRCbG9ja3MucHVzaCguLi5ibG9ja3NXaXRob3V0SWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25VcGRhdGVkQ29tYmluZWRCbG9jayh1cGRhdGVkQmxvY2tzOiBDdWlCbG9ja1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghdXBkYXRlZEJsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlZEJsb2Nrcy5wdXNoKC4uLnVwZGF0ZWRCbG9ja3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25SZW1vdmVkQ29tYmluZWRCbG9jayhibG9ja0lkczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFibG9ja0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVjYWxjdWxhdGVBbGxCbG9ja3NBZnRlclJlbW92YWwoYmxvY2tJZHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FZGl0b3JFbmRNb3ZlKGVudHJ5OiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmhhc0VuZExlZnRab25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoUHJlbG9hZCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcoKT8ud2l0aG91dFByZWxvYWQgJiYgIXRoaXMuaGFzRW5kTGVmdFpvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZFBhZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRFZGl0b3JFZmZlY3QoKTogdm9pZCB7XG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0b3JBcGlJZCgpIHx8IHRoaXMuY29uZmlnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RWRpdG9yQ2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRFZGl0b3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVucXVldWVJbml0KCgpID0+IHRoaXMucnVuRWRpdG9ySW5pdCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY2FsY3VsYXRlQWxsQmxvY2tzQWZ0ZXJSZW1vdmFsKGJsb2NrSWRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCByZW1haW5pbmdSZW1vdmVkQmxvY2tJZHMgPSBuZXcgU2V0KGJsb2NrSWRzKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZWRCbG9ja3MgPSB0aGlzLnVwZGF0ZWRCbG9ja3MuZmlsdGVyKFxuICAgICAgICAgICAgKHVwZGF0ZWRCbG9jaykgPT4gIXJlbWFpbmluZ1JlbW92ZWRCbG9ja0lkcy5oYXModXBkYXRlZEJsb2NrLmlkID8/ICcnKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZGVkQmxvY2tzID0gdGhpcy5hZGRlZEJsb2Nrcy5maWx0ZXIoKGFkZGVkQmxvY2spID0+IHtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nUmVtb3ZlZEJsb2NrSWRzLmhhcyhhZGRlZEJsb2NrLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW1haW5pbmdSZW1vdmVkQmxvY2tJZHMuZGVsZXRlKGFkZGVkQmxvY2suaWQpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlZEJsb2Nrc0lkcy5wdXNoKC4uLnJlbWFpbmluZ1JlbW92ZWRCbG9ja0lkcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRWRpdG9yRW5kKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlZGl0b3JFbmRFbGVtZW50ID0gdGhpcy5lZGl0b3JFbmRSZWYoKS5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMubGF6eUxvYWRPYnNlcnZlciA/Pz0gdGhpcy5jcmVhdGVMYXp5TG9hZE9ic2VydmVyKCk7XG4gICAgICAgIHRoaXMubGF6eUxvYWRPYnNlcnZlci51bm9ic2VydmUoZWRpdG9yRW5kRWxlbWVudCk7XG4gICAgICAgIHRoaXMubGF6eUxvYWRPYnNlcnZlci5vYnNlcnZlKGVkaXRvckVuZEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTGF6eUxvYWRPYnNlcnZlcigpOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHRoaXMub25FZGl0b3JFbmRNb3ZlKGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXSksIHtcbiAgICAgICAgICAgIHJvb3Q6IHRoaXMuZ2V0Vmlld3BvcnRFbGVtZW50KClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWaWV3cG9ydEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcoKT8uZWxlbWVudCA/PyB0aGlzLmVkaXRvckVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RWRpdG9yRXZlbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlYWRPbmx5ID0gdGhpcy5pc1JlYWRvbmx5KCk7XG5cbiAgICAgICAgaWYgKHJlYWRPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRFZGl0b3JFdmVudHMoZWxlbWVudCwgdGhpcy5hYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRlYXJkb3duRWRpdG9yKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgICAgIHRoaXMuZWRpdG9yPy5kZXN0cm95Py4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVucXVldWVJbml0KGNhbGxiYWNrOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRDaGFpbiA9IHRoaXMuaW5pdENoYWluLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5FZGl0b3JJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnRlYXJkb3duRWRpdG9yKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWRpdG9yID0gdGhpcy5idWlsZEVkaXRvcih0aGlzLmVkaXRvcklkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVkaXRvci5pc1JlYWR5O1xuXG4gICAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndpcmVFZGl0b3IoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkRWRpdG9yKGlkOiBzdHJpbmcpOiBFZGl0b3JKUyB7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9ySlMoe1xuICAgICAgICAgICAgLi4uZ2V0RWRpdG9yQ29uZmlnKGlkLCB0aGlzLmNvbmZpZygpKSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uRWRpdG9yQ2hhbmdlLmJpbmQodGhpcylcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3aXJlRWRpdG9yKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvckVsZW1lbnQgPSB0aGlzLmVkaXRvclJlZigpLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5pbml0RWRpdG9yRXZlbnRzKHRoaXMuZWRpdG9yRWxlbWVudCk7XG4gICAgICAgIHRoaXMubG9hZFBhZ2UoKTtcbiAgICAgICAgdGhpcy5zZXRMaXN0ZW5lcnNPbkN1c3RvbUJsb2NrQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TGlzdGVuZXJzT25DdXN0b21CbG9ja0NoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRMaXN0ZW5lcnNPbkN1c3RvbUJsb2NrQ2hhbmdlcyh0aGlzLmVkaXRvciwge1xuICAgICAgICAgICAgcmVtb3ZlZENhbGxiYWNrOiB0aGlzLm9uUmVtb3ZlZENvbWJpbmVkQmxvY2suYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHVwZGF0ZWRDYWxsYmFjazogdGhpcy5vblVwZGF0ZWRDb21iaW5lZEJsb2NrLmJpbmQodGhpcyksXG4gICAgICAgICAgICBhZGRlZENhbGxiYWNrOiB0aGlzLm9uQWRkZWRDb21iaW5lZEJsb2NrLmJpbmQodGhpcylcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydENoYW5nZXMoZXZlbnQ6IEJsb2NrTXV0YXRpb25FdmVudFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlzU2tpcCB8fCB0aGlzLmlzQ2hhbmdpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTa2lwID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNDaGFuZ2luZyA9IHRydWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvck91dHB1dCA9IGF3YWl0IHRoaXMuZWRpdG9yLnNhdmUoKTtcblxuICAgICAgICAgICAgcmVjYWxjdWxhdGVJbmRleGVzKHRoaXMuZWRpdG9yLmJsb2Nrcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50LmZpbHRlcigoZGF0YSkgPT4gZGF0YS5kZXRhaWwudGFyZ2V0Lm5hbWUgIT09IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRSk7XG4gICAgICAgICAgICBjb25zdCBibG9ja3MgPSB0aGlzLmVkaXRvclNlcnZpY2Uuc29ydEV2ZW50c0J5VHlwZXMoZXZlbnRzKTtcbiAgICAgICAgICAgIGNvbnN0IHsgYWRkQmxvY2tzJCwgYWRkZWRCbG9ja3MgfSA9IHRoaXMuY29sbGVjdEFkZGVkQmxvY2tzUmVxdWVzdChibG9ja3MsIGVkaXRvck91dHB1dCk7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkZWRCbG9ja3MgPSBbXTtcblxuICAgICAgICAgICAgYWRkQmxvY2tzJFxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoKGJsb2NrSWRzKSA9PiB0aGlzLnNldEJsb2NrSWRzVG9NYXAoYmxvY2tJZHMsIGFkZGVkQmxvY2tzKSksXG4gICAgICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmNvbGxlY3RVcGRhdGVkQmxvY2tzUmVxdWVzdChibG9ja3MsIGVkaXRvck91dHB1dCkpLFxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5jb2xsZWN0UmVtb3ZlZEJsb2Nrc1JlcXVlc3QoYmxvY2tzKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB0aGlzLnN0YXJ0TmV4dENoYW5nZSgpLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5zdGFydE5leHRDaGFuZ2UoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0TmV4dENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0NoYW5naW5nID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV4dEV2ZW50cyA9IHRoaXMuY2hhbmdlc1F1ZXVlLnBvcCgpO1xuXG4gICAgICAgIGlmIChuZXh0RXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2hhbmdlcyhuZXh0RXZlbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1wdHlRdWV1ZS5uZXh0KG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdEFkZGVkQmxvY2tzUmVxdWVzdChibG9ja3M6IEN1aUV2ZW50QWN0aW9uRGF0YSwgZWRpdG9yT3V0cHV0OiBPdXRwdXREYXRhKTogQ3VpQmxvY2tzUmVxdWVzdERhdGEge1xuICAgICAgICBjb25zdCBkZWZhdWx0QmxvY2tzV2l0aEluZGV4ID0gYmxvY2tzW0V2ZW50QWN0aW9ucy5hZGRdLm1hcCgoYWRkZWRCbG9jaykgPT5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5nZXRGdWxsQmxvY2tEYXRhKGFkZGVkQmxvY2ssIGVkaXRvck91dHB1dClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRCbG9ja3NXaXRoSW5kZXggPSB0aGlzLmFkZGVkQmxvY2tzLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVkaXRvckVsZW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtaWQ9XCIke2Jsb2NrLmlkfVwiXWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoZWxlbWVudD8uZGF0YXNldFsnaW5kZXgnXSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IC4uLmJsb2NrLCBpbmRleCB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhZGRlZEJsb2NrcyA9IFsuLi5kZWZhdWx0QmxvY2tzV2l0aEluZGV4LCAuLi5jb21iaW5lZEJsb2Nrc1dpdGhJbmRleF0uc29ydChcbiAgICAgICAgICAgIChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5pbmRleCAtIHNlY29uZC5pbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBhZGRCbG9ja3MkID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmNvbGxlY3RBZGRlZEJsb2Nrc1JlcXVlc3QoXG4gICAgICAgICAgICB0aGlzLmVkaXRvckFwaUlkKCksXG4gICAgICAgICAgICBhZGRlZEJsb2NrcyxcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMoKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRlZEJsb2NrcyxcbiAgICAgICAgICAgIGFkZEJsb2NrcyRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RVcGRhdGVkQmxvY2tzUmVxdWVzdChibG9ja3M6IEN1aUV2ZW50QWN0aW9uRGF0YSwgZWRpdG9yT3V0cHV0OiBPdXRwdXREYXRhKTogT2JzZXJ2YWJsZTxDdWlCbG9ja1tdPiB7XG4gICAgICAgIGJsb2Nrc1tFdmVudEFjdGlvbnMudXBkYXRlXS5mb3JFYWNoKCh1cGRhdGVCbG9jaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBpZCwgYmxvY2sgfSA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRGdWxsQmxvY2tEYXRhKHVwZGF0ZUJsb2NrLCBlZGl0b3JPdXRwdXQpO1xuICAgICAgICAgICAgYmxvY2suaWQgPSBpZDtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVkQmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1cGRhdGVCbG9ja3MkID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmNvbGxlY3RVcGRhdGVkQmxvY2tzUmVxdWVzdChcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZEJsb2NrcyxcbiAgICAgICAgICAgIHRoaXMuYmxvY2tJZHNNYXAsXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RPcHRpb25zKClcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZWRCbG9ja3MgPSBbXTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlQmxvY2tzJDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RSZW1vdmVkQmxvY2tzUmVxdWVzdChibG9ja3M6IEN1aUV2ZW50QWN0aW9uRGF0YSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBibG9ja3NbRXZlbnRBY3Rpb25zLnJlbW92ZV0uZm9yRWFjaCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gYmxvY2suZGV0YWlsLnRhcmdldC5pZDtcblxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkQmxvY2tzSWRzLnB1c2goaWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZW1vdmVCbG9ja3MkID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmNvbGxlY3RSZW1vdmVkQmxvY2tzUmVxdWVzdChcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQXBpSWQoKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlZEJsb2Nrc0lkcyxcbiAgICAgICAgICAgIHRoaXMuYmxvY2tJZHNNYXAsXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RPcHRpb25zKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZW1vdmVkQmxvY2tzSWRzID0gW107XG5cbiAgICAgICAgcmV0dXJuIHJlbW92ZUJsb2NrcyQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCbG9ja3MocGFnZSA9IDAsIHNpemUgPSA0MCk6IE9ic2VydmFibGU8Q3VpQmxvY2tbXT4ge1xuICAgICAgICBsZXQgY29tYmluZWRCbG9jazogQ3VpTnVsbGFibGU8Q3VpQmxvY2s+O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmpUZXh0U2VydmljZS5nZXRCbG9ja3ModGhpcy5lZGl0b3JBcGlJZCgpLCBwYWdlLCBzaXplLCB0aGlzLnJlcXVlc3RPcHRpb25zKCkpLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95KSxcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29tYmluZWRCbG9jaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENvbWJpbmVkQmxvY2soY29tYmluZWRCbG9jayk7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQmxvY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlSW5kZXhlcyh0aGlzLmVkaXRvci5ibG9ja3MpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT09IENPTUJJTkVEX1RFWFRfQkxPQ0tfUEFSVCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0RhdGEgPSBibG9jay5kYXRhIGFzIHsgcGFyZW50SWQ6IHN0cmluZyB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5lZEJsb2NrICYmIGJsb2NrRGF0YS5wYXJlbnRJZCEgIT09IGNvbWJpbmVkQmxvY2s/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENvbWJpbmVkQmxvY2soY29tYmluZWRCbG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZEJsb2NrID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQmxvY2sgPSB0aGlzLnNldENvbWJpbmVkQmxvY2soYmxvY2spO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tYmluZWRCbG9jaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENvbWJpbmVkQmxvY2soY29tYmluZWRCbG9jayk7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQmxvY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2soYmxvY2spO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0b0FycmF5KClcbiAgICAgICAgKSBhcyB1bmtub3duIGFzIE9ic2VydmFibGU8Q3VpQmxvY2tbXT47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCbG9jayhibG9jazogQ3VpQmxvY2spOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiBibG9jay50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmxvY2tJZHNNYXAuaGFzKGJsb2NrLmlkISkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmxvY2tJZHNNYXAuc2V0KGJsb2NrLmlkISwgYmxvY2suaWQhKTtcbiAgICAgICAgdGhpcy5pbnNlcnQoYmxvY2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQ29tYmluZWRCbG9jayhjb21iaW5lZEJsb2NrOiBDdWlCbG9jayk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2tpcENvbWJpbmVkQmxvY2tPbkNoYW5nZS5wdXNoKHRydWUpO1xuICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZWRpdG9yLmJsb2Nrcy5nZXRCeUlkKGNvbWJpbmVkQmxvY2suaWQgfHwgJycpO1xuXG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IuYmxvY2tzLnVwZGF0ZShibG9jay5pZCwgY29tYmluZWRCbG9jay5kYXRhIGFzIEN1aUNvbWJpbmVkUGFydEJsb2NrKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnNlcnQoY29tYmluZWRCbG9jayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnNlcnQoYmxvY2s6IEN1aUJsb2NrKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hlY2tGaXJzdChibG9jayk7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrRmlyc3QoYmxvY2s6IEN1aUJsb2NrKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0KSB7XG4gICAgICAgICAgICB0aGlzLmlzU2tpcCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5ibG9ja3MuaW5zZXJ0KGJsb2NrLnR5cGUsIGJsb2NrLmRhdGEsIHt9LCB0aGlzLmluZGV4LCBmYWxzZSwgZmFsc2UsIGJsb2NrLmlkKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMubGF6eUxvYWRWZXJzaW9uO1xuXG4gICAgICAgIC8vIFRPRE86INC10YHRgtGMINCy0LDRgNC40Log0YfRgtC+INGH0YLQviDRgtC+INC/0L7QudC00LXRgiDQvdC1INGC0LDQulxuICAgICAgICB0aGlzLmVkaXRvci5ibG9ja3MucmVuZGVyKHsgYmxvY2tzOiBbYmxvY2tdIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1NraXAgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoRmlyc3RSZW5kZXIodmVyc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzRmlyc3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbWJpbmVkQmxvY2soYmxvY2s6IEN1aUJsb2NrKTogQ3VpQmxvY2sge1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2NrRGF0YSA9IGJsb2NrLmRhdGEgYXMgeyBwYXJlbnRJZDogc3RyaW5nIH07XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuY29tYmluZWRCbG9ja3MuZ2V0KGNvbWJpbmVkQmxvY2tEYXRhLnBhcmVudElkKTtcblxuICAgICAgICBpZiAocGFyZW50ICYmIHRoaXMuYmxvY2tJZHNNYXAuaGFzKGJsb2NrLmlkISkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJsb2NrSWRzTWFwLnNldChibG9jay5pZCEsIGJsb2NrLmlkISk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RGF0YSA9IHBhcmVudC5kYXRhIGFzIHsgdGV4dEJsb2NrczogQ3VpQmxvY2tbXSB9O1xuICAgICAgICAgICAgcGFyZW50RGF0YS50ZXh0QmxvY2tzLnB1c2goYmxvY2spO1xuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50T2JqZWN0OiBDdWlCbG9jayA9IHtcbiAgICAgICAgICAgIGlkOiBjb21iaW5lZEJsb2NrRGF0YS5wYXJlbnRJZCxcbiAgICAgICAgICAgIHR5cGU6IENPTUJJTkVEX1RFWFRfQkxPQ0tfTkFNRSxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpZDogY29tYmluZWRCbG9ja0RhdGEucGFyZW50SWQsXG4gICAgICAgICAgICAgICAgdGV4dEJsb2NrczogW2Jsb2NrXVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY29tYmluZWRCbG9ja3Muc2V0KGNvbWJpbmVkQmxvY2tEYXRhLnBhcmVudElkLCBwYXJlbnRPYmplY3QpO1xuXG4gICAgICAgIHJldHVybiBwYXJlbnRPYmplY3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRCbG9ja0lkc1RvTWFwKGJsb2NrSWRzOiBzdHJpbmdbXSwgYWRkZWRCbG9ja3M6IEN1aUZ1bGxCbG9ja0RhdGFbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWJsb2NrSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50TG9jYWxJZFdpdGhNYWluSWQoYmxvY2tJZHMsIGFkZGVkQmxvY2tzKTtcbiAgICAgICAgYWRkZWRCbG9ja3MuZm9yRWFjaCgoYmxvY2tEYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ibG9ja0lkc01hcC5zZXQoYmxvY2tEYXRhLmlkLCBibG9ja0lkc1tpbmRleF0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUVsZW1lbnRMb2NhbElkV2l0aE1haW5JZChibG9ja0lkczogc3RyaW5nW10sIGJsb2NrczogQ3VpRnVsbEJsb2NrRGF0YVtdKTogdm9pZCB7XG4gICAgICAgIGJsb2Nrcy5mb3JFYWNoKChibG9jaywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVkaXRvckVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLWlkPVwiJHtibG9jay5pZH1cIl1gKTtcblxuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LmRhdGFzZXRbJ2lkJ10gPSBibG9ja0lkc1tpbmRleF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U3RhcnRCbG9jaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tJZHNNYXAuc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JFbXB0eS5lbWl0KHRoaXMuY2hlY2tJc0VtcHR5KCkpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5sYXp5TG9hZFZlcnNpb247XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkb25seSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5yZW5kZXIoeyBibG9ja3M6IFtdIH0pLnRoZW4oKCkgPT4gdGhpcy5maW5pc2hGaXJzdFJlbmRlcih2ZXJzaW9uKSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRTdGFydEJsb2NrKFxuICAgICAgICAgICAgdGhpcy5lZGl0b3JBcGlJZCgpLFxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0T3B0aW9ucygpLFxuICAgICAgICAgICAgKGJsb2NrOiBDdWlCbG9jazxDdWlDb21iaW5lZEJsb2NrVG9vbERhdGE+LCBpZDogc3RyaW5nKSA9PiB0aGlzLnJlbmRlclN0YXJ0QmxvY2soYmxvY2ssIGlkLCB2ZXJzaW9uKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVuZGVyU3RhcnRCbG9jayhcbiAgICAgICAgYmxvY2s6IEN1aUJsb2NrPEN1aUNvbWJpbmVkQmxvY2tUb29sRGF0YT4sXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIHZlcnNpb246IG51bWJlclxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCB8fCB2ZXJzaW9uICE9PSB0aGlzLmxhenlMb2FkVmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ibG9ja0lkc01hcC5zZXQoaWQsIGlkKTtcbiAgICAgICAgdGhpcy5pc1NraXBDb21iaW5lZEJsb2NrT25DaGFuZ2UucHVzaCh0cnVlKTtcbiAgICAgICAgdGhpcy5lZGl0b3IucmVuZGVyKHsgYmxvY2tzOiBbYmxvY2tdIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maW5pc2hGaXJzdFJlbmRlcih2ZXJzaW9uKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoKTtcbiAgICAgICAgICAgIHJlY2FsY3VsYXRlSW5kZXhlcyh0aGlzLmVkaXRvci5ibG9ja3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnKCk/LmF1dG9mb2N1cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lZGl0b3IuY2FyZXQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrSXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYmxvY2tzQ291bnQgPSB0aGlzLmVkaXRvci5ibG9ja3M/LmdldEJsb2Nrc0NvdW50KCkgPz8gMDtcblxuICAgICAgICBpZiAoIWJsb2Nrc0NvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFJFREFDVE9SX1NFTEVDVE9SID0gJy5jb2RleC1lZGl0b3JfX3JlZGFjdG9yJztcbiAgICAgICAgY29uc3QgcmVkYWN0b3JUZXh0Q29udGVudCA9IHRoaXMuZWRpdG9yRWxlbWVudC5xdWVyeVNlbGVjdG9yKFJFREFDVE9SX1NFTEVDVE9SKT8udGV4dENvbnRlbnQ/LnRyaW0oKTtcblxuICAgICAgICByZXR1cm4gIXJlZGFjdG9yVGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldERhdGEoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRMYXp5TG9hZCgpO1xuICAgICAgICB0aGlzLmlzRWRpdG9yUmVhZHkuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5pc1NraXBDb21iaW5lZEJsb2NrT25DaGFuZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5pc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0NoYW5naW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNTa2lwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYmxvY2tJZHNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICB0aGlzLmNvbWJpbmVkQmxvY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5hZGRlZEJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLnVwZGF0ZWRCbG9ja3MgPSBbXTtcbiAgICAgICAgdGhpcy5yZW1vdmVkQmxvY2tzSWRzID0gW107XG4gICAgICAgIHRoaXMuY2hhbmdlc1F1ZXVlID0gW107XG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRMYXp5TG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXp5TG9hZFZlcnNpb24rKztcbiAgICAgICAgdGhpcy5sYXp5TG9hZE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMubGF6eUxvYWRPYnNlcnZlciA9IG51bGw7XG4gICAgICAgIHRoaXMubGF6eUxvYWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubGF6eUxvYWRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmlzUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNQcmVsb2FkRmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNFbmRMZWZ0Wm9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjZWRpdG9yXG4gICAgZGF0YS1lZGl0b3JcbiAgICBbY2xhc3MuX3JlYWRvbmx5XT1cImNvbmZpZygpLnJlYWRPbmx5XCJcbiAgICBbY2xhc3MuX2xvYWRpbmddPVwiIWlzRWRpdG9yUmVhZHkoKVwiXG4+XG4gICAgPGRpdiBbaWRdPVwiZWRpdG9ySWRcIj48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAgICNlZGl0b3JFbmRcbiAgICAgICAgY2xhc3M9XCJlZGl0b3ItZW5kXCJcbiAgICA+PC9kaXY+XG48L2Rpdj5cbiJdfQ==