@ai-table/grid 0.0.29 → 0.0.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. package/constants/table.d.ts +1 -1
  2. package/constants/table.d.ts.map +1 -1
  3. package/core/types/ai-table.d.ts +6 -6
  4. package/core/types/ai-table.d.ts.map +1 -1
  5. package/core/types/core.d.ts +3 -4
  6. package/core/types/core.d.ts.map +1 -1
  7. package/core/utils/queries.d.ts +2 -2
  8. package/core/utils/queries.d.ts.map +1 -1
  9. package/esm2022/components/context-menu/context-menu.component.mjs +3 -3
  10. package/esm2022/constants/table.mjs +2 -2
  11. package/esm2022/core/types/ai-table.mjs +4 -7
  12. package/esm2022/core/types/core.mjs +1 -1
  13. package/esm2022/core/utils/common.mjs +2 -2
  14. package/esm2022/core/utils/queries.mjs +1 -1
  15. package/esm2022/grid-base.component.mjs +1 -4
  16. package/esm2022/grid.component.mjs +34 -21
  17. package/esm2022/renderer/creations/create-cells.mjs +18 -44
  18. package/esm2022/services/event.service.mjs +1 -1
  19. package/esm2022/services/index.mjs +1 -2
  20. package/esm2022/services/selection.service.mjs +9 -14
  21. package/esm2022/types/grid.mjs +1 -1
  22. package/esm2022/utils/field/model/field.mjs +1 -1
  23. package/esm2022/utils/field/model/member.mjs +10 -9
  24. package/esm2022/utils/index.mjs +2 -1
  25. package/esm2022/utils/match-keywords.mjs +11 -0
  26. package/fesm2022/ai-table-grid.mjs +82 -135
  27. package/fesm2022/ai-table-grid.mjs.map +1 -1
  28. package/grid-base.component.d.ts +0 -2
  29. package/grid-base.component.d.ts.map +1 -1
  30. package/grid.component.d.ts +4 -3
  31. package/grid.component.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/services/event.service.d.ts.map +1 -1
  34. package/services/index.d.ts +0 -1
  35. package/services/index.d.ts.map +1 -1
  36. package/services/selection.service.d.ts +3 -3
  37. package/services/selection.service.d.ts.map +1 -1
  38. package/types/grid.d.ts +3 -3
  39. package/types/grid.d.ts.map +1 -1
  40. package/utils/field/model/field.d.ts +1 -1
  41. package/utils/field/model/field.d.ts.map +1 -1
  42. package/utils/field/model/member.d.ts +1 -1
  43. package/utils/field/model/member.d.ts.map +1 -1
  44. package/utils/index.d.ts +1 -0
  45. package/utils/index.d.ts.map +1 -1
  46. package/utils/match-keywords.d.ts +4 -0
  47. package/utils/match-keywords.d.ts.map +1 -0
  48. package/esm2022/services/match-cell.service.mjs +0 -45
  49. package/services/match-cell.service.d.ts +0 -13
  50. package/services/match-cell.service.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, signal, viewChild, ViewContainerRef } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { filter, fromEvent } from 'rxjs';
4
- import { AI_TABLE_CELL, AI_TABLE_CELL_PADDING, AI_TABLE_FIELD_ADD_BUTTON, AI_TABLE_FIELD_ADD_BUTTON_WIDTH, AI_TABLE_FIELD_HEAD, AI_TABLE_FIELD_HEAD_HEIGHT, AI_TABLE_FIELD_HEAD_MORE, AI_TABLE_FIELD_HEAD_SELECT_CHECKBOX, AI_TABLE_PROHIBIT_CLEAR_SELECTION_CLASS, AI_TABLE_ROW_ADD_BUTTON, AI_TABLE_ROW_HEAD_WIDTH, AI_TABLE_ROW_SELECT_CHECKBOX, DBL_CLICK_EDIT_TYPE, DEFAULT_POINT_POSITION, DEFAULT_SCROLL_STATE, MOUSEOVER_EDIT_TYPE } from './constants';
4
+ import { AI_TABLE_CELL, AI_TABLE_CELL_PADDING, AI_TABLE_FIELD_ADD_BUTTON, AI_TABLE_FIELD_ADD_BUTTON_WIDTH, AI_TABLE_FIELD_HEAD, AI_TABLE_FIELD_HEAD_HEIGHT, AI_TABLE_FIELD_HEAD_MORE, AI_TABLE_FIELD_HEAD_SELECT_CHECKBOX, AI_TABLE_PREVENT_CLEAR_SELECTION_CLASS, AI_TABLE_ROW_ADD_BUTTON, AI_TABLE_ROW_HEAD_WIDTH, AI_TABLE_ROW_SELECT_CHECKBOX, DBL_CLICK_EDIT_TYPE, DEFAULT_POINT_POSITION, DEFAULT_SCROLL_STATE, MOUSEOVER_EDIT_TYPE } from './constants';
5
5
  import { AITable, Coordinate, RendererContext } from './core';
6
6
  import { AITableGridBase } from './grid-base.component';
7
7
  import { AITableRenderer } from './renderer/renderer.component';
@@ -9,16 +9,15 @@ import { AITableGridEventService } from './services/event.service';
9
9
  import { AITableGridFieldService } from './services/field.service';
10
10
  import { AITableGridSelectionService } from './services/selection.service';
11
11
  import { AITableMouseDownType } from './types';
12
- import { buildGridLinearRows, getColumnIndicesMap, getDetailByTargetName, handleMouseStyle, isWindows } from './utils';
12
+ import { buildGridLinearRows, getColumnIndicesMap, getDetailByTargetName, handleMouseStyle, isCellMatchKeywords, isWindows } from './utils';
13
13
  import { getMousePosition } from './utils/position';
14
- import { AITableGridMatchCellService } from './services/match-cell.service';
15
14
  import * as i0 from "@angular/core";
16
15
  export class AITableGrid extends AITableGridBase {
17
16
  constructor() {
18
17
  super();
19
18
  this.viewContainerRef = inject(ViewContainerRef);
20
- this.isSelecting = false;
21
- this.selectionStart = null;
19
+ this.isDragSelecting = false;
20
+ this.dragSelectionStart = null;
22
21
  this.fieldHeadHeight = AI_TABLE_FIELD_HEAD_HEIGHT;
23
22
  this.containerRect = signal({ width: 0, height: 0 });
24
23
  this.hasContainerRect = computed(() => {
@@ -122,7 +121,7 @@ export class AITableGrid extends AITableGridBase {
122
121
  }
123
122
  });
124
123
  effect(() => {
125
- this.aiTableGridMatchCellService.findMatchedCells(this.aiKeywords(), this.aiReferences());
124
+ this.setKeywordsMatchedCells();
126
125
  }, { allowSignalWrites: true });
127
126
  }
128
127
  ngOnInit() {
@@ -142,6 +141,21 @@ export class AITableGrid extends AITableGridBase {
142
141
  scrollAction: this.scrollAction
143
142
  });
144
143
  }
144
+ setKeywordsMatchedCells() {
145
+ const keywords = this.aiKeywords();
146
+ let matchedCells = new Set();
147
+ if (keywords) {
148
+ const references = this.aiReferences();
149
+ this.aiTable.records().forEach((record) => {
150
+ this.aiTable.fields().forEach((field) => {
151
+ if (isCellMatchKeywords(this.aiTable, field, record._id, keywords, references)) {
152
+ matchedCells.add(`${record._id}:${field._id}`);
153
+ }
154
+ });
155
+ });
156
+ }
157
+ this.aiTable.keywordsMatchedCells.set(matchedCells);
158
+ }
145
159
  stageMousemove(e) {
146
160
  if (this.timer) {
147
161
  cancelAnimationFrame(this.timer);
@@ -158,10 +172,10 @@ export class AITableGrid extends AITableGridBase {
158
172
  handleMouseStyle(curMousePosition.realTargetName, curMousePosition.areaType, this.containerElement());
159
173
  context.setPointPosition(curMousePosition);
160
174
  this.timer = null;
161
- if (this.isSelecting) {
175
+ if (this.isDragSelecting) {
162
176
  const { fieldId, recordId } = getDetailByTargetName(curMousePosition.realTargetName);
163
177
  if (fieldId && recordId) {
164
- const startCell = this.selectionStart;
178
+ const startCell = this.dragSelectionStart;
165
179
  const endCell = [recordId, fieldId];
166
180
  if (startCell && !!startCell.length) {
167
181
  this.aiTableGridSelectionService.selectCells(startCell, endCell);
@@ -191,9 +205,9 @@ export class AITableGrid extends AITableGridBase {
191
205
  if (!recordId || !fieldId)
192
206
  return;
193
207
  this.aiTableGridEventService.closeCellEditor();
194
- const selectionStart = [recordId, fieldId];
195
- this.dragSelectionState(true, selectionStart);
196
- this.aiTableGridSelectionService.selectCells(selectionStart);
208
+ const dragSelectionStart = [recordId, fieldId];
209
+ this.updateDragSelectionState(true, dragSelectionStart);
210
+ this.aiTableGridSelectionService.selectCells(dragSelectionStart);
197
211
  return;
198
212
  case AI_TABLE_ROW_ADD_BUTTON:
199
213
  case AI_TABLE_FIELD_ADD_BUTTON:
@@ -205,7 +219,7 @@ export class AITableGrid extends AITableGridBase {
205
219
  }
206
220
  }
207
221
  stageMouseup(e) {
208
- this.dragSelectionState(false, null);
222
+ this.updateDragSelectionState(false, null);
209
223
  }
210
224
  stageContextmenu(e) {
211
225
  const mouseEvent = e.event.evt;
@@ -348,16 +362,15 @@ export class AITableGrid extends AITableGridBase {
348
362
  fromEvent(document, 'mousedown', { passive: true })
349
363
  .pipe(filter((e) => e.target instanceof Element &&
350
364
  !this.containerElement().contains(e.target) &&
351
- !(e.target.closest(AI_TABLE_PROHIBIT_CLEAR_SELECTION_CLASS) &&
352
- AITable.getSelectedRecordIds(this.aiTable).length > 0)), takeUntilDestroyed(this.destroyRef))
365
+ !e.target.closest(AI_TABLE_PREVENT_CLEAR_SELECTION_CLASS)), takeUntilDestroyed(this.destroyRef))
353
366
  .subscribe(() => {
354
- this.dragSelectionState(false, null);
367
+ this.updateDragSelectionState(false, null);
355
368
  this.aiTableGridSelectionService.clearSelection();
356
369
  });
357
370
  }
358
- dragSelectionState(isSelecting, selectionStart) {
359
- this.isSelecting = isSelecting;
360
- this.selectionStart = selectionStart;
371
+ updateDragSelectionState(isDragSelecting, dragSelectionStart) {
372
+ this.isDragSelecting = isDragSelecting;
373
+ this.dragSelectionStart = dragSelectionStart;
361
374
  }
362
375
  verticalScroll(e) {
363
376
  const { scrollTop } = e.target;
@@ -430,12 +443,12 @@ export class AITableGrid extends AITableGridBase {
430
443
  }
431
444
  }
432
445
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableGrid, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
433
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableGrid, isStandalone: true, selector: "ai-table-grid", host: { classAttribute: "ai-table-grid" }, providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService, AITableGridMatchCellService], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "verticalBarRef", first: true, predicate: ["verticalBar"], descendants: true, isSignal: true }, { propertyName: "horizontalBarRef", first: true, predicate: ["horizontalBar"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n", dependencies: [{ kind: "component", type: AITableRenderer, selector: "ai-table-renderer", inputs: ["config"], outputs: ["koMousemove", "koMousedown", "koMouseup", "koContextmenu", "koWheel", "koClick", "koDblclick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
446
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableGrid, isStandalone: true, selector: "ai-table-grid", host: { classAttribute: "ai-table-grid" }, providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "verticalBarRef", first: true, predicate: ["verticalBar"], descendants: true, isSignal: true }, { propertyName: "horizontalBarRef", first: true, predicate: ["horizontalBar"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n", dependencies: [{ kind: "component", type: AITableRenderer, selector: "ai-table-renderer", inputs: ["config"], outputs: ["koMousemove", "koMousedown", "koMouseup", "koContextmenu", "koWheel", "koClick", "koDblclick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
434
447
  }
435
448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableGrid, decorators: [{
436
449
  type: Component,
437
450
  args: [{ selector: 'ai-table-grid', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
438
451
  class: 'ai-table-grid'
439
- }, imports: [AITableRenderer], providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService, AITableGridMatchCellService], template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n" }]
452
+ }, imports: [AITableRenderer], providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService], template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n" }]
440
453
  }], ctorParameters: () => [] });
441
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3BhY2thZ2VzL2dyaWQvc3JjL2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUlOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpDLE9BQU8sRUFDSCxhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsbUNBQW1DLEVBQ25DLHVDQUF1QyxFQUN2Qyx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM1QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUF5QixPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBMkIsTUFBTSxRQUFRLENBQUM7QUFDOUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUs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QUM3QixPQUFPLEVBQUUsT0FBUTtvQkFDakIsUUFBUSxFQUFFLFFBQVM7b0JBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUMvQixXQUFXLEVBQUUsSUFBSTtvQkFDakIsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFtQyxFQUFFLEVBQUU7d0JBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hDLENBQUM7aUJBQ0osQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQU0sQ0FBQztZQUNKLHlDQUF5QztZQUN6QyxJQUFJLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25ELENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQzsrR0F4ZVEsV0FBVzttR0FBWCxXQUFXLHVHQUZULENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLEVBQUUsMkJBQTJCLENBQUMsNllDeEQzSCxxb0NBeUJBLDRDRDhCYyxlQUFlOzs0RkFHaEIsV0FBVztrQkFYdkIsU0FBUzsrQkFDSSxlQUFlLGNBRWIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDO3dCQUNGLEtBQUssRUFBRSxlQUFlO3FCQUN6QixXQUNRLENBQUMsZUFBZSxDQUFDLGFBQ2YsQ0FBQyx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBlZmZlY3QsXG4gICAgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBTaWduYWwsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZmlsdGVyLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEtvRXZlbnRPYmplY3QgfSBmcm9tICcuL2FuZ3VsYXIta29udmEnO1xuaW1wb3J0IHtcbiAgICBBSV9UQUJMRV9DRUxMLFxuICAgIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICBBSV9UQUJMRV9GSUVMRF9BRERfQlVUVE9OLFxuICAgIEFJX1RBQkxFX0ZJRUxEX0FERF9CVVRUT05fV0lEVEgsXG4gICAgQUlfVEFCTEVfRklFTERfSEVBRCxcbiAgICBBSV9UQUJMRV9GSUVMRF9IRUFEX0hFSUdIVCxcbiAgICBBSV9UQUJMRV9GSUVMRF9IRUFEX01PUkUsXG4gICAgQUlfVEFCTEVfRklFTERfSEVBRF9TRUxFQ1RfQ0hFQ0tCT1gsXG4gICAgQUlfVEFCTEVfUFJPSElCSVRfQ0xFQVJfU0VMRUNUSU9OX0NMQVNTLFxuICAgIEFJX1RBQkxFX1JPV19BRERfQlVUVE9OLFxuICAgIEFJX1RBQkxFX1JPV19IRUFEX1dJRFRILFxuICAgIEFJX1RBQkxFX1JPV19TRUxFQ1RfQ0hFQ0tCT1gsXG4gICAgREJMX0NMSUNLX0VESVRfVFlQRSxcbiAgICBERUZBVUxUX1BPSU5UX1BPU0lUSU9OLFxuICAgIERFRkFVTFRfU0NST0xMX1NUQVRFLFxuICAgIE1PVVNFT1ZFUl9FRElUX1RZUEVcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUlSZWNvcmRGaWVsZFBvc2l0aW9uLCBBSVRhYmxlLCBDb29yZGluYXRlLCBSZW5kZXJlckNvbnRleHQsIFVwZGF0ZUZpZWxkVmFsdWVPcHRpb25zIH0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7IEFJVGFibGVHcmlkQmFzZSB9IGZyb20gJy4vZ3JpZC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBSVRhYmxlUmVuZGVyZXIgfSBmcm9tICcuL3JlbmRlcmVyL3JlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBSVRhYmxlR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBSVRhYmxlR3JpZEZpZWxkU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZmllbGQuc2VydmljZSc7XG5pbXBvcnQgeyBBSVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFJVGFibGVNb3VzZURvd25UeXBlLCBBSVRhYmxlUmVuZGVyZXJDb25maWcsIFNjcm9sbEFjdGlvbk9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGJ1aWxkR3JpZExpbmVhclJvd3MsIGdldENvbHVtbkluZGljZXNNYXAsIGdldERldGFpbEJ5VGFyZ2V0TmFtZSwgaGFuZGxlTW91c2VTdHlsZSwgaXNXaW5kb3dzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRNb3VzZVBvc2l0aW9uIH0gZnJvbSAnLi91dGlscy9wb3NpdGlvbic7XG5pbXBvcnQgeyBBSVRhYmxlR3JpZE1hdGNoQ2VsbFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21hdGNoLWNlbGwuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWktdGFibGUtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ2FpLXRhYmxlLWdyaWQnXG4gICAgfSxcbiAgICBpbXBvcnRzOiBbQUlUYWJsZVJlbmRlcmVyXSxcbiAgICBwcm92aWRlcnM6IFtBSVRhYmxlR3JpZEV2ZW50U2VydmljZSwgQUlUYWJsZUdyaWRGaWVsZFNlcnZpY2UsIEFJVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZSwgQUlUYWJsZUdyaWRNYXRjaENlbGxTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBBSVRhYmxlR3JpZCBleHRlbmRzIEFJVGFibGVHcmlkQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgICBwcml2YXRlIGlzU2VsZWN0aW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHNlbGVjdGlvblN0YXJ0OiBBSVJlY29yZEZpZWxkUG9zaXRpb24gfCBudWxsID0gbnVsbDtcblxuICAgIHRpbWVyITogbnVtYmVyIHwgbnVsbDtcblxuICAgIHJlc2l6ZU9ic2VydmVyITogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgICBmaWVsZEhlYWRIZWlnaHQgPSBBSV9UQUJMRV9GSUVMRF9IRUFEX0hFSUdIVDtcblxuICAgIGNvbnRhaW5lclJlY3QgPSBzaWduYWwoeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuXG4gICAgaGFzQ29udGFpbmVyUmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyUmVjdCgpLndpZHRoID4gMCAmJiB0aGlzLmNvbnRhaW5lclJlY3QoKS5oZWlnaHQgPiAwO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdjb250YWluZXInKTtcblxuICAgIHZlcnRpY2FsQmFyUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCd2ZXJ0aWNhbEJhcicpO1xuXG4gICAgaG9yaXpvbnRhbEJhclJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaG9yaXpvbnRhbEJhcicpO1xuXG4gICAgbGluZWFyUm93cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkR3JpZExpbmVhclJvd3ModGhpcy5ncmlkRGF0YSgpLnJlY29yZHMsICF0aGlzLmFpUmVhZG9ubHkoKSk7XG4gICAgfSk7XG5cbiAgICB2aXNpYmxlQ29sdW1uc01hcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IEFJVGFibGUuZ2V0VmlzaWJsZUZpZWxkcyh0aGlzLmFpVGFibGUpO1xuICAgICAgICByZXR1cm4gbmV3IE1hcChjb2x1bW5zPy5tYXAoKGl0ZW0sIGluZGV4KSA9PiBbaXRlbS5faWQsIGluZGV4XSkpO1xuICAgIH0pO1xuXG4gICAgdmlzaWJsZVJvd3NJbmRleE1hcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAodGhpcy5saW5lYXJSb3dzKCkubWFwKChyb3csIGluZGV4KSA9PiBbcm93Ll9pZCwgaW5kZXhdKSk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXJFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIoKSEubmF0aXZlRWxlbWVudDtcbiAgICB9KTtcblxuICAgIHJlbmRlcmVyQ29uZmlnOiBTaWduYWw8QUlUYWJsZVJlbmRlcmVyQ29uZmlnPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gQUlUYWJsZS5nZXRWaXNpYmxlRmllbGRzKHRoaXMuYWlUYWJsZSk7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGUgPSBuZXcgQ29vcmRpbmF0ZSh7XG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLFxuICAgICAgICAgICAgcm93SGVpZ2h0OiBBSV9UQUJMRV9GSUVMRF9IRUFEX0hFSUdIVCxcbiAgICAgICAgICAgIHJvd0NvdW50OiB0aGlzLmxpbmVhclJvd3MoKS5sZW5ndGgsXG4gICAgICAgICAgICBjb2x1bW5Db3VudDogZmllbGRzLmxlbmd0aCxcbiAgICAgICAgICAgIHJvd0luaXRTaXplOiBBSV9UQUJMRV9GSUVMRF9IRUFEX0hFSUdIVCxcbiAgICAgICAgICAgIGNvbHVtbkluaXRTaXplOiBBSV9UQUJMRV9ST1dfSEVBRF9XSURUSCxcbiAgICAgICAgICAgIHJvd0luZGljZXNNYXA6IHt9LFxuICAgICAgICAgICAgY29sdW1uSW5kaWNlc01hcDogZ2V0Q29sdW1uSW5kaWNlc01hcChmaWVsZHMpLFxuICAgICAgICAgICAgZnJvemVuQ29sdW1uQ291bnQ6IDFcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhaVRhYmxlOiB0aGlzLmFpVGFibGUsXG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLFxuICAgICAgICAgICAgY29vcmRpbmF0ZTogY29vcmRpbmF0ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoOiB0aGlzLmNvbnRhaW5lclJlY3QoKS53aWR0aCxcbiAgICAgICAgICAgIGNvbnRhaW5lckhlaWdodDogdGhpcy5jb250YWluZXJSZWN0KCkuaGVpZ2h0LFxuICAgICAgICAgICAgcmVmZXJlbmNlczogdGhpcy5haVJlZmVyZW5jZXMoKSxcbiAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLmFpUmVhZG9ubHkoKVxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29vcmRpbmF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXJDb25maWcoKS5jb29yZGluYXRlO1xuICAgIH0pO1xuXG4gICAgc2Nyb2xsVG90YWxIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmNvb3JkaW5hdGUoKS50b3RhbEhlaWdodCwgdGhpcy5jb250YWluZXJSZWN0KCkuaGVpZ2h0IC0gdGhpcy5maWVsZEhlYWRIZWlnaHQpO1xuICAgIH0pO1xuXG4gICAgc2Nyb2xsYmFyV2lkdGggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGUoKS50b3RhbFdpZHRoICsgQUlfVEFCTEVfRklFTERfQUREX0JVVFRPTl9XSURUSDtcbiAgICB9KTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRDb250YWluZXJSZWN0KCk7XG4gICAgICAgICAgICB0aGlzLmJpbmRHbG9iYWxNb3VzZWRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYmluZFdoZWVsKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29udGFpbmVyUmVjdCgpICYmIHRoaXMuaG9yaXpvbnRhbEJhclJlZigpICYmIHRoaXMudmVydGljYWxCYXJSZWYoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFNjcm9sbEJhclNjcm9sbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5haVJlYWRvbmx5KCkgJiYgdGhpcy5haVRhYmxlLmNvbnRleHQ/LnBvaW50UG9zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlSG92ZXJDZWxsRWRpdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZE1hdGNoQ2VsbFNlcnZpY2UuZmluZE1hdGNoZWRDZWxscyh0aGlzLmFpS2V5d29yZHMoKSEsIHRoaXMuYWlSZWZlcmVuY2VzKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmluaXRDb250ZXh0KCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDb250ZXh0KCkge1xuICAgICAgICB0aGlzLmFpVGFibGUuY29udGV4dCA9IG5ldyBSZW5kZXJlckNvbnRleHQoe1xuICAgICAgICAgICAgbGluZWFyUm93czogdGhpcy5saW5lYXJSb3dzLFxuICAgICAgICAgICAgdmlzaWJsZUNvbHVtbnNNYXA6IHRoaXMudmlzaWJsZUNvbHVtbnNNYXAsXG4gICAgICAgICAgICB2aXNpYmxlUm93c0luZGV4TWFwOiB0aGlzLnZpc2libGVSb3dzSW5kZXhNYXAsXG4gICAgICAgICAgICBwb2ludFBvc2l0aW9uOiBzaWduYWwoREVGQVVMVF9QT0lOVF9QT1NJVElPTiksXG4gICAgICAgICAgICBzY3JvbGxTdGF0ZTogc2lnbmFsKERFRkFVTFRfU0NST0xMX1NUQVRFKSxcbiAgICAgICAgICAgIHNjcm9sbEFjdGlvbjogdGhpcy5zY3JvbGxBY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhZ2VNb3VzZW1vdmUoZTogS29FdmVudE9iamVjdDxNb3VzZUV2ZW50Pikge1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy50aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lciA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXROYW1lID0gZS5ldmVudC50YXJnZXQubmFtZSgpO1xuICAgICAgICAgICAgY29uc3QgZ3JpZFN0YWdlID0gZS5ldmVudC5jdXJyZW50VGFyZ2V0LmdldFN0YWdlKCk7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBncmlkU3RhZ2U/LmdldFBvaW50ZXJQb3NpdGlvbigpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB7IGNvbnRleHQgfSA9IHRoaXMuYWlUYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcG9zO1xuICAgICAgICAgICAgY29uc3QgY3VyTW91c2VQb3NpdGlvbiA9IGdldE1vdXNlUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRpbmF0ZSgpLFxuICAgICAgICAgICAgICAgIEFJVGFibGUuZ2V0VmlzaWJsZUZpZWxkcyh0aGlzLmFpVGFibGUpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQhLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBoYW5kbGVNb3VzZVN0eWxlKGN1ck1vdXNlUG9zaXRpb24ucmVhbFRhcmdldE5hbWUsIGN1ck1vdXNlUG9zaXRpb24uYXJlYVR5cGUsIHRoaXMuY29udGFpbmVyRWxlbWVudCgpKTtcbiAgICAgICAgICAgIGNvbnRleHQhLnNldFBvaW50UG9zaXRpb24oY3VyTW91c2VQb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpZWxkSWQsIHJlY29yZElkIH0gPSBnZXREZXRhaWxCeVRhcmdldE5hbWUoY3VyTW91c2VQb3NpdGlvbi5yZWFsVGFyZ2V0TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkSWQgJiYgcmVjb3JkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRDZWxsID0gdGhpcy5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kQ2VsbDogQUlSZWNvcmRGaWVsZFBvc2l0aW9uID0gW3JlY29yZElkLCBmaWVsZElkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q2VsbCAmJiAhIXN0YXJ0Q2VsbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENlbGxzKHN0YXJ0Q2VsbCwgZW5kQ2VsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YWdlTW91c2Vkb3duKGU6IEtvRXZlbnRPYmplY3Q8TW91c2VFdmVudD4pIHtcbiAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IGUuZXZlbnQuZXZ0O1xuICAgICAgICBjb25zdCBfdGFyZ2V0TmFtZSA9IGUuZXZlbnQudGFyZ2V0Lm5hbWUoKTtcblxuICAgICAgICBjb25zdCB7IHRhcmdldE5hbWUsIGZpZWxkSWQsIHJlY29yZElkIH0gPSBnZXREZXRhaWxCeVRhcmdldE5hbWUoX3RhcmdldE5hbWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtb3VzZUV2ZW50LmJ1dHRvbiA9PT0gQUlUYWJsZU1vdXNlRG93blR5cGUuUmlnaHQgJiZcbiAgICAgICAgICAgIHJlY29yZElkICYmXG4gICAgICAgICAgICBmaWVsZElkICYmXG4gICAgICAgICAgICAodGhpcy5haVRhYmxlLnNlbGVjdGlvbigpLnNlbGVjdGVkUmVjb3Jkcy5oYXMocmVjb3JkSWQpIHx8IHRoaXMuYWlUYWJsZS5zZWxlY3Rpb24oKS5zZWxlY3RlZENlbGxzLmhhcyhgJHtyZWNvcmRJZH06JHtmaWVsZElkfWApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGFyZ2V0TmFtZSkge1xuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9GSUVMRF9IRUFEOlxuICAgICAgICAgICAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkSWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZS5zZWxlY3RGaWVsZChmaWVsZElkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX0NFTEw6XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRJZCB8fCAhZmllbGRJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2UuY2xvc2VDZWxsRWRpdG9yKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQ6IEFJUmVjb3JkRmllbGRQb3NpdGlvbiA9IFtyZWNvcmRJZCwgZmllbGRJZF07XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU2VsZWN0aW9uU3RhdGUodHJ1ZSwgc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENlbGxzKHNlbGVjdGlvblN0YXJ0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX1JPV19BRERfQlVUVE9OOlxuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9GSUVMRF9BRERfQlVUVE9OOlxuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9ST1dfU0VMRUNUX0NIRUNLQk9YOlxuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9GSUVMRF9IRUFEX1NFTEVDVF9DSEVDS0JPWDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFnZU1vdXNldXAoZTogS29FdmVudE9iamVjdDxNb3VzZUV2ZW50Pikge1xuICAgICAgICB0aGlzLmRyYWdTZWxlY3Rpb25TdGF0ZShmYWxzZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgc3RhZ2VDb250ZXh0bWVudShlOiBLb0V2ZW50T2JqZWN0PE1vdXNlRXZlbnQ+KSB7XG4gICAgICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBlLmV2ZW50LmV2dDtcbiAgICAgICAgbW91c2VFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmFpUmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZSA9IGUuZXZlbnQudGFyZ2V0Lm5hbWUoKTtcbiAgICAgICAgY29uc3QgeyBmaWVsZElkLCByZWNvcmRJZCB9ID0gZ2V0RGV0YWlsQnlUYXJnZXROYW1lKHRhcmdldE5hbWUpO1xuICAgICAgICBpZiAoIXJlY29yZElkIHx8ICFmaWVsZElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHg6IG1vdXNlRXZlbnQueCxcbiAgICAgICAgICAgIHk6IG1vdXNlRXZlbnQueVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtZW51SXRlbXMgPSB0aGlzLmFpQ29udGV4dE1lbnVJdGVtcygpO1xuICAgICAgICBpZiAoIW1lbnVJdGVtcy5sZW5ndGggfHwgbWVudUl0ZW1zLmV2ZXJ5KChpdGVtKSA9PiAhIShpdGVtLmhpZGRlbiAmJiBpdGVtLmhpZGRlbih0aGlzLmFpVGFibGUsIHRhcmdldE5hbWUsIHBvc2l0aW9uKSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFpVGFibGVHcmlkRXZlbnRTZXJ2aWNlLm9wZW5Db250ZXh0TWVudSh0aGlzLmFpVGFibGUsIHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5jb250YWluZXJFbGVtZW50KCksXG4gICAgICAgICAgICBtZW51SXRlbXMsXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiB0aGlzLnZpZXdDb250YWluZXJSZWZcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhZ2VDbGljayhlOiBLb0V2ZW50T2JqZWN0PE1vdXNlRXZlbnQ+KSB7XG4gICAgICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBlLmV2ZW50LmV2dDtcbiAgICAgICAgbW91c2VFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB7IGNvbnRleHQgfSA9IHRoaXMuYWlUYWJsZTtcbiAgICAgICAgY29uc3QgeyB0YXJnZXROYW1lLCByb3dJbmRleDogcG9pbnRSb3dJbmRleCB9ID0gY29udGV4dCEucG9pbnRQb3NpdGlvbigpO1xuICAgICAgICBpZiAobW91c2VFdmVudC5idXR0b24gIT09IEFJVGFibGVNb3VzZURvd25UeXBlLkxlZnQgfHwgKHRhcmdldE5hbWUgIT09IEFJX1RBQkxFX0ZJRUxEX0hFQURfTU9SRSAmJiB0aGlzLmFpUmVhZG9ubHkoKSkpIHJldHVybjtcbiAgICAgICAgc3dpdGNoICh0YXJnZXROYW1lKSB7XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX1JPV19BRERfQlVUVE9OOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFJlY29yZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgQUlfVEFCTEVfUk9XX1NFTEVDVF9DSEVDS0JPWDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50UmVjb3JkSWQgPSBjb250ZXh0IS5saW5lYXJSb3dzKClbcG9pbnRSb3dJbmRleF0/Ll9pZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJlY29yZChwb2ludFJlY29yZElkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX0ZJRUxEX0hFQURfU0VMRUNUX0NIRUNLQk9YOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDaGVja2VkID0gdGhpcy5haVRhYmxlLnNlbGVjdGlvbigpLnNlbGVjdGVkUmVjb3Jkcy5zaXplID09PSB0aGlzLmFpVGFibGUucmVjb3JkcygpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdEFsbCghaXNDaGVja2VkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX0ZJRUxEX0FERF9CVVRUT046IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZS5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkR3JvdXBSZWN0ID0gZS5ldmVudC50YXJnZXQuZ2V0UGFyZW50KCk/LmdldENsaWVudFJlY3QoKSE7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGQodGhpcy5jb250YWluZXJFbGVtZW50KCksIHtcbiAgICAgICAgICAgICAgICAgICAgeDogZmllbGRHcm91cFJlY3QueCArIGNvbnRhaW5lclJlY3QueCxcbiAgICAgICAgICAgICAgICAgICAgeTogY29udGFpbmVyUmVjdC55ICsgZmllbGRHcm91cFJlY3QueSArIGZpZWxkR3JvdXBSZWN0LmhlaWdodFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgQUlfVEFCTEVfRklFTERfSEVBRF9NT1JFOlxuICAgICAgICAgICAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfdGFyZ2V0TmFtZSA9IGUuZXZlbnQudGFyZ2V0Lm5hbWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpZWxkSWQgfSA9IGdldERldGFpbEJ5VGFyZ2V0TmFtZShfdGFyZ2V0TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9yZVJlY3QgPSBlLmV2ZW50LnRhcmdldC5nZXRDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkR3JvdXBSZWN0ID0gZS5ldmVudC50YXJnZXQuZ2V0UGFyZW50KCk/LmdldFBhcmVudCgpPy5nZXRDbGllbnRSZWN0KCkhO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBjb250YWluZXJSZWN0LnggKyBtb3JlUmVjdC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogY29udGFpbmVyUmVjdC55ICsgbW9yZVJlY3QueSArIG1vcmVSZWN0LmhlaWdodFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0RmllbGRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGNvbnRhaW5lclJlY3QueCArIGZpZWxkR3JvdXBSZWN0LnggLSBBSV9UQUJMRV9DRUxMX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBjb250YWluZXJSZWN0LnkgKyBmaWVsZEdyb3VwUmVjdC55ICsgZmllbGRHcm91cFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdE9yaWdpbiA9IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoJy5rb252YWpzLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZEZpZWxkU2VydmljZS5vcGVuRmllbGRNZW51KHRoaXMuYWlUYWJsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZDogZmllbGRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTWVudXM6IHRoaXMuZmllbGRNZW51cygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdE9yaWdpbjogZWRpdE9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRGaWVsZFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFnZURibGNsaWNrKGU6IEtvRXZlbnRPYmplY3Q8TW91c2VFdmVudD4pIHtcbiAgICAgICAgaWYgKHRoaXMuYWlSZWFkb25seSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX3RhcmdldE5hbWUgPSBlLmV2ZW50LnRhcmdldC5uYW1lKCk7XG4gICAgICAgIGNvbnN0IHsgZmllbGRJZCwgcmVjb3JkSWQgfSA9IGdldERldGFpbEJ5VGFyZ2V0TmFtZShfdGFyZ2V0TmFtZSk7XG4gICAgICAgIGlmICghcmVjb3JkSWQgfHwgIWZpZWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWlUYWJsZS5maWVsZHNNYXAoKVtmaWVsZElkXTtcbiAgICAgICAgY29uc3QgZmllbGRUeXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgaWYgKCFEQkxfQ0xJQ0tfRURJVF9UWVBFLmluY2x1ZGVzKGZpZWxkVHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2Uub3BlbkNlbGxFZGl0b3IodGhpcy5haVRhYmxlLCB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSxcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlOiB0aGlzLmNvb3JkaW5hdGUoKSxcbiAgICAgICAgICAgICAgICBmaWVsZElkOiBmaWVsZElkISxcbiAgICAgICAgICAgICAgICByZWNvcmRJZDogcmVjb3JkSWQhLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRoaXMuYWlSZWZlcmVuY2VzKCksXG4gICAgICAgICAgICAgICAgdXBkYXRlRmllbGRWYWx1ZTogKHZhbHVlOiBVcGRhdGVGaWVsZFZhbHVlT3B0aW9uczxhbnk+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWlVcGRhdGVGaWVsZFZhbHVlLmVtaXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRXaGVlbCgpIHtcbiAgICAgICAgZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHRoaXMuY29udGFpbmVyRWxlbWVudCgpLCAnd2hlZWwnLCB7IHBhc3NpdmU6IGZhbHNlIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGU6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZEV2ZW50U2VydmljZS5jbG9zZUNlbGxFZGl0b3IoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFjdGlvbih7IGRlbHRhWDogZS5kZWx0YVgsIGRlbHRhWTogZS5kZWx0YVksIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2Nyb2xsQWN0aW9uID0gKG9wdGlvbnM6IFNjcm9sbEFjdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMudGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZXIgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgc2hpZnRLZXkgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBmaXhlZERlbHRhWSA9IHNoaWZ0S2V5ICYmIGlzV2luZG93cyA/IDAgOiBkZWx0YVk7XG4gICAgICAgICAgICBjb25zdCBmaXhlZERlbHRhWCA9IHNoaWZ0S2V5ICYmIGlzV2luZG93cyA/IGRlbHRhWSA6IGRlbHRhWDtcbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxCYXIgPSB0aGlzLmhvcml6b250YWxCYXJSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsQmFyID0gdGhpcy52ZXJ0aWNhbEJhclJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGhvcml6b250YWxCYXIpIHtcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsQmFyLnNjcm9sbExlZnQgPSBob3Jpem9udGFsQmFyLnNjcm9sbExlZnQgKyBmaXhlZERlbHRhWDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2ZXJ0aWNhbEJhcikge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsQmFyLnNjcm9sbFRvcCA9IHZlcnRpY2FsQmFyLnNjcm9sbFRvcCArIGZpeGVkRGVsdGFZO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayAmJiBvcHRpb25zLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYmluZFNjcm9sbEJhclNjcm9sbCgpIHtcbiAgICAgICAgZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHRoaXMuaG9yaXpvbnRhbEJhclJlZigpIS5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvcml6b250YWxTY3JvbGwoZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmcm9tRXZlbnQ8V2hlZWxFdmVudD4odGhpcy52ZXJ0aWNhbEJhclJlZigpIS5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kR2xvYmFsTW91c2Vkb3duKCkge1xuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZWRvd24nLCB7IHBhc3NpdmU6IHRydWUgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmNvbnRhaW5lckVsZW1lbnQoKS5jb250YWlucyhlLnRhcmdldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuY2xvc2VzdChBSV9UQUJMRV9QUk9ISUJJVF9DTEVBUl9TRUxFQ1RJT05fQ0xBU1MpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlUYWJsZS5nZXRTZWxlY3RlZFJlY29yZElkcyh0aGlzLmFpVGFibGUpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Rpb25TdGF0ZShmYWxzZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ1NlbGVjdGlvblN0YXRlKGlzU2VsZWN0aW5nOiBib29sZWFuLCBzZWxlY3Rpb25TdGFydDogQUlSZWNvcmRGaWVsZFBvc2l0aW9uIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0aW5nID0gaXNTZWxlY3Rpbmc7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0U2Nyb2xsaW5nID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmFpVGFibGUuY29udGV4dCEuc2V0U2Nyb2xsU3RhdGUoe1xuICAgICAgICAgICAgaXNTY3JvbGxpbmc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhvcml6b250YWxTY3JvbGwgPSAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsTGVmdCB9ID0gZS50YXJnZXQ7XG4gICAgICAgIHRoaXMuYWlUYWJsZS5jb250ZXh0IS5zZXRTY3JvbGxTdGF0ZSh7XG4gICAgICAgICAgICBzY3JvbGxMZWZ0LFxuICAgICAgICAgICAgaXNTY3JvbGxpbmc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRTY3JvbGxpbmcoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB2ZXJ0aWNhbFNjcm9sbChlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AgfSA9IGUudGFyZ2V0O1xuICAgICAgICB0aGlzLmFpVGFibGUuY29udGV4dCEuc2V0U2Nyb2xsU3RhdGUoe1xuICAgICAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICAgICAgaXNTY3JvbGxpbmc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRTY3JvbGxpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbnRhaW5lclJlY3QoKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVjdC5zZXQoe1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKS5vZmZzZXRIZWlnaHRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluZXJSZXNpemVMaXN0ZW5lcigpIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgdG90YWxXaWR0aCA9IHRoaXMuY29vcmRpbmF0ZSgpLnRvdGFsV2lkdGggKyBBSV9UQUJMRV9GSUVMRF9BRERfQlVUVE9OX1dJRFRIO1xuICAgICAgICAgICAgdGhpcy5zZXRDb250YWluZXJSZWN0KCk7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyV2lkdGggPj0gdG90YWxXaWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZS5jb250ZXh0IS5zZXRTY3JvbGxTdGF0ZSh7IHNjcm9sbExlZnQ6IDAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGFpbmVyRWxlbWVudCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUhvdmVyQ2VsbEVkaXRvcigpIHtcbiAgICAgICAgY29uc3QgeyByZWFsVGFyZ2V0TmFtZSB9ID0gdGhpcy5haVRhYmxlLmNvbnRleHQ/LnBvaW50UG9zaXRpb24oKSE7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0TmFtZSwgZmllbGRJZCwgcmVjb3JkSWQgfSA9IGdldERldGFpbEJ5VGFyZ2V0TmFtZShyZWFsVGFyZ2V0TmFtZSEpO1xuICAgICAgICBjb25zdCBlZGl0aW5nQ2VsbCA9IHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2UuZ2V0Q3VycmVudEVkaXRDZWxsKCk7XG5cbiAgICAgICAgaWYgKHRhcmdldE5hbWUgPT09IEFJX1RBQkxFX0NFTEwgJiYgcmVjb3JkSWQgJiYgZmllbGRJZCkge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmFpVGFibGUuZmllbGRzTWFwKClbZmllbGRJZF07XG5cbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgICAgICBjb25zdCBlZGl0aW5nRmllbGRUeXBlID0gZWRpdGluZ0NlbGwgPyB0aGlzLmFpVGFibGUuZmllbGRzTWFwKClbZWRpdGluZ0NlbGwuZmllbGRJZF0udHlwZSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpc0VkaXRpbmdGaWVsZFR5cGVIb3ZlcmVkID0gZWRpdGluZ0ZpZWxkVHlwZSA/IE1PVVNFT1ZFUl9FRElUX1RZUEUuaW5jbHVkZXMoZWRpdGluZ0ZpZWxkVHlwZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGlzRmllbGRUeXBlSG92ZXJlZCA9IE1PVVNFT1ZFUl9FRElUX1RZUEUuaW5jbHVkZXMoZmllbGRUeXBlKTtcblxuICAgICAgICAgICAgaWYgKGVkaXRpbmdDZWxsICYmIGlzRWRpdGluZ0ZpZWxkVHlwZUhvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkRXZlbnRTZXJ2aWNlLmNsb3NlQ2VsbEVkaXRvcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWVkaXRpbmdDZWxsICYmICFpc0ZpZWxkVHlwZUhvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkRXZlbnRTZXJ2aWNlLmNsb3NlQ2VsbEVkaXRvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVkaXRpbmdDZWxsICYmICgoIWlzRWRpdGluZ0ZpZWxkVHlwZUhvdmVyZWQgJiYgaXNGaWVsZFR5cGVIb3ZlcmVkKSB8fCAhaXNGaWVsZFR5cGVIb3ZlcmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZEV2ZW50U2VydmljZS5vcGVuQ2VsbEVkaXRvcih0aGlzLmFpVGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZTogdGhpcy5jb29yZGluYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSWQ6IGZpZWxkSWQhLFxuICAgICAgICAgICAgICAgICAgICByZWNvcmRJZDogcmVjb3JkSWQhLFxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiB0aGlzLmFpUmVmZXJlbmNlcygpLFxuICAgICAgICAgICAgICAgICAgICBpc0hvdmVyRWRpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmllbGRWYWx1ZTogKHZhbHVlOiBVcGRhdGVGaWVsZFZhbHVlT3B0aW9uczxhbnk+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFpVXBkYXRlRmllbGRWYWx1ZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDpvKDmoIfkvY3kuo7pnZ7ljZXlhYPmoLzljLrln5/ml7bvvIzlpoLmnpzlvZPliY3mnIkgbW91c2VvdmVyIOe8lui+keWFg+e0oO+8jOWImee7k+adn+e8lui+kVxuICAgICAgICAgICAgaWYgKGVkaXRpbmdDZWxsICYmIE1PVVNFT1ZFUl9FRElUX1RZUEUuaW5jbHVkZXModGhpcy5haVRhYmxlLmZpZWxkc01hcCgpW2VkaXRpbmdDZWxsLmZpZWxkSWRdLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZEV2ZW50U2VydmljZS5jbG9zZUNlbGxFZGl0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgI2NvbnRhaW5lciBjbGFzcz1cImFpLXRhYmxlLWdyaWQtdmlld1wiPlxuICAgIEBpZiAoaGFzQ29udGFpbmVyUmVjdCgpKSB7XG4gICAgICAgIDxhaS10YWJsZS1yZW5kZXJlclxuICAgICAgICAgICAgW2NvbmZpZ109XCJyZW5kZXJlckNvbmZpZygpXCJcbiAgICAgICAgICAgIChrb01vdXNlbW92ZSk9XCJzdGFnZU1vdXNlbW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrb01vdXNlZG93bik9XCJzdGFnZU1vdXNlZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIChrb01vdXNldXApPVwic3RhZ2VNb3VzZXVwKCRldmVudClcIlxuICAgICAgICAgICAgKGtvQ29udGV4dG1lbnUpPVwic3RhZ2VDb250ZXh0bWVudSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrb0NsaWNrKT1cInN0YWdlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoa29EYmxjbGljayk9XCJzdGFnZURibGNsaWNrKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2ICNob3Jpem9udGFsQmFyIGNsYXNzPVwiYWktdGFibGUtaG9yaXpvbnRhbC1zY3JvbGwtYmFyLXdyYXBwZXJcIiBbc3R5bGUud2lkdGgucHhdPVwiY29udGFpbmVyUmVjdCgpLndpZHRoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXRhYmxlLXNjcm9sbC1iYXItaW5uZXJcIiBbc3R5bGUud2lkdGgucHhdPVwic2Nyb2xsYmFyV2lkdGgoKVwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgI3ZlcnRpY2FsQmFyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhaS10YWJsZS12ZXJ0aWNhbC1zY3JvbGwtYmFyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY29udGFpbmVyUmVjdCgpLmhlaWdodCAtIGZpZWxkSGVhZEhlaWdodFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJmaWVsZEhlYWRIZWlnaHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS10YWJsZS1zY3JvbGwtYmFyLWlubmVyXCIgW3N0eWxlLmhlaWdodC5weF09XCJzY3JvbGxUb3RhbEhlaWdodCgpXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9haS10YWJsZS1yZW5kZXJlcj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3BhY2thZ2VzL2dyaWQvc3JjL2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUlOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpDLE9BQU8sRUFDSCxhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0Qyx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM1QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUF1QixPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBMkIsTUFBTSxRQUFRLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUs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QyxlQUFlLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7K0dBdmZRLFdBQVc7bUdBQVgsV0FBVyx1R0FGVCxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixDQUFDLDZZQ3ZEOUYscW9DQXlCQSw0Q0Q2QmMsZUFBZTs7NEZBR2hCLFdBQVc7a0JBWHZCLFNBQVM7K0JBQ0ksZUFBZSxjQUViLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDRixLQUFLLEVBQUUsZUFBZTtxQkFDekIsV0FDUSxDQUFDLGVBQWUsQ0FBQyxhQUNmLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgZWZmZWN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgU2lnbmFsLFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGZpbHRlciwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBLb0V2ZW50T2JqZWN0IH0gZnJvbSAnLi9hbmd1bGFyLWtvbnZhJztcbmltcG9ydCB7XG4gICAgQUlfVEFCTEVfQ0VMTCxcbiAgICBBSV9UQUJMRV9DRUxMX1BBRERJTkcsXG4gICAgQUlfVEFCTEVfRklFTERfQUREX0JVVFRPTixcbiAgICBBSV9UQUJMRV9GSUVMRF9BRERfQlVUVE9OX1dJRFRILFxuICAgIEFJX1RBQkxFX0ZJRUxEX0hFQUQsXG4gICAgQUlfVEFCTEVfRklFTERfSEVBRF9IRUlHSFQsXG4gICAgQUlfVEFCTEVfRklFTERfSEVBRF9NT1JFLFxuICAgIEFJX1RBQkxFX0ZJRUxEX0hFQURfU0VMRUNUX0NIRUNLQk9YLFxuICAgIEFJX1RBQkxFX1BSRVZFTlRfQ0xFQVJfU0VMRUNUSU9OX0NMQVNTLFxuICAgIEFJX1RBQkxFX1JPV19BRERfQlVUVE9OLFxuICAgIEFJX1RBQkxFX1JPV19IRUFEX1dJRFRILFxuICAgIEFJX1RBQkxFX1JPV19TRUxFQ1RfQ0hFQ0tCT1gsXG4gICAgREJMX0NMSUNLX0VESVRfVFlQRSxcbiAgICBERUZBVUxUX1BPSU5UX1BPU0lUSU9OLFxuICAgIERFRkFVTFRfU0NST0xMX1NUQVRFLFxuICAgIE1PVVNFT1ZFUl9FRElUX1RZUEVcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUlSZWNvcmRGaWVsZElkUGF0aCwgQUlUYWJsZSwgQ29vcmRpbmF0ZSwgUmVuZGVyZXJDb250ZXh0LCBVcGRhdGVGaWVsZFZhbHVlT3B0aW9ucyB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQgeyBBSVRhYmxlR3JpZEJhc2UgfSBmcm9tICcuL2dyaWQtYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQUlUYWJsZVJlbmRlcmVyIH0gZnJvbSAnLi9yZW5kZXJlci9yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQUlUYWJsZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQUlUYWJsZUdyaWRGaWVsZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQUlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBBSVRhYmxlTW91c2VEb3duVHlwZSwgQUlUYWJsZVJlbmRlcmVyQ29uZmlnLCBTY3JvbGxBY3Rpb25PcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZEdyaWRMaW5lYXJSb3dzLCBnZXRDb2x1bW5JbmRpY2VzTWFwLCBnZXREZXRhaWxCeVRhcmdldE5hbWUsIGhhbmRsZU1vdXNlU3R5bGUsIGlzQ2VsbE1hdGNoS2V5d29yZHMsIGlzV2luZG93cyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0TW91c2VQb3NpdGlvbiB9IGZyb20gJy4vdXRpbHMvcG9zaXRpb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FpLXRhYmxlLWdyaWQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdhaS10YWJsZS1ncmlkJ1xuICAgIH0sXG4gICAgaW1wb3J0czogW0FJVGFibGVSZW5kZXJlcl0sXG4gICAgcHJvdmlkZXJzOiBbQUlUYWJsZUdyaWRFdmVudFNlcnZpY2UsIEFJVGFibGVHcmlkRmllbGRTZXJ2aWNlLCBBSVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEFJVGFibGVHcmlkIGV4dGVuZHMgQUlUYWJsZUdyaWRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcblxuICAgIHByaXZhdGUgaXNEcmFnU2VsZWN0aW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGRyYWdTZWxlY3Rpb25TdGFydDogQUlSZWNvcmRGaWVsZElkUGF0aCB8IG51bGwgPSBudWxsO1xuXG4gICAgdGltZXIhOiBudW1iZXIgfCBudWxsO1xuXG4gICAgcmVzaXplT2JzZXJ2ZXIhOiBSZXNpemVPYnNlcnZlcjtcblxuICAgIGZpZWxkSGVhZEhlaWdodCA9IEFJX1RBQkxFX0ZJRUxEX0hFQURfSEVJR0hUO1xuXG4gICAgY29udGFpbmVyUmVjdCA9IHNpZ25hbCh7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG5cbiAgICBoYXNDb250YWluZXJSZWN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJSZWN0KCkud2lkdGggPiAwICYmIHRoaXMuY29udGFpbmVyUmVjdCgpLmhlaWdodCA+IDA7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2NvbnRhaW5lcicpO1xuXG4gICAgdmVydGljYWxCYXJSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3ZlcnRpY2FsQmFyJyk7XG5cbiAgICBob3Jpem9udGFsQmFyUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdob3Jpem9udGFsQmFyJyk7XG5cbiAgICBsaW5lYXJSb3dzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gYnVpbGRHcmlkTGluZWFyUm93cyh0aGlzLmdyaWREYXRhKCkucmVjb3JkcywgIXRoaXMuYWlSZWFkb25seSgpKTtcbiAgICB9KTtcblxuICAgIHZpc2libGVDb2x1bW5zTWFwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gQUlUYWJsZS5nZXRWaXNpYmxlRmllbGRzKHRoaXMuYWlUYWJsZSk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKGNvbHVtbnM/Lm1hcCgoaXRlbSwgaW5kZXgpID0+IFtpdGVtLl9pZCwgaW5kZXhdKSk7XG4gICAgfSk7XG5cbiAgICB2aXNpYmxlUm93c0luZGV4TWFwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE1hcCh0aGlzLmxpbmVhclJvd3MoKS5tYXAoKHJvdywgaW5kZXgpID0+IFtyb3cuX2lkLCBpbmRleF0pKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcigpIS5uYXRpdmVFbGVtZW50O1xuICAgIH0pO1xuXG4gICAgcmVuZGVyZXJDb25maWc6IFNpZ25hbDxBSVRhYmxlUmVuZGVyZXJDb25maWc+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBBSVRhYmxlLmdldFZpc2libGVGaWVsZHModGhpcy5haVRhYmxlKTtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZSA9IG5ldyBDb29yZGluYXRlKHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJFbGVtZW50KCksXG4gICAgICAgICAgICByb3dIZWlnaHQ6IEFJX1RBQkxFX0ZJRUxEX0hFQURfSEVJR0hULFxuICAgICAgICAgICAgcm93Q291bnQ6IHRoaXMubGluZWFyUm93cygpLmxlbmd0aCxcbiAgICAgICAgICAgIGNvbHVtbkNvdW50OiBmaWVsZHMubGVuZ3RoLFxuICAgICAgICAgICAgcm93SW5pdFNpemU6IEFJX1RBQkxFX0ZJRUxEX0hFQURfSEVJR0hULFxuICAgICAgICAgICAgY29sdW1uSW5pdFNpemU6IEFJX1RBQkxFX1JPV19IRUFEX1dJRFRILFxuICAgICAgICAgICAgcm93SW5kaWNlc01hcDoge30sXG4gICAgICAgICAgICBjb2x1bW5JbmRpY2VzTWFwOiBnZXRDb2x1bW5JbmRpY2VzTWFwKGZpZWxkcyksXG4gICAgICAgICAgICBmcm96ZW5Db2x1bW5Db3VudDogMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFpVGFibGU6IHRoaXMuYWlUYWJsZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJFbGVtZW50KCksXG4gICAgICAgICAgICBjb29yZGluYXRlOiBjb29yZGluYXRlLFxuICAgICAgICAgICAgY29udGFpbmVyV2lkdGg6IHRoaXMuY29udGFpbmVyUmVjdCgpLndpZHRoLFxuICAgICAgICAgICAgY29udGFpbmVySGVpZ2h0OiB0aGlzLmNvbnRhaW5lclJlY3QoKS5oZWlnaHQsXG4gICAgICAgICAgICByZWZlcmVuY2VzOiB0aGlzLmFpUmVmZXJlbmNlcygpLFxuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMuYWlSZWFkb25seSgpXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb29yZGluYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlckNvbmZpZygpLmNvb3JkaW5hdGU7XG4gICAgfSk7XG5cbiAgICBzY3JvbGxUb3RhbEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuY29vcmRpbmF0ZSgpLnRvdGFsSGVpZ2h0LCB0aGlzLmNvbnRhaW5lclJlY3QoKS5oZWlnaHQgLSB0aGlzLmZpZWxkSGVhZEhlaWdodCk7XG4gICAgfSk7XG5cbiAgICBzY3JvbGxiYXJXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZSgpLnRvdGFsV2lkdGggKyBBSV9UQUJMRV9GSUVMRF9BRERfQlVUVE9OX1dJRFRIO1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lclJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuYmluZEdsb2JhbE1vdXNlZG93bigpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZXNpemVMaXN0ZW5lcigpO1xuICAgICAgICAgICAgdGhpcy5iaW5kV2hlZWwoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNDb250YWluZXJSZWN0KCkgJiYgdGhpcy5ob3Jpem9udGFsQmFyUmVmKCkgJiYgdGhpcy52ZXJ0aWNhbEJhclJlZigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kU2Nyb2xsQmFyU2Nyb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFpUmVhZG9ubHkoKSAmJiB0aGlzLmFpVGFibGUuY29udGV4dD8ucG9pbnRQb3NpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVIb3ZlckNlbGxFZGl0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEtleXdvcmRzTWF0Y2hlZENlbGxzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuaW5pdENvbnRleHQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENvbnRleHQoKSB7XG4gICAgICAgIHRoaXMuYWlUYWJsZS5jb250ZXh0ID0gbmV3IFJlbmRlcmVyQ29udGV4dCh7XG4gICAgICAgICAgICBsaW5lYXJSb3dzOiB0aGlzLmxpbmVhclJvd3MsXG4gICAgICAgICAgICB2aXNpYmxlQ29sdW1uc01hcDogdGhpcy52aXNpYmxlQ29sdW1uc01hcCxcbiAgICAgICAgICAgIHZpc2libGVSb3dzSW5kZXhNYXA6IHRoaXMudmlzaWJsZVJvd3NJbmRleE1hcCxcbiAgICAgICAgICAgIHBvaW50UG9zaXRpb246IHNpZ25hbChERUZBVUxUX1BPSU5UX1BPU0lUSU9OKSxcbiAgICAgICAgICAgIHNjcm9sbFN0YXRlOiBzaWduYWwoREVGQVVMVF9TQ1JPTExfU1RBVEUpLFxuICAgICAgICAgICAgc2Nyb2xsQWN0aW9uOiB0aGlzLnNjcm9sbEFjdGlvblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEtleXdvcmRzTWF0Y2hlZENlbGxzKCkge1xuICAgICAgICBjb25zdCBrZXl3b3JkcyA9IHRoaXMuYWlLZXl3b3JkcygpO1xuICAgICAgICBsZXQgbWF0Y2hlZENlbGxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgaWYgKGtleXdvcmRzKSB7XG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gdGhpcy5haVJlZmVyZW5jZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYWlUYWJsZS5yZWNvcmRzKCkuZm9yRWFjaCgocmVjb3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlLmZpZWxkcygpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NlbGxNYXRjaEtleXdvcmRzKHRoaXMuYWlUYWJsZSwgZmllbGQsIHJlY29yZC5faWQsIGtleXdvcmRzLCByZWZlcmVuY2VzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZENlbGxzLmFkZChgJHtyZWNvcmQuX2lkfToke2ZpZWxkLl9pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFpVGFibGUua2V5d29yZHNNYXRjaGVkQ2VsbHMuc2V0KG1hdGNoZWRDZWxscyk7XG4gICAgfVxuXG4gICAgc3RhZ2VNb3VzZW1vdmUoZTogS29FdmVudE9iamVjdDxNb3VzZUV2ZW50Pikge1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy50aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lciA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXROYW1lID0gZS5ldmVudC50YXJnZXQubmFtZSgpO1xuICAgICAgICAgICAgY29uc3QgZ3JpZFN0YWdlID0gZS5ldmVudC5jdXJyZW50VGFyZ2V0LmdldFN0YWdlKCk7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBncmlkU3RhZ2U/LmdldFBvaW50ZXJQb3NpdGlvbigpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB7IGNvbnRleHQgfSA9IHRoaXMuYWlUYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcG9zO1xuICAgICAgICAgICAgY29uc3QgY3VyTW91c2VQb3NpdGlvbiA9IGdldE1vdXNlUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRpbmF0ZSgpLFxuICAgICAgICAgICAgICAgIEFJVGFibGUuZ2V0VmlzaWJsZUZpZWxkcyh0aGlzLmFpVGFibGUpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQhLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBoYW5kbGVNb3VzZVN0eWxlKGN1ck1vdXNlUG9zaXRpb24ucmVhbFRhcmdldE5hbWUsIGN1ck1vdXNlUG9zaXRpb24uYXJlYVR5cGUsIHRoaXMuY29udGFpbmVyRWxlbWVudCgpKTtcbiAgICAgICAgICAgIGNvbnRleHQhLnNldFBvaW50UG9zaXRpb24oY3VyTW91c2VQb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnU2VsZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBmaWVsZElkLCByZWNvcmRJZCB9ID0gZ2V0RGV0YWlsQnlUYXJnZXROYW1lKGN1ck1vdXNlUG9zaXRpb24ucmVhbFRhcmdldE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZElkICYmIHJlY29yZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q2VsbCA9IHRoaXMuZHJhZ1NlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRDZWxsOiBBSVJlY29yZEZpZWxkSWRQYXRoID0gW3JlY29yZElkLCBmaWVsZElkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q2VsbCAmJiAhIXN0YXJ0Q2VsbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENlbGxzKHN0YXJ0Q2VsbCwgZW5kQ2VsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YWdlTW91c2Vkb3duKGU6IEtvRXZlbnRPYmplY3Q8TW91c2VFdmVudD4pIHtcbiAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IGUuZXZlbnQuZXZ0O1xuICAgICAgICBjb25zdCBfdGFyZ2V0TmFtZSA9IGUuZXZlbnQudGFyZ2V0Lm5hbWUoKTtcblxuICAgICAgICBjb25zdCB7IHRhcmdldE5hbWUsIGZpZWxkSWQsIHJlY29yZElkIH0gPSBnZXREZXRhaWxCeVRhcmdldE5hbWUoX3RhcmdldE5hbWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtb3VzZUV2ZW50LmJ1dHRvbiA9PT0gQUlUYWJsZU1vdXNlRG93blR5cGUuUmlnaHQgJiZcbiAgICAgICAgICAgIHJlY29yZElkICYmXG4gICAgICAgICAgICBmaWVsZElkICYmXG4gICAgICAgICAgICAodGhpcy5haVRhYmxlLnNlbGVjdGlvbigpLnNlbGVjdGVkUmVjb3Jkcy5oYXMocmVjb3JkSWQpIHx8IHRoaXMuYWlUYWJsZS5zZWxlY3Rpb24oKS5zZWxlY3RlZENlbGxzLmhhcyhgJHtyZWNvcmRJZH06JHtmaWVsZElkfWApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGFyZ2V0TmFtZSkge1xuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9GSUVMRF9IRUFEOlxuICAgICAgICAgICAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkSWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZS5zZWxlY3RGaWVsZChmaWVsZElkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX0NFTEw6XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRJZCB8fCAhZmllbGRJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2UuY2xvc2VDZWxsRWRpdG9yKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ1NlbGVjdGlvblN0YXJ0OiBBSVJlY29yZEZpZWxkSWRQYXRoID0gW3JlY29yZElkLCBmaWVsZElkXTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURyYWdTZWxlY3Rpb25TdGF0ZSh0cnVlLCBkcmFnU2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENlbGxzKGRyYWdTZWxlY3Rpb25TdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9ST1dfQUREX0JVVFRPTjpcbiAgICAgICAgICAgIGNhc2UgQUlfVEFCTEVfRklFTERfQUREX0JVVFRPTjpcbiAgICAgICAgICAgIGNhc2UgQUlfVEFCTEVfUk9XX1NFTEVDVF9DSEVDS0JPWDpcbiAgICAgICAgICAgIGNhc2UgQUlfVEFCTEVfRklFTERfSEVBRF9TRUxFQ1RfQ0hFQ0tCT1g6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZS5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhZ2VNb3VzZXVwKGU6IEtvRXZlbnRPYmplY3Q8TW91c2VFdmVudD4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEcmFnU2VsZWN0aW9uU3RhdGUoZmFsc2UsIG51bGwpO1xuICAgIH1cblxuICAgIHN0YWdlQ29udGV4dG1lbnUoZTogS29FdmVudE9iamVjdDxNb3VzZUV2ZW50Pikge1xuICAgICAgICBjb25zdCBtb3VzZUV2ZW50ID0gZS5ldmVudC5ldnQ7XG4gICAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy5haVJlYWRvbmx5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldE5hbWUgPSBlLmV2ZW50LnRhcmdldC5uYW1lKCk7XG4gICAgICAgIGNvbnN0IHsgZmllbGRJZCwgcmVjb3JkSWQgfSA9IGdldERldGFpbEJ5VGFyZ2V0TmFtZSh0YXJnZXROYW1lKTtcbiAgICAgICAgaWYgKCFyZWNvcmRJZCB8fCAhZmllbGRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICAgICAgICB4OiBtb3VzZUV2ZW50LngsXG4gICAgICAgICAgICB5OiBtb3VzZUV2ZW50LnlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1zID0gdGhpcy5haUNvbnRleHRNZW51SXRlbXMoKTtcbiAgICAgICAgaWYgKCFtZW51SXRlbXMubGVuZ3RoIHx8IG1lbnVJdGVtcy5ldmVyeSgoaXRlbSkgPT4gISEoaXRlbS5oaWRkZW4gJiYgaXRlbS5oaWRkZW4odGhpcy5haVRhYmxlLCB0YXJnZXROYW1lLCBwb3NpdGlvbikpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5haVRhYmxlR3JpZEV2ZW50U2VydmljZS5vcGVuQ29udGV4dE1lbnUodGhpcy5haVRhYmxlLCB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLFxuICAgICAgICAgICAgbWVudUl0ZW1zLFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZjogdGhpcy52aWV3Q29udGFpbmVyUmVmXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YWdlQ2xpY2soZTogS29FdmVudE9iamVjdDxNb3VzZUV2ZW50Pikge1xuICAgICAgICBjb25zdCBtb3VzZUV2ZW50ID0gZS5ldmVudC5ldnQ7XG4gICAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgeyBjb250ZXh0IH0gPSB0aGlzLmFpVGFibGU7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0TmFtZSwgcm93SW5kZXg6IHBvaW50Um93SW5kZXggfSA9IGNvbnRleHQhLnBvaW50UG9zaXRpb24oKTtcbiAgICAgICAgaWYgKG1vdXNlRXZlbnQuYnV0dG9uICE9PSBBSVRhYmxlTW91c2VEb3duVHlwZS5MZWZ0IHx8ICh0YXJnZXROYW1lICE9PSBBSV9UQUJMRV9GSUVMRF9IRUFEX01PUkUgJiYgdGhpcy5haVJlYWRvbmx5KCkpKSByZXR1cm47XG4gICAgICAgIHN3aXRjaCAodGFyZ2V0TmFtZSkge1xuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9ST1dfQUREX0JVVFRPTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRSZWNvcmQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX1JPV19TRUxFQ1RfQ0hFQ0tCT1g6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludFJlY29yZElkID0gY29udGV4dCEubGluZWFyUm93cygpW3BvaW50Um93SW5kZXhdPy5faWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSZWNvcmQocG9pbnRSZWNvcmRJZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9GSUVMRF9IRUFEX1NFTEVDVF9DSEVDS0JPWDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHRoaXMuYWlUYWJsZS5zZWxlY3Rpb24oKS5zZWxlY3RlZFJlY29yZHMuc2l6ZSA9PT0gdGhpcy5haVRhYmxlLnJlY29yZHMoKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVTZWxlY3RBbGwoIWlzQ2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBBSV9UQUJMRV9GSUVMRF9BRERfQlVUVE9OOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEdyb3VwUmVjdCA9IGUuZXZlbnQudGFyZ2V0LmdldFBhcmVudCgpPy5nZXRDbGllbnRSZWN0KCkhO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpZWxkKHRoaXMuY29udGFpbmVyRWxlbWVudCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGZpZWxkR3JvdXBSZWN0LnggKyBjb250YWluZXJSZWN0LngsXG4gICAgICAgICAgICAgICAgICAgIHk6IGNvbnRhaW5lclJlY3QueSArIGZpZWxkR3JvdXBSZWN0LnkgKyBmaWVsZEdyb3VwUmVjdC5oZWlnaHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEFJX1RBQkxFX0ZJRUxEX0hFQURfTU9SRTpcbiAgICAgICAgICAgICAgICBtb3VzZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX3RhcmdldE5hbWUgPSBlLmV2ZW50LnRhcmdldC5uYW1lKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBmaWVsZElkIH0gPSBnZXREZXRhaWxCeVRhcmdldE5hbWUoX3RhcmdldE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vcmVSZWN0ID0gZS5ldmVudC50YXJnZXQuZ2V0Q2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEdyb3VwUmVjdCA9IGUuZXZlbnQudGFyZ2V0LmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKT8uZ2V0Q2xpZW50UmVjdCgpITtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogY29udGFpbmVyUmVjdC54ICsgbW9yZVJlY3QueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGNvbnRhaW5lclJlY3QueSArIG1vcmVSZWN0LnkgKyBtb3JlUmVjdC5oZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdEZpZWxkUG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBjb250YWluZXJSZWN0LnggKyBmaWVsZEdyb3VwUmVjdC54IC0gQUlfVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogY29udGFpbmVyUmVjdC55ICsgZmllbGRHcm91cFJlY3QueSArIGZpZWxkR3JvdXBSZWN0LmhlaWdodFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRPcmlnaW4gPSB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKCcua29udmFqcy1jb250ZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRGaWVsZFNlcnZpY2Uub3BlbkZpZWxkTWVudSh0aGlzLmFpVGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQ6IGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1lbnVzOiB0aGlzLmZpZWxkTWVudXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogdGhpcy5jb250YWluZXJFbGVtZW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRPcmlnaW46IGVkaXRPcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0RmllbGRQb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhZ2VEYmxjbGljayhlOiBLb0V2ZW50T2JqZWN0PE1vdXNlRXZlbnQ+KSB7XG4gICAgICAgIGlmICh0aGlzLmFpUmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF90YXJnZXROYW1lID0gZS5ldmVudC50YXJnZXQubmFtZSgpO1xuICAgICAgICBjb25zdCB7IGZpZWxkSWQsIHJlY29yZElkIH0gPSBnZXREZXRhaWxCeVRhcmdldE5hbWUoX3RhcmdldE5hbWUpO1xuICAgICAgICBpZiAoIXJlY29yZElkIHx8ICFmaWVsZElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmFpVGFibGUuZmllbGRzTWFwKClbZmllbGRJZF07XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgIGlmICghREJMX0NMSUNLX0VESVRfVFlQRS5pbmNsdWRlcyhmaWVsZFR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFpVGFibGVHcmlkRXZlbnRTZXJ2aWNlLm9wZW5DZWxsRWRpdG9yKHRoaXMuYWlUYWJsZSwge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJFbGVtZW50KCksXG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZTogdGhpcy5jb29yZGluYXRlKCksXG4gICAgICAgICAgICAgICAgZmllbGRJZDogZmllbGRJZCEsXG4gICAgICAgICAgICAgICAgcmVjb3JkSWQ6IHJlY29yZElkISxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiB0aGlzLmFpUmVmZXJlbmNlcygpLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmFsdWU6ICh2YWx1ZTogVXBkYXRlRmllbGRWYWx1ZU9wdGlvbnM8YW55PikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFpVXBkYXRlRmllbGRWYWx1ZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kV2hlZWwoKSB7XG4gICAgICAgIGZyb21FdmVudDxXaGVlbEV2ZW50Pih0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSwgJ3doZWVsJywgeyBwYXNzaXZlOiBmYWxzZSB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChlOiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2UuY2xvc2VDZWxsRWRpdG9yKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBY3Rpb24oeyBkZWx0YVg6IGUuZGVsdGFYLCBkZWx0YVk6IGUuZGVsdGFZLCBzaGlmdEtleTogZS5zaGlmdEtleSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNjcm9sbEFjdGlvbiA9IChvcHRpb25zOiBTY3JvbGxBY3Rpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVyID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIHNoaWZ0S2V5IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgZml4ZWREZWx0YVkgPSBzaGlmdEtleSAmJiBpc1dpbmRvd3MgPyAwIDogZGVsdGFZO1xuICAgICAgICAgICAgY29uc3QgZml4ZWREZWx0YVggPSBzaGlmdEtleSAmJiBpc1dpbmRvd3MgPyBkZWx0YVkgOiBkZWx0YVg7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsQmFyID0gdGhpcy5ob3Jpem9udGFsQmFyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEJhciA9IHRoaXMudmVydGljYWxCYXJSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChob3Jpem9udGFsQmFyKSB7XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbEJhci5zY3JvbGxMZWZ0ID0gaG9yaXpvbnRhbEJhci5zY3JvbGxMZWZ0ICsgZml4ZWREZWx0YVg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmVydGljYWxCYXIpIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEJhci5zY3JvbGxUb3AgPSB2ZXJ0aWNhbEJhci5zY3JvbGxUb3AgKyBmaXhlZERlbHRhWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2sgJiYgb3B0aW9ucy5jYWxsYmFjaygpO1xuICAgICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGJpbmRTY3JvbGxCYXJTY3JvbGwoKSB7XG4gICAgICAgIGZyb21FdmVudDxXaGVlbEV2ZW50Pih0aGlzLmhvcml6b250YWxCYXJSZWYoKSEubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3Jpem9udGFsU2Nyb2xsKGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KHRoaXMudmVydGljYWxCYXJSZWYoKSEubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbChlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZEdsb2JhbE1vdXNlZG93bigpIHtcbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vkb3duJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5jb250YWluZXJFbGVtZW50KCkuY29udGFpbnMoZS50YXJnZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhZS50YXJnZXQuY2xvc2VzdChBSV9UQUJMRV9QUkVWRU5UX0NMRUFSX1NFTEVDVElPTl9DTEFTUylcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURyYWdTZWxlY3Rpb25TdGF0ZShmYWxzZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRHJhZ1NlbGVjdGlvblN0YXRlKGlzRHJhZ1NlbGVjdGluZzogYm9vbGVhbiwgZHJhZ1NlbGVjdGlvblN0YXJ0OiBBSVJlY29yZEZpZWxkSWRQYXRoIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmlzRHJhZ1NlbGVjdGluZyA9IGlzRHJhZ1NlbGVjdGluZztcbiAgICAgICAgdGhpcy5kcmFnU2VsZWN0aW9uU3RhcnQgPSBkcmFnU2VsZWN0aW9uU3RhcnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFNjcm9sbGluZyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5haVRhYmxlLmNvbnRleHQhLnNldFNjcm9sbFN0YXRlKHtcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBob3Jpem9udGFsU2Nyb2xsID0gKGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IHNjcm9sbExlZnQgfSA9IGUudGFyZ2V0O1xuICAgICAgICB0aGlzLmFpVGFibGUuY29udGV4dCEuc2V0U2Nyb2xsU3RhdGUoe1xuICAgICAgICAgICAgc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsaW5nKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdmVydGljYWxTY3JvbGwoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wIH0gPSBlLnRhcmdldDtcbiAgICAgICAgdGhpcy5haVRhYmxlLmNvbnRleHQhLnNldFNjcm9sbFN0YXRlKHtcbiAgICAgICAgICAgIHNjcm9sbFRvcCxcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsaW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDb250YWluZXJSZWN0KCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3Quc2V0KHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKS5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5jb250YWluZXJFbGVtZW50KCkub2Zmc2V0SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udGFpbmVyUmVzaXplTGlzdGVuZXIoKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsV2lkdGggPSB0aGlzLmNvb3JkaW5hdGUoKS50b3RhbFdpZHRoICsgQUlfVEFCTEVfRklFTERfQUREX0JVVFRPTl9XSURUSDtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGFpbmVyUmVjdCgpO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lcldpZHRoID49IHRvdGFsV2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFpVGFibGUuY29udGV4dCEuc2V0U2Nyb2xsU3RhdGUoeyBzY3JvbGxMZWZ0OiAwIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVIb3ZlckNlbGxFZGl0b3IoKSB7XG4gICAgICAgIGNvbnN0IHsgcmVhbFRhcmdldE5hbWUgfSA9IHRoaXMuYWlUYWJsZS5jb250ZXh0Py5wb2ludFBvc2l0aW9uKCkhO1xuICAgICAgICBjb25zdCB7IHRhcmdldE5hbWUsIGZpZWxkSWQsIHJlY29yZElkIH0gPSBnZXREZXRhaWxCeVRhcmdldE5hbWUocmVhbFRhcmdldE5hbWUhKTtcbiAgICAgICAgY29uc3QgZWRpdGluZ0NlbGwgPSB0aGlzLmFpVGFibGVHcmlkRXZlbnRTZXJ2aWNlLmdldEN1cnJlbnRFZGl0Q2VsbCgpO1xuXG4gICAgICAgIGlmICh0YXJnZXROYW1lID09PSBBSV9UQUJMRV9DRUxMICYmIHJlY29yZElkICYmIGZpZWxkSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5haVRhYmxlLmZpZWxkc01hcCgpW2ZpZWxkSWRdO1xuXG4gICAgICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBmaWVsZC50eXBlO1xuICAgICAgICAgICAgY29uc3QgZWRpdGluZ0ZpZWxkVHlwZSA9IGVkaXRpbmdDZWxsID8gdGhpcy5haVRhYmxlLmZpZWxkc01hcCgpW2VkaXRpbmdDZWxsLmZpZWxkSWRdLnR5cGUgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgaXNFZGl0aW5nRmllbGRUeXBlSG92ZXJlZCA9IGVkaXRpbmdGaWVsZFR5cGUgPyBNT1VTRU9WRVJfRURJVF9UWVBFLmluY2x1ZGVzKGVkaXRpbmdGaWVsZFR5cGUpIDogZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpc0ZpZWxkVHlwZUhvdmVyZWQgPSBNT1VTRU9WRVJfRURJVF9UWVBFLmluY2x1ZGVzKGZpZWxkVHlwZSk7XG5cbiAgICAgICAgICAgIGlmIChlZGl0aW5nQ2VsbCAmJiBpc0VkaXRpbmdGaWVsZFR5cGVIb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZEV2ZW50U2VydmljZS5jbG9zZUNlbGxFZGl0b3IoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFlZGl0aW5nQ2VsbCAmJiAhaXNGaWVsZFR5cGVIb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5haVRhYmxlR3JpZEV2ZW50U2VydmljZS5jbG9zZUNlbGxFZGl0b3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlZGl0aW5nQ2VsbCAmJiAoKCFpc0VkaXRpbmdGaWVsZFR5cGVIb3ZlcmVkICYmIGlzRmllbGRUeXBlSG92ZXJlZCkgfHwgIWlzRmllbGRUeXBlSG92ZXJlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2Uub3BlbkNlbGxFZGl0b3IodGhpcy5haVRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXJFbGVtZW50KCksXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGU6IHRoaXMuY29vcmRpbmF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZElkOiBmaWVsZElkISxcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkSWQ6IHJlY29yZElkISxcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlczogdGhpcy5haVJlZmVyZW5jZXMoKSxcbiAgICAgICAgICAgICAgICAgICAgaXNIb3ZlckVkaXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmFsdWU6ICh2YWx1ZTogVXBkYXRlRmllbGRWYWx1ZU9wdGlvbnM8YW55PikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5haVVwZGF0ZUZpZWxkVmFsdWUuZW1pdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6byg5qCH5L2N5LqO6Z2e5Y2V5YWD5qC85Yy65Z+f5pe277yM5aaC5p6c5b2T5YmN5pyJIG1vdXNlb3ZlciDnvJbovpHlhYPntKDvvIzliJnnu5PmnZ/nvJbovpFcbiAgICAgICAgICAgIGlmIChlZGl0aW5nQ2VsbCAmJiBNT1VTRU9WRVJfRURJVF9UWVBFLmluY2x1ZGVzKHRoaXMuYWlUYWJsZS5maWVsZHNNYXAoKVtlZGl0aW5nQ2VsbC5maWVsZElkXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWlUYWJsZUdyaWRFdmVudFNlcnZpY2UuY2xvc2VDZWxsRWRpdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2ICNjb250YWluZXIgY2xhc3M9XCJhaS10YWJsZS1ncmlkLXZpZXdcIj5cbiAgICBAaWYgKGhhc0NvbnRhaW5lclJlY3QoKSkge1xuICAgICAgICA8YWktdGFibGUtcmVuZGVyZXJcbiAgICAgICAgICAgIFtjb25maWddPVwicmVuZGVyZXJDb25maWcoKVwiXG4gICAgICAgICAgICAoa29Nb3VzZW1vdmUpPVwic3RhZ2VNb3VzZW1vdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa29Nb3VzZWRvd24pPVwic3RhZ2VNb3VzZWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa29Nb3VzZXVwKT1cInN0YWdlTW91c2V1cCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrb0NvbnRleHRtZW51KT1cInN0YWdlQ29udGV4dG1lbnUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa29DbGljayk9XCJzdGFnZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgKGtvRGJsY2xpY2spPVwic3RhZ2VEYmxjbGljaygkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiAjaG9yaXpvbnRhbEJhciBjbGFzcz1cImFpLXRhYmxlLWhvcml6b250YWwtc2Nyb2xsLWJhci13cmFwcGVyXCIgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lclJlY3QoKS53aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS10YWJsZS1zY3JvbGwtYmFyLWlubmVyXCIgW3N0eWxlLndpZHRoLnB4XT1cInNjcm9sbGJhcldpZHRoKClcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICN2ZXJ0aWNhbEJhclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWktdGFibGUtdmVydGljYWwtc2Nyb2xsLWJhci13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbnRhaW5lclJlY3QoKS5oZWlnaHQgLSBmaWVsZEhlYWRIZWlnaHRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiZmllbGRIZWFkSGVpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktdGFibGUtc2Nyb2xsLWJhci1pbm5lclwiIFtzdHlsZS5oZWlnaHQucHhdPVwic2Nyb2xsVG90YWxIZWlnaHQoKVwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYWktdGFibGUtcmVuZGVyZXI+XG4gICAgfVxuPC9kaXY+XG4iXX0=
@@ -131,17 +131,17 @@ const getCellBackground = (cell, isHover, targetName, aiTable) => {
131
131
  const colors = AITable.getColors();
132
132
  const [recordId, fieldId] = cell;
133
133
  let background = colors.white;
134
+ const _isHoverRecord = isHoverRecord(isHover, targetName);
134
135
  const _isSelectedRecord = isSelectedRecord(recordId, aiTable);
135
136
  const _isSelectedField = isSelectedField(fieldId, aiTable);
136
- const _isSiblingActiveCell = isSiblingActiveCell(cell, aiTable);
137
+ const _isSiblingCell = isSiblingCell(cell, aiTable);
137
138
  const _isActiveCell = isActiveCell(cell, aiTable);
138
139
  const _isSelectedCell = isSelectedCell(cell, aiTable);
139
- const _isMatchedCell = isMatchedCell(cell, aiTable);
140
- const _isHoverRecord = isHoverRecord(isHover, targetName);
141
- if (_isMatchedCell) {
140
+ const _isKeywordsMatchedCell = isKeywordsMatchedCell(cell, aiTable);
141
+ if (_isKeywordsMatchedCell) {
142
142
  background = colors.itemMatchBgColor;
143
143
  }
144
- else if (_isSelectedRecord || _isSelectedField || _isSiblingActiveCell || (_isSelectedCell && !_isActiveCell)) {
144
+ else if (_isSelectedRecord || _isSelectedField || _isSiblingCell || (_isSelectedCell && !_isActiveCell)) {
145
145
  background = colors.itemActiveBgColor;
146
146
  }
147
147
  else if (_isHoverRecord && !_isActiveCell) {
@@ -150,56 +150,30 @@ const getCellBackground = (cell, isHover, targetName, aiTable) => {
150
150
  return background;
151
151
  };
152
152
  const isActiveCell = (cell, aiTable) => {
153
- let isActive = false;
154
- const activeCell = AITable.getActiveCell(aiTable);
155
- if (Array.isArray(activeCell) && !!activeCell.length) {
156
- const [activeCellRecordId, activeCellFieldId] = activeCell;
157
- const [recordId, fieldId] = cell;
158
- if (recordId === activeCellRecordId && fieldId === activeCellFieldId) {
159
- isActive = true;
160
- }
161
- }
162
- return isActive;
153
+ const [recordId, fieldId] = cell;
154
+ const [activeRecordId, activeFieldId] = AITable.getActiveCell(aiTable) || [];
155
+ return recordId === activeRecordId && fieldId === activeFieldId;
163
156
  };
164
- const isSiblingActiveCell = (cell, aiTable) => {
165
- let isSiblingCell = false;
166
- const activeCell = AITable.getActiveCell(aiTable);
167
- if (Array.isArray(activeCell) && !!activeCell.length) {
168
- const [recordId, fieldId] = cell;
169
- const [activeCellRecordId, activeCellFieldId] = activeCell;
170
- const selectedCells = aiTable.selection().selectedCells;
171
- isSiblingCell =
172
- selectedCells.size === 1 &&
173
- selectedCells.has(`${activeCellRecordId}:${activeCellFieldId}`) &&
174
- recordId === activeCellRecordId &&
175
- fieldId !== activeCellFieldId;
176
- }
177
- return isSiblingCell;
157
+ const isSiblingCell = (cell, aiTable) => {
158
+ const [recordId, fieldId] = cell;
159
+ const [activeRecordId, activeFieldId] = AITable.getActiveCell(aiTable) || [];
160
+ return AITable.getActiveRecordIds(aiTable).length === 1 && recordId === activeRecordId && fieldId !== activeFieldId;
178
161
  };
179
- const isMatchedCell = (cell, aiTable) => {
162
+ const isKeywordsMatchedCell = (cell, aiTable) => {
180
163
  const [recordId, fieldId] = cell;
181
- let matchedCellsMap = {};
182
- aiTable.matchedCells().forEach((key) => {
183
- matchedCellsMap[key] = true;
184
- });
185
- const isMatchedCell = matchedCellsMap[`${recordId}:${fieldId}`];
186
- return isMatchedCell;
164
+ return aiTable.keywordsMatchedCells().has(`${recordId}:${fieldId}`);
187
165
  };
188
166
  const isSelectedCell = (cell, aiTable) => {
189
167
  const [recordId, fieldId] = cell;
190
- const selectedCells = aiTable.selection().selectedCells;
191
- const isSelectedCell = selectedCells.has(`${recordId}:${fieldId}`);
192
- return isSelectedCell;
168
+ return aiTable.selection().selectedCells.has(`${recordId}:${fieldId}`);
193
169
  };
194
170
  const isSelectedField = (fieldId, aiTable) => {
195
- const selectedFields = aiTable.selection().selectedFields;
196
- return selectedFields.has(fieldId);
171
+ return aiTable.selection().selectedFields.has(fieldId);
197
172
  };
198
173
  const isSelectedRecord = (recordId, aiTable) => {
199
- const selectedRecords = aiTable.selection().selectedRecords;
200
- return selectedRecords.has(recordId);
174
+ return aiTable.selection().selectedRecords.has(recordId);
201
175
  };
202
176
  const isHoverRecord = (isHover, targetName) => {
203
177
  return isHover && targetName !== AI_TABLE_FIELD_HEAD;
204
178
  };
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWNlbGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JpZC9zcmMvcmVuZGVyZXIvY3JlYXRpb25zL2NyZWF0ZS1jZWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBeUIsT0FBTyxFQUFFLGNBQWMsRUFBbUIsTUFBTSxZQUFZLENBQUM7QUFDN0YsT0FBTyxFQUEyQyxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXRFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFnQyxFQUFFLEVBQUU7SUFDNUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUN4SCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBMEIsQ0FBQztJQUNuRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25DLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6RCx3QkFBd0I7SUFDeEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUErQixDQUFDLENBQUM7SUFDcEQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUErQixDQUFDLENBQUM7SUFDdEQsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUErQixDQUFDLENBQUM7SUFFekQsb0JBQW9CO0lBQ3BCLEtBQUssSUFBSSxXQUFXLEdBQUcsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLGVBQWUsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3JGLElBQUksV0FBVyxHQUFHLFdBQVcsR0FBRyxDQUFDO1lBQUUsTUFBTTtRQUV6QyxzQ0FBc0M7UUFDdEMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLElBQUksS0FBSyxJQUFJLElBQUk7WUFBRSxTQUFTO1FBRTVCLFlBQVk7UUFDWixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLFdBQVcsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFL0QsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCx5REFBeUQ7UUFDekQsS0FBSyxJQUFJLFFBQVEsR0FBRyxhQUFhLEVBQUUsUUFBUSxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3RFLElBQUksUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDO2dCQUFFLE1BQU07WUFDbkMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUM5RCxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEUsTUFBTSxPQUFPLEdBQUcsYUFBYSxLQUFLLFFBQVEsQ0FBQztZQUUzQyxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUNYLEtBQUssY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxVQUFVLEtBQUssdUJBQXVCLENBQUM7b0JBQ3JFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEUsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDZCxDQUFDO3dCQUNELENBQUM7d0JBQ0QsUUFBUTt3QkFDUixXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsU0FBUyxFQUFFLDBCQUEwQjt3QkFDckMsV0FBVzt3QkFDWCxjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQWM7cUJBQzVDLENBQUMsQ0FBQztvQkFDSCxZQUFZLENBQUMsTUFBTSxDQUFDO3dCQUNoQixVQUFVO3dCQUNWLFlBQVk7cUJBQ2YsQ0FBQyxDQUFDO29CQUNILE1BQU07Z0JBQ1YsQ0FBQztnQkFDRCxLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUN6QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUMxQixNQUFNLElBQUksR0FBMEIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3hELElBQUksVUFBVSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUV2RSxlQUFlLENBQUMsSUFBSSxDQUFDO3dCQUNqQixDQUFDO3dCQUNELENBQUM7d0JBQ0QsUUFBUTt3QkFDUixXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsU0FBUzt3QkFDVCxXQUFXO3dCQUNYLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYztxQkFDNUMsQ0FBQyxDQUFDO29CQUNILGVBQWUsQ0FBQyxNQUFNLENBQUM7d0JBQ25CLEdBQUc7d0JBQ0gsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTt3QkFDM0IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO3dCQUM5QyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztxQkFDcEQsQ0FBQyxDQUFDO29CQUNILE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcseUJBQXlCLENBQUM7d0JBQ2hELFdBQVc7d0JBQ1gsV0FBVzt3QkFDWCxXQUFXO3FCQUNkLENBQUMsQ0FBQztvQkFDSCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLGVBQWUsQ0FBQztvQkFDM0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztvQkFDbEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztvQkFDakQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDN0UsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDckUsTUFBTSxNQUFNLEdBQUc7d0JBQ1gsT0FBTzt3QkFDUCxDQUFDLEVBQUUsS0FBSzt3QkFDUixDQUFDLEVBQUUsS0FBSzt3QkFDUixXQUFXLEVBQUUsS0FBSzt3QkFDbEIsU0FBUzt3QkFDVCxRQUFRLEVBQUUsUUFBUTt3QkFDbEIsS0FBSzt3QkFDTCxTQUFTO3dCQUNULGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixRQUFRLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7d0JBQzNDLEtBQUs7d0JBQ0wsTUFBTTtxQkFDVCxDQUFDO29CQUVGLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNuQyxvQ0FBb0M7b0JBQ3BDLHdCQUF3QjtvQkFDeEIsSUFBSSxZQUFZLElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNwQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ1gsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDekMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNYLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBdUIsRUFBRSxHQUErQixDQUFDLENBQUM7d0JBQ2hGLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBdUIsRUFBRSxHQUErQixDQUFDLENBQUM7b0JBQ3BGLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUEyQixFQUFFLE9BQWdCLEVBQUUsVUFBa0IsRUFBRSxPQUFnQixFQUFVLEVBQUU7SUFDdEgsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFFOUIsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELE1BQU0sb0JBQW9CLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFMUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNqQixVQUFVLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQ3pDLENBQUM7U0FBTSxJQUFJLGlCQUFpQixJQUFJLGdCQUFnQixJQUFJLG9CQUFvQixJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM5RyxVQUFVLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0lBQzFDLENBQUM7U0FBTSxJQUFJLGNBQWMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLElBQTJCLEVBQUUsT0FBZ0IsRUFBVyxFQUFFO0lBQzVFLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUMzRCxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLFFBQVEsS0FBSyxrQkFBa0IsSUFBSSxPQUFPLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztZQUNuRSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQTJCLEVBQUUsT0FBZ0IsRUFBVyxFQUFFO0lBQ25GLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUMzRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ3hELGFBQWE7WUFDVCxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUM7Z0JBQ3hCLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUMvRCxRQUFRLEtBQUssa0JBQWtCO2dCQUMvQixPQUFPLEtBQUssaUJBQWlCLENBQUM7SUFDdEMsQ0FBQztJQUNELE9BQU8sYUFBYSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBMkIsRUFBRSxPQUFnQixFQUFXLEVBQUU7SUFDN0UsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDakMsSUFBSSxlQUFlLEdBQStCLEVBQUUsQ0FBQztJQUNyRCxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDbkMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxHQUFHLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sYUFBYSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBMkIsRUFBRSxPQUFnQixFQUFXLEVBQUU7SUFDOUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQztJQUN4RCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkUsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQUUsT0FBZ0IsRUFBVyxFQUFFO0lBQ25FLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7SUFDMUQsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE9BQWdCLEVBQVcsRUFBRTtJQUNyRSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDO0lBQzVELE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsVUFBa0IsRUFBVyxFQUFFO0lBQ3BFLE9BQU8sT0FBTyxJQUFJLFVBQVUsS0FBSyxtQkFBbUIsQ0FBQztBQUN6RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFJX1RBQkxFX0ZJRUxEX0hFQUQsXG4gICAgQUlfVEFCTEVfRklFTERfSEVBRF9IRUlHSFQsXG4gICAgQUlfVEFCTEVfT0ZGU0VULFxuICAgIEFJX1RBQkxFX1JPV19BRERfQlVUVE9OLFxuICAgIERFRkFVTFRfRk9OVF9TVFlMRVxufSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUlSZWNvcmRGaWVsZFBvc2l0aW9uLCBBSVRhYmxlLCBBSVRhYmxlUXVlcmllcywgUmVuZGVyZXJDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBSVRhYmxlQ2VsbHNEcmF3ZXJDb25maWcsIEFJVGFibGVSZW5kZXIsIEFJVGFibGVSb3dUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0Q2VsbEhvcml6b250YWxQb3NpdGlvbiwgdHJhbnNmb3JtQ2VsbFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgYWRkUm93TGF5b3V0IH0gZnJvbSAnLi4vZHJhd2Vycy9hZGQtcm93LWxheW91dC1kcmF3ZXInO1xuaW1wb3J0IHsgY2VsbERyYXdlciB9IGZyb20gJy4uL2RyYXdlcnMvY2VsbC1kcmF3ZXInO1xuaW1wb3J0IHsgcmVjb3JkUm93TGF5b3V0IH0gZnJvbSAnLi4vZHJhd2Vycy9yZWNvcmQtcm93LWxheW91dC1kcmF3ZXInO1xuXG4vKipcbiAqIOe7mOWItuWNleWFg+agvOWGheWuueeahOWHveaVsFxuICog5Yip55SoIENhbnZhcyBBUEkg57uY5Yi25q+P5Liq5Y2V5YWD5qC855qE6IOM5pmv6aKc6Imy44CB5paH5pys5Lul5Y+K5YW25LuW5Y+v6IO955qE5qC35byP44CC6L+Z5Liq5Ye95pWw6YCa5bi455So5LqO6Ieq5a6a5LmJ6KGo5qC85riy5p+T77yM5bCk5YW25piv5Zyo5aSE55CG5aSn6YeP5pWw5o2u5pe277yM6YCa6L+H55u05o6l5pON5L2cIENhbnZhcyDmnaXmj5Dpq5jmuLLmn5PmgKfog71cbiAqIEBwYXJhbSBjb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUNlbGxzID0gKGNvbmZpZzogQUlUYWJsZUNlbGxzRHJhd2VyQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgeyBhaVRhYmxlLCBjb29yZGluYXRlLCByZWZlcmVuY2VzLCBjdHgsIHJvd1N0YXJ0SW5kZXgsIHJvd1N0b3BJbmRleCwgY29sdW1uU3RhcnRJbmRleCwgY29sdW1uU3RvcEluZGV4IH0gPSBjb25maWc7XG4gICAgY29uc3QgY29udGV4dCA9IGFpVGFibGUuY29udGV4dCBhcyBSZW5kZXJlckNvbnRleHQ7XG4gICAgY29uc3QgeyByb3dIZWlnaHQsIGNvbHVtbkNvdW50LCByb3dDb3VudCB9ID0gY29vcmRpbmF0ZTtcbiAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gQUlUYWJsZS5nZXRWaXNpYmxlRmllbGRzKGFpVGFibGUpO1xuXG4gICAgLy8g5Yid5aeL5YyW57uY5Zu+5LiK5LiL5paHLCDkuLrlkI7nu63nmoTnu5jliLbmk43kvZzlgZrlh4blpIdcbiAgICBjZWxsRHJhd2VyLmluaXRDdHgoY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG4gICAgYWRkUm93TGF5b3V0LmluaXRDdHgoY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG4gICAgcmVjb3JkUm93TGF5b3V0LmluaXRDdHgoY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG5cbiAgICAvLyDpgY3ljobliJcsIOehruWumuWcqOWTquS6m+WIl+S4iue7mOWItuWNleWFg+agvFxuICAgIGZvciAobGV0IGNvbHVtbkluZGV4ID0gY29sdW1uU3RhcnRJbmRleDsgY29sdW1uSW5kZXggPD0gY29sdW1uU3RvcEluZGV4OyBjb2x1bW5JbmRleCsrKSB7XG4gICAgICAgIGlmIChjb2x1bW5JbmRleCA+IGNvbHVtbkNvdW50IC0gMSkgYnJlYWs7XG5cbiAgICAgICAgLy8g6I635Y+W6K+l5YiX5a+55bqU55qEIGZpZWxk77yM5aaC5p6cIGZpZWxkIOS4jeWGjeWxleekuuiMg+WbtO+8jOWImei3s+i/h+ivpeWIl1xuICAgICAgICBjb25zdCBmaWVsZCA9IHZpc2libGVDb2x1bW5zW2NvbHVtbkluZGV4XTtcbiAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIOiOt+WPluivpeWIl+WvueW6lOeahOWuveW6plxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvb3JkaW5hdGUuZ2V0Q29sdW1uV2lkdGgoY29sdW1uSW5kZXgpO1xuICAgICAgICBjb25zdCB4ID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5PZmZzZXQoY29sdW1uSW5kZXgpICsgQUlfVEFCTEVfT0ZGU0VUO1xuICAgICAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBjb2x1bW5JbmRleCA9PT0gYWlUYWJsZS5maWVsZHMubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDEpIHtcbiAgICAgICAgICAgIGNlbGxEcmF3ZXIuaW5pdFN0eWxlKGZpZWxkLCB7IGZvbnRXZWlnaHQ6IERFRkFVTFRfRk9OVF9TVFlMRSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOmBjeWOhuihjCwg5LuOIHJvd1N0YXJ0SW5kZXgg5YiwIHJvd1N0b3BJbmRleCDnmoTmiYDmnInooYzvvIzlhrPlrprlsIblnKjlk6rkupvooYzkuIrnu5jliLbljZXlhYPmoLxcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSByb3dTdGFydEluZGV4OyByb3dJbmRleCA8PSByb3dTdG9wSW5kZXg7IHJvd0luZGV4KyspIHtcbiAgICAgICAgICAgIGlmIChyb3dJbmRleCA+IHJvd0NvdW50IC0gMSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBjb250ZXh0LmxpbmVhclJvd3MoKVtyb3dJbmRleF07XG4gICAgICAgICAgICBjb25zdCB7IF9pZDogcmVjb3JkSWQsIHR5cGUgfSA9IHJvdztcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjb29yZGluYXRlLmdldFJvd09mZnNldChyb3dJbmRleCkgKyBBSV9UQUJMRV9PRkZTRVQ7XG4gICAgICAgICAgICBjb25zdCB7IHJvd0luZGV4OiBwb2ludFJvd0luZGV4LCB0YXJnZXROYW1lIH0gPSBjb250ZXh0LnBvaW50UG9zaXRpb24oKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSG92ZXIgPSBwb2ludFJvd0luZGV4ID09PSByb3dJbmRleDtcblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBSVRhYmxlUm93VHlwZS5hZGQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNIb3ZlclJvdyA9IGlzSG92ZXIgJiYgdGFyZ2V0TmFtZSA9PT0gQUlfVEFCTEVfUk9XX0FERF9CVVRUT047XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZFJvdyA9IGFpVGFibGUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRSZWNvcmRzLmhhcyhyb3cuX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUm93TGF5b3V0LmluaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dIZWlnaHQ6IEFJX1RBQkxFX0ZJRUxEX0hFQURfSEVJR0hULFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXaWR0aDogY29vcmRpbmF0ZS5jb250YWluZXJXaWR0aFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUm93TGF5b3V0LnJlbmRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0hvdmVyUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkUm93XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBBSVRhYmxlUm93VHlwZS5yZWNvcmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRJZCA9IGZpZWxkLl9pZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbDogQUlSZWNvcmRGaWVsZFBvc2l0aW9uID0gW3JlY29yZElkLCBmaWVsZElkXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tncm91bmQgPSBnZXRDZWxsQmFja2dyb3VuZChjZWxsLCBpc0hvdmVyLCB0YXJnZXROYW1lLCBhaVRhYmxlKTtcblxuICAgICAgICAgICAgICAgICAgICByZWNvcmRSb3dMYXlvdXQuaW5pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0hlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV2lkdGg6IGNvb3JkaW5hdGUuY29udGFpbmVyV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFJvd0xheW91dC5yZW5kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgZmlsbDogYmFja2dyb3VuZCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3ZlclJvdzogaXNIb3ZlclJlY29yZChpc0hvdmVyLCB0YXJnZXROYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZFJvdzogaXNTZWxlY3RlZFJlY29yZChyZWNvcmRJZCwgYWlUYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIG9mZnNldCB9ID0gZ2V0Q2VsbEhvcml6b250YWxQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ291bnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxYID0geCArIG9mZnNldCArIEFJX1RBQkxFX09GRlNFVDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFkgPSB5ICsgQUlfVEFCTEVfT0ZGU0VUO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IHsgZm9udFdlaWdodDogREVGQVVMVF9GT05UX1NUWUxFIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IEFJVGFibGVRdWVyaWVzLmdldEZpZWxkVmFsdWUoYWlUYWJsZSwgW3JlY29yZElkLCBmaWVsZElkXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybVZhbHVlID0gdHJhbnNmb3JtQ2VsbFZhbHVlKGFpVGFibGUsIGZpZWxkLCBjZWxsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhaVRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogcmVhbFgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiByZWFsWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0hlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZElkOiByZWNvcmRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGlzU2VsZWN0ZWRGaWVsZChmaWVsZElkLCBhaVRhYmxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY2VsbERyYXdlci5pbml0U3R5bGUoZmllbGQsIHN0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8g5pyA5ZCO5LiA5YiX77yM5LiU5Y2V5YWD5qC85YaF5a655a2Y5Zyo77yM6ZyA6KaB6KOB5Ymq5YaF5a6577yM5Lul6Ziy5q2i5paH5pys5rqi5Ye65Y2V5YWD5qC86L6555WMXG4gICAgICAgICAgICAgICAgICAgIC8vIOeEtuWQju+8jOagueaNruiuoeeul+WlveeahOagt+W8j+WSjOW4g+WxgOe7mOWItuWNleWFg+agvOWGheWuuVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNMYXN0Q29sdW1uICYmIGNlbGxWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnJlY3QocmVhbFgsIHJlYWxZLCB3aWR0aCwgcm93SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5jbGlwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsRHJhd2VyLnJlbmRlckNlbGwocmVuZGVyIGFzIEFJVGFibGVSZW5kZXIsIGN0eCBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxEcmF3ZXIucmVuZGVyQ2VsbChyZW5kZXIgYXMgQUlUYWJsZVJlbmRlciwgY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBnZXRDZWxsQmFja2dyb3VuZCA9IChjZWxsOiBBSVJlY29yZEZpZWxkUG9zaXRpb24sIGlzSG92ZXI6IGJvb2xlYW4sIHRhcmdldE5hbWU6IHN0cmluZywgYWlUYWJsZTogQUlUYWJsZSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgY29sb3JzID0gQUlUYWJsZS5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBbcmVjb3JkSWQsIGZpZWxkSWRdID0gY2VsbDtcbiAgICBsZXQgYmFja2dyb3VuZCA9IGNvbG9ycy53aGl0ZTtcblxuICAgIGNvbnN0IF9pc1NlbGVjdGVkUmVjb3JkID0gaXNTZWxlY3RlZFJlY29yZChyZWNvcmRJZCwgYWlUYWJsZSk7XG4gICAgY29uc3QgX2lzU2VsZWN0ZWRGaWVsZCA9IGlzU2VsZWN0ZWRGaWVsZChmaWVsZElkLCBhaVRhYmxlKTtcbiAgICBjb25zdCBfaXNTaWJsaW5nQWN0aXZlQ2VsbCA9IGlzU2libGluZ0FjdGl2ZUNlbGwoY2VsbCwgYWlUYWJsZSk7XG4gICAgY29uc3QgX2lzQWN0aXZlQ2VsbCA9IGlzQWN0aXZlQ2VsbChjZWxsLCBhaVRhYmxlKTtcbiAgICBjb25zdCBfaXNTZWxlY3RlZENlbGwgPSBpc1NlbGVjdGVkQ2VsbChjZWxsLCBhaVRhYmxlKTtcbiAgICBjb25zdCBfaXNNYXRjaGVkQ2VsbCA9IGlzTWF0Y2hlZENlbGwoY2VsbCwgYWlUYWJsZSk7XG4gICAgY29uc3QgX2lzSG92ZXJSZWNvcmQgPSBpc0hvdmVyUmVjb3JkKGlzSG92ZXIsIHRhcmdldE5hbWUpO1xuXG4gICAgaWYgKF9pc01hdGNoZWRDZWxsKSB7XG4gICAgICAgIGJhY2tncm91bmQgPSBjb2xvcnMuaXRlbU1hdGNoQmdDb2xvcjtcbiAgICB9IGVsc2UgaWYgKF9pc1NlbGVjdGVkUmVjb3JkIHx8IF9pc1NlbGVjdGVkRmllbGQgfHwgX2lzU2libGluZ0FjdGl2ZUNlbGwgfHwgKF9pc1NlbGVjdGVkQ2VsbCAmJiAhX2lzQWN0aXZlQ2VsbCkpIHtcbiAgICAgICAgYmFja2dyb3VuZCA9IGNvbG9ycy5pdGVtQWN0aXZlQmdDb2xvcjtcbiAgICB9IGVsc2UgaWYgKF9pc0hvdmVyUmVjb3JkICYmICFfaXNBY3RpdmVDZWxsKSB7XG4gICAgICAgIGJhY2tncm91bmQgPSBjb2xvcnMuZ3JheTgwO1xuICAgIH1cblxuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xufTtcblxuY29uc3QgaXNBY3RpdmVDZWxsID0gKGNlbGw6IEFJUmVjb3JkRmllbGRQb3NpdGlvbiwgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGxldCBpc0FjdGl2ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBBSVRhYmxlLmdldEFjdGl2ZUNlbGwoYWlUYWJsZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0aXZlQ2VsbCkgJiYgISFhY3RpdmVDZWxsLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBbYWN0aXZlQ2VsbFJlY29yZElkLCBhY3RpdmVDZWxsRmllbGRJZF0gPSBhY3RpdmVDZWxsO1xuICAgICAgICBjb25zdCBbcmVjb3JkSWQsIGZpZWxkSWRdID0gY2VsbDtcbiAgICAgICAgaWYgKHJlY29yZElkID09PSBhY3RpdmVDZWxsUmVjb3JkSWQgJiYgZmllbGRJZCA9PT0gYWN0aXZlQ2VsbEZpZWxkSWQpIHtcbiAgICAgICAgICAgIGlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNBY3RpdmU7XG59O1xuXG5jb25zdCBpc1NpYmxpbmdBY3RpdmVDZWxsID0gKGNlbGw6IEFJUmVjb3JkRmllbGRQb3NpdGlvbiwgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGxldCBpc1NpYmxpbmdDZWxsID0gZmFsc2U7XG4gICAgY29uc3QgYWN0aXZlQ2VsbCA9IEFJVGFibGUuZ2V0QWN0aXZlQ2VsbChhaVRhYmxlKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhY3RpdmVDZWxsKSAmJiAhIWFjdGl2ZUNlbGwubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IFtyZWNvcmRJZCwgZmllbGRJZF0gPSBjZWxsO1xuICAgICAgICBjb25zdCBbYWN0aXZlQ2VsbFJlY29yZElkLCBhY3RpdmVDZWxsRmllbGRJZF0gPSBhY3RpdmVDZWxsO1xuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gYWlUYWJsZS5zZWxlY3Rpb24oKS5zZWxlY3RlZENlbGxzO1xuICAgICAgICBpc1NpYmxpbmdDZWxsID1cbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHMuc2l6ZSA9PT0gMSAmJlxuICAgICAgICAgICAgc2VsZWN0ZWRDZWxscy5oYXMoYCR7YWN0aXZlQ2VsbFJlY29yZElkfToke2FjdGl2ZUNlbGxGaWVsZElkfWApICYmXG4gICAgICAgICAgICByZWNvcmRJZCA9PT0gYWN0aXZlQ2VsbFJlY29yZElkICYmXG4gICAgICAgICAgICBmaWVsZElkICE9PSBhY3RpdmVDZWxsRmllbGRJZDtcbiAgICB9XG4gICAgcmV0dXJuIGlzU2libGluZ0NlbGw7XG59O1xuXG5jb25zdCBpc01hdGNoZWRDZWxsID0gKGNlbGw6IEFJUmVjb3JkRmllbGRQb3NpdGlvbiwgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFtyZWNvcmRJZCwgZmllbGRJZF0gPSBjZWxsO1xuICAgIGxldCBtYXRjaGVkQ2VsbHNNYXA6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgYWlUYWJsZS5tYXRjaGVkQ2VsbHMoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgbWF0Y2hlZENlbGxzTWFwW2tleV0gPSB0cnVlO1xuICAgIH0pO1xuICAgIGNvbnN0IGlzTWF0Y2hlZENlbGwgPSBtYXRjaGVkQ2VsbHNNYXBbYCR7cmVjb3JkSWR9OiR7ZmllbGRJZH1gXTtcbiAgICByZXR1cm4gaXNNYXRjaGVkQ2VsbDtcbn07XG5cbmNvbnN0IGlzU2VsZWN0ZWRDZWxsID0gKGNlbGw6IEFJUmVjb3JkRmllbGRQb3NpdGlvbiwgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFtyZWNvcmRJZCwgZmllbGRJZF0gPSBjZWxsO1xuICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSBhaVRhYmxlLnNlbGVjdGlvbigpLnNlbGVjdGVkQ2VsbHM7XG4gICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSBzZWxlY3RlZENlbGxzLmhhcyhgJHtyZWNvcmRJZH06JHtmaWVsZElkfWApO1xuICAgIHJldHVybiBpc1NlbGVjdGVkQ2VsbDtcbn07XG5cbmNvbnN0IGlzU2VsZWN0ZWRGaWVsZCA9IChmaWVsZElkOiBzdHJpbmcsIGFpVGFibGU6IEFJVGFibGUpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEZpZWxkcyA9IGFpVGFibGUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRGaWVsZHM7XG4gICAgcmV0dXJuIHNlbGVjdGVkRmllbGRzLmhhcyhmaWVsZElkKTtcbn07XG5cbmNvbnN0IGlzU2VsZWN0ZWRSZWNvcmQgPSAocmVjb3JkSWQ6IHN0cmluZywgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkcyA9IGFpVGFibGUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRSZWNvcmRzO1xuICAgIHJldHVybiBzZWxlY3RlZFJlY29yZHMuaGFzKHJlY29yZElkKTtcbn07XG5cbmNvbnN0IGlzSG92ZXJSZWNvcmQgPSAoaXNIb3ZlcjogYm9vbGVhbiwgdGFyZ2V0TmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGlzSG92ZXIgJiYgdGFyZ2V0TmFtZSAhPT0gQUlfVEFCTEVfRklFTERfSEVBRDtcbn07XG4iXX0=
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWNlbGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JpZC9zcmMvcmVuZGVyZXIvY3JlYXRpb25zL2NyZWF0ZS1jZWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBdUIsT0FBTyxFQUFFLGNBQWMsRUFBbUIsTUFBTSxZQUFZLENBQUM7QUFDM0YsT0FBTyxFQUEyQyxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXRFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFnQyxFQUFFLEVBQUU7SUFDNUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUN4SCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBMEIsQ0FBQztJQUNuRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25DLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FB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LE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE9BQWdCLEVBQVcsRUFBRTtJQUNyRSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZ0IsRUFBRSxVQUFrQixFQUFXLEVBQUU7SUFDcEUsT0FBTyxPQUFPLElBQUksVUFBVSxLQUFLLG1CQUFtQixDQUFDO0FBQ3pELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQUlfVEFCTEVfRklFTERfSEVBRCxcbiAgICBBSV9UQUJMRV9GSUVMRF9IRUFEX0hFSUdIVCxcbiAgICBBSV9UQUJMRV9PRkZTRVQsXG4gICAgQUlfVEFCTEVfUk9XX0FERF9CVVRUT04sXG4gICAgREVGQVVMVF9GT05UX1NUWUxFXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBSVJlY29yZEZpZWxkSWRQYXRoLCBBSVRhYmxlLCBBSVRhYmxlUXVlcmllcywgUmVuZGVyZXJDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBSVRhYmxlQ2VsbHNEcmF3ZXJDb25maWcsIEFJVGFibGVSZW5kZXIsIEFJVGFibGVSb3dUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0Q2VsbEhvcml6b250YWxQb3NpdGlvbiwgdHJhbnNmb3JtQ2VsbFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgYWRkUm93TGF5b3V0IH0gZnJvbSAnLi4vZHJhd2Vycy9hZGQtcm93LWxheW91dC1kcmF3ZXInO1xuaW1wb3J0IHsgY2VsbERyYXdlciB9IGZyb20gJy4uL2RyYXdlcnMvY2VsbC1kcmF3ZXInO1xuaW1wb3J0IHsgcmVjb3JkUm93TGF5b3V0IH0gZnJvbSAnLi4vZHJhd2Vycy9yZWNvcmQtcm93LWxheW91dC1kcmF3ZXInO1xuXG4vKipcbiAqIOe7mOWItuWNleWFg+agvOWGheWuueeahOWHveaVsFxuICog5Yip55SoIENhbnZhcyBBUEkg57uY5Yi25q+P5Liq5Y2V5YWD5qC855qE6IOM5pmv6aKc6Imy44CB5paH5pys5Lul5Y+K5YW25LuW5Y+v6IO955qE5qC35byP44CC6L+Z5Liq5Ye95pWw6YCa5bi455So5LqO6Ieq5a6a5LmJ6KGo5qC85riy5p+T77yM5bCk5YW25piv5Zyo5aSE55CG5aSn6YeP5pWw5o2u5pe277yM6YCa6L+H55u05o6l5pON5L2cIENhbnZhcyDmnaXmj5Dpq5jmuLLmn5PmgKfog71cbiAqIEBwYXJhbSBjb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUNlbGxzID0gKGNvbmZpZzogQUlUYWJsZUNlbGxzRHJhd2VyQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgeyBhaVRhYmxlLCBjb29yZGluYXRlLCByZWZlcmVuY2VzLCBjdHgsIHJvd1N0YXJ0SW5kZXgsIHJvd1N0b3BJbmRleCwgY29sdW1uU3RhcnRJbmRleCwgY29sdW1uU3RvcEluZGV4IH0gPSBjb25maWc7XG4gICAgY29uc3QgY29udGV4dCA9IGFpVGFibGUuY29udGV4dCBhcyBSZW5kZXJlckNvbnRleHQ7XG4gICAgY29uc3QgeyByb3dIZWlnaHQsIGNvbHVtbkNvdW50LCByb3dDb3VudCB9ID0gY29vcmRpbmF0ZTtcbiAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gQUlUYWJsZS5nZXRWaXNpYmxlRmllbGRzKGFpVGFibGUpO1xuXG4gICAgLy8g5Yid5aeL5YyW57uY5Zu+5LiK5LiL5paHLCDkuLrlkI7nu63nmoTnu5jliLbmk43kvZzlgZrlh4blpIdcbiAgICBjZWxsRHJhd2VyLmluaXRDdHgoY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG4gICAgYWRkUm93TGF5b3V0LmluaXRDdHgoY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG4gICAgcmVjb3JkUm93TGF5b3V0LmluaXRDdHgoY3R4IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk7XG5cbiAgICAvLyDpgY3ljobliJcsIOehruWumuWcqOWTquS6m+WIl+S4iue7mOWItuWNleWFg+agvFxuICAgIGZvciAobGV0IGNvbHVtbkluZGV4ID0gY29sdW1uU3RhcnRJbmRleDsgY29sdW1uSW5kZXggPD0gY29sdW1uU3RvcEluZGV4OyBjb2x1bW5JbmRleCsrKSB7XG4gICAgICAgIGlmIChjb2x1bW5JbmRleCA+IGNvbHVtbkNvdW50IC0gMSkgYnJlYWs7XG5cbiAgICAgICAgLy8g6I635Y+W6K+l5YiX5a+55bqU55qEIGZpZWxk77yM5aaC5p6cIGZpZWxkIOS4jeWGjeWxleekuuiMg+WbtO+8jOWImei3s+i/h+ivpeWIl1xuICAgICAgICBjb25zdCBmaWVsZCA9IHZpc2libGVDb2x1bW5zW2NvbHVtbkluZGV4XTtcbiAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIOiOt+WPluivpeWIl+WvueW6lOeahOWuveW6plxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvb3JkaW5hdGUuZ2V0Q29sdW1uV2lkdGgoY29sdW1uSW5kZXgpO1xuICAgICAgICBjb25zdCB4ID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5PZmZzZXQoY29sdW1uSW5kZXgpICsgQUlfVEFCTEVfT0ZGU0VUO1xuICAgICAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBjb2x1bW5JbmRleCA9PT0gYWlUYWJsZS5maWVsZHMubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDEpIHtcbiAgICAgICAgICAgIGNlbGxEcmF3ZXIuaW5pdFN0eWxlKGZpZWxkLCB7IGZvbnRXZWlnaHQ6IERFRkFVTFRfRk9OVF9TVFlMRSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOmBjeWOhuihjCwg5LuOIHJvd1N0YXJ0SW5kZXgg5YiwIHJvd1N0b3BJbmRleCDnmoTmiYDmnInooYzvvIzlhrPlrprlsIblnKjlk6rkupvooYzkuIrnu5jliLbljZXlhYPmoLxcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSByb3dTdGFydEluZGV4OyByb3dJbmRleCA8PSByb3dTdG9wSW5kZXg7IHJvd0luZGV4KyspIHtcbiAgICAgICAgICAgIGlmIChyb3dJbmRleCA+IHJvd0NvdW50IC0gMSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBjb250ZXh0LmxpbmVhclJvd3MoKVtyb3dJbmRleF07XG4gICAgICAgICAgICBjb25zdCB7IF9pZDogcmVjb3JkSWQsIHR5cGUgfSA9IHJvdztcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjb29yZGluYXRlLmdldFJvd09mZnNldChyb3dJbmRleCkgKyBBSV9UQUJMRV9PRkZTRVQ7XG4gICAgICAgICAgICBjb25zdCB7IHJvd0luZGV4OiBwb2ludFJvd0luZGV4LCB0YXJnZXROYW1lIH0gPSBjb250ZXh0LnBvaW50UG9zaXRpb24oKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSG92ZXIgPSBwb2ludFJvd0luZGV4ID09PSByb3dJbmRleDtcblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBSVRhYmxlUm93VHlwZS5hZGQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNIb3ZlclJvdyA9IGlzSG92ZXIgJiYgdGFyZ2V0TmFtZSA9PT0gQUlfVEFCTEVfUk9XX0FERF9CVVRUT047XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZFJvdyA9IGFpVGFibGUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRSZWNvcmRzLmhhcyhyb3cuX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUm93TGF5b3V0LmluaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dIZWlnaHQ6IEFJX1RBQkxFX0ZJRUxEX0hFQURfSEVJR0hULFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXaWR0aDogY29vcmRpbmF0ZS5jb250YWluZXJXaWR0aFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUm93TGF5b3V0LnJlbmRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0hvdmVyUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkUm93XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBBSVRhYmxlUm93VHlwZS5yZWNvcmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRJZCA9IGZpZWxkLl9pZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbDogQUlSZWNvcmRGaWVsZElkUGF0aCA9IFtyZWNvcmRJZCwgZmllbGRJZF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kID0gZ2V0Q2VsbEJhY2tncm91bmQoY2VsbCwgaXNIb3ZlciwgdGFyZ2V0TmFtZSwgYWlUYWJsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkUm93TGF5b3V0LmluaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoOiBjb29yZGluYXRlLmNvbnRhaW5lcldpZHRoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRSb3dMYXlvdXQucmVuZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IGZpbGw6IGJhY2tncm91bmQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSG92ZXJSb3c6IGlzSG92ZXJSZWNvcmQoaXNIb3ZlciwgdGFyZ2V0TmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NoZWNrZWRSb3c6IGlzU2VsZWN0ZWRSZWNvcmQocmVjb3JkSWQsIGFpVGFibGUpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBvZmZzZXQgfSA9IGdldENlbGxIb3Jpem9udGFsUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsWCA9IHggKyBvZmZzZXQgKyBBSV9UQUJMRV9PRkZTRVQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxZID0geSArIEFJX1RBQkxFX09GRlNFVDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB7IGZvbnRXZWlnaHQ6IERFRkFVTFRfRk9OVF9TVFlMRSB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSBBSVRhYmxlUXVlcmllcy5nZXRGaWVsZFZhbHVlKGFpVGFibGUsIFtyZWNvcmRJZCwgZmllbGRJZF0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1WYWx1ZSA9IHRyYW5zZm9ybUNlbGxWYWx1ZShhaVRhYmxlLCBmaWVsZCwgY2VsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlYWxYLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogcmVhbFksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5XaWR0aDogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBpc1NlbGVjdGVkRmllbGQoZmllbGRJZCwgYWlUYWJsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNlbGxEcmF3ZXIuaW5pdFN0eWxlKGZpZWxkLCBzdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOWIl++8jOS4lOWNleWFg+agvOWGheWuueWtmOWcqO+8jOmcgOimgeijgeWJquWGheWuue+8jOS7pemYsuatouaWh+acrOa6ouWHuuWNleWFg+agvOi+ueeVjFxuICAgICAgICAgICAgICAgICAgICAvLyDnhLblkI7vvIzmoLnmja7orqHnrpflpb3nmoTmoLflvI/lkozluIPlsYDnu5jliLbljZXlhYPmoLzlhoXlrrlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGFzdENvbHVtbiAmJiBjZWxsVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5yZWN0KHJlYWxYLCByZWFsWSwgd2lkdGgsIHJvd0hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbERyYXdlci5yZW5kZXJDZWxsKHJlbmRlciBhcyBBSVRhYmxlUmVuZGVyLCBjdHggYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsRHJhd2VyLnJlbmRlckNlbGwocmVuZGVyIGFzIEFJVGFibGVSZW5kZXIsIGN0eCBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuY29uc3QgZ2V0Q2VsbEJhY2tncm91bmQgPSAoY2VsbDogQUlSZWNvcmRGaWVsZElkUGF0aCwgaXNIb3ZlcjogYm9vbGVhbiwgdGFyZ2V0TmFtZTogc3RyaW5nLCBhaVRhYmxlOiBBSVRhYmxlKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgIGNvbnN0IFtyZWNvcmRJZCwgZmllbGRJZF0gPSBjZWxsO1xuICAgIGxldCBiYWNrZ3JvdW5kID0gY29sb3JzLndoaXRlO1xuXG4gICAgY29uc3QgX2lzSG92ZXJSZWNvcmQgPSBpc0hvdmVyUmVjb3JkKGlzSG92ZXIsIHRhcmdldE5hbWUpO1xuICAgIGNvbnN0IF9pc1NlbGVjdGVkUmVjb3JkID0gaXNTZWxlY3RlZFJlY29yZChyZWNvcmRJZCwgYWlUYWJsZSk7XG4gICAgY29uc3QgX2lzU2VsZWN0ZWRGaWVsZCA9IGlzU2VsZWN0ZWRGaWVsZChmaWVsZElkLCBhaVRhYmxlKTtcbiAgICBjb25zdCBfaXNTaWJsaW5nQ2VsbCA9IGlzU2libGluZ0NlbGwoY2VsbCwgYWlUYWJsZSk7XG4gICAgY29uc3QgX2lzQWN0aXZlQ2VsbCA9IGlzQWN0aXZlQ2VsbChjZWxsLCBhaVRhYmxlKTtcbiAgICBjb25zdCBfaXNTZWxlY3RlZENlbGwgPSBpc1NlbGVjdGVkQ2VsbChjZWxsLCBhaVRhYmxlKTtcbiAgICBjb25zdCBfaXNLZXl3b3Jkc01hdGNoZWRDZWxsID0gaXNLZXl3b3Jkc01hdGNoZWRDZWxsKGNlbGwsIGFpVGFibGUpO1xuXG4gICAgaWYgKF9pc0tleXdvcmRzTWF0Y2hlZENlbGwpIHtcbiAgICAgICAgYmFja2dyb3VuZCA9IGNvbG9ycy5pdGVtTWF0Y2hCZ0NvbG9yO1xuICAgIH0gZWxzZSBpZiAoX2lzU2VsZWN0ZWRSZWNvcmQgfHwgX2lzU2VsZWN0ZWRGaWVsZCB8fCBfaXNTaWJsaW5nQ2VsbCB8fCAoX2lzU2VsZWN0ZWRDZWxsICYmICFfaXNBY3RpdmVDZWxsKSkge1xuICAgICAgICBiYWNrZ3JvdW5kID0gY29sb3JzLml0ZW1BY3RpdmVCZ0NvbG9yO1xuICAgIH0gZWxzZSBpZiAoX2lzSG92ZXJSZWNvcmQgJiYgIV9pc0FjdGl2ZUNlbGwpIHtcbiAgICAgICAgYmFja2dyb3VuZCA9IGNvbG9ycy5ncmF5ODA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2tncm91bmQ7XG59O1xuXG5jb25zdCBpc0FjdGl2ZUNlbGwgPSAoY2VsbDogQUlSZWNvcmRGaWVsZElkUGF0aCwgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFtyZWNvcmRJZCwgZmllbGRJZF0gPSBjZWxsO1xuICAgIGNvbnN0IFthY3RpdmVSZWNvcmRJZCwgYWN0aXZlRmllbGRJZF0gPSBBSVRhYmxlLmdldEFjdGl2ZUNlbGwoYWlUYWJsZSkgfHwgW107XG4gICAgcmV0dXJuIHJlY29yZElkID09PSBhY3RpdmVSZWNvcmRJZCAmJiBmaWVsZElkID09PSBhY3RpdmVGaWVsZElkO1xufTtcblxuY29uc3QgaXNTaWJsaW5nQ2VsbCA9IChjZWxsOiBBSVJlY29yZEZpZWxkSWRQYXRoLCBhaVRhYmxlOiBBSVRhYmxlKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgW3JlY29yZElkLCBmaWVsZElkXSA9IGNlbGw7XG4gICAgY29uc3QgW2FjdGl2ZVJlY29yZElkLCBhY3RpdmVGaWVsZElkXSA9IEFJVGFibGUuZ2V0QWN0aXZlQ2VsbChhaVRhYmxlKSB8fCBbXTtcbiAgICByZXR1cm4gQUlUYWJsZS5nZXRBY3RpdmVSZWNvcmRJZHMoYWlUYWJsZSkubGVuZ3RoID09PSAxICYmIHJlY29yZElkID09PSBhY3RpdmVSZWNvcmRJZCAmJiBmaWVsZElkICE9PSBhY3RpdmVGaWVsZElkO1xufTtcblxuY29uc3QgaXNLZXl3b3Jkc01hdGNoZWRDZWxsID0gKGNlbGw6IEFJUmVjb3JkRmllbGRJZFBhdGgsIGFpVGFibGU6IEFJVGFibGUpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBbcmVjb3JkSWQsIGZpZWxkSWRdID0gY2VsbDtcbiAgICByZXR1cm4gYWlUYWJsZS5rZXl3b3Jkc01hdGNoZWRDZWxscygpLmhhcyhgJHtyZWNvcmRJZH06JHtmaWVsZElkfWApO1xufTtcblxuY29uc3QgaXNTZWxlY3RlZENlbGwgPSAoY2VsbDogQUlSZWNvcmRGaWVsZElkUGF0aCwgYWlUYWJsZTogQUlUYWJsZSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFtyZWNvcmRJZCwgZmllbGRJZF0gPSBjZWxsO1xuICAgIHJldHVybiBhaVRhYmxlLnNlbGVjdGlvbigpLnNlbGVjdGVkQ2VsbHMuaGFzKGAke3JlY29yZElkfToke2ZpZWxkSWR9YCk7XG59O1xuXG5jb25zdCBpc1NlbGVjdGVkRmllbGQgPSAoZmllbGRJZDogc3RyaW5nLCBhaVRhYmxlOiBBSVRhYmxlKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGFpVGFibGUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRGaWVsZHMuaGFzKGZpZWxkSWQpO1xufTtcblxuY29uc3QgaXNTZWxlY3RlZFJlY29yZCA9IChyZWNvcmRJZDogc3RyaW5nLCBhaVRhYmxlOiBBSVRhYmxlKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGFpVGFibGUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRSZWNvcmRzLmhhcyhyZWNvcmRJZCk7XG59O1xuXG5jb25zdCBpc0hvdmVyUmVjb3JkID0gKGlzSG92ZXI6IGJvb2xlYW4sIHRhcmdldE5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBpc0hvdmVyICYmIHRhcmdldE5hbWUgIT09IEFJX1RBQkxFX0ZJRUxEX0hFQUQ7XG59O1xuIl19