@dangl/angular-ava 0.1.1-beta0093

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 (66) hide show
  1. package/README.md +1 -0
  2. package/esm2022/dangl-angular-ava.mjs +5 -0
  3. package/esm2022/lib/angular-ava.module.mjs +91 -0
  4. package/esm2022/lib/ava-tree/tree/components/ava-tree/ava-tree.component.mjs +412 -0
  5. package/esm2022/lib/ava-tree/tree/components/list-structure/list-structure.component.mjs +41 -0
  6. package/esm2022/lib/ava-tree/tree/components/table-structure/table-structure.component.mjs +110 -0
  7. package/esm2022/lib/ava-tree/tree/components/tree-item/tree-item.component.mjs +102 -0
  8. package/esm2022/lib/ava-tree/tree/components/tree-node/tree-node.component.mjs +53 -0
  9. package/esm2022/lib/ava-tree/tree/components/tree-structure/tree-structure.component.mjs +33 -0
  10. package/esm2022/lib/ava-tree/tree/constants/defaultFilters.mjs +23 -0
  11. package/esm2022/lib/ava-tree/tree/constants/defaultTextWords.mjs +11 -0
  12. package/esm2022/lib/ava-tree/tree/constants/defaults.mjs +4 -0
  13. package/esm2022/lib/ava-tree/tree/constants/index.mjs +5 -0
  14. package/esm2022/lib/ava-tree/tree/directives/save-changing-view.directive.mjs +47 -0
  15. package/esm2022/lib/ava-tree/tree/model/ava-models.mjs +199 -0
  16. package/esm2022/lib/ava-tree/tree/model/context-menu-data.model.mjs +2 -0
  17. package/esm2022/lib/ava-tree/tree/model/function-view-line.model.mjs +2 -0
  18. package/esm2022/lib/ava-tree/tree/model/index.mjs +4 -0
  19. package/esm2022/lib/ava-tree/tree/model/selecting.model.mjs +2 -0
  20. package/esm2022/lib/ava-tree/tree/model/tableColumnType.mjs +2 -0
  21. package/esm2022/lib/ava-tree/tree/model/tree-mode.model.mjs +7 -0
  22. package/esm2022/lib/ava-tree/tree/pipes/element-icon-name.pipe.mjs +27 -0
  23. package/esm2022/lib/ava-tree/tree/pipes/element-item-number.pipe.mjs +23 -0
  24. package/esm2022/lib/ava-tree/tree/pipes/element-text.pipe.mjs +27 -0
  25. package/esm2022/lib/ava-tree/tree/pipes/group-child-elements.pipe.mjs +20 -0
  26. package/esm2022/lib/ava-tree/tree/services/expand-parent-group.service.mjs +32 -0
  27. package/esm2022/lib/ava-tree/tree/services/flat-elements.service.mjs +96 -0
  28. package/esm2022/lib/ava-tree/tree/services/keyboard-operation.service.mjs +116 -0
  29. package/esm2022/lib/ava-tree/tree/services/select-element.service.mjs +41 -0
  30. package/esm2022/lib/ava-tree/tree/services/tree-node-selection.service.mjs +133 -0
  31. package/esm2022/lib/version.mjs +10 -0
  32. package/esm2022/public-api.mjs +8 -0
  33. package/fesm2022/dangl-angular-ava.mjs +1574 -0
  34. package/fesm2022/dangl-angular-ava.mjs.map +1 -0
  35. package/index.d.ts +5 -0
  36. package/lib/angular-ava.module.d.ts +27 -0
  37. package/lib/ava-tree/tree/components/ava-tree/ava-tree.component.d.ts +165 -0
  38. package/lib/ava-tree/tree/components/list-structure/list-structure.component.d.ts +18 -0
  39. package/lib/ava-tree/tree/components/table-structure/table-structure.component.d.ts +34 -0
  40. package/lib/ava-tree/tree/components/tree-item/tree-item.component.d.ts +35 -0
  41. package/lib/ava-tree/tree/components/tree-node/tree-node.component.d.ts +23 -0
  42. package/lib/ava-tree/tree/components/tree-structure/tree-structure.component.d.ts +14 -0
  43. package/lib/ava-tree/tree/constants/defaultFilters.d.ts +2 -0
  44. package/lib/ava-tree/tree/constants/defaultTextWords.d.ts +11 -0
  45. package/lib/ava-tree/tree/constants/defaults.d.ts +3 -0
  46. package/lib/ava-tree/tree/constants/index.d.ts +4 -0
  47. package/lib/ava-tree/tree/directives/save-changing-view.directive.d.ts +13 -0
  48. package/lib/ava-tree/tree/model/ava-models.d.ts +1041 -0
  49. package/lib/ava-tree/tree/model/context-menu-data.model.d.ts +8 -0
  50. package/lib/ava-tree/tree/model/function-view-line.model.d.ts +12 -0
  51. package/lib/ava-tree/tree/model/index.d.ts +7 -0
  52. package/lib/ava-tree/tree/model/selecting.model.d.ts +14 -0
  53. package/lib/ava-tree/tree/model/tableColumnType.d.ts +6 -0
  54. package/lib/ava-tree/tree/model/tree-mode.model.d.ts +5 -0
  55. package/lib/ava-tree/tree/pipes/element-icon-name.pipe.d.ts +8 -0
  56. package/lib/ava-tree/tree/pipes/element-item-number.pipe.d.ts +8 -0
  57. package/lib/ava-tree/tree/pipes/element-text.pipe.d.ts +8 -0
  58. package/lib/ava-tree/tree/pipes/group-child-elements.pipe.d.ts +8 -0
  59. package/lib/ava-tree/tree/services/expand-parent-group.service.d.ts +7 -0
  60. package/lib/ava-tree/tree/services/flat-elements.service.d.ts +28 -0
  61. package/lib/ava-tree/tree/services/keyboard-operation.service.d.ts +35 -0
  62. package/lib/ava-tree/tree/services/select-element.service.d.ts +31 -0
  63. package/lib/ava-tree/tree/services/tree-node-selection.service.d.ts +23 -0
  64. package/lib/version.d.ts +8 -0
  65. package/package.json +31 -0
  66. package/public-api.d.ts +4 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Dangl.AngularAva
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFuZ2wtYW5ndWxhci1hdmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF2YS9zcmMvZGFuZ2wtYW5ndWxhci1hdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,91 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatCheckboxModule } from '@angular/material/checkbox';
6
+ import { MatRippleModule } from '@angular/material/core';
7
+ import { MatFormFieldModule } from '@angular/material/form-field';
8
+ import { MatIconModule } from '@angular/material/icon';
9
+ import { MatInputModule } from '@angular/material/input';
10
+ import { MatTableModule } from '@angular/material/table';
11
+ import { MatTooltipModule } from '@angular/material/tooltip';
12
+ import { AvaTreeComponent } from './ava-tree/tree/components/ava-tree/ava-tree.component';
13
+ import { ListStructureComponent } from './ava-tree/tree/components/list-structure/list-structure.component';
14
+ import { TableStructureComponent } from './ava-tree/tree/components/table-structure/table-structure.component';
15
+ import { TreeItemComponent } from './ava-tree/tree/components/tree-item/tree-item.component';
16
+ import { TreeNodeComponent } from './ava-tree/tree/components/tree-node/tree-node.component';
17
+ import { TreeStructureComponent } from './ava-tree/tree/components/tree-structure/tree-structure.component';
18
+ import { SaveChangingViewDirective } from './ava-tree/tree/directives/save-changing-view.directive';
19
+ import { ElementIconNamePipe } from './ava-tree/tree/pipes/element-icon-name.pipe';
20
+ import { ElementItemNumberPipe } from './ava-tree/tree/pipes/element-item-number.pipe';
21
+ import { ElementTextPipe } from './ava-tree/tree/pipes/element-text.pipe';
22
+ import { GroupChildElementsPipe } from './ava-tree/tree/pipes/group-child-elements.pipe';
23
+ import * as i0 from "@angular/core";
24
+ export class AngularAvaModule {
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, declarations: [TreeStructureComponent,
27
+ TreeNodeComponent,
28
+ AvaTreeComponent,
29
+ TreeItemComponent,
30
+ ListStructureComponent,
31
+ TableStructureComponent,
32
+ ElementIconNamePipe,
33
+ ElementTextPipe,
34
+ GroupChildElementsPipe,
35
+ ElementItemNumberPipe,
36
+ SaveChangingViewDirective], imports: [CommonModule,
37
+ MatIconModule,
38
+ MatRippleModule,
39
+ MatInputModule,
40
+ MatFormFieldModule,
41
+ ReactiveFormsModule,
42
+ FormsModule,
43
+ MatButtonModule,
44
+ MatCheckboxModule,
45
+ MatTableModule,
46
+ MatTooltipModule], exports: [AvaTreeComponent] }); }
47
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, imports: [CommonModule,
48
+ MatIconModule,
49
+ MatRippleModule,
50
+ MatInputModule,
51
+ MatFormFieldModule,
52
+ ReactiveFormsModule,
53
+ FormsModule,
54
+ MatButtonModule,
55
+ MatCheckboxModule,
56
+ MatTableModule,
57
+ MatTooltipModule] }); }
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, decorators: [{
60
+ type: NgModule,
61
+ args: [{
62
+ declarations: [
63
+ TreeStructureComponent,
64
+ TreeNodeComponent,
65
+ AvaTreeComponent,
66
+ TreeItemComponent,
67
+ ListStructureComponent,
68
+ TableStructureComponent,
69
+ ElementIconNamePipe,
70
+ ElementTextPipe,
71
+ GroupChildElementsPipe,
72
+ ElementItemNumberPipe,
73
+ SaveChangingViewDirective
74
+ ],
75
+ imports: [
76
+ CommonModule,
77
+ MatIconModule,
78
+ MatRippleModule,
79
+ MatInputModule,
80
+ MatFormFieldModule,
81
+ ReactiveFormsModule,
82
+ FormsModule,
83
+ MatButtonModule,
84
+ MatCheckboxModule,
85
+ MatTableModule,
86
+ MatTooltipModule
87
+ ],
88
+ exports: [AvaTreeComponent]
89
+ }]
90
+ }] });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hdmEubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hbmd1bGFyLWF2YS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDL0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDcEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOztBQStCekYsTUFBTSxPQUFPLGdCQUFnQjs4R0FBaEIsZ0JBQWdCOytHQUFoQixnQkFBZ0IsaUJBM0J6QixzQkFBc0I7WUFDdEIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQixpQkFBaUI7WUFDakIsc0JBQXNCO1lBQ3RCLHVCQUF1QjtZQUN2QixtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixxQkFBcUI7WUFDckIseUJBQXlCLGFBR3pCLFlBQVk7WUFDWixhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0IsYUFFUixnQkFBZ0I7K0dBRWYsZ0JBQWdCLFlBZHpCLFlBQVk7WUFDWixhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0I7OzJGQUlQLGdCQUFnQjtrQkE3QjVCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLHNCQUFzQjt3QkFDdEIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsc0JBQXNCO3dCQUN0Qix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLHFCQUFxQjt3QkFDckIseUJBQXlCO3FCQUMxQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRSaXBwbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgQXZhVHJlZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL2F2YS10cmVlL2F2YS10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaXN0U3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvbGlzdC1zdHJ1Y3R1cmUvbGlzdC1zdHJ1Y3R1cmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlU3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvdGFibGUtc3RydWN0dXJlL3RhYmxlLXN0cnVjdHVyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJlZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLWl0ZW0vdHJlZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRyZWVTdHJ1Y3R1cmVDb21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLXN0cnVjdHVyZS90cmVlLXN0cnVjdHVyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2F2ZUNoYW5naW5nVmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9kaXJlY3RpdmVzL3NhdmUtY2hhbmdpbmctdmlldy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRWxlbWVudEljb25OYW1lUGlwZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9waXBlcy9lbGVtZW50LWljb24tbmFtZS5waXBlJztcbmltcG9ydCB7IEVsZW1lbnRJdGVtTnVtYmVyUGlwZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9waXBlcy9lbGVtZW50LWl0ZW0tbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgRWxlbWVudFRleHRQaXBlIH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL3BpcGVzL2VsZW1lbnQtdGV4dC5waXBlJztcbmltcG9ydCB7IEdyb3VwQ2hpbGRFbGVtZW50c1BpcGUgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvcGlwZXMvZ3JvdXAtY2hpbGQtZWxlbWVudHMucGlwZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFRyZWVTdHJ1Y3R1cmVDb21wb25lbnQsXG4gICAgVHJlZU5vZGVDb21wb25lbnQsXG4gICAgQXZhVHJlZUNvbXBvbmVudCxcbiAgICBUcmVlSXRlbUNvbXBvbmVudCxcbiAgICBMaXN0U3RydWN0dXJlQ29tcG9uZW50LFxuICAgIFRhYmxlU3RydWN0dXJlQ29tcG9uZW50LFxuICAgIEVsZW1lbnRJY29uTmFtZVBpcGUsXG4gICAgRWxlbWVudFRleHRQaXBlLFxuICAgIEdyb3VwQ2hpbGRFbGVtZW50c1BpcGUsXG4gICAgRWxlbWVudEl0ZW1OdW1iZXJQaXBlLFxuICAgIFNhdmVDaGFuZ2luZ1ZpZXdEaXJlY3RpdmVcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFJpcHBsZU1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbQXZhVHJlZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckF2YU1vZHVsZSB7fVxuIl19
@@ -0,0 +1,412 @@
1
+ import { Component, EventEmitter, Input, Output, Self, ViewChild } from '@angular/core';
2
+ import { ReplaySubject, Subject, debounceTime, filter, fromEvent, takeUntil } from 'rxjs';
3
+ import { DEFAULT_FILTERS, DEFAULT_TEXT_WORDS } from '../../constants';
4
+ import { ModeViewType } from '../../model';
5
+ import { ExpandParentGroupService } from '../../services/expand-parent-group.service';
6
+ import { FlatElementsService } from '../../services/flat-elements.service';
7
+ import { KeyboardOperationService, KeyboardOperationType } from '../../services/keyboard-operation.service';
8
+ import { SelectElementService } from '../../services/select-element.service';
9
+ import { TreeNodeSelectionService } from '../../services/tree-node-selection.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../services/flat-elements.service";
12
+ import * as i2 from "../../services/select-element.service";
13
+ import * as i3 from "../../services/tree-node-selection.service";
14
+ import * as i4 from "../../services/expand-parent-group.service";
15
+ import * as i5 from "../../services/keyboard-operation.service";
16
+ import * as i6 from "@angular/common";
17
+ import * as i7 from "@angular/material/icon";
18
+ import * as i8 from "@angular/material/input";
19
+ import * as i9 from "@angular/material/form-field";
20
+ import * as i10 from "@angular/forms";
21
+ import * as i11 from "@angular/material/button";
22
+ import * as i12 from "@angular/material/tooltip";
23
+ import * as i13 from "../tree-structure/tree-structure.component";
24
+ import * as i14 from "../list-structure/list-structure.component";
25
+ import * as i15 from "../table-structure/table-structure.component";
26
+ export class AvaTreeComponent {
27
+ /**
28
+ * You can supply a map of strings to be used for the text in the tree. This allows you to translate
29
+ * the text in the tree to other languages.
30
+ * {
31
+ * textSearch: string,
32
+ * textNothing: string,
33
+ * textNothingFiltered: string,
34
+ * textAll: string,
35
+ * tooltipAllOpen: string,
36
+ * tooltipAllClose: string,
37
+ * tooltipAllAdd:string,
38
+ * tooltipAllRemove: string,
39
+ * }
40
+ */
41
+ set textWords(words) {
42
+ this._textWords = { ...this.textWords, ...words };
43
+ } // allow to translate all texts to other language
44
+ get textWords() {
45
+ return this._textWords;
46
+ }
47
+ /**
48
+ * With this parameter, you can configure which keys will be listenend to to switch the tree elements,
49
+ * and also to disable the functionality of the keys */
50
+ set customKeyboardOperationConfig(config) {
51
+ this.keyboardOperationService.mergeConfigOperation(config);
52
+ }
53
+ constructor(flatElementsService, selectElementService, treeNodeSelectionService, expandParentGroupService, keyboardOperationService, ngZone) {
54
+ this.flatElementsService = flatElementsService;
55
+ this.selectElementService = selectElementService;
56
+ this.treeNodeSelectionService = treeNodeSelectionService;
57
+ this.expandParentGroupService = expandParentGroupService;
58
+ this.keyboardOperationService = keyboardOperationService;
59
+ this.ngZone = ngZone;
60
+ /**
61
+ * This is the main data element for the tree structure. You should supply a ProjectDto with
62
+ * exactly one service specification in it.
63
+ */
64
+ this.project = null;
65
+ /**
66
+ * Optionally, you can supply a map of expansion states for the tree. The keys should be the
67
+ * id properties of the elements in the tree, and the values should be true if the element is
68
+ * expanded, and false if it is collapsed.
69
+ */
70
+ this.expansionState = {};
71
+ /**
72
+ * Optionally, you can supply the id of the node that should be selected in the tree initially.
73
+ */
74
+ this.selectedNodeId = null;
75
+ /**
76
+ * Optional, defaults to 20px. If this is set, then the tree will be indented by the given value each level.
77
+ * This can be any valid CSS value for the padding-left property, such as 20px, 1em, or 5%.
78
+ *
79
+ */
80
+ this.indent = '20px';
81
+ /**
82
+ * Optional, you can supply a color to be used as the background color for the selected line. Defaults to the primary
83
+ * color from the Material theme, which is #00acc1.
84
+ */
85
+ this.selectedColor = null;
86
+ /**
87
+ * You can specify which view type to use for the tree. The default is ModeViewType.Tree, but you can also use
88
+ * ModeViewType.List or ModeViewType.Table.
89
+ */
90
+ this.modeView = ModeViewType.Tree;
91
+ /** Optional, defaults to true. If this is disabled, then the double click event for elements is not raised,
92
+ * and clicking on an elemt sends an immediate result since the component has not to wait and check if a double click event
93
+ * is fired.
94
+ */
95
+ this.allowDblClick = true;
96
+ /**
97
+ * If this is set to true, then the tree will be in selection mode, and the user can select elements
98
+ * by clicking on them. The selected elements will be emitted in the selectedElementsChanged event.
99
+ */
100
+ this.isSelectionMode = false;
101
+ /**
102
+ * You can optionally supply a list of elements that should be selected initially. This is only used if
103
+ * isSelectionMode is true.
104
+ */
105
+ this.initiallySelectedElements = null;
106
+ this._textWords = null;
107
+ /**
108
+ * Defaults to true. If this is enabled, then navigating in the tree with the keyboard only works
109
+ * if the mouse is over the tree area. This limitation is useful if you have multiple trees or other components
110
+ * that might be using keyboard input.
111
+ */
112
+ this.mouseAwareKeyboardControl = true;
113
+ /**
114
+ * You can supply custom filters that are processed when the filter input is changed. Default filters are used
115
+ * that check for short text and item number matches, and you can either add custom filters or replace the default ones.
116
+ */
117
+ this.listFilterFunc = DEFAULT_FILTERS;
118
+ /**
119
+ * Optional. For table views, this allows you to add custom columns to the table.
120
+ * addTableColumns: Array of objects
121
+ * {
122
+ * name: string, // name of column
123
+ * title: string, // showed title of column
124
+ * align?: string, // optional alight: left(default) / center / right
125
+ * numberFormat?: string // optional format of number value, example: '1.2-2'
126
+ * }
127
+ */
128
+ this.addTableColumns = [];
129
+ /**
130
+ * This allows you to supply a list of functions that can be used to change the appearance of elements.
131
+ * They objects contain a predicate function that is evaluated, along with an option to configure the
132
+ * appearance of the element.
133
+ * functionView: Array of objects
134
+ * {
135
+ * name: string, // name of view part: you can add/remove it when it need
136
+ * func: (element: any, result?: any) => boolean, // this filter function calculate condition to change view
137
+ * view: {
138
+ * iconName?: string, // changed name of icon
139
+ * iconColor?: string, // changed color of icon
140
+ * textBold?: string, // changed weight of text
141
+ * textColor?: string // changed color of text
142
+ * }
143
+ * }
144
+ */
145
+ this.functionView = null;
146
+ this.selectClick = new EventEmitter(); // event after element selected by click
147
+ this.selectDblClick = new EventEmitter(); // event after element selected by double click
148
+ this.contextMenuEvent = new EventEmitter(); // event after element call context menu by right button click
149
+ this.selectedElementsChanged = new EventEmitter(); // event after changed selecting in selecting mode
150
+ this.selectedElement = null;
151
+ this.isListenKeyboard = false;
152
+ this.isEmiteSelectedElements = false;
153
+ this.selectingElementsTreeData = [];
154
+ this.flatElements = null;
155
+ this.preselectedElement = null;
156
+ this.filterInput = '';
157
+ this.listModeViewType = ModeViewType;
158
+ this.filter = '';
159
+ this.$filter = new ReplaySubject(1);
160
+ this.filteredElementList = [];
161
+ this.$destroy = new Subject();
162
+ this._textWords = { ...DEFAULT_TEXT_WORDS };
163
+ }
164
+ ngOnInit() {
165
+ this.selectElementService.preselectedElement.pipe(takeUntil(this.$destroy)).subscribe((e) => (this.preselectedElement = e));
166
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => {
167
+ this.selectedElement = e;
168
+ this.selectClick.emit(e);
169
+ });
170
+ this.selectElementService.selectDblClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.selectDblClick.emit(e));
171
+ this.selectElementService.selectContextMenuElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.contextMenuEvent.emit(e));
172
+ this.flatElementsService.flatElementsDto.pipe(takeUntil(this.$destroy)).subscribe((e) => {
173
+ this.flatElements = e;
174
+ this.getFilteredList();
175
+ });
176
+ this.$filter.pipe(takeUntil(this.$destroy), debounceTime(250)).subscribe((filter) => {
177
+ this.filter = filter;
178
+ this.getFilteredList();
179
+ });
180
+ }
181
+ ngAfterViewInit() {
182
+ this.initializeEventListeners();
183
+ }
184
+ ngOnChanges(changes) {
185
+ this.flatElementsService.listFilterFunc = this.listFilterFunc;
186
+ this.flatElementsService.functionView = this.functionView;
187
+ if (changes['project'] && this.project?.serviceSpecifications?.[0]) {
188
+ this.serviceSpecification = this.project.serviceSpecifications[0];
189
+ this.flatElementsService.setElementsDto(this.serviceSpecification);
190
+ if (this.isSelectionMode) {
191
+ this.selectingElementsTreeData = this.treeNodeSelectionService.loadSelectingElements(this.serviceSpecification.elements);
192
+ this.treeNodeSelectionService.treeNodeSelecting.pipe(takeUntil(this.$destroy)).subscribe(() => {
193
+ if (this.isEmiteSelectedElements) {
194
+ setTimeout(() => {
195
+ const selectingTree = this.treeNodeSelectionService.getTreeRoot(this.selectingElementsTreeData);
196
+ this.selectedElementsChanged.emit(selectingTree);
197
+ }, 0);
198
+ }
199
+ });
200
+ }
201
+ }
202
+ if ((changes['selectedNodeId'] && this.project) || changes['project']) {
203
+ this.flatElementsService.getOneElementById(this.selectedNodeId).subscribe((e) => {
204
+ if (e) {
205
+ this.selectElementService.setClickElement(e);
206
+ }
207
+ });
208
+ }
209
+ if (this.isSelectionMode && (changes['initiallySelectedElements'] || changes['project'])) {
210
+ this.formSelectingList();
211
+ }
212
+ }
213
+ ngOnDestroy() {
214
+ this.$destroy.next(true);
215
+ this.$destroy.complete();
216
+ }
217
+ mouseOver() {
218
+ if (!this.isListenKeyboard) {
219
+ this.isListenKeyboard = true;
220
+ this.avaTreeFilterInput?.nativeElement.focus();
221
+ }
222
+ }
223
+ mouseOut() {
224
+ this.isListenKeyboard = false;
225
+ }
226
+ handleGlobalKeyboardEvent(event) {
227
+ this.ngZone.run(() => {
228
+ const keyEvent = event;
229
+ if (!this.mouseAwareKeyboardControl || this.isListenKeyboard) {
230
+ const element = this.preselectedElement || this.selectedElement;
231
+ const { operation, nextElement } = this.keyboardOperationService.handleKeyboardEvent(keyEvent, element) || { nextElement: null };
232
+ switch (operation) {
233
+ case KeyboardOperationType.MoveSelectedPositionUp:
234
+ this.showElement(nextElement, '.select');
235
+ break;
236
+ case KeyboardOperationType.MoveSelectedPositionDown:
237
+ this.showElement(nextElement, '.select');
238
+ break;
239
+ case KeyboardOperationType.MoveChosenPositionDown:
240
+ this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
241
+ break;
242
+ case KeyboardOperationType.MoveChosenPositionUp:
243
+ this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
244
+ break;
245
+ default:
246
+ break;
247
+ }
248
+ }
249
+ });
250
+ }
251
+ showElement(element, nameQuery) {
252
+ if (element) {
253
+ if (this.modeView === ModeViewType.Tree) {
254
+ this.expandParentGroups(element);
255
+ }
256
+ setTimeout(() => this.scrollLine(nameQuery), 0);
257
+ }
258
+ }
259
+ scrollLine(nameQuery) {
260
+ const parentRect = this.avaTreeWrapper?.nativeElement.getBoundingClientRect();
261
+ const showedElement = this.avaTreeWrapper?.nativeElement.querySelector(nameQuery);
262
+ if (!showedElement) {
263
+ return;
264
+ }
265
+ const childRect = showedElement.getBoundingClientRect();
266
+ if (childRect.bottom > parentRect.bottom ||
267
+ childRect.top < parentRect.top ||
268
+ (this.modeView === ModeViewType.Table && childRect.top < parentRect.top + 24)) {
269
+ showedElement?.scrollIntoView();
270
+ this.avaTreeWrapper?.nativeElement.scrollTo({ left: 0 });
271
+ if (this.modeView === ModeViewType.Table) {
272
+ setTimeout(() => this.correctScrollTableLine(showedElement, parentRect), 0);
273
+ }
274
+ }
275
+ }
276
+ correctScrollTableLine(showedElement, parentRect) {
277
+ const childRect = showedElement.getBoundingClientRect();
278
+ if (childRect.top < parentRect.top + 24) {
279
+ this.avaTreeWrapper.nativeElement.scrollTop -= 24;
280
+ }
281
+ }
282
+ expandParentGroups(element) {
283
+ this.expandParentGroupService.expandParentGroups(element, this.flatElements, this.expansionState);
284
+ }
285
+ onFilter(value) {
286
+ this.$filter.next(value);
287
+ }
288
+ changeAllElementsExpansionStatus(isExpanded) {
289
+ if (!isExpanded) {
290
+ Object.keys(this.expansionState).forEach((id) => delete this.expansionState[id]);
291
+ }
292
+ else {
293
+ this.flatElements?.forEach((item) => {
294
+ if (item.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
295
+ this.expansionState[item.id] = true;
296
+ }
297
+ });
298
+ }
299
+ }
300
+ formSelectingList() {
301
+ this.isEmiteSelectedElements = false;
302
+ if (!this.initiallySelectedElements) {
303
+ this.isEmiteSelectedElements = true;
304
+ return;
305
+ }
306
+ this.treeNodeSelectionService.getFlatSelectedListId(this.initiallySelectedElements);
307
+ this.treeNodeSelectionService.flatSelectedListId.forEach((id, index) => {
308
+ this.treeNodeSelectionService.changeSelecting(true, id);
309
+ if (index === this.treeNodeSelectionService.flatSelectedListId.length - 1) {
310
+ this.isEmiteSelectedElements = true;
311
+ }
312
+ });
313
+ }
314
+ selectOrDeselectAll(value) {
315
+ this.treeNodeSelectionService.changeAll(value);
316
+ }
317
+ getFilteredList() {
318
+ if (this.flatElements?.length) {
319
+ if (!this.filter) {
320
+ this.filteredElementList = this.flatElements;
321
+ }
322
+ else {
323
+ this.filteredElementList = this.flatElements.filter((item) => this.flatElementsService.checkFilterValue(item, this.filter));
324
+ }
325
+ }
326
+ }
327
+ initializeEventListeners() {
328
+ this.ngZone.runOutsideAngular(() => {
329
+ fromEvent(this.avaMainWrapper.nativeElement, 'mouseleave')
330
+ .pipe(takeUntil(this.$destroy))
331
+ .subscribe(() => {
332
+ this.mouseOut();
333
+ });
334
+ fromEvent(this.avaMainWrapper.nativeElement, 'mouseenter')
335
+ .pipe(takeUntil(this.$destroy))
336
+ .subscribe(() => {
337
+ this.mouseOver();
338
+ });
339
+ if (!this.isSelectionMode) {
340
+ fromEvent(document, 'keydown')
341
+ .pipe(takeUntil(this.$destroy), filter(() => !this.mouseAwareKeyboardControl || this.isListenKeyboard))
342
+ .subscribe((event) => {
343
+ this.handleGlobalKeyboardEvent(event);
344
+ });
345
+ }
346
+ });
347
+ }
348
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AvaTreeComponent, deps: [{ token: i1.FlatElementsService, self: true }, { token: i2.SelectElementService, self: true }, { token: i3.TreeNodeSelectionService, self: true }, { token: i4.ExpandParentGroupService, self: true }, { token: i5.KeyboardOperationService, self: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
349
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: AvaTreeComponent, selector: "ava-tree", inputs: { project: "project", expansionState: "expansionState", selectedNodeId: "selectedNodeId", indent: "indent", selectedColor: "selectedColor", modeView: "modeView", allowDblClick: "allowDblClick", isSelectionMode: "isSelectionMode", initiallySelectedElements: "initiallySelectedElements", textWords: "textWords", mouseAwareKeyboardControl: "mouseAwareKeyboardControl", customKeyboardOperationConfig: "customKeyboardOperationConfig", listFilterFunc: "listFilterFunc", addTableColumns: "addTableColumns", functionView: "functionView" }, outputs: { selectClick: "selectClick", selectDblClick: "selectDblClick", contextMenuEvent: "contextMenuEvent", selectedElementsChanged: "selectedElementsChanged" }, providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], viewQueries: [{ propertyName: "avaTreeWrapper", first: true, predicate: ["avaTreeWrapper"], descendants: true }, { propertyName: "avaMainWrapper", first: true, predicate: ["avaMainWrapper"], descendants: true }, { propertyName: "avaTreeFilterInput", first: true, predicate: ["avaTreeFilterInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"main-wrapper\"\n #avaMainWrapper\n>\n <div\n class=\"control\"\n #control\n >\n <mat-form-field class=\"control-filter\">\n <mat-label>{{ textWords?.textSearch }}</mat-label>\n <input\n matInput\n [ngModel]=\"filterInput\"\n (ngModelChange)=\"onFilter($event)\"\n #avaTreeFilterInput\n />\n </mat-form-field>\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(true)\"\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">add</mat-icon>\n </button>\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(false)\"\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">remove</mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"isSelectionMode\">\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(true)\"\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\n class=\"control-button\"\n >\n <mat-icon>add</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(false)\"\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\n class=\"control-button\"\n >\n <mat-icon>remove</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n </ng-container>\n </div>\n <div\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\n class=\"ava-tree-wrapper\"\n #avaTreeWrapper\n >\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\n <ava-tree-structure\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\n [serviceSpecification]=\"serviceSpecification\"\n [indent]=\"indent\"\n [expansionState]=\"expansionState\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-tree-structure>\n <ava-list-structure\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-list-structure>\n <ava-table-structure\n *ngIf=\"modeView === listModeViewType.Table\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [addTableColumns]=\"addTableColumns\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-table-structure>\n </ng-container>\n </ng-container>\n </div>\n</div>\n<ng-template #nothing>\n {{ textWords?.textNothing }}\n</ng-template>\n<ng-template #nothingFiltered>\n {{ textWords?.textNothingFiltered }}\n</ng-template>\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i13.TreeStructureComponent, selector: "ava-tree-structure", inputs: ["serviceSpecification", "indent", "expansionState", "isSelectionMode", "selectedColor", "allowDblClick"] }, { kind: "component", type: i14.ListStructureComponent, selector: "ava-list-structure", inputs: ["filteredElementList", "isSelectionMode", "selectedColor", "allowDblClick"] }, { kind: "component", type: i15.TableStructureComponent, selector: "ava-table-structure", inputs: ["filteredElementList", "isSelectionMode", "addTableColumns", "selectedColor", "allowDblClick"] }] }); }
350
+ }
351
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AvaTreeComponent, decorators: [{
352
+ type: Component,
353
+ args: [{ selector: 'ava-tree', providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], template: "<div\n class=\"main-wrapper\"\n #avaMainWrapper\n>\n <div\n class=\"control\"\n #control\n >\n <mat-form-field class=\"control-filter\">\n <mat-label>{{ textWords?.textSearch }}</mat-label>\n <input\n matInput\n [ngModel]=\"filterInput\"\n (ngModelChange)=\"onFilter($event)\"\n #avaTreeFilterInput\n />\n </mat-form-field>\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(true)\"\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">add</mat-icon>\n </button>\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(false)\"\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">remove</mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"isSelectionMode\">\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(true)\"\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\n class=\"control-button\"\n >\n <mat-icon>add</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(false)\"\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\n class=\"control-button\"\n >\n <mat-icon>remove</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n </ng-container>\n </div>\n <div\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\n class=\"ava-tree-wrapper\"\n #avaTreeWrapper\n >\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\n <ava-tree-structure\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\n [serviceSpecification]=\"serviceSpecification\"\n [indent]=\"indent\"\n [expansionState]=\"expansionState\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-tree-structure>\n <ava-list-structure\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-list-structure>\n <ava-table-structure\n *ngIf=\"modeView === listModeViewType.Table\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [addTableColumns]=\"addTableColumns\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-table-structure>\n </ng-container>\n </ng-container>\n </div>\n</div>\n<ng-template #nothing>\n {{ textWords?.textNothing }}\n</ng-template>\n<ng-template #nothingFiltered>\n {{ textWords?.textNothingFiltered }}\n</ng-template>\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"] }]
354
+ }], ctorParameters: () => [{ type: i1.FlatElementsService, decorators: [{
355
+ type: Self
356
+ }] }, { type: i2.SelectElementService, decorators: [{
357
+ type: Self
358
+ }] }, { type: i3.TreeNodeSelectionService, decorators: [{
359
+ type: Self
360
+ }] }, { type: i4.ExpandParentGroupService, decorators: [{
361
+ type: Self
362
+ }] }, { type: i5.KeyboardOperationService, decorators: [{
363
+ type: Self
364
+ }] }, { type: i0.NgZone }], propDecorators: { project: [{
365
+ type: Input
366
+ }], expansionState: [{
367
+ type: Input
368
+ }], selectedNodeId: [{
369
+ type: Input
370
+ }], indent: [{
371
+ type: Input
372
+ }], selectedColor: [{
373
+ type: Input
374
+ }], modeView: [{
375
+ type: Input
376
+ }], allowDblClick: [{
377
+ type: Input
378
+ }], isSelectionMode: [{
379
+ type: Input
380
+ }], initiallySelectedElements: [{
381
+ type: Input
382
+ }], textWords: [{
383
+ type: Input
384
+ }], mouseAwareKeyboardControl: [{
385
+ type: Input
386
+ }], customKeyboardOperationConfig: [{
387
+ type: Input
388
+ }], listFilterFunc: [{
389
+ type: Input
390
+ }], addTableColumns: [{
391
+ type: Input
392
+ }], functionView: [{
393
+ type: Input
394
+ }], selectClick: [{
395
+ type: Output
396
+ }], selectDblClick: [{
397
+ type: Output
398
+ }], contextMenuEvent: [{
399
+ type: Output
400
+ }], selectedElementsChanged: [{
401
+ type: Output
402
+ }], avaTreeWrapper: [{
403
+ type: ViewChild,
404
+ args: ['avaTreeWrapper']
405
+ }], avaMainWrapper: [{
406
+ type: ViewChild,
407
+ args: ['avaMainWrapper']
408
+ }], avaTreeFilterInput: [{
409
+ type: ViewChild,
410
+ args: ['avaTreeFilterInput']
411
+ }] } });
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhLXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvYXZhLXRyZWUvYXZhLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvYXZhLXRyZWUvYXZhLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUtMLE1BQU0sRUFDTixJQUFJLEVBRUosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRixPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEUsT0FBTyxFQUlMLFlBQVksRUFLYixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQTRCLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRGLE1BQU0sT0FBTyxnQkFBZ0I7SUF3RDNCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxJQUFhLFNBQVMsQ0FBQyxLQUF3QjtRQUM3QyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDLGlEQUFpRDtJQUNuRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQVVEOzsyREFFdUQ7SUFDdkQsSUFBYSw2QkFBNkIsQ0FBQyxNQUFnQztRQUN6RSxJQUFJLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQTJERCxZQUNrQixtQkFBd0MsRUFDeEMsb0JBQTBDLEVBQzFDLHdCQUFrRCxFQUNsRCx3QkFBa0QsRUFDbEQsd0JBQWtELEVBQzFELE1BQWM7UUFMTix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDMUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTFKeEI7OztXQUdHO1FBQ00sWUFBTyxHQUFzQixJQUFJLENBQUM7UUFFM0M7Ozs7V0FJRztRQUNNLG1CQUFjLEdBQThCLEVBQUUsQ0FBQztRQUV4RDs7V0FFRztRQUNNLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUU5Qzs7OztXQUlHO1FBQ00sV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUV6Qjs7O1dBR0c7UUFDTSxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFN0M7OztXQUdHO1FBQ00sYUFBUSxHQUFpQixZQUFZLENBQUMsSUFBSSxDQUFDO1FBRXBEOzs7V0FHRztRQUNNLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTlCOzs7V0FHRztRQUNNLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRWpDOzs7V0FHRztRQUNNLDhCQUF5QixHQUE2QixJQUFJLENBQUM7UUFzQjVELGVBQVUsR0FBc0IsSUFBSSxDQUFDO1FBRTdDOzs7O1dBSUc7UUFDTSw4QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFTMUM7OztXQUdHO1FBQ00sbUJBQWMsR0FBRyxlQUFlLENBQUM7UUFFMUM7Ozs7Ozs7OztXQVNHO1FBQ00sb0JBQWUsR0FBc0IsRUFBRSxDQUFDO1FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7V0FlRztRQUNNLGlCQUFZLEdBQStCLElBQUksQ0FBQztRQUUvQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDLENBQUMsd0NBQXdDO1FBQzlGLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQyxDQUFDLCtDQUErQztRQUNqRyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQyxDQUFDLDhEQUE4RDtRQUMxSCw0QkFBdUIsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQyxDQUFDLGtEQUFrRDtRQUk3SCxvQkFBZSxHQUF1QixJQUFJLENBQUM7UUFFM0MscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNoQyw4QkFBeUIsR0FBNEIsRUFBRSxDQUFDO1FBQ2hFLGlCQUFZLEdBQXlCLElBQUksQ0FBQztRQUMxQyx1QkFBa0IsR0FBdUIsSUFBSSxDQUFDO1FBQzlDLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLFlBQVksQ0FBQztRQUN4QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osWUFBTyxHQUFHLElBQUksYUFBYSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9DLHdCQUFtQixHQUFrQixFQUFFLENBQUM7UUFDaEMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFVeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1SCxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMxRixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3SCxJQUFJLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdEYsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzlELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUUxRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBRW5FLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDNUYsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzt3QkFDakMsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDZCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDOzRCQUNoRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNuRCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ1IsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUM5RSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNOLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRU8sUUFBUTtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEtBQVk7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLE1BQU0sUUFBUSxHQUFHLEtBQXNCLENBQUM7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBRWhFLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDakksUUFBUSxTQUFTLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxxQkFBcUIsQ0FBQyxzQkFBc0I7d0JBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUN6QyxNQUFNO29CQUNSLEtBQUsscUJBQXFCLENBQUMsd0JBQXdCO3dCQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDekMsTUFBTTtvQkFDUixLQUFLLHFCQUFxQixDQUFDLHNCQUFzQjt3QkFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDcEcsTUFBTTtvQkFDUixLQUFLLHFCQUFxQixDQUFDLG9CQUFvQjt3QkFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDcEcsTUFBTTtvQkFDUjt3QkFDRSxNQUFNO2dCQUNWLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sV0FBVyxDQUFDLE9BQTJCLEVBQUUsU0FBaUI7UUFDaEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsU0FBaUI7UUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM5RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFnQixDQUFDO1FBRWpHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3hELElBQ0UsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTTtZQUNwQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHO1lBQzlCLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFDN0UsQ0FBQztZQUNELGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxhQUEwQixFQUFFLFVBQW1CO1FBQzVFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3hELElBQUksU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUFvQjtRQUNyQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0NBQWdDLENBQUMsVUFBbUI7UUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNsQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO29CQUNyRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFjO1FBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDOUgsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUM7aUJBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUVMLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUM7aUJBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztZQUVMLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzFCLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO3FCQUMzQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN2RTtxQkFDQSxTQUFTLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBclhVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLG91QkFGaEIsQ0FBQyxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQywrV0N6Q3RJLDArR0F3R0E7OzJGRDdEYSxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0UsVUFBVSxhQUdULENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLENBQUM7OzBCQXdKakksSUFBSTs7MEJBQ0osSUFBSTs7MEJBQ0osSUFBSTs7MEJBQ0osSUFBSTs7MEJBQ0osSUFBSTs4REFySkUsT0FBTztzQkFBZixLQUFLO2dCQU9HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSztnQkFPRyxNQUFNO3NCQUFkLEtBQUs7Z0JBTUcsYUFBYTtzQkFBckIsS0FBSztnQkFNRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBTUcsZUFBZTtzQkFBdkIsS0FBSztnQkFNRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBZ0JPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBYUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUtPLDZCQUE2QjtzQkFBekMsS0FBSztnQkFRRyxjQUFjO3NCQUF0QixLQUFLO2dCQVlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBa0JHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ3NCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNFLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNNLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0ZJTFRFUlMsIERFRkFVTFRfVEVYVF9XT1JEUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJVGV4dFdvcmRzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHRUZXh0V29yZHMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVEYXRhVHlwZSxcbiAgSUVsZW1lbnREdG8sXG4gIElGdW5jdGlvblZpZXdMaW5lLFxuICBNb2RlVmlld1R5cGUsXG4gIFByb2plY3REdG8sXG4gIFNlbGVjdGVkRWxlbWVudCxcbiAgU2VydmljZVNwZWNpZmljYXRpb25EdG8sXG4gIFRhYmxlQ29sdW1uVHlwZVxufSBmcm9tICcuLi8uLi9tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3RpbmdFbGVtZW50c1R5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RpbmcubW9kZWwnO1xuaW1wb3J0IHsgRXhwYW5kUGFyZW50R3JvdXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhwYW5kLXBhcmVudC1ncm91cC5zZXJ2aWNlJztcbmltcG9ydCB7IEZsYXRFbGVtZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbGF0LWVsZW1lbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUtleWJvYXJkT3BlcmF0aW9uQ29uZmlnLCBLZXlib2FyZE9wZXJhdGlvblNlcnZpY2UsIEtleWJvYXJkT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2tleWJvYXJkLW9wZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0LWVsZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlTm9kZVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmVlLW5vZGUtc2VsZWN0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdmEtdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdmEtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F2YS10cmVlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0ZsYXRFbGVtZW50c1NlcnZpY2UsIFNlbGVjdEVsZW1lbnRTZXJ2aWNlLCBUcmVlTm9kZVNlbGVjdGlvblNlcnZpY2UsIEV4cGFuZFBhcmVudEdyb3VwU2VydmljZSwgS2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBBdmFUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBtYWluIGRhdGEgZWxlbWVudCBmb3IgdGhlIHRyZWUgc3RydWN0dXJlLiBZb3Ugc2hvdWxkIHN1cHBseSBhIFByb2plY3REdG8gd2l0aFxuICAgKiBleGFjdGx5IG9uZSBzZXJ2aWNlIHNwZWNpZmljYXRpb24gaW4gaXQuXG4gICAqL1xuICBASW5wdXQoKSBwcm9qZWN0OiBQcm9qZWN0RHRvIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gc3VwcGx5IGEgbWFwIG9mIGV4cGFuc2lvbiBzdGF0ZXMgZm9yIHRoZSB0cmVlLiBUaGUga2V5cyBzaG91bGQgYmUgdGhlXG4gICAqIGlkIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB0cmVlLCBhbmQgdGhlIHZhbHVlcyBzaG91bGQgYmUgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpc1xuICAgKiBleHBhbmRlZCwgYW5kIGZhbHNlIGlmIGl0IGlzIGNvbGxhcHNlZC5cbiAgICovXG4gIEBJbnB1dCgpIGV4cGFuc2lvblN0YXRlOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gc3VwcGx5IHRoZSBpZCBvZiB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBpbiB0aGUgdHJlZSBpbml0aWFsbHkuXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZE5vZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLCBkZWZhdWx0cyB0byAyMHB4LiBJZiB0aGlzIGlzIHNldCwgdGhlbiB0aGUgdHJlZSB3aWxsIGJlIGluZGVudGVkIGJ5IHRoZSBnaXZlbiB2YWx1ZSBlYWNoIGxldmVsLlxuICAgKiBUaGlzIGNhbiBiZSBhbnkgdmFsaWQgQ1NTIHZhbHVlIGZvciB0aGUgcGFkZGluZy1sZWZ0IHByb3BlcnR5LCBzdWNoIGFzIDIwcHgsIDFlbSwgb3IgNSUuXG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBpbmRlbnQgPSAnMjBweCc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLCB5b3UgY2FuIHN1cHBseSBhIGNvbG9yIHRvIGJlIHVzZWQgYXMgdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBzZWxlY3RlZCBsaW5lLiBEZWZhdWx0cyB0byB0aGUgcHJpbWFyeVxuICAgKiBjb2xvciBmcm9tIHRoZSBNYXRlcmlhbCB0aGVtZSwgd2hpY2ggaXMgIzAwYWNjMS5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggdmlldyB0eXBlIHRvIHVzZSBmb3IgdGhlIHRyZWUuIFRoZSBkZWZhdWx0IGlzIE1vZGVWaWV3VHlwZS5UcmVlLCBidXQgeW91IGNhbiBhbHNvIHVzZVxuICAgKiBNb2RlVmlld1R5cGUuTGlzdCBvciBNb2RlVmlld1R5cGUuVGFibGUuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlVmlldzogTW9kZVZpZXdUeXBlID0gTW9kZVZpZXdUeXBlLlRyZWU7XG5cbiAgLyoqIE9wdGlvbmFsLCBkZWZhdWx0cyB0byB0cnVlLiBJZiB0aGlzIGlzIGRpc2FibGVkLCB0aGVuIHRoZSBkb3VibGUgY2xpY2sgZXZlbnQgZm9yIGVsZW1lbnRzIGlzIG5vdCByYWlzZWQsXG4gICAqIGFuZCBjbGlja2luZyBvbiBhbiBlbGVtdCBzZW5kcyBhbiBpbW1lZGlhdGUgcmVzdWx0IHNpbmNlIHRoZSBjb21wb25lbnQgaGFzIG5vdCB0byB3YWl0IGFuZCBjaGVjayBpZiBhIGRvdWJsZSBjbGljayBldmVudFxuICAgKiBpcyBmaXJlZC5cbiAgICovXG4gIEBJbnB1dCgpIGFsbG93RGJsQ2xpY2sgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSB0cmVlIHdpbGwgYmUgaW4gc2VsZWN0aW9uIG1vZGUsIGFuZCB0aGUgdXNlciBjYW4gc2VsZWN0IGVsZW1lbnRzXG4gICAqIGJ5IGNsaWNraW5nIG9uIHRoZW0uIFRoZSBzZWxlY3RlZCBlbGVtZW50cyB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlIHNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkIGV2ZW50LlxuICAgKi9cbiAgQElucHV0KCkgaXNTZWxlY3Rpb25Nb2RlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBzdXBwbHkgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGluaXRpYWxseS4gVGhpcyBpcyBvbmx5IHVzZWQgaWZcbiAgICogaXNTZWxlY3Rpb25Nb2RlIGlzIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBpbml0aWFsbHlTZWxlY3RlZEVsZW1lbnRzOiBTZWxlY3RlZEVsZW1lbnRbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHN1cHBseSBhIG1hcCBvZiBzdHJpbmdzIHRvIGJlIHVzZWQgZm9yIHRoZSB0ZXh0IGluIHRoZSB0cmVlLiBUaGlzIGFsbG93cyB5b3UgdG8gdHJhbnNsYXRlXG4gICAqIHRoZSB0ZXh0IGluIHRoZSB0cmVlIHRvIG90aGVyIGxhbmd1YWdlcy5cbiAgICoge1xuICAgKiAgIHRleHRTZWFyY2g6IHN0cmluZyxcbiAgICogICB0ZXh0Tm90aGluZzogc3RyaW5nLFxuICAgKiAgIHRleHROb3RoaW5nRmlsdGVyZWQ6IHN0cmluZyxcbiAgICogICB0ZXh0QWxsOiBzdHJpbmcsXG4gICAqICAgdG9vbHRpcEFsbE9wZW46IHN0cmluZyxcbiAgICogICB0b29sdGlwQWxsQ2xvc2U6IHN0cmluZyxcbiAgICogICB0b29sdGlwQWxsQWRkOnN0cmluZyxcbiAgICogICB0b29sdGlwQWxsUmVtb3ZlOiBzdHJpbmcsXG4gICAqIH1cbiAgICovXG4gIEBJbnB1dCgpIHNldCB0ZXh0V29yZHMod29yZHM6IElUZXh0V29yZHMgfCBudWxsKSB7XG4gICAgdGhpcy5fdGV4dFdvcmRzID0geyAuLi50aGlzLnRleHRXb3JkcywgLi4ud29yZHMgfTtcbiAgfSAvLyBhbGxvdyB0byB0cmFuc2xhdGUgYWxsIHRleHRzIHRvIG90aGVyIGxhbmd1YWdlXG4gIGdldCB0ZXh0V29yZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHRXb3JkcztcbiAgfVxuICBwcml2YXRlIF90ZXh0V29yZHM6IElUZXh0V29yZHMgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgdGhpcyBpcyBlbmFibGVkLCB0aGVuIG5hdmlnYXRpbmcgaW4gdGhlIHRyZWUgd2l0aCB0aGUga2V5Ym9hcmQgb25seSB3b3Jrc1xuICAgKiBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgdHJlZSBhcmVhLiBUaGlzIGxpbWl0YXRpb24gaXMgdXNlZnVsIGlmIHlvdSBoYXZlIG11bHRpcGxlIHRyZWVzIG9yIG90aGVyIGNvbXBvbmVudHNcbiAgICogdGhhdCBtaWdodCBiZSB1c2luZyBrZXlib2FyZCBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIG1vdXNlQXdhcmVLZXlib2FyZENvbnRyb2wgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaXRoIHRoaXMgcGFyYW1ldGVyLCB5b3UgY2FuIGNvbmZpZ3VyZSB3aGljaCBrZXlzIHdpbGwgYmUgbGlzdGVuZW5kIHRvIHRvIHN3aXRjaCB0aGUgdHJlZSBlbGVtZW50cyxcbiAgICogYW5kIGFsc28gdG8gZGlzYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUga2V5cyAqL1xuICBASW5wdXQoKSBzZXQgY3VzdG9tS2V5Ym9hcmRPcGVyYXRpb25Db25maWcoY29uZmlnOiBJS2V5Ym9hcmRPcGVyYXRpb25Db25maWcpIHtcbiAgICB0aGlzLmtleWJvYXJkT3BlcmF0aW9uU2VydmljZS5tZXJnZUNvbmZpZ09wZXJhdGlvbihjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gc3VwcGx5IGN1c3RvbSBmaWx0ZXJzIHRoYXQgYXJlIHByb2Nlc3NlZCB3aGVuIHRoZSBmaWx0ZXIgaW5wdXQgaXMgY2hhbmdlZC4gRGVmYXVsdCBmaWx0ZXJzIGFyZSB1c2VkXG4gICAqIHRoYXQgY2hlY2sgZm9yIHNob3J0IHRleHQgYW5kIGl0ZW0gbnVtYmVyIG1hdGNoZXMsIGFuZCB5b3UgY2FuIGVpdGhlciBhZGQgY3VzdG9tIGZpbHRlcnMgb3IgcmVwbGFjZSB0aGUgZGVmYXVsdCBvbmVzLlxuICAgKi9cbiAgQElucHV0KCkgbGlzdEZpbHRlckZ1bmMgPSBERUZBVUxUX0ZJTFRFUlM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLiBGb3IgdGFibGUgdmlld3MsIHRoaXMgYWxsb3dzIHlvdSB0byBhZGQgY3VzdG9tIGNvbHVtbnMgdG8gdGhlIHRhYmxlLlxuICAgKiBhZGRUYWJsZUNvbHVtbnM6IEFycmF5IG9mIG9iamVjdHNcbiAgICoge1xuICAgKiAgIG5hbWU6IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSBvZiBjb2x1bW5cbiAgICogICB0aXRsZTogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3dlZCB0aXRsZSBvZiBjb2x1bW5cbiAgICogICBhbGlnbj86IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIGFsaWdodDogbGVmdChkZWZhdWx0KSAvIGNlbnRlciAvIHJpZ2h0XG4gICAqICAgbnVtYmVyRm9ybWF0Pzogc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCBmb3JtYXQgb2YgbnVtYmVyIHZhbHVlLCBleGFtcGxlOiAnMS4yLTInXG4gICAqIH1cbiAgICovXG4gIEBJbnB1dCgpIGFkZFRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5UeXBlW10gPSBbXTtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIHN1cHBseSBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIGVsZW1lbnRzLlxuICAgKiBUaGV5IG9iamVjdHMgY29udGFpbiBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCwgYWxvbmcgd2l0aCBhbiBvcHRpb24gdG8gY29uZmlndXJlIHRoZVxuICAgKiBhcHBlYXJhbmNlIG9mIHRoZSBlbGVtZW50LlxuICAgKiAgIGZ1bmN0aW9uVmlldzogQXJyYXkgb2Ygb2JqZWN0c1xuICAgKiAgIHtcbiAgICogICAgIG5hbWU6IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgdmlldyBwYXJ0OiB5b3UgY2FuIGFkZC9yZW1vdmUgaXQgd2hlbiBpdCBuZWVkXG4gICAqICAgICBmdW5jOiAoZWxlbWVudDogYW55LCByZXN1bHQ/OiBhbnkpID0+IGJvb2xlYW4sICAvLyB0aGlzIGZpbHRlciBmdW5jdGlvbiBjYWxjdWxhdGUgY29uZGl0aW9uIHRvIGNoYW5nZSB2aWV3XG4gICAqICAgICB2aWV3OiB7XG4gICAqICAgICAgIGljb25OYW1lPzogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIG5hbWUgb2YgaWNvblxuICAgKiAgICAgICBpY29uQ29sb3I/OiBzdHJpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBjb2xvciBvZiBpY29uXG4gICAqICAgICAgIHRleHRCb2xkPzogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIHdlaWdodCBvZiB0ZXh0XG4gICAqICAgICAgIHRleHRDb2xvcj86IHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIGNvbG9yIG9mIHRleHRcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqL1xuICBASW5wdXQoKSBmdW5jdGlvblZpZXc6IElGdW5jdGlvblZpZXdMaW5lW10gfCBudWxsID0gbnVsbDtcblxuICBAT3V0cHV0KCkgc2VsZWN0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElFbGVtZW50RHRvIHwgbnVsbD4oKTsgLy8gZXZlbnQgYWZ0ZXIgZWxlbWVudCBzZWxlY3RlZCBieSBjbGlja1xuICBAT3V0cHV0KCkgc2VsZWN0RGJsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElFbGVtZW50RHRvPigpOyAvLyBldmVudCBhZnRlciBlbGVtZW50IHNlbGVjdGVkIGJ5IGRvdWJsZSBjbGlja1xuICBAT3V0cHV0KCkgY29udGV4dE1lbnVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29udGV4dE1lbnVEYXRhVHlwZT4oKTsgLy8gZXZlbnQgYWZ0ZXIgZWxlbWVudCBjYWxsIGNvbnRleHQgbWVudSBieSByaWdodCBidXR0b24gY2xpY2tcbiAgQE91dHB1dCgpIHNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RlZEVsZW1lbnRbXT4oKTsgLy8gZXZlbnQgYWZ0ZXIgY2hhbmdlZCBzZWxlY3RpbmcgaW4gc2VsZWN0aW5nIG1vZGVcbiAgQFZpZXdDaGlsZCgnYXZhVHJlZVdyYXBwZXInKSBhdmFUcmVlV3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdhdmFNYWluV3JhcHBlcicpIGF2YU1haW5XcmFwcGVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2F2YVRyZWVGaWx0ZXJJbnB1dCcpIGF2YVRyZWVGaWx0ZXJJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIHNlbGVjdGVkRWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsID0gbnVsbDtcbiAgc2VydmljZVNwZWNpZmljYXRpb24hOiBTZXJ2aWNlU3BlY2lmaWNhdGlvbkR0bztcbiAgaXNMaXN0ZW5LZXlib2FyZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzRW1pdGVTZWxlY3RlZEVsZW1lbnRzID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0aW5nRWxlbWVudHNUcmVlRGF0YTogU2VsZWN0aW5nRWxlbWVudHNUeXBlW10gPSBbXTtcbiAgZmxhdEVsZW1lbnRzOiBJRWxlbWVudER0b1tdIHwgbnVsbCA9IG51bGw7XG4gIHByZXNlbGVjdGVkRWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsID0gbnVsbDtcbiAgZmlsdGVySW5wdXQgPSAnJztcbiAgbGlzdE1vZGVWaWV3VHlwZSA9IE1vZGVWaWV3VHlwZTtcbiAgcHJpdmF0ZSBmaWx0ZXIgPSAnJztcbiAgcHJpdmF0ZSAkZmlsdGVyID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcbiAgZmlsdGVyZWRFbGVtZW50TGlzdDogSUVsZW1lbnREdG9bXSA9IFtdO1xuICBwcml2YXRlICRkZXN0cm95ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAU2VsZigpIHByaXZhdGUgZmxhdEVsZW1lbnRzU2VydmljZTogRmxhdEVsZW1lbnRzU2VydmljZSxcbiAgICBAU2VsZigpIHByaXZhdGUgc2VsZWN0RWxlbWVudFNlcnZpY2U6IFNlbGVjdEVsZW1lbnRTZXJ2aWNlLFxuICAgIEBTZWxmKCkgcHJpdmF0ZSB0cmVlTm9kZVNlbGVjdGlvblNlcnZpY2U6IFRyZWVOb2RlU2VsZWN0aW9uU2VydmljZSxcbiAgICBAU2VsZigpIHByaXZhdGUgZXhwYW5kUGFyZW50R3JvdXBTZXJ2aWNlOiBFeHBhbmRQYXJlbnRHcm91cFNlcnZpY2UsXG4gICAgQFNlbGYoKSBwcml2YXRlIGtleWJvYXJkT3BlcmF0aW9uU2VydmljZTogS2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5fdGV4dFdvcmRzID0geyAuLi5ERUZBVUxUX1RFWFRfV09SRFMgfTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0RWxlbWVudFNlcnZpY2UucHJlc2VsZWN0ZWRFbGVtZW50LnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKGUpID0+ICh0aGlzLnByZXNlbGVjdGVkRWxlbWVudCA9IGUpKTtcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNlbGVjdENsaWNrRWxlbWVudC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGU7XG4gICAgICB0aGlzLnNlbGVjdENsaWNrLmVtaXQoZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RFbGVtZW50U2VydmljZS5zZWxlY3REYmxDbGlja0VsZW1lbnQucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveSkpLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5zZWxlY3REYmxDbGljay5lbWl0KGUpKTtcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNlbGVjdENvbnRleHRNZW51RWxlbWVudC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmNvbnRleHRNZW51RXZlbnQuZW1pdChlKSk7XG4gICAgdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLmZsYXRFbGVtZW50c0R0by5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICB0aGlzLmZsYXRFbGVtZW50cyA9IGU7XG4gICAgICB0aGlzLmdldEZpbHRlcmVkTGlzdCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kZmlsdGVyLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoMjUwKSkuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy5nZXRGaWx0ZXJlZExpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuZmxhdEVsZW1lbnRzU2VydmljZS5saXN0RmlsdGVyRnVuYyA9IHRoaXMubGlzdEZpbHRlckZ1bmM7XG4gICAgdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLmZ1bmN0aW9uVmlldyA9IHRoaXMuZnVuY3Rpb25WaWV3O1xuXG4gICAgaWYgKGNoYW5nZXNbJ3Byb2plY3QnXSAmJiB0aGlzLnByb2plY3Q/LnNlcnZpY2VTcGVjaWZpY2F0aW9ucz8uWzBdKSB7XG4gICAgICB0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uID0gdGhpcy5wcm9qZWN0LnNlcnZpY2VTcGVjaWZpY2F0aW9uc1swXTtcbiAgICAgIHRoaXMuZmxhdEVsZW1lbnRzU2VydmljZS5zZXRFbGVtZW50c0R0byh0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uKTtcblxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW5nRWxlbWVudHNUcmVlRGF0YSA9IHRoaXMudHJlZU5vZGVTZWxlY3Rpb25TZXJ2aWNlLmxvYWRTZWxlY3RpbmdFbGVtZW50cyh0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uLmVsZW1lbnRzKTtcbiAgICAgICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UudHJlZU5vZGVTZWxlY3RpbmcucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbWl0ZVNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzZWxlY3RpbmdUcmVlID0gdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZ2V0VHJlZVJvb3QodGhpcy5zZWxlY3RpbmdFbGVtZW50c1RyZWVEYXRhKTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzQ2hhbmdlZC5lbWl0KHNlbGVjdGluZ1RyZWUpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGNoYW5nZXNbJ3NlbGVjdGVkTm9kZUlkJ10gJiYgdGhpcy5wcm9qZWN0KSB8fCBjaGFuZ2VzWydwcm9qZWN0J10pIHtcbiAgICAgIHRoaXMuZmxhdEVsZW1lbnRzU2VydmljZS5nZXRPbmVFbGVtZW50QnlJZCh0aGlzLnNlbGVjdGVkTm9kZUlkKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNldENsaWNrRWxlbWVudChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlICYmIChjaGFuZ2VzWydpbml0aWFsbHlTZWxlY3RlZEVsZW1lbnRzJ10gfHwgY2hhbmdlc1sncHJvamVjdCddKSkge1xuICAgICAgdGhpcy5mb3JtU2VsZWN0aW5nTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuJGRlc3Ryb3kubmV4dCh0cnVlKTtcbiAgICB0aGlzLiRkZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIG1vdXNlT3ZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNMaXN0ZW5LZXlib2FyZCkge1xuICAgICAgdGhpcy5pc0xpc3RlbktleWJvYXJkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXZhVHJlZUZpbHRlcklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3VzZU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlR2xvYmFsS2V5Ym9hcmRFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBldmVudCBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgaWYgKCF0aGlzLm1vdXNlQXdhcmVLZXlib2FyZENvbnRyb2wgfHwgdGhpcy5pc0xpc3RlbktleWJvYXJkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnByZXNlbGVjdGVkRWxlbWVudCB8fCB0aGlzLnNlbGVjdGVkRWxlbWVudDtcblxuICAgICAgICBjb25zdCB7IG9wZXJhdGlvbiwgbmV4dEVsZW1lbnQgfSA9IHRoaXMua2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlLmhhbmRsZUtleWJvYXJkRXZlbnQoa2V5RXZlbnQsIGVsZW1lbnQpIHx8IHsgbmV4dEVsZW1lbnQ6IG51bGwgfTtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgICBjYXNlIEtleWJvYXJkT3BlcmF0aW9uVHlwZS5Nb3ZlU2VsZWN0ZWRQb3NpdGlvblVwOlxuICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChuZXh0RWxlbWVudCwgJy5zZWxlY3QnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgS2V5Ym9hcmRPcGVyYXRpb25UeXBlLk1vdmVTZWxlY3RlZFBvc2l0aW9uRG93bjpcbiAgICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnQobmV4dEVsZW1lbnQsICcuc2VsZWN0Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEtleWJvYXJkT3BlcmF0aW9uVHlwZS5Nb3ZlQ2hvc2VuUG9zaXRpb25Eb3duOlxuICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChuZXh0RWxlbWVudCwgbmV4dEVsZW1lbnQ/LmlkID09PSB0aGlzLnNlbGVjdGVkRWxlbWVudD8uaWQgPyAnLnNlbGVjdCcgOiAnLmNob29zZScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBLZXlib2FyZE9wZXJhdGlvblR5cGUuTW92ZUNob3NlblBvc2l0aW9uVXA6XG4gICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50KG5leHRFbGVtZW50LCBuZXh0RWxlbWVudD8uaWQgPT09IHRoaXMuc2VsZWN0ZWRFbGVtZW50Py5pZCA/ICcuc2VsZWN0JyA6ICcuY2hvb3NlJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0VsZW1lbnQoZWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsLCBuYW1lUXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRyZWUpIHtcbiAgICAgICAgdGhpcy5leHBhbmRQYXJlbnRHcm91cHMoZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsTGluZShuYW1lUXVlcnkpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbExpbmUobmFtZVF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRSZWN0ID0gdGhpcy5hdmFUcmVlV3JhcHBlcj8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaG93ZWRFbGVtZW50ID0gdGhpcy5hdmFUcmVlV3JhcHBlcj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKG5hbWVRdWVyeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIXNob3dlZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFJlY3QgPSBzaG93ZWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChcbiAgICAgIGNoaWxkUmVjdC5ib3R0b20gPiBwYXJlbnRSZWN0LmJvdHRvbSB8fFxuICAgICAgY2hpbGRSZWN0LnRvcCA8IHBhcmVudFJlY3QudG9wIHx8XG4gICAgICAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRhYmxlICYmIGNoaWxkUmVjdC50b3AgPCBwYXJlbnRSZWN0LnRvcCArIDI0KVxuICAgICkge1xuICAgICAgc2hvd2VkRWxlbWVudD8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgIHRoaXMuYXZhVHJlZVdyYXBwZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8oeyBsZWZ0OiAwIH0pO1xuICAgICAgaWYgKHRoaXMubW9kZVZpZXcgPT09IE1vZGVWaWV3VHlwZS5UYWJsZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ycmVjdFNjcm9sbFRhYmxlTGluZShzaG93ZWRFbGVtZW50LCBwYXJlbnRSZWN0KSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0U2Nyb2xsVGFibGVMaW5lKHNob3dlZEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYXJlbnRSZWN0OiBET01SZWN0KTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRSZWN0ID0gc2hvd2VkRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoY2hpbGRSZWN0LnRvcCA8IHBhcmVudFJlY3QudG9wICsgMjQpIHtcbiAgICAgIHRoaXMuYXZhVHJlZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLT0gMjQ7XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kUGFyZW50R3JvdXBzKGVsZW1lbnQ6IElFbGVtZW50RHRvKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRQYXJlbnRHcm91cFNlcnZpY2UuZXhwYW5kUGFyZW50R3JvdXBzKGVsZW1lbnQsIHRoaXMuZmxhdEVsZW1lbnRzLCB0aGlzLmV4cGFuc2lvblN0YXRlKTtcbiAgfVxuXG4gIG9uRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiRmaWx0ZXIubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBjaGFuZ2VBbGxFbGVtZW50c0V4cGFuc2lvblN0YXR1cyhpc0V4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpc0V4cGFuZGVkKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmV4cGFuc2lvblN0YXRlKS5mb3JFYWNoKChpZDogc3RyaW5nKSA9PiBkZWxldGUgdGhpcy5leHBhbnNpb25TdGF0ZVtpZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZsYXRFbGVtZW50cz8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5lbGVtZW50VHlwZURpc2NyaW1pbmF0b3IgPT09ICdTZXJ2aWNlU3BlY2lmaWNhdGlvbkdyb3VwRHRvJykge1xuICAgICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVbaXRlbS5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1TZWxlY3RpbmdMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNFbWl0ZVNlbGVjdGVkRWxlbWVudHMgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGx5U2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgdGhpcy5pc0VtaXRlU2VsZWN0ZWRFbGVtZW50cyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZ2V0RmxhdFNlbGVjdGVkTGlzdElkKHRoaXMuaW5pdGlhbGx5U2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZmxhdFNlbGVjdGVkTGlzdElkLmZvckVhY2goKGlkLCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuY2hhbmdlU2VsZWN0aW5nKHRydWUsIGlkKTtcbiAgICAgIGlmIChpbmRleCA9PT0gdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZmxhdFNlbGVjdGVkTGlzdElkLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5pc0VtaXRlU2VsZWN0ZWRFbGVtZW50cyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RPckRlc2VsZWN0QWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuY2hhbmdlQWxsKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRMaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZsYXRFbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMuZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRFbGVtZW50TGlzdCA9IHRoaXMuZmxhdEVsZW1lbnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEVsZW1lbnRMaXN0ID0gdGhpcy5mbGF0RWxlbWVudHMuZmlsdGVyKChpdGVtKSA9PiB0aGlzLmZsYXRFbGVtZW50c1NlcnZpY2UuY2hlY2tGaWx0ZXJWYWx1ZShpdGVtLCB0aGlzLmZpbHRlcikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh0aGlzLmF2YU1haW5XcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm1vdXNlT3V0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQodGhpcy5hdmFNYWluV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tb3VzZU92ZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5pc1NlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy4kZGVzdHJveSksXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubW91c2VBd2FyZUtleWJvYXJkQ29udHJvbCB8fCB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVHbG9iYWxLZXlib2FyZEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cIm1haW4td3JhcHBlclwiXG4gICNhdmFNYWluV3JhcHBlclxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb250cm9sXCJcbiAgICAjY29udHJvbFxuICA+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29udHJvbC1maWx0ZXJcIj5cbiAgICAgIDxtYXQtbGFiZWw+e3sgdGV4dFdvcmRzPy50ZXh0U2VhcmNoIH19PC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVySW5wdXRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlcigkZXZlbnQpXCJcbiAgICAgICAgI2F2YVRyZWVGaWx0ZXJJbnB1dFxuICAgICAgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5UcmVlXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY29udHJvbC1pY29uXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VBbGxFbGVtZW50c0V4cGFuc2lvblN0YXR1cyh0cnVlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbE9wZW4gfHwgJydcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsYXllci1iYWNrZ3JvdW5kXCI+bGF5ZXJzPC9tYXQtaWNvbj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGF5ZXItaWNvblwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJjb250cm9sLWljb25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgKGNsaWNrKT1cImNoYW5nZUFsbEVsZW1lbnRzRXhwYW5zaW9uU3RhdHVzKGZhbHNlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbENsb3NlIHx8ICcnXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGF5ZXItYmFja2dyb3VuZFwiPmxheWVyczwvbWF0LWljb24+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImxheWVyLWljb25cIj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2VsZWN0aW9uTW9kZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwic2VsZWN0T3JEZXNlbGVjdEFsbCh0cnVlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbEFkZCB8fCAnJ1wiXG4gICAgICAgIGNsYXNzPVwiY29udHJvbC1idXR0b25cIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgdGV4dFdvcmRzPy50ZXh0QWxsIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RPckRlc2VsZWN0QWxsKGZhbHNlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbFJlbW92ZSB8fCAnJ1wiXG4gICAgICAgIGNsYXNzPVwiY29udHJvbC1idXR0b25cIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgdGV4dFdvcmRzPy50ZXh0QWxsIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgW3N0eWxlLmhlaWdodF09XCInY2FsYygxMDAlIC0gJyArIGNvbnRyb2wub2Zmc2V0SGVpZ2h0ICsgJ3B4KSdcIlxuICAgIGNsYXNzPVwiYXZhLXRyZWUtd3JhcHBlclwiXG4gICAgI2F2YVRyZWVXcmFwcGVyXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmxhdEVsZW1lbnRzPy5sZW5ndGg7IGVsc2Ugbm90aGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkRWxlbWVudExpc3Q/Lmxlbmd0aDsgZWxzZSBub3RoaW5nRmlsdGVyZWRcIj5cbiAgICAgICAgPGF2YS10cmVlLXN0cnVjdHVyZVxuICAgICAgICAgICpuZ0lmPVwibW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuVHJlZSAmJiAhYXZhVHJlZUZpbHRlcklucHV0LnZhbHVlXCJcbiAgICAgICAgICBbc2VydmljZVNwZWNpZmljYXRpb25dPVwic2VydmljZVNwZWNpZmljYXRpb25cIlxuICAgICAgICAgIFtpbmRlbnRdPVwiaW5kZW50XCJcbiAgICAgICAgICBbZXhwYW5zaW9uU3RhdGVdPVwiZXhwYW5zaW9uU3RhdGVcIlxuICAgICAgICAgIFtpc1NlbGVjdGlvbk1vZGVdPVwiaXNTZWxlY3Rpb25Nb2RlXCJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcbiAgICAgICAgICBbYWxsb3dEYmxDbGlja109XCJhbGxvd0RibENsaWNrXCJcbiAgICAgICAgPlxuICAgICAgICA8L2F2YS10cmVlLXN0cnVjdHVyZT5cbiAgICAgICAgPGF2YS1saXN0LXN0cnVjdHVyZVxuICAgICAgICAgICpuZ0lmPVwibW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuTGlzdCB8fCAobW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuVHJlZSAmJiBhdmFUcmVlRmlsdGVySW5wdXQudmFsdWUpXCJcbiAgICAgICAgICBbZmlsdGVyZWRFbGVtZW50TGlzdF09XCJmaWx0ZXJlZEVsZW1lbnRMaXN0XCJcbiAgICAgICAgICBbaXNTZWxlY3Rpb25Nb2RlXT1cImlzU2VsZWN0aW9uTW9kZVwiXG4gICAgICAgICAgW3NlbGVjdGVkQ29sb3JdPVwic2VsZWN0ZWRDb2xvclwiXG4gICAgICAgICAgW2FsbG93RGJsQ2xpY2tdPVwiYWxsb3dEYmxDbGlja1wiXG4gICAgICAgID5cbiAgICAgICAgPC9hdmEtbGlzdC1zdHJ1Y3R1cmU+XG4gICAgICAgIDxhdmEtdGFibGUtc3RydWN0dXJlXG4gICAgICAgICAgKm5nSWY9XCJtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5UYWJsZVwiXG4gICAgICAgICAgW2ZpbHRlcmVkRWxlbWVudExpc3RdPVwiZmlsdGVyZWRFbGVtZW50TGlzdFwiXG4gICAgICAgICAgW2lzU2VsZWN0aW9uTW9kZV09XCJpc1NlbGVjdGlvbk1vZGVcIlxuICAgICAgICAgIFthZGRUYWJsZUNvbHVtbnNdPVwiYWRkVGFibGVDb2x1bW5zXCJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcbiAgICAgICAgICBbYWxsb3dEYmxDbGlja109XCJhbGxvd0RibENsaWNrXCJcbiAgICAgICAgPlxuICAgICAgICA8L2F2YS10YWJsZS1zdHJ1Y3R1cmU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjbm90aGluZz5cbiAge3sgdGV4dFdvcmRzPy50ZXh0Tm90aGluZyB9fVxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbm90aGluZ0ZpbHRlcmVkPlxuICB7eyB0ZXh0V29yZHM/LnRleHROb3RoaW5nRmlsdGVyZWQgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=