@one-grid-core/angular 0.1.0-beta.5

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 (125) hide show
  1. package/README.md +168 -0
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +388 -0
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +570 -0
  4. package/esm2022/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.mjs +90 -0
  5. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +31 -0
  6. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +67 -0
  7. package/esm2022/lib/components/one-grid-checkbox/one-grid-checkbox.component.mjs +47 -0
  8. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +62 -0
  9. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +140 -0
  10. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +76 -0
  11. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +193 -0
  12. package/esm2022/lib/components/one-grid-status/one-grid-status.component.mjs +35 -0
  13. package/esm2022/lib/core/directives/one-cell-input-validator.directive.mjs +71 -0
  14. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +77 -0
  15. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +82 -0
  16. package/esm2022/lib/core/instants/one-grid-api.class.mjs +591 -0
  17. package/esm2022/lib/core/instants/one-row-node.class.mjs +90 -0
  18. package/esm2022/lib/core/models/constants/one-pagination.constant.mjs +2 -0
  19. package/esm2022/lib/core/models/one-column-def-types.model.mjs +2 -0
  20. package/esm2022/lib/core/models/one-event-types.model.mjs +2 -0
  21. package/esm2022/lib/core/models/one-filter.model.mjs +2 -0
  22. package/esm2022/lib/core/models/one-grid-types.model.mjs +2 -0
  23. package/esm2022/lib/core/models/one-master-detail.model.mjs +2 -0
  24. package/esm2022/lib/core/models/one-pagination-types.model.mjs +2 -0
  25. package/esm2022/lib/core/models/one-row.model.mjs +13 -0
  26. package/esm2022/lib/core/models/one-tree-data.model.mjs +2 -0
  27. package/esm2022/lib/core/models/one-validation.model.mjs +2 -0
  28. package/esm2022/lib/core/pipes/cell-action-button-enable.pipe.mjs +21 -0
  29. package/esm2022/lib/core/pipes/cell-action-button-visible.pipe.mjs +17 -0
  30. package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +26 -0
  31. package/esm2022/lib/core/pipes/cell-editable.pipe.mjs +30 -0
  32. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +21 -0
  33. package/esm2022/lib/core/pipes/cell-field-value.pipe.mjs +25 -0
  34. package/esm2022/lib/core/pipes/cell-field.pipe.mjs +20 -0
  35. package/esm2022/lib/core/pipes/cell-invalid.pipe.mjs +21 -0
  36. package/esm2022/lib/core/pipes/cell-key.pipe.mjs +21 -0
  37. package/esm2022/lib/core/pipes/cell-level-padding.pipe.mjs +18 -0
  38. package/esm2022/lib/core/pipes/cell-number-value.pipe.mjs +19 -0
  39. package/esm2022/lib/core/pipes/cell-selected.pipe.mjs +20 -0
  40. package/esm2022/lib/core/pipes/cell-state-group-renderer.pipe.mjs +21 -0
  41. package/esm2022/lib/core/pipes/cell-state-renderer.pipe.mjs +24 -0
  42. package/esm2022/lib/core/pipes/cell-value-getter.pipe.mjs +23 -0
  43. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +19 -0
  44. package/esm2022/lib/core/pipes/header-checkbox-checked.pipe.mjs +17 -0
  45. package/esm2022/lib/core/pipes/header-checkbox-disabled.pipe.mjs +17 -0
  46. package/esm2022/lib/core/pipes/header-checkbox-indeterminate.pipe.mjs +17 -0
  47. package/esm2022/lib/core/services/og-column.service.mjs +81 -0
  48. package/esm2022/lib/core/services/one-grid-cell.service.mjs +88 -0
  49. package/esm2022/lib/core/services/one-grid-event.service.mjs +42 -0
  50. package/esm2022/lib/core/services/one-grid-expansion.service.mjs +40 -0
  51. package/esm2022/lib/core/services/one-grid-row.service.mjs +29 -0
  52. package/esm2022/lib/core/services/one-grid-selection.service.mjs +54 -0
  53. package/esm2022/lib/core/services/one-grid-tree-data.service.mjs +59 -0
  54. package/esm2022/lib/helpers/one-cell.helper.mjs +42 -0
  55. package/esm2022/lib/helpers/one-column-def.helper.mjs +28 -0
  56. package/esm2022/lib/helpers/one-filter.helper.mjs +52 -0
  57. package/esm2022/lib/helpers/one-validation.helper.mjs +95 -0
  58. package/esm2022/lib/index.mjs +19 -0
  59. package/esm2022/lib/one-grid.module.mjs +142 -0
  60. package/esm2022/one-grid-core-angular.mjs +5 -0
  61. package/esm2022/public-api.mjs +5 -0
  62. package/fesm2022/one-grid-core-angular.mjs +3573 -0
  63. package/fesm2022/one-grid-core-angular.mjs.map +1 -0
  64. package/index.d.ts +5 -0
  65. package/lib/components/one-grid/one-grid.component.d.ts +139 -0
  66. package/lib/components/one-grid-body/one-grid-body.component.d.ts +176 -0
  67. package/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.d.ts +27 -0
  68. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +16 -0
  69. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +21 -0
  70. package/lib/components/one-grid-checkbox/one-grid-checkbox.component.d.ts +19 -0
  71. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +24 -0
  72. package/lib/components/one-grid-header/one-grid-header.component.d.ts +41 -0
  73. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +21 -0
  74. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +59 -0
  75. package/lib/components/one-grid-status/one-grid-status.component.d.ts +15 -0
  76. package/lib/core/directives/one-cell-input-validator.directive.d.ts +15 -0
  77. package/lib/core/directives/one-cell-renderer-component.directive.d.ts +20 -0
  78. package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -0
  79. package/lib/core/instants/one-grid-api.class.d.ts +161 -0
  80. package/lib/core/instants/one-row-node.class.d.ts +49 -0
  81. package/lib/core/models/constants/one-pagination.constant.d.ts +1 -0
  82. package/lib/core/models/one-column-def-types.model.d.ts +139 -0
  83. package/lib/core/models/one-event-types.model.d.ts +78 -0
  84. package/lib/core/models/one-filter.model.d.ts +15 -0
  85. package/lib/core/models/one-grid-types.model.d.ts +48 -0
  86. package/lib/core/models/one-master-detail.model.d.ts +18 -0
  87. package/lib/core/models/one-pagination-types.model.d.ts +9 -0
  88. package/lib/core/models/one-row.model.d.ts +38 -0
  89. package/lib/core/models/one-tree-data.model.d.ts +9 -0
  90. package/lib/core/models/one-validation.model.d.ts +9 -0
  91. package/lib/core/pipes/cell-action-button-enable.pipe.d.ts +8 -0
  92. package/lib/core/pipes/cell-action-button-visible.pipe.d.ts +9 -0
  93. package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +9 -0
  94. package/lib/core/pipes/cell-editable.pipe.d.ts +9 -0
  95. package/lib/core/pipes/cell-field-value-empty.pipe.d.ts +7 -0
  96. package/lib/core/pipes/cell-field-value.pipe.d.ts +7 -0
  97. package/lib/core/pipes/cell-field.pipe.d.ts +7 -0
  98. package/lib/core/pipes/cell-invalid.pipe.d.ts +9 -0
  99. package/lib/core/pipes/cell-key.pipe.d.ts +7 -0
  100. package/lib/core/pipes/cell-level-padding.pipe.d.ts +7 -0
  101. package/lib/core/pipes/cell-number-value.pipe.d.ts +7 -0
  102. package/lib/core/pipes/cell-selected.pipe.d.ts +7 -0
  103. package/lib/core/pipes/cell-state-group-renderer.pipe.d.ts +9 -0
  104. package/lib/core/pipes/cell-state-renderer.pipe.d.ts +8 -0
  105. package/lib/core/pipes/cell-value-getter.pipe.d.ts +9 -0
  106. package/lib/core/pipes/column-sort-state.pipe.d.ts +8 -0
  107. package/lib/core/pipes/header-checkbox-checked.pipe.d.ts +9 -0
  108. package/lib/core/pipes/header-checkbox-disabled.pipe.d.ts +9 -0
  109. package/lib/core/pipes/header-checkbox-indeterminate.pipe.d.ts +9 -0
  110. package/lib/core/services/og-column.service.d.ts +22 -0
  111. package/lib/core/services/one-grid-cell.service.d.ts +29 -0
  112. package/lib/core/services/one-grid-event.service.d.ts +17 -0
  113. package/lib/core/services/one-grid-expansion.service.d.ts +13 -0
  114. package/lib/core/services/one-grid-row.service.d.ts +15 -0
  115. package/lib/core/services/one-grid-selection.service.d.ts +17 -0
  116. package/lib/core/services/one-grid-tree-data.service.d.ts +10 -0
  117. package/lib/helpers/one-cell.helper.d.ts +26 -0
  118. package/lib/helpers/one-column-def.helper.d.ts +17 -0
  119. package/lib/helpers/one-filter.helper.d.ts +20 -0
  120. package/lib/helpers/one-validation.helper.d.ts +21 -0
  121. package/lib/index.d.ts +18 -0
  122. package/lib/one-grid.module.d.ts +45 -0
  123. package/package.json +48 -0
  124. package/public-api.d.ts +1 -0
  125. package/scss/_one-grid.scss +999 -0
@@ -0,0 +1,570 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import { CellEditablePipe } from '../../core/pipes/cell-editable.pipe';
4
+ import { getCellKey, getFieldValue } from '../../helpers/one-cell.helper';
5
+ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../core/services/og-column.service";
8
+ import * as i2 from "../../core/services/one-grid-cell.service";
9
+ import * as i3 from "../../core/services/one-grid-event.service";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@angular/cdk/scrolling";
12
+ import * as i6 from "../one-grid-checkbox/one-grid-checkbox.component";
13
+ import * as i7 from "../one-grid-row-action/one-grid-row-action.component";
14
+ import * as i8 from "../one-grid-cell-group-renderer/one-grid-cell-group-renderer.component";
15
+ import * as i9 from "../../core/directives/one-cell-input-validator.directive";
16
+ import * as i10 from "../../core/directives/one-cell-renderer-component.directive";
17
+ import * as i11 from "../../core/directives/one-cell-text-expand.directive";
18
+ import * as i12 from "../one-grid-cell-option-menu/one-grid-cell-option-menu.component";
19
+ import * as i13 from "../../core/pipes/cell-editable.pipe";
20
+ import * as i14 from "../../core/pipes/cell-invalid.pipe";
21
+ import * as i15 from "../../core/pipes/cell-selected.pipe";
22
+ import * as i16 from "../../core/pipes/cell-action-button-enable.pipe";
23
+ import * as i17 from "../../core/pipes/cell-key.pipe";
24
+ import * as i18 from "../../core/pipes/cell-level-padding.pipe";
25
+ import * as i19 from "../../core/pipes/cell-state-renderer.pipe";
26
+ export class OneGridBodyComponent {
27
+ constructor(colService, cellService, eventService, cdr) {
28
+ this.colService = colService;
29
+ this.cellService = cellService;
30
+ this.eventService = eventService;
31
+ this.cdr = cdr;
32
+ this.rowData = [];
33
+ this.pagination = false;
34
+ this.allowedEdit = true;
35
+ this.enableGroupColumnDefs = false;
36
+ this.submitted = false;
37
+ this.context = null;
38
+ this.columnDefs = [];
39
+ this.cellRenderer = false;
40
+ /**
41
+ * Master Detail Properties
42
+ */
43
+ this.gridType = 'simple';
44
+ this.masterDetail = false;
45
+ this.masterNode = null;
46
+ // @Input() detailRowHeight: number = null;
47
+ // @Input() detailRowAutoHeight: boolean = false;
48
+ this.detailRowMaxHeight = null;
49
+ this.detailGridTemplate = null;
50
+ /**
51
+ * Tree Data Properties
52
+ */
53
+ this.treeData = false;
54
+ this.groupDefaultExpanded = -1; // It's work with master detail also
55
+ /**
56
+ * Passing Row Action Events to Parent
57
+ */
58
+ this.onRowGotoDetail = new EventEmitter();
59
+ this.onRowAddNew = new EventEmitter();
60
+ this.onRowView = new EventEmitter();
61
+ this.onRowCopy = new EventEmitter();
62
+ this.onRowLocation = new EventEmitter();
63
+ this.onRowDocument = new EventEmitter();
64
+ this.onRowDelete = new EventEmitter();
65
+ this.onRowGotoList = new EventEmitter();
66
+ this.onRowEdit = new EventEmitter();
67
+ this.onRowPrint = new EventEmitter();
68
+ this.onRowHistory = new EventEmitter();
69
+ this.onRowOption = new EventEmitter();
70
+ this.onRowLanguage = new EventEmitter();
71
+ this.onRowCellOption = new EventEmitter();
72
+ this.onRowSelection = new EventEmitter();
73
+ this.onShiftDoubleClick = new EventEmitter();
74
+ this.rowCountChanged = new EventEmitter();
75
+ this.expansionChanged = new EventEmitter();
76
+ this.bodyScroll = new EventEmitter();
77
+ this.cellOptionSelect = new EventEmitter();
78
+ /**
79
+ * Selection Range Variables
80
+ */
81
+ this.rowWidth = 0;
82
+ this.nodes = [];
83
+ this.selectedCells = new Set();
84
+ this.isMouseDown = false;
85
+ this.startCell = null;
86
+ this.lastScrollLeft = 0;
87
+ this.cellEditablePipe = new CellEditablePipe();
88
+ this.subscriptions = new Subscription();
89
+ this.cellRendererParams = {
90
+ gotoDetailButtonStatus: 1,
91
+ addNewButtonStatus: 1,
92
+ viewButtonStatus: 1,
93
+ locationButtonStatus: 1,
94
+ documentButtonStatus: 1,
95
+ copyButtonStatus: 1,
96
+ deleteButtonStatus: 1,
97
+ gotoListButtonStatus: 1,
98
+ optionButtonStatus: 1,
99
+ languageButtonStatus: 1,
100
+ editButtonStatus: 1,
101
+ printButtonStatus: 1,
102
+ historyButtonStatus: 1,
103
+ };
104
+ /**
105
+ * Virtual Scroll Properties
106
+ */
107
+ this.itemSize = 30;
108
+ this.minBufferPx = 200;
109
+ this.maxBufferPx = 400;
110
+ }
111
+ ngOnInit() {
112
+ /**
113
+ * Listen Grid Copy Event
114
+ */
115
+ this.subscriptions.add(this.gridCopy$.subscribe((event) => {
116
+ this.onGridCopy(event);
117
+ }));
118
+ /**
119
+ * Listen Column Changed Event
120
+ */
121
+ this.subscriptions.add(this.eventService.addEventListener('columnChanged', (payload) => {
122
+ this.columnDefs = [...payload.columns];
123
+ this.cellRenderer = this.columnDefs.some(col => col.cellRendererComponent);
124
+ this.rowWidth = this.columnDefs.reduce((sum, col) => sum + (col.width ? col.width > col.maxWidth ? col.maxWidth : col.width < col.minWidth ? col.minWidth : col.width : col.minWidth), 0);
125
+ this.cdr.markForCheck();
126
+ }));
127
+ /**
128
+ * Listen Row Data Changed Event
129
+ */
130
+ this.subscriptions.add(this.eventService.addEventListener('rowDataChanged', ({ nodes }) => {
131
+ this.rowCountChanged.emit(nodes?.length ?? 0);
132
+ setTimeout(() => {
133
+ this.viewport?.checkViewportSize();
134
+ this.setVirtualScroll(nodes?.length);
135
+ if (this.masterDetail) {
136
+ this.nodes = nodes.map((node) => {
137
+ if (node.leaf && this.detailRendererComponent) {
138
+ node.detailRendererComponent = this.detailRendererComponent;
139
+ }
140
+ if (node.expanded) {
141
+ this.api.setDetailRowData(node, [...node.detailRowData]);
142
+ }
143
+ return node;
144
+ });
145
+ }
146
+ else {
147
+ this.nodes = nodes;
148
+ }
149
+ this.cdr.markForCheck();
150
+ });
151
+ }));
152
+ /**
153
+ * Listen Sort Changed Event
154
+ */
155
+ this.subscriptions.add(this.eventService.addEventListener('sortChanged', ({ nodes }) => {
156
+ this.nodes = nodes;
157
+ this.cdr.markForCheck();
158
+ }));
159
+ /**
160
+ * Listen Selection Changed Event
161
+ */
162
+ this.subscriptions.add(this.eventService.addEventListener('selectionChanged', (payload) => {
163
+ if (payload) {
164
+ this.cdr.markForCheck();
165
+ }
166
+ }));
167
+ }
168
+ onGridReady(params) {
169
+ params.api.setRowData(this.masterNode?.detailRowData ?? []);
170
+ }
171
+ onBodyScroll(event) {
172
+ const scrollLeft = event.target.scrollLeft;
173
+ if (scrollLeft !== this.lastScrollLeft) {
174
+ this.lastScrollLeft = scrollLeft;
175
+ this.bodyScroll.emit(scrollLeft);
176
+ return;
177
+ }
178
+ }
179
+ /**
180
+ * Track Rendering Row Node By Row ID
181
+ */
182
+ trackByRowId(index, node) {
183
+ return node.rowId;
184
+ }
185
+ /**
186
+ * Cell Selection Range Feature
187
+ */
188
+ startSelection(rowId, field) {
189
+ this.isMouseDown = true;
190
+ this.startCell = { rowId, field };
191
+ this.selectedCells.clear();
192
+ this.selectedCells = new Set(this.selectedCells).add(getCellKey(rowId, field));
193
+ }
194
+ extendSelection(rowId, field) {
195
+ if (!this.isMouseDown || !this.startCell)
196
+ return;
197
+ const rows = this.nodes; // already sorted
198
+ const startRowIndex = rows.findIndex(r => r.rowId === this.startCell.rowId);
199
+ const endRowIndex = rows.findIndex(r => r.rowId === rowId);
200
+ if (startRowIndex === -1 || endRowIndex === -1)
201
+ return;
202
+ const colStartIndex = this.columnDefs.findIndex(c => c.field === this.startCell.field);
203
+ const colEndIndex = this.columnDefs.findIndex(c => c.field === field);
204
+ if (colStartIndex === -1 || colEndIndex === -1)
205
+ return;
206
+ const rowStart = Math.min(startRowIndex, endRowIndex);
207
+ const rowEnd = Math.max(startRowIndex, endRowIndex);
208
+ const colStart = Math.min(colStartIndex, colEndIndex);
209
+ const colEnd = Math.max(colStartIndex, colEndIndex);
210
+ const next = new Set();
211
+ for (let r = rowStart; r <= rowEnd; r++) {
212
+ for (let c = colStart; c <= colEnd; c++) {
213
+ next.add(getCellKey(rows[r].rowId, this.columnDefs[c].field));
214
+ }
215
+ }
216
+ this.selectedCells = next;
217
+ }
218
+ endSelection() {
219
+ this.isMouseDown = false;
220
+ this.startCell = null;
221
+ }
222
+ /**
223
+ * Clear Cells Selected
224
+ */
225
+ onDocumentClick(event) {
226
+ if (this.bodyRef?.nativeElement) {
227
+ const clickedInside = this.bodyRef.nativeElement.contains(event.target);
228
+ if (!clickedInside) {
229
+ this.selectedCells.clear();
230
+ }
231
+ }
232
+ }
233
+ /**
234
+ * Selection Range Event Hold Mouse Click
235
+ */
236
+ onGlobalMouseUp() {
237
+ this.endSelection();
238
+ }
239
+ /**
240
+ * Listen Copy Clipboard Event
241
+ */
242
+ onGridCopy(event) {
243
+ event.preventDefault();
244
+ if (this.selectedCells.size > 0) {
245
+ const text = this.buildClipboardText();
246
+ event.clipboardData?.setData('text/plain', text);
247
+ this.selectedCells.forEach(cellId => {
248
+ const cellElement = document.querySelector(`[data-cell-id="${cellId}"]`);
249
+ if (cellElement) {
250
+ cellElement.classList.add('one-cell-copied');
251
+ setTimeout(() => cellElement.classList.remove('one-cell-copied'), 400);
252
+ }
253
+ });
254
+ }
255
+ }
256
+ copyToClipboard(value) {
257
+ if (navigator.clipboard?.writeText) {
258
+ navigator.clipboard.writeText(value);
259
+ }
260
+ else {
261
+ // Fallback (Safari / older browsers)
262
+ const textarea = document.createElement('textarea');
263
+ textarea.value = value;
264
+ textarea.style.position = 'fixed';
265
+ textarea.style.opacity = '0';
266
+ document.body.appendChild(textarea);
267
+ textarea.select();
268
+ document.execCommand('copy');
269
+ document.body.removeChild(textarea);
270
+ }
271
+ }
272
+ /**
273
+ * Build Copy Cell Text to Clipboard
274
+ */
275
+ buildClipboardText() {
276
+ if (!this.selectedCells.size)
277
+ return '';
278
+ // Parse selected cells
279
+ const selected = Array.from(this.selectedCells).map(key => {
280
+ const [rowId, field] = key.split('--');
281
+ return { rowId, field };
282
+ });
283
+ // Resolve visual row indexes from displayedRows
284
+ const rowIndexes = selected
285
+ .map(s => this.nodes.findIndex(r => r.rowId === s.rowId))
286
+ .filter(i => i !== -1);
287
+ const colIndexes = selected
288
+ .map(s => this.columnDefs.findIndex(c => c.field === s.field))
289
+ .filter(i => i !== -1);
290
+ if (!rowIndexes.length || !colIndexes.length)
291
+ return '';
292
+ const rowStart = Math.min(...rowIndexes);
293
+ const rowEnd = Math.max(...rowIndexes);
294
+ const colStart = Math.min(...colIndexes);
295
+ const colEnd = Math.max(...colIndexes);
296
+ const selectedFields = this.columnDefs
297
+ .slice(colStart, colEnd + 1)
298
+ .map(c => c.field);
299
+ const clipboardLines = [];
300
+ for (let r = rowStart; r <= rowEnd; r++) {
301
+ const row = this.nodes[r];
302
+ const line = selectedFields
303
+ .map(field => {
304
+ const key = `${row.rowId}--${field}`;
305
+ if (!this.selectedCells.has(key)) {
306
+ return '';
307
+ }
308
+ const value = getFieldValue(row.data, field);
309
+ return value ?? '';
310
+ }).join('\t');
311
+ clipboardLines.push(line);
312
+ }
313
+ return clipboardLines.join('\n');
314
+ }
315
+ /**
316
+ * Binding Events Row Action to Parent
317
+ */
318
+ invokeRowActionGotoDetail(event) {
319
+ this.onRowGotoDetail.emit(event);
320
+ }
321
+ invokeRowActionAddNew(event) {
322
+ this.onRowAddNew.emit(event);
323
+ }
324
+ invokeRowActionView(event) {
325
+ this.onRowView.emit(event);
326
+ }
327
+ invokeRowActionLocation(event) {
328
+ this.onRowLocation.emit(event);
329
+ }
330
+ invokeRowActionDocument(event) {
331
+ this.onRowDocument.emit(event);
332
+ }
333
+ invokeRowActionCopy(event) {
334
+ this.onRowCopy.emit(event);
335
+ }
336
+ invokeRowActionDelete(event) {
337
+ this.onRowDelete.emit(event);
338
+ }
339
+ invokeRowActionGotoList(event) {
340
+ this.onRowGotoList.emit(event);
341
+ }
342
+ invokeRowActionEdit(event) {
343
+ this.onRowEdit.emit(event);
344
+ }
345
+ invokeRowActionPrint(event) {
346
+ this.onRowPrint.emit(event);
347
+ }
348
+ invokeRowActionHistory(event) {
349
+ this.onRowHistory.emit(event);
350
+ }
351
+ invokeRowActionOption(event) {
352
+ this.onRowOption.emit(event);
353
+ }
354
+ invokeRowActionLanguage(event) {
355
+ this.onRowLanguage.emit(event);
356
+ }
357
+ invokeRowActionCellOption(event) {
358
+ this.onRowCellOption.emit(event);
359
+ }
360
+ invokeRowActionSelection(event) {
361
+ this.onRowSelection.emit(event);
362
+ }
363
+ invokeExpansionChangedClick(event) {
364
+ this.expansionChanged.emit(event);
365
+ }
366
+ cellOptionMenuSelected(event) {
367
+ this.cellOptionSelect.emit(event);
368
+ }
369
+ /**
370
+ * Special Events
371
+ */
372
+ invokeShiftDoubleClick(node, column) {
373
+ let event = { node, column, data: node.data, rowIndex: node.rowIndex, gridType: null };
374
+ if (this.masterDetail) {
375
+ event = { ...event, gridType: this.gridType, masterNode: this.masterNode };
376
+ }
377
+ this.onShiftDoubleClick.emit(event);
378
+ }
379
+ /**
380
+ * Cell Edit Feature
381
+ */
382
+ startEdit(event, node, column) {
383
+ const target = event.target;
384
+ if (target.tagName.toLowerCase() === 'i') {
385
+ return;
386
+ }
387
+ if (event.shiftKey) {
388
+ this.invokeShiftDoubleClick(node, column);
389
+ return;
390
+ }
391
+ if (!this.cellEditablePipe.transform(node.cellStates, column, node, this.cellService.editableFn, this.cellService.updatableFn, this.allowedEdit)) {
392
+ this.selectedCells.clear();
393
+ const cellKey = getCellKey(node.rowId, column.field);
394
+ this.selectedCells.add(cellKey);
395
+ return;
396
+ }
397
+ let rowNode = this.api.getRowNodeById(node.rowId);
398
+ if (rowNode) {
399
+ rowNode.editing[column.field] = true;
400
+ setTimeout(() => {
401
+ const input = document.querySelector(`[data-cell-id="${getCellKey(node.rowId, column.field)}"] input`);
402
+ if (input) {
403
+ input.focus();
404
+ const value = input.value;
405
+ if (value && ["text"].includes(input.type)) {
406
+ input.setSelectionRange(value.length, value.length);
407
+ }
408
+ }
409
+ }, 10);
410
+ }
411
+ }
412
+ /**
413
+ * Save Cell Edit Mode
414
+ */
415
+ stopEdit(node, column, event) {
416
+ let rowNode = this.api.getRowNodeById(node.rowId);
417
+ if (rowNode) {
418
+ event.preventDefault();
419
+ event.stopPropagation();
420
+ const value = event.target.value ?? '';
421
+ this.setCellValueByRowId(node.rowId, column, value);
422
+ rowNode.cellStates = this.cellService.generateCellStates(rowNode);
423
+ rowNode.editing[column.field] = false;
424
+ this.eventService.dispatchEvent('cellStateChanged', {
425
+ data: rowNode.data,
426
+ node: rowNode,
427
+ column: column
428
+ });
429
+ }
430
+ }
431
+ /**
432
+ * Cancel Cell Edit Mode
433
+ */
434
+ cancelEdit(node, column) {
435
+ let rowNode = this.api.getRowNodeById(node.rowId);
436
+ if (rowNode) {
437
+ rowNode.editing[column.field] = false;
438
+ }
439
+ }
440
+ /**
441
+ * Set Cell Value
442
+ */
443
+ setCellValueByRowId(rowId, column, value) {
444
+ const node = this.api.getRowNodeById(rowId);
445
+ if (node && column.field) {
446
+ if (column?.cellRendererParams?.inputType !== 'number') {
447
+ node.data[column.field] = value === '' ? null : value;
448
+ }
449
+ else {
450
+ node.data[column.field] = value === '' ? null : Number(value);
451
+ }
452
+ }
453
+ }
454
+ /**
455
+ * Virtual Scroll Properties
456
+ */
457
+ setVirtualScroll(items = 0) {
458
+ this.minBufferPx = this.itemSize * items * 1.5;
459
+ this.maxBufferPx = this.minBufferPx * 2;
460
+ }
461
+ /**
462
+ * Unsubscribe All Subscriptions
463
+ */
464
+ ngOnDestroy() {
465
+ this.subscriptions.unsubscribe();
466
+ }
467
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridBodyComponent, deps: [{ token: i1.OgColumnService }, { token: i2.OneGridCellService }, { token: i3.OneGridEventService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
468
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridBodyComponent, selector: "one-grid-body", inputs: { rowData: "rowData", rowNumber: "rowNumber", api: "api", pagination: "pagination", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", submitted: "submitted", context: "context", getRowId: "getRowId", gridCopy$: "gridCopy$", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailRowMaxHeight: "detailRowMaxHeight", detailCellRendererParams: "detailCellRendererParams", detailGridTemplate: "detailGridTemplate", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded" }, outputs: { onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowCopy: "onRowCopy", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowCellOption: "onRowCellOption", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", expansionChanged: "expansionChanged", bodyScroll: "bodyScroll", cellOptionSelect: "cellOptionSelect" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:mouseup": "onGlobalMouseUp()" } }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["bodyRef"], descendants: true, static: true }, { propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: "<div #bodyRef class=\"one-grid-body\">\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\" [attr.data-row-id]=\"node.rowId\" [class.one-row-selected]=\"node.selected\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n</div>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <div\n class=\"one-column\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellClass\"\n [ngStyle]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellStyle\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\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 />\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.OneGridCheckboxComponent, selector: "one-grid-checkbox", inputs: ["node", "allowedEdit", "api"], outputs: ["onRowSelection"] }, { kind: "component", type: i7.OneGridRowActionComponent, selector: "one-grid-row-action", inputs: ["column", "node", "allowedEdit", "masterDetail", "masterNode", "cellRendererParams", "gridType", "context"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption"] }, { kind: "component", type: i8.OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: ["node", "masterDetail", "detailCellRendererParams", "detailRendererComponent"], outputs: ["expansionChanged"] }, { kind: "directive", type: i9.OneCellInputValidatorDirective, selector: "[oneCellInputValidator]", inputs: ["validationType", "regex"] }, { kind: "directive", type: i10.OneCellRendererComponentDirective, selector: "[oneCellRendererComponent]", inputs: ["cellRendererComponent", "params"] }, { kind: "directive", type: i11.OneCellTextExpandDirective, selector: "[oneCellTextExpand]" }, { kind: "component", type: i12.OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: ["column", "node", "options"], outputs: ["cellOptionMenuSelect", "cellOptionMenuClose"] }, { kind: "pipe", type: i13.CellEditablePipe, name: "cellEditable" }, { kind: "pipe", type: i14.CellInvalidPipe, name: "cellInvalid" }, { kind: "pipe", type: i15.CellSelectedPipe, name: "cellSelected" }, { kind: "pipe", type: i16.CellActionButtonEnablePipe, name: "cellActionButtonEnable" }, { kind: "pipe", type: i17.CellKeyPipe, name: "cellKey" }, { kind: "pipe", type: i18.CellLevelPaddingPipe, name: "cellLevelPadding" }, { kind: "pipe", type: i19.CellStateRendererPipe, name: "cellStateRenderer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
469
+ }
470
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridBodyComponent, decorators: [{
471
+ type: Component,
472
+ args: [{ standalone: false, selector: 'one-grid-body', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #bodyRef class=\"one-grid-body\">\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\" [attr.data-row-id]=\"node.rowId\" [class.one-row-selected]=\"node.selected\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n</div>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <div\n class=\"one-column\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellClass\"\n [ngStyle]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellStyle\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\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 />\n }\n </div>\n }\n </div>\n</ng-template>\n" }]
473
+ }], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridCellService }, { type: i3.OneGridEventService }, { type: i0.ChangeDetectorRef }], propDecorators: { bodyRef: [{
474
+ type: ViewChild,
475
+ args: ['bodyRef', { static: true }]
476
+ }], rowData: [{
477
+ type: Input,
478
+ args: [{ required: true }]
479
+ }], rowNumber: [{
480
+ type: Input
481
+ }], api: [{
482
+ type: Input
483
+ }], pagination: [{
484
+ type: Input
485
+ }], allowedEdit: [{
486
+ type: Input
487
+ }], enableGroupColumnDefs: [{
488
+ type: Input
489
+ }], submitted: [{
490
+ type: Input
491
+ }], context: [{
492
+ type: Input
493
+ }], getRowId: [{
494
+ type: Input
495
+ }], gridCopy$: [{
496
+ type: Input,
497
+ args: [{ required: true }]
498
+ }], viewport: [{
499
+ type: ViewChild,
500
+ args: [CdkVirtualScrollViewport]
501
+ }], gridType: [{
502
+ type: Input
503
+ }], masterDetail: [{
504
+ type: Input
505
+ }], masterNode: [{
506
+ type: Input
507
+ }], detailRowMaxHeight: [{
508
+ type: Input
509
+ }], detailCellRendererParams: [{
510
+ type: Input
511
+ }], detailGridTemplate: [{
512
+ type: Input
513
+ }], detailRendererComponent: [{
514
+ type: Input
515
+ }], treeData: [{
516
+ type: Input
517
+ }], treeDataChildrenField: [{
518
+ type: Input
519
+ }], autoGroupColumnDef: [{
520
+ type: Input
521
+ }], groupDefaultExpanded: [{
522
+ type: Input
523
+ }], onRowGotoDetail: [{
524
+ type: Output
525
+ }], onRowAddNew: [{
526
+ type: Output
527
+ }], onRowView: [{
528
+ type: Output
529
+ }], onRowCopy: [{
530
+ type: Output
531
+ }], onRowLocation: [{
532
+ type: Output
533
+ }], onRowDocument: [{
534
+ type: Output
535
+ }], onRowDelete: [{
536
+ type: Output
537
+ }], onRowGotoList: [{
538
+ type: Output
539
+ }], onRowEdit: [{
540
+ type: Output
541
+ }], onRowPrint: [{
542
+ type: Output
543
+ }], onRowHistory: [{
544
+ type: Output
545
+ }], onRowOption: [{
546
+ type: Output
547
+ }], onRowLanguage: [{
548
+ type: Output
549
+ }], onRowCellOption: [{
550
+ type: Output
551
+ }], onRowSelection: [{
552
+ type: Output
553
+ }], onShiftDoubleClick: [{
554
+ type: Output
555
+ }], rowCountChanged: [{
556
+ type: Output
557
+ }], expansionChanged: [{
558
+ type: Output
559
+ }], bodyScroll: [{
560
+ type: Output
561
+ }], cellOptionSelect: [{
562
+ type: Output
563
+ }], onDocumentClick: [{
564
+ type: HostListener,
565
+ args: ['document:click', ['$event']]
566
+ }], onGlobalMouseUp: [{
567
+ type: HostListener,
568
+ args: ['document:mouseup']
569
+ }] } });
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzlMLE9BQU8sRUFBVyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVWxFLE1BQU0sT0FBTyxvQkFBb0I7SUFzRy9CLFlBQ1ksVUFBMkIsRUFDM0IsV0FBK0IsRUFDakMsWUFBaUMsRUFDakMsR0FBc0I7UUFIcEIsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQ2pDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXBHTCxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBR3BDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsMEJBQXFCLEdBQVksS0FBSyxDQUFD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Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQWlOUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0IxQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2VsbFNlbGVjdGlvbiwgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkQXBpIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPbmVHcmlkR2V0Um93SWRQYXJhbXMsIE9uZUdyaWRSZWFkeUV2ZW50LCBPbmVHcmlkUm93QWN0aW9uRXZlbnQsIE9uZUdyaWRUeXBlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50LCBSb3dEYXRhQ2hhbmdlZEV2ZW50LCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQsIFNvcnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWwnO1xuaW1wb3J0IHsgQ2VsbEVkaXRhYmxlUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1lZGl0YWJsZS5waXBlJztcbmltcG9ydCB7IGdldENlbGxLZXksIGdldEZpZWxkVmFsdWUgfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlcic7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtYm9keScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWJvZHkuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZEJvZHlDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIENvcmUgUHJvcGVydGllc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9keVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIGJvZHlSZWYhOiBFbGVtZW50UmVmO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSByb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuO1xuICBASW5wdXQoKSBhcGkhOiBPbmVHcmlkQXBpPFQ+O1xuICBASW5wdXQoKSBwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBnZXRSb3dJZDogKHBhcmFtczogT25lR3JpZEdldFJvd0lkUGFyYW1zPFQ+KSA9PiBzdHJpbmc7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGdyaWRDb3B5JCE6IFN1YmplY3Q8Q2xpcGJvYXJkRXZlbnQ+O1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgdmlld3BvcnQhOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdID0gW107XG4gIHByb3RlY3RlZCBjZWxsUmVuZGVyZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnc2ltcGxlJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGU8VD4gPSBudWxsO1xuICAvLyBASW5wdXQoKSBkZXRhaWxSb3dIZWlnaHQ6IG51bWJlciA9IG51bGw7XG4gIC8vIEBJbnB1dCgpIGRldGFpbFJvd0F1dG9IZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGV0YWlsUm93TWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFRyZWUgRGF0YSBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZztcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD47XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAtMTsgLy8gSXQncyB3b3JrIHdpdGggbWFzdGVyIGRldGFpbCBhbHNvXG5cbiAgLyoqXG4gICAqIFBhc3NpbmcgUm93IEFjdGlvbiBFdmVudHMgdG8gUGFyZW50XG4gICAqL1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uU2hpZnREb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgcm93Q291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGJvZHlTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIFZhcmlhYmxlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJvd1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRDZWxscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGlzTW91c2VEb3duID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhcnRDZWxsOiBDZWxsU2VsZWN0aW9uID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsTGVmdCA9IDA7XG4gIHByaXZhdGUgY2VsbEVkaXRhYmxlUGlwZSA9IG5ldyBDZWxsRWRpdGFibGVQaXBlKCk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcm90ZWN0ZWQgY2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVDZWxsUmVuZGVyZXJQYXJhbXMgPSB7XG4gICAgICBnb3RvRGV0YWlsQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgYWRkTmV3QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgdmlld0J1dHRvblN0YXR1czogMSxcbiAgICAgIGxvY2F0aW9uQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZG9jdW1lbnRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBjb3B5QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZGVsZXRlQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZ290b0xpc3RCdXR0b25TdGF0dXM6IDEsXG4gICAgICBvcHRpb25CdXR0b25TdGF0dXM6IDEsXG4gICAgICBsYW5ndWFnZUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGVkaXRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBwcmludEJ1dHRvblN0YXR1czogMSxcbiAgICAgIGhpc3RvcnlCdXR0b25TdGF0dXM6IDEsXG4gIH1cblxuICAvKipcbiAgICogVmlydHVhbCBTY3JvbGwgUHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIGl0ZW1TaXplOiBudW1iZXIgPSAzMDtcbiAgcHJvdGVjdGVkIG1pbkJ1ZmZlclB4OiBudW1iZXIgPSAyMDA7XG4gIHByb3RlY3RlZCBtYXhCdWZmZXJQeDogbnVtYmVyID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb2xTZXJ2aWNlOiBPZ0NvbHVtblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNlbGxTZXJ2aWNlOiBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gR3JpZCBDb3B5IEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmdyaWRDb3B5JC5zdWJzY3JpYmUoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuXG4gICAgICB0aGlzLm9uR3JpZENvcHkoZXZlbnQpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gWy4uLnBheWxvYWQuY29sdW1uc10gYXMgT25lQ29sdW1uRGVmW107XG5cbiAgICAgIHRoaXMuY2VsbFJlbmRlcmVyID0gdGhpcy5jb2x1bW5EZWZzLnNvbWUoY29sID0+IGNvbC5jZWxsUmVuZGVyZXJDb21wb25lbnQpO1xuXG4gICAgICB0aGlzLnJvd1dpZHRoID0gdGhpcy5jb2x1bW5EZWZzLnJlZHVjZSgoc3VtLCBjb2wpID0+IHN1bSArIChjb2wud2lkdGggPyBjb2wud2lkdGggPiBjb2wubWF4V2lkdGggPyBjb2wubWF4V2lkdGggOiBjb2wud2lkdGggPCBjb2wubWluV2lkdGggPyBjb2wubWluV2lkdGggOiBjb2wud2lkdGggOiBjb2wubWluV2lkdGgpLCAwKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZXMgfTogUm93RGF0YUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJvd0NvdW50Q2hhbmdlZC5lbWl0KG5vZGVzPy5sZW5ndGggPz8gMCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgIHRoaXMudmlld3BvcnQ/LmNoZWNrVmlld3BvcnRTaXplKCk7XG5cbiAgICAgICAgdGhpcy5zZXRWaXJ0dWFsU2Nyb2xsKG5vZGVzPy5sZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzLm1hcCgobm9kZTogT25lUm93Tm9kZSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmICYmIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICBub2RlLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUuZXhwYW5kZWQpIHtcblxuICAgICAgICAgICAgICB0aGlzLmFwaS5zZXREZXRhaWxSb3dEYXRhKG5vZGUsIFsuLi5ub2RlLmRldGFpbFJvd0RhdGFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH0pKTtcblxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFNvcnQgQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc29ydENoYW5nZWQnLCAoeyBub2RlcyB9OiBTb3J0Q2hhbmdlZEV2ZW50KSA9PiB7XG5cbiAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBTZWxlY3Rpb24gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uQ2hhbmdlZCcsIChwYXlsb2FkOiBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgaWYgKHBheWxvYWQpIHtcblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBvbkdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIG9uQm9keVNjcm9sbChldmVudDogRXZlbnQpIHtcblxuICAgIGNvbnN0IHNjcm9sbExlZnQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuXG4gICAgaWYgKHNjcm9sbExlZnQgIT09IHRoaXMubGFzdFNjcm9sbExlZnQpIHtcblxuICAgICAgdGhpcy5sYXN0U2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG5cbiAgICAgIHRoaXMuYm9keVNjcm9sbC5lbWl0KHNjcm9sbExlZnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBSZW5kZXJpbmcgUm93IE5vZGUgQnkgUm93IElEXG4gICAqL1xuICB0cmFja0J5Um93SWQoaW5kZXg6IG51bWJlciwgbm9kZTogT25lUm93Tm9kZTxUPik6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIFNlbGVjdGlvbiBSYW5nZSBGZWF0dXJlXG4gICAqL1xuICBzdGFydFNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IHsgcm93SWQsIGZpZWxkIH07XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ2VsbHMpLmFkZChnZXRDZWxsS2V5KHJvd0lkLCBmaWVsZCkpO1xuICB9XG5cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIGlmICghdGhpcy5pc01vdXNlRG93biB8fCAhdGhpcy5zdGFydENlbGwpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLm5vZGVzOyAvLyBhbHJlYWR5IHNvcnRlZFxuICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSByb3dzLmZpbmRJbmRleChyID0+IHIucm93SWQgPT09IHRoaXMuc3RhcnRDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgZW5kUm93SW5kZXggICA9IHJvd3MuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcm93SWQpO1xuXG4gICAgaWYgKHN0YXJ0Um93SW5kZXggPT09IC0xIHx8IGVuZFJvd0luZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sU3RhcnRJbmRleCA9IHRoaXMuY29sdW1uRGVmcy5maW5kSW5kZXgoYyA9PiBjLmZpZWxkID09PSB0aGlzLnN0YXJ0Q2VsbCEuZmllbGQpO1xuICAgIGNvbnN0IGNvbEVuZEluZGV4ICAgPSB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gZmllbGQpO1xuXG4gICAgaWYgKGNvbFN0YXJ0SW5kZXggPT09IC0xIHx8IGNvbEVuZEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heChzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbihjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG4gICAgY29uc3QgY29sRW5kICAgPSBNYXRoLm1heChjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2xTdGFydDsgYyA8PSBjb2xFbmQ7IGMrKykge1xuICAgICAgICBuZXh0LmFkZChnZXRDZWxsS2V5KHJvd3Nbcl0ucm93SWQsIHRoaXMuY29sdW1uRGVmc1tjXS5maWVsZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IG5leHQ7XG4gIH1cblxuXG4gIGVuZFNlbGVjdGlvbigpIHtcblxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgQ2VsbHMgU2VsZWN0ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50KSB7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmJvZHlSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuXG4gICAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIEV2ZW50IEhvbGQgTW91c2UgQ2xpY2tcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnKVxuICBvbkdsb2JhbE1vdXNlVXAoKSB7XG5cbiAgICB0aGlzLmVuZFNlbGVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBDb3B5IENsaXBib2FyZCBFdmVudFxuICAgKi9cbiAgb25HcmlkQ29weShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENlbGxzLnNpemUgPiAwKSB7XG5cbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkQ2xpcGJvYXJkVGV4dCgpO1xuXG4gICAgICBldmVudC5jbGlwYm9hcmREYXRhPy5zZXREYXRhKCd0ZXh0L3BsYWluJywgdGV4dCk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGxJZCA9PiB7XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1jZWxsLWlkPVwiJHtjZWxsSWR9XCJdYCk7XG5cbiAgICAgICAgaWYgKGNlbGxFbGVtZW50KSB7XG5cbiAgICAgICAgICBjZWxsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvbmUtY2VsbC1jb3BpZWQnKTtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2VsbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb25lLWNlbGwtY29waWVkJyksIDQwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlUb0NsaXBib2FyZCh2YWx1ZTogc3RyaW5nKSB7XG5cbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGVUZXh0KSB7XG5cbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbHVlKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIEZhbGxiYWNrIChTYWZhcmkgLyBvbGRlciBicm93c2VycylcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgIHRleHRhcmVhLnZhbHVlID0gdmFsdWU7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7XG4gICAgICB0ZXh0YXJlYS5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRhcmVhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgQ29weSBDZWxsIFRleHQgdG8gQ2xpcGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ2xpcGJvYXJkVGV4dCgpOiBzdHJpbmcge1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2VsbHMuc2l6ZSkgcmV0dXJuICcnO1xuXG4gICAgLy8gUGFyc2Ugc2VsZWN0ZWQgY2VsbHNcbiAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZENlbGxzKS5tYXAoa2V5ID0+IHtcblxuICAgICAgY29uc3QgW3Jvd0lkLCBmaWVsZF0gPSBrZXkuc3BsaXQoJy0tJyk7XG4gICAgICByZXR1cm4geyByb3dJZCwgZmllbGQgfTtcbiAgICB9KTtcblxuICAgIC8vIFJlc29sdmUgdmlzdWFsIHJvdyBpbmRleGVzIGZyb20gZGlzcGxheWVkUm93c1xuICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBzZWxlY3RlZFxuICAgICAgLm1hcChzID0+IHRoaXMubm9kZXMuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcy5yb3dJZCkpXG4gICAgICAuZmlsdGVyKGkgPT4gaSAhPT0gLTEpO1xuXG4gICAgY29uc3QgY29sSW5kZXhlcyA9IHNlbGVjdGVkXG4gICAgICAubWFwKHMgPT4gdGhpcy5jb2x1bW5EZWZzLmZpbmRJbmRleChjID0+IGMuZmllbGQgPT09IHMuZmllbGQpKVxuICAgICAgLmZpbHRlcihpID0+IGkgIT09IC0xKTtcblxuICAgIGlmICghcm93SW5kZXhlcy5sZW5ndGggfHwgIWNvbEluZGV4ZXMubGVuZ3RoKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCByb3dTdGFydCA9IE1hdGgubWluKC4uLnJvd0luZGV4ZXMpO1xuICAgIGNvbnN0IHJvd0VuZCAgID0gTWF0aC5tYXgoLi4ucm93SW5kZXhlcyk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbiguLi5jb2xJbmRleGVzKTtcbiAgICBjb25zdCBjb2xFbmQgICA9IE1hdGgubWF4KC4uLmNvbEluZGV4ZXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSB0aGlzLmNvbHVtbkRlZnNcbiAgICAgIC5zbGljZShjb2xTdGFydCwgY29sRW5kICsgMSlcbiAgICAgIC5tYXAoYyA9PiBjLmZpZWxkKTtcblxuICAgIGNvbnN0IGNsaXBib2FyZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgciA9IHJvd1N0YXJ0OyByIDw9IHJvd0VuZDsgcisrKSB7XG5cbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMubm9kZXNbcl07XG4gICAgICBjb25zdCBsaW5lID0gc2VsZWN0ZWRGaWVsZHNcbiAgICAgICAgLm1hcChmaWVsZCA9PiB7XG5cbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHtyb3cucm93SWR9LS0ke2ZpZWxkfWA7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDZWxscy5oYXMoa2V5KSkge1xuXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShyb3cuZGF0YSwgZmllbGQpO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xuXG4gICAgICAgIH0pLmpvaW4oJ1xcdCcpO1xuXG4gICAgICBjbGlwYm9hcmRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwYm9hcmRMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kaW5nIEV2ZW50cyBSb3cgQWN0aW9uIHRvIFBhcmVudFxuICAgKi9cbiAgaW52b2tlUm93QWN0aW9uR290b0RldGFpbChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93R290b0RldGFpbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkFkZE5ldyhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93QWRkTmV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uVmlldyhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Vmlldy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxvY2F0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMb2NhdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRvY3VtZW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEb2N1bWVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNvcHkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NvcHkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25EZWxldGUoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkdvdG9MaXN0KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvTGlzdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkVkaXQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0VkaXQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25QcmludChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93UHJpbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25IaXN0b3J5KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dIaXN0b3J5LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uT3B0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25MYW5ndWFnZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93TGFuZ3VhZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dDZWxsT3B0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dTZWxlY3Rpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudCk6IHZvaWQge1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgY2VsbE9wdGlvbk1lbnVTZWxlY3RlZChldmVudDogQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lhbCBFdmVudHNcbiAgICovXG4gIHByaXZhdGUgaW52b2tlU2hpZnREb3VibGVDbGljayhub2RlOk9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBsZXQgZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGV2ZW50ID0geyAuLi5ldmVudCwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25TaGlmdERvdWJsZUNsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENlbGwgRWRpdCBGZWF0dXJlXG4gICAqL1xuICBzdGFydEVkaXQoZXZlbnQ6IE1vdXNlRXZlbnQsIG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2knKSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcblxuICAgICAgdGhpcy5pbnZva2VTaGlmdERvdWJsZUNsaWNrKG5vZGUsIGNvbHVtbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNlbGxFZGl0YWJsZVBpcGUudHJhbnNmb3JtKG5vZGUuY2VsbFN0YXRlcywgY29sdW1uLCBub2RlLCB0aGlzLmNlbGxTZXJ2aWNlLmVkaXRhYmxlRm4sIHRoaXMuY2VsbFNlcnZpY2UudXBkYXRhYmxlRm4sIHRoaXMuYWxsb3dlZEVkaXQpKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuXG4gICAgICBjb25zdCBjZWxsS2V5ID0gZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuYWRkKGNlbGxLZXkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gdHJ1ZTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KGBbZGF0YS1jZWxsLWlkPVwiJHsgZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpIH1cIl0gaW5wdXRgKTtcblxuICAgICAgICBpZiAoaW5wdXQpIHtcblxuICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHZhbHVlICYmIFtcInRleHRcIl0uaW5jbHVkZXMoaW5wdXQudHlwZSkpIHtcblxuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UodmFsdWUubGVuZ3RoLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIDEwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBDZWxsIEVkaXQgTW9kZVxuICAgKi9cbiAgc3RvcEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4sIGV2ZW50OiBhbnkpIHtcblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy5zZXRDZWxsVmFsdWVCeVJvd0lkKG5vZGUucm93SWQsIGNvbHVtbiwgdmFsdWUpO1xuXG4gICAgICByb3dOb2RlLmNlbGxTdGF0ZXMgPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhyb3dOb2RlKTtcbiAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NlbGxTdGF0ZUNoYW5nZWQnLCB7XG4gICAgICAgIGRhdGE6IHJvd05vZGUuZGF0YSxcbiAgICAgICAgbm9kZTogcm93Tm9kZSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgQ2VsbCBFZGl0IE1vZGVcbiAgICovXG4gIGNhbmNlbEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgQ2VsbCBWYWx1ZVxuICAgKi9cbiAgc2V0Q2VsbFZhbHVlQnlSb3dJZChyb3dJZDogc3RyaW5nLCBjb2x1bW46IE9uZUNvbHVtbkRlZiwgdmFsdWU6IGFueSkge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmIChub2RlICYmIGNvbHVtbi5maWVsZCkge1xuXG4gICAgICBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSAhPT0gJ251bWJlcicpIHtcblxuICAgICAgICBub2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IHZhbHVlID09PSAnJyA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IHZhbHVlID09PSAnJyA/IG51bGwgOiBOdW1iZXIodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIFNjcm9sbCBQcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRWaXJ0dWFsU2Nyb2xsKGl0ZW1zOiBudW1iZXIgPSAwKTogdm9pZCB7XG5cbiAgICB0aGlzLm1pbkJ1ZmZlclB4ID0gdGhpcy5pdGVtU2l6ZSAqIGl0ZW1zICogMS41O1xuXG4gICAgdGhpcy5tYXhCdWZmZXJQeCA9IHRoaXMubWluQnVmZmVyUHggKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIEFsbCBTdWJzY3JpcHRpb25zXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2ICNib2R5UmVmIGNsYXNzPVwib25lLWdyaWQtYm9keVwiPlxuICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJvbmUtZ3JpZC1ib2R5LXZpZXdwb3J0XCJcbiAgICAgICAgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCJcbiAgICAgICAgW21pbkJ1ZmZlclB4XT1cIm1pbkJ1ZmZlclB4XCJcbiAgICAgICAgW21heEJ1ZmZlclB4XT1cIm1heEJ1ZmZlclB4XCJcbiAgICAgICAgKHNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm9kZSBvZiBub2RlczsgdHJhY2tCeTogdHJhY2tCeVJvd0lkO1wiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvd1wiIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWRcIiBbY2xhc3Mub25lLXJvdy1zZWxlY3RlZF09XCJub2RlLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHVtbkRlZnM7IHRyYWNrIGNvbC5maWVsZDspIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBub2RlLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29sdW1uOiBjb2wgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEN1c3RvbSBEZXRhaWwgQ29tcG9uZW50IC0tPlxuICAgICAgICAgICAgIEBpZihub2RlLmxlYWYgJiYgbm9kZS5kZXRhaWxBY3RpdmUgJiYgbm9kZT8uZGV0YWlsUmVuZGVyZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyQ29tcG9uZW50XT1cIm5vZGU/LmRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW3BhcmFtc109XCJ7IGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIG5vZGU6IG5vZGUsIGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIE1hc3RlciBEZXRhaWwgR3JpZCAodGVtcGxhdGUgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCBvbmUtZ3JpZCB0byBhdm9pZCBhIGNvbXBpbGUtdGltZSBpbXBvcnQgY3ljbGUpIC0tPlxuICAgICAgICAgICAgQGlmIChtYXN0ZXJEZXRhaWwgJiYgbm9kZS5leHBhbmRlZCAmJiBub2RlPy5kZXRhaWxSb3dEYXRhKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3ctZGV0YWlsLWNvbnRhaW5lclwiIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWQgKyAnLWRldGFpbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGV0YWlsR3JpZFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogbm9kZSwgbm9kZTogbm9kZSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgQGlmICghbm9kZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiBtYXgtY29udGVudDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cInJvd1dpZHRoXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgIEBpZiAoIW5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC1lbXB0eS1tZXNzYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiPk5vIFJvd3MgdG8gU2hvdzwvc3Bhbj5cbiAgICB9XG48L2Rpdj5cblxuPCEtLSBNYXN0ZXIgQ29sdW1uIFRlbXBsYXRlICAtLT5cbjxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlIGxldC1ub2RlPVwibm9kZVwiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvbmUtY29sdW1uXCJcbiAgICAgICAgW2F0dHIuZGF0YS1jZWxsLWlkXT1cIm5vZGUucm93SWQgfCBjZWxsS2V5OmNvbHVtbi5maWVsZFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4/LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW4/Lm1pbldpZHRoXCJcbiAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4/Lm1heFdpZHRoXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tYm9yZGVyLXRvcF09XCJtYXN0ZXJEZXRhaWwgJiYgbm9kZXM/Lmxlbmd0aCA+IDAgJiYgbm9kZXNbbm9kZS5yb3dJbmRleCAtIDFdPy5leHBhbmRlZFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY2VsbC1zZWxlY3RlZF09XCJzZWxlY3RlZENlbGxzIHwgY2VsbFNlbGVjdGVkOm5vZGUucm93SWQ6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jZWxsLWludmFsaWRdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbEludmFsaWQ6bm9kZS5kYXRhW2NvbHVtbi5maWVsZF06Y29sdW1uOm5vZGU6YWxsb3dlZEVkaXQ6c3VibWl0dGVkXCJcbiAgICAgICAgKGRibGNsaWNrKT1cInN0YXJ0RWRpdCgkZXZlbnQsIG5vZGUsIGNvbHVtbilcIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0U2VsZWN0aW9uKG5vZGUucm93SWQsIGNvbHVtbi5maWVsZClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJleHRlbmRTZWxlY3Rpb24obm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKVwiXG4gICAgICAgIChtb3VzZXVwKT1cImVuZFNlbGVjdGlvbigpXCI+XG5cbiAgICAgICAgPCEtLSBPbmUgR3JpZCBDZWxsIE9wdGlvbiAtLT5cbiAgICAgICAgQGlmIChub2RlLmNlbGxPcHRpb25zW2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgIDxvbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51XG4gICAgICAgICAgICAgICAgI2NvbnRleHRPcHRpb25NZW51UmVmXG4gICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5jZWxsT3B0aW9uTWVudVwiXG4gICAgICAgICAgICAgICAgKGNlbGxPcHRpb25NZW51U2VsZWN0KT1cImNlbGxPcHRpb25NZW51U2VsZWN0ZWQoJGV2ZW50KVwiLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gR3JpZCBDZWxsIFRlbXBsYXRlIC0tPlxuICAgICAgICBAaWYoY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBvbmVDZWxsUmVuZGVyZXJDb21wb25lbnRcbiAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyQ29tcG9uZW50XT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInsgZGF0YTogbm9kZS5kYXRhLCBmaWVsZDogY29sdW1uLmZpZWxkLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29sdW1uRGVmOiBjb2x1bW4sIG5vZGU6IG5vZGUsIGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKG5vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgICA8IS0tIENlbGwgRWRpdGluZyBJbnB1dCAtLT5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm9uZS1jZWxsLWlucHV0XCJcbiAgICAgICAgICAgICAgICBuYW1lPVwie3sgbm9kZS5yb3dJZCArICcnICsgY29sdW1uLmZpZWxkIH19XCJcbiAgICAgICAgICAgICAgICBvbmVDZWxsSW5wdXRWYWxpZGF0b3JcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblR5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAndGV4dCcgOiBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwibm9kZT8uZGF0YVtjb2x1bW4/LmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyNTBcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFZGl0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic3RvcEVkaXQobm9kZSwgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2MpPVwiY2FuY2VsRWRpdChub2RlLCBjb2x1bW4pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogY29sdW1uLndpZHRoICsgJ3B4JyAsIHBvc2l0aW9uOiAncmVsYXRpdmUnIH1cIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZWRpdGFibGUtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWNlbGxcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LWxlZnRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtY2VudGVyXT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAnY2VudGVyJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtcmlnaHRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbFNlcnZpY2UucmVzb2x2ZUNlbGxQcmVzZW50YXRpb24oY29sdW1uLCB7IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSwgY29sdW1uRGVmOiBjb2x1bW4gfSkuX3Jlc29sdmVkQ2VsbENsYXNzXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2xTZXJ2aWNlLnJlc29sdmVDZWxsUHJlc2VudGF0aW9uKGNvbHVtbiwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uIH0pLl9yZXNvbHZlZENlbGxTdHlsZVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCJjb2x1bW4uYXV0b0dyb3VwRmllbGQgJiYgbm9kZS5sZXZlbCB8IGNlbGxMZXZlbFBhZGRpbmc6MjRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtY2VsbC1hbGxvd2VkLWVkaXQtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQ2hlY2tib3ggU2VsZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uPy5jaGVja2JveFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdGlvbik9XCJpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBFeHBhbmQgJiBDb2xsYXBzZSBJY29uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoKChub2RlPy5ncm91cCB8fCBkZXRhaWxSZW5kZXJlckNvbXBvbmVudCkgJiYgY29sdW1uPy5hdXRvR3JvdXBGaWVsZCkgfHwgKG1hc3RlckRldGFpbCAmJiBub2RlPy5leHBhbmRhYmxlICYmIGdyaWRUeXBlID09PSAnbWFzdGVyJyAmJiBjb2x1bW4/Lm1hc3Rlckdyb3VwRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxSZW5kZXJlckNvbXBvbmVudF09XCJkZXRhaWxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwYW5zaW9uQ2hhbmdlZCk9XCJpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInsgZGF0YTogbm9kZS5kYXRhLCBmaWVsZDogY29sdW1uLmZpZWxkLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29sdW1uRGVmOiBjb2x1bW4sIG5vZGU6IG5vZGUsIGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIENlbGwgVmFsdWUgT1IgUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgb25lQ2VsbFRleHRFeHBhbmQgY2xhc3M9XCJvbmUtY2VsbC10ZXh0XCIgW2NsYXNzLm9uZS1jZWxsLXBsYWNlaG9sZGVyXT1cIm5vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdPy50eXBlID09PSAncGxhY2Vob2xkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAobm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zIHwgY2VsbEFjdGlvbkJ1dHRvbkVuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtcm93LWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFzdGVyTm9kZV09XCJtYXN0ZXJOb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJQYXJhbXNdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93QWRkTmV3KT1cImludm9rZVJvd0FjdGlvbkFkZE5ldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RG9jdW1lbnQpPVwiaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0xpc3QpPVwiaW52b2tlUm93QWN0aW9uR290b0xpc3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0hpc3RvcnkpPVwiaW52b2tlUm93QWN0aW9uSGlzdG9yeSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0NlbGxPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==