@dbg-riskit/angular-testing 12.3.0 → 9999.9999.9999-rc.12148

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 (78) hide show
  1. package/dbg-riskit-angular-testing.d.ts +1 -0
  2. package/docs/README.md +1 -11
  3. package/{esm2015/dbg-riskit-angular-testing.js → esm2020/dbg-riskit-angular-testing.mjs} +0 -0
  4. package/{esm2015/lib/by.util.js → esm2020/lib/by.util.mjs} +0 -0
  5. package/esm2020/lib/cached.resource.provider.mjs +17 -0
  6. package/esm2020/lib/definitions/data.table.definition.mjs +556 -0
  7. package/esm2020/lib/definitions/download.menu.page.mjs +90 -0
  8. package/esm2020/lib/definitions/highlighter.directive.page.mjs +36 -0
  9. package/esm2020/lib/definitions/layout.component.page.mjs +93 -0
  10. package/{esm2015/lib/definitions/link.definition.js → esm2020/lib/definitions/link.definition.mjs} +0 -0
  11. package/{esm2015/lib/definitions/link.only.page.js → esm2020/lib/definitions/link.only.page.mjs} +0 -0
  12. package/{esm2015/lib/definitions/login.menu.page.js → esm2020/lib/definitions/login.menu.page.mjs} +0 -0
  13. package/{esm2015/lib/definitions/login.page.js → esm2020/lib/definitions/login.page.mjs} +4 -4
  14. package/{esm2015/lib/definitions/message.def.js → esm2020/lib/definitions/message.def.mjs} +0 -0
  15. package/esm2020/lib/definitions/message.page.mjs +68 -0
  16. package/esm2020/lib/definitions/page.base.mjs +64 -0
  17. package/esm2020/lib/environment.mjs +23 -0
  18. package/esm2020/lib/events.mjs +60 -0
  19. package/esm2020/lib/stubs/auth/auth.routing.flow.service.stub.mjs +37 -0
  20. package/esm2020/lib/stubs/auth/auth.service.stub.mjs +40 -0
  21. package/esm2020/lib/stubs/auth/well.known.service.stub.mjs +22 -0
  22. package/esm2020/lib/stubs/http.service.stub.mjs +54 -0
  23. package/esm2020/lib/stubs/login.menu.stub.component.mjs +19 -0
  24. package/esm2020/lib/stubs/router/activated.route.stub.mjs +29 -0
  25. package/esm2020/lib/stubs/router/router.link.stub.mjs +46 -0
  26. package/{esm2015/lib/stubs/router/router.module.stub.js → esm2020/lib/stubs/router/router.module.stub.mjs} +4 -4
  27. package/esm2020/lib/stubs/router/router.outlet.stub.component.mjs +16 -0
  28. package/esm2020/lib/stubs/router/router.stub.mjs +79 -0
  29. package/esm2020/lib/testing.module.mjs +52 -0
  30. package/esm2020/lib/utils.mjs +48 -0
  31. package/{esm2015/public_api.js → esm2020/public_api.mjs} +4 -4
  32. package/fesm2015/{dbg-riskit-angular-testing.js → dbg-riskit-angular-testing.mjs} +263 -128
  33. package/fesm2015/dbg-riskit-angular-testing.mjs.map +1 -0
  34. package/fesm2020/dbg-riskit-angular-testing.mjs +1570 -0
  35. package/fesm2020/dbg-riskit-angular-testing.mjs.map +1 -0
  36. package/lib/definitions/data.table.definition.d.ts +3 -0
  37. package/lib/definitions/download.menu.page.d.ts +3 -0
  38. package/lib/definitions/highlighter.directive.page.d.ts +3 -0
  39. package/lib/definitions/layout.component.page.d.ts +5 -2
  40. package/lib/definitions/message.page.d.ts +3 -0
  41. package/lib/stubs/auth/auth.routing.flow.service.stub.d.ts +3 -0
  42. package/lib/stubs/auth/auth.service.stub.d.ts +3 -0
  43. package/lib/stubs/auth/well.known.service.stub.d.ts +3 -0
  44. package/lib/stubs/http.service.stub.d.ts +5 -0
  45. package/lib/stubs/login.menu.stub.component.d.ts +6 -0
  46. package/lib/stubs/router/activated.route.stub.d.ts +3 -0
  47. package/lib/stubs/router/router.link.stub.d.ts +5 -2
  48. package/lib/stubs/router/router.outlet.stub.component.d.ts +5 -0
  49. package/lib/stubs/router/router.stub.d.ts +3 -0
  50. package/lib/testing.module.d.ts +15 -0
  51. package/package.json +32 -20
  52. package/public_api.d.ts +3 -3
  53. package/bundles/dbg-riskit-angular-testing.umd.js +0 -2253
  54. package/bundles/dbg-riskit-angular-testing.umd.js.map +0 -1
  55. package/dbg-riskit-angular-testing.metadata.json +0 -1
  56. package/esm2015/lib/cached.resource.provider.js +0 -16
  57. package/esm2015/lib/definitions/data.table.definition.js +0 -508
  58. package/esm2015/lib/definitions/download.menu.page.js +0 -81
  59. package/esm2015/lib/definitions/highlighter.directive.page.js +0 -30
  60. package/esm2015/lib/definitions/layout.component.page.js +0 -73
  61. package/esm2015/lib/definitions/message.page.js +0 -54
  62. package/esm2015/lib/definitions/page.base.js +0 -64
  63. package/esm2015/lib/environment.js +0 -19
  64. package/esm2015/lib/events.js +0 -60
  65. package/esm2015/lib/stubs/auth/auth.routing.flow.service.stub.js +0 -31
  66. package/esm2015/lib/stubs/auth/auth.service.stub.js +0 -38
  67. package/esm2015/lib/stubs/auth/well.known.service.stub.js +0 -19
  68. package/esm2015/lib/stubs/http.service.stub.js +0 -49
  69. package/esm2015/lib/stubs/login.menu.component.stub.js +0 -16
  70. package/esm2015/lib/stubs/router/activated.route.stub.js +0 -26
  71. package/esm2015/lib/stubs/router/router.link.stub.js +0 -45
  72. package/esm2015/lib/stubs/router/router.outlet.stub.js +0 -12
  73. package/esm2015/lib/stubs/router/router.stub.js +0 -72
  74. package/esm2015/lib/testing.module.js +0 -34
  75. package/esm2015/lib/utils.js +0 -48
  76. package/fesm2015/dbg-riskit-angular-testing.js.map +0 -1
  77. package/lib/stubs/login.menu.component.stub.d.ts +0 -3
  78. package/lib/stubs/router/router.outlet.stub.d.ts +0 -2
@@ -0,0 +1,556 @@
1
+ import { Component } from '@angular/core';
2
+ import { MatAnchor, MatButton } from '@angular/material/button';
3
+ import { MatButtonToggle } from '@angular/material/button-toggle';
4
+ import { MatIcon } from '@angular/material/icon';
5
+ import { MatTooltip } from '@angular/material/tooltip';
6
+ import { By } from '@angular/platform-browser';
7
+ import { secureRandom } from '@dbg-riskit/common';
8
+ import { DataTableComponent, DataTableRowDetailExpanderComponent, HIGHLIGHTER_CLASS, PagingComponent } from '@dbg-riskit/angular-datatable';
9
+ import { click } from '../events';
10
+ import { Page } from './page.base';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@dbg-riskit/angular-datatable";
13
+ export class DataTableDefinition {
14
+ constructor(debugElement, page) {
15
+ this.debugElement = debugElement;
16
+ this.page = page;
17
+ }
18
+ get component() {
19
+ return this.debugElement.componentInstance;
20
+ }
21
+ get data() {
22
+ return this.component.plainData;
23
+ }
24
+ get element() {
25
+ return this.debugElement.query(By.css('.risk-data-table-wrapper > table'));
26
+ }
27
+ get header() {
28
+ return new TableHeader(this.debugElement.query((de) => de.references.mainHeader), this.page);
29
+ }
30
+ get sorting() {
31
+ return new TableSorting(this, this.page);
32
+ }
33
+ get body() {
34
+ return new TableBody(this.debugElement.query((de) => de.references.mainBody), this.page);
35
+ }
36
+ get footer() {
37
+ return new TableFooter(this.debugElement.query((de) => de.references.mainFooter));
38
+ }
39
+ get recordsCount() {
40
+ return new RecordsCount(this.debugElement.query(By.css('.risk-data-table-page-count')));
41
+ }
42
+ get pager() {
43
+ return new Pager(this.debugElement.query(By.directive(PagingComponent)), this.page);
44
+ }
45
+ }
46
+ // <editor-fold defaultstate="collapsed" desc="Table header">
47
+ export class TableHeader {
48
+ constructor(element, page) {
49
+ this.element = element;
50
+ this.page = page;
51
+ }
52
+ get rows() {
53
+ return this.element.queryAll(By.css('tr')).map((element) => {
54
+ return new TableHeaderRow(element, this.page);
55
+ });
56
+ }
57
+ get cells() {
58
+ return this.element.queryAll(By.css('th')).map((element) => {
59
+ return new TableHeaderCell(element, this.page);
60
+ });
61
+ }
62
+ }
63
+ export class TableHeaderRow {
64
+ constructor(element, page) {
65
+ this.element = element;
66
+ this.page = page;
67
+ }
68
+ get cells() {
69
+ return this.element.queryAll(By.css('th')).map((element) => {
70
+ return new TableHeaderCell(element, this.page);
71
+ });
72
+ }
73
+ }
74
+ export class TableHeaderCell {
75
+ constructor(element, page) {
76
+ this.element = element;
77
+ this.page = page;
78
+ }
79
+ get sortingHandle() {
80
+ const handle = this.element.query(By.directive(MatButton));
81
+ if (handle) {
82
+ return new SortingHandle(this.page, handle);
83
+ }
84
+ return null;
85
+ }
86
+ get tooltip() {
87
+ const handle = this.element.query(By.directive(MatTooltip));
88
+ if (handle) {
89
+ return handle.injector.get(MatTooltip).message;
90
+ }
91
+ return null;
92
+ }
93
+ get title() {
94
+ const textNode = this.element.childNodes.find((node) => node.nativeNode.nodeType === Node.TEXT_NODE);
95
+ if (textNode != null) {
96
+ return textNode
97
+ .nativeNode.textContent.trim();
98
+ }
99
+ return '';
100
+ }
101
+ get colspan() {
102
+ return this.element.nativeElement.colspan;
103
+ }
104
+ get rowspan() {
105
+ return this.element.nativeElement.rowspan;
106
+ }
107
+ }
108
+ // <editor-fold defaultstate="collapsed" desc="Sorting">
109
+ export class TableSorting {
110
+ constructor(table, page) {
111
+ this.table = table;
112
+ this.page = page;
113
+ }
114
+ get handles() {
115
+ const handles = this.table.debugElement.query((de) => de.references.mainHeader)
116
+ .queryAll(By.directive(MatButton));
117
+ if (!handles) {
118
+ return [];
119
+ }
120
+ return handles.map((handle) => {
121
+ return new SortingHandle(this.page, handle);
122
+ });
123
+ }
124
+ get detailRowHandles() {
125
+ const handles = this.table.debugElement.query(By.css('.risk-data-table-detail')).query(By.css('thead'))
126
+ .queryAll(By.directive(MatButton));
127
+ if (!handles) {
128
+ return null;
129
+ }
130
+ return handles.map((handle) => {
131
+ return new SortingHandle(this.page, handle);
132
+ });
133
+ }
134
+ get currentOrdering() {
135
+ return this.table.component.ordering;
136
+ }
137
+ checkSorting(firstNRows = this.table.component.rows.length, criterium) {
138
+ // WARN: call data once as it calls .map on all table rows
139
+ const data = this.table.data;
140
+ let ordering;
141
+ if (criterium) {
142
+ ordering = [criterium].concat(this.table.component._defaultOrdering);
143
+ }
144
+ else {
145
+ ordering = this.currentOrdering;
146
+ }
147
+ for (let i = 1; i < Math.min(data.length, firstNRows); i++) {
148
+ ordering.some((criteria) => {
149
+ //noinspection EqualityComparisonWithCoercionJS
150
+ const valueA = criteria.get(data[i - 1]);
151
+ const valueB = criteria.get(data[i]);
152
+ if (valueA == null && valueB == null) {
153
+ return false;
154
+ }
155
+ expect(valueA).not.toBeNull();
156
+ expect(valueA).not.toBeUndefined();
157
+ if (valueB != null) {
158
+ if (criteria.descending) {
159
+ expect(valueA >= valueB)
160
+ .toBeTruthy('Expect: ' + valueA + ' >= '
161
+ + valueB);
162
+ }
163
+ else {
164
+ expect(valueA <= valueB)
165
+ .toBeTruthy('Expect: ' + valueA + ' <= '
166
+ + valueB);
167
+ }
168
+ }
169
+ return valueA !== valueB;
170
+ });
171
+ }
172
+ }
173
+ }
174
+ export class SortingHandle {
175
+ constructor(page, handle) {
176
+ this.page = page;
177
+ this.handle = handle;
178
+ }
179
+ click() {
180
+ click(this.handle);
181
+ this.page.detectChanges();
182
+ }
183
+ }
184
+ // </editor-fold>
185
+ // </editor-fold>
186
+ // <editor-fold defaultstate="collapsed" desc="Table body">
187
+ export class TableBody {
188
+ constructor(element, page) {
189
+ this.element = element;
190
+ this.page = page;
191
+ }
192
+ get rows() {
193
+ return this.element.queryAll((de) => de.references.masterRow).map((element) => {
194
+ return new TableBodyRow(element, this.page);
195
+ });
196
+ }
197
+ get cells() {
198
+ let cells = [];
199
+ this.element.queryAll((de) => de.references.masterRow).forEach((row) => {
200
+ cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
201
+ return new TableBodyCell(cell);
202
+ }));
203
+ });
204
+ return cells;
205
+ }
206
+ }
207
+ export class TableBodyRow {
208
+ constructor(element, page) {
209
+ this.element = element;
210
+ this.page = page;
211
+ }
212
+ expandRow() {
213
+ click(this.element);
214
+ this.page.detectChanges();
215
+ }
216
+ get expander() {
217
+ return new RowExpander(this.element.query(By.directive(DataTableRowDetailExpanderComponent)).query(By.directive(MatAnchor)));
218
+ }
219
+ get cells() {
220
+ return this.element.queryAll(By.css('td')).map((element) => {
221
+ return new TableBodyCell(element);
222
+ });
223
+ }
224
+ get rowDetail() {
225
+ const parent = this.element.parent;
226
+ if (parent != null) {
227
+ const next = parent.children[parent.children.indexOf(this.element) + 1];
228
+ if (next && !next.references.masterRow) {
229
+ return new TableBodyDetail(next, this.page);
230
+ }
231
+ }
232
+ return null;
233
+ }
234
+ get highlighted() {
235
+ return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
236
+ }
237
+ }
238
+ export class RowExpander {
239
+ constructor(element) {
240
+ this.element = element;
241
+ }
242
+ get icon() {
243
+ return this.element.query(By.directive(MatIcon)).nativeElement.textContent.trim();
244
+ }
245
+ get opened() {
246
+ return this.icon === 'expand_less';
247
+ }
248
+ get closed() {
249
+ return this.icon === 'expand_more';
250
+ }
251
+ }
252
+ export class TableBodyCell {
253
+ constructor(element) {
254
+ this.element = element;
255
+ }
256
+ get colspan() {
257
+ return this.element.nativeElement.colspan;
258
+ }
259
+ get rowspan() {
260
+ return this.element.nativeElement.rowspan;
261
+ }
262
+ }
263
+ // <editor-fold defaultstate="collapsed" desc="Row detail">
264
+ export class TableBodyDetail {
265
+ constructor(element, page) {
266
+ this.element = element;
267
+ this.page = page;
268
+ }
269
+ header() {
270
+ return new TableHeader(this.element.query(By.css('thead')), this.page);
271
+ }
272
+ get body() {
273
+ return new TableBodyDetailBody(this.element.query(By.css('tbody')));
274
+ }
275
+ get highlighted() {
276
+ return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
277
+ }
278
+ get colspan() {
279
+ return this.element.children[0].nativeElement.colspan;
280
+ }
281
+ }
282
+ export class TableBodyDetailBody {
283
+ constructor(element) {
284
+ this.element = element;
285
+ }
286
+ get rows() {
287
+ return this.element.queryAll(By.css('tr')).map((element) => {
288
+ return new TableBodyDetailRow(element);
289
+ });
290
+ }
291
+ get cells() {
292
+ let cells = [];
293
+ this.element.queryAll(By.css('tr')).forEach((row) => {
294
+ cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
295
+ return new TableBodyCell(cell);
296
+ }));
297
+ });
298
+ return cells;
299
+ }
300
+ }
301
+ export class TableBodyDetailRow {
302
+ constructor(element) {
303
+ this.element = element;
304
+ }
305
+ get cells() {
306
+ return this.element.queryAll(By.css('td')).map((element) => {
307
+ return new TableBodyCell(element);
308
+ });
309
+ }
310
+ }
311
+ // </editor-fold>
312
+ // </editor-fold>
313
+ // <editor-fold defaultstate="collapsed" desc="Table footer">
314
+ export class TableFooter {
315
+ constructor(element) {
316
+ this.element = element;
317
+ }
318
+ get rows() {
319
+ return this.element.queryAll(By.css('tr')).map((element) => {
320
+ return new TableFooterRow(element);
321
+ });
322
+ }
323
+ get cells() {
324
+ let cells = [];
325
+ this.element.queryAll(By.css('tr')).forEach((row) => {
326
+ cells = cells.concat(row.queryAll(By.css('th')).map((cell) => {
327
+ return new TableBodyCell(cell);
328
+ }));
329
+ });
330
+ return cells;
331
+ }
332
+ }
333
+ export class TableFooterRow {
334
+ constructor(element) {
335
+ this.element = element;
336
+ }
337
+ get cells() {
338
+ return this.element.queryAll(By.css('th')).map((element) => {
339
+ return new TableBodyCell(element);
340
+ });
341
+ }
342
+ }
343
+ // </editor-fold>
344
+ export class RecordsCount {
345
+ constructor(element) {
346
+ this.element = element;
347
+ }
348
+ get message() {
349
+ return this.element.nativeElement.textContent;
350
+ }
351
+ }
352
+ export class Pager {
353
+ constructor(element, page) {
354
+ this.element = element;
355
+ this.page = page;
356
+ }
357
+ get pageButtons() {
358
+ return this.element.queryAll(By.directive(MatButtonToggle));
359
+ }
360
+ expectLeadingButtonsDisabled() {
361
+ for (let i = 0; i < 2; i++) {
362
+ expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
363
+ .toBe(true, 'First two are disabled.');
364
+ }
365
+ }
366
+ expectLeadingButtonsNotDisabled() {
367
+ for (let i = 0; i < 2; i++) {
368
+ expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
369
+ .not.toBe(true, 'First two are not disabled.');
370
+ }
371
+ }
372
+ expectTrailingButtonsDisabled() {
373
+ for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
374
+ expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
375
+ .toBe(true, 'Last two are disabled.');
376
+ }
377
+ }
378
+ expectTrailingButtonsNotDisabled() {
379
+ for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
380
+ expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
381
+ .not.toBe(true, 'Last two are not disabled.');
382
+ }
383
+ }
384
+ expectButtonNumbers(numbers) {
385
+ for (let i = 0; i < numbers.length; i++) {
386
+ expect(this.pageButtons[i + 2].query(By.css('.mat-button-toggle-label-content'))
387
+ .nativeElement.textContent.trim())
388
+ .toEqual(numbers[i] + '', 'Button numbers are correct');
389
+ }
390
+ }
391
+ expectButtonActive(index) {
392
+ expect(this.pageButtons[index].classes['mat-button-toggle-checked'])
393
+ .toBe(true, 'Button is active.');
394
+ }
395
+ click(index) {
396
+ click(this.pageButtons[index].query(By.css('.mat-button-toggle-label-content')).nativeElement);
397
+ this.page.detectChanges();
398
+ this.page.advanceAndDetectChanges();
399
+ }
400
+ }
401
+ export function chceckSorting(page, criteria) {
402
+ page.dataTable.sorting.checkSorting(150);
403
+ page.dataTable.sorting.handles.forEach((handle, index) => {
404
+ // Tigger sort based on a handle
405
+ handle.click();
406
+ page.detectChanges();
407
+ // Check the sorting
408
+ page.dataTable.sorting.checkSorting(150, {
409
+ get: criteria[index]
410
+ });
411
+ // Tigger sort based on a handle
412
+ handle.click();
413
+ page.detectChanges();
414
+ // Check the sorting
415
+ page.dataTable.sorting.checkSorting(150, {
416
+ get: criteria[index],
417
+ descending: true
418
+ });
419
+ });
420
+ }
421
+ export class DataTableDefinitionHosted extends Page {
422
+ constructor(fixture) {
423
+ super(fixture);
424
+ }
425
+ get dataTable() {
426
+ return new DataTableDefinition(this.debugElement.query(By.directive(DataTableComponent)), this);
427
+ }
428
+ }
429
+ export class TestDataTableHostComponent {
430
+ constructor() {
431
+ this.data = [];
432
+ for (let i = 0; i < 500; i++) {
433
+ this.data.push({
434
+ value1: Math.floor(secureRandom() * 20) + ' - value 1',
435
+ value2: Math.floor(secureRandom() * 20) + ' - value 2',
436
+ value3: Math.floor(secureRandom() * 20) + ' - value 3'
437
+ });
438
+ }
439
+ this.footer = this.data[0];
440
+ }
441
+ get defaultOrdering() {
442
+ return [
443
+ {
444
+ get: (record) => {
445
+ return record.value3;
446
+ },
447
+ descending: true
448
+ },
449
+ (record) => {
450
+ return record.value2;
451
+ }
452
+ ];
453
+ }
454
+ get valueGetter() {
455
+ return (record) => {
456
+ return record.value1;
457
+ };
458
+ }
459
+ }
460
+ TestDataTableHostComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: TestDataTableHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
461
+ TestDataTableHostComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: TestDataTableHostComponent, selector: "ng-component", ngImport: i0, template: `
462
+ <risk-data-table [data]="data"
463
+ [footer]="footer"
464
+ [pageSize]="20"
465
+ [defaultOrdering]="defaultOrdering"
466
+ [striped]="true">
467
+ <risk-data-table-column title="Test Column 1"
468
+ [sortingKey]="valueGetter">
469
+ <ng-template let-record="row" risk-data-table-cell>
470
+ {{record.value1}}
471
+ </ng-template>
472
+ </risk-data-table-column>
473
+ <risk-data-table-column>
474
+ <ng-template risk-data-table-cell let-record="row" let-expanded="expanded">
475
+ <risk-data-table-detail-expander [expanded]="expanded"></risk-data-table-detail-expander>
476
+ </ng-template>
477
+ <ng-template risk-data-table-footer-cell let-footer="footer">
478
+ {{footer.value1}}
479
+ </ng-template>
480
+ </risk-data-table-column>
481
+ <!-- Sub detail -->
482
+ <risk-data-table-detail-row>
483
+ <risk-data-table-column-group>
484
+ <risk-data-table-column title="Test Detail Column 1"
485
+ [sortingKey]="valueGetter">
486
+ <ng-template risk-data-table-cell let-record="row">
487
+ {{record.value1}}
488
+ </ng-template>
489
+ </risk-data-table-column>
490
+ </risk-data-table-column-group>
491
+ <risk-data-table-column-group>
492
+ <risk-data-table-column title="Test Detail Column 2">
493
+ <ng-template risk-data-table-cell let-record="row">
494
+ {{record.value2}}
495
+ </ng-template>
496
+ </risk-data-table-column>
497
+ <risk-data-table-column title="Test Detail Column 3">
498
+ <ng-template risk-data-table-cell let-record="row">
499
+ {{record.value3}}
500
+ </ng-template>
501
+ </risk-data-table-column>
502
+ </risk-data-table-column-group>
503
+ <risk-data-table-column-group></risk-data-table-column-group>
504
+ </risk-data-table-detail-row>
505
+ </risk-data-table>`, isInline: true, components: [{ type: i1.DataTableComponent, selector: "risk-data-table", inputs: ["footer", "pageSize", "striped", "showFooter", "allowEmpty", "trackByRowKey", "highlighting", "stickyHeader", "stickyHeaderOffsetTopPx", "data", "defaultOrdering"], exportAs: ["dataTable"] }, { type: i1.DataTableRowDetailExpanderComponent, selector: "risk-data-table-detail-expander", inputs: ["expanded"] }], directives: [{ type: i1.ɵDataTableColumnDirective, selector: "risk-data-table-column", inputs: ["title", "sortingKey", "tooltip", "contentAlign", "headerAlign", "footerAlign", "class"] }, { type: i1.ɵDataTableColumnCellDirective, selector: "[risk-data-table-cell]" }, { type: i1.ɵDataTableColumnFooterDirective, selector: "[risk-data-table-footer-cell]" }, { type: i1.ɵDataTableRowDetailDirective, selector: "risk-data-table-detail-row" }, { type: i1.ɵDataTableColumnGroupDirective, selector: "risk-data-table-column-group" }] });
506
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: TestDataTableHostComponent, decorators: [{
507
+ type: Component,
508
+ args: [{
509
+ template: `
510
+ <risk-data-table [data]="data"
511
+ [footer]="footer"
512
+ [pageSize]="20"
513
+ [defaultOrdering]="defaultOrdering"
514
+ [striped]="true">
515
+ <risk-data-table-column title="Test Column 1"
516
+ [sortingKey]="valueGetter">
517
+ <ng-template let-record="row" risk-data-table-cell>
518
+ {{record.value1}}
519
+ </ng-template>
520
+ </risk-data-table-column>
521
+ <risk-data-table-column>
522
+ <ng-template risk-data-table-cell let-record="row" let-expanded="expanded">
523
+ <risk-data-table-detail-expander [expanded]="expanded"></risk-data-table-detail-expander>
524
+ </ng-template>
525
+ <ng-template risk-data-table-footer-cell let-footer="footer">
526
+ {{footer.value1}}
527
+ </ng-template>
528
+ </risk-data-table-column>
529
+ <!-- Sub detail -->
530
+ <risk-data-table-detail-row>
531
+ <risk-data-table-column-group>
532
+ <risk-data-table-column title="Test Detail Column 1"
533
+ [sortingKey]="valueGetter">
534
+ <ng-template risk-data-table-cell let-record="row">
535
+ {{record.value1}}
536
+ </ng-template>
537
+ </risk-data-table-column>
538
+ </risk-data-table-column-group>
539
+ <risk-data-table-column-group>
540
+ <risk-data-table-column title="Test Detail Column 2">
541
+ <ng-template risk-data-table-cell let-record="row">
542
+ {{record.value2}}
543
+ </ng-template>
544
+ </risk-data-table-column>
545
+ <risk-data-table-column title="Test Detail Column 3">
546
+ <ng-template risk-data-table-cell let-record="row">
547
+ {{record.value3}}
548
+ </ng-template>
549
+ </risk-data-table-column>
550
+ </risk-data-table-column-group>
551
+ <risk-data-table-column-group></risk-data-table-column-group>
552
+ </risk-data-table-detail-row>
553
+ </risk-data-table>`
554
+ }]
555
+ }], ctorParameters: function () { return []; } });
556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS50YWJsZS5kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGtnL2RiZy1yaXNraXQvYW5ndWxhci10ZXN0aW5nL3NyYy9saWIvZGVmaW5pdGlvbnMvZGF0YS50YWJsZS5kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzdDLE9BQU8sRUFBYyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLG1DQUFtQyxFQUNuQyxpQkFBaUIsRUFFakIsZUFBZSxFQUNsQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQzs7O0FBRWpDLE1BQU0sT0FBTyxtQkFBbUI7SUFFNUIsWUFBMEIsWUFBMEIsRUFDekIsSUFBd0U7UUFEekUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBb0U7SUFDbkcsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FB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RGVidWdOb2RlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tcG9uZW50Rml4dHVyZX0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7TWF0QW5jaG9yLCBNYXRCdXR0b259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge01hdEJ1dHRvblRvZ2dsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZSc7XG5pbXBvcnQge01hdEljb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtNYXRUb29sdGlwfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7Qnl9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtWYWx1ZUdldHRlciwgc2VjdXJlUmFuZG9tfSBmcm9tICdAZGJnLXJpc2tpdC9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBEYXRhVGFibGVDb21wb25lbnQsXG4gICAgRGF0YVRhYmxlUm93RGV0YWlsRXhwYW5kZXJDb21wb25lbnQsXG4gICAgSElHSExJR0hURVJfQ0xBU1MsXG4gICAgT3JkZXJpbmdDcml0ZXJpYSxcbiAgICBQYWdpbmdDb21wb25lbnRcbn0gZnJvbSAnQGRiZy1yaXNraXQvYW5ndWxhci1kYXRhdGFibGUnO1xuaW1wb3J0IHtjbGlja30gZnJvbSAnLi4vZXZlbnRzJztcbmltcG9ydCB7UGFnZX0gZnJvbSAnLi9wYWdlLmJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlRGVmaW5pdGlvbiB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCwgYWR2YW5jZUFuZERldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29tcG9uZW50KCk6IERhdGFUYWJsZUNvbXBvbmVudDx1bmtub3duLCB1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnRWxlbWVudC5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQucGxhaW5EYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWxlbWVudCgpOiBEZWJ1Z0VsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuY3NzKCcucmlzay1kYXRhLXRhYmxlLXdyYXBwZXIgPiB0YWJsZScpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcigpOiBUYWJsZUhlYWRlciB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXIodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1haW5IZWFkZXIpLCB0aGlzLnBhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc29ydGluZygpOiBUYWJsZVNvcnRpbmcge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlU29ydGluZyh0aGlzLCB0aGlzLnBhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYm9keSgpOiBUYWJsZUJvZHkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keSh0aGlzLmRlYnVnRWxlbWVudC5xdWVyeSgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFpbkJvZHkpLCB0aGlzLnBhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZm9vdGVyKCk6IFRhYmxlRm9vdGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZvb3Rlcih0aGlzLmRlYnVnRWxlbWVudC5xdWVyeSgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFpbkZvb3RlcikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVjb3Jkc0NvdW50KCk6IFJlY29yZHNDb3VudCB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3Jkc0NvdW50KHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnLnJpc2stZGF0YS10YWJsZS1wYWdlLWNvdW50JykpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhZ2VyKCk6IFBhZ2VyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlcih0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoUGFnaW5nQ29tcG9uZW50KSksIHRoaXMucGFnZSk7XG4gICAgfVxufVxuXG4vLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPVwiY29sbGFwc2VkXCIgZGVzYz1cIlRhYmxlIGhlYWRlclwiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVIZWFkZXIge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogVGFibGVIZWFkZXJSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlclJvdyhlbGVtZW50LCB0aGlzLnBhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlSGVhZGVyQ2VsbFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RoJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlSGVhZGVyQ2VsbChlbGVtZW50LCB0aGlzLnBhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlSGVhZGVyUm93IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCwgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2VsbHMoKTogVGFibGVIZWFkZXJDZWxsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndGgnKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXJDZWxsKGVsZW1lbnQsIHRoaXMucGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlSGVhZGVyQ2VsbCB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCwgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc29ydGluZ0hhbmRsZSgpOiBTb3J0aW5nSGFuZGxlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuZWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoTWF0QnV0dG9uKSk7XG4gICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGluZ0hhbmRsZSh0aGlzLnBhZ2UsIGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKE1hdFRvb2x0aXApKTtcbiAgICAgICAgaWYgKGhhbmRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5pbmplY3Rvci5nZXQoTWF0VG9vbHRpcCkubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gdGhpcy5lbGVtZW50LmNoaWxkTm9kZXMuZmluZCgobm9kZTogRGVidWdOb2RlKSA9PiBub2RlLm5hdGl2ZU5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKTtcbiAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0Tm9kZVxuICAgICAgICAgICAgICAgIC5uYXRpdmVOb2RlLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb2xzcGFuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93c3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucm93c3BhbjtcbiAgICB9XG5cbn1cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJTb3J0aW5nXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVNvcnRpbmcge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFibGU6IERhdGFUYWJsZURlZmluaXRpb24sIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhbmRsZXMoKTogU29ydGluZ0hhbmRsZVtdIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMudGFibGUuZGVidWdFbGVtZW50LnF1ZXJ5KChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYWluSGVhZGVyKVxuICAgICAgICAgICAgLnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRCdXR0b24pKTtcbiAgICAgICAgaWYgKCFoYW5kbGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZXMubWFwKChoYW5kbGU6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3J0aW5nSGFuZGxlKHRoaXMucGFnZSwgaGFuZGxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXRhaWxSb3dIYW5kbGVzKCk6IFNvcnRpbmdIYW5kbGVbXSB8IG51bGwge1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gdGhpcy50YWJsZS5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuY3NzKCcucmlzay1kYXRhLXRhYmxlLWRldGFpbCcpKS5xdWVyeShCeS5jc3MoJ3RoZWFkJykpXG4gICAgICAgICAgICAucXVlcnlBbGwoQnkuZGlyZWN0aXZlKE1hdEJ1dHRvbikpO1xuICAgICAgICBpZiAoIWhhbmRsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVzLm1hcCgoaGFuZGxlOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGluZ0hhbmRsZSh0aGlzLnBhZ2UsIGhhbmRsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudE9yZGVyaW5nKCk6IEFycmF5PE9yZGVyaW5nQ3JpdGVyaWE8YW55Pj4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudGFibGUuY29tcG9uZW50IGFzIGFueSkub3JkZXJpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrU29ydGluZyhmaXJzdE5Sb3dzOiBudW1iZXIgPSB0aGlzLnRhYmxlLmNvbXBvbmVudC5yb3dzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcml1bT86IE9yZGVyaW5nQ3JpdGVyaWE8YW55Pik6IHZvaWQge1xuICAgICAgICAvLyBXQVJOOiBjYWxsIGRhdGEgb25jZSBhcyBpdCBjYWxscyAubWFwIG9uIGFsbCB0YWJsZSByb3dzXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRhYmxlLmRhdGE7XG5cbiAgICAgICAgbGV0IG9yZGVyaW5nOiBBcnJheTxPcmRlcmluZ0NyaXRlcmlhPGFueT4+O1xuICAgICAgICBpZiAoY3JpdGVyaXVtKSB7XG4gICAgICAgICAgICBvcmRlcmluZyA9IFtjcml0ZXJpdW1dLmNvbmNhdCgodGhpcy50YWJsZS5jb21wb25lbnQgYXMgYW55KS5fZGVmYXVsdE9yZGVyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9yZGVyaW5nID0gdGhpcy5jdXJyZW50T3JkZXJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBNYXRoLm1pbihkYXRhLmxlbmd0aCwgZmlyc3ROUm93cyk7IGkrKykge1xuICAgICAgICAgICAgb3JkZXJpbmcuc29tZSgoY3JpdGVyaWE6IE9yZGVyaW5nQ3JpdGVyaWE8YW55PikgPT4ge1xuICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIEVxdWFsaXR5Q29tcGFyaXNvbldpdGhDb2VyY2lvbkpTXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVBOiBhbnkgPSBjcml0ZXJpYS5nZXQoZGF0YVtpIC0gMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlQjogYW55ID0gY3JpdGVyaWEuZ2V0KGRhdGFbaV0pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUEgPT0gbnVsbCAmJiB2YWx1ZUIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4cGVjdCh2YWx1ZUEpLm5vdC50b0JlTnVsbCgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh2YWx1ZUEpLm5vdC50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlQiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcml0ZXJpYS5kZXNjZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsdWVBID49IHZhbHVlQilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9CZVRydXRoeSgnRXhwZWN0OiAnICsgdmFsdWVBICsgJyA+PSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZUIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHZhbHVlQSA8PSB2YWx1ZUIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQmVUcnV0aHkoJ0V4cGVjdDogJyArIHZhbHVlQSArICcgPD0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWVCKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVBICE9PSB2YWx1ZUI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNvcnRpbmdIYW5kbGUge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0sIHByaXZhdGUgaGFuZGxlOiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2soKSB7XG4gICAgICAgIGNsaWNrKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgdGhpcy5wYWdlLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG59XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiVGFibGUgYm9keVwiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IFRhYmxlQm9keVJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbCgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFzdGVyUm93KS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlSb3coZWxlbWVudCwgdGhpcy5wYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICBsZXQgY2VsbHM6IFRhYmxlQm9keUNlbGxbXSA9IFtdO1xuICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnlBbGwoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1hc3RlclJvdykuZm9yRWFjaCgocm93OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNlbGxzID0gY2VsbHMuY29uY2F0KHJvdy5xdWVyeUFsbChCeS5jc3MoJ3RkJykpLm1hcCgoY2VsbDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGNlbGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNlbGxzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keVJvdyB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCwgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBhbmRSb3coKTogdm9pZCB7XG4gICAgICAgIGNsaWNrKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHRoaXMucGFnZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleHBhbmRlcigpOiBSb3dFeHBhbmRlciB7XG4gICAgICAgIHJldHVybiBuZXcgUm93RXhwYW5kZXIoXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKERhdGFUYWJsZVJvd0RldGFpbEV4cGFuZGVyQ29tcG9uZW50KSkucXVlcnkoQnkuZGlyZWN0aXZlKE1hdEFuY2hvcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0RldGFpbCgpOiBUYWJsZUJvZHlEZXRhaWwgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMuZWxlbWVudCkgKyAxXTtcbiAgICAgICAgICAgIGlmIChuZXh0ICYmICFuZXh0LnJlZmVyZW5jZXMubWFzdGVyUm93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlEZXRhaWwobmV4dCwgdGhpcy5wYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZ2hsaWdodGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKEhJR0hMSUdIVEVSX0NMQVNTKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb3dFeHBhbmRlciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGljb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoTWF0SWNvbikpLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uID09PSAnZXhwYW5kX2xlc3MnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uID09PSAnZXhwYW5kX21vcmUnO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keUNlbGwge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHNwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbHNwYW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5yb3dzcGFuO1xuICAgIH1cbn1cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJSb3cgZGV0YWlsXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlEZXRhaWwge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGVhZGVyKCk6IFRhYmxlSGVhZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlcih0aGlzLmVsZW1lbnQucXVlcnkoQnkuY3NzKCd0aGVhZCcpKSwgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJvZHkoKTogVGFibGVCb2R5RGV0YWlsQm9keSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5RGV0YWlsQm9keSh0aGlzLmVsZW1lbnQucXVlcnkoQnkuY3NzKCd0Ym9keScpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhISUdITElHSFRFUl9DTEFTUyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2hpbGRyZW5bMF0ubmF0aXZlRWxlbWVudC5jb2xzcGFuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keURldGFpbEJvZHkge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogVGFibGVCb2R5RGV0YWlsUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndHInKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5RGV0YWlsUm93KGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIGxldCBjZWxsczogVGFibGVCb2R5Q2VsbFtdID0gW107XG4gICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLmZvckVhY2goKHJvdzogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjZWxscyA9IGNlbGxzLmNvbmNhdChyb3cucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGNlbGw6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChjZWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlEZXRhaWxSb3cge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiVGFibGUgZm9vdGVyXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZvb3RlciB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBUYWJsZUZvb3RlclJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9vdGVyUm93KGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIGxldCBjZWxsczogVGFibGVCb2R5Q2VsbFtdID0gW107XG4gICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLmZvckVhY2goKHJvdzogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjZWxscyA9IGNlbGxzLmNvbmNhdChyb3cucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGNlbGw6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChjZWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZvb3RlclJvdyB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2VsbHMoKTogVGFibGVCb2R5Q2VsbFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RoJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gPC9lZGl0b3ItZm9sZD5cblxuZXhwb3J0IGNsYXNzIFJlY29yZHNDb3VudCB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFnZXIge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkLCBhZHZhbmNlQW5kRGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdlQnV0dG9ucygpOiBEZWJ1Z0VsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuZGlyZWN0aXZlKE1hdEJ1dHRvblRvZ2dsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RMZWFkaW5nQnV0dG9uc0Rpc2FibGVkKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaV0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQnXSlcbiAgICAgICAgICAgICAgICAudG9CZSh0cnVlLCAnRmlyc3QgdHdvIGFyZSBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RMZWFkaW5nQnV0dG9uc05vdERpc2FibGVkKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaV0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQnXSlcbiAgICAgICAgICAgICAgICAubm90LnRvQmUodHJ1ZSwgJ0ZpcnN0IHR3byBhcmUgbm90IGRpc2FibGVkLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGV4cGVjdFRyYWlsaW5nQnV0dG9uc0Rpc2FibGVkKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5wYWdlQnV0dG9ucy5sZW5ndGggLSAxOyBpID4gdGhpcy5wYWdlQnV0dG9ucy5sZW5ndGggLSAzOyBpLS0pIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2ldLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgLnRvQmUodHJ1ZSwgJ0xhc3QgdHdvIGFyZSBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RUcmFpbGluZ0J1dHRvbnNOb3REaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMTsgaSA+IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMzsgaS0tKSB7XG4gICAgICAgICAgICBleHBlY3QodGhpcy5wYWdlQnV0dG9uc1tpXS5jbGFzc2VzWydtYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCddKVxuICAgICAgICAgICAgICAgIC5ub3QudG9CZSh0cnVlLCAnTGFzdCB0d28gYXJlIG5vdCBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RCdXR0b25OdW1iZXJzKG51bWJlcnM6IG51bWJlcltdKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaSArIDJdLnF1ZXJ5KEJ5LmNzcygnLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQnKSlcbiAgICAgICAgICAgICAgICAubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudC50cmltKCkpXG4gICAgICAgICAgICAgICAgLnRvRXF1YWwobnVtYmVyc1tpXSArICcnLCAnQnV0dG9uIG51bWJlcnMgYXJlIGNvcnJlY3QnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RCdXR0b25BY3RpdmUoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBleHBlY3QodGhpcy5wYWdlQnV0dG9uc1tpbmRleF0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCddKVxuICAgICAgICAgICAgLnRvQmUodHJ1ZSwgJ0J1dHRvbiBpcyBhY3RpdmUuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY2xpY2sodGhpcy5wYWdlQnV0dG9uc1tpbmRleF0ucXVlcnkoQnkuY3NzKCcubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudCcpKS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5wYWdlLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5wYWdlLmFkdmFuY2VBbmREZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hjZWNrU29ydGluZyhwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQsIGRhdGFUYWJsZTogRGF0YVRhYmxlRGVmaW5pdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWE6IEFycmF5PFZhbHVlR2V0dGVyPGFueT4+KSB7XG4gICAgcGFnZS5kYXRhVGFibGUuc29ydGluZy5jaGVja1NvcnRpbmcoMTUwKTtcblxuICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGU6IFNvcnRpbmdIYW5kbGUsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVGlnZ2VyIHNvcnQgYmFzZWQgb24gYSBoYW5kbGVcbiAgICAgICAgaGFuZGxlLmNsaWNrKCk7XG4gICAgICAgIHBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBzb3J0aW5nXG4gICAgICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuY2hlY2tTb3J0aW5nKDE1MCwge1xuICAgICAgICAgICAgZ2V0OiBjcml0ZXJpYVtpbmRleF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGlnZ2VyIHNvcnQgYmFzZWQgb24gYSBoYW5kbGVcbiAgICAgICAgaGFuZGxlLmNsaWNrKCk7XG4gICAgICAgIHBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBzb3J0aW5nXG4gICAgICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuY2hlY2tTb3J0aW5nKDE1MCwge1xuICAgICAgICAgICAgZ2V0ICAgICAgIDogY3JpdGVyaWFbaW5kZXhdLFxuICAgICAgICAgICAgZGVzY2VuZGluZzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZURlZmluaXRpb25Ib3N0ZWQgZXh0ZW5kcyBQYWdlPFRlc3REYXRhVGFibGVIb3N0Q29tcG9uZW50PiB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZml4dHVyZTogQ29tcG9uZW50Rml4dHVyZTxUZXN0RGF0YVRhYmxlSG9zdENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoZml4dHVyZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhVGFibGUoKTogRGF0YVRhYmxlRGVmaW5pdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlRGVmaW5pdGlvbih0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoRGF0YVRhYmxlQ29tcG9uZW50KSksIHRoaXMpO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHJpc2stZGF0YS10YWJsZSBbZGF0YV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyXT1cImZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdE9yZGVyaW5nXT1cImRlZmF1bHRPcmRlcmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0cmlwZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4gdGl0bGU9XCJUZXN0IENvbHVtbiAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0aW5nS2V5XT1cInZhbHVlR2V0dGVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yZWNvcmQ9XCJyb3dcIiByaXNrLWRhdGEtdGFibGUtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUxfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHJpc2stZGF0YS10YWJsZS1jZWxsIGxldC1yZWNvcmQ9XCJyb3dcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWRldGFpbC1leHBhbmRlciBbZXhwYW5kZWRdPVwiZXhwYW5kZWRcIj48L3Jpc2stZGF0YS10YWJsZS1kZXRhaWwtZXhwYW5kZXI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcmlzay1kYXRhLXRhYmxlLWZvb3Rlci1jZWxsIGxldC1mb290ZXI9XCJmb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3tmb290ZXIudmFsdWUxfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPCEtLSBTdWIgZGV0YWlsIC0tPlxuICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1kZXRhaWwtcm93PlxuICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbiB0aXRsZT1cIlRlc3QgRGV0YWlsIENvbHVtbiAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRpbmdLZXldPVwidmFsdWVHZXR0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUxfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uIHRpdGxlPVwiVGVzdCBEZXRhaWwgQ29sdW1uIDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4gdGl0bGU9XCJUZXN0IERldGFpbCBDb2x1bW4gM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHJpc2stZGF0YS10YWJsZS1jZWxsIGxldC1yZWNvcmQ9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JlY29yZC52YWx1ZTN9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbi1ncm91cD5cbiAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbi1ncm91cD48L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1kZXRhaWwtcm93PlxuICAgICAgICA8L3Jpc2stZGF0YS10YWJsZT5gXG59KVxuZXhwb3J0IGNsYXNzIFRlc3REYXRhVGFibGVIb3N0Q29tcG9uZW50IHtcblxuICAgIHB1YmxpYyBkYXRhOiBhbnlbXTtcblxuICAgIHB1YmxpYyBmb290ZXI6IGFueTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTAwOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTE6IE1hdGguZmxvb3Ioc2VjdXJlUmFuZG9tKCkgKiAyMCkgKyAnIC0gdmFsdWUgMScsXG4gICAgICAgICAgICAgICAgdmFsdWUyOiBNYXRoLmZsb29yKHNlY3VyZVJhbmRvbSgpICogMjApICsgJyAtIHZhbHVlIDInLFxuICAgICAgICAgICAgICAgIHZhbHVlMzogTWF0aC5mbG9vcihzZWN1cmVSYW5kb20oKSAqIDIwKSArICcgLSB2YWx1ZSAzJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0T3JkZXJpbmcoKTogQXJyYXk8T3JkZXJpbmdDcml0ZXJpYTxhbnk+IHwgVmFsdWVHZXR0ZXI8YW55Pj4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdldCAgICAgICA6IChyZWNvcmQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkLnZhbHVlMztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlc2NlbmRpbmc6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAocmVjb3JkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkLnZhbHVlMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlR2V0dGVyKCk6IChyZWNvcmQ6IGFueSkgPT4gYW55IHtcbiAgICAgICAgcmV0dXJuIChyZWNvcmQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29yZC52YWx1ZTE7XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19