@acorex/data-grid 3.0.66 → 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. package/acorex-data-grid.d.ts +1 -0
  2. package/esm2020/acorex-data-grid.mjs +5 -0
  3. package/esm2020/lib/data-grid/columns/check-column.component.mjs +117 -0
  4. package/esm2020/lib/data-grid/columns/column.component.mjs +164 -0
  5. package/{esm2015/lib/data-grid/columns/command-column.component.js → esm2020/lib/data-grid/columns/command-column.component.mjs} +46 -35
  6. package/esm2020/lib/data-grid/columns/date-column.component.mjs +112 -0
  7. package/esm2020/lib/data-grid/columns/row-number-column.component.mjs +37 -0
  8. package/esm2020/lib/data-grid/columns/selection-column.component.mjs +42 -0
  9. package/esm2020/lib/data-grid/columns/text-column.component.mjs +89 -0
  10. package/esm2020/lib/data-grid/datagrid.component.mjs +658 -0
  11. package/esm2020/lib/data-grid/datagrid.events.mjs +2 -0
  12. package/esm2020/lib/data-grid/datagrid.module.mjs +145 -0
  13. package/esm2020/lib/data-grid/filters/filter.component.mjs +39 -0
  14. package/esm2020/lib/data-grid/templates/cell-template.component.mjs +53 -0
  15. package/esm2020/lib/data-grid/templates/detail-template.component.mjs +46 -0
  16. package/esm2020/lib/data-grid/templates/row-template.component.mjs +43 -0
  17. package/esm2020/lib/data-lov/data-lov-popup/data-lov-popup.component.mjs +118 -0
  18. package/esm2020/lib/data-lov/data-lov.component.mjs +163 -0
  19. package/esm2020/lib/data-lov/data-lov.module.mjs +23 -0
  20. package/esm2020/public-api.mjs +18 -0
  21. package/fesm2015/acorex-data-grid.mjs +1875 -0
  22. package/fesm2015/acorex-data-grid.mjs.map +1 -0
  23. package/fesm2020/acorex-data-grid.mjs +1875 -0
  24. package/fesm2020/acorex-data-grid.mjs.map +1 -0
  25. package/lib/data-grid/columns/check-column.component.d.ts +7 -0
  26. package/lib/data-grid/columns/column.component.d.ts +3 -0
  27. package/lib/data-grid/columns/command-column.component.d.ts +5 -0
  28. package/lib/data-grid/columns/date-column.component.d.ts +5 -0
  29. package/lib/data-grid/columns/row-number-column.component.d.ts +3 -0
  30. package/lib/data-grid/columns/selection-column.component.d.ts +3 -0
  31. package/lib/data-grid/columns/text-column.component.d.ts +5 -0
  32. package/lib/data-grid/datagrid.component.d.ts +3 -0
  33. package/lib/data-grid/datagrid.module.d.ts +20 -0
  34. package/lib/data-grid/filters/filter.component.d.ts +3 -0
  35. package/lib/data-grid/templates/cell-template.component.d.ts +5 -0
  36. package/lib/data-grid/templates/detail-template.component.d.ts +5 -0
  37. package/lib/data-grid/templates/row-template.component.d.ts +5 -0
  38. package/lib/data-lov/data-lov-popup/data-lov-popup.component.d.ts +3 -0
  39. package/lib/data-lov/data-lov.component.d.ts +3 -0
  40. package/lib/data-lov/data-lov.module.d.ts +10 -0
  41. package/package.json +23 -13
  42. package/acorex-data-grid.metadata.json +0 -1
  43. package/bundles/acorex-data-grid.umd.js +0 -2261
  44. package/bundles/acorex-data-grid.umd.js.map +0 -1
  45. package/bundles/acorex-data-grid.umd.min.js +0 -16
  46. package/bundles/acorex-data-grid.umd.min.js.map +0 -1
  47. package/esm2015/acorex-data-grid.js +0 -5
  48. package/esm2015/lib/data-grid/columns/check-column.component.js +0 -104
  49. package/esm2015/lib/data-grid/columns/column.component.js +0 -204
  50. package/esm2015/lib/data-grid/columns/date-column.component.js +0 -114
  51. package/esm2015/lib/data-grid/columns/row-number-column.component.js +0 -39
  52. package/esm2015/lib/data-grid/columns/selection-column.component.js +0 -48
  53. package/esm2015/lib/data-grid/columns/text-column.component.js +0 -81
  54. package/esm2015/lib/data-grid/datagrid.component.js +0 -734
  55. package/esm2015/lib/data-grid/datagrid.events.js +0 -1
  56. package/esm2015/lib/data-grid/datagrid.module.js +0 -98
  57. package/esm2015/lib/data-grid/filters/filter.component.js +0 -25
  58. package/esm2015/lib/data-grid/templates/cell-template.component.js +0 -47
  59. package/esm2015/lib/data-grid/templates/detail-template.component.js +0 -45
  60. package/esm2015/lib/data-grid/templates/row-template.component.js +0 -40
  61. package/esm2015/lib/data-lov/data-lov-popup/data-lov-popup.component.js +0 -121
  62. package/esm2015/lib/data-lov/data-lov.component.js +0 -212
  63. package/esm2015/lib/data-lov/data-lov.module.js +0 -21
  64. package/esm2015/public-api.js +0 -17
  65. package/esm5/acorex-data-grid.js +0 -5
  66. package/esm5/lib/data-grid/columns/check-column.component.js +0 -102
  67. package/esm5/lib/data-grid/columns/column.component.js +0 -206
  68. package/esm5/lib/data-grid/columns/command-column.component.js +0 -98
  69. package/esm5/lib/data-grid/columns/date-column.component.js +0 -119
  70. package/esm5/lib/data-grid/columns/row-number-column.component.js +0 -42
  71. package/esm5/lib/data-grid/columns/selection-column.component.js +0 -52
  72. package/esm5/lib/data-grid/columns/text-column.component.js +0 -81
  73. package/esm5/lib/data-grid/datagrid.component.js +0 -792
  74. package/esm5/lib/data-grid/datagrid.events.js +0 -1
  75. package/esm5/lib/data-grid/datagrid.module.js +0 -101
  76. package/esm5/lib/data-grid/filters/filter.component.js +0 -16
  77. package/esm5/lib/data-grid/templates/cell-template.component.js +0 -46
  78. package/esm5/lib/data-grid/templates/detail-template.component.js +0 -49
  79. package/esm5/lib/data-grid/templates/row-template.component.js +0 -44
  80. package/esm5/lib/data-lov/data-lov-popup/data-lov-popup.component.js +0 -127
  81. package/esm5/lib/data-lov/data-lov.component.js +0 -222
  82. package/esm5/lib/data-lov/data-lov.module.js +0 -24
  83. package/esm5/public-api.js +0 -17
  84. package/fesm2015/acorex-data-grid.js +0 -1939
  85. package/fesm2015/acorex-data-grid.js.map +0 -1
  86. package/fesm5/acorex-data-grid.js +0 -2017
  87. package/fesm5/acorex-data-grid.js.map +0 -1
@@ -1,734 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { Component, ContentChild, Input, ContentChildren, QueryList, EventEmitter, Output, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';
3
- import { AXDataSourceComponent } from '@acorex/components';
4
- import { AXGridDataColumn } from './columns/column.component';
5
- import { LicenseManager } from 'ag-grid-enterprise';
6
- import { ViewEncapsulation } from '@angular/core';
7
- import { AXDataGridRowTemplateComponent } from './templates/row-template.component';
8
- import { AXToolbarSearchComponent, AXToolbarComponent, AXDataEvent, AXValueEvent } from '@acorex/components';
9
- import { AXDataGridDetailTemplateComponent } from './templates/detail-template.component';
10
- import { AXTranslator } from '@acorex/core';
11
- import { AXDatePickerFilterComponent } from './columns/date-column.component';
12
- import { AXConfig } from '@acorex/core';
13
- LicenseManager.prototype.validateLicense = function () {
14
- //console.info('Cracked by Arash Oshnoudi!');
15
- };
16
- // WatermarkComp.prototype.shouldDisplayWatermark = function () {
17
- // return false;
18
- // }
19
- export class AXDataGridColumnsChangeEvent extends AXValueEvent {
20
- }
21
- export class AXDataGridCellEvent extends AXDataEvent {
22
- }
23
- export class AXDaagridRowClickEvent extends AXDataEvent {
24
- }
25
- export class AXDataGridSelectionChangeEvent extends AXDataEvent {
26
- }
27
- export class AXDataGridRowSelectionChangeEvent extends AXDataEvent {
28
- }
29
- let AXDataGridComponent = class AXDataGridComponent {
30
- constructor(ref, cdr) {
31
- this.ref = ref;
32
- this.cdr = cdr;
33
- this.columnDefs = [];
34
- this.rowModelType = 'clientSide';
35
- this.frameworkComponents = {};
36
- this.internalHeight = '100%';
37
- this.masterDetail = false;
38
- this.treeData = false;
39
- this.enabelSelect = false;
40
- this.gridView = false;
41
- this.groupSelectsChildren = false;
42
- this.oldSelectionNodes = [];
43
- this.paginationAutoPageSize = true;
44
- this.paginationPageSize = 10;
45
- this.cacheBlockSize = 10;
46
- // @Input()
47
- // showRowNumber: boolean = true;
48
- this.remoteOperation = false;
49
- this.rowMultiSelectWithClick = true;
50
- this.suppressRowClickSelection = true;
51
- this.suppressCellSelection = false;
52
- this.sizeColumnsToFit = true;
53
- this.showCheckBox = true;
54
- this.floatingFilter = false;
55
- // @Input()
56
- // takeCount: number;
57
- this.autoGroupColumnDef = {};
58
- this.selectionMode = 'single';
59
- // @Input()
60
- // allowFiltering: boolean = false;
61
- this.selectRow = [];
62
- this.rowGroupPanelShow = 'never';
63
- this.loadOnInit = true;
64
- // @Input()
65
- // groupDefaultExpanded: number = 0;
66
- this.keyField = 'null';
67
- this.hasChildField = 'null';
68
- this.columnsChange = new EventEmitter();
69
- this._columns = [];
70
- this.defaultColDef = {
71
- filter: true,
72
- floatingFilter: true
73
- };
74
- this.groupHideOpenParents = false;
75
- this.cellClick = new EventEmitter();
76
- this.cellDbClick = new EventEmitter();
77
- this.cellFocuse = new EventEmitter();
78
- this.rowClick = new EventEmitter();
79
- this.rowDbClick = new EventEmitter();
80
- this.selectionChanged = new EventEmitter();
81
- this.rowSelectionChange = new EventEmitter();
82
- this.onRowSelectionChanged = new EventEmitter();
83
- this.rtl = AXConfig.get('layout.rtl');
84
- this.isServerSideGroup = (e) => {
85
- return e[this.hasChildField];
86
- };
87
- this.getColumnDefs = () => {
88
- return this.gridApi.getColumnDefs();
89
- };
90
- this.getCurrentPageNumber = () => {
91
- return {
92
- current: this.gridApi.paginationGetCurrentPage() + 1,
93
- total: this.gridApi.paginationGetTotalPages()
94
- };
95
- };
96
- this.getServerSideGroupKey = (e) => {
97
- return e[this.keyField];
98
- };
99
- this.internalGetRowClass = (p) => {
100
- if (this.rowClass) {
101
- if (this.rowClass instanceof Function) {
102
- return this.rowClass({
103
- rowIndex: p.node.rowIndex,
104
- rowLevel: p.node.level,
105
- data: p.data
106
- });
107
- }
108
- else {
109
- return this.rowClass;
110
- }
111
- }
112
- };
113
- this.localeText = AXTranslator.get('dataGrid');
114
- }
115
- get searchText() {
116
- return this._searchText;
117
- }
118
- set searchText(v) {
119
- if (v !== this._searchText) {
120
- this._searchText = v;
121
- if (this.gridApi) {
122
- this.refresh();
123
- this.gridApi.setQuickFilter(this.searchText);
124
- }
125
- }
126
- }
127
- get filter() {
128
- return this._filter;
129
- }
130
- set filter(v) {
131
- if (v !== this._filter) {
132
- this._filter = v;
133
- this._filter.forEach((f) => {
134
- const fc = this.gridApi.getFilterInstance(f.field);
135
- if (fc) {
136
- const ff = fc.getFrameworkComponentInstance();
137
- ff.setModel(f);
138
- }
139
- });
140
- }
141
- }
142
- get columns() {
143
- return this._inlineColumns ? [...this._columns, ...this._inlineColumns.toArray()] : this._columns;
144
- }
145
- set columns(val) {
146
- if (val && val.length) {
147
- let old = this._columns;
148
- this._columns = val;
149
- this.columnsChange.emit({ component: this, value: val, oldValue: old, htmlElement: this.ref.nativeElement });
150
- }
151
- }
152
- get dataSource() {
153
- return this._dataSource ? this._dataSource : this._contentDataSource;
154
- }
155
- set dataSource(v) {
156
- this._dataSource = v;
157
- }
158
- getRowHeight(param) {
159
- if (param.data && param.data.rowHeight && param.node.level == 0) {
160
- return param.data.rowHeight;
161
- }
162
- else if (this.masterDetail == true && param.node.level == 1) {
163
- return this.detailRowHeight;
164
- }
165
- else if (this.masterDetail == false && param.data && param.data.rowHeight) {
166
- return param.data.rowHeight;
167
- }
168
- else {
169
- return null;
170
- }
171
- }
172
- calcHeight() {
173
- if (this.toolbar) {
174
- this.internalHeight = `calc(100% - ${40}px)`;
175
- }
176
- else {
177
- this.internalHeight = '100%';
178
- }
179
- }
180
- get intenalGridDataSource() {
181
- const that = this;
182
- return {
183
- rowCount: null,
184
- getRows: (params) => {
185
- // that.gridApi.gridOptionsWrapper.setProperty('cacheBlockSize', this.takeCount ? this.takeCount : params.api.paginationGetPageSize());
186
- that.dataSourceSuccessCallback = params.successCallback;
187
- const loadParams = {};
188
- loadParams.searchText = that.searchText;
189
- loadParams.skip = params.request.startRow;
190
- // loadParams.take = params.request.endRow - params.request.startRow;
191
- //// loadParams.take = that.takeCount ? that.takeCount : params.api.paginationGetPageSize() * 2;
192
- loadParams.take = params.request.endRow - params.request.startRow;
193
- loadParams.sort = params.request.sortModel.map((c) => {
194
- return {
195
- field: c.colId,
196
- dir: c.sort
197
- };
198
- });
199
- // loadParams.groups = params.request.rowGroupCols.map(r => r.field);
200
- // loadParams.groupKeys = params.request.groupKeys;
201
- // loadParams.data = params.parentNode.data;
202
- loadParams.group = {
203
- fields: params.request.rowGroupCols.map((r) => r.field),
204
- keys: params.request.groupKeys,
205
- parentData: params.parentNode.data
206
- };
207
- loadParams.filter = params.request.filterModel;
208
- debugger;
209
- /// setTimeout(() => {
210
- that.dataSource.fetch(loadParams);
211
- // }, 5000);
212
- }
213
- };
214
- }
215
- getMainMenuItems(e) {
216
- return ['pinSubMenu', 'separator'];
217
- }
218
- ngOnDestroy() {
219
- this.gridApi.destroy();
220
- }
221
- paginationGoToPage(number) {
222
- this.gridApi.paginationGoToPage(number - 1);
223
- }
224
- // todo gridOptions: GridOptions
225
- internalGridReady(gridOptions) {
226
- //// gridOptions.api.checkGridSize();
227
- //// this.takeCount = this.takeCount ? this.takeCount : gridOptions.api.paginationGetPageSize() * 2;
228
- // this.takeCount = this.takeCount < 20 ? 20 : this.takeCount;
229
- //// gridOptions.api.gridOptionsWrapper.setProperty('cacheBlockSize', this.takeCount);
230
- this.gridApi = gridOptions.api;
231
- this.mapColumns();
232
- this.calcHeight();
233
- if (!this.loadOnInit) {
234
- this.loadOnInit = true;
235
- return;
236
- }
237
- if (this.remoteOperation) {
238
- this.gridApi.setServerSideDatasource(this.intenalGridDataSource);
239
- }
240
- if (!this.remoteOperation) {
241
- this.refresh();
242
- }
243
- }
244
- ngAfterContentInit() {
245
- const that = this;
246
- if (this.rowTemplate) {
247
- this.fullWidthCellRendererFramework = this.rowTemplate.renderer;
248
- this.fullWidthCellRendererParams = this.rowTemplate.params;
249
- }
250
- this.frameworkComponents.agDateInput = AXDatePickerFilterComponent;
251
- if (this.gridDetailTemplate) {
252
- this.masterDetail = true;
253
- this.detailCellRendererParams = this.gridDetailTemplate.params;
254
- this.detailCellRenderer = 'detailRendererFramework';
255
- this.frameworkComponents.detailRendererFramework = this.gridDetailTemplate.renderer;
256
- this.detailRowHeight = this.gridDetailTemplate.height;
257
- }
258
- this.isFullWidthCell = () => {
259
- return that.rowTemplate != null;
260
- };
261
- //this.cdr
262
- }
263
- ngOnInit() {
264
- // if (this.takeCount && this.takeCount > 0) {
265
- // this.paginationPageSize = this.takeCount;
266
- // this.paginationAutoPageSize = false;
267
- // this.cacheBlockSize = this.takeCount;
268
- // }
269
- if (this.selectionMode === 'single') {
270
- this.groupSelectsChildren = false;
271
- }
272
- if (this.keyField !== 'null' && this.hasChildField !== 'null') {
273
- this.rowGroupPanelShow = 'never';
274
- this.treeData = true;
275
- }
276
- if (this.remoteOperation) {
277
- this.rowModelType = 'serverSide';
278
- }
279
- //
280
- if (this.rtl == null) {
281
- this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
282
- }
283
- //
284
- }
285
- gridSelectRow() {
286
- if (this.gridApi) {
287
- if (this.selectRow && this.selectRow.length > 0 && this.gridApi !== undefined && typeof this.selectRow[0] != 'object') {
288
- this.gridApi.forEachNode((node) => {
289
- if (node.data !== undefined) {
290
- let select = false;
291
- this.selectRow.forEach((id) => {
292
- if (node.data[this.keyField] === id) {
293
- select = true;
294
- node.setSelected(select);
295
- }
296
- });
297
- }
298
- });
299
- }
300
- else {
301
- this.gridApi.forEachNode((node) => {
302
- if (node.data !== undefined) {
303
- let select = false;
304
- this.selectRow.forEach((item) => {
305
- if (item.rowIndex != undefined && item.rowLevel != undefined) {
306
- if (node.data[this.keyField] === item.data[this.keyField]) {
307
- select = true;
308
- }
309
- }
310
- else {
311
- if (node.data[this.keyField] === item[this.keyField]) {
312
- select = true;
313
- }
314
- }
315
- });
316
- node.setSelected(select);
317
- }
318
- });
319
- }
320
- }
321
- }
322
- // ngAfterViewChecked(): void {
323
- // //Called after every check of the component's view. Applies to components only.
324
- // //Add 'implements AfterViewChecked' to the class.
325
- // // this.selectByValues();
326
- // this.enabelSelect = false;
327
- // }
328
- rebuildGrid() {
329
- this.mapColumns();
330
- setTimeout(() => {
331
- if (this.sizeColumnsToFit) {
332
- this.gridApi.sizeColumnsToFit();
333
- }
334
- }, 10);
335
- }
336
- ngAfterViewInit() {
337
- if (this.treeData === true) {
338
- this.columnDefs = this.columns.map((c) => c.render());
339
- const groupColumn = this.columnDefs.find((c) => c.rowGroupIndex == '0' && c.field !== '');
340
- this.autoGroupColumnDef = {
341
- headerName: groupColumn.headerName,
342
- width: groupColumn.width,
343
- cellRendererParams: { checkbox: this.showCheckBox },
344
- field: groupColumn.field
345
- };
346
- this.columnDefs.forEach((elm) => {
347
- if (elm.rowGroupIndex > -1) {
348
- elm.hide = true;
349
- }
350
- });
351
- }
352
- //setTimeout(() => {
353
- this.gridView = true;
354
- //});
355
- this.enabelSelect = true;
356
- this.dataSource.onDataReceived.subscribe((_data) => {
357
- debugger;
358
- const result = _data.data.result;
359
- this.hideLoading();
360
- let items;
361
- let totalCount;
362
- if (Array.isArray(result)) {
363
- items = result;
364
- totalCount = result.length;
365
- }
366
- else {
367
- items = result.items;
368
- totalCount = result.totalCount;
369
- }
370
- if (this.dataSourceSuccessCallback) {
371
- if (!this.loadOnInit) {
372
- this.dataSourceSuccessCallback([], 0);
373
- }
374
- else {
375
- this.dataSourceSuccessCallback(items, totalCount);
376
- }
377
- }
378
- else {
379
- if (!this.loadOnInit && this.gridApi !== undefined) {
380
- this.gridApi.setRowData([]);
381
- }
382
- else if (this.gridApi !== undefined) {
383
- this.gridApi.setRowData(items);
384
- }
385
- }
386
- this.gridSelectRow();
387
- });
388
- this.dataSource.onFetchStart.subscribe(() => {
389
- this.showLoading();
390
- });
391
- if (this.searchInput) {
392
- this.searchInput.onValueChanged.subscribe((c) => {
393
- this.searchText = c.value;
394
- });
395
- }
396
- //
397
- this.cdr.detectChanges();
398
- }
399
- mapColumns() {
400
- this.columnDefs = this.columns.map((c) => c.render());
401
- // if (this.showRowNumber) {
402
- // this.columnDefs.push({
403
- // headerName: AXConfig.get('layout.rtl') ? 'ردیف' : 'Row',
404
- // valueGetter: 'node.rowIndex + 1',
405
- // pinned: AXConfig.get('layout.rtl') ? 'right' : 'left'
406
- // });
407
- // }
408
- if (this.gridDetailTemplate) {
409
- if (this.columnDefs[0].checkboxSelection === true && this.columnDefs[0].field === '') {
410
- this.columnDefs[1].cellRenderer = 'agGroupCellRenderer';
411
- }
412
- else {
413
- this.columnDefs[0].cellRenderer = 'agGroupCellRenderer';
414
- }
415
- }
416
- if (this.hasChildField === 'null') {
417
- const groupColumn = this.columnDefs.find((c) => c.rowGroupIndex === undefined && c.field !== '');
418
- if (groupColumn && this.groupHideOpenParents == false) {
419
- this.autoGroupColumnDef = {
420
- headerName: groupColumn.headerName,
421
- width: groupColumn.width,
422
- cellRendererParams: { checkbox: this.showCheckBox },
423
- field: groupColumn.field
424
- };
425
- // groupColumn.hide = true;
426
- }
427
- }
428
- this.columnDefs.forEach((elm) => {
429
- if (elm.rowGroupIndex > -1) {
430
- elm.hide = true;
431
- }
432
- });
433
- }
434
- displayedColumnsChanged(e) {
435
- if (this.hasChildField === 'null') {
436
- const ee = e.columnApi.getAllDisplayedColumnGroups();
437
- const eee = ee.find((c) => c.colId !== 'ag-Grid-AutoColumn' && c.colId !== '0');
438
- if (eee && eee.colId) {
439
- this.autoGroupColumnDef = {
440
- headerName: eee.colDef.headerName,
441
- width: eee.colDef.width,
442
- cellRendererParams: { checkbox: this.showCheckBox },
443
- field: eee.colDef.field
444
- };
445
- }
446
- // eee.hide = true;
447
- }
448
- }
449
- refresh(route = []) {
450
- if (this.remoteOperation && this.gridApi !== undefined) {
451
- // this.gridApi.purgeServerSideCache(route);
452
- this.gridApi.setServerSideDatasource(this.intenalGridDataSource);
453
- }
454
- else {
455
- // TODO : check fetch param
456
- this.dataSource.fetch(null);
457
- }
458
- }
459
- internalGridCellClicked(e) {
460
- this.cellClick.emit({ data: this.mapCellEvent(e), component: this, htmlElement: this.ref.nativeElement });
461
- }
462
- internalGridCellDoubleClicked(e) {
463
- this.cellDbClick.emit({ data: this.mapCellEvent(e), component: this, htmlElement: this.ref.nativeElement });
464
- }
465
- internalGridCellFocused(e) {
466
- this.cellFocuse.emit({ data: this.mapCellEvent(e), htmlElement: this.ref.nativeElement, component: this });
467
- }
468
- internalGridRowClicked(e) {
469
- if (!e.node.group) {
470
- this.rowClick.emit({ data: this.mapRowEvent(e), component: this, htmlElement: this.ref.nativeElement });
471
- }
472
- }
473
- internalGridRowDoubleClicked(e) {
474
- if (!e.node.group) {
475
- this.rowDbClick.emit({ data: this.mapRowEvent(e), htmlElement: this.ref.nativeElement, component: this });
476
- }
477
- }
478
- differenceOf2Arrays(array1, array2) {
479
- const temp = [];
480
- for (const i in array1) {
481
- if (array2.indexOf(array1[i]) === -1) {
482
- temp.push(array1[i]);
483
- }
484
- }
485
- for (const i in array2) {
486
- if (array1.indexOf(array2[i]) === -1) {
487
- temp.push(array2[i]);
488
- }
489
- }
490
- return temp.sort((a, b) => a - b);
491
- }
492
- rowSelectionChanged(e) {
493
- // this.gridApi.forEachNode((node) => {
494
- // if (node.data[this.keyField] == e.node.data[this.keyField]) {
495
- // node.setSelected(e.node.selected);
496
- // }
497
- // });
498
- if (e.node.selected == true) {
499
- this.selectRow = this.selectRow.filter((c) => c[this.keyField] != e.data[this.keyField]);
500
- this.selectRow.push(e.data);
501
- }
502
- else {
503
- this.selectRow = this.selectRow.filter((c) => c[this.keyField] != e.data[this.keyField]);
504
- }
505
- this.rowSelectionChange.emit({ component: this, data: e, htmlElement: this.ref.nativeElement });
506
- // console.log('e', e);
507
- // console.log('select', e.node.selected);
508
- // console.log('index', e.rowIndex);
509
- }
510
- internalGridSelectionChanged(e) {
511
- const args = { items: [] };
512
- const oldNodes = this.oldSelectionNodes;
513
- const nodes = this.gridApi.getSelectedNodes();
514
- nodes.forEach((i) => {
515
- args.items.push({
516
- rowLevel: i.level,
517
- rowIndex: i.rowIndex,
518
- data: i.data
519
- });
520
- });
521
- this.selectionChanged.emit({ data: args, component: this, htmlElement: this.ref.nativeElement });
522
- let action = nodes.length > oldNodes.length ? true : false;
523
- const node = this.differenceOf2Arrays(nodes, oldNodes);
524
- this.onRowSelectionChanged.emit({ component: this, selected: action, data: node, htmlElement: this.ref.nativeElement });
525
- this.oldSelectionNodes = nodes;
526
- }
527
- mapCellEvent(e) {
528
- return {
529
- rowLevel: 0,
530
- column: e.column,
531
- data: e.data,
532
- rowIndex: e.rowIndex,
533
- value: e.value
534
- };
535
- }
536
- mapRowEvent(e) {
537
- return {
538
- rowLevel: 0,
539
- data: e.data,
540
- rowIndex: e.rowIndex
541
- };
542
- }
543
- deselectAll() {
544
- this.gridApi.deselectAll();
545
- }
546
- showLoading() {
547
- if (this.gridApi) {
548
- this.gridApi.showLoadingOverlay();
549
- }
550
- }
551
- hideLoading() {
552
- if (this.gridApi) {
553
- this.gridApi.hideOverlay();
554
- }
555
- }
556
- internalGridSizeChanged(e) {
557
- if (e.clientWidth > 0 && e.clientHeight > 0) {
558
- this.performSizeColumnsToFit(e.api);
559
- }
560
- // this.refresh();
561
- // this.gridApi.paginationGoToFirstPage();
562
- }
563
- internalGridFirstDataRendered(e) {
564
- this.performSizeColumnsToFit(e.api);
565
- }
566
- performSizeColumnsToFit(api) {
567
- if (this.sizeColumnsToFit) {
568
- api.sizeColumnsToFit();
569
- }
570
- }
571
- };
572
- AXDataGridComponent.ctorParameters = () => [
573
- { type: ElementRef },
574
- { type: ChangeDetectorRef }
575
- ];
576
- __decorate([
577
- Input(),
578
- __metadata("design:type", Boolean)
579
- ], AXDataGridComponent.prototype, "remoteOperation", void 0);
580
- __decorate([
581
- Input(),
582
- __metadata("design:type", Boolean)
583
- ], AXDataGridComponent.prototype, "rowMultiSelectWithClick", void 0);
584
- __decorate([
585
- Input(),
586
- __metadata("design:type", Boolean)
587
- ], AXDataGridComponent.prototype, "suppressRowClickSelection", void 0);
588
- __decorate([
589
- Input(),
590
- __metadata("design:type", Boolean)
591
- ], AXDataGridComponent.prototype, "suppressCellSelection", void 0);
592
- __decorate([
593
- Input(),
594
- __metadata("design:type", Boolean)
595
- ], AXDataGridComponent.prototype, "sizeColumnsToFit", void 0);
596
- __decorate([
597
- Input(),
598
- __metadata("design:type", Boolean)
599
- ], AXDataGridComponent.prototype, "showCheckBox", void 0);
600
- __decorate([
601
- Input(),
602
- __metadata("design:type", Boolean)
603
- ], AXDataGridComponent.prototype, "floatingFilter", void 0);
604
- __decorate([
605
- Input(),
606
- __metadata("design:type", String)
607
- ], AXDataGridComponent.prototype, "selectionMode", void 0);
608
- __decorate([
609
- Input(),
610
- __metadata("design:type", Array)
611
- ], AXDataGridComponent.prototype, "selectRow", void 0);
612
- __decorate([
613
- Input(),
614
- __metadata("design:type", String)
615
- ], AXDataGridComponent.prototype, "rowGroupPanelShow", void 0);
616
- __decorate([
617
- Input(),
618
- __metadata("design:type", Boolean)
619
- ], AXDataGridComponent.prototype, "loadOnInit", void 0);
620
- __decorate([
621
- Input(),
622
- __metadata("design:type", String)
623
- ], AXDataGridComponent.prototype, "keyField", void 0);
624
- __decorate([
625
- Input(),
626
- __metadata("design:type", String)
627
- ], AXDataGridComponent.prototype, "hasChildField", void 0);
628
- __decorate([
629
- Input(),
630
- __metadata("design:type", String),
631
- __metadata("design:paramtypes", [String])
632
- ], AXDataGridComponent.prototype, "searchText", null);
633
- __decorate([
634
- Input(),
635
- __metadata("design:type", Array),
636
- __metadata("design:paramtypes", [Array])
637
- ], AXDataGridComponent.prototype, "filter", null);
638
- __decorate([
639
- ContentChildren(AXGridDataColumn),
640
- __metadata("design:type", QueryList)
641
- ], AXDataGridComponent.prototype, "_inlineColumns", void 0);
642
- __decorate([
643
- Output(),
644
- __metadata("design:type", EventEmitter)
645
- ], AXDataGridComponent.prototype, "columnsChange", void 0);
646
- __decorate([
647
- Input(),
648
- __metadata("design:type", Array),
649
- __metadata("design:paramtypes", [Array])
650
- ], AXDataGridComponent.prototype, "columns", null);
651
- __decorate([
652
- Input(),
653
- __metadata("design:type", Object)
654
- ], AXDataGridComponent.prototype, "rowHeight", void 0);
655
- __decorate([
656
- ContentChild(AXToolbarSearchComponent, { static: true }),
657
- __metadata("design:type", AXToolbarSearchComponent)
658
- ], AXDataGridComponent.prototype, "searchInput", void 0);
659
- __decorate([
660
- ContentChild(AXToolbarComponent, { static: true }),
661
- __metadata("design:type", AXToolbarComponent)
662
- ], AXDataGridComponent.prototype, "toolbar", void 0);
663
- __decorate([
664
- ContentChild(AXDataGridRowTemplateComponent, { static: true }),
665
- __metadata("design:type", AXDataGridRowTemplateComponent)
666
- ], AXDataGridComponent.prototype, "rowTemplate", void 0);
667
- __decorate([
668
- ContentChild(AXDataGridDetailTemplateComponent, { static: true }),
669
- __metadata("design:type", AXDataGridDetailTemplateComponent)
670
- ], AXDataGridComponent.prototype, "gridDetailTemplate", void 0);
671
- __decorate([
672
- ContentChild(AXDataSourceComponent, { static: true }),
673
- __metadata("design:type", AXDataSourceComponent)
674
- ], AXDataGridComponent.prototype, "_contentDataSource", void 0);
675
- __decorate([
676
- Input(),
677
- __metadata("design:type", AXDataSourceComponent),
678
- __metadata("design:paramtypes", [AXDataSourceComponent])
679
- ], AXDataGridComponent.prototype, "dataSource", null);
680
- __decorate([
681
- Input(),
682
- __metadata("design:type", Boolean)
683
- ], AXDataGridComponent.prototype, "groupHideOpenParents", void 0);
684
- __decorate([
685
- Output(),
686
- __metadata("design:type", EventEmitter)
687
- ], AXDataGridComponent.prototype, "cellClick", void 0);
688
- __decorate([
689
- Output(),
690
- __metadata("design:type", EventEmitter)
691
- ], AXDataGridComponent.prototype, "cellDbClick", void 0);
692
- __decorate([
693
- Output(),
694
- __metadata("design:type", EventEmitter)
695
- ], AXDataGridComponent.prototype, "cellFocuse", void 0);
696
- __decorate([
697
- Output(),
698
- __metadata("design:type", EventEmitter)
699
- ], AXDataGridComponent.prototype, "rowClick", void 0);
700
- __decorate([
701
- Output(),
702
- __metadata("design:type", EventEmitter)
703
- ], AXDataGridComponent.prototype, "rowDbClick", void 0);
704
- __decorate([
705
- Output(),
706
- __metadata("design:type", EventEmitter)
707
- ], AXDataGridComponent.prototype, "selectionChanged", void 0);
708
- __decorate([
709
- Output(),
710
- __metadata("design:type", EventEmitter)
711
- ], AXDataGridComponent.prototype, "rowSelectionChange", void 0);
712
- __decorate([
713
- Output(),
714
- __metadata("design:type", EventEmitter)
715
- ], AXDataGridComponent.prototype, "onRowSelectionChanged", void 0);
716
- __decorate([
717
- Input(),
718
- __metadata("design:type", Function)
719
- ], AXDataGridComponent.prototype, "rowClass", void 0);
720
- __decorate([
721
- Input(),
722
- __metadata("design:type", Boolean)
723
- ], AXDataGridComponent.prototype, "rtl", void 0);
724
- AXDataGridComponent = __decorate([
725
- Component({
726
- selector: 'ax-data-grid',
727
- template: "<div class=\"ax-grid-toolbar\" *ngIf=\"toolbar\">\r\n <ng-content select=\"ax-toolbar\"></ng-content>\r\n</div>\r\n<!-- [enableSorting]=\"true\" [enableColResize]=\"true\" [enableFilter]=\"allowFiltering\" -->\r\n<ag-grid-angular *ngIf=\"gridView\" class=\"ag-theme-balham\" [getRowClass]=\"internalGetRowClass\"\r\n [style.height]=\"internalHeight\" [columnDefs]=\"columnDefs\" [enableRtl]=\"rtl\" [pagination]=\"true\"\r\n [rowGroupPanelShow]=\"rowGroupPanelShow\" [rowModelType]=\"rowModelType\" [detailRowHeight]=\"detailRowHeight\"\r\n [getRowHeight]=\"getRowHeight\" [paginationAutoPageSize]=\"paginationAutoPageSize\"\r\n [paginationPageSize]=\"paginationPageSize\" [suppressMenuHide]=\"true\" [frameworkComponents]=\"frameworkComponents\"\r\n [isFullWidthCell]=\"isFullWidthCell\" [rowSelection]=\"selectionMode\" [rowMultiSelectWithClick]=\"rowMultiSelectWithClick\"\r\n [fullWidthCellRendererFramework]=\"fullWidthCellRendererFramework\"\r\n [fullWidthCellRendererParams]=\"fullWidthCellRendererParams\" (cellClicked)=\"internalGridCellClicked($event)\"\r\n (cellDoubleClicked)=\"internalGridCellDoubleClicked($event)\" (cellFocused)=\"internalGridCellFocused($event)\"\r\n (rowClicked)=\"internalGridRowClicked($event)\" (selectionChanged)=\"internalGridSelectionChanged($event)\"\r\n (rowSelected)=\"rowSelectionChanged($event)\" (rowDoubleClicked)=\"internalGridRowDoubleClicked($event)\"\r\n (gridReady)=\"internalGridReady($event)\" [groupSelectsChildren]=\"groupSelectsChildren\"\r\n [suppressRowClickSelection]=\"suppressRowClickSelection\" [groupSelectsFiltered]=\"true\"\r\n [suppressCellSelection]=\"suppressCellSelection\" [autoGroupColumnDef]=\"autoGroupColumnDef\"\r\n [suppressAggFuncInHeader]=\"true\" [treeData]=\"treeData\" [animateRows]=\"true\" [isServerSideGroup]=\"isServerSideGroup\"\r\n [getServerSideGroupKey]=\"getServerSideGroupKey\" [masterDetail]=\"masterDetail\"\r\n [detailCellRendererParams]=\"detailCellRendererParams\" [detailCellRenderer]=\"detailCellRenderer\"\r\n (gridSizeChanged)=\"internalGridSizeChanged($event)\" (firstDataRendered)=\"internalGridFirstDataRendered($event)\"\r\n [localeText]=\"localeText\" [groupHideOpenParents]=\"groupHideOpenParents\" [enableRangeSelection]=\"true\"\r\n [enableRangeSelection]=\"false\" [allowContextMenuWithControlKey]=\"false\" [getMainMenuItems]=\"getMainMenuItems\">\r\n</ag-grid-angular>\r\n\r\n<!-- (displayedColumnsChanged)=\"displayedColumnsChanged($event)\" -->",
728
- encapsulation: ViewEncapsulation.None
729
- // changeDetection: ChangeDetectionStrategy.OnPush
730
- }),
731
- __metadata("design:paramtypes", [ElementRef, ChangeDetectorRef])
732
- ], AXDataGridComponent);
733
- export { AXDataGridComponent };
734
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFjb3JleC9kYXRhLWdyaWQvIiwic291cmNlcyI6WyJsaWIvZGF0YS1ncmlkL2RhdGFncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLGVBQWUsRUFDZixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWE5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0csT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXhDLGNBQWMsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHO0lBQ3pDLDZDQUE2QztBQUMvQyxDQUFDLENBQUM7QUFFRixpRUFBaUU7QUFDakUsa0JBQWtCO0FBQ2xCLElBQUk7QUFFSixNQUFNLE9BQU8sNEJBQTZCLFNBQVEsWUFBZ0M7Q0FF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QUFZLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7OEJBQzlDLGlDQUFpQzsrREFBQztBQUd0RDtJQURDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs4QkFDMUIscUJBQXFCOytEQUFDO0FBS2xEO0lBREMsS0FBSyxFQUFFOzhCQUtpQixxQkFBcUI7cUNBQXJCLHFCQUFxQjtxREFGN0M7QUFPRDtJQURDLEtBQUssRUFBRTs7aUVBQzhCO0FBR3RDO0lBREMsTUFBTSxFQUFFOzhCQUNFLFlBQVk7c0RBQWdFO0FBR3ZGO0lBREMsTUFBTSxFQUFFOzhCQUNJLFlBQVk7d0RBQWdFO0FBR3pGO0lBREMsTUFBTSxFQUFFOzhCQUNHLFlBQVk7dURBQWdFO0FBR3hGO0lBREMsTUFBTSxFQUFFOzhCQUNDLFlBQVk7cURBQXNFO0FBRzVGO0lBREMsTUFBTSxFQUFFOzhCQUNHLFlBQVk7dURBQXNFO0FBRzlGO0lBREMsTUFBTSxFQUFFOzhCQUNTLFlBQVk7NkRBQXNGO0FBR3BIO0lBREMsTUFBTSxFQUFFOzhCQUNXLFlBQVk7K0RBQXNGO0FBR3RIO0lBREMsTUFBTSxFQUFFOzhCQUNjLFlBQVk7a0VBQTRGO0FBZS9IO0lBREMsS0FBSyxFQUFFOztxREFDMEU7QUFHbEY7SUFEQyxLQUFLLEVBQUU7O2dEQUNrQztBQWhOL0IsbUJBQW1CO0lBTi9CLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxjQUFjO1FBQ3hCLDY3RUFBd0M7UUFDeEMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7UUFDckMsa0RBQWtEO0tBQ25ELENBQUM7cUNBbU55QixVQUFVLEVBQWUsaUJBQWlCO0dBbE54RCxtQkFBbUIsQ0E2cUIvQjtTQTdxQlksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIElucHV0LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE91dHB1dCxcclxuICBFbGVtZW50UmVmLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFYRGF0YVNvdXJjZUNvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IEFYR3JpZERhdGFDb2x1bW4gfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFYRGF0YVNvdXJjZVJlYWRQYXJhbXMgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRPcHRpb25zLFxyXG4gIENlbGxDbGlja2VkRXZlbnQsXHJcbiAgUm93Q2xpY2tlZEV2ZW50LFxyXG4gIENlbGxFdmVudCxcclxuICBSb3dFdmVudCxcclxuICBGaXJzdERhdGFSZW5kZXJlZEV2ZW50LFxyXG4gIEdyaWRTaXplQ2hhbmdlZEV2ZW50LFxyXG4gIEdyaWRBcGlcclxufSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcblxyXG5pbXBvcnQgeyBMaWNlbnNlTWFuYWdlciB9IGZyb20gJ2FnLWdyaWQtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFYR3JpZENlbGxFdmVudCwgQVhHcmlkUm93RXZlbnQsIEFYR3JpZFJvd1NlbGVjdGlvbkV2ZW50LCBBWEdyaWRSb3dQYXJhbXMgfSBmcm9tICcuL2RhdGFncmlkLmV2ZW50cyc7XHJcblxyXG5pbXBvcnQgeyBBWERhdGFHcmlkUm93VGVtcGxhdGVDb21wb25lbnQgfSBmcm9tICcuL3RlbXBsYXRlcy9yb3ctdGVtcGxhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhUb29sYmFyU2VhcmNoQ29tcG9uZW50LCBBWFRvb2xiYXJDb21wb25lbnQsIEFYRGF0YUV2ZW50LCBBWFZhbHVlRXZlbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBBWERhdGFHcmlkRGV0YWlsVGVtcGxhdGVDb21wb25lbnQgfSBmcm9tICcuL3RlbXBsYXRlcy9kZXRhaWwtdGVtcGxhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhUcmFuc2xhdG9yIH0gZnJvbSAnQGFjb3JleC9jb3JlJztcclxuaW1wb3J0IHsgQVhEYXRlUGlja2VyRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2RhdGUtY29sdW1uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFYQ29uZmlnIH0gZnJvbSAnQGFjb3JleC9jb3JlJztcclxuXHJcbkxpY2Vuc2VNYW5hZ2VyLnByb3RvdHlwZS52YWxpZGF0ZUxpY2Vuc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgLy9jb25zb2xlLmluZm8oJ0NyYWNrZWQgYnkgQXJhc2ggT3Nobm91ZGkhJyk7XHJcbn07XHJcblxyXG4vLyBXYXRlcm1hcmtDb21wLnByb3RvdHlwZS5zaG91bGREaXNwbGF5V2F0ZXJtYXJrID0gZnVuY3Rpb24gKCkge1xyXG4vLyAgIHJldHVybiBmYWxzZTtcclxuLy8gfVxyXG5cclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRDb2x1bW5zQ2hhbmdlRXZlbnQgZXh0ZW5kcyBBWFZhbHVlRXZlbnQ8QVhHcmlkRGF0YUNvbHVtbltdPiB7XHJcbiAgY29tcG9uZW50OiBBWERhdGFHcmlkQ29tcG9uZW50O1xyXG59XHJcbmV4cG9ydCBjbGFzcyBBWERhdGFHcmlkQ2VsbEV2ZW50IGV4dGVuZHMgQVhEYXRhRXZlbnQ8QVhHcmlkQ2VsbEV2ZW50PiB7XHJcbiAgY29tcG9uZW50OiBBWERhdGFHcmlkQ29tcG9uZW50O1xyXG59XHJcbmV4cG9ydCBjbGFzcyBBWERhYWdyaWRSb3dDbGlja0V2ZW50IGV4dGVuZHMgQVhEYXRhRXZlbnQ8QVhHcmlkUm93RXZlbnQ+IHtcclxuICBjb21wb25lbnQ6IEFYRGF0YUdyaWRDb21wb25lbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBWERhdGFHcmlkU2VsZWN0aW9uQ2hhbmdlRXZlbnQgZXh0ZW5kcyBBWERhdGFFdmVudDxBWEdyaWRSb3dTZWxlY3Rpb25FdmVudD4ge1xyXG4gIGNvbXBvbmVudDogQVhEYXRhR3JpZENvbXBvbmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRSb3dTZWxlY3Rpb25DaGFuZ2VFdmVudCBleHRlbmRzIEFYRGF0YUV2ZW50PGFueT4ge1xyXG4gIGNvbXBvbmVudDogQVhEYXRhR3JpZENvbXBvbmVudDtcclxuICBzZWxlY3RlZDogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdheC1kYXRhLWdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG4gIC8vIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBWERhdGFHcmlkQ29tcG9uZW50IHtcclxuICBwcml2YXRlIGdyaWRBcGk7XHJcbiAgcHJpdmF0ZSBkYXRhU291cmNlU3VjY2Vzc0NhbGxiYWNrO1xyXG4gIGxvY2FsZVRleHQ6IGFueTtcclxuXHJcbiAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xyXG4gIGNvbHVtbkRlZnM6IGFueVtdID0gW107XHJcbiAgcm93TW9kZWxUeXBlID0gJ2NsaWVudFNpZGUnO1xyXG4gIGZ1bGxXaWR0aENlbGxSZW5kZXJlckZyYW1ld29yazogYW55O1xyXG4gIGZ1bGxXaWR0aENlbGxSZW5kZXJlclBhcmFtczogYW55O1xyXG4gIGZyYW1ld29ya0NvbXBvbmVudHM6IGFueSA9IHt9O1xyXG4gIGlzRnVsbFdpZHRoQ2VsbDogRnVuY3Rpb247XHJcbiAgaW50ZXJuYWxIZWlnaHQ6IHN0cmluZyA9ICcxMDAlJztcclxuICBkZXRhaWxDZWxsUmVuZGVyZXI6IGFueTtcclxuICBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IGFueTtcclxuICBkZXRhaWxSb3dIZWlnaHQ6IG51bWJlcjtcclxuICBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVuYWJlbFNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdyaWRWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ3JvdXBTZWxlY3RzQ2hpbGRyZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBvbGRTZWxlY3Rpb25Ob2RlczogYW55W10gPSBbXTtcclxuICBwYWdpbmF0aW9uQXV0b1BhZ2VTaXplOiBib29sZWFuID0gdHJ1ZTtcclxuICBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDEwO1xyXG4gIGNhY2hlQmxvY2tTaXplOiBudW1iZXIgPSAxMDtcclxuICAvLyBASW5wdXQoKVxyXG4gIC8vIHNob3dSb3dOdW1iZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByZW1vdGVPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcm93TXVsdGlTZWxlY3RXaXRoQ2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzdXBwcmVzc1Jvd0NsaWNrU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3VwcHJlc3NDZWxsU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNpemVDb2x1bW5zVG9GaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNob3dDaGVja0JveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZmxvYXRpbmdGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gQElucHV0KClcclxuICAvLyB0YWtlQ291bnQ6IG51bWJlcjtcclxuXHJcbiAgYXV0b0dyb3VwQ29sdW1uRGVmOiBhbnkgPSB7fTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgPSAnc2luZ2xlJztcclxuXHJcbiAgLy8gQElucHV0KClcclxuICAvLyBhbGxvd0ZpbHRlcmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdFJvdzogYW55W10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICByb3dHcm91cFBhbmVsU2hvdzogJ2Fsd2F5cycgfCAnbmV2ZXInID0gJ25ldmVyJztcclxuXHJcbiAgQElucHV0KClcclxuICBsb2FkT25Jbml0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gQElucHV0KClcclxuICAvLyBncm91cERlZmF1bHRFeHBhbmRlZDogbnVtYmVyID0gMDtcclxuXHJcbiAgQElucHV0KClcclxuICBrZXlGaWVsZDogc3RyaW5nID0gJ251bGwnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhhc0NoaWxkRmllbGQ6IHN0cmluZyA9ICdudWxsJztcclxuXHJcbiAgcHJpdmF0ZSBfc2VhcmNoVGV4dDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBzZWFyY2hUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGV4dDtcclxuICB9XHJcbiAgcHVibGljIHNldCBzZWFyY2hUZXh0KHY6IHN0cmluZykge1xyXG4gICAgaWYgKHYgIT09IHRoaXMuX3NlYXJjaFRleHQpIHtcclxuICAgICAgdGhpcy5fc2VhcmNoVGV4dCA9IHY7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB0aGlzLmdyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyOiBhbnlbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZmlsdGVyKHY6IGFueVtdKSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fZmlsdGVyKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlciA9IHY7XHJcbiAgICAgIHRoaXMuX2ZpbHRlci5mb3JFYWNoKChmKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmMgPSB0aGlzLmdyaWRBcGkuZ2V0RmlsdGVySW5zdGFuY2UoZi5maWVsZCk7XHJcbiAgICAgICAgaWYgKGZjKSB7XHJcbiAgICAgICAgICBjb25zdCBmZiA9IGZjLmdldEZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlKCk7XHJcbiAgICAgICAgICBmZi5zZXRNb2RlbChmKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihBWEdyaWREYXRhQ29sdW1uKVxyXG4gIHByaXZhdGUgX2lubGluZUNvbHVtbnM6IFF1ZXJ5TGlzdDxBWEdyaWREYXRhQ29sdW1uPjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgY29sdW1uc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDb2x1bW5zQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ29sdW1uc0NoYW5nZUV2ZW50PigpO1xyXG5cclxuICBwcml2YXRlIF9jb2x1bW5zOiBBWEdyaWREYXRhQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBWEdyaWREYXRhQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lubGluZUNvbHVtbnMgPyBbLi4udGhpcy5fY29sdW1ucywgLi4udGhpcy5faW5saW5lQ29sdW1ucy50b0FycmF5KCldIDogdGhpcy5fY29sdW1ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY29sdW1ucyh2YWw6IEFYR3JpZERhdGFDb2x1bW5bXSkge1xyXG4gICAgaWYgKHZhbCAmJiB2YWwubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBvbGQgPSB0aGlzLl9jb2x1bW5zO1xyXG4gICAgICB0aGlzLl9jb2x1bW5zID0gdmFsO1xyXG4gICAgICB0aGlzLmNvbHVtbnNDaGFuZ2UuZW1pdCh7IGNvbXBvbmVudDogdGhpcywgdmFsdWU6IHZhbCwgb2xkVmFsdWU6IG9sZCwgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0Q29sRGVmOiBhbnkgPSB7XHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICBmbG9hdGluZ0ZpbHRlcjogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcm93SGVpZ2h0OiBhbnk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQVhUb29sYmFyU2VhcmNoQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHNlYXJjaElucHV0OiBBWFRvb2xiYXJTZWFyY2hDb21wb25lbnQ7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQVhUb29sYmFyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHRvb2xiYXI6IEFYVG9vbGJhckNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWERhdGFHcmlkUm93VGVtcGxhdGVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcm93VGVtcGxhdGU6IEFYRGF0YUdyaWRSb3dUZW1wbGF0ZUNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWERhdGFHcmlkRGV0YWlsVGVtcGxhdGVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZ3JpZERldGFpbFRlbXBsYXRlOiBBWERhdGFHcmlkRGV0YWlsVGVtcGxhdGVDb21wb25lbnQ7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQVhEYXRhU291cmNlQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHByaXZhdGUgX2NvbnRlbnREYXRhU291cmNlOiBBWERhdGFTb3VyY2VDb21wb25lbnQ7XHJcblxyXG4gIHByaXZhdGUgX2RhdGFTb3VyY2U6IEFYRGF0YVNvdXJjZUNvbXBvbmVudDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQVhEYXRhU291cmNlQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlID8gdGhpcy5fZGF0YVNvdXJjZSA6IHRoaXMuX2NvbnRlbnREYXRhU291cmNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkYXRhU291cmNlKHY6IEFYRGF0YVNvdXJjZUNvbXBvbmVudCkge1xyXG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IHY7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdyb3VwSGlkZU9wZW5QYXJlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNlbGxDbGljazogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ2VsbEV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBjZWxsRGJDbGljazogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ2VsbEV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBjZWxsRm9jdXNlOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZENlbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYWFncmlkUm93Q2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGFhZ3JpZFJvd0NsaWNrRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHJvd0RiQ2xpY2s6IEV2ZW50RW1pdHRlcjxBWERhYWdyaWRSb3dDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYWFncmlkUm93Q2xpY2tFdmVudD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRTZWxlY3Rpb25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcm93U2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZFNlbGVjdGlvbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBvblJvd1NlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkUm93U2VsZWN0aW9uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkUm93U2VsZWN0aW9uQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gIGdldFJvd0hlaWdodChwYXJhbSkge1xyXG4gICAgaWYgKHBhcmFtLmRhdGEgJiYgcGFyYW0uZGF0YS5yb3dIZWlnaHQgJiYgcGFyYW0ubm9kZS5sZXZlbCA9PSAwKSB7XHJcbiAgICAgIHJldHVybiBwYXJhbS5kYXRhLnJvd0hlaWdodDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgPT0gdHJ1ZSAmJiBwYXJhbS5ub2RlLmxldmVsID09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGV0YWlsUm93SGVpZ2h0O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlckRldGFpbCA9PSBmYWxzZSAmJiBwYXJhbS5kYXRhICYmIHBhcmFtLmRhdGEucm93SGVpZ2h0KSB7XHJcbiAgICAgIHJldHVybiBwYXJhbS5kYXRhLnJvd0hlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICByb3dDbGFzcz86IChwYXJhbXM6IEFYR3JpZFJvd1BhcmFtcykgPT4gKHN0cmluZyB8IHN0cmluZ1tdKSB8IChzdHJpbmcgfCBzdHJpbmdbXSk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcnRsOiBib29sZWFuID0gQVhDb25maWcuZ2V0KCdsYXlvdXQucnRsJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHRoaXMubG9jYWxlVGV4dCA9IEFYVHJhbnNsYXRvci5nZXQoJ2RhdGFHcmlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGNIZWlnaHQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy50b29sYmFyKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxIZWlnaHQgPSBgY2FsYygxMDAlIC0gJHs0MH1weClgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbEhlaWdodCA9ICcxMDAlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGludGVuYWxHcmlkRGF0YVNvdXJjZSgpIHtcclxuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcm93Q291bnQ6IG51bGwsXHJcbiAgICAgIGdldFJvd3M6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAvLyB0aGF0LmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLnNldFByb3BlcnR5KCdjYWNoZUJsb2NrU2l6ZScsIHRoaXMudGFrZUNvdW50ID8gdGhpcy50YWtlQ291bnQgOiBwYXJhbXMuYXBpLnBhZ2luYXRpb25HZXRQYWdlU2l6ZSgpKTtcclxuICAgICAgICB0aGF0LmRhdGFTb3VyY2VTdWNjZXNzQ2FsbGJhY2sgPSBwYXJhbXMuc3VjY2Vzc0NhbGxiYWNrO1xyXG4gICAgICAgIGNvbnN0IGxvYWRQYXJhbXM6IEFYRGF0YVNvdXJjZVJlYWRQYXJhbXMgPSB7fTtcclxuICAgICAgICBsb2FkUGFyYW1zLnNlYXJjaFRleHQgPSB0aGF0LnNlYXJjaFRleHQ7XHJcbiAgICAgICAgbG9hZFBhcmFtcy5za2lwID0gcGFyYW1zLnJlcXVlc3Quc3RhcnRSb3c7XHJcbiAgICAgICAgLy8gIGxvYWRQYXJhbXMudGFrZSA9IHBhcmFtcy5yZXF1ZXN0LmVuZFJvdyAtIHBhcmFtcy5yZXF1ZXN0LnN0YXJ0Um93O1xyXG4gICAgICAgIC8vLy8gIGxvYWRQYXJhbXMudGFrZSA9IHRoYXQudGFrZUNvdW50ID8gdGhhdC50YWtlQ291bnQgOiBwYXJhbXMuYXBpLnBhZ2luYXRpb25HZXRQYWdlU2l6ZSgpICogMjtcclxuXHJcbiAgICAgICAgbG9hZFBhcmFtcy50YWtlID0gcGFyYW1zLnJlcXVlc3QuZW5kUm93IC0gcGFyYW1zLnJlcXVlc3Quc3RhcnRSb3c7XHJcblxyXG4gICAgICAgIGxvYWRQYXJhbXMuc29ydCA9IHBhcmFtcy5yZXF1ZXN0LnNvcnRNb2RlbC5tYXAoKGMpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBjLmNvbElkLFxyXG4gICAgICAgICAgICBkaXI6IGMuc29ydFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBsb2FkUGFyYW1zLmdyb3VwcyA9IHBhcmFtcy5yZXF1ZXN0LnJvd0dyb3VwQ29scy5tYXAociA9PiByLmZpZWxkKTtcclxuICAgICAgICAvLyBsb2FkUGFyYW1zLmdyb3VwS2V5cyA9IHBhcmFtcy5yZXF1ZXN0Lmdyb3VwS2V5cztcclxuICAgICAgICAvLyBsb2FkUGFyYW1zLmRhdGEgPSBwYXJhbXMucGFyZW50Tm9kZS5kYXRhO1xyXG4gICAgICAgIGxvYWRQYXJhbXMuZ3JvdXAgPSB7XHJcbiAgICAgICAgICBmaWVsZHM6IHBhcmFtcy5yZXF1ZXN0LnJvd0dyb3VwQ29scy5tYXAoKHIpID0+IHIuZmllbGQpLFxyXG4gICAgICAgICAga2V5czogcGFyYW1zLnJlcXVlc3QuZ3JvdXBLZXlzLFxyXG4gICAgICAgICAgcGFyZW50RGF0YTogcGFyYW1zLnBhcmVudE5vZGUuZGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbG9hZFBhcmFtcy5maWx0ZXIgPSBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbDtcclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgICAgICAvLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhhdC5kYXRhU291cmNlLmZldGNoKGxvYWRQYXJhbXMpO1xyXG4gICAgICAgIC8vIH0sIDUwMDApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRNYWluTWVudUl0ZW1zKGUpIHtcclxuICAgIHJldHVybiBbJ3BpblN1Yk1lbnUnLCAnc2VwYXJhdG9yJ107XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBpc1NlcnZlclNpZGVHcm91cCA9IChlKSA9PiB7XHJcbiAgICByZXR1cm4gZVt0aGlzLmhhc0NoaWxkRmllbGRdO1xyXG4gIH07XHJcblxyXG4gIGdldENvbHVtbkRlZnMgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZnMoKTtcclxuICB9O1xyXG5cclxuICBnZXRDdXJyZW50UGFnZU51bWJlciA9ICgpID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGN1cnJlbnQ6IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDEsXHJcbiAgICAgIHRvdGFsOiB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFRvdGFsUGFnZXMoKVxyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBwYWdpbmF0aW9uR29Ub1BhZ2UobnVtYmVyKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QYWdlKG51bWJlciAtIDEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VydmVyU2lkZUdyb3VwS2V5ID0gKGUpID0+IHtcclxuICAgIHJldHVybiBlW3RoaXMua2V5RmllbGRdO1xyXG4gIH07XHJcbiAgLy8gdG9kbyBncmlkT3B0aW9uczogR3JpZE9wdGlvbnNcclxuICBpbnRlcm5hbEdyaWRSZWFkeShncmlkT3B0aW9ucykge1xyXG4gICAgLy8vLyAgZ3JpZE9wdGlvbnMuYXBpLmNoZWNrR3JpZFNpemUoKTtcclxuICAgIC8vLy8gdGhpcy50YWtlQ291bnQgPSB0aGlzLnRha2VDb3VudCA/IHRoaXMudGFrZUNvdW50IDogZ3JpZE9wdGlvbnMuYXBpLnBhZ2luYXRpb25HZXRQYWdlU2l6ZSgpICogMjtcclxuICAgIC8vICB0aGlzLnRha2VDb3VudCA9IHRoaXMudGFrZUNvdW50IDwgMjAgPyAyMCA6IHRoaXMudGFrZUNvdW50O1xyXG4gICAgLy8vLyBncmlkT3B0aW9ucy5hcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLnNldFByb3BlcnR5KCdjYWNoZUJsb2NrU2l6ZScsIHRoaXMudGFrZUNvdW50KTtcclxuXHJcbiAgICB0aGlzLmdyaWRBcGkgPSBncmlkT3B0aW9ucy5hcGk7XHJcblxyXG4gICAgdGhpcy5tYXBDb2x1bW5zKCk7XHJcbiAgICB0aGlzLmNhbGNIZWlnaHQoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMubG9hZE9uSW5pdCkge1xyXG4gICAgICB0aGlzLmxvYWRPbkluaXQgPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVtb3RlT3BlcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5zZXRTZXJ2ZXJTaWRlRGF0YXNvdXJjZSh0aGlzLmludGVuYWxHcmlkRGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlbW90ZU9wZXJhdGlvbikge1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgaWYgKHRoaXMucm93VGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5mdWxsV2lkdGhDZWxsUmVuZGVyZXJGcmFtZXdvcmsgPSB0aGlzLnJvd1RlbXBsYXRlLnJlbmRlcmVyO1xyXG4gICAgICB0aGlzLmZ1bGxXaWR0aENlbGxSZW5kZXJlclBhcmFtcyA9IHRoaXMucm93VGVtcGxhdGUucGFyYW1zO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcmFtZXdvcmtDb21wb25lbnRzLmFnRGF0ZUlucHV0ID0gQVhEYXRlUGlja2VyRmlsdGVyQ29tcG9uZW50O1xyXG5cclxuICAgIGlmICh0aGlzLmdyaWREZXRhaWxUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLm1hc3RlckRldGFpbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gdGhpcy5ncmlkRGV0YWlsVGVtcGxhdGUucGFyYW1zO1xyXG4gICAgICB0aGlzLmRldGFpbENlbGxSZW5kZXJlciA9ICdkZXRhaWxSZW5kZXJlckZyYW1ld29yayc7XHJcbiAgICAgIHRoaXMuZnJhbWV3b3JrQ29tcG9uZW50cy5kZXRhaWxSZW5kZXJlckZyYW1ld29yayA9IHRoaXMuZ3JpZERldGFpbFRlbXBsYXRlLnJlbmRlcmVyO1xyXG5cclxuICAgICAgdGhpcy5kZXRhaWxSb3dIZWlnaHQgPSB0aGlzLmdyaWREZXRhaWxUZW1wbGF0ZS5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzRnVsbFdpZHRoQ2VsbCA9ICgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoYXQucm93VGVtcGxhdGUgIT0gbnVsbDtcclxuICAgIH07XHJcbiAgICAvL3RoaXMuY2RyXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGlmICh0aGlzLnRha2VDb3VudCAmJiB0aGlzLnRha2VDb3VudCA+IDApIHtcclxuICAgIC8vICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgPSB0aGlzLnRha2VDb3VudDtcclxuICAgIC8vICAgdGhpcy5wYWdpbmF0aW9uQXV0b1BhZ2VTaXplID0gZmFsc2U7XHJcbiAgICAvLyAgIHRoaXMuY2FjaGVCbG9ja1NpemUgPSB0aGlzLnRha2VDb3VudDtcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXBTZWxlY3RzQ2hpbGRyZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmtleUZpZWxkICE9PSAnbnVsbCcgJiYgdGhpcy5oYXNDaGlsZEZpZWxkICE9PSAnbnVsbCcpIHtcclxuICAgICAgdGhpcy5yb3dHcm91cFBhbmVsU2hvdyA9ICduZXZlcic7XHJcbiAgICAgIHRoaXMudHJlZURhdGEgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVtb3RlT3BlcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMucm93TW9kZWxUeXBlID0gJ3NlcnZlclNpZGUnO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICAgIGlmICh0aGlzLnJ0bCA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucnRsID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZWYubmF0aXZlRWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnZGlyZWN0aW9uJykgPT09ICdydGwnO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIGdyaWRTZWxlY3RSb3coKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdFJvdyAmJiB0aGlzLnNlbGVjdFJvdy5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZEFwaSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzLnNlbGVjdFJvd1swXSAhPSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZSgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG5vZGUuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3cuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobm9kZS5kYXRhW3RoaXMua2V5RmllbGRdID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZSgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG5vZGUuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3cuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpdGVtLnJvd0luZGV4ICE9IHVuZGVmaW5lZCAmJiBpdGVtLnJvd0xldmVsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YVt0aGlzLmtleUZpZWxkXSA9PT0gaXRlbS5kYXRhW3RoaXMua2V5RmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmRhdGFbdGhpcy5rZXlGaWVsZF0gPT09IGl0ZW1bdGhpcy5rZXlGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuXHJcbiAgLy8gICAvL0NhbGxlZCBhZnRlciBldmVyeSBjaGVjayBvZiB0aGUgY29tcG9uZW50J3Mgdmlldy4gQXBwbGllcyB0byBjb21wb25lbnRzIG9ubHkuXHJcbiAgLy8gICAvL0FkZCAnaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkJyB0byB0aGUgY2xhc3MuXHJcbiAgLy8gICAvLyB0aGlzLnNlbGVjdEJ5VmFsdWVzKCk7XHJcbiAgLy8gICB0aGlzLmVuYWJlbFNlbGVjdCA9IGZhbHNlO1xyXG5cclxuICAvLyB9XHJcbiAgcmVidWlsZEdyaWQoKSB7XHJcbiAgICB0aGlzLm1hcENvbHVtbnMoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zaXplQ29sdW1uc1RvRml0KSB7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudHJlZURhdGEgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5yZW5kZXIoKSk7XHJcblxyXG4gICAgICBjb25zdCBncm91cENvbHVtbiA9IHRoaXMuY29sdW1uRGVmcy5maW5kKChjKSA9PiBjLnJvd0dyb3VwSW5kZXggPT0gJzAnICYmIGMuZmllbGQgIT09ICcnKTtcclxuXHJcbiAgICAgIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xyXG4gICAgICAgIGhlYWRlck5hbWU6IGdyb3VwQ29sdW1uLmhlYWRlck5hbWUsXHJcbiAgICAgICAgd2lkdGg6IGdyb3VwQ29sdW1uLndpZHRoLFxyXG4gICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczogeyBjaGVja2JveDogdGhpcy5zaG93Q2hlY2tCb3ggfSxcclxuICAgICAgICBmaWVsZDogZ3JvdXBDb2x1bW4uZmllbGRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY29sdW1uRGVmcy5mb3JFYWNoKChlbG0pID0+IHtcclxuICAgICAgICBpZiAoZWxtLnJvd0dyb3VwSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgZWxtLmhpZGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL3NldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgdGhpcy5ncmlkVmlldyA9IHRydWU7XHJcbiAgICAvL30pO1xyXG5cclxuICAgIHRoaXMuZW5hYmVsU2VsZWN0ID0gdHJ1ZTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5vbkRhdGFSZWNlaXZlZC5zdWJzY3JpYmUoKF9kYXRhKSA9PiB7XHJcbiAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBfZGF0YS5kYXRhLnJlc3VsdDtcclxuICAgICAgdGhpcy5oaWRlTG9hZGluZygpO1xyXG4gICAgICBsZXQgaXRlbXM6IGFueVtdO1xyXG4gICAgICBsZXQgdG90YWxDb3VudDogbnVtYmVyO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XHJcbiAgICAgICAgaXRlbXMgPSByZXN1bHQ7XHJcbiAgICAgICAgdG90YWxDb3VudCA9IHJlc3VsdC5sZW5ndGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbXMgPSByZXN1bHQuaXRlbXM7XHJcbiAgICAgICAgdG90YWxDb3VudCA9IHJlc3VsdC50b3RhbENvdW50O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2VTdWNjZXNzQ2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoIXRoaXMubG9hZE9uSW5pdCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlU3VjY2Vzc0NhbGxiYWNrKFtdLCAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlU3VjY2Vzc0NhbGxiYWNrKGl0ZW1zLCB0b3RhbENvdW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRPbkluaXQgJiYgdGhpcy5ncmlkQXBpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZEFwaS5zZXRSb3dEYXRhKFtdKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZEFwaSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkuc2V0Um93RGF0YShpdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmdyaWRTZWxlY3RSb3coKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGF0YVNvdXJjZS5vbkZldGNoU3RhcnQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQpIHtcclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5vblZhbHVlQ2hhbmdlZC5zdWJzY3JpYmUoKGMpID0+IHtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBjLnZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBtYXBDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5jb2x1bW5EZWZzID0gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5yZW5kZXIoKSk7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMuc2hvd1Jvd051bWJlcikge1xyXG4gICAgLy8gICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XHJcbiAgICAvLyAgICAgaGVhZGVyTmFtZTogQVhDb25maWcuZ2V0KCdsYXlvdXQucnRsJykgPyAn2LHYr9uM2YEnIDogJ1JvdycsXHJcbiAgICAvLyAgICAgdmFsdWVHZXR0ZXI6ICdub2RlLnJvd0luZGV4ICsgMScsXHJcbiAgICAvLyAgICAgcGlubmVkOiBBWENvbmZpZy5nZXQoJ2xheW91dC5ydGwnKSA/ICdyaWdodCcgOiAnbGVmdCdcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZERldGFpbFRlbXBsYXRlKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbkRlZnNbMF0uY2hlY2tib3hTZWxlY3Rpb24gPT09IHRydWUgJiYgdGhpcy5jb2x1bW5EZWZzWzBdLmZpZWxkID09PSAnJykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uRGVmc1sxXS5jZWxsUmVuZGVyZXIgPSAnYWdHcm91cENlbGxSZW5kZXJlcic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5EZWZzWzBdLmNlbGxSZW5kZXJlciA9ICdhZ0dyb3VwQ2VsbFJlbmRlcmVyJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0NoaWxkRmllbGQgPT09ICdudWxsJykge1xyXG4gICAgICBjb25zdCBncm91cENvbHVtbiA9IHRoaXMuY29sdW1uRGVmcy5maW5kKChjKSA9PiBjLnJvd0dyb3VwSW5kZXggPT09IHVuZGVmaW5lZCAmJiBjLmZpZWxkICE9PSAnJyk7XHJcbiAgICAgIGlmIChncm91cENvbHVtbiAmJiB0aGlzLmdyb3VwSGlkZU9wZW5QYXJlbnRzID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBncm91cENvbHVtbi5oZWFkZXJOYW1lLFxyXG4gICAgICAgICAgd2lkdGg6IGdyb3VwQ29sdW1uLndpZHRoLFxyXG4gICAgICAgICAgY2VsbFJlbmRlcmVyUGFyYW1zOiB7IGNoZWNrYm94OiB0aGlzLnNob3dDaGVja0JveCB9LFxyXG4gICAgICAgICAgZmllbGQ6IGdyb3VwQ29sdW1uLmZpZWxkXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyAgZ3JvdXBDb2x1bW4uaGlkZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbkRlZnMuZm9yRWFjaCgoZWxtKSA9PiB7XHJcbiAgICAgIGlmIChlbG0ucm93R3JvdXBJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgZWxtLmhpZGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRpc3BsYXllZENvbHVtbnNDaGFuZ2VkKGUpIHtcclxuICAgIGlmICh0aGlzLmhhc0NoaWxkRmllbGQgPT09ICdudWxsJykge1xyXG4gICAgICBjb25zdCBlZSA9IGUuY29sdW1uQXBpLmdldEFsbERpc3BsYXllZENvbHVtbkdyb3VwcygpO1xyXG4gICAgICBjb25zdCBlZWUgPSBlZS5maW5kKChjKSA9PiBjLmNvbElkICE9PSAnYWctR3JpZC1BdXRvQ29sdW1uJyAmJiBjLmNvbElkICE9PSAnMCcpO1xyXG4gICAgICBpZiAoZWVlICYmIGVlZS5jb2xJZCkge1xyXG4gICAgICAgIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZWVlLmNvbERlZi5oZWFkZXJOYW1lLFxyXG4gICAgICAgICAgd2lkdGg6IGVlZS5jb2xEZWYud2lkdGgsXHJcbiAgICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHsgY2hlY2tib3g6IHRoaXMuc2hvd0NoZWNrQm94IH0sXHJcbiAgICAgICAgICBmaWVsZDogZWVlLmNvbERlZi5maWVsZFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgLy8gZWVlLmhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaChyb3V0ZTogYW55W10gPSBbXSkge1xyXG4gICAgaWYgKHRoaXMucmVtb3RlT3BlcmF0aW9uICYmIHRoaXMuZ3JpZEFwaSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vICB0aGlzLmdyaWRBcGkucHVyZ2VTZXJ2ZXJTaWRlQ2FjaGUocm91dGUpO1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2V0U2VydmVyU2lkZURhdGFzb3VyY2UodGhpcy5pbnRlbmFsR3JpZERhdGFTb3VyY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETyA6IGNoZWNrIGZldGNoIHBhcmFtXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mZXRjaChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZENlbGxDbGlja2VkKGU6IENlbGxDbGlja2VkRXZlbnQpIHtcclxuICAgIHRoaXMuY2VsbENsaWNrLmVtaXQoeyBkYXRhOiB0aGlzLm1hcENlbGxFdmVudChlKSwgY29tcG9uZW50OiB0aGlzLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZENlbGxEb3VibGVDbGlja2VkKGU6IENlbGxDbGlja2VkRXZlbnQpIHtcclxuICAgIHRoaXMuY2VsbERiQ2xpY2suZW1pdCh7IGRhdGE6IHRoaXMubWFwQ2VsbEV2ZW50KGUpLCBjb21wb25lbnQ6IHRoaXMsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkQ2VsbEZvY3VzZWQoZTogQ2VsbENsaWNrZWRFdmVudCkge1xyXG4gICAgdGhpcy5jZWxsRm9jdXNlLmVtaXQoeyBkYXRhOiB0aGlzLm1hcENlbGxFdmVudChlKSwgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsIGNvbXBvbmVudDogdGhpcyB9KTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZFJvd0NsaWNrZWQoZTogUm93Q2xpY2tlZEV2ZW50KSB7XHJcbiAgICBpZiAoIWUubm9kZS5ncm91cCkge1xyXG4gICAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBkYXRhOiB0aGlzLm1hcFJvd0V2ZW50KGUpLCBjb21wb25lbnQ6IHRoaXMsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkUm93RG91YmxlQ2xpY2tlZChlOiBDZWxsQ2xpY2tlZEV2ZW50KSB7XHJcbiAgICBpZiAoIWUubm9kZS5ncm91cCkge1xyXG4gICAgICB0aGlzLnJvd0RiQ2xpY2suZW1pdCh7IGRhdGE6IHRoaXMubWFwUm93RXZlbnQoZSksIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LCBjb21wb25lbnQ6IHRoaXMgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaWZmZXJlbmNlT2YyQXJyYXlzKGFycmF5MTogYW55LCBhcnJheTI6IGFueSkge1xyXG4gICAgY29uc3QgdGVtcCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpIGluIGFycmF5MSkge1xyXG4gICAgICBpZiAoYXJyYXkyLmluZGV4T2YoYXJyYXkxW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICB0ZW1wLnB1c2goYXJyYXkxW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBpIGluIGFycmF5Mikge1xyXG4gICAgICBpZiAoYXJyYXkxLmluZGV4T2YoYXJyYXkyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICB0ZW1wLnB1c2goYXJyYXkyW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gIH1cclxuXHJcbiAgcm93U2VsZWN0aW9uQ2hhbmdlZChlKSB7XHJcbiAgICAvLyB0aGlzLmdyaWRBcGkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgIC8vICAgaWYgKG5vZGUuZGF0YVt0aGlzLmtleUZpZWxkXSA9PSBlLm5vZGUuZGF0YVt0aGlzLmtleUZpZWxkXSkge1xyXG4gICAgLy8gICAgIG5vZGUuc2V0U2VsZWN0ZWQoZS5ub2RlLnNlbGVjdGVkKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgICBpZiAoZS5ub2RlLnNlbGVjdGVkID09IHRydWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RSb3cgPSB0aGlzLnNlbGVjdFJvdy5maWx0ZXIoKGMpID0+IGNbdGhpcy5rZXlGaWVsZF0gIT0gZS5kYXRhW3RoaXMua2V5RmllbGRdKTtcclxuICAgICAgdGhpcy5zZWxlY3RSb3cucHVzaChlLmRhdGEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RSb3cgPSB0aGlzLnNlbGVjdFJvdy5maWx0ZXIoKGMpID0+IGNbdGhpcy5rZXlGaWVsZF0gIT0gZS5kYXRhW3RoaXMua2V5RmllbGRdKTtcclxuICAgIH1cclxuICAgIHRoaXMucm93U2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIGRhdGE6IGUsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ2UnLCBlKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3QnLCBlLm5vZGUuc2VsZWN0ZWQpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ2luZGV4JywgZS5yb3dJbmRleCk7XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdyaWRTZWxlY3Rpb25DaGFuZ2VkKGUpIHtcclxuICAgIGNvbnN0IGFyZ3M6IEFYR3JpZFJvd1NlbGVjdGlvbkV2ZW50ID0geyBpdGVtczogW10gfTtcclxuICAgIGNvbnN0IG9sZE5vZGVzID0gdGhpcy5vbGRTZWxlY3Rpb25Ob2RlcztcclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5ncmlkQXBpLmdldFNlbGVjdGVkTm9kZXMoKTtcclxuICAgIG5vZGVzLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgYXJncy5pdGVtcy5wdXNoKHtcclxuICAgICAgICByb3dMZXZlbDogaS5sZXZlbCxcclxuICAgICAgICByb3dJbmRleDogaS5yb3dJbmRleCxcclxuICAgICAgICBkYXRhOiBpLmRhdGFcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHsgZGF0YTogYXJncywgY29tcG9uZW50OiB0aGlzLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICAgIGxldCBhY3Rpb24gPSBub2Rlcy5sZW5ndGggPiBvbGROb2Rlcy5sZW5ndGggPyB0cnVlIDogZmFsc2U7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5kaWZmZXJlbmNlT2YyQXJyYXlzKG5vZGVzLCBvbGROb2Rlcyk7XHJcbiAgICB0aGlzLm9uUm93U2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHsgY29tcG9uZW50OiB0aGlzLCBzZWxlY3RlZDogYWN0aW9uLCBkYXRhOiBub2RlLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICAgIHRoaXMub2xkU2VsZWN0aW9uTm9kZXMgPSBub2RlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwQ2VsbEV2ZW50KGU6IENlbGxFdmVudCk6IEFYR3JpZENlbGxFdmVudCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByb3dMZXZlbDogMCxcclxuICAgICAgY29sdW1uOiBlLmNvbHVtbixcclxuICAgICAgZGF0YTogZS5kYXRhLFxyXG4gICAgICByb3dJbmRleDogZS5yb3dJbmRleCxcclxuICAgICAgdmFsdWU6IGUudmFsdWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFJvd0V2ZW50KGU6IFJvd0V2ZW50KTogQVhHcmlkUm93RXZlbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcm93TGV2ZWw6IDAsXHJcbiAgICAgIGRhdGE6IGUuZGF0YSxcclxuICAgICAgcm93SW5kZXg6IGUucm93SW5kZXhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzZWxlY3RBbGwoKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkuZGVzZWxlY3RBbGwoKTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR2V0Um93Q2xhc3MgPSAocDogYW55KSA9PiB7XHJcbiAgICBpZiAodGhpcy5yb3dDbGFzcykge1xyXG4gICAgICBpZiAodGhpcy5yb3dDbGFzcyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93Q2xhc3Moe1xyXG4gICAgICAgICAgcm93SW5kZXg6IHAubm9kZS5yb3dJbmRleCxcclxuICAgICAgICAgIHJvd0xldmVsOiBwLm5vZGUubGV2ZWwsXHJcbiAgICAgICAgICBkYXRhOiBwLmRhdGFcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dDbGFzcztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHNob3dMb2FkaW5nKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2hvd0xvYWRpbmdPdmVybGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoaWRlTG9hZGluZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdyaWRTaXplQ2hhbmdlZChlOiBHcmlkU2l6ZUNoYW5nZWRFdmVudCkge1xyXG4gICAgaWYgKGUuY2xpZW50V2lkdGggPiAwICYmIGUuY2xpZW50SGVpZ2h0ID4gMCkge1xyXG4gICAgICB0aGlzLnBlcmZvcm1TaXplQ29sdW1uc1RvRml0KGUuYXBpKTtcclxuICAgIH1cclxuICAgIC8vICB0aGlzLnJlZnJlc2goKTtcclxuICAgIC8vICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9GaXJzdFBhZ2UoKTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZEZpcnN0RGF0YVJlbmRlcmVkKGU6IEZpcnN0RGF0YVJlbmRlcmVkRXZlbnQpIHtcclxuICAgIHRoaXMucGVyZm9ybVNpemVDb2x1bW5zVG9GaXQoZS5hcGkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwZXJmb3JtU2l6ZUNvbHVtbnNUb0ZpdChhcGk6IEdyaWRBcGkpIHtcclxuICAgIGlmICh0aGlzLnNpemVDb2x1bW5zVG9GaXQpIHtcclxuICAgICAgYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19