@aquera/ngx-smart-table 0.0.2-alpha

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 (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. package/src/lib/renderer/components/st-column-filter/README.md +286 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Table Config Editor Component
3
+ * Form for table-level configuration
4
+ */
5
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ import * as i2 from "@angular/common";
9
+ export class TableConfigEditorComponent {
10
+ constructor(fb) {
11
+ this.fb = fb;
12
+ this.configUpdated = new EventEmitter();
13
+ this.pageSizeOptions = [10, 25, 50, 100, 200];
14
+ }
15
+ ngOnInit() {
16
+ this.buildForm();
17
+ }
18
+ ngOnChanges(changes) {
19
+ if (changes['config'] && !changes['config'].firstChange && this.form) {
20
+ this.updateForm();
21
+ }
22
+ }
23
+ /**
24
+ * Build the reactive form
25
+ */
26
+ buildForm() {
27
+ this.form = this.fb.group({
28
+ pagination: this.fb.group({
29
+ enabled: [this.config.pagination?.enabled !== false],
30
+ pageSize: [this.config.pagination?.pageSize || 25],
31
+ showTopControls: [this.config.pagination?.showTopControls || false],
32
+ showBottomControls: [this.config.pagination?.showBottomControls !== false],
33
+ variant: [this.config.pagination?.variant || 'fluid']
34
+ }),
35
+ sorting: this.fb.group({
36
+ enabled: [this.config.sorting?.enabled !== false],
37
+ multiColumn: [this.config.sorting?.multiColumn || false],
38
+ mode: [this.config.sorting?.mode || 'server']
39
+ }),
40
+ filtering: this.fb.group({
41
+ enabled: [this.config.filtering?.enabled || false],
42
+ mode: [this.config.filtering?.mode || 'server']
43
+ }),
44
+ display: this.fb.group({
45
+ stickyHeader: [this.config.display?.stickyHeader !== false],
46
+ maxHeight: [this.config.display?.maxHeight || null],
47
+ virtualScroll: this.fb.group({
48
+ enabled: [this.config.display?.virtualScroll?.enabled || false],
49
+ itemSize: [this.config.display?.virtualScroll?.itemSize || 48],
50
+ bufferSize: [this.config.display?.virtualScroll?.bufferSize || 5],
51
+ viewportHeight: [this.config.display?.virtualScroll?.viewportHeight || 600]
52
+ })
53
+ }),
54
+ keyboardNavigation: this.fb.group({
55
+ enabled: [this.config.features?.keyboardNavigation?.enabled || false]
56
+ })
57
+ });
58
+ // Emit changes when form values change
59
+ this.form.valueChanges.subscribe(() => {
60
+ this.onFormChange();
61
+ });
62
+ this.updateForm();
63
+ }
64
+ /**
65
+ * Update form values from config
66
+ */
67
+ updateForm() {
68
+ if (!this.form || !this.config)
69
+ return;
70
+ this.form.patchValue({
71
+ pagination: {
72
+ enabled: this.config.pagination?.enabled !== false,
73
+ pageSize: this.config.pagination?.pageSize || 25,
74
+ showTopControls: this.config.pagination?.showTopControls || false,
75
+ showBottomControls: this.config.pagination?.showBottomControls !== false,
76
+ variant: this.config.pagination?.variant || 'fluid'
77
+ },
78
+ sorting: {
79
+ enabled: this.config.sorting?.enabled !== false,
80
+ multiColumn: this.config.sorting?.multiColumn || false,
81
+ mode: this.config.sorting?.mode || 'server'
82
+ },
83
+ filtering: {
84
+ enabled: this.config.filtering?.enabled || false,
85
+ mode: this.config.filtering?.mode || 'server'
86
+ },
87
+ display: {
88
+ stickyHeader: this.config.display?.stickyHeader !== false,
89
+ maxHeight: this.config.display?.maxHeight || null,
90
+ virtualScroll: {
91
+ enabled: this.config.display?.virtualScroll?.enabled || false,
92
+ itemSize: this.config.display?.virtualScroll?.itemSize || 48,
93
+ bufferSize: this.config.display?.virtualScroll?.bufferSize || 5,
94
+ viewportHeight: this.config.display?.virtualScroll?.viewportHeight || 600
95
+ }
96
+ },
97
+ keyboardNavigation: {
98
+ enabled: this.config.features?.keyboardNavigation?.enabled || false
99
+ }
100
+ }, { emitEvent: false });
101
+ }
102
+ /**
103
+ * Handle form changes
104
+ */
105
+ onFormChange() {
106
+ if (this.form.valid) {
107
+ const formValue = this.form.value;
108
+ // Transform to match TableConfig structure
109
+ const updates = {
110
+ pagination: formValue.pagination,
111
+ sorting: formValue.sorting,
112
+ filtering: formValue.filtering,
113
+ display: formValue.display,
114
+ features: {
115
+ keyboardNavigation: formValue.keyboardNavigation
116
+ }
117
+ };
118
+ this.configUpdated.emit(updates);
119
+ }
120
+ }
121
+ }
122
+ TableConfigEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableConfigEditorComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
123
+ TableConfigEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TableConfigEditorComponent, selector: "st-table-config-editor", inputs: { config: "config" }, outputs: { configUpdated: "configUpdated" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"table-config-editor\">\n <h3>Table Configuration</h3>\n\n <form [formGroup]=\"form\" class=\"config-form\">\n <!-- Pagination -->\n <div class=\"config-section\">\n <h4>Pagination</h4>\n <div formGroupName=\"pagination\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enabled</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <label>Page Size</label>\n <select formControlName=\"pageSize\" class=\"form-control\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">\n {{ size }}\n </option>\n </select>\n </div>\n <label class=\"checkbox-label\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <input type=\"checkbox\" formControlName=\"showTopControls\">\n <span>Show Top Controls</span>\n </label>\n <label class=\"checkbox-label\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <input type=\"checkbox\" formControlName=\"showBottomControls\">\n <span>Show Bottom Controls</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <label>Variant</label>\n <select formControlName=\"variant\" class=\"form-control\">\n <option value=\"fluid\">Fluid</option>\n <option value=\"compact\">Compact</option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Sorting -->\n <div class=\"config-section\">\n <h4>Sorting</h4>\n <div formGroupName=\"sorting\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enabled</span>\n </label>\n <label class=\"checkbox-label\" *ngIf=\"form.get('sorting.enabled')?.value\">\n <input type=\"checkbox\" formControlName=\"multiColumn\">\n <span>Multi-column</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('sorting.enabled')?.value\">\n <label>Mode</label>\n <select formControlName=\"mode\" class=\"form-control\">\n <option value=\"local\">Local</option>\n <option value=\"server\">Server</option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Filtering -->\n <div class=\"config-section\">\n <h4>Filtering</h4>\n <div formGroupName=\"filtering\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enabled</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('filtering.enabled')?.value\">\n <label>Mode</label>\n <select formControlName=\"mode\" class=\"form-control\">\n <option value=\"local\">Local</option>\n <option value=\"server\">Server</option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Display -->\n <div class=\"config-section\">\n <h4>Display</h4>\n <div formGroupName=\"display\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"stickyHeader\">\n <span>Sticky Header</span>\n </label>\n \n <!-- Virtual Scroll Configuration -->\n <div class=\"subsection\" formGroupName=\"virtualScroll\">\n <h5>Virtual Scroll</h5>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enable Virtual Scrolling (for large datasets)</span>\n </label>\n \n <div *ngIf=\"form.get('display.virtualScroll.enabled')?.value\" class=\"virtual-scroll-options\">\n <div class=\"form-group\">\n <label>Row Height (px)</label>\n <input type=\"number\" formControlName=\"itemSize\" class=\"form-control\" min=\"20\" max=\"200\">\n <small class=\"help-text\">Must be consistent for all rows</small>\n </div>\n \n <div class=\"form-group\">\n <label>Buffer Size (rows)</label>\n <input type=\"number\" formControlName=\"bufferSize\" class=\"form-control\" min=\"0\" max=\"20\">\n <small class=\"help-text\">Rows rendered above/below viewport</small>\n </div>\n \n <div class=\"form-group\">\n <label>Viewport Height (px)</label>\n <input type=\"number\" formControlName=\"viewportHeight\" class=\"form-control\" min=\"200\" max=\"2000\">\n <small class=\"help-text\">Height of scrollable container</small>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Keyboard Navigation -->\n <div class=\"config-section\">\n <h4>Keyboard Navigation</h4>\n <div formGroupName=\"keyboardNavigation\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enable Excel-like Navigation</span>\n </label>\n </div>\n </div>\n </form>\n</div>\n\n", styles: [".table-config-editor{background-color:#fff;border-radius:4px;box-shadow:0 2px 4px #0000001a;padding:1rem;overflow-y:auto;max-height:500px}.table-config-editor h3{margin:0 0 1rem;font-size:1rem;font-weight:600;color:#333}.config-form{display:flex;flex-direction:column;gap:1.5rem}.config-section h4{margin:0 0 .75rem;font-size:.875rem;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.checkbox-label{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;cursor:pointer;font-size:.875rem;color:#333}.checkbox-label input[type=checkbox]{width:18px;height:18px;cursor:pointer}.form-group{margin-top:.75rem}.form-group label{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:#333}.form-control{width:100%;padding:.5rem;border:1px solid #d0d0d0;border-radius:4px;font-size:.875rem}.form-control:focus{outline:none;border-color:#2196f3}.subsection{margin-top:1rem;padding:.75rem;background-color:#f9f9f9;border-radius:4px;border-left:3px solid #2196f3}.subsection h5{margin:0 0 .75rem;font-size:.8rem;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:.5px}.virtual-scroll-options{margin-top:.75rem;padding-left:.5rem}.help-text{display:block;margin-top:.25rem;font-size:.75rem;color:#666;font-style:italic}\n"], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }] });
124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableConfigEditorComponent, decorators: [{
125
+ type: Component,
126
+ args: [{ selector: 'st-table-config-editor', template: "<div class=\"table-config-editor\">\n <h3>Table Configuration</h3>\n\n <form [formGroup]=\"form\" class=\"config-form\">\n <!-- Pagination -->\n <div class=\"config-section\">\n <h4>Pagination</h4>\n <div formGroupName=\"pagination\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enabled</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <label>Page Size</label>\n <select formControlName=\"pageSize\" class=\"form-control\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">\n {{ size }}\n </option>\n </select>\n </div>\n <label class=\"checkbox-label\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <input type=\"checkbox\" formControlName=\"showTopControls\">\n <span>Show Top Controls</span>\n </label>\n <label class=\"checkbox-label\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <input type=\"checkbox\" formControlName=\"showBottomControls\">\n <span>Show Bottom Controls</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('pagination.enabled')?.value\">\n <label>Variant</label>\n <select formControlName=\"variant\" class=\"form-control\">\n <option value=\"fluid\">Fluid</option>\n <option value=\"compact\">Compact</option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Sorting -->\n <div class=\"config-section\">\n <h4>Sorting</h4>\n <div formGroupName=\"sorting\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enabled</span>\n </label>\n <label class=\"checkbox-label\" *ngIf=\"form.get('sorting.enabled')?.value\">\n <input type=\"checkbox\" formControlName=\"multiColumn\">\n <span>Multi-column</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('sorting.enabled')?.value\">\n <label>Mode</label>\n <select formControlName=\"mode\" class=\"form-control\">\n <option value=\"local\">Local</option>\n <option value=\"server\">Server</option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Filtering -->\n <div class=\"config-section\">\n <h4>Filtering</h4>\n <div formGroupName=\"filtering\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enabled</span>\n </label>\n <div class=\"form-group\" *ngIf=\"form.get('filtering.enabled')?.value\">\n <label>Mode</label>\n <select formControlName=\"mode\" class=\"form-control\">\n <option value=\"local\">Local</option>\n <option value=\"server\">Server</option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Display -->\n <div class=\"config-section\">\n <h4>Display</h4>\n <div formGroupName=\"display\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"stickyHeader\">\n <span>Sticky Header</span>\n </label>\n \n <!-- Virtual Scroll Configuration -->\n <div class=\"subsection\" formGroupName=\"virtualScroll\">\n <h5>Virtual Scroll</h5>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enable Virtual Scrolling (for large datasets)</span>\n </label>\n \n <div *ngIf=\"form.get('display.virtualScroll.enabled')?.value\" class=\"virtual-scroll-options\">\n <div class=\"form-group\">\n <label>Row Height (px)</label>\n <input type=\"number\" formControlName=\"itemSize\" class=\"form-control\" min=\"20\" max=\"200\">\n <small class=\"help-text\">Must be consistent for all rows</small>\n </div>\n \n <div class=\"form-group\">\n <label>Buffer Size (rows)</label>\n <input type=\"number\" formControlName=\"bufferSize\" class=\"form-control\" min=\"0\" max=\"20\">\n <small class=\"help-text\">Rows rendered above/below viewport</small>\n </div>\n \n <div class=\"form-group\">\n <label>Viewport Height (px)</label>\n <input type=\"number\" formControlName=\"viewportHeight\" class=\"form-control\" min=\"200\" max=\"2000\">\n <small class=\"help-text\">Height of scrollable container</small>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Keyboard Navigation -->\n <div class=\"config-section\">\n <h4>Keyboard Navigation</h4>\n <div formGroupName=\"keyboardNavigation\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enabled\">\n <span>Enable Excel-like Navigation</span>\n </label>\n </div>\n </div>\n </form>\n</div>\n\n", styles: [".table-config-editor{background-color:#fff;border-radius:4px;box-shadow:0 2px 4px #0000001a;padding:1rem;overflow-y:auto;max-height:500px}.table-config-editor h3{margin:0 0 1rem;font-size:1rem;font-weight:600;color:#333}.config-form{display:flex;flex-direction:column;gap:1.5rem}.config-section h4{margin:0 0 .75rem;font-size:.875rem;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.checkbox-label{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;cursor:pointer;font-size:.875rem;color:#333}.checkbox-label input[type=checkbox]{width:18px;height:18px;cursor:pointer}.form-group{margin-top:.75rem}.form-group label{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:#333}.form-control{width:100%;padding:.5rem;border:1px solid #d0d0d0;border-radius:4px;font-size:.875rem}.form-control:focus{outline:none;border-color:#2196f3}.subsection{margin-top:1rem;padding:.75rem;background-color:#f9f9f9;border-radius:4px;border-left:3px solid #2196f3}.subsection h5{margin:0 0 .75rem;font-size:.8rem;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:.5px}.virtual-scroll-options{margin-top:.75rem;padding-left:.5rem}.help-text{display:block;margin-top:.25rem;font-size:.75rem;color:#666;font-style:italic}\n"] }]
127
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { config: [{
128
+ type: Input
129
+ }], configUpdated: [{
130
+ type: Output
131
+ }] } });
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29uZmlnLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2J1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb25maWctZWRpdG9yL3RhYmxlLWNvbmZpZy1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvdGFibGUtY29uZmlnLWVkaXRvci90YWJsZS1jb25maWctZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sZUFBZSxDQUFDOzs7O0FBU3pHLE1BQU0sT0FBTywwQkFBMEI7SUFRckMsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFOekIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUkxRCxvQkFBZSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRVosQ0FBQztJQUV2QyxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDcEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxD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LENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQzs7dUhBM0hVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLDhKQ2R2Qyw0bUtBbUlBOzJGRHJIYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0Usd0JBQXdCO2tHQUt6QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGFibGUgQ29uZmlnIEVkaXRvciBDb21wb25lbnRcbiAqIEZvcm0gZm9yIHRhYmxlLWxldmVsIGNvbmZpZ3VyYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90YWJsZS1jb25maWcuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3QtdGFibGUtY29uZmlnLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1jb25maWctZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtY29uZmlnLWVkaXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29uZmlnRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBUYWJsZUNvbmZpZztcbiAgQE91dHB1dCgpIGNvbmZpZ1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8VGFibGVDb25maWc+PigpO1xuXG4gIGZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zID0gWzEwLCAyNSwgNTAsIDEwMCwgMjAwXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiAhY2hhbmdlc1snY29uZmlnJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm0oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHJlYWN0aXZlIGZvcm1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgcGFnaW5hdGlvbjogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGVuYWJsZWQ6IFt0aGlzLmNvbmZpZy5wYWdpbmF0aW9uPy5lbmFibGVkICE9PSBmYWxzZV0sXG4gICAgICAgIHBhZ2VTaXplOiBbdGhpcy5jb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgMjVdLFxuICAgICAgICBzaG93VG9wQ29udHJvbHM6IFt0aGlzLmNvbmZpZy5wYWdpbmF0aW9uPy5zaG93VG9wQ29udHJvbHMgfHwgZmFsc2VdLFxuICAgICAgICBzaG93Qm90dG9tQ29udHJvbHM6IFt0aGlzLmNvbmZpZy5wYWdpbmF0aW9uPy5zaG93Qm90dG9tQ29udHJvbHMgIT09IGZhbHNlXSxcbiAgICAgICAgdmFyaWFudDogW3RoaXMuY29uZmlnLnBhZ2luYXRpb24/LnZhcmlhbnQgfHwgJ2ZsdWlkJ11cbiAgICAgIH0pLFxuICAgICAgc29ydGluZzogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGVuYWJsZWQ6IFt0aGlzLmNvbmZpZy5zb3J0aW5nPy5lbmFibGVkICE9PSBmYWxzZV0sXG4gICAgICAgIG11bHRpQ29sdW1uOiBbdGhpcy5jb25maWcuc29ydGluZz8ubXVsdGlDb2x1bW4gfHwgZmFsc2VdLFxuICAgICAgICBtb2RlOiBbdGhpcy5jb25maWcuc29ydGluZz8ubW9kZSB8fCAnc2VydmVyJ11cbiAgICAgIH0pLFxuICAgICAgZmlsdGVyaW5nOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgZW5hYmxlZDogW3RoaXMuY29uZmlnLmZpbHRlcmluZz8uZW5hYmxlZCB8fCBmYWxzZV0sXG4gICAgICAgIG1vZGU6IFt0aGlzLmNvbmZpZy5maWx0ZXJpbmc/Lm1vZGUgfHwgJ3NlcnZlciddXG4gICAgICB9KSxcbiAgICAgIGRpc3BsYXk6IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBzdGlja3lIZWFkZXI6IFt0aGlzLmNvbmZpZy5kaXNwbGF5Py5zdGlja3lIZWFkZXIgIT09IGZhbHNlXSxcbiAgICAgICAgbWF4SGVpZ2h0OiBbdGhpcy5jb25maWcuZGlzcGxheT8ubWF4SGVpZ2h0IHx8IG51bGxdLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICBlbmFibGVkOiBbdGhpcy5jb25maWcuZGlzcGxheT8udmlydHVhbFNjcm9sbD8uZW5hYmxlZCB8fCBmYWxzZV0sXG4gICAgICAgICAgaXRlbVNpemU6IFt0aGlzLmNvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy5pdGVtU2l6ZSB8fCA0OF0sXG4gICAgICAgICAgYnVmZmVyU2l6ZTogW3RoaXMuY29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LmJ1ZmZlclNpemUgfHwgNV0sXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQ6IFt0aGlzLmNvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy52aWV3cG9ydEhlaWdodCB8fCA2MDBdXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGVuYWJsZWQ6IFt0aGlzLmNvbmZpZy5mZWF0dXJlcz8ua2V5Ym9hcmROYXZpZ2F0aW9uPy5lbmFibGVkIHx8IGZhbHNlXVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIC8vIEVtaXQgY2hhbmdlcyB3aGVuIGZvcm0gdmFsdWVzIGNoYW5nZVxuICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMub25Gb3JtQ2hhbmdlKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUZvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZm9ybSB2YWx1ZXMgZnJvbSBjb25maWdcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZm9ybSB8fCAhdGhpcy5jb25maWcpIHJldHVybjtcblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgZW5hYmxlZDogdGhpcy5jb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCAhPT0gZmFsc2UsXG4gICAgICAgIHBhZ2VTaXplOiB0aGlzLmNvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSB8fCAyNSxcbiAgICAgICAgc2hvd1RvcENvbnRyb2xzOiB0aGlzLmNvbmZpZy5wYWdpbmF0aW9uPy5zaG93VG9wQ29udHJvbHMgfHwgZmFsc2UsXG4gICAgICAgIHNob3dCb3R0b21Db250cm9sczogdGhpcy5jb25maWcucGFnaW5hdGlvbj8uc2hvd0JvdHRvbUNvbnRyb2xzICE9PSBmYWxzZSxcbiAgICAgICAgdmFyaWFudDogdGhpcy5jb25maWcucGFnaW5hdGlvbj8udmFyaWFudCB8fCAnZmx1aWQnXG4gICAgICB9LFxuICAgICAgc29ydGluZzoge1xuICAgICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5zb3J0aW5nPy5lbmFibGVkICE9PSBmYWxzZSxcbiAgICAgICAgbXVsdGlDb2x1bW46IHRoaXMuY29uZmlnLnNvcnRpbmc/Lm11bHRpQ29sdW1uIHx8IGZhbHNlLFxuICAgICAgICBtb2RlOiB0aGlzLmNvbmZpZy5zb3J0aW5nPy5tb2RlIHx8ICdzZXJ2ZXInXG4gICAgICB9LFxuICAgICAgZmlsdGVyaW5nOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLmZpbHRlcmluZz8uZW5hYmxlZCB8fCBmYWxzZSxcbiAgICAgICAgbW9kZTogdGhpcy5jb25maWcuZmlsdGVyaW5nPy5tb2RlIHx8ICdzZXJ2ZXInXG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBzdGlja3lIZWFkZXI6IHRoaXMuY29uZmlnLmRpc3BsYXk/LnN0aWNreUhlYWRlciAhPT0gZmFsc2UsXG4gICAgICAgIG1heEhlaWdodDogdGhpcy5jb25maWcuZGlzcGxheT8ubWF4SGVpZ2h0IHx8IG51bGwsXG4gICAgICAgIHZpcnR1YWxTY3JvbGw6IHtcbiAgICAgICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy5lbmFibGVkIHx8IGZhbHNlLFxuICAgICAgICAgIGl0ZW1TaXplOiB0aGlzLmNvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy5pdGVtU2l6ZSB8fCA0OCxcbiAgICAgICAgICBidWZmZXJTaXplOiB0aGlzLmNvbmZpZy5kaXNwbGF5Py52aXJ0dWFsU2Nyb2xsPy5idWZmZXJTaXplIHx8IDUsXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHRoaXMuY29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LnZpZXdwb3J0SGVpZ2h0IHx8IDYwMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLmZlYXR1cmVzPy5rZXlib2FyZE5hdmlnYXRpb24/LmVuYWJsZWQgfHwgZmFsc2VcbiAgICAgIH1cbiAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGZvcm0gY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgICAgXG4gICAgICAvLyBUcmFuc2Zvcm0gdG8gbWF0Y2ggVGFibGVDb25maWcgc3RydWN0dXJlXG4gICAgICBjb25zdCB1cGRhdGVzOiBQYXJ0aWFsPFRhYmxlQ29uZmlnPiA9IHtcbiAgICAgICAgcGFnaW5hdGlvbjogZm9ybVZhbHVlLnBhZ2luYXRpb24sXG4gICAgICAgIHNvcnRpbmc6IGZvcm1WYWx1ZS5zb3J0aW5nLFxuICAgICAgICBmaWx0ZXJpbmc6IGZvcm1WYWx1ZS5maWx0ZXJpbmcsXG4gICAgICAgIGRpc3BsYXk6IGZvcm1WYWx1ZS5kaXNwbGF5LFxuICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZm9ybVZhbHVlLmtleWJvYXJkTmF2aWdhdGlvblxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICB0aGlzLmNvbmZpZ1VwZGF0ZWQuZW1pdCh1cGRhdGVzKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cInRhYmxlLWNvbmZpZy1lZGl0b3JcIj5cbiAgPGgzPlRhYmxlIENvbmZpZ3VyYXRpb248L2gzPlxuXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29uZmlnLWZvcm1cIj5cbiAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbmZpZy1zZWN0aW9uXCI+XG4gICAgICA8aDQ+UGFnaW5hdGlvbjwvaDQ+XG4gICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJwYWdpbmF0aW9uXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImVuYWJsZWRcIj5cbiAgICAgICAgICA8c3Bhbj5FbmFibGVkPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZm9ybS5nZXQoJ3BhZ2luYXRpb24uZW5hYmxlZCcpPy52YWx1ZVwiPlxuICAgICAgICAgIDxsYWJlbD5QYWdlIFNpemU8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGFnZVNpemVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBwYWdlU2l6ZU9wdGlvbnNcIiBbdmFsdWVdPVwic2l6ZVwiPlxuICAgICAgICAgICAgICB7eyBzaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgKm5nSWY9XCJmb3JtLmdldCgncGFnaW5hdGlvbi5lbmFibGVkJyk/LnZhbHVlXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cInNob3dUb3BDb250cm9sc1wiPlxuICAgICAgICAgIDxzcGFuPlNob3cgVG9wIENvbnRyb2xzPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiICpuZ0lmPVwiZm9ybS5nZXQoJ3BhZ2luYXRpb24uZW5hYmxlZCcpPy52YWx1ZVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJzaG93Qm90dG9tQ29udHJvbHNcIj5cbiAgICAgICAgICA8c3Bhbj5TaG93IEJvdHRvbSBDb250cm9sczwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZvcm0uZ2V0KCdwYWdpbmF0aW9uLmVuYWJsZWQnKT8udmFsdWVcIj5cbiAgICAgICAgICA8bGFiZWw+VmFyaWFudDwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ2YXJpYW50XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmbHVpZFwiPkZsdWlkPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29tcGFjdFwiPkNvbXBhY3Q8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU29ydGluZyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXNlY3Rpb25cIj5cbiAgICAgIDxoND5Tb3J0aW5nPC9oND5cbiAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cInNvcnRpbmdcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiZW5hYmxlZFwiPlxuICAgICAgICAgIDxzcGFuPkVuYWJsZWQ8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgKm5nSWY9XCJmb3JtLmdldCgnc29ydGluZy5lbmFibGVkJyk/LnZhbHVlXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cIm11bHRpQ29sdW1uXCI+XG4gICAgICAgICAgPHNwYW4+TXVsdGktY29sdW1uPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZm9ybS5nZXQoJ3NvcnRpbmcuZW5hYmxlZCcpPy52YWx1ZVwiPlxuICAgICAgICAgIDxsYWJlbD5Nb2RlPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1vZGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImxvY2FsXCI+TG9jYWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzZXJ2ZXJcIj5TZXJ2ZXI8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRmlsdGVyaW5nIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb25maWctc2VjdGlvblwiPlxuICAgICAgPGg0PkZpbHRlcmluZzwvaDQ+XG4gICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJmaWx0ZXJpbmdcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiZW5hYmxlZFwiPlxuICAgICAgICAgIDxzcGFuPkVuYWJsZWQ8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmb3JtLmdldCgnZmlsdGVyaW5nLmVuYWJsZWQnKT8udmFsdWVcIj5cbiAgICAgICAgICA8bGFiZWw+TW9kZTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtb2RlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsb2NhbFwiPkxvY2FsPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VydmVyXCI+U2VydmVyPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERpc3BsYXkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbmZpZy1zZWN0aW9uXCI+XG4gICAgICA8aDQ+RGlzcGxheTwvaDQ+XG4gICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJkaXNwbGF5XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cInN0aWNreUhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuPlN0aWNreSBIZWFkZXI8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIFxuICAgICAgICA8IS0tIFZpcnR1YWwgU2Nyb2xsIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cInZpcnR1YWxTY3JvbGxcIj5cbiAgICAgICAgICA8aDU+VmlydHVhbCBTY3JvbGw8L2g1PlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiZW5hYmxlZFwiPlxuICAgICAgICAgICAgPHNwYW4+RW5hYmxlIFZpcnR1YWwgU2Nyb2xsaW5nIChmb3IgbGFyZ2UgZGF0YXNldHMpPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZvcm0uZ2V0KCdkaXNwbGF5LnZpcnR1YWxTY3JvbGwuZW5hYmxlZCcpPy52YWx1ZVwiIGNsYXNzPVwidmlydHVhbC1zY3JvbGwtb3B0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsPlJvdyBIZWlnaHQgKHB4KTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgZm9ybUNvbnRyb2xOYW1lPVwiaXRlbVNpemVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG1pbj1cIjIwXCIgbWF4PVwiMjAwXCI+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImhlbHAtdGV4dFwiPk11c3QgYmUgY29uc2lzdGVudCBmb3IgYWxsIHJvd3M8L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD5CdWZmZXIgU2l6ZSAocm93cyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cImJ1ZmZlclNpemVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG1pbj1cIjBcIiBtYXg9XCIyMFwiPlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJoZWxwLXRleHRcIj5Sb3dzIHJlbmRlcmVkIGFib3ZlL2JlbG93IHZpZXdwb3J0PC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWw+Vmlld3BvcnQgSGVpZ2h0IChweCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cInZpZXdwb3J0SGVpZ2h0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBtaW49XCIyMDBcIiBtYXg9XCIyMDAwXCI+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImhlbHAtdGV4dFwiPkhlaWdodCBvZiBzY3JvbGxhYmxlIGNvbnRhaW5lcjwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gS2V5Ym9hcmQgTmF2aWdhdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXNlY3Rpb25cIj5cbiAgICAgIDxoND5LZXlib2FyZCBOYXZpZ2F0aW9uPC9oND5cbiAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImtleWJvYXJkTmF2aWdhdGlvblwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJlbmFibGVkXCI+XG4gICAgICAgICAgPHNwYW4+RW5hYmxlIEV4Y2VsLWxpa2UgTmF2aWdhdGlvbjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cblxuIl19
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Definition Builder Module
3
+ * Module for the Visual UI Builder components
4
+ */
5
+ import { NgModule } from '@angular/core';
6
+ import { CommonModule } from '@angular/common';
7
+ import { ReactiveFormsModule } from '@angular/forms';
8
+ // Builder Components
9
+ import { DefinitionBuilderComponent } from './components/definition-builder/definition-builder.component';
10
+ import { BuilderToolbarComponent } from './components/builder-toolbar/builder-toolbar.component';
11
+ import { ColumnListComponent } from './components/column-list/column-list.component';
12
+ import { TableConfigEditorComponent } from './components/table-config-editor/table-config-editor.component';
13
+ import { BuilderPreviewComponent } from './components/builder-preview/builder-preview.component';
14
+ import { SmartTableModule } from '../smart-table.module';
15
+ import { SharedTableComponentsModule } from '../shared/shared-table-components.module';
16
+ import * as i0 from "@angular/core";
17
+ export class DefinitionBuilderModule {
18
+ }
19
+ DefinitionBuilderModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
+ DefinitionBuilderModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderModule, declarations: [DefinitionBuilderComponent,
21
+ BuilderToolbarComponent,
22
+ ColumnListComponent,
23
+ // ColumnEditorComponent moved to SharedTableComponentsModule
24
+ TableConfigEditorComponent,
25
+ BuilderPreviewComponent], imports: [CommonModule,
26
+ ReactiveFormsModule,
27
+ SmartTableModule,
28
+ SharedTableComponentsModule // Import shared module for ColumnEditorComponent
29
+ ], exports: [DefinitionBuilderComponent,
30
+ BuilderToolbarComponent,
31
+ ColumnListComponent,
32
+ TableConfigEditorComponent,
33
+ BuilderPreviewComponent,
34
+ SharedTableComponentsModule // Re-export so consumers get ColumnEditorComponent
35
+ ] });
36
+ DefinitionBuilderModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderModule, imports: [[
37
+ CommonModule,
38
+ ReactiveFormsModule,
39
+ SmartTableModule,
40
+ SharedTableComponentsModule // Import shared module for ColumnEditorComponent
41
+ ], SharedTableComponentsModule // Re-export so consumers get ColumnEditorComponent
42
+ ] });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderModule, decorators: [{
44
+ type: NgModule,
45
+ args: [{
46
+ declarations: [
47
+ DefinitionBuilderComponent,
48
+ BuilderToolbarComponent,
49
+ ColumnListComponent,
50
+ // ColumnEditorComponent moved to SharedTableComponentsModule
51
+ TableConfigEditorComponent,
52
+ BuilderPreviewComponent,
53
+ ],
54
+ imports: [
55
+ CommonModule,
56
+ ReactiveFormsModule,
57
+ SmartTableModule,
58
+ SharedTableComponentsModule // Import shared module for ColumnEditorComponent
59
+ ],
60
+ exports: [
61
+ DefinitionBuilderComponent,
62
+ BuilderToolbarComponent,
63
+ ColumnListComponent,
64
+ TableConfigEditorComponent,
65
+ BuilderPreviewComponent,
66
+ SharedTableComponentsModule // Re-export so consumers get ColumnEditorComponent
67
+ ]
68
+ }]
69
+ }] });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1idWlsZGVyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvYnVpbGRlci9kZWZpbml0aW9uLWJ1aWxkZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELHFCQUFxQjtBQUNyQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUM1RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUEwQnZGLE1BQU0sT0FBTyx1QkFBdUI7O29IQUF2Qix1QkFBdUI7cUhBQXZCLHVCQUF1QixpQkF0QmhDLDBCQUEwQjtRQUMxQix1QkFBdUI7UUFDdkIsbUJBQW1CO1FBQ25CLDZEQUE2RDtRQUM3RCwwQkFBMEI7UUFDMUIsdUJBQXVCLGFBR3ZCLFlBQVk7UUFDWixtQkFBbUI7UUFDbkIsZ0JBQWdCO1FBQ2hCLDJCQUEyQixDQUFFLGlEQUFpRDtpQkFHOUUsMEJBQTBCO1FBQzFCLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsMEJBQTBCO1FBQzFCLHVCQUF1QjtRQUN2QiwyQkFBMkIsQ0FBRSxtREFBbUQ7O3FIQUd2RSx1QkFBdUIsWUFmekI7WUFDUCxZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQiwyQkFBMkIsQ0FBRSxpREFBaUQ7U0FDL0UsRUFPQywyQkFBMkIsQ0FBRSxtREFBbUQ7OzJGQUd2RSx1QkFBdUI7a0JBeEJuQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWiwwQkFBMEI7d0JBQzFCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQiw2REFBNkQ7d0JBQzdELDBCQUEwQjt3QkFDMUIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsMkJBQTJCLENBQUUsaURBQWlEO3FCQUMvRTtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsMEJBQTBCO3dCQUMxQix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsMEJBQTBCO3dCQUMxQix1QkFBdUI7d0JBQ3ZCLDJCQUEyQixDQUFFLG1EQUFtRDtxQkFDakY7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmluaXRpb24gQnVpbGRlciBNb2R1bGVcbiAqIE1vZHVsZSBmb3IgdGhlIFZpc3VhbCBVSSBCdWlsZGVyIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8vIEJ1aWxkZXIgQ29tcG9uZW50c1xuaW1wb3J0IHsgRGVmaW5pdGlvbkJ1aWxkZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZGVmaW5pdGlvbi1idWlsZGVyL2RlZmluaXRpb24tYnVpbGRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnVpbGRlclRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYnVpbGRlci10b29sYmFyL2J1aWxkZXItdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29sdW1uTGlzdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jb2x1bW4tbGlzdC9jb2x1bW4tbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVDb25maWdFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtY29uZmlnLWVkaXRvci90YWJsZS1jb25maWctZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdWlsZGVyUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9idWlsZGVyLXByZXZpZXcvYnVpbGRlci1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbWFydFRhYmxlTW9kdWxlIH0gZnJvbSAnLi4vc21hcnQtdGFibGUubW9kdWxlJztcbmltcG9ydCB7IFNoYXJlZFRhYmxlQ29tcG9uZW50c01vZHVsZSB9IGZyb20gJy4uL3NoYXJlZC9zaGFyZWQtdGFibGUtY29tcG9uZW50cy5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEZWZpbml0aW9uQnVpbGRlckNvbXBvbmVudCxcbiAgICBCdWlsZGVyVG9vbGJhckNvbXBvbmVudCxcbiAgICBDb2x1bW5MaXN0Q29tcG9uZW50LFxuICAgIC8vIENvbHVtbkVkaXRvckNvbXBvbmVudCBtb3ZlZCB0byBTaGFyZWRUYWJsZUNvbXBvbmVudHNNb2R1bGVcbiAgICBUYWJsZUNvbmZpZ0VkaXRvckNvbXBvbmVudCxcbiAgICBCdWlsZGVyUHJldmlld0NvbXBvbmVudCxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFNtYXJ0VGFibGVNb2R1bGUsXG4gICAgU2hhcmVkVGFibGVDb21wb25lbnRzTW9kdWxlICAvLyBJbXBvcnQgc2hhcmVkIG1vZHVsZSBmb3IgQ29sdW1uRWRpdG9yQ29tcG9uZW50XG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBEZWZpbml0aW9uQnVpbGRlckNvbXBvbmVudCxcbiAgICBCdWlsZGVyVG9vbGJhckNvbXBvbmVudCxcbiAgICBDb2x1bW5MaXN0Q29tcG9uZW50LFxuICAgIFRhYmxlQ29uZmlnRWRpdG9yQ29tcG9uZW50LFxuICAgIEJ1aWxkZXJQcmV2aWV3Q29tcG9uZW50LFxuICAgIFNoYXJlZFRhYmxlQ29tcG9uZW50c01vZHVsZSAgLy8gUmUtZXhwb3J0IHNvIGNvbnN1bWVycyBnZXQgQ29sdW1uRWRpdG9yQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGVmaW5pdGlvbkJ1aWxkZXJNb2R1bGUgeyB9XG5cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Builder state interface - tracks the current state of the definition builder
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1zdGF0ZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2J1aWxkZXIvbW9kZWxzL2J1aWxkZXItc3RhdGUuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZGVyIHN0YXRlIGludGVyZmFjZSAtIHRyYWNrcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGVmaW5pdGlvbiBidWlsZGVyXG4gKi9cblxuaW1wb3J0IHsgVGFibGVDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5Db25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGRlZmluaXRpb24gYnVpbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBDdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb24gYmVpbmcgZWRpdGVkXG4gICAqL1xuICB0YWJsZUNvbmZpZzogVGFibGVDb25maWc7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnRseSBzZWxlY3RlZCBjb2x1bW4gZm9yIGVkaXRpbmcgKG51bGwgaWYgbm9uZSBzZWxlY3RlZClcbiAgICovXG4gIHNlbGVjdGVkQ29sdW1uOiBDb2x1bW5Db25maWcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJbmRleCBvZiBzZWxlY3RlZCBjb2x1bW4gaW4gY29sdW1ucyBhcnJheVxuICAgKi9cbiAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciBwcmV2aWV3IGlzIHZpc2libGVcbiAgICovXG4gIHByZXZpZXdWaXNpYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXNcbiAgICovXG4gIGhhc1Vuc2F2ZWRDaGFuZ2VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMYXN0IHNhdmVkIGNvbmZpZ3VyYXRpb24gKGZvciBjb21wYXJpc29uKVxuICAgKi9cbiAgbGFzdFNhdmVkQ29uZmlnPzogVGFibGVDb25maWc7XG59XG5cbi8qKlxuICogRXhwb3J0IGZvcm1hdCBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFeHBvcnQgZm9ybWF0IHR5cGVcbiAgICovXG4gIGZvcm1hdDogJ2pzb24nIHwgJ3R5cGVzY3JpcHQnO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGNvbW1lbnRzIGluIFR5cGVTY3JpcHQgZXhwb3J0XG4gICAqL1xuICBpbmNsdWRlQ29tbWVudHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWYXJpYWJsZSBuYW1lIGZvciBUeXBlU2NyaXB0IGV4cG9ydFxuICAgKi9cbiAgdmFyaWFibGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKi9cbiAgZmlsZU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW1wb3J0IHJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFJlc3VsdCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGltcG9ydCB3YXMgc3VjY2Vzc2Z1bFxuICAgKi9cbiAgc3VjY2VzczogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW1wb3J0ZWQgdGFibGUgY29uZmlndXJhdGlvbiAoaWYgc3VjY2Vzc2Z1bClcbiAgICovXG4gIHRhYmxlQ29uZmlnPzogVGFibGVDb25maWc7XG5cbiAgLyoqXG4gICAqIEVycm9yIG1lc3NhZ2UgKGlmIGZhaWxlZClcbiAgICovXG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIGVycm9ycyAoaWYgYW55KVxuICAgKi9cbiAgdmFsaWRhdGlvbkVycm9ycz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFZhbGlkYXRpb24gZXJyb3IgZm9yIGZvcm0gZmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIEZpZWxkIHBhdGggKGUuZy4sICdjb2x1bW5zWzBdLmtleScpXG4gICAqL1xuICBmaWVsZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVycm9yIGNvZGVcbiAgICovXG4gIGNvZGU/OiBzdHJpbmc7XG59XG5cbiJdfQ==
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Definition builder service
3
+ * Manages builder state and column operations
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import { BehaviorSubject } from 'rxjs';
7
+ import { mergeTableConfig, DEFAULT_TABLE_CONFIG } from '../../models/table-config.interface';
8
+ import { ColumnConfigFactory } from '../../factories/column-config.factory';
9
+ import { CellDataType } from '../../models/cell-types';
10
+ import * as i0 from "@angular/core";
11
+ export class DefinitionBuilderService {
12
+ constructor() {
13
+ this.stateSubject = new BehaviorSubject(this.createInitialState());
14
+ this.state$ = this.stateSubject.asObservable();
15
+ }
16
+ /**
17
+ * Get current state
18
+ */
19
+ getState() {
20
+ return { ...this.stateSubject.value };
21
+ }
22
+ /**
23
+ * Create initial empty state
24
+ */
25
+ createInitialState() {
26
+ return {
27
+ tableConfig: {
28
+ columns: [],
29
+ ...DEFAULT_TABLE_CONFIG
30
+ },
31
+ selectedColumn: null,
32
+ selectedColumnIndex: null,
33
+ previewVisible: true,
34
+ hasUnsavedChanges: false
35
+ };
36
+ }
37
+ /**
38
+ * Initialize with a TableConfig
39
+ */
40
+ initialize(config) {
41
+ const mergedConfig = mergeTableConfig(config);
42
+ this.updateState({
43
+ tableConfig: mergedConfig,
44
+ selectedColumn: null,
45
+ selectedColumnIndex: null,
46
+ hasUnsavedChanges: false,
47
+ lastSavedConfig: { ...mergedConfig }
48
+ });
49
+ }
50
+ /**
51
+ * Create new definition (reset to empty)
52
+ */
53
+ newDefinition() {
54
+ this.updateState(this.createInitialState());
55
+ }
56
+ /**
57
+ * Add a new column
58
+ */
59
+ addColumn(type = CellDataType.STRING) {
60
+ const key = this.generateUniqueKey('newColumn');
61
+ let column;
62
+ switch (type) {
63
+ case CellDataType.STRING:
64
+ column = ColumnConfigFactory.text(key);
65
+ break;
66
+ case CellDataType.NUMBER:
67
+ column = ColumnConfigFactory.number(key);
68
+ break;
69
+ case CellDataType.DATE:
70
+ column = ColumnConfigFactory.date(key);
71
+ break;
72
+ case CellDataType.BOOLEAN:
73
+ column = ColumnConfigFactory.boolean(key);
74
+ break;
75
+ default:
76
+ column = ColumnConfigFactory.text(key);
77
+ }
78
+ const state = this.getState();
79
+ const newColumns = [...state.tableConfig.columns, column];
80
+ this.updateTableConfig({ ...state.tableConfig, columns: newColumns });
81
+ // Select the new column
82
+ this.selectColumn(newColumns.length - 1);
83
+ return column;
84
+ }
85
+ /**
86
+ * Update a column at the given index
87
+ */
88
+ updateColumn(index, updates) {
89
+ const state = this.getState();
90
+ if (index < 0 || index >= state.tableConfig.columns.length) {
91
+ return;
92
+ }
93
+ const columns = [...state.tableConfig.columns];
94
+ columns[index] = { ...columns[index], ...updates };
95
+ this.updateTableConfig({ ...state.tableConfig, columns });
96
+ // Update selected column if it's the one being updated
97
+ if (state.selectedColumnIndex === index) {
98
+ this.selectColumn(index);
99
+ }
100
+ }
101
+ /**
102
+ * Delete a column at the given index
103
+ */
104
+ deleteColumn(index) {
105
+ const state = this.getState();
106
+ if (index < 0 || index >= state.tableConfig.columns.length) {
107
+ return;
108
+ }
109
+ const columns = state.tableConfig.columns.filter((_, i) => i !== index);
110
+ this.updateTableConfig({ ...state.tableConfig, columns });
111
+ // Clear selection if deleted column was selected
112
+ if (state.selectedColumnIndex === index) {
113
+ this.clearSelection();
114
+ }
115
+ else if (state.selectedColumnIndex !== null && state.selectedColumnIndex > index) {
116
+ // Adjust selection index if a column before the selected one was deleted
117
+ this.selectColumn(state.selectedColumnIndex - 1);
118
+ }
119
+ }
120
+ /**
121
+ * Reorder columns
122
+ */
123
+ reorderColumns(fromIndex, toIndex) {
124
+ const state = this.getState();
125
+ const columns = [...state.tableConfig.columns];
126
+ const [moved] = columns.splice(fromIndex, 1);
127
+ columns.splice(toIndex, 0, moved);
128
+ this.updateTableConfig({ ...state.tableConfig, columns });
129
+ // Update selection if needed
130
+ if (state.selectedColumnIndex !== null) {
131
+ let newIndex = state.selectedColumnIndex;
132
+ if (state.selectedColumnIndex === fromIndex) {
133
+ newIndex = toIndex;
134
+ }
135
+ else if (fromIndex < state.selectedColumnIndex && toIndex >= state.selectedColumnIndex) {
136
+ newIndex = state.selectedColumnIndex - 1;
137
+ }
138
+ else if (fromIndex > state.selectedColumnIndex && toIndex <= state.selectedColumnIndex) {
139
+ newIndex = state.selectedColumnIndex + 1;
140
+ }
141
+ this.selectColumn(newIndex);
142
+ }
143
+ }
144
+ /**
145
+ * Select a column for editing
146
+ */
147
+ selectColumn(index) {
148
+ const state = this.getState();
149
+ if (index < 0 || index >= state.tableConfig.columns.length) {
150
+ this.clearSelection();
151
+ return;
152
+ }
153
+ this.updateState({
154
+ selectedColumn: { ...state.tableConfig.columns[index] },
155
+ selectedColumnIndex: index
156
+ });
157
+ }
158
+ /**
159
+ * Clear column selection
160
+ */
161
+ clearSelection() {
162
+ this.updateState({
163
+ selectedColumn: null,
164
+ selectedColumnIndex: null
165
+ });
166
+ }
167
+ /**
168
+ * Update table configuration
169
+ */
170
+ updateTableConfig(config) {
171
+ const state = this.getState();
172
+ const mergedConfig = mergeTableConfig(config);
173
+ this.updateState({
174
+ tableConfig: mergedConfig,
175
+ hasUnsavedChanges: !this.configsEqual(state.lastSavedConfig, mergedConfig)
176
+ });
177
+ }
178
+ /**
179
+ * Update table-level settings (pagination, sorting, etc.)
180
+ */
181
+ updateTableSettings(settings) {
182
+ const state = this.getState();
183
+ this.updateTableConfig({
184
+ ...state.tableConfig,
185
+ ...settings
186
+ });
187
+ }
188
+ /**
189
+ * Toggle preview visibility
190
+ */
191
+ togglePreview() {
192
+ const state = this.getState();
193
+ this.updateState({
194
+ previewVisible: !state.previewVisible
195
+ });
196
+ }
197
+ /**
198
+ * Mark configuration as saved
199
+ */
200
+ markAsSaved() {
201
+ const state = this.getState();
202
+ this.updateState({
203
+ hasUnsavedChanges: false,
204
+ lastSavedConfig: { ...state.tableConfig }
205
+ });
206
+ }
207
+ /**
208
+ * Update state (internal)
209
+ */
210
+ updateState(updates) {
211
+ const currentState = this.getState();
212
+ const newState = { ...currentState, ...updates };
213
+ this.stateSubject.next(newState);
214
+ }
215
+ /**
216
+ * Generate unique column key
217
+ */
218
+ generateUniqueKey(baseKey) {
219
+ const state = this.getState();
220
+ const existingKeys = new Set(state.tableConfig.columns.map(col => col.key));
221
+ if (!existingKeys.has(baseKey)) {
222
+ return baseKey;
223
+ }
224
+ let counter = 1;
225
+ let newKey = `${baseKey}${counter}`;
226
+ while (existingKeys.has(newKey)) {
227
+ counter++;
228
+ newKey = `${baseKey}${counter}`;
229
+ }
230
+ return newKey;
231
+ }
232
+ /**
233
+ * Compare two configs for equality (deep comparison)
234
+ */
235
+ configsEqual(config1, config2) {
236
+ if (!config1 || !config2) {
237
+ return config1 === config2;
238
+ }
239
+ // Simple comparison - in production, use a deep equality library
240
+ return JSON.stringify(config1) === JSON.stringify(config2);
241
+ }
242
+ }
243
+ DefinitionBuilderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
244
+ DefinitionBuilderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderService, providedIn: 'root' });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderService, decorators: [{
246
+ type: Injectable,
247
+ args: [{
248
+ providedIn: 'root'
249
+ }]
250
+ }] });
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2J1aWxkZXIvc2VydmljZXMvZGVmaW5pdGlvbi1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBZSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTFHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFLdkQsTUFBTSxPQUFPLHdCQUF3QjtJQUhyQztRQUlVLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNwRSxXQUFNLEdBQTZCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7S0FrUXJGO0lBaFFDOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU87WUFDTCxXQUFXLEVBQUU7Z0JBQ1gsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsR0FBRyxvQkFBb0I7YUFDeEI7WUFDRCxjQUFjLEVBQUUsSUFBSTtZQUNwQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGlCQUFpQixFQUFFLEtBQUs7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUs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LENBQUMsQ0FBQztJQUM3RCxDQUFDOztxSEFuUVUsd0JBQXdCO3lIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZpbml0aW9uIGJ1aWxkZXIgc2VydmljZVxuICogTWFuYWdlcyBidWlsZGVyIHN0YXRlIGFuZCBjb2x1bW4gb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVDb25maWcsIG1lcmdlVGFibGVDb25maWcsIERFRkFVTFRfVEFCTEVfQ09ORklHIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZ0ZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMvY29sdW1uLWNvbmZpZy5mYWN0b3J5JztcbmltcG9ydCB7IEJ1aWxkZXJTdGF0ZSB9IGZyb20gJy4uL21vZGVscy9idWlsZGVyLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsRGF0YVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlZmluaXRpb25CdWlsZGVyU2VydmljZSB7XG4gIHByaXZhdGUgc3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCdWlsZGVyU3RhdGU+KHRoaXMuY3JlYXRlSW5pdGlhbFN0YXRlKCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGUkOiBPYnNlcnZhYmxlPEJ1aWxkZXJTdGF0ZT4gPSB0aGlzLnN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc3RhdGVcbiAgICovXG4gIGdldFN0YXRlKCk6IEJ1aWxkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5zdGF0ZVN1YmplY3QudmFsdWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5pdGlhbCBlbXB0eSBzdGF0ZVxuICAgKi9cbiAgY3JlYXRlSW5pdGlhbFN0YXRlKCk6IEJ1aWxkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlQ29uZmlnOiB7XG4gICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICAuLi5ERUZBVUxUX1RBQkxFX0NPTkZJR1xuICAgICAgfSxcbiAgICAgIHNlbGVjdGVkQ29sdW1uOiBudWxsLFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVsbCxcbiAgICAgIHByZXZpZXdWaXNpYmxlOiB0cnVlLFxuICAgICAgaGFzVW5zYXZlZENoYW5nZXM6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHdpdGggYSBUYWJsZUNvbmZpZ1xuICAgKi9cbiAgaW5pdGlhbGl6ZShjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgdGFibGVDb25maWc6IG1lcmdlZENvbmZpZyxcbiAgICAgIHNlbGVjdGVkQ29sdW1uOiBudWxsLFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVsbCxcbiAgICAgIGhhc1Vuc2F2ZWRDaGFuZ2VzOiBmYWxzZSxcbiAgICAgIGxhc3RTYXZlZENvbmZpZzogeyAuLi5tZXJnZWRDb25maWcgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgZGVmaW5pdGlvbiAocmVzZXQgdG8gZW1wdHkpXG4gICAqL1xuICBuZXdEZWZpbml0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU3RhdGUodGhpcy5jcmVhdGVJbml0aWFsU3RhdGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNvbHVtblxuICAgKi9cbiAgYWRkQ29sdW1uKHR5cGU6IENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5TVFJJTkcpOiBDb2x1bW5Db25maWcge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2VuZXJhdGVVbmlxdWVLZXkoJ25ld0NvbHVtbicpO1xuICAgIGxldCBjb2x1bW46IENvbHVtbkNvbmZpZztcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuU1RSSU5HOlxuICAgICAgICBjb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LnRleHQoa2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENlbGxEYXRhVHlwZS5OVU1CRVI6XG4gICAgICAgIGNvbHVtbiA9IENvbHVtbkNvbmZpZ0ZhY3RvcnkubnVtYmVyKGtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuREFURTpcbiAgICAgICAgY29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS5kYXRlKGtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuQk9PTEVBTjpcbiAgICAgICAgY29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS5ib29sZWFuKGtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS50ZXh0KGtleSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IFsuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zLCBjb2x1bW5dO1xuICAgIHRoaXMudXBkYXRlVGFibGVDb25maWcoeyAuLi5zdGF0ZS50YWJsZUNvbmZpZywgY29sdW1uczogbmV3Q29sdW1ucyB9KTtcblxuICAgIC8vIFNlbGVjdCB0aGUgbmV3IGNvbHVtblxuICAgIHRoaXMuc2VsZWN0Q29sdW1uKG5ld0NvbHVtbnMubGVuZ3RoIC0gMSk7XG5cbiAgICByZXR1cm4gY29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIGNvbHVtbiBhdCB0aGUgZ2l2ZW4gaW5kZXhcbiAgICovXG4gIHVwZGF0ZUNvbHVtbihpbmRleDogbnVtYmVyLCB1cGRhdGVzOiBQYXJ0aWFsPENvbHVtbkNvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IFsuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zXTtcbiAgICBjb2x1bW5zW2luZGV4XSA9IHsgLi4uY29sdW1uc1tpbmRleF0sIC4uLnVwZGF0ZXMgfTtcblxuICAgIHRoaXMudXBkYXRlVGFibGVDb25maWcoeyAuLi5zdGF0ZS50YWJsZUNvbmZpZywgY29sdW1ucyB9KTtcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBjb2x1bW4gaWYgaXQncyB0aGUgb25lIGJlaW5nIHVwZGF0ZWRcbiAgICBpZiAoc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q29sdW1uKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY29sdW1uIGF0IHRoZSBnaXZlbiBpbmRleFxuICAgKi9cbiAgZGVsZXRlQ29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy51cGRhdGVUYWJsZUNvbmZpZyh7IC4uLnN0YXRlLnRhYmxlQ29uZmlnLCBjb2x1bW5zIH0pO1xuXG4gICAgLy8gQ2xlYXIgc2VsZWN0aW9uIGlmIGRlbGV0ZWQgY29sdW1uIHdhcyBzZWxlY3RlZFxuICAgIGlmIChzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4ID09PSBpbmRleCkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCAhPT0gbnVsbCAmJiBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgIC8vIEFkanVzdCBzZWxlY3Rpb24gaW5kZXggaWYgYSBjb2x1bW4gYmVmb3JlIHRoZSBzZWxlY3RlZCBvbmUgd2FzIGRlbGV0ZWRcbiAgICAgIHRoaXMuc2VsZWN0Q29sdW1uKHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVvcmRlciBjb2x1bW5zXG4gICAqL1xuICByZW9yZGVyQ29sdW1ucyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29sdW1ucyA9IFsuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zXTtcbiAgICBjb25zdCBbbW92ZWRdID0gY29sdW1ucy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICBjb2x1bW5zLnNwbGljZSh0b0luZGV4LCAwLCBtb3ZlZCk7XG5cbiAgICB0aGlzLnVwZGF0ZVRhYmxlQ29uZmlnKHsgLi4uc3RhdGUudGFibGVDb25maWcsIGNvbHVtbnMgfSk7XG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIGlmIG5lZWRlZFxuICAgIGlmIChzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4ICE9PSBudWxsKSB7XG4gICAgICBsZXQgbmV3SW5kZXggPSBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4O1xuICAgICAgaWYgKHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggPT09IGZyb21JbmRleCkge1xuICAgICAgICBuZXdJbmRleCA9IHRvSW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA8IHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggJiYgdG9JbmRleCA+PSBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4KSB7XG4gICAgICAgIG5ld0luZGV4ID0gc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCAtIDE7XG4gICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA+IHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggJiYgdG9JbmRleCA8PSBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4KSB7XG4gICAgICAgIG5ld0luZGV4ID0gc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCArIDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdENvbHVtbihuZXdJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhIGNvbHVtbiBmb3IgZWRpdGluZ1xuICAgKi9cbiAgc2VsZWN0Q29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICBzZWxlY3RlZENvbHVtbjogeyAuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zW2luZGV4XSB9LFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogaW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBjb2x1bW4gc2VsZWN0aW9uXG4gICAqL1xuICBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVN0YXRlKHtcbiAgICAgIHNlbGVjdGVkQ29sdW1uOiBudWxsLFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICB1cGRhdGVUYWJsZUNvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyhjb25maWcpO1xuICAgIFxuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgdGFibGVDb25maWc6IG1lcmdlZENvbmZpZyxcbiAgICAgIGhhc1Vuc2F2ZWRDaGFuZ2VzOiAhdGhpcy5jb25maWdzRXF1YWwoc3RhdGUubGFzdFNhdmVkQ29uZmlnLCBtZXJnZWRDb25maWcpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRhYmxlLWxldmVsIHNldHRpbmdzIChwYWdpbmF0aW9uLCBzb3J0aW5nLCBldGMuKVxuICAgKi9cbiAgdXBkYXRlVGFibGVTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxUYWJsZUNvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlQ29uZmlnKHtcbiAgICAgIC4uLnN0YXRlLnRhYmxlQ29uZmlnLFxuICAgICAgLi4uc2V0dGluZ3NcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgcHJldmlldyB2aXNpYmlsaXR5XG4gICAqL1xuICB0b2dnbGVQcmV2aWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgcHJldmlld1Zpc2libGU6ICFzdGF0ZS5wcmV2aWV3VmlzaWJsZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgY29uZmlndXJhdGlvbiBhcyBzYXZlZFxuICAgKi9cbiAgbWFya0FzU2F2ZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICBoYXNVbnNhdmVkQ2hhbmdlczogZmFsc2UsXG4gICAgICBsYXN0U2F2ZWRDb25maWc6IHsgLi4uc3RhdGUudGFibGVDb25maWcgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdGF0ZSAoaW50ZXJuYWwpXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVN0YXRlKHVwZGF0ZXM6IFBhcnRpYWw8QnVpbGRlclN0YXRlPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHsgLi4uY3VycmVudFN0YXRlLCAuLi51cGRhdGVzIH07XG4gICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dChuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdW5pcXVlIGNvbHVtbiBrZXlcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVVbmlxdWVLZXkoYmFzZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubWFwKGNvbCA9PiBjb2wua2V5KSk7XG4gICAgXG4gICAgaWYgKCFleGlzdGluZ0tleXMuaGFzKGJhc2VLZXkpKSB7XG4gICAgICByZXR1cm4gYmFzZUtleTtcbiAgICB9XG5cbiAgICBsZXQgY291bnRlciA9IDE7XG4gICAgbGV0IG5ld0tleSA9IGAke2Jhc2VLZXl9JHtjb3VudGVyfWA7XG4gICAgd2hpbGUgKGV4aXN0aW5nS2V5cy5oYXMobmV3S2V5KSkge1xuICAgICAgY291bnRlcisrO1xuICAgICAgbmV3S2V5ID0gYCR7YmFzZUtleX0ke2NvdW50ZXJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3S2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIGNvbmZpZ3MgZm9yIGVxdWFsaXR5IChkZWVwIGNvbXBhcmlzb24pXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3NFcXVhbChjb25maWcxPzogVGFibGVDb25maWcsIGNvbmZpZzI/OiBUYWJsZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICghY29uZmlnMSB8fCAhY29uZmlnMikge1xuICAgICAgcmV0dXJuIGNvbmZpZzEgPT09IGNvbmZpZzI7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIGNvbXBhcmlzb24gLSBpbiBwcm9kdWN0aW9uLCB1c2UgYSBkZWVwIGVxdWFsaXR5IGxpYnJhcnlcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnMSkgPT09IEpTT04uc3RyaW5naWZ5KGNvbmZpZzIpO1xuICB9XG59XG5cbiJdfQ==