@one-grid-core/angular 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +55 -9
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +244 -11
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +446 -34
  4. package/esm2022/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.mjs +6 -5
  5. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +3 -3
  6. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +3 -3
  7. package/esm2022/lib/components/one-grid-checkbox/one-grid-checkbox.component.mjs +7 -18
  8. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +6 -6
  9. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +221 -17
  10. package/esm2022/lib/components/one-grid-header-menu/one-grid-header-menu.component.mjs +137 -0
  11. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +6 -5
  12. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +4 -4
  13. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +5 -3
  14. package/esm2022/lib/components/one-grid-status/one-grid-status.component.mjs +4 -4
  15. package/esm2022/lib/core/directives/one-cell-input-validator.directive.mjs +3 -3
  16. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +3 -3
  17. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +3 -3
  18. package/esm2022/lib/core/icons/one-grid-icons.mjs +38 -0
  19. package/esm2022/lib/core/instants/one-grid-api.class.mjs +296 -3
  20. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  22. package/esm2022/lib/core/models/one-filter.model.mjs +1 -1
  23. package/esm2022/lib/core/pipes/aria-sort.pipe.mjs +31 -0
  24. package/esm2022/lib/core/pipes/cell-action-button-enable.pipe.mjs +3 -3
  25. package/esm2022/lib/core/pipes/cell-editable.pipe.mjs +3 -3
  26. package/esm2022/lib/core/pipes/cell-invalid.pipe.mjs +3 -3
  27. package/esm2022/lib/core/pipes/cell-key.pipe.mjs +3 -3
  28. package/esm2022/lib/core/pipes/cell-level-padding.pipe.mjs +3 -3
  29. package/esm2022/lib/core/pipes/cell-selected.pipe.mjs +3 -3
  30. package/esm2022/lib/core/pipes/cell-state-renderer.pipe.mjs +3 -3
  31. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -3
  32. package/esm2022/lib/core/pipes/header-checkbox-checked.pipe.mjs +3 -3
  33. package/esm2022/lib/core/pipes/header-checkbox-disabled.pipe.mjs +3 -3
  34. package/esm2022/lib/core/pipes/header-checkbox-indeterminate.pipe.mjs +3 -3
  35. package/esm2022/lib/core/services/og-column.service.mjs +153 -30
  36. package/esm2022/lib/core/services/one-grid-cell.service.mjs +16 -14
  37. package/esm2022/lib/helpers/one-cell.helper.mjs +30 -1
  38. package/esm2022/lib/helpers/one-column-def.helper.mjs +16 -1
  39. package/esm2022/lib/helpers/one-csv.helper.mjs +58 -0
  40. package/esm2022/lib/helpers/one-filter.helper.mjs +11 -1
  41. package/esm2022/lib/helpers/one-row-grouping.helper.mjs +103 -0
  42. package/esm2022/lib/index.mjs +3 -1
  43. package/esm2022/lib/one-grid.module.mjs +24 -114
  44. package/fesm2022/one-grid-core-angular.mjs +2328 -851
  45. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  46. package/lib/components/one-grid/one-grid.component.d.ts +101 -4
  47. package/lib/components/one-grid-body/one-grid-body.component.d.ts +83 -2
  48. package/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.d.ts +1 -1
  49. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +1 -1
  50. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +1 -1
  51. package/lib/components/one-grid-checkbox/one-grid-checkbox.component.d.ts +1 -1
  52. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +1 -1
  53. package/lib/components/one-grid-header/one-grid-header.component.d.ts +69 -4
  54. package/lib/components/one-grid-header-menu/one-grid-header-menu.component.d.ts +52 -0
  55. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +1 -1
  56. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +1 -1
  57. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +1 -1
  58. package/lib/components/one-grid-status/one-grid-status.component.d.ts +1 -1
  59. package/lib/core/directives/one-cell-input-validator.directive.d.ts +1 -1
  60. package/lib/core/directives/one-cell-renderer-component.directive.d.ts +1 -1
  61. package/lib/core/directives/one-cell-text-expand.directive.d.ts +1 -1
  62. package/lib/core/icons/one-grid-icons.d.ts +35 -0
  63. package/lib/core/instants/one-grid-api.class.d.ts +115 -1
  64. package/lib/core/models/one-column-def-types.model.d.ts +77 -2
  65. package/lib/core/models/one-event-types.model.d.ts +19 -0
  66. package/lib/core/models/one-filter.model.d.ts +8 -1
  67. package/lib/core/pipes/aria-sort.pipe.d.ts +15 -0
  68. package/lib/core/pipes/cell-action-button-enable.pipe.d.ts +1 -1
  69. package/lib/core/pipes/cell-editable.pipe.d.ts +1 -1
  70. package/lib/core/pipes/cell-invalid.pipe.d.ts +1 -1
  71. package/lib/core/pipes/cell-key.pipe.d.ts +1 -1
  72. package/lib/core/pipes/cell-level-padding.pipe.d.ts +1 -1
  73. package/lib/core/pipes/cell-selected.pipe.d.ts +1 -1
  74. package/lib/core/pipes/cell-state-renderer.pipe.d.ts +1 -1
  75. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  76. package/lib/core/pipes/header-checkbox-checked.pipe.d.ts +1 -1
  77. package/lib/core/pipes/header-checkbox-disabled.pipe.d.ts +1 -1
  78. package/lib/core/pipes/header-checkbox-indeterminate.pipe.d.ts +1 -1
  79. package/lib/core/services/og-column.service.d.ts +46 -2
  80. package/lib/core/services/one-grid-cell.service.d.ts +0 -3
  81. package/lib/helpers/one-cell.helper.d.ts +17 -0
  82. package/lib/helpers/one-column-def.helper.d.ts +9 -0
  83. package/lib/helpers/one-csv.helper.d.ts +29 -0
  84. package/lib/helpers/one-row-grouping.helper.d.ts +35 -0
  85. package/lib/index.d.ts +2 -0
  86. package/lib/one-grid.module.d.ts +15 -37
  87. package/package.json +1 -1
  88. package/scss/_one-grid.scss +127 -0
  89. package/esm2022/lib/core/pipes/cell-action-button-visible.pipe.mjs +0 -17
  90. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +0 -26
  91. package/esm2022/lib/core/pipes/cell-field-value.pipe.mjs +0 -25
  92. package/esm2022/lib/core/pipes/cell-field.pipe.mjs +0 -20
  93. package/esm2022/lib/core/pipes/cell-number-value.pipe.mjs +0 -19
  94. package/esm2022/lib/core/pipes/cell-state-group-renderer.pipe.mjs +0 -21
  95. package/esm2022/lib/core/pipes/cell-value-getter.pipe.mjs +0 -23
  96. package/lib/core/pipes/cell-action-button-visible.pipe.d.ts +0 -9
  97. package/lib/core/pipes/cell-field-value-empty.pipe.d.ts +0 -7
  98. package/lib/core/pipes/cell-field-value.pipe.d.ts +0 -7
  99. package/lib/core/pipes/cell-field.pipe.d.ts +0 -7
  100. package/lib/core/pipes/cell-number-value.pipe.d.ts +0 -7
  101. package/lib/core/pipes/cell-state-group-renderer.pipe.d.ts +0 -9
  102. package/lib/core/pipes/cell-value-getter.pipe.d.ts +0 -9
@@ -9,23 +9,56 @@ import { OneGridCellService } from '../../core/services/one-grid-cell.service';
9
9
  import { OgColumnService } from '../../core/services/og-column.service';
10
10
  import _ from 'lodash';
11
11
  import { OneGridRowDragService } from '../../core/services/one-grid-row-drag.service';
12
+ import { NgTemplateOutlet } from '@angular/common';
13
+ import { aggColumns, ONE_GROUP_CHILDREN_FIELD, ONE_GROUP_VALUE_FIELD, rowGroupFields } from '../../helpers/one-row-grouping.helper';
14
+ import { OneGridHeaderComponent } from '../one-grid-header/one-grid-header.component';
15
+ import { OneGridBodyComponent } from '../one-grid-body/one-grid-body.component';
16
+ import { OneGridPaginationComponent } from '../one-grid-pagination/one-grid-pagination.component';
12
17
  import * as i0 from "@angular/core";
13
18
  import * as i1 from "../../core/instants/one-grid-api.class";
14
19
  import * as i2 from "../../core/services/one-grid-event.service";
15
- import * as i3 from "../one-grid-header/one-grid-header.component";
16
- import * as i4 from "../one-grid-body/one-grid-body.component";
17
- import * as i5 from "../one-grid-pagination/one-grid-pagination.component";
18
20
  export class OneGridComponent {
19
- constructor(api, eventService, elementRef) {
21
+ /**
22
+ * Recompute the bar's numbers from the filtered row count and the API's
23
+ * paging state. Deferred a tick for the same reason the aria counts are:
24
+ * the count arrives while the first change detection pass is still running.
25
+ */
26
+ refreshClientPagination(total) {
27
+ const { pageSize, currentPage } = this.api.paginationState;
28
+ const lastPage = Math.max(Math.ceil(total / pageSize), 1);
29
+ const page = Math.min(currentPage, lastPage);
30
+ setTimeout(() => {
31
+ this.internalPaginate = {
32
+ total,
33
+ currentPage: page,
34
+ lastPage,
35
+ perPage: pageSize,
36
+ firstRowIndex: total === 0 ? 0 : (page - 1) * pageSize + 1,
37
+ lastRowIndex: Math.min(page * pageSize, total),
38
+ pageSizeOptions: this.paginate?.pageSizeOptions,
39
+ };
40
+ this.cdr.markForCheck();
41
+ });
42
+ }
43
+ constructor(api, eventService, elementRef, cdr) {
20
44
  this.api = api;
21
45
  this.eventService = eventService;
22
46
  this.elementRef = elementRef;
47
+ this.cdr = cdr;
23
48
  this.rowNumber = false;
24
49
  this.allowedEdit = true;
25
50
  this.submitted = false;
26
51
  this.context = null;
27
52
  this.rowData = [];
28
53
  this.rowSelection = null;
54
+ /**
55
+ * The grid's accessible name.
56
+ *
57
+ * A `role="grid"` with no name is announced as an unlabelled grid, which
58
+ * tells a screen-reader user nothing about what they have landed in. Set it
59
+ * to whatever the grid is showing — "Employees", "Order lines".
60
+ */
61
+ this.gridLabel = 'Data grid';
29
62
  this.enableGroupColumnDefs = false;
30
63
  this.groupColumnDefs = [];
31
64
  this.defaultColumnDef = {};
@@ -60,6 +93,41 @@ export class OneGridComponent {
60
93
  * pointer is in flight — and only when the position actually changed.
61
94
  */
62
95
  this.rowDragEnd = new EventEmitter();
96
+ /**
97
+ * The header's ⋮ button was pressed for this column.
98
+ *
99
+ * The grid has no column menu of its own — this reports the intent so the
100
+ * host can show whatever a column menu means in its app. Set
101
+ * `columnDef.suppressHeaderMenuButton` to hide the button entirely.
102
+ */
103
+ this.headerMenuClick = new EventEmitter();
104
+ /**
105
+ * Render the grid's own column menu behind the header ⋮ button: sort, pin,
106
+ * hide. Opt-in — a host that built its menu on `(headerMenuClick)` keeps
107
+ * exactly what it had, and the intent still emits either way.
108
+ */
109
+ this.headerMenu = false;
110
+ /**
111
+ * Render a filter input under every column whose `filterable` resolves
112
+ * true. The inputs feed `api.setFilterModel` with contains-conditions,
113
+ * debounced; filters on fields without an input are left untouched.
114
+ */
115
+ this.filterRow = false;
116
+ /**
117
+ * Record committed cell edits so `api.undoCellEditing` /
118
+ * `api.redoCellEditing` (and Ctrl+Z / Ctrl+Y in the grid) can walk them.
119
+ * Programmatic `setDataValue` writes are not recorded.
120
+ */
121
+ this.undoRedoCellEditing = false;
122
+ /** How many edits the undo stack keeps. */
123
+ this.undoRedoCellEditingLimit = 10;
124
+ /**
125
+ * `'fullRow'` opens every editable cell of the row on a double-click and
126
+ * commits them together — Enter anywhere in the row, or focus leaving the
127
+ * row. Escape closes the whole row without committing. Default: cells edit
128
+ * one at a time.
129
+ */
130
+ this.editType = null;
63
131
  this.onGridReady = new EventEmitter();
64
132
  this.onRowGotoDetail = new EventEmitter();
65
133
  this.onRowAddNew = new EventEmitter();
@@ -79,6 +147,22 @@ export class OneGridComponent {
79
147
  this.rowCountChanged = new EventEmitter();
80
148
  this.selectionChanged = new EventEmitter();
81
149
  this.expansionChanged = new EventEmitter();
150
+ /**
151
+ * The sort model changed — a header click or `api.onSortChanged`. Carries
152
+ * the re-sorted nodes and the model that produced them; `api.sortModel`
153
+ * stays readable between emissions.
154
+ */
155
+ this.sortChanged = new EventEmitter();
156
+ /**
157
+ * An inline edit was committed with a value different from the one it
158
+ * started with. Programmatic `node.setDataValue` does not emit here — the
159
+ * caller already holds both values.
160
+ */
161
+ this.cellValueChanged = new EventEmitter();
162
+ /** A header drag finished somewhere other than where it started. */
163
+ this.columnMoved = new EventEmitter();
164
+ /** A resize gesture finished — one event per gesture, not per pixel. */
165
+ this.columnResized = new EventEmitter();
82
166
  // For context menu option
83
167
  this.cellOptionSelect = new EventEmitter();
84
168
  this.onRowCellOption = new EventEmitter();
@@ -86,17 +170,42 @@ export class OneGridComponent {
86
170
  * Bind One Grid Pagination Feature
87
171
  */
88
172
  this.pagination = false;
173
+ /**
174
+ * Let the grid page its own rows. The bar renders, the grid slices the
175
+ * filtered rows to the current page, and the navigation buttons work
176
+ * without the host handling anything — `[paginate]` is ignored in this
177
+ * mode (the grid owns those numbers) except for `pageSizeOptions`. The
178
+ * navigation outputs still emit, as notifications rather than intents.
179
+ * Selection, filtering and sorting keep operating on the whole dataset.
180
+ */
181
+ this.clientSidePagination = false;
182
+ /** Rows per page for `clientSidePagination`. */
183
+ this.pageSize = 25;
89
184
  this.goToFirst = new EventEmitter();
90
185
  this.goToPrevious = new EventEmitter();
91
186
  this.goToNext = new EventEmitter();
92
187
  this.goToLast = new EventEmitter();
93
188
  this.pageSizeChange = new EventEmitter();
189
+ /** The paging numbers the bar shows when the grid pages its own rows. */
190
+ this.internalPaginate = {
191
+ total: 0, currentPage: 1, lastPage: 1, perPage: 25, firstRowIndex: 0, lastRowIndex: 0,
192
+ };
94
193
  /**
95
194
  * One Grid Properties
96
195
  */
97
196
  this.bodyScrollLeft = 0;
98
197
  this._oneRowNumberColumnDef = null;
99
198
  this.subscriptions = new Subscription();
199
+ /**
200
+ * Totals for `aria-rowcount` / `aria-colcount`.
201
+ *
202
+ * Held as fields rather than computed in the template: they are read on every
203
+ * change detection pass and only actually change when the data or the columns
204
+ * do. `-1` is the ARIA value for "unknown", which is the honest answer before
205
+ * the first row arrives.
206
+ */
207
+ this.ariaRowCount = -1;
208
+ this.ariaColCount = -1;
100
209
  }
101
210
  ngOnChanges(changes) {
102
211
  if (changes['masterNode'] && changes['masterNode'].isFirstChange) {
@@ -140,6 +249,35 @@ export class OneGridComponent {
140
249
  maxWidth: 200
141
250
  };
142
251
  }
252
+ /**
253
+ * Row grouping: column defs declaring `rowGroup` turn the grid into a
254
+ * tree over synthetic group rows. Configured before `api.init` because
255
+ * everything downstream — the treeData flag the API captures, the group
256
+ * column the tree block below prepends — has to see the tree shape.
257
+ */
258
+ const rowGroupColumnFields = this.treeData || this.masterDetail
259
+ ? []
260
+ : rowGroupFields(this.columnDefs);
261
+ if (rowGroupColumnFields.length) {
262
+ this.treeData = true;
263
+ this.treeDataChildrenField = ONE_GROUP_CHILDREN_FIELD;
264
+ // The group column: host-tuned through autoGroupColumnDef, but its
265
+ // field is always the synthetic label — that is where a group row
266
+ // carries its display value.
267
+ this.autoGroupColumnDef = {
268
+ headerName: 'Group',
269
+ minWidth: 200,
270
+ ...this.autoGroupColumnDef,
271
+ field: ONE_GROUP_VALUE_FIELD,
272
+ // The marker the tree machinery keys on: the expander renders on this
273
+ // column and group rows print their label here.
274
+ autoGroupField: true,
275
+ };
276
+ // A grouped-by column's value is on the group row; showing the flat
277
+ // column too repeats it down every leaf. Hidden, not removed — the
278
+ // host can bring it back with api.setColumnVisible.
279
+ this.columnDefs = this.columnDefs.map(column => column.rowGroup ? { ...column, hide: true } : column);
280
+ }
143
281
  /**
144
282
  * Initialize One Grid API
145
283
  */
@@ -155,6 +293,15 @@ export class OneGridComponent {
155
293
  detailRendererComponent: this.detailRendererComponent,
156
294
  treeData: this.treeData,
157
295
  });
296
+ if (rowGroupColumnFields.length) {
297
+ this.api.setRowGrouping(rowGroupColumnFields, aggColumns(this.columnDefs));
298
+ }
299
+ if (this.undoRedoCellEditing) {
300
+ this.api.enableUndoRedoCellEditing(this.undoRedoCellEditingLimit);
301
+ }
302
+ if (this.clientSidePagination) {
303
+ this.api.setClientSidePagination(true, this.paginate?.perPage ?? this.pageSize);
304
+ }
158
305
  /**
159
306
  * Setup Master Detail Configuration
160
307
  */
@@ -177,9 +324,28 @@ export class OneGridComponent {
177
324
  setTimeout(() => this.api.setColumnDefs(columnDefs));
178
325
  }
179
326
  // Listen Selection Changed Event
327
+ // Columns can be replaced at runtime through `api.setColumnDefs`, and
328
+ // `aria-colcount` has to follow.
329
+ this.subscriptions.add(this.eventService.addEventListener('columnChanged', () => {
330
+ this.ariaColCount = this.api?.getColumnState()?.columns?.length ?? -1;
331
+ }));
180
332
  this.subscriptions.add(this.eventService.addEventListener('selectionChanged', (payload) => {
181
333
  this.selectionChanged.emit(payload);
182
334
  }));
335
+ // The internal events a host can act on, surfaced as outputs. Same
336
+ // forwarding pattern as selectionChanged above.
337
+ this.subscriptions.add(this.eventService.addEventListener('sortChanged', (payload) => {
338
+ this.sortChanged.emit(payload);
339
+ }));
340
+ this.subscriptions.add(this.eventService.addEventListener('cellValueChanged', (payload) => {
341
+ this.cellValueChanged.emit(payload);
342
+ }));
343
+ this.subscriptions.add(this.eventService.addEventListener('columnMoved', (payload) => {
344
+ this.columnMoved.emit(payload);
345
+ }));
346
+ this.subscriptions.add(this.eventService.addEventListener('columnResized', (payload) => {
347
+ this.columnResized.emit(payload);
348
+ }));
183
349
  }
184
350
  ngAfterViewInit() {
185
351
  // The header follows the body through (bodyScroll) -> [scrollLeft]. A second
@@ -271,8 +437,34 @@ export class OneGridComponent {
271
437
  this.onShiftDoubleClick.emit(event);
272
438
  }
273
439
  invokeRowCountChanged(length) {
440
+ this.refreshAriaCounts(length);
441
+ if (this.clientSidePagination)
442
+ this.refreshClientPagination(length);
274
443
  this.rowCountChanged.emit(length);
275
444
  }
445
+ /**
446
+ * Recompute the totals a screen reader is told about.
447
+ *
448
+ * `aria-rowcount` counts every row the grid represents, not the handful the
449
+ * virtual scroller currently has in the DOM — the header row, the pinned rows
450
+ * either side, and all the data rows.
451
+ */
452
+ refreshAriaCounts(dataRows) {
453
+ const pinned = (this.pinnedTopRowData?.length ?? 0) + (this.pinnedBottomRowData?.length ?? 0);
454
+ const rows = 1 + pinned + dataRows;
455
+ const cols = this.api?.getColumnState()?.columns?.length ?? -1;
456
+ if (rows === this.ariaRowCount && cols === this.ariaColCount)
457
+ return;
458
+ // Deferred a tick. The body emits its row count while the first change
459
+ // detection pass is still running, after this component's own attributes
460
+ // were checked — assigning here directly is the textbook NG0100. The body
461
+ // defers its node list for the same reason.
462
+ setTimeout(() => {
463
+ this.ariaRowCount = rows;
464
+ this.ariaColCount = cols;
465
+ this.cdr.markForCheck();
466
+ });
467
+ }
276
468
  cellOptionMenuSelected(event) {
277
469
  this.cellOptionSelect.emit(event);
278
470
  }
@@ -280,18 +472,28 @@ export class OneGridComponent {
280
472
  * Bing Pagination Events to Parent Component
281
473
  */
282
474
  invokeGoToFirst() {
475
+ if (this.clientSidePagination)
476
+ this.api.setCurrentPage(1);
283
477
  this.goToFirst.emit();
284
478
  }
285
479
  invokeGoToPrevious() {
480
+ if (this.clientSidePagination)
481
+ this.api.setCurrentPage(this.api.paginationState.currentPage - 1);
286
482
  this.goToPrevious.emit();
287
483
  }
288
484
  invokeGoToNext() {
485
+ if (this.clientSidePagination)
486
+ this.api.setCurrentPage(this.api.paginationState.currentPage + 1);
289
487
  this.goToNext.emit();
290
488
  }
291
489
  invokeGoToLast() {
490
+ if (this.clientSidePagination)
491
+ this.api.setCurrentPage(this.internalPaginate.lastPage ?? 1);
292
492
  this.goToLast.emit();
293
493
  }
294
494
  invokePageSizeChange(pageSize) {
495
+ if (this.clientSidePagination)
496
+ this.api.setPageSize(pageSize);
295
497
  this.pageSizeChange.emit(pageSize);
296
498
  }
297
499
  invokeRowDragEnd(event) {
@@ -308,8 +510,8 @@ export class OneGridComponent {
308
510
  this.api.destroy();
309
511
  this.subscriptions.unsubscribe();
310
512
  }
311
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, deps: [{ token: i1.OneGridApi }, { token: i2.OneGridEventService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
312
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridComponent, selector: "one-grid", inputs: { rowNumber: "rowNumber", allowedEdit: "allowedEdit", submitted: "submitted", context: "context", rowData: "rowData", rowSelection: "rowSelection", enableGroupColumnDefs: "enableGroupColumnDefs", groupColumnDefs: "groupColumnDefs", defaultColumnDef: "defaultColumnDef", columnDefs: "columnDefs", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded", pagination: "pagination", paginate: "paginate" }, outputs: { rowDragEnd: "rowDragEnd", onGridReady: "onGridReady", onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", selectionChanged: "selectionChanged", expansionChanged: "expansionChanged", cellOptionSelect: "cellOptionSelect", onRowCellOption: "onRowCellOption", goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, providers: [
513
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, deps: [{ token: i1.OneGridApi }, { token: i2.OneGridEventService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
514
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridComponent, isStandalone: true, selector: "one-grid", inputs: { rowNumber: "rowNumber", allowedEdit: "allowedEdit", submitted: "submitted", context: "context", rowData: "rowData", rowSelection: "rowSelection", gridLabel: "gridLabel", enableGroupColumnDefs: "enableGroupColumnDefs", groupColumnDefs: "groupColumnDefs", defaultColumnDef: "defaultColumnDef", columnDefs: "columnDefs", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded", headerMenu: "headerMenu", filterRow: "filterRow", undoRedoCellEditing: "undoRedoCellEditing", undoRedoCellEditingLimit: "undoRedoCellEditingLimit", editType: "editType", pagination: "pagination", paginate: "paginate", clientSidePagination: "clientSidePagination", pageSize: "pageSize" }, outputs: { rowDragEnd: "rowDragEnd", headerMenuClick: "headerMenuClick", onGridReady: "onGridReady", onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", selectionChanged: "selectionChanged", expansionChanged: "expansionChanged", sortChanged: "sortChanged", cellValueChanged: "cellValueChanged", columnMoved: "columnMoved", columnResized: "columnResized", cellOptionSelect: "cellOptionSelect", onRowCellOption: "onRowCellOption", goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, providers: [
313
515
  OneGridEventService,
314
516
  OneGridApi,
315
517
  OgColumnService,
@@ -318,11 +520,16 @@ export class OneGridComponent {
318
520
  OneGridRowService,
319
521
  OneGridCellService,
320
522
  OneGridRowDragService
321
- ], viewQueries: [{ propertyName: "ogRef", first: true, predicate: ["ogRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<div #ogRef class=\"one-grid\" (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination) {\n <one-grid-pagination\n [paginate]=\"paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>", styles: [""], dependencies: [{ kind: "component", type: OneGridComponent, selector: "one-grid", inputs: ["rowNumber", "allowedEdit", "submitted", "context", "rowData", "rowSelection", "enableGroupColumnDefs", "groupColumnDefs", "defaultColumnDef", "columnDefs", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailCellRendererParams", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded", "pagination", "paginate"], outputs: ["rowDragEnd", "onGridReady", "onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "selectionChanged", "expansionChanged", "cellOptionSelect", "onRowCellOption", "goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }, { kind: "component", type: i3.OneGridHeaderComponent, selector: "one-grid-header", inputs: ["scrollLeft", "allowedEdit", "enableGroupColumnDefs", "api"] }, { kind: "component", type: i4.OneGridBodyComponent, selector: "one-grid-body", inputs: ["rowData", "rowNumber", "api", "pagination", "allowedEdit", "enableGroupColumnDefs", "submitted", "context", "getRowId", "gridCopy$", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailRowMaxHeight", "detailCellRendererParams", "detailGridTemplate", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowCopy", "onRowLocation", "onRowDocument", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "expansionChanged", "bodyScroll", "cellOptionSelect", "rowDragEnd"] }, { kind: "component", type: i5.OneGridPaginationComponent, selector: "one-grid-pagination", inputs: ["paginate"], outputs: ["goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }] }); }
523
+ ], viewQueries: [{ propertyName: "ogRef", first: true, predicate: ["ogRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<!-- role=\"grid\" is what turns this from a pile of divs into something a screen\n reader can navigate. The counts are the *total* \u2014 `aria-rowcount` includes\n the header row and any pinned rows, and both stay correct while the body is\n virtualised and most rows are not in the DOM, which is exactly what these\n attributes exist to communicate. -->\n<div #ogRef\n class=\"one-grid\"\n role=\"grid\"\n [attr.aria-label]=\"gridLabel\"\n [attr.aria-rowcount]=\"ariaRowCount\"\n [attr.aria-colcount]=\"ariaColCount\"\n [attr.aria-multiselectable]=\"rowSelection === 'multiple' ? true : null\"\n (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n [headerMenu]=\"headerMenu\"\n [filterRow]=\"filterRow\"\n (headerMenuClick)=\"headerMenuClick.emit($event)\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [editType]=\"editType\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination || clientSidePagination) {\n <one-grid-pagination\n [paginate]=\"clientSidePagination ? internalPaginate : paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>", styles: [""], dependencies: [{ kind: "component", type: OneGridComponent, selector: "one-grid", inputs: ["rowNumber", "allowedEdit", "submitted", "context", "rowData", "rowSelection", "gridLabel", "enableGroupColumnDefs", "groupColumnDefs", "defaultColumnDef", "columnDefs", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailCellRendererParams", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded", "headerMenu", "filterRow", "undoRedoCellEditing", "undoRedoCellEditingLimit", "editType", "pagination", "paginate", "clientSidePagination", "pageSize"], outputs: ["rowDragEnd", "headerMenuClick", "onGridReady", "onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "selectionChanged", "expansionChanged", "sortChanged", "cellValueChanged", "columnMoved", "columnResized", "cellOptionSelect", "onRowCellOption", "goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }, { kind: "component", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: ["scrollLeft", "allowedEdit", "enableGroupColumnDefs", "api", "filterRow", "headerMenu"], outputs: ["headerMenuClick"] }, { kind: "component", type: OneGridBodyComponent, selector: "one-grid-body", inputs: ["rowData", "rowNumber", "api", "pagination", "allowedEdit", "enableGroupColumnDefs", "submitted", "editType", "context", "getRowId", "gridCopy$", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailRowMaxHeight", "detailCellRendererParams", "detailGridTemplate", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowCopy", "onRowLocation", "onRowDocument", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "expansionChanged", "bodyScroll", "cellOptionSelect", "rowDragEnd"] }, { kind: "component", type: OneGridPaginationComponent, selector: "one-grid-pagination", inputs: ["paginate"], outputs: ["goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }] }); }
322
524
  }
323
525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, decorators: [{
324
526
  type: Component,
325
- args: [{ standalone: false, selector: 'one-grid', providers: [
527
+ args: [{ standalone: true, imports: [
528
+ NgTemplateOutlet,
529
+ OneGridHeaderComponent,
530
+ OneGridBodyComponent,
531
+ OneGridPaginationComponent,
532
+ ], selector: 'one-grid', providers: [
326
533
  OneGridEventService,
327
534
  OneGridApi,
328
535
  OgColumnService,
@@ -331,8 +538,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
331
538
  OneGridRowService,
332
539
  OneGridCellService,
333
540
  OneGridRowDragService
334
- ], template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<div #ogRef class=\"one-grid\" (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination) {\n <one-grid-pagination\n [paginate]=\"paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>" }]
335
- }], ctorParameters: () => [{ type: i1.OneGridApi }, { type: i2.OneGridEventService }, { type: i0.ElementRef }], propDecorators: { ogRef: [{
541
+ ], template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<!-- role=\"grid\" is what turns this from a pile of divs into something a screen\n reader can navigate. The counts are the *total* \u2014 `aria-rowcount` includes\n the header row and any pinned rows, and both stay correct while the body is\n virtualised and most rows are not in the DOM, which is exactly what these\n attributes exist to communicate. -->\n<div #ogRef\n class=\"one-grid\"\n role=\"grid\"\n [attr.aria-label]=\"gridLabel\"\n [attr.aria-rowcount]=\"ariaRowCount\"\n [attr.aria-colcount]=\"ariaColCount\"\n [attr.aria-multiselectable]=\"rowSelection === 'multiple' ? true : null\"\n (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n [headerMenu]=\"headerMenu\"\n [filterRow]=\"filterRow\"\n (headerMenuClick)=\"headerMenuClick.emit($event)\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [editType]=\"editType\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination || clientSidePagination) {\n <one-grid-pagination\n [paginate]=\"clientSidePagination ? internalPaginate : paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>" }]
542
+ }], ctorParameters: () => [{ type: i1.OneGridApi }, { type: i2.OneGridEventService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { ogRef: [{
336
543
  type: ViewChild,
337
544
  args: ['ogRef', { static: true }]
338
545
  }], rowNumber: [{
@@ -347,6 +554,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
347
554
  type: Input
348
555
  }], rowSelection: [{
349
556
  type: Input
557
+ }], gridLabel: [{
558
+ type: Input
350
559
  }], enableGroupColumnDefs: [{
351
560
  type: Input
352
561
  }], groupColumnDefs: [{
@@ -379,6 +588,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
379
588
  type: Input
380
589
  }], rowDragEnd: [{
381
590
  type: Output
591
+ }], headerMenuClick: [{
592
+ type: Output
593
+ }], headerMenu: [{
594
+ type: Input
595
+ }], filterRow: [{
596
+ type: Input
597
+ }], undoRedoCellEditing: [{
598
+ type: Input
599
+ }], undoRedoCellEditingLimit: [{
600
+ type: Input
601
+ }], editType: [{
602
+ type: Input
382
603
  }], onGridReady: [{
383
604
  type: Output
384
605
  }], onRowGotoDetail: [{
@@ -417,6 +638,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
417
638
  type: Output
418
639
  }], expansionChanged: [{
419
640
  type: Output
641
+ }], sortChanged: [{
642
+ type: Output
643
+ }], cellValueChanged: [{
644
+ type: Output
645
+ }], columnMoved: [{
646
+ type: Output
647
+ }], columnResized: [{
648
+ type: Output
420
649
  }], cellOptionSelect: [{
421
650
  type: Output
422
651
  }], onRowCellOption: [{
@@ -425,6 +654,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
425
654
  type: Input
426
655
  }], paginate: [{
427
656
  type: Input
657
+ }], clientSidePagination: [{
658
+ type: Input
659
+ }], pageSize: [{
660
+ type: Input
428
661
  }], goToFirst: [{
429
662
  type: Output
430
663
  }], goToPrevious: [{
@@ -436,4 +669,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
436
669
  }], pageSizeChange: [{
437
670
  type: Output
438
671
  }] } });
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb21wb25lbnRzL29uZS1ncmlkL29uZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7OztBQW1CdEYsTUFBTSxPQUFPLGdCQUFnQjtJQXFHM0IsWUFDWSxHQUFlLEVBQ2YsWUFBaUMsRUFDbkMsVUFBc0I7UUFGcEIsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUNmLGlCQUFZ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QUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUdHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUtFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVHlwZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYsIE9uZUdyb3VwQ29sdW1uRGVmIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkUmVhZHlFdmVudCwgT25lR3JpZFJvd0FjdGlvbkV2ZW50LCBPbmVHcmlkVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUGFnaW5hdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1wYWdpbmF0aW9uLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIEV4cGFuc2lvbkNoYW5nZWRFdmVudCwgUm93U2VsZWN0aW9uTW9kZSwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtcm93LWRyYWcuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dEcmFnRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIE9uZUdyaWRBcGksXG4gICAgT2dDb2x1bW5TZXJ2aWNlLFxuICAgIE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlLFxuICAgIE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBPbmVHcmlkUm93RHJhZ1NlcnZpY2VcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBHZXQgR2VuZXJhbCBEYXRhIGZyb20gUGFyZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdvZ1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIG9nUmVmITogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIHJvd0RhdGE6IFRbXSA9IFtdO1xuICBASW5wdXQoKSByb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk1vZGUgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGVuYWJsZUdyb3VwQ29sdW1uRGVmczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBncm91cENvbHVtbkRlZnM6IE9uZUdyb3VwQ29sdW1uRGVmW10gPSBbXTtcblxuICBASW5wdXQoKSBkZWZhdWx0Q29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD4gPSB7fTtcbiAgQElucHV0KCkgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcblxuICAvKipcbiAgICogUm93cyBhbmNob3JlZCBhYm92ZSB0aGUgc2Nyb2xsaW5nIGFyZWEg4oCUIGEgaGVhZGVyIHN1bW1hcnksIG9yIGFuIGVudHJ5IGxpbmUuXG4gICAqIFRoZXkga2VlcCBjb2x1bW4gYWxpZ25tZW50IGFuZCBzY3JvbGwgc2lkZXdheXMgd2l0aCB0aGUgYm9keSwgYnV0IGFyZSBub3RcbiAgICogZGF0YTogc29ydGluZywgZmlsdGVyaW5nLCBzZWxlY3Rpb24gYW5kIHRoZSByb3cgY291bnQgYWxsIHBhc3MgdGhlbSBieS5cbiAgICovXG4gIEBJbnB1dCgpIHBpbm5lZFRvcFJvd0RhdGE6IFRbXSA9IFtdO1xuXG4gIC8qKiBSb3dzIGFuY2hvcmVkIGJlbG93IHRoZSBzY3JvbGxpbmcgYXJlYSwgdHlwaWNhbGx5IGEgdG90YWxzIHJvdy4gKi9cbiAgQElucHV0KCkgcGlubmVkQm90dG9tUm93RGF0YTogVFtdID0gW107XG5cbiAgLy8gUlhKUyBQcm9wZXJ0aWVzXG4gIHByb3RlY3RlZCBncmlkQ29weSQgPSBuZXcgU3ViamVjdDxDbGlwYm9hcmRFdmVudD4oKTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBGZWF0dXJlXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnbWFzdGVyJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGUgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ6IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogVHJlZSBEYXRhIEZlYXR1cmVcbiAgICovXG4gIEBJbnB1dCgpIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY7XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBCaW5kIFJvdyBBY3Rpb24gRXZlbnRzICYgRGF0YSB0byBQYXJlbnRcbiAgICovXG4gIC8qKlxuICAgKiBBIHJvdyBmaW5pc2hlZCBtb3ZpbmcuIEZpcmVzIG9uY2UgcGVyIGNvbXBsZXRlZCByZW9yZGVyIOKAlCBub3Qgd2hpbGUgdGhlXG4gICAqIHBvaW50ZXIgaXMgaW4gZmxpZ2h0IOKAlCBhbmQgb25seSB3aGVuIHRoZSBwb3NpdGlvbiBhY3R1YWxseSBjaGFuZ2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZVJvd0RyYWdFdmVudDxUPj4oKTtcblxuICBAT3V0cHV0KCkgb25HcmlkUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSZWFkeUV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0xvY2F0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93U2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblNoaWZ0RG91YmxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIHJvd0NvdW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBleHBhbnNpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFeHBhbnNpb25DaGFuZ2VkRXZlbnQ8VD4+KCk7XG5cbiAgLy8gRm9yIGNvbnRleHQgbWVudSBvcHRpb25cbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBCaW5kIE9uZSBHcmlkIFBhZ2luYXRpb24gRmVhdHVyZVxuICAgKi9cbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcztcbiAgQE91dHB1dCgpIGdvVG9GaXJzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9QcmV2aW91cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub0xhc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBPbmUgR3JpZCBQcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYm9keVNjcm9sbExlZnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX29uZVJvd051bWJlckNvbHVtbkRlZjogT25lQ29sdW1uRGVmID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBhcGk6IE9uZUdyaWRBcGksXG4gICAgcHJvdGVjdGVkIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuXG4gICAgaWYgKGNoYW5nZXNbJ21hc3Rlck5vZGUnXSAmJiBjaGFuZ2VzWydtYXN0ZXJOb2RlJ10uaXNGaXJzdENoYW5nZSkge1xuXG4gICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgJiYgdGhpcy5tYXN0ZXJOb2RlLmV4cGFuZGVkICYmIHRoaXMuZ3JpZFR5cGUgPT09ICdkZXRhaWwnKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRSb3dEYXRhKFsuLi50aGlzLm1hc3Rlck5vZGUuZGV0YWlsUm93RGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJyb3dEYXRhXCJdPy5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLnRyZWVEYXRhIHx8IHRoaXMubWFzdGVyRGV0YWlsID8gdGhpcy5hcGkudXBkYXRlUm93RGF0YSh0aGlzLnJvd0RhdGEpIDogdGhpcy5hcGkuc2V0Um93RGF0YSh0aGlzLnJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgbGF0ZXIgY2hhbmdlcy4gVGhlIGZpcnN0IG9uZSBhcnJpdmVzIGJlZm9yZSBuZ09uSW5pdCBoYXMgcnVuXG4gICAgLy8gYXBpLmluaXQsIHNvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgYXJlIG5vdCByZWdpc3RlcmVkIHlldCBhbmQgdGhlIGJvZHlcbiAgICAvLyBoYXMgbm90IHN1YnNjcmliZWQg4oCUIHRoZSBpbml0aWFsIGxvYWQgaGFwcGVucyBpbiBuZ0FmdGVyVmlld0luaXQgaW5zdGVhZC5cbiAgICBpZiAoY2hhbmdlc1tcInBpbm5lZFRvcFJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJwaW5uZWRUb3BSb3dEYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldFBpbm5lZFJvd0RhdGEoJ3RvcCcsIHRoaXMucGlubmVkVG9wUm93RGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJwaW5uZWRCb3R0b21Sb3dEYXRhXCJdICYmICFjaGFuZ2VzW1wicGlubmVkQm90dG9tUm93RGF0YVwiXS5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogSW5pdCBSb3cgTnVtYmVyIENvbHVtbiBEZWZcbiAgICAgKi9cbiAgICBpZiAodGhpcy5yb3dOdW1iZXIpIHtcblxuICAgICAgIHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiA9IHtcbiAgICAgICAgICBncm91cElkOiB0aGlzLmNvbHVtbkRlZnNbMF0/Lmdyb3VwSWQgPz8gbnVsbCxcbiAgICAgICAgICBmaWVsZDogJ19vbmVSb3dOdW1iZXInLFxuICAgICAgICAgIGhlYWRlck5hbWU6ICdOwronLFxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgICAgICBoZWFkZXJTdHlsZToge1xuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIGFsaWduSXRlbTogJ2NlbnRlcidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsaWduQ29udGVudDogJ3JpZ2h0JyxcbiAgICAgICAgICBjZWxsQ2xhc3M6ICdmdy1ib2xkJyxcbiAgICAgICAgICB3aWR0aDogNjAsXG4gICAgICAgICAgbWluV2lkdGg6IDQwLFxuICAgICAgICAgIG1heFdpZHRoOiAyMDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgT25lIEdyaWQgQVBJXG4gICAgICovXG4gICAgdGhpcy5hcGkuaW5pdCh7XG4gICAgICBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnM6IHRoaXMuY29sdW1uRGVmcyxcbiAgICAgIGRlZmF1bHRDb2x1bW5EZWY6IHRoaXMuZGVmYXVsdENvbHVtbkRlZixcbiAgICAgIGdyb3VwQ29sdW1uRGVmczogdGhpcy5ncm91cENvbHVtbkRlZnMsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICByb3dTZWxlY3Rpb246IHRoaXMucm93U2VsZWN0aW9uLFxuICAgICAgbWFzdGVyRGV0YWlsOiB0aGlzLm1hc3RlckRldGFpbCxcbiAgICAgIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsXG4gICAgICBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIHRyZWVEYXRhOiB0aGlzLnRyZWVEYXRhLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogU2V0dXAgTWFzdGVyIERldGFpbCBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQpO1xuICAgICAgdGhpcy5hcGkuc2V0R2V0RGV0YWlsUm93RGF0YSh0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZ2V0RGV0YWlsUm93RGF0YSA/PyBudWxsKTtcblxuICAgICAgaWYgKHRoaXMucm93TnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3QgY29sdW1uRGVmcyA9IF8uY29uY2F0KHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBpLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHVwIFRyZWUgRGF0YSBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5ncmlkVHlwZSA9ICd0cmVlJztcblxuICAgICAgY29uc3QgY29sdW1uRGVmcyA9IHRoaXMucm93TnVtYmVyID8gXy5jb25jYXQodGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmLCB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKSA6IF8uY29uY2F0KHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLCB0aGlzLmNvbHVtbkRlZnMpO1xuXG4gICAgICB0aGlzLmFwaS5zZXRUcmVlRGF0YUNoaWxkcmVuRmllbGQodGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQpO1xuICAgICAgdGhpcy5hcGkuc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQodGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcGkuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIFNlbGVjdGlvbiBDaGFuZ2VkIEV2ZW50XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25DaGFuZ2VkJywgKHBheWxvYWQ6IFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBoZWFkZXIgZm9sbG93cyB0aGUgYm9keSB0aHJvdWdoIChib2R5U2Nyb2xsKSAtPiBbc2Nyb2xsTGVmdF0uIEEgc2Vjb25kXG4gICAgLy8gc3Vic2NyaXB0aW9uIHVzZWQgdG8gbGl2ZSBoZXJlIHRoYXQgcXVlcmllZCAnLm9uZS1ncmlkLWhlYWRlci1jb2x1bW4nIOKAlCBhXG4gICAgLy8gaGVhZGVyICpjZWxsKiwgbm90IHRoZSB2aWV3cG9ydCDigJQgYW5kIGFzc2lnbmVkIHNjcm9sbExlZnQgdG8gaXQsIHdoaWNoXG4gICAgLy8gZG9lcyBub3RoaW5nLiBJdCBoYXMgYmVlbiByZW1vdmVkIHJhdGhlciB0aGFuIHJlcGFpcmVkOiB0aGUgYmluZGluZyBwYXRoXG4gICAgLy8gaXMgdGhlIG9uZSB0aGF0IHdvcmtzLCBhbmQgaXQgbm93IGRyaXZlcyB0aGUgcGlubmVkIGNvbHVtbnMgdG9vLlxuXG4gICAgLy8gUGlubmVkIHJvd3MsIG5vdyB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgYm9keSBpc1xuICAgIC8vIGxpc3RlbmluZy4gVW5saWtlIHJvd0RhdGEgdGhlc2UgYXJlIG5vdCBsb2FkZWQgdGhyb3VnaCAob25HcmlkUmVhZHkpIOKAlFxuICAgIC8vIGJpbmRpbmcgdGhlbSBpcyB0aGUgd2hvbGUgY29udHJhY3Qg4oCUIHNvIHRoZSBncmlkIGxvYWRzIHRoZW0gaXRzZWxmLlxuICAgIGlmICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCd0b3AnLCB0aGlzLnBpbm5lZFRvcFJvd0RhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgR3JpZCBSZWFkeSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMub25HcmlkUmVhZHkuZW1pdCh7IGFwaTogdGhpcy5hcGkgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEJvZHkgU2Nyb2xsIEV2ZW50XG4gICAqL1xuICBvbkJvZHlTY3JvbGwoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmJvZHlTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUmVhZHkgRXZlbnQgb2YgYSBuZXN0ZWQgTWFzdGVyIERldGFpbCBHcmlkXG4gICAqL1xuICBvbkRldGFpbEdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzaW5nIGNvcHkgZXZlbnQgdG8gZ3JpZCBib2R5XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgdGhpcy5ncmlkQ29weSQubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25WaWV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dWaWV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ29weShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q29weS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3QoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRWRpdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RWRpdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3RvcnkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25PcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd09wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1NlbGVjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVNoaWZ0RG91YmxlQ2xpY2soZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblNoaWZ0RG91YmxlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dDb3VudENoYW5nZWQobGVuZ3RoOiBudW1iZXIpIHtcblxuICAgIHRoaXMucm93Q291bnRDaGFuZ2VkLmVtaXQobGVuZ3RoKTtcbiAgfVxuXG4gIGNlbGxPcHRpb25NZW51U2VsZWN0ZWQoZXZlbnQ6IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCkge1xuXG4gICAgdGhpcy5jZWxsT3B0aW9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmcgUGFnaW5hdGlvbiBFdmVudHMgdG8gUGFyZW50IENvbXBvbmVudFxuICAgKi9cbiAgaW52b2tlR29Ub0ZpcnN0KCkge1xuXG4gICAgdGhpcy5nb1RvRmlyc3QuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub1ByZXZpb3VzKCkge1xuXG4gICAgdGhpcy5nb1RvUHJldmlvdXMuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub05leHQoKSB7XG5cbiAgICB0aGlzLmdvVG9OZXh0LmVtaXQoKTtcbiAgfVxuXG4gIGludm9rZUdvVG9MYXN0KCkge1xuXG4gICAgdGhpcy5nb1RvTGFzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7XG5cbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQocGFnZVNpemUpO1xuICB9XG5cbiAgaW52b2tlUm93RHJhZ0VuZChldmVudDogT25lUm93RHJhZ0V2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLnJvd0RyYWdFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPikge1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVbnN1YnNjcmliZSBBbGwgRXZlbnQgTGlzdGVuZGVyc1xuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICB0aGlzLnJvd0RhdGEgPSBbXTtcblxuICAgIHRoaXMuYXBpLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8IS0tIE5vIHRhYmluZGV4IGhlcmUuIFRoZSB0YWIgc3RvcCBiZWxvbmdzIG9uIHRoZSBib2R5IHZpZXdwb3J0LCB3aGljaCBpcyB0aGVcbiAgICAgZWxlbWVudCB0aGF0IGFjdHVhbGx5IHNjcm9sbHM7IGEgZm9jdXNhYmxlIHdyYXBwZXIgYXJvdW5kIGEgc2Nyb2xsYWJsZVxuICAgICBjaGlsZCBpcyByZWFjaGFibGUgYnV0IGNhbm5vdCBiZSBzY3JvbGxlZCB3aXRoIHRoZSBrZXlib2FyZC4gVGhlIGNvcHlcbiAgICAgaGFuZGxlciBpcyB1bmFmZmVjdGVkOiBhIGNvcHkgZXZlbnQgZmlyZWQgYXQgdGhlIGZvY3VzZWQgdmlld3BvcnQgYnViYmxlc1xuICAgICB1cCB0byBoZXJlLiAtLT5cbjxkaXYgI29nUmVmIGNsYXNzPVwib25lLWdyaWRcIiAoY29weSk9XCJvbkdyaWRDb3B5KCRldmVudClcIj5cbiAgICBcbiAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgPG9uZS1ncmlkLWhlYWRlclxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtlbmFibGVHcm91cENvbHVtbkRlZnNdPVwiZW5hYmxlR3JvdXBDb2x1bW5EZWZzXCJcbiAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgW3Njcm9sbExlZnRdPVwiYm9keVNjcm9sbExlZnRcIlxuICAgIC8+XG5cbiAgICA8IS0tIEJvZHkgLS0+XG4gICAgPG9uZS1ncmlkLWJvZHlcbiAgICAgICAgW2dyaWRDb3B5JF09XCJncmlkQ29weSRcIlxuICAgICAgICBbcm93RGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgW3Bpbm5lZFRvcFJvd0RhdGFdPVwicGlubmVkVG9wUm93RGF0YVwiXG4gICAgICAgIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInBpbm5lZEJvdHRvbVJvd0RhdGFcIlxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtyb3dOdW1iZXJdPVwicm93TnVtYmVyXCJcbiAgICAgICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgIFt0cmVlRGF0YV09XCJ0cmVlRGF0YVwiXG4gICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgW21hc3Rlck5vZGVdPVwibWFzdGVyTm9kZVwiXG4gICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgW2RldGFpbFJlbmRlcmVyQ29tcG9uZW50XT1cImRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgW2RldGFpbEdyaWRUZW1wbGF0ZV09XCJkZXRhaWxHcmlkVHBsXCJcbiAgICAgICAgW3RyZWVEYXRhQ2hpbGRyZW5GaWVsZF09XCJ0cmVlRGF0YUNoaWxkcmVuRmllbGRcIlxuICAgICAgICBbYXV0b0dyb3VwQ29sdW1uRGVmXT1cImF1dG9Hcm91cENvbHVtbkRlZlwiXG4gICAgICAgIFtncm91cERlZmF1bHRFeHBhbmRlZF09XCJncm91cERlZmF1bHRFeHBhbmRlZFwiXG4gICAgICAgIChyb3dEcmFnRW5kKT1cImludm9rZVJvd0RyYWdFbmQoJGV2ZW50KVwiXG4gICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAob25Sb3dBZGROZXcpPVwiaW52b2tlUm93QWN0aW9uQWRkTmV3KCRldmVudClcIlxuICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dEb2N1bWVudCk9XCJpbnZva2VSb3dBY3Rpb25Eb2N1bWVudCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAob25Sb3dHb3RvTGlzdCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93SGlzdG9yeSk9XCJpbnZva2VSb3dBY3Rpb25IaXN0b3J5KCRldmVudClcIlxuICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q2VsbE9wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dTZWxlY3Rpb24pPVwiaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAob25TaGlmdERvdWJsZUNsaWNrKT1cImludm9rZVNoaWZ0RG91YmxlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChyb3dDb3VudENoYW5nZWQpPVwiaW52b2tlUm93Q291bnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoY2VsbE9wdGlvblNlbGVjdCk9XCJjZWxsT3B0aW9uTWVudVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoYm9keVNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiXG4gICAgLz5cbiAgICBcbiAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgQGlmIChwYWdpbmF0aW9uKSB7XG4gICAgICAgIDxvbmUtZ3JpZC1wYWdpbmF0aW9uXG4gICAgICAgICAgICBbcGFnaW5hdGVdPVwicGFnaW5hdGVcIlxuICAgICAgICAgICAgKGdvVG9GaXJzdCk9XCJpbnZva2VHb1RvRmlyc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub0xhc3QpPVwiaW52b2tlR29Ub0xhc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub1ByZXZpb3VzKT1cImludm9rZUdvVG9QcmV2aW91cygpXCJcbiAgICAgICAgICAgIChnb1RvTmV4dCk9XCJpbnZva2VHb1RvTmV4dCgpXCJcbiAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJpbnZva2VQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICB9XG5cbiAgICA8IS0tIE1hc3RlciBEZXRhaWwgR3JpZCB0ZW1wbGF0ZSwgcmVuZGVyZWQgaW5zaWRlIG9uZS1ncmlkLWJvZHkgdmlhIG5nVGVtcGxhdGVPdXRsZXQuXG4gICAgICAgICBEZWNsYXJlZCBoZXJlIChzZWxmLXJlZmVyZW5jZSkgc28gb25lLWdyaWQtYm9keSdzIHRlbXBsYXRlIGRvZXMgbm90IG5lZWQgdG9cbiAgICAgICAgIGltcG9ydCBvbmUtZ3JpZCwgd2hpY2ggd291bGQgY3JlYXRlIGFuIHVuc3VwcG9ydGVkIGNvbXBpbGUtdGltZSBjeWNsZS4gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNkZXRhaWxHcmlkVHBsIGxldC1ub2RlPVwibm9kZVwiPlxuICAgICAgICA8b25lLWdyaWRcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibm9kZS5kZXRhaWxSb3dIZWlnaHRcIlxuICAgICAgICAgICAgW2dyaWRUeXBlXT1cIidkZXRhaWwnXCJcbiAgICAgICAgICAgIFttYXN0ZXJOb2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICAgICAgW2RlZmF1bHRDb2x1bW5EZWZdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmRlZmF1bHRDb2x1bW5EZWZcIlxuICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmNvbHVtbkRlZnNcIlxuICAgICAgICAgICAgW3Jvd0RhdGFdPVwibm9kZT8uZGV0YWlsUm93RGF0YVwiXG4gICAgICAgICAgICBbcm93TnVtYmVyXT1cImRldGFpbENlbGxSZW5kZXJlclBhcmFtcy5kZXRhaWxHcmlkT3B0aW9ucz8ucm93TnVtYmVyXCJcbiAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICBbc3VibWl0dGVkXT1cInN1Ym1pdHRlZFwiXG4gICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9EZXRhaWwpPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25HcmlkUmVhZHkpPVwib25EZXRhaWxHcmlkUmVhZHkoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PiJdfQ==
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb21wb25lbnRzL29uZS1ncmlkL29uZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuTCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV0RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxN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Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBT0csV0FBVztzQkFBcEIsTUFBTTtnQkFPRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR0csV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxhQUFhO3NCQUF0QixNQUFNO2dCQUdHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUtFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFVRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZFJlYWR5RXZlbnQsIE9uZUdyaWRSb3dBY3Rpb25FdmVudCwgT25lR3JpZFR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZ3JpZC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZVBhZ2luYXRpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcGFnaW5hdGlvbi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50LCBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbk1vdmVkRXZlbnQsIENvbHVtblJlc2l6ZWRFdmVudCwgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50LCBSb3dTZWxlY3Rpb25Nb2RlLCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQsIFNvcnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXhwYW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZFJvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLXJvdy5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS10cmVlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZFJvd0RyYWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3ctZHJhZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZVJvd0RyYWdFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbCc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGFnZ0NvbHVtbnMsIE9ORV9HUk9VUF9DSElMRFJFTl9GSUVMRCwgT05FX0dST1VQX1ZBTFVFX0ZJRUxELCByb3dHcm91cEZpZWxkcyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLXJvdy1ncm91cGluZy5oZWxwZXInO1xuaW1wb3J0IHsgT25lR3JpZEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLWhlYWRlci9vbmUtZ3JpZC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVHcmlkUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLXBhZ2luYXRpb24vb25lLWdyaWQtcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgT25lR3JpZEhlYWRlckNvbXBvbmVudCxcbiAgICBPbmVHcmlkQm9keUNvbXBvbmVudCxcbiAgICBPbmVHcmlkUGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgXSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9vbmUtZ3JpZC5jb21wb25lbnQuc2NzcycsXG4gIHByb3ZpZGVyczogW1xuICAgIE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgT25lR3JpZEFwaSxcbiAgICBPZ0NvbHVtblNlcnZpY2UsXG4gICAgT25lR3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UsXG4gICAgT25lR3JpZFJvd1NlcnZpY2UsXG4gICAgT25lR3JpZENlbGxTZXJ2aWNlLFxuICAgIE9uZUdyaWRSb3dEcmFnU2VydmljZVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEdldCBHZW5lcmFsIERhdGEgZnJvbSBQYXJlbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ29nUmVmJywgeyBzdGF0aWM6IHRydWUgfSkgb2dSZWYhOiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSByb3dOdW1iZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYWxsb3dlZEVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzdWJtaXR0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY29udGV4dDogYW55ID0gbnVsbDtcbiAgQElucHV0KCkgcm93RGF0YTogVFtdID0gW107XG4gIEBJbnB1dCgpIHJvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uTW9kZSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBncmlkJ3MgYWNjZXNzaWJsZSBuYW1lLlxuICAgKlxuICAgKiBBIGByb2xlPVwiZ3JpZFwiYCB3aXRoIG5vIG5hbWUgaXMgYW5ub3VuY2VkIGFzIGFuIHVubGFiZWxsZWQgZ3JpZCwgd2hpY2hcbiAgICogdGVsbHMgYSBzY3JlZW4tcmVhZGVyIHVzZXIgbm90aGluZyBhYm91dCB3aGF0IHRoZXkgaGF2ZSBsYW5kZWQgaW4uIFNldCBpdFxuICAgKiB0byB3aGF0ZXZlciB0aGUgZ3JpZCBpcyBzaG93aW5nIOKAlCBcIkVtcGxveWVlc1wiLCBcIk9yZGVyIGxpbmVzXCIuXG4gICAqL1xuICBASW5wdXQoKSBncmlkTGFiZWw6IHN0cmluZyA9ICdEYXRhIGdyaWQnO1xuXG4gIEBJbnB1dCgpIGVuYWJsZUdyb3VwQ29sdW1uRGVmczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBncm91cENvbHVtbkRlZnM6IE9uZUdyb3VwQ29sdW1uRGVmW10gPSBbXTtcblxuICBASW5wdXQoKSBkZWZhdWx0Q29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD4gPSB7fTtcbiAgQElucHV0KCkgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcblxuICAvKipcbiAgICogUm93cyBhbmNob3JlZCBhYm92ZSB0aGUgc2Nyb2xsaW5nIGFyZWEg4oCUIGEgaGVhZGVyIHN1bW1hcnksIG9yIGFuIGVudHJ5IGxpbmUuXG4gICAqIFRoZXkga2VlcCBjb2x1bW4gYWxpZ25tZW50IGFuZCBzY3JvbGwgc2lkZXdheXMgd2l0aCB0aGUgYm9keSwgYnV0IGFyZSBub3RcbiAgICogZGF0YTogc29ydGluZywgZmlsdGVyaW5nLCBzZWxlY3Rpb24gYW5kIHRoZSByb3cgY291bnQgYWxsIHBhc3MgdGhlbSBieS5cbiAgICovXG4gIEBJbnB1dCgpIHBpbm5lZFRvcFJvd0RhdGE6IFRbXSA9IFtdO1xuXG4gIC8qKiBSb3dzIGFuY2hvcmVkIGJlbG93IHRoZSBzY3JvbGxpbmcgYXJlYSwgdHlwaWNhbGx5IGEgdG90YWxzIHJvdy4gKi9cbiAgQElucHV0KCkgcGlubmVkQm90dG9tUm93RGF0YTogVFtdID0gW107XG5cbiAgLy8gUlhKUyBQcm9wZXJ0aWVzXG4gIHByb3RlY3RlZCBncmlkQ29weSQgPSBuZXcgU3ViamVjdDxDbGlwYm9hcmRFdmVudD4oKTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBGZWF0dXJlXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnbWFzdGVyJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGUgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ6IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogVHJlZSBEYXRhIEZlYXR1cmVcbiAgICovXG4gIEBJbnB1dCgpIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY7XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBCaW5kIFJvdyBBY3Rpb24gRXZlbnRzICYgRGF0YSB0byBQYXJlbnRcbiAgICovXG4gIC8qKlxuICAgKiBBIHJvdyBmaW5pc2hlZCBtb3ZpbmcuIEZpcmVzIG9uY2UgcGVyIGNvbXBsZXRlZCByZW9yZGVyIOKAlCBub3Qgd2hpbGUgdGhlXG4gICAqIHBvaW50ZXIgaXMgaW4gZmxpZ2h0IOKAlCBhbmQgb25seSB3aGVuIHRoZSBwb3NpdGlvbiBhY3R1YWxseSBjaGFuZ2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZVJvd0RyYWdFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogVGhlIGhlYWRlcidzIOKLriBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoaXMgY29sdW1uLlxuICAgKlxuICAgKiBUaGUgZ3JpZCBoYXMgbm8gY29sdW1uIG1lbnUgb2YgaXRzIG93biDigJQgdGhpcyByZXBvcnRzIHRoZSBpbnRlbnQgc28gdGhlXG4gICAqIGhvc3QgY2FuIHNob3cgd2hhdGV2ZXIgYSBjb2x1bW4gbWVudSBtZWFucyBpbiBpdHMgYXBwLiBTZXRcbiAgICogYGNvbHVtbkRlZi5zdXBwcmVzc0hlYWRlck1lbnVCdXR0b25gIHRvIGhpZGUgdGhlIGJ1dHRvbiBlbnRpcmVseS5cbiAgICovXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUNvbHVtbkRlZjxUPj4oKTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBncmlkJ3Mgb3duIGNvbHVtbiBtZW51IGJlaGluZCB0aGUgaGVhZGVyIOKLriBidXR0b246IHNvcnQsIHBpbixcbiAgICogaGlkZS4gT3B0LWluIOKAlCBhIGhvc3QgdGhhdCBidWlsdCBpdHMgbWVudSBvbiBgKGhlYWRlck1lbnVDbGljaylgIGtlZXBzXG4gICAqIGV4YWN0bHkgd2hhdCBpdCBoYWQsIGFuZCB0aGUgaW50ZW50IHN0aWxsIGVtaXRzIGVpdGhlciB3YXkuXG4gICAqL1xuICBASW5wdXQoKSBoZWFkZXJNZW51OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIGZpbHRlciBpbnB1dCB1bmRlciBldmVyeSBjb2x1bW4gd2hvc2UgYGZpbHRlcmFibGVgIHJlc29sdmVzXG4gICAqIHRydWUuIFRoZSBpbnB1dHMgZmVlZCBgYXBpLnNldEZpbHRlck1vZGVsYCB3aXRoIGNvbnRhaW5zLWNvbmRpdGlvbnMsXG4gICAqIGRlYm91bmNlZDsgZmlsdGVycyBvbiBmaWVsZHMgd2l0aG91dCBhbiBpbnB1dCBhcmUgbGVmdCB1bnRvdWNoZWQuXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJSb3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVjb3JkIGNvbW1pdHRlZCBjZWxsIGVkaXRzIHNvIGBhcGkudW5kb0NlbGxFZGl0aW5nYCAvXG4gICAqIGBhcGkucmVkb0NlbGxFZGl0aW5nYCAoYW5kIEN0cmwrWiAvIEN0cmwrWSBpbiB0aGUgZ3JpZCkgY2FuIHdhbGsgdGhlbS5cbiAgICogUHJvZ3JhbW1hdGljIGBzZXREYXRhVmFsdWVgIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkLlxuICAgKi9cbiAgQElucHV0KCkgdW5kb1JlZG9DZWxsRWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBIb3cgbWFueSBlZGl0cyB0aGUgdW5kbyBzdGFjayBrZWVwcy4gKi9cbiAgQElucHV0KCkgdW5kb1JlZG9DZWxsRWRpdGluZ0xpbWl0OiBudW1iZXIgPSAxMDtcblxuICAvKipcbiAgICogYCdmdWxsUm93J2Agb3BlbnMgZXZlcnkgZWRpdGFibGUgY2VsbCBvZiB0aGUgcm93IG9uIGEgZG91YmxlLWNsaWNrIGFuZFxuICAgKiBjb21taXRzIHRoZW0gdG9nZXRoZXIg4oCUIEVudGVyIGFueXdoZXJlIGluIHRoZSByb3csIG9yIGZvY3VzIGxlYXZpbmcgdGhlXG4gICAqIHJvdy4gRXNjYXBlIGNsb3NlcyB0aGUgd2hvbGUgcm93IHdpdGhvdXQgY29tbWl0dGluZy4gRGVmYXVsdDogY2VsbHMgZWRpdFxuICAgKiBvbmUgYXQgYSB0aW1lLlxuICAgKi9cbiAgQElucHV0KCkgZWRpdFR5cGU6ICdmdWxsUm93JyB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSBvbkdyaWRSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJlYWR5RXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9EZXRhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93QWRkTmV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q29weSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93R290b0xpc3QgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dQcmludCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dIaXN0b3J5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd09wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMYW5ndWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uU2hpZnREb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgcm93Q291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogVGhlIHNvcnQgbW9kZWwgY2hhbmdlZCDigJQgYSBoZWFkZXIgY2xpY2sgb3IgYGFwaS5vblNvcnRDaGFuZ2VkYC4gQ2Fycmllc1xuICAgKiB0aGUgcmUtc29ydGVkIG5vZGVzIGFuZCB0aGUgbW9kZWwgdGhhdCBwcm9kdWNlZCB0aGVtOyBgYXBpLnNvcnRNb2RlbGBcbiAgICogc3RheXMgcmVhZGFibGUgYmV0d2VlbiBlbWlzc2lvbnMuXG4gICAqL1xuICBAT3V0cHV0KCkgc29ydENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnRDaGFuZ2VkRXZlbnQ8VD4+KCk7XG5cbiAgLyoqXG4gICAqIEFuIGlubGluZSBlZGl0IHdhcyBjb21taXR0ZWQgd2l0aCBhIHZhbHVlIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgaXRcbiAgICogc3RhcnRlZCB3aXRoLiBQcm9ncmFtbWF0aWMgYG5vZGUuc2V0RGF0YVZhbHVlYCBkb2VzIG5vdCBlbWl0IGhlcmUg4oCUIHRoZVxuICAgKiBjYWxsZXIgYWxyZWFkeSBob2xkcyBib3RoIHZhbHVlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBjZWxsVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsVmFsdWVDaGFuZ2VkRXZlbnQ8VD4+KCk7XG5cbiAgLyoqIEEgaGVhZGVyIGRyYWcgZmluaXNoZWQgc29tZXdoZXJlIG90aGVyIHRoYW4gd2hlcmUgaXQgc3RhcnRlZC4gKi9cbiAgQE91dHB1dCgpIGNvbHVtbk1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5Nb3ZlZEV2ZW50PigpO1xuXG4gIC8qKiBBIHJlc2l6ZSBnZXN0dXJlIGZpbmlzaGVkIOKAlCBvbmUgZXZlbnQgcGVyIGdlc3R1cmUsIG5vdCBwZXIgcGl4ZWwuICovXG4gIEBPdXRwdXQoKSBjb2x1bW5SZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5SZXNpemVkRXZlbnQ+KCk7XG5cbiAgLy8gRm9yIGNvbnRleHQgbWVudSBvcHRpb25cbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBCaW5kIE9uZSBHcmlkIFBhZ2luYXRpb24gRmVhdHVyZVxuICAgKi9cbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcztcblxuICAvKipcbiAgICogTGV0IHRoZSBncmlkIHBhZ2UgaXRzIG93biByb3dzLiBUaGUgYmFyIHJlbmRlcnMsIHRoZSBncmlkIHNsaWNlcyB0aGVcbiAgICogZmlsdGVyZWQgcm93cyB0byB0aGUgY3VycmVudCBwYWdlLCBhbmQgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyB3b3JrXG4gICAqIHdpdGhvdXQgdGhlIGhvc3QgaGFuZGxpbmcgYW55dGhpbmcg4oCUIGBbcGFnaW5hdGVdYCBpcyBpZ25vcmVkIGluIHRoaXNcbiAgICogbW9kZSAodGhlIGdyaWQgb3ducyB0aG9zZSBudW1iZXJzKSBleGNlcHQgZm9yIGBwYWdlU2l6ZU9wdGlvbnNgLiBUaGVcbiAgICogbmF2aWdhdGlvbiBvdXRwdXRzIHN0aWxsIGVtaXQsIGFzIG5vdGlmaWNhdGlvbnMgcmF0aGVyIHRoYW4gaW50ZW50cy5cbiAgICogU2VsZWN0aW9uLCBmaWx0ZXJpbmcgYW5kIHNvcnRpbmcga2VlcCBvcGVyYXRpbmcgb24gdGhlIHdob2xlIGRhdGFzZXQuXG4gICAqL1xuICBASW5wdXQoKSBjbGllbnRTaWRlUGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBSb3dzIHBlciBwYWdlIGZvciBgY2xpZW50U2lkZVBhZ2luYXRpb25gLiAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMjU7XG5cbiAgQE91dHB1dCgpIGdvVG9GaXJzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9QcmV2aW91cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub0xhc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBUaGUgcGFnaW5nIG51bWJlcnMgdGhlIGJhciBzaG93cyB3aGVuIHRoZSBncmlkIHBhZ2VzIGl0cyBvd24gcm93cy4gKi9cbiAgcHJvdGVjdGVkIGludGVybmFsUGFnaW5hdGU6IE9uZVBhZ2luYXRpb25QYXJhbXMgPSB7XG4gICAgdG90YWw6IDAsIGN1cnJlbnRQYWdlOiAxLCBsYXN0UGFnZTogMSwgcGVyUGFnZTogMjUsIGZpcnN0Um93SW5kZXg6IDAsIGxhc3RSb3dJbmRleDogMCxcbiAgfTtcblxuICAvKipcbiAgICogUmVjb21wdXRlIHRoZSBiYXIncyBudW1iZXJzIGZyb20gdGhlIGZpbHRlcmVkIHJvdyBjb3VudCBhbmQgdGhlIEFQSSdzXG4gICAqIHBhZ2luZyBzdGF0ZS4gRGVmZXJyZWQgYSB0aWNrIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGFyaWEgY291bnRzIGFyZTpcbiAgICogdGhlIGNvdW50IGFycml2ZXMgd2hpbGUgdGhlIGZpcnN0IGNoYW5nZSBkZXRlY3Rpb24gcGFzcyBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoQ2xpZW50UGFnaW5hdGlvbih0b3RhbDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBjb25zdCB7IHBhZ2VTaXplLCBjdXJyZW50UGFnZSB9ID0gdGhpcy5hcGkucGFnaW5hdGlvblN0YXRlO1xuXG4gICAgY29uc3QgbGFzdFBhZ2UgPSBNYXRoLm1heChNYXRoLmNlaWwodG90YWwgLyBwYWdlU2l6ZSksIDEpO1xuICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1pbihjdXJyZW50UGFnZSwgbGFzdFBhZ2UpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIHRoaXMuaW50ZXJuYWxQYWdpbmF0ZSA9IHtcbiAgICAgICAgdG90YWwsXG4gICAgICAgIGN1cnJlbnRQYWdlOiBwYWdlLFxuICAgICAgICBsYXN0UGFnZSxcbiAgICAgICAgcGVyUGFnZTogcGFnZVNpemUsXG4gICAgICAgIGZpcnN0Um93SW5kZXg6IHRvdGFsID09PSAwID8gMCA6IChwYWdlIC0gMSkgKiBwYWdlU2l6ZSArIDEsXG4gICAgICAgIGxhc3RSb3dJbmRleDogTWF0aC5taW4ocGFnZSAqIHBhZ2VTaXplLCB0b3RhbCksXG4gICAgICAgIHBhZ2VTaXplT3B0aW9uczogdGhpcy5wYWdpbmF0ZT8ucGFnZVNpemVPcHRpb25zLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT25lIEdyaWQgUHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIGJvZHlTY3JvbGxMZWZ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9vbmVSb3dOdW1iZXJDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiA9IG51bGw7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYXBpOiBPbmVHcmlkQXBpLFxuICAgIHByb3RlY3RlZCBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cbiAgICBpZiAoY2hhbmdlc1snbWFzdGVyTm9kZSddICYmIGNoYW5nZXNbJ21hc3Rlck5vZGUnXS5pc0ZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCAmJiB0aGlzLm1hc3Rlck5vZGUuZXhwYW5kZWQgJiYgdGhpcy5ncmlkVHlwZSA9PT0gJ2RldGFpbCcpIHtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBpLnNldFJvd0RhdGEoWy4uLnRoaXMubWFzdGVyTm9kZS5kZXRhaWxSb3dEYXRhXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzW1wicm93RGF0YVwiXSAmJiAhY2hhbmdlc1tcInJvd0RhdGFcIl0/LmZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIHRoaXMudHJlZURhdGEgfHwgdGhpcy5tYXN0ZXJEZXRhaWwgPyB0aGlzLmFwaS51cGRhdGVSb3dEYXRhKHRoaXMucm93RGF0YSkgOiB0aGlzLmFwaS5zZXRSb3dEYXRhKHRoaXMucm93RGF0YSk7XG4gICAgfVxuXG4gICAgLy8gT25seSBsYXRlciBjaGFuZ2VzLiBUaGUgZmlyc3Qgb25lIGFycml2ZXMgYmVmb3JlIG5nT25Jbml0IGhhcyBydW5cbiAgICAvLyBhcGkuaW5pdCwgc28gdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBhcmUgbm90IHJlZ2lzdGVyZWQgeWV0IGFuZCB0aGUgYm9keVxuICAgIC8vIGhhcyBub3Qgc3Vic2NyaWJlZCDigJQgdGhlIGluaXRpYWwgbG9hZCBoYXBwZW5zIGluIG5nQWZ0ZXJWaWV3SW5pdCBpbnN0ZWFkLlxuICAgIGlmIChjaGFuZ2VzW1wicGlubmVkVG9wUm93RGF0YVwiXSAmJiAhY2hhbmdlc1tcInBpbm5lZFRvcFJvd0RhdGFcIl0uZmlyc3RDaGFuZ2UpIHtcblxuICAgICAgdGhpcy5hcGkuc2V0UGlubmVkUm93RGF0YSgndG9wJywgdGhpcy5waW5uZWRUb3BSb3dEYXRhKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInBpbm5lZEJvdHRvbVJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJwaW5uZWRCb3R0b21Sb3dEYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldFBpbm5lZFJvd0RhdGEoJ2JvdHRvbScsIHRoaXMucGlubmVkQm90dG9tUm93RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvKipcbiAgICAgKiBJbml0IFJvdyBOdW1iZXIgQ29sdW1uIERlZlxuICAgICAqL1xuICAgIGlmICh0aGlzLnJvd051bWJlcikge1xuXG4gICAgICAgdGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmID0ge1xuICAgICAgICAgIGdyb3VwSWQ6IHRoaXMuY29sdW1uRGVmc1swXT8uZ3JvdXBJZCA/PyBudWxsLFxuICAgICAgICAgIGZpZWxkOiAnX29uZVJvd051bWJlcicsXG4gICAgICAgICAgaGVhZGVyTmFtZTogJ07CuicsXG4gICAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICAgIGhlYWRlclN0eWxlOiB7XG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgYWxpZ25JdGVtOiAnY2VudGVyJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYWxpZ25Db250ZW50OiAncmlnaHQnLFxuICAgICAgICAgIGNlbGxDbGFzczogJ2Z3LWJvbGQnLFxuICAgICAgICAgIHdpZHRoOiA2MCxcbiAgICAgICAgICBtaW5XaWR0aDogNDAsXG4gICAgICAgICAgbWF4V2lkdGg6IDIwMFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm93IGdyb3VwaW5nOiBjb2x1bW4gZGVmcyBkZWNsYXJpbmcgYHJvd0dyb3VwYCB0dXJuIHRoZSBncmlkIGludG8gYVxuICAgICAqIHRyZWUgb3ZlciBzeW50aGV0aWMgZ3JvdXAgcm93cy4gQ29uZmlndXJlZCBiZWZvcmUgYGFwaS5pbml0YCBiZWNhdXNlXG4gICAgICogZXZlcnl0aGluZyBkb3duc3RyZWFtIOKAlCB0aGUgdHJlZURhdGEgZmxhZyB0aGUgQVBJIGNhcHR1cmVzLCB0aGUgZ3JvdXBcbiAgICAgKiBjb2x1bW4gdGhlIHRyZWUgYmxvY2sgYmVsb3cgcHJlcGVuZHMg4oCUIGhhcyB0byBzZWUgdGhlIHRyZWUgc2hhcGUuXG4gICAgICovXG4gICAgY29uc3Qgcm93R3JvdXBDb2x1bW5GaWVsZHMgPSB0aGlzLnRyZWVEYXRhIHx8IHRoaXMubWFzdGVyRGV0YWlsXG4gICAgICA/IFtdXG4gICAgICA6IHJvd0dyb3VwRmllbGRzKHRoaXMuY29sdW1uRGVmcyk7XG5cbiAgICBpZiAocm93R3JvdXBDb2x1bW5GaWVsZHMubGVuZ3RoKSB7XG5cbiAgICAgIHRoaXMudHJlZURhdGEgPSB0cnVlO1xuICAgICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBPTkVfR1JPVVBfQ0hJTERSRU5fRklFTEQ7XG5cbiAgICAgIC8vIFRoZSBncm91cCBjb2x1bW46IGhvc3QtdHVuZWQgdGhyb3VnaCBhdXRvR3JvdXBDb2x1bW5EZWYsIGJ1dCBpdHNcbiAgICAgIC8vIGZpZWxkIGlzIGFsd2F5cyB0aGUgc3ludGhldGljIGxhYmVsIOKAlCB0aGF0IGlzIHdoZXJlIGEgZ3JvdXAgcm93XG4gICAgICAvLyBjYXJyaWVzIGl0cyBkaXNwbGF5IHZhbHVlLlxuICAgICAgdGhpcy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAgIGhlYWRlck5hbWU6ICdHcm91cCcsXG4gICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgIC4uLnRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLFxuICAgICAgICBmaWVsZDogT05FX0dST1VQX1ZBTFVFX0ZJRUxELFxuICAgICAgICAvLyBUaGUgbWFya2VyIHRoZSB0cmVlIG1hY2hpbmVyeSBrZXlzIG9uOiB0aGUgZXhwYW5kZXIgcmVuZGVycyBvbiB0aGlzXG4gICAgICAgIC8vIGNvbHVtbiBhbmQgZ3JvdXAgcm93cyBwcmludCB0aGVpciBsYWJlbCBoZXJlLlxuICAgICAgICBhdXRvR3JvdXBGaWVsZDogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEEgZ3JvdXBlZC1ieSBjb2x1bW4ncyB2YWx1ZSBpcyBvbiB0aGUgZ3JvdXAgcm93OyBzaG93aW5nIHRoZSBmbGF0XG4gICAgICAvLyBjb2x1bW4gdG9vIHJlcGVhdHMgaXQgZG93biBldmVyeSBsZWFmLiBIaWRkZW4sIG5vdCByZW1vdmVkIOKAlCB0aGVcbiAgICAgIC8vIGhvc3QgY2FuIGJyaW5nIGl0IGJhY2sgd2l0aCBhcGkuc2V0Q29sdW1uVmlzaWJsZS5cbiAgICAgIHRoaXMuY29sdW1uRGVmcyA9IHRoaXMuY29sdW1uRGVmcy5tYXAoY29sdW1uID0+XG4gICAgICAgIGNvbHVtbi5yb3dHcm91cCA/IHsgLi4uY29sdW1uLCBoaWRlOiB0cnVlIH0gOiBjb2x1bW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgT25lIEdyaWQgQVBJXG4gICAgICovXG4gICAgdGhpcy5hcGkuaW5pdCh7XG4gICAgICBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnM6IHRoaXMuY29sdW1uRGVmcyxcbiAgICAgIGRlZmF1bHRDb2x1bW5EZWY6IHRoaXMuZGVmYXVsdENvbHVtbkRlZixcbiAgICAgIGdyb3VwQ29sdW1uRGVmczogdGhpcy5ncm91cENvbHVtbkRlZnMsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICByb3dTZWxlY3Rpb246IHRoaXMucm93U2VsZWN0aW9uLFxuICAgICAgbWFzdGVyRGV0YWlsOiB0aGlzLm1hc3RlckRldGFpbCxcbiAgICAgIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsXG4gICAgICBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIHRyZWVEYXRhOiB0aGlzLnRyZWVEYXRhLFxuICAgIH0pO1xuXG4gICAgaWYgKHJvd0dyb3VwQ29sdW1uRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRSb3dHcm91cGluZyhyb3dHcm91cENvbHVtbkZpZWxkcywgYWdnQ29sdW1ucyh0aGlzLmNvbHVtbkRlZnMpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy51bmRvUmVkb0NlbGxFZGl0aW5nKSB7XG5cbiAgICAgIHRoaXMuYXBpLmVuYWJsZVVuZG9SZWRvQ2VsbEVkaXRpbmcodGhpcy51bmRvUmVkb0NlbGxFZGl0aW5nTGltaXQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldENsaWVudFNpZGVQYWdpbmF0aW9uKHRydWUsIHRoaXMucGFnaW5hdGU/LnBlclBhZ2UgPz8gdGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0dXAgTWFzdGVyIERldGFpbCBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQpO1xuICAgICAgdGhpcy5hcGkuc2V0R2V0RGV0YWlsUm93RGF0YSh0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZ2V0RGV0YWlsUm93RGF0YSA/PyBudWxsKTtcblxuICAgICAgaWYgKHRoaXMucm93TnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3QgY29sdW1uRGVmcyA9IF8uY29uY2F0KHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBpLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHVwIFRyZWUgRGF0YSBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5ncmlkVHlwZSA9ICd0cmVlJztcblxuICAgICAgY29uc3QgY29sdW1uRGVmcyA9IHRoaXMucm93TnVtYmVyID8gXy5jb25jYXQodGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmLCB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKSA6IF8uY29uY2F0KHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLCB0aGlzLmNvbHVtbkRlZnMpO1xuXG4gICAgICB0aGlzLmFwaS5zZXRUcmVlRGF0YUNoaWxkcmVuRmllbGQodGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQpO1xuICAgICAgdGhpcy5hcGkuc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQodGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcGkuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIFNlbGVjdGlvbiBDaGFuZ2VkIEV2ZW50XG4gICAgLy8gQ29sdW1ucyBjYW4gYmUgcmVwbGFjZWQgYXQgcnVudGltZSB0aHJvdWdoIGBhcGkuc2V0Q29sdW1uRGVmc2AsIGFuZFxuICAgIC8vIGBhcmlhLWNvbGNvdW50YCBoYXMgdG8gZm9sbG93LlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsICgpID0+IHtcblxuICAgICAgdGhpcy5hcmlhQ29sQ291bnQgPSB0aGlzLmFwaT8uZ2V0Q29sdW1uU3RhdGUoKT8uY29sdW1ucz8ubGVuZ3RoID8/IC0xO1xuICAgIH0pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uQ2hhbmdlZCcsIChwYXlsb2FkOiBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQuZW1pdChwYXlsb2FkKTtcbiAgICB9KSk7XG5cbiAgICAvLyBUaGUgaW50ZXJuYWwgZXZlbnRzIGEgaG9zdCBjYW4gYWN0IG9uLCBzdXJmYWNlZCBhcyBvdXRwdXRzLiBTYW1lXG4gICAgLy8gZm9yd2FyZGluZyBwYXR0ZXJuIGFzIHNlbGVjdGlvbkNoYW5nZWQgYWJvdmUuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzb3J0Q2hhbmdlZCcsIChwYXlsb2FkOiBTb3J0Q2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgICAgdGhpcy5zb3J0Q2hhbmdlZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY2VsbFZhbHVlQ2hhbmdlZCcsIChwYXlsb2FkOiBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgICB0aGlzLmNlbGxWYWx1ZUNoYW5nZWQuZW1pdChwYXlsb2FkKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbHVtbk1vdmVkJywgKHBheWxvYWQ6IENvbHVtbk1vdmVkRXZlbnQpID0+IHtcblxuICAgICAgICB0aGlzLmNvbHVtbk1vdmVkLmVtaXQocGF5bG9hZCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjb2x1bW5SZXNpemVkJywgKHBheWxvYWQ6IENvbHVtblJlc2l6ZWRFdmVudCkgPT4ge1xuXG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXplZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBoZWFkZXIgZm9sbG93cyB0aGUgYm9keSB0aHJvdWdoIChib2R5U2Nyb2xsKSAtPiBbc2Nyb2xsTGVmdF0uIEEgc2Vjb25kXG4gICAgLy8gc3Vic2NyaXB0aW9uIHVzZWQgdG8gbGl2ZSBoZXJlIHRoYXQgcXVlcmllZCAnLm9uZS1ncmlkLWhlYWRlci1jb2x1bW4nIOKAlCBhXG4gICAgLy8gaGVhZGVyICpjZWxsKiwgbm90IHRoZSB2aWV3cG9ydCDigJQgYW5kIGFzc2lnbmVkIHNjcm9sbExlZnQgdG8gaXQsIHdoaWNoXG4gICAgLy8gZG9lcyBub3RoaW5nLiBJdCBoYXMgYmVlbiByZW1vdmVkIHJhdGhlciB0aGFuIHJlcGFpcmVkOiB0aGUgYmluZGluZyBwYXRoXG4gICAgLy8gaXMgdGhlIG9uZSB0aGF0IHdvcmtzLCBhbmQgaXQgbm93IGRyaXZlcyB0aGUgcGlubmVkIGNvbHVtbnMgdG9vLlxuXG4gICAgLy8gUGlubmVkIHJvd3MsIG5vdyB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgYm9keSBpc1xuICAgIC8vIGxpc3RlbmluZy4gVW5saWtlIHJvd0RhdGEgdGhlc2UgYXJlIG5vdCBsb2FkZWQgdGhyb3VnaCAob25HcmlkUmVhZHkpIOKAlFxuICAgIC8vIGJpbmRpbmcgdGhlbSBpcyB0aGUgd2hvbGUgY29udHJhY3Qg4oCUIHNvIHRoZSBncmlkIGxvYWRzIHRoZW0gaXRzZWxmLlxuICAgIGlmICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCd0b3AnLCB0aGlzLnBpbm5lZFRvcFJvd0RhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgR3JpZCBSZWFkeSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMub25HcmlkUmVhZHkuZW1pdCh7IGFwaTogdGhpcy5hcGkgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEJvZHkgU2Nyb2xsIEV2ZW50XG4gICAqL1xuICBvbkJvZHlTY3JvbGwoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmJvZHlTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUmVhZHkgRXZlbnQgb2YgYSBuZXN0ZWQgTWFzdGVyIERldGFpbCBHcmlkXG4gICAqL1xuICBvbkRldGFpbEdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzaW5nIGNvcHkgZXZlbnQgdG8gZ3JpZCBib2R5XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgdGhpcy5ncmlkQ29weSQubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25WaWV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dWaWV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ29weShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q29weS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3QoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRWRpdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RWRpdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3RvcnkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25PcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd09wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1NlbGVjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVNoaWZ0RG91YmxlQ2xpY2soZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblNoaWZ0RG91YmxlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVG90YWxzIGZvciBgYXJpYS1yb3djb3VudGAgLyBgYXJpYS1jb2xjb3VudGAuXG4gICAqXG4gICAqIEhlbGQgYXMgZmllbGRzIHJhdGhlciB0aGFuIGNvbXB1dGVkIGluIHRoZSB0ZW1wbGF0ZTogdGhleSBhcmUgcmVhZCBvbiBldmVyeVxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIHBhc3MgYW5kIG9ubHkgYWN0dWFsbHkgY2hhbmdlIHdoZW4gdGhlIGRhdGEgb3IgdGhlIGNvbHVtbnNcbiAgICogZG8uIGAtMWAgaXMgdGhlIEFSSUEgdmFsdWUgZm9yIFwidW5rbm93blwiLCB3aGljaCBpcyB0aGUgaG9uZXN0IGFuc3dlciBiZWZvcmVcbiAgICogdGhlIGZpcnN0IHJvdyBhcnJpdmVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFyaWFSb3dDb3VudCA9IC0xO1xuICBwcm90ZWN0ZWQgYXJpYUNvbENvdW50ID0gLTE7XG5cbiAgaW52b2tlUm93Q291bnRDaGFuZ2VkKGxlbmd0aDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLnJlZnJlc2hBcmlhQ291bnRzKGxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5yZWZyZXNoQ2xpZW50UGFnaW5hdGlvbihsZW5ndGgpO1xuXG4gICAgdGhpcy5yb3dDb3VudENoYW5nZWQuZW1pdChsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSB0aGUgdG90YWxzIGEgc2NyZWVuIHJlYWRlciBpcyB0b2xkIGFib3V0LlxuICAgKlxuICAgKiBgYXJpYS1yb3djb3VudGAgY291bnRzIGV2ZXJ5IHJvdyB0aGUgZ3JpZCByZXByZXNlbnRzLCBub3QgdGhlIGhhbmRmdWwgdGhlXG4gICAqIHZpcnR1YWwgc2Nyb2xsZXIgY3VycmVudGx5IGhhcyBpbiB0aGUgRE9NIOKAlCB0aGUgaGVhZGVyIHJvdywgdGhlIHBpbm5lZCByb3dzXG4gICAqIGVpdGhlciBzaWRlLCBhbmQgYWxsIHRoZSBkYXRhIHJvd3MuXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hBcmlhQ291bnRzKGRhdGFSb3dzOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IHBpbm5lZCA9ICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCA/PyAwKSArICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCA/PyAwKTtcblxuICAgIGNvbnN0IHJvd3MgPSAxICsgcGlubmVkICsgZGF0YVJvd3M7XG4gICAgY29uc3QgY29scyA9IHRoaXMuYXBpPy5nZXRDb2x1bW5TdGF0ZSgpPy5jb2x1bW5zPy5sZW5ndGggPz8gLTE7XG5cbiAgICBpZiAocm93cyA9PT0gdGhpcy5hcmlhUm93Q291bnQgJiYgY29scyA9PT0gdGhpcy5hcmlhQ29sQ291bnQpIHJldHVybjtcblxuICAgIC8vIERlZmVycmVkIGEgdGljay4gVGhlIGJvZHkgZW1pdHMgaXRzIHJvdyBjb3VudCB3aGlsZSB0aGUgZmlyc3QgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uIHBhc3MgaXMgc3RpbGwgcnVubmluZywgYWZ0ZXIgdGhpcyBjb21wb25lbnQncyBvd24gYXR0cmlidXRlc1xuICAgIC8vIHdlcmUgY2hlY2tlZCDigJQgYXNzaWduaW5nIGhlcmUgZGlyZWN0bHkgaXMgdGhlIHRleHRib29rIE5HMDEwMC4gVGhlIGJvZHlcbiAgICAvLyBkZWZlcnMgaXRzIG5vZGUgbGlzdCBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICB0aGlzLmFyaWFSb3dDb3VudCA9IHJvd3M7XG4gICAgICB0aGlzLmFyaWFDb2xDb3VudCA9IGNvbHM7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VsbE9wdGlvbk1lbnVTZWxlY3RlZChldmVudDogQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZyBQYWdpbmF0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VHb1RvRmlyc3QoKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0Q3VycmVudFBhZ2UoMSk7XG5cbiAgICB0aGlzLmdvVG9GaXJzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvUHJldmlvdXMoKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0Q3VycmVudFBhZ2UodGhpcy5hcGkucGFnaW5hdGlvblN0YXRlLmN1cnJlbnRQYWdlIC0gMSk7XG5cbiAgICB0aGlzLmdvVG9QcmV2aW91cy5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvTmV4dCgpIHtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLmFwaS5zZXRDdXJyZW50UGFnZSh0aGlzLmFwaS5wYWdpbmF0aW9uU3RhdGUuY3VycmVudFBhZ2UgKyAxKTtcblxuICAgIHRoaXMuZ29Ub05leHQuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub0xhc3QoKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0Q3VycmVudFBhZ2UodGhpcy5pbnRlcm5hbFBhZ2luYXRlLmxhc3RQYWdlID8/IDEpO1xuXG4gICAgdGhpcy5nb1RvTGFzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0UGFnZVNpemUocGFnZVNpemUpO1xuXG4gICAgdGhpcy5wYWdlU2l6ZUNoYW5nZS5lbWl0KHBhZ2VTaXplKTtcbiAgfVxuXG4gIGludm9rZVJvd0RyYWdFbmQoZXZlbnQ6IE9uZVJvd0RyYWdFdmVudDxUPikge1xuXG4gICAgdGhpcy5yb3dEcmFnRW5kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKGV2ZW50OiBFeHBhbnNpb25DaGFuZ2VkRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMuZXhwYW5zaW9uQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgVW5zdWJzY3JpYmUgQWxsIEV2ZW50IExpc3RlbmRlcnNcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgdGhpcy5yb3dEYXRhID0gW107XG5cbiAgICB0aGlzLmFwaS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPCEtLSBObyB0YWJpbmRleCBoZXJlLiBUaGUgdGFiIHN0b3AgYmVsb25ncyBvbiB0aGUgYm9keSB2aWV3cG9ydCwgd2hpY2ggaXMgdGhlXG4gICAgIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBzY3JvbGxzOyBhIGZvY3VzYWJsZSB3cmFwcGVyIGFyb3VuZCBhIHNjcm9sbGFibGVcbiAgICAgY2hpbGQgaXMgcmVhY2hhYmxlIGJ1dCBjYW5ub3QgYmUgc2Nyb2xsZWQgd2l0aCB0aGUga2V5Ym9hcmQuIFRoZSBjb3B5XG4gICAgIGhhbmRsZXIgaXMgdW5hZmZlY3RlZDogYSBjb3B5IGV2ZW50IGZpcmVkIGF0IHRoZSBmb2N1c2VkIHZpZXdwb3J0IGJ1YmJsZXNcbiAgICAgdXAgdG8gaGVyZS4gLS0+XG48IS0tIHJvbGU9XCJncmlkXCIgaXMgd2hhdCB0dXJucyB0aGlzIGZyb20gYSBwaWxlIG9mIGRpdnMgaW50byBzb21ldGhpbmcgYSBzY3JlZW5cbiAgICAgcmVhZGVyIGNhbiBuYXZpZ2F0ZS4gVGhlIGNvdW50cyBhcmUgdGhlICp0b3RhbCog4oCUIGBhcmlhLXJvd2NvdW50YCBpbmNsdWRlc1xuICAgICB0aGUgaGVhZGVyIHJvdyBhbmQgYW55IHBpbm5lZCByb3dzLCBhbmQgYm90aCBzdGF5IGNvcnJlY3Qgd2hpbGUgdGhlIGJvZHkgaXNcbiAgICAgdmlydHVhbGlzZWQgYW5kIG1vc3Qgcm93cyBhcmUgbm90IGluIHRoZSBET00sIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGVzZVxuICAgICBhdHRyaWJ1dGVzIGV4aXN0IHRvIGNvbW11bmljYXRlLiAtLT5cbjxkaXYgI29nUmVmXG4gICAgY2xhc3M9XCJvbmUtZ3JpZFwiXG4gICAgcm9sZT1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ3JpZExhYmVsXCJcbiAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cImFyaWFSb3dDb3VudFwiXG4gICAgW2F0dHIuYXJpYS1jb2xjb3VudF09XCJhcmlhQ29sQ291bnRcIlxuICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cInJvd1NlbGVjdGlvbiA9PT0gJ211bHRpcGxlJyA/IHRydWUgOiBudWxsXCJcbiAgICAoY29weSk9XCJvbkdyaWRDb3B5KCRldmVudClcIj5cbiAgICBcbiAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgPG9uZS1ncmlkLWhlYWRlclxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtlbmFibGVHcm91cENvbHVtbkRlZnNdPVwiZW5hYmxlR3JvdXBDb2x1bW5EZWZzXCJcbiAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgW3Njcm9sbExlZnRdPVwiYm9keVNjcm9sbExlZnRcIlxuICAgICAgICBbaGVhZGVyTWVudV09XCJoZWFkZXJNZW51XCJcbiAgICAgICAgW2ZpbHRlclJvd109XCJmaWx0ZXJSb3dcIlxuICAgICAgICAoaGVhZGVyTWVudUNsaWNrKT1cImhlYWRlck1lbnVDbGljay5lbWl0KCRldmVudClcIlxuICAgIC8+XG5cbiAgICA8IS0tIEJvZHkgLS0+XG4gICAgPG9uZS1ncmlkLWJvZHlcbiAgICAgICAgW2dyaWRDb3B5JF09XCJncmlkQ29weSRcIlxuICAgICAgICBbcm93RGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgW3Bpbm5lZFRvcFJvd0RhdGFdPVwicGlubmVkVG9wUm93RGF0YVwiXG4gICAgICAgIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInBpbm5lZEJvdHRvbVJvd0RhdGFcIlxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtyb3dOdW1iZXJdPVwicm93TnVtYmVyXCJcbiAgICAgICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgIFtlZGl0VHlwZV09XCJlZGl0VHlwZVwiXG4gICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgIFt0cmVlRGF0YV09XCJ0cmVlRGF0YVwiXG4gICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgW21hc3Rlck5vZGVdPVwibWFzdGVyTm9kZVwiXG4gICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgW2RldGFpbFJlbmRlcmVyQ29tcG9uZW50XT1cImRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgW2RldGFpbEdyaWRUZW1wbGF0ZV09XCJkZXRhaWxHcmlkVHBsXCJcbiAgICAgICAgW3RyZWVEYXRhQ2hpbGRyZW5GaWVsZF09XCJ0cmVlRGF0YUNoaWxkcmVuRmllbGRcIlxuICAgICAgICBbYXV0b0dyb3VwQ29sdW1uRGVmXT1cImF1dG9Hcm91cENvbHVtbkRlZlwiXG4gICAgICAgIFtncm91cERlZmF1bHRFeHBhbmRlZF09XCJncm91cERlZmF1bHRFeHBhbmRlZFwiXG4gICAgICAgIChyb3dEcmFnRW5kKT1cImludm9rZVJvd0RyYWdFbmQoJGV2ZW50KVwiXG4gICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAob25Sb3dBZGROZXcpPVwiaW52b2tlUm93QWN0aW9uQWRkTmV3KCRldmVudClcIlxuICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dEb2N1bWVudCk9XCJpbnZva2VSb3dBY3Rpb25Eb2N1bWVudCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAob25Sb3dHb3RvTGlzdCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93SGlzdG9yeSk9XCJpbnZva2VSb3dBY3Rpb25IaXN0b3J5KCRldmVudClcIlxuICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q2VsbE9wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dTZWxlY3Rpb24pPVwiaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAob25TaGlmdERvdWJsZUNsaWNrKT1cImludm9rZVNoaWZ0RG91YmxlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChyb3dDb3VudENoYW5nZWQpPVwiaW52b2tlUm93Q291bnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoY2VsbE9wdGlvblNlbGVjdCk9XCJjZWxsT3B0aW9uTWVudVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoYm9keVNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiXG4gICAgLz5cbiAgICBcbiAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgQGlmIChwYWdpbmF0aW9uIHx8IGNsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICAgIDxvbmUtZ3JpZC1wYWdpbmF0aW9uXG4gICAgICAgICAgICBbcGFnaW5hdGVdPVwiY2xpZW50U2lkZVBhZ2luYXRpb24gPyBpbnRlcm5hbFBhZ2luYXRlIDogcGFnaW5hdGVcIlxuICAgICAgICAgICAgKGdvVG9GaXJzdCk9XCJpbnZva2VHb1RvRmlyc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub0xhc3QpPVwiaW52b2tlR29Ub0xhc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub1ByZXZpb3VzKT1cImludm9rZUdvVG9QcmV2aW91cygpXCJcbiAgICAgICAgICAgIChnb1RvTmV4dCk9XCJpbnZva2VHb1RvTmV4dCgpXCJcbiAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJpbnZva2VQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICB9XG5cbiAgICA8IS0tIE1hc3RlciBEZXRhaWwgR3JpZCB0ZW1wbGF0ZSwgcmVuZGVyZWQgaW5zaWRlIG9uZS1ncmlkLWJvZHkgdmlhIG5nVGVtcGxhdGVPdXRsZXQuXG4gICAgICAgICBEZWNsYXJlZCBoZXJlIChzZWxmLXJlZmVyZW5jZSkgc28gb25lLWdyaWQtYm9keSdzIHRlbXBsYXRlIGRvZXMgbm90IG5lZWQgdG9cbiAgICAgICAgIGltcG9ydCBvbmUtZ3JpZCwgd2hpY2ggd291bGQgY3JlYXRlIGFuIHVuc3VwcG9ydGVkIGNvbXBpbGUtdGltZSBjeWNsZS4gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNkZXRhaWxHcmlkVHBsIGxldC1ub2RlPVwibm9kZVwiPlxuICAgICAgICA8b25lLWdyaWRcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibm9kZS5kZXRhaWxSb3dIZWlnaHRcIlxuICAgICAgICAgICAgW2dyaWRUeXBlXT1cIidkZXRhaWwnXCJcbiAgICAgICAgICAgIFttYXN0ZXJOb2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICAgICAgW2RlZmF1bHRDb2x1bW5EZWZdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmRlZmF1bHRDb2x1bW5EZWZcIlxuICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmNvbHVtbkRlZnNcIlxuICAgICAgICAgICAgW3Jvd0RhdGFdPVwibm9kZT8uZGV0YWlsUm93RGF0YVwiXG4gICAgICAgICAgICBbcm93TnVtYmVyXT1cImRldGFpbENlbGxSZW5kZXJlclBhcmFtcy5kZXRhaWxHcmlkT3B0aW9ucz8ucm93TnVtYmVyXCJcbiAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICBbc3VibWl0dGVkXT1cInN1Ym1pdHRlZFwiXG4gICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9EZXRhaWwpPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25HcmlkUmVhZHkpPVwib25EZXRhaWxHcmlkUmVhZHkoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PiJdfQ==