@aquera/ngx-smart-table 0.0.17-alpha → 0.0.19-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 (170) hide show
  1. package/{fesm2020 → fesm2022}/aquera-ngx-smart-table.mjs +1579 -2101
  2. package/fesm2022/aquera-ngx-smart-table.mjs.map +1 -0
  3. package/package.json +8 -16
  4. package/types/aquera-ngx-smart-table.d.ts +5909 -0
  5. package/aquera-ngx-smart-table.d.ts +0 -5
  6. package/esm2020/aquera-ngx-smart-table.mjs +0 -5
  7. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +0 -63
  8. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +0 -115
  9. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +0 -206
  10. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +0 -125
  11. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +0 -105
  12. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +0 -132
  13. package/esm2020/lib/builder/definition-builder.module.mjs +0 -70
  14. package/esm2020/lib/builder/models/builder-state.interface.mjs +0 -5
  15. package/esm2020/lib/builder/services/definition-builder.service.mjs +0 -251
  16. package/esm2020/lib/builder/services/definition-export.service.mjs +0 -167
  17. package/esm2020/lib/builder/services/definition-import.service.mjs +0 -193
  18. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +0 -126
  19. package/esm2020/lib/builder/utils/config-validator.util.mjs +0 -165
  20. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +0 -206
  21. package/esm2020/lib/editors/index.mjs +0 -9
  22. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +0 -228
  23. package/esm2020/lib/editors/nile-calendar-editor.mjs +0 -211
  24. package/esm2020/lib/editors/nile-date-picker-editor.mjs +0 -188
  25. package/esm2020/lib/editors/nile-input-editor.mjs +0 -235
  26. package/esm2020/lib/editors/nile-select-editor.mjs +0 -498
  27. package/esm2020/lib/factories/column-config.factory.mjs +0 -231
  28. package/esm2020/lib/models/autosave-config.interface.mjs +0 -8
  29. package/esm2020/lib/models/base-column-config.class.mjs +0 -253
  30. package/esm2020/lib/models/cell-strategies.interface.mjs +0 -6
  31. package/esm2020/lib/models/cell-types.mjs +0 -147
  32. package/esm2020/lib/models/column-action.interface.mjs +0 -6
  33. package/esm2020/lib/models/column-config.interface.mjs +0 -43
  34. package/esm2020/lib/models/column-config.utils.mjs +0 -101
  35. package/esm2020/lib/models/row-action.interface.mjs +0 -5
  36. package/esm2020/lib/models/row-validator.interface.mjs +0 -2
  37. package/esm2020/lib/models/schema-validation.interface.mjs +0 -2
  38. package/esm2020/lib/models/sheet-action.interface.mjs +0 -5
  39. package/esm2020/lib/models/sheet-config.interface.mjs +0 -5
  40. package/esm2020/lib/models/table-config.interface.mjs +0 -107
  41. package/esm2020/lib/models/table-validator.interface.mjs +0 -2
  42. package/esm2020/lib/models/workbook-action.interface.mjs +0 -5
  43. package/esm2020/lib/models/workbook-config.interface.mjs +0 -5
  44. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +0 -24
  45. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +0 -397
  46. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +0 -103
  47. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +0 -383
  48. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +0 -232
  49. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +0 -97
  50. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +0 -157
  51. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +0 -87
  52. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +0 -167
  53. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +0 -165
  54. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +0 -112
  55. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +0 -1453
  56. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +0 -169
  57. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +0 -581
  58. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +0 -28
  59. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +0 -108
  60. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +0 -83
  61. package/esm2020/lib/renderer/models/cell-state.interface.mjs +0 -66
  62. package/esm2020/lib/renderer/models/cell.class.mjs +0 -389
  63. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +0 -7
  64. package/esm2020/lib/renderer/models/sheet-state.class.mjs +0 -90
  65. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +0 -5
  66. package/esm2020/lib/renderer/models/table-state.class.mjs +0 -871
  67. package/esm2020/lib/renderer/models/table-state.interface.mjs +0 -5
  68. package/esm2020/lib/renderer/models/table-types.mjs +0 -29
  69. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +0 -7
  70. package/esm2020/lib/renderer/models/workbook-state.class.mjs +0 -174
  71. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +0 -5
  72. package/esm2020/lib/renderer/models/z-index.enum.mjs +0 -55
  73. package/esm2020/lib/schemas/table-config.schema.mjs +0 -472
  74. package/esm2020/lib/services/autosave.service.mjs +0 -92
  75. package/esm2020/lib/services/custom-validation-rules.util.mjs +0 -124
  76. package/esm2020/lib/services/json-schema-validator.service.mjs +0 -216
  77. package/esm2020/lib/services/row-validation.service.mjs +0 -42
  78. package/esm2020/lib/services/validation-logger.service.mjs +0 -177
  79. package/esm2020/lib/services/virtual-scroll.service.mjs +0 -52
  80. package/esm2020/lib/shared/shared-table-components.module.mjs +0 -35
  81. package/esm2020/lib/smart-table.module.mjs +0 -124
  82. package/esm2020/lib/strategies/default-editors.mjs +0 -433
  83. package/esm2020/lib/strategies/default-formatters.mjs +0 -238
  84. package/esm2020/lib/strategies/default-validators.mjs +0 -327
  85. package/esm2020/public-api.mjs +0 -146
  86. package/fesm2015/aquera-ngx-smart-table.mjs +0 -12347
  87. package/fesm2015/aquera-ngx-smart-table.mjs.map +0 -1
  88. package/fesm2020/aquera-ngx-smart-table.mjs.map +0 -1
  89. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +0 -31
  90. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +0 -53
  91. package/lib/builder/components/column-editor/column-editor.component.d.ts +0 -69
  92. package/lib/builder/components/column-list/column-list.component.d.ts +0 -65
  93. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +0 -58
  94. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +0 -32
  95. package/lib/builder/definition-builder.module.d.ts +0 -15
  96. package/lib/builder/models/builder-state.interface.d.ts +0 -93
  97. package/lib/builder/services/definition-builder.service.d.ts +0 -80
  98. package/lib/builder/services/definition-export.service.d.ts +0 -59
  99. package/lib/builder/services/definition-import.service.d.ts +0 -31
  100. package/lib/builder/services/sample-data-generator.service.d.ts +0 -41
  101. package/lib/builder/utils/config-validator.util.d.ts +0 -32
  102. package/lib/builder/utils/typescript-generator.util.d.ts +0 -29
  103. package/lib/editors/index.d.ts +0 -8
  104. package/lib/editors/nile-autocomplete-editor.d.ts +0 -102
  105. package/lib/editors/nile-calendar-editor.d.ts +0 -88
  106. package/lib/editors/nile-date-picker-editor.d.ts +0 -97
  107. package/lib/editors/nile-input-editor.d.ts +0 -67
  108. package/lib/editors/nile-select-editor.d.ts +0 -113
  109. package/lib/factories/column-config.factory.d.ts +0 -73
  110. package/lib/models/autosave-config.interface.d.ts +0 -23
  111. package/lib/models/base-column-config.class.d.ts +0 -115
  112. package/lib/models/cell-strategies.interface.d.ts +0 -188
  113. package/lib/models/cell-types.d.ts +0 -337
  114. package/lib/models/column-action.interface.d.ts +0 -86
  115. package/lib/models/column-config.interface.d.ts +0 -272
  116. package/lib/models/column-config.utils.d.ts +0 -37
  117. package/lib/models/row-action.interface.d.ts +0 -86
  118. package/lib/models/row-validator.interface.d.ts +0 -37
  119. package/lib/models/schema-validation.interface.d.ts +0 -42
  120. package/lib/models/sheet-action.interface.d.ts +0 -59
  121. package/lib/models/sheet-config.interface.d.ts +0 -41
  122. package/lib/models/table-config.interface.d.ts +0 -251
  123. package/lib/models/table-validator.interface.d.ts +0 -40
  124. package/lib/models/workbook-action.interface.d.ts +0 -95
  125. package/lib/models/workbook-config.interface.d.ts +0 -107
  126. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +0 -9
  127. package/lib/renderer/components/st-cell/st-cell.component.d.ts +0 -69
  128. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +0 -39
  129. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +0 -139
  130. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +0 -81
  131. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +0 -44
  132. package/lib/renderer/components/st-header/st-header.component.d.ts +0 -93
  133. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +0 -42
  134. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +0 -67
  135. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +0 -98
  136. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +0 -58
  137. package/lib/renderer/components/st-table/st-table.component.d.ts +0 -380
  138. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +0 -77
  139. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +0 -275
  140. package/lib/renderer/directives/click-outside.directive.d.ts +0 -10
  141. package/lib/renderer/directives/st-column-resize.directive.d.ts +0 -44
  142. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +0 -19
  143. package/lib/renderer/models/cell-state.interface.d.ts +0 -118
  144. package/lib/renderer/models/cell.class.d.ts +0 -174
  145. package/lib/renderer/models/row-validation-state.interface.d.ts +0 -27
  146. package/lib/renderer/models/sheet-state.class.d.ts +0 -67
  147. package/lib/renderer/models/sheet-state.interface.d.ts +0 -55
  148. package/lib/renderer/models/table-state.class.d.ts +0 -320
  149. package/lib/renderer/models/table-state.interface.d.ts +0 -18
  150. package/lib/renderer/models/table-types.d.ts +0 -228
  151. package/lib/renderer/models/table-validation-state.interface.d.ts +0 -34
  152. package/lib/renderer/models/workbook-state.class.d.ts +0 -117
  153. package/lib/renderer/models/workbook-state.interface.d.ts +0 -71
  154. package/lib/renderer/models/z-index.enum.d.ts +0 -44
  155. package/lib/schemas/table-config.schema.d.ts +0 -455
  156. package/lib/services/autosave.service.d.ts +0 -73
  157. package/lib/services/custom-validation-rules.util.d.ts +0 -12
  158. package/lib/services/json-schema-validator.service.d.ts +0 -49
  159. package/lib/services/row-validation.service.d.ts +0 -17
  160. package/lib/services/validation-logger.service.d.ts +0 -87
  161. package/lib/services/virtual-scroll.service.d.ts +0 -44
  162. package/lib/shared/shared-table-components.module.d.ts +0 -9
  163. package/lib/smart-table.module.d.ts +0 -26
  164. package/lib/strategies/default-editors.d.ts +0 -109
  165. package/lib/strategies/default-formatters.d.ts +0 -116
  166. package/lib/strategies/default-validators.d.ts +0 -113
  167. package/public-api.d.ts +0 -70
  168. package/src/lib/builder/README.md +0 -30
  169. package/src/lib/editors/README.md +0 -303
  170. package/src/lib/renderer/components/st-column-filter/README.md +0 -286
@@ -1,211 +0,0 @@
1
- /**
2
- * Custom editor using NileCalendar from @aquera/nile-elements
3
- * Provides date selection functionality for table cells
4
- */
5
- /**
6
- * Custom editor that uses NileCalendar component for date selection
7
- * @template T The value type (string by default, formatted as YYYY-MM-DD)
8
- */
9
- export class NileCalendarEditor {
10
- constructor(options) {
11
- this.options = options;
12
- this.acceptsInitialKeypress = false;
13
- this.eventListeners = [];
14
- }
15
- edit(context) {
16
- if (!context.container) {
17
- console.warn('NileCalendarEditor requires a container element');
18
- return;
19
- }
20
- // Create NileCalendar custom element using document.createElement
21
- this.calendar = document.createElement('nile-calendar');
22
- // Set initial value (NileCalendar expects Date object)
23
- if (context.value) {
24
- const dateValue = String(context.value);
25
- // Convert string to Date object
26
- const date = new Date(dateValue);
27
- if (!isNaN(date.getTime())) {
28
- this.calendar.value = date;
29
- }
30
- }
31
- this.calendar.className = 'st-cell-editor st-nile-calendar-editor';
32
- // Apply inline styles for proper cell fitting
33
- this.calendar.style.width = 'inherit';
34
- this.calendar.style.height = 'inherit';
35
- this.calendar.style.boxSizing = 'border-box';
36
- // Apply all configuration options
37
- this.applyOptions();
38
- // Set up event listeners
39
- this.setupEventListeners(context);
40
- // Clear container and append calendar
41
- context.container.innerHTML = '';
42
- context.container.appendChild(this.calendar);
43
- // Auto focus
44
- if (this.options?.autoFocus !== false) {
45
- setTimeout(() => {
46
- this.calendar?.focus();
47
- }, 0);
48
- }
49
- }
50
- /**
51
- * Apply all configuration options to the NileCalendar element
52
- */
53
- applyOptions() {
54
- if (!this.calendar)
55
- return;
56
- // Date format (default: ISO format)
57
- const dateFormat = this.options?.dateFormat || 'YYYY-MM-DD';
58
- this.calendar.setAttribute('dateFormat', dateFormat);
59
- // Basic properties
60
- if (this.options?.disabled) {
61
- this.calendar.setAttribute('disabled', String(this.options.disabled));
62
- }
63
- if (this.options?.placeholder) {
64
- this.calendar.setAttribute('placeholder', this.options.placeholder);
65
- }
66
- if (this.options?.helpText) {
67
- this.calendar.setAttribute('help-text', this.options.helpText);
68
- }
69
- // Behavior options
70
- if (this.options?.allowClear) {
71
- this.calendar.setAttribute('allowClear', String(this.options.allowClear));
72
- }
73
- if (this.options?.doubleClickUnselect) {
74
- this.calendar.setAttribute('doubleClickUnselect', String(this.options.doubleClickUnselect));
75
- }
76
- if (this.options?.showMonthDropdown) {
77
- this.calendar.setAttribute('showMonthDropdown', String(this.options.showMonthDropdown));
78
- }
79
- if (this.options?.showYearDropdown) {
80
- this.calendar.setAttribute('showYearDropdown', String(this.options.showYearDropdown));
81
- }
82
- if (this.options?.showManualInputs) {
83
- this.calendar.setAttribute('showManualInputs', String(this.options.showManualInputs));
84
- }
85
- // Year range
86
- if (this.options?.startYear) {
87
- this.calendar.setAttribute('startYear', String(this.options.startYear));
88
- }
89
- if (this.options?.endYear) {
90
- this.calendar.setAttribute('endYear', String(this.options.endYear));
91
- }
92
- // Allowed dates range
93
- if (this.options?.allowedDates) {
94
- this.calendar.setAttribute('allowedDates', JSON.stringify(this.options.allowedDates));
95
- }
96
- // Visual states - using attributes for properties that may not exist
97
- if (this.options?.warning) {
98
- this.calendar.setAttribute('warning', String(this.options.warning));
99
- }
100
- if (this.options?.error) {
101
- this.calendar.setAttribute('error', String(this.options.error));
102
- }
103
- if (this.options?.success) {
104
- this.calendar.setAttribute('success', String(this.options.success));
105
- }
106
- if (this.options?.errorMessage) {
107
- this.calendar.setAttribute('error-message', this.options.errorMessage);
108
- }
109
- // Size
110
- if (this.options?.size) {
111
- this.calendar.setAttribute('size', this.options.size);
112
- }
113
- }
114
- /**
115
- * Set up all event listeners with proper cleanup tracking
116
- */
117
- setupEventListeners(context) {
118
- if (!this.calendar)
119
- return;
120
- const validateOnSave = this.options?.validateOnSave !== false;
121
- // Handle keyboard events (keydown is not replaced by custom events)
122
- const keydownHandler = (e) => {
123
- const keyEvent = e;
124
- if (keyEvent.key === 'Enter') {
125
- keyEvent.preventDefault();
126
- keyEvent.stopPropagation();
127
- this.saveValue(context, validateOnSave);
128
- }
129
- else if (keyEvent.key === 'Escape') {
130
- keyEvent.preventDefault();
131
- keyEvent.stopPropagation();
132
- context.onCancel();
133
- }
134
- else if (keyEvent.key === 'Tab') {
135
- keyEvent.preventDefault();
136
- keyEvent.stopPropagation();
137
- this.saveValue(context, validateOnSave);
138
- }
139
- };
140
- this.calendar.addEventListener('keydown', keydownHandler);
141
- this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
142
- // Use nile-change custom event for date selection
143
- const changeHandler = (e) => {
144
- const customEvent = e;
145
- context.onSave(this.parseValue(customEvent.detail.value));
146
- };
147
- this.calendar.addEventListener('nile-change', changeHandler);
148
- this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
149
- // Use nile-blur custom event (save on blur)
150
- const blurHandler = (e) => {
151
- const customEvent = e;
152
- // Note: NileCalendar may not have validation methods
153
- // Validation should be handled by the validator strategy instead
154
- context.onSave(this.parseValue(customEvent.detail.value));
155
- };
156
- this.calendar.addEventListener('nile-blur', blurHandler);
157
- this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
158
- // Handle clear button if enabled
159
- if (this.options?.allowClear) {
160
- const clearHandler = (e) => {
161
- context.onSave(this.parseValue(''));
162
- };
163
- this.calendar.addEventListener('nile-clear', clearHandler);
164
- this.eventListeners.push({ event: 'nile-clear', handler: clearHandler });
165
- }
166
- }
167
- /**
168
- * Save value with optional validation
169
- */
170
- saveValue(context, validate) {
171
- if (!this.calendar)
172
- return;
173
- // Note: NileCalendar may not have validation methods
174
- // Validation should be handled by the validator strategy instead
175
- context.onSave(this.getCurrentValue());
176
- }
177
- /**
178
- * Parse value to appropriate type
179
- */
180
- parseValue(value) {
181
- // Value is already in the correct format from nile-calendar
182
- return (value || '');
183
- }
184
- destroy() {
185
- // Remove all event listeners
186
- if (this.calendar) {
187
- this.eventListeners.forEach(({ event, handler }) => {
188
- this.calendar?.removeEventListener(event, handler);
189
- });
190
- this.eventListeners = [];
191
- this.calendar.remove();
192
- this.calendar = undefined;
193
- }
194
- }
195
- focus() {
196
- this.calendar?.focus();
197
- }
198
- getCurrentValue() {
199
- if (!this.calendar)
200
- return '';
201
- // NileCalendar.value is a Date object, convert to ISO string format
202
- if (this.calendar.value instanceof Date) {
203
- const year = this.calendar.value.getFullYear();
204
- const month = String(this.calendar.value.getMonth() + 1).padStart(2, '0');
205
- const day = String(this.calendar.value.getDate()).padStart(2, '0');
206
- return `${year}-${month}-${day}`;
207
- }
208
- return '';
209
- }
210
- }
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jYWxlbmRhci1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2VkaXRvcnMvbmlsZS1jYWxlbmRhci1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBcUVIOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFNN0IsWUFBNkIsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFMaEUsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBR3ZCLG1CQUFjLEdBQXFELEVBQUUsQ0FBQztJQUVYLENBQUM7SUFFcEUsSUFBSSxDQUFDLE9BQTZCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUNoRSxPQUFPO1NBQ1I7UUFFRCxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXhELHVEQUF1RDtRQUN2RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxnQ0FBZ0M7WUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1NBQ0Y7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyx3Q0FBd0MsQ0FBQztRQUVuRSw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FB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Q0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUV6QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxFQUFrQixDQUFDO1FBRTlDLG9FQUFvRTtRQUNwRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxZQUFZLElBQUksRUFBRTtZQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztTQUNsRDtRQUVELE9BQU8sRUFBa0IsQ0FBQztJQUM1QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNhbGVuZGFyIGZyb20gQGFxdWVyYS9uaWxlLWVsZW1lbnRzXG4gKiBQcm92aWRlcyBkYXRlIHNlbGVjdGlvbiBmdW5jdGlvbmFsaXR5IGZvciB0YWJsZSBjZWxsc1xuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIERhdGUgcmFuZ2UgY29uZmlndXJhdGlvbiBmb3IgcmVzdHJpY3RpbmcgYWxsb3dlZCBkYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsbG93ZWREYXRlc1JhbmdlIHtcbiAgLyoqIFN0YXJ0IGRhdGUgaW4gSVNPIGZvcm1hdCAoWVlZWS1NTS1ERCkgKi9cbiAgc3RhcnREYXRlPzogc3RyaW5nO1xuICAvKiogRW5kIGRhdGUgaW4gSVNPIGZvcm1hdCAoWVlZWS1NTS1ERCkgKi9cbiAgZW5kRGF0ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUNhbGVuZGFyRWRpdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmlsZUNhbGVuZGFyRWRpdG9yT3B0aW9ucyB7XG4gIC8vIEJhc2ljIHByb3BlcnRpZXNcbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRhdGUgaXMgc2VsZWN0ZWQgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBEaXNhYmxlIHRoZSBjYWxlbmRhciBjb250cm9sICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIEhlbHAgdGV4dCB0byBkaXNwbGF5IGJlbG93IHRoZSBjb250cm9sICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBcbiAgLy8gRGF0ZSBjb25maWd1cmF0aW9uXG4gIC8qKiBEYXRlIGZvcm1hdCBmb3IgZGlzcGxheSAoZGVmYXVsdDogJ1lZWVktTU0tREQnKSAqL1xuICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAvKiogU3RhcnQgeWVhciBmb3IgeWVhciBkcm9wZG93biAqL1xuICBzdGFydFllYXI/OiBudW1iZXI7XG4gIC8qKiBFbmQgeWVhciBmb3IgeWVhciBkcm9wZG93biAqL1xuICBlbmRZZWFyPzogbnVtYmVyO1xuICAvKiogRGF0ZSByYW5nZSByZXN0cmljdGlvbnMgKi9cbiAgYWxsb3dlZERhdGVzPzogQWxsb3dlZERhdGVzUmFuZ2U7XG4gIFxuICAvLyBCZWhhdmlvciBvcHRpb25zXG4gIC8qKiBTaG93IGNsZWFyIGJ1dHRvbiBmb3IgcmVtb3ZpbmcgZGF0ZSAqL1xuICBhbGxvd0NsZWFyPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IGRvdWJsZS1jbGljayB0byB1bnNlbGVjdCBkYXRlICovXG4gIGRvdWJsZUNsaWNrVW5zZWxlY3Q/OiBib29sZWFuO1xuICAvKiogU2hvdyBtb250aCBzZWxlY3Rpb24gZHJvcGRvd24gKi9cbiAgc2hvd01vbnRoRHJvcGRvd24/OiBib29sZWFuO1xuICAvKiogU2hvdyB5ZWFyIHNlbGVjdGlvbiBkcm9wZG93biAqL1xuICBzaG93WWVhckRyb3Bkb3duPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IG1hbnVhbCBkYXRlIGlucHV0IHZpYSB0ZXh0IGZpZWxkcyAqL1xuICBzaG93TWFudWFsSW5wdXRzPzogYm9vbGVhbjtcbiAgLyoqIEF1dG8tZm9jdXMgdGhlIGNhbGVuZGFyIHdoZW4gZWRpdG9yIG9wZW5zICovXG4gIGF1dG9Gb2N1cz86IGJvb2xlYW47XG4gIFxuICAvLyBWaXN1YWwgc3RhdGVzXG4gIC8qKiBXYXJuaW5nIHN0YXRlIHN0eWxpbmcgKi9cbiAgd2FybmluZz86IGJvb2xlYW47XG4gIC8qKiBFcnJvciBzdGF0ZSBzdHlsaW5nICovXG4gIGVycm9yPzogYm9vbGVhbjtcbiAgLyoqIFN1Y2Nlc3Mgc3RhdGUgc3R5bGluZyAqL1xuICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIFxuICAvLyBTdHlsaW5nXG4gIC8qKiBTaXplIG9mIHRoZSBjYWxlbmRhciBjb250cm9sICovXG4gIHNpemU/OiAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xuICBcbiAgLy8gQWR2YW5jZWQgb3B0aW9uc1xuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlZGl0b3IgdGhhdCB1c2VzIE5pbGVDYWxlbmRhciBjb21wb25lbnQgZm9yIGRhdGUgc2VsZWN0aW9uXG4gKiBAdGVtcGxhdGUgVCBUaGUgdmFsdWUgdHlwZSAoc3RyaW5nIGJ5IGRlZmF1bHQsIGZvcm1hdHRlZCBhcyBZWVlZLU1NLUREKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZUNhbGVuZGFyRWRpdG9yPFQgPSBzdHJpbmc+IGltcGxlbWVudHMgQ2VsbEVkaXRvcjxUPiB7XG4gIGFjY2VwdHNJbml0aWFsS2V5cHJlc3MgPSBmYWxzZTtcbiAgXG4gIHByaXZhdGUgY2FsZW5kYXI/OiBhbnk7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE5pbGVDYWxlbmRhckVkaXRvck9wdGlvbnMpIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignTmlsZUNhbGVuZGFyRWRpdG9yIHJlcXVpcmVzIGEgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgTmlsZUNhbGVuZGFyIGN1c3RvbSBlbGVtZW50IHVzaW5nIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICB0aGlzLmNhbGVuZGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jYWxlbmRhcicpO1xuICAgIFxuICAgIC8vIFNldCBpbml0aWFsIHZhbHVlIChOaWxlQ2FsZW5kYXIgZXhwZWN0cyBEYXRlIG9iamVjdClcbiAgICBpZiAoY29udGV4dC52YWx1ZSkge1xuICAgICAgY29uc3QgZGF0ZVZhbHVlID0gU3RyaW5nKGNvbnRleHQudmFsdWUpO1xuICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gRGF0ZSBvYmplY3RcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlVmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhci52YWx1ZSA9IGRhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMuY2FsZW5kYXIuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY2FsZW5kYXItZWRpdG9yJztcbiAgICBcbiAgICAvLyBBcHBseSBpbmxpbmUgc3R5bGVzIGZvciBwcm9wZXIgY2VsbCBmaXR0aW5nXG4gICAgdGhpcy5jYWxlbmRhci5zdHlsZS53aWR0aCA9ICdpbmhlcml0JztcbiAgICB0aGlzLmNhbGVuZGFyLnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgICB0aGlzLmNhbGVuZGFyLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICBcbiAgICAvLyBBcHBseSBhbGwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAgdGhpcy5hcHBseU9wdGlvbnMoKTtcbiAgICBcbiAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQpO1xuICAgIFxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIGNhbGVuZGFyXG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYWxlbmRhcik7XG4gICAgXG4gICAgLy8gQXV0byBmb2N1c1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGVuZGFyPy5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVDYWxlbmRhciBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGFwcGx5T3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXIpIHJldHVybjtcbiAgICBcbiAgICAvLyBEYXRlIGZvcm1hdCAoZGVmYXVsdDogSVNPIGZvcm1hdClcbiAgICBjb25zdCBkYXRlRm9ybWF0ID0gdGhpcy5vcHRpb25zPy5kYXRlRm9ybWF0IHx8ICdZWVlZLU1NLUREJztcbiAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnZGF0ZUZvcm1hdCcsIGRhdGVGb3JtYXQpO1xuICAgIFxuICAgIC8vIEJhc2ljIHByb3BlcnRpZXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgU3RyaW5nKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uaGVscFRleHQpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdoZWxwLXRleHQnLCB0aGlzLm9wdGlvbnMuaGVscFRleHQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBCZWhhdmlvciBvcHRpb25zXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYWxsb3dDbGVhcikge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ2FsbG93Q2xlYXInLCBTdHJpbmcodGhpcy5vcHRpb25zLmFsbG93Q2xlYXIpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZG91YmxlQ2xpY2tVbnNlbGVjdCkge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ2RvdWJsZUNsaWNrVW5zZWxlY3QnLCBTdHJpbmcodGhpcy5vcHRpb25zLmRvdWJsZUNsaWNrVW5zZWxlY3QpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2hvd01vbnRoRHJvcGRvd24pIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdzaG93TW9udGhEcm9wZG93bicsIFN0cmluZyh0aGlzLm9wdGlvbnMuc2hvd01vbnRoRHJvcGRvd24pKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2hvd1llYXJEcm9wZG93bikge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ3Nob3dZZWFyRHJvcGRvd24nLCBTdHJpbmcodGhpcy5vcHRpb25zLnNob3dZZWFyRHJvcGRvd24pKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2hvd01hbnVhbElucHV0cykge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ3Nob3dNYW51YWxJbnB1dHMnLCBTdHJpbmcodGhpcy5vcHRpb25zLnNob3dNYW51YWxJbnB1dHMpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gWWVhciByYW5nZVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnN0YXJ0WWVhcikge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ3N0YXJ0WWVhcicsIFN0cmluZyh0aGlzLm9wdGlvbnMuc3RhcnRZZWFyKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuZFllYXIpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdlbmRZZWFyJywgU3RyaW5nKHRoaXMub3B0aW9ucy5lbmRZZWFyKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbG93ZWQgZGF0ZXMgcmFuZ2VcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hbGxvd2VkRGF0ZXMpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdhbGxvd2VkRGF0ZXMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMuYWxsb3dlZERhdGVzKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZpc3VhbCBzdGF0ZXMgLSB1c2luZyBhdHRyaWJ1dGVzIGZvciBwcm9wZXJ0aWVzIHRoYXQgbWF5IG5vdCBleGlzdFxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lndhcm5pbmcpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCd3YXJuaW5nJywgU3RyaW5nKHRoaXMub3B0aW9ucy53YXJuaW5nKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnZXJyb3InLCBTdHJpbmcodGhpcy5vcHRpb25zLmVycm9yKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdzdWNjZXNzJywgU3RyaW5nKHRoaXMub3B0aW9ucy5zdWNjZXNzKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ2Vycm9yLW1lc3NhZ2UnLCB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU2l6ZVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpemUpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdzaXplJywgdGhpcy5vcHRpb25zLnNpemUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYWxsIGV2ZW50IGxpc3RlbmVycyB3aXRoIHByb3BlciBjbGVhbnVwIHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXIpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCB2YWxpZGF0ZU9uU2F2ZSA9IHRoaXMub3B0aW9ucz8udmFsaWRhdGVPblNhdmUgIT09IGZhbHNlO1xuICAgIFxuICAgIC8vIEhhbmRsZSBrZXlib2FyZCBldmVudHMgKGtleWRvd24gaXMgbm90IHJlcGxhY2VkIGJ5IGN1c3RvbSBldmVudHMpXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleUV2ZW50ID0gZSBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgaWYgKGtleUV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgICAgfSBlbHNlIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuY2FsZW5kYXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcbiAgICBcbiAgICAvLyBVc2UgbmlsZS1jaGFuZ2UgY3VzdG9tIGV2ZW50IGZvciBkYXRlIHNlbGVjdGlvblxuICAgIGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIGNvbnRleHQub25TYXZlKHRoaXMucGFyc2VWYWx1ZShjdXN0b21FdmVudC5kZXRhaWwudmFsdWUpKTtcbiAgICB9O1xuICAgIHRoaXMuY2FsZW5kYXIuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1jaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtY2hhbmdlJywgaGFuZGxlcjogY2hhbmdlSGFuZGxlciB9KTtcbiAgICBcbiAgICAvLyBVc2UgbmlsZS1ibHVyIGN1c3RvbSBldmVudCAoc2F2ZSBvbiBibHVyKVxuICAgIGNvbnN0IGJsdXJIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICAvLyBOb3RlOiBOaWxlQ2FsZW5kYXIgbWF5IG5vdCBoYXZlIHZhbGlkYXRpb24gbWV0aG9kc1xuICAgICAgLy8gVmFsaWRhdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgdmFsaWRhdG9yIHN0cmF0ZWd5IGluc3RlYWRcbiAgICAgIGNvbnRleHQub25TYXZlKHRoaXMucGFyc2VWYWx1ZShjdXN0b21FdmVudC5kZXRhaWwudmFsdWUpKTtcbiAgICB9O1xuICAgIHRoaXMuY2FsZW5kYXIuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1ibHVyJywgYmx1ckhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1ibHVyJywgaGFuZGxlcjogYmx1ckhhbmRsZXIgfSk7XG4gICAgXG4gICAgLy8gSGFuZGxlIGNsZWFyIGJ1dHRvbiBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYWxsb3dDbGVhcikge1xuICAgICAgY29uc3QgY2xlYXJIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMucGFyc2VWYWx1ZSgnJykpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuY2FsZW5kYXIuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1jbGVhcicsIGNsZWFySGFuZGxlcik7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtY2xlYXInLCBoYW5kbGVyOiBjbGVhckhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXIpIHJldHVybjtcbiAgICBcbiAgICAvLyBOb3RlOiBOaWxlQ2FsZW5kYXIgbWF5IG5vdCBoYXZlIHZhbGlkYXRpb24gbWV0aG9kc1xuICAgIC8vIFZhbGlkYXRpb24gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHZhbGlkYXRvciBzdHJhdGVneSBpbnN0ZWFkXG4gICAgY29udGV4dC5vblNhdmUodGhpcy5nZXRDdXJyZW50VmFsdWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdmFsdWUgdG8gYXBwcm9wcmlhdGUgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBUIHtcbiAgICAvLyBWYWx1ZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm1hdCBmcm9tIG5pbGUtY2FsZW5kYXJcbiAgICByZXR1cm4gKHZhbHVlIHx8ICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuY2FsZW5kYXIpIHtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoeyBldmVudCwgaGFuZGxlciB9KSA9PiB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gW107XG4gICAgICBcbiAgICAgIHRoaXMuY2FsZW5kYXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLmNhbGVuZGFyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsZW5kYXI/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogVCB7XG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyKSByZXR1cm4gJycgYXMgdW5rbm93biBhcyBUO1xuICAgIFxuICAgIC8vIE5pbGVDYWxlbmRhci52YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCBjb252ZXJ0IHRvIElTTyBzdHJpbmcgZm9ybWF0XG4gICAgaWYgKHRoaXMuY2FsZW5kYXIudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5jYWxlbmRhci52YWx1ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcodGhpcy5jYWxlbmRhci52YWx1ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IGRheSA9IFN0cmluZyh0aGlzLmNhbGVuZGFyLnZhbHVlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuICcnIGFzIHVua25vd24gYXMgVDtcbiAgfVxufVxuIl19
@@ -1,188 +0,0 @@
1
- /**
2
- * Custom editor using NileDatePicker from @aquera/nile-elements
3
- * Supports both single date and range selection with slot-based trigger div
4
- * Returns string values for both modes:
5
- * - Single mode: 'YYYY-MM-DD'
6
- * - Range mode: 'YYYY-MM-DD - YYYY-MM-DD'
7
- */
8
- /**
9
- * Custom editor using NileDatePicker component
10
- * Supports both single date and range selection
11
- * @template T The value type - string for both single and range modes
12
- * Single mode: 'YYYY-MM-DD'
13
- * Range mode: 'YYYY-MM-DD - YYYY-MM-DD'
14
- */
15
- export class NileDatePickerEditor {
16
- constructor(options) {
17
- this.options = options;
18
- this.acceptsInitialKeypress = false;
19
- this.eventListeners = [];
20
- }
21
- edit(context) {
22
- if (!context.container) {
23
- console.warn('NileDatePickerEditor requires a container element');
24
- return;
25
- }
26
- // Create NileDatePicker using document.createElement
27
- this.datePicker = document.createElement('nile-date-picker');
28
- this.datePicker.className = 'st-cell-editor st-nile-date-picker-editor';
29
- // Apply styles for cell fitting
30
- this.datePicker.style.width = 'inherit';
31
- this.datePicker.style.height = 'inherit';
32
- this.datePicker.style.boxSizing = 'border-box';
33
- // Create trigger div with slot
34
- this.triggerDiv = document.createElement('div');
35
- this.triggerDiv.setAttribute('slot', 'trigger');
36
- this.triggerDiv.setAttribute('contenteditable', 'false');
37
- this.triggerDiv.style.width = '100%';
38
- this.triggerDiv.style.minHeight = '28px';
39
- this.triggerDiv.style.cursor = 'pointer';
40
- this.triggerDiv.style.boxSizing = 'border-box';
41
- // Set initial value
42
- this.setInitialValue(context.value);
43
- // Apply configuration options
44
- this.applyOptions();
45
- // Append trigger to date picker (slot-based)
46
- this.datePicker.appendChild(this.triggerDiv);
47
- // Set up event listeners
48
- this.setupEventListeners(context);
49
- // Append to container
50
- context.container.innerHTML = '';
51
- context.container.appendChild(this.datePicker);
52
- // Auto focus and open the date picker
53
- if (this.options?.autoFocus !== false) {
54
- setTimeout(() => {
55
- this.triggerDiv?.focus();
56
- // Trigger a click to open the date picker dropdown
57
- this.triggerDiv?.click();
58
- }, 0);
59
- }
60
- }
61
- /**
62
- * Set initial value in the trigger div
63
- */
64
- setInitialValue(value) {
65
- if (!this.triggerDiv)
66
- return;
67
- if (!value) {
68
- this.triggerDiv.textContent = '';
69
- return;
70
- }
71
- // Both single and range modes use string value
72
- this.triggerDiv.textContent = String(value);
73
- }
74
- /**
75
- * Apply configuration options to the date picker
76
- * Note: Trigger is now a simple div, so input-specific options are not applied
77
- */
78
- applyOptions() {
79
- if (!this.datePicker)
80
- return;
81
- // Configure NileDatePicker
82
- const dateFormat = this.options?.dateFormat || 'YYYY-MM-DD';
83
- this.datePicker.setAttribute('dateFormat', dateFormat);
84
- if (this.options?.range) {
85
- this.datePicker.setAttribute('range', String(this.options.range));
86
- }
87
- if (this.options?.syncDatePicker) {
88
- this.datePicker.setAttribute('syncDatePicker', String(this.options.syncDatePicker));
89
- }
90
- // Trigger div styling (disabled state can be indicated with opacity)
91
- if (this.triggerDiv && this.options?.disabled) {
92
- this.triggerDiv.style.opacity = '0.5';
93
- this.triggerDiv.style.pointerEvents = 'none';
94
- }
95
- }
96
- /**
97
- * Set up all event listeners with proper cleanup tracking
98
- */
99
- setupEventListeners(context) {
100
- if (!this.datePicker || !this.triggerDiv)
101
- return;
102
- const validateOnSave = this.options?.validateOnSave !== false;
103
- // Keyboard events on trigger div
104
- const keydownHandler = (e) => {
105
- const keyEvent = e;
106
- if (keyEvent.key === 'Enter') {
107
- keyEvent.preventDefault();
108
- keyEvent.stopPropagation();
109
- this.saveValue(context, validateOnSave);
110
- }
111
- else if (keyEvent.key === 'Escape') {
112
- keyEvent.preventDefault();
113
- keyEvent.stopPropagation();
114
- context.onCancel();
115
- }
116
- else if (keyEvent.key === 'Tab') {
117
- keyEvent.preventDefault();
118
- keyEvent.stopPropagation();
119
- this.saveValue(context, validateOnSave);
120
- }
121
- else {
122
- // Prevent all other keypresses from typing into the div
123
- keyEvent.preventDefault();
124
- }
125
- };
126
- this.triggerDiv.addEventListener('keydown', keydownHandler);
127
- this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
128
- // nile-change event on date picker
129
- const changeHandler = (e) => {
130
- const customEvent = e;
131
- // NileDatePicker detail has startDate and endDate, not a single value
132
- const detail = customEvent.detail;
133
- let dateValue = '';
134
- if (detail.startDate && detail.endDate) {
135
- // Range mode: combine startDate and endDate
136
- dateValue = `${detail.startDate} - ${detail.endDate}`;
137
- }
138
- else if (detail.startDate) {
139
- // Single mode: only startDate
140
- dateValue = detail.startDate;
141
- }
142
- context.onSave(this.parseValue(dateValue));
143
- };
144
- this.datePicker.addEventListener('nile-change', changeHandler);
145
- this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
146
- }
147
- /**
148
- * Save value with optional validation
149
- */
150
- saveValue(context, validate) {
151
- if (!this.datePicker)
152
- return;
153
- context.onSave(this.getCurrentValue());
154
- }
155
- /**
156
- * Parse value from string to appropriate type
157
- */
158
- parseValue(value) {
159
- // Both single and range modes return string
160
- // Single mode: 'YYYY-MM-DD'
161
- // Range mode: 'YYYY-MM-DD - YYYY-MM-DD'
162
- return (value || '');
163
- }
164
- getCurrentValue() {
165
- if (!this.triggerDiv) {
166
- return '';
167
- }
168
- return this.parseValue(this.triggerDiv.textContent ?? '');
169
- }
170
- destroy() {
171
- if (this.datePicker || this.triggerDiv) {
172
- this.eventListeners.forEach(({ event, handler }) => {
173
- this.datePicker?.removeEventListener(event, handler);
174
- this.triggerDiv?.removeEventListener(event, handler);
175
- });
176
- this.eventListeners = [];
177
- if (this.datePicker) {
178
- this.datePicker.remove();
179
- this.datePicker = undefined;
180
- }
181
- this.triggerDiv = undefined;
182
- }
183
- }
184
- focus() {
185
- this.triggerDiv?.focus();
186
- }
187
- }
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1kYXRlLXBpY2tlci1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2VkaXRvcnMvbmlsZS1kYXRlLXBpY2tlci1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBa0VIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFBNkIsT0FBcUM7UUFBckMsWUFBTyxHQUFQLE9BQU8sQ0FBOEI7UUFObEUsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBSXZCLG1CQUFjLEdBQXFELEVBQUUsQ0FBQztJQUVULENBQUM7SUFFdEUsSUFBSSxDQUFDLE9BQTZCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELENBQUMsQ0FBQztZQUNsRSxPQUFPO1NBQ1I7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsMkNBQTJDLENBQUM7UUFFeEUsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO1FBRS9DLCtCQUErQjtRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFD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UUFDNUIsd0NBQXdDO1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFpQixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsT0FBTyxFQUFrQixDQUFDO1NBQzNCO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUV6QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO2FBQzdCO1lBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVEYXRlUGlja2VyIGZyb20gQGFxdWVyYS9uaWxlLWVsZW1lbnRzXG4gKiBTdXBwb3J0cyBib3RoIHNpbmdsZSBkYXRlIGFuZCByYW5nZSBzZWxlY3Rpb24gd2l0aCBzbG90LWJhc2VkIHRyaWdnZXIgZGl2XG4gKiBSZXR1cm5zIHN0cmluZyB2YWx1ZXMgZm9yIGJvdGggbW9kZXM6XG4gKiAgIC0gU2luZ2xlIG1vZGU6ICdZWVlZLU1NLUREJ1xuICogICAtIFJhbmdlIG1vZGU6ICdZWVlZLU1NLUREIC0gWVlZWS1NTS1ERCdcbiAqL1xuXG5pbXBvcnQgeyBDZWxsRWRpdG9yLCBDZWxsRWRpdG9yQ29udGV4dCB9IGZyb20gJy4uL21vZGVscy9jZWxsLXN0cmF0ZWdpZXMuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBEYXRlIHJhbmdlIHZhbHVlIGludGVyZmFjZSAoa2VwdCBmb3IgcmVmZXJlbmNlIGJ1dCBub3QgdXNlZCBhcyByZXR1cm4gdHlwZSlcbiAqIFRoZSBlZGl0b3IgcmV0dXJucyBzdHJpbmcgdmFsdWVzIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAvKiogU3RhcnQgZGF0ZSBpbiBJU08gZm9ybWF0IChZWVlZLU1NLUREKSAqL1xuICBzdGFydERhdGU6IHN0cmluZztcbiAgLyoqIEVuZCBkYXRlIGluIElTTyBmb3JtYXQgKFlZWVktTU0tREQpICovXG4gIGVuZERhdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZURhdGVQaWNrZXJFZGl0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaWxlRGF0ZVBpY2tlckVkaXRvck9wdGlvbnMge1xuICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBkYXRlIGlzIHNlbGVjdGVkICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogTGFiZWwgZm9yIHRoZSB0cmlnZ2VyIGlucHV0ICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogRGlzYWJsZSB0aGUgZGF0ZSBwaWNrZXIgY29udHJvbCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBIZWxwIHRleHQgdG8gZGlzcGxheSBiZWxvdyB0aGUgY29udHJvbCAqL1xuICBoZWxwVGV4dD86IHN0cmluZztcbiAgXG4gIC8vIERhdGUgY29uZmlndXJhdGlvblxuICAvKiogRGF0ZSBmb3JtYXQgZm9yIGRpc3BsYXkgKGRlZmF1bHQ6ICdZWVlZLU1NLUREJykgKi9cbiAgZGF0ZUZvcm1hdD86IHN0cmluZztcbiAgLyoqIEVuYWJsZSByYW5nZSBzZWxlY3Rpb24gbW9kZSAqL1xuICByYW5nZT86IGJvb2xlYW47XG4gIC8qKiBTeW5jIGRhdGUgcGlja2VycyBpbiByYW5nZSBtb2RlICovXG4gIHN5bmNEYXRlUGlja2VyPzogYm9vbGVhbjtcbiAgXG4gIC8vIEJlaGF2aW9yIG9wdGlvbnNcbiAgLyoqIFNob3cgY2xlYXIgYnV0dG9uIGZvciByZW1vdmluZyBkYXRlICovXG4gIGNsZWFyYWJsZT86IGJvb2xlYW47XG4gIC8qKiBBdXRvLWZvY3VzIHRoZSBkYXRlIHBpY2tlciB3aGVuIGVkaXRvciBvcGVucyAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICBcbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogV2FybmluZyBzdGF0ZSBzdHlsaW5nICovXG4gIHdhcm5pbmc/OiBib29sZWFuO1xuICAvKiogRXJyb3Igc3RhdGUgc3R5bGluZyAqL1xuICBlcnJvcj86IGJvb2xlYW47XG4gIC8qKiBTdWNjZXNzIHN0YXRlIHN0eWxpbmcgKi9cbiAgc3VjY2Vzcz86IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBcbiAgLy8gU3R5bGluZyAoZm9yIHRyaWdnZXIgaW5wdXQpXG4gIC8qKiBTaXplIG9mIHRoZSBkYXRlIHBpY2tlciBjb250cm9sICovXG4gIHNpemU/OiBudW1iZXI7XG4gIC8qKiBGaWxsZWQgc3R5bGUgZm9yIHRoZSBpbnB1dCAqL1xuICBmaWxsZWQ/OiBib29sZWFuO1xuICAvKiogUGlsbCBzdHlsZSBmb3IgdGhlIGlucHV0ICovXG4gIHBpbGw/OiBib29sZWFuO1xuICBcbiAgLy8gQWR2YW5jZWRcbiAgLyoqIFZhbGlkYXRlIGJlZm9yZSBzYXZpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIHZhbGlkYXRlT25TYXZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVEYXRlUGlja2VyIGNvbXBvbmVudFxuICogU3VwcG9ydHMgYm90aCBzaW5nbGUgZGF0ZSBhbmQgcmFuZ2Ugc2VsZWN0aW9uXG4gKiBAdGVtcGxhdGUgVCBUaGUgdmFsdWUgdHlwZSAtIHN0cmluZyBmb3IgYm90aCBzaW5nbGUgYW5kIHJhbmdlIG1vZGVzXG4gKiAgICAgICAgICAgIFNpbmdsZSBtb2RlOiAnWVlZWS1NTS1ERCdcbiAqICAgICAgICAgICAgUmFuZ2UgbW9kZTogJ1lZWVktTU0tREQgLSBZWVlZLU1NLUREJ1xuICovXG5leHBvcnQgY2xhc3MgTmlsZURhdGVQaWNrZXJFZGl0b3I8VCA9IHN0cmluZz4gaW1wbGVtZW50cyBDZWxsRWRpdG9yPFQ+IHtcbiAgYWNjZXB0c0luaXRpYWxLZXlwcmVzcyA9IGZhbHNlO1xuICBcbiAgcHJpdmF0ZSBkYXRlUGlja2VyPzogYW55O1xuICBwcml2YXRlIHRyaWdnZXJEaXY/OiBhbnk7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE5pbGVEYXRlUGlja2VyRWRpdG9yT3B0aW9ucykge31cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlRGF0ZVBpY2tlckVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE5pbGVEYXRlUGlja2VyIHVzaW5nIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICB0aGlzLmRhdGVQaWNrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWRhdGUtcGlja2VyJyk7XG4gICAgdGhpcy5kYXRlUGlja2VyLmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1uaWxlLWRhdGUtcGlja2VyLWVkaXRvcic7XG4gICAgXG4gICAgLy8gQXBwbHkgc3R5bGVzIGZvciBjZWxsIGZpdHRpbmdcbiAgICB0aGlzLmRhdGVQaWNrZXIuc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5kYXRlUGlja2VyLnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgICB0aGlzLmRhdGVQaWNrZXIuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0cmlnZ2VyIGRpdiB3aXRoIHNsb3RcbiAgICB0aGlzLnRyaWdnZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnRyaWdnZXJEaXYuc2V0QXR0cmlidXRlKCdzbG90JywgJ3RyaWdnZXInKTtcbiAgICB0aGlzLnRyaWdnZXJEaXYuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKTtcbiAgICB0aGlzLnRyaWdnZXJEaXYuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy50cmlnZ2VyRGl2LnN0eWxlLm1pbkhlaWdodCA9ICcyOHB4JztcbiAgICB0aGlzLnRyaWdnZXJEaXYuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgIHRoaXMudHJpZ2dlckRpdi5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgXG4gICAgLy8gU2V0IGluaXRpYWwgdmFsdWVcbiAgICB0aGlzLnNldEluaXRpYWxWYWx1ZShjb250ZXh0LnZhbHVlKTtcbiAgICBcbiAgICBcbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuICAgIFxuICAgIC8vIEFwcGVuZCB0cmlnZ2VyIHRvIGRhdGUgcGlja2VyIChzbG90LWJhc2VkKVxuICAgIHRoaXMuZGF0ZVBpY2tlci5hcHBlbmRDaGlsZCh0aGlzLnRyaWdnZXJEaXYpO1xuICAgIFxuICAgIC8vIFNldCB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dCk7XG4gICAgXG4gICAgLy8gQXBwZW5kIHRvIGNvbnRhaW5lclxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZGF0ZVBpY2tlcik7XG4gICAgXG4gICAgLy8gQXV0byBmb2N1cyBhbmQgb3BlbiB0aGUgZGF0ZSBwaWNrZXJcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRGl2Py5mb2N1cygpO1xuICAgICAgICAvLyBUcmlnZ2VyIGEgY2xpY2sgdG8gb3BlbiB0aGUgZGF0ZSBwaWNrZXIgZHJvcGRvd25cbiAgICAgICAgdGhpcy50cmlnZ2VyRGl2Py5jbGljaygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbml0aWFsIHZhbHVlIGluIHRoZSB0cmlnZ2VyIGRpdlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRJbml0aWFsVmFsdWUodmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXJEaXYpIHJldHVybjtcbiAgICBcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJEaXYudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gQm90aCBzaW5nbGUgYW5kIHJhbmdlIG1vZGVzIHVzZSBzdHJpbmcgdmFsdWVcbiAgICB0aGlzLnRyaWdnZXJEaXYudGV4dENvbnRlbnQgPSBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgZGF0ZSBwaWNrZXJcbiAgICogTm90ZTogVHJpZ2dlciBpcyBub3cgYSBzaW1wbGUgZGl2LCBzbyBpbnB1dC1zcGVjaWZpYyBvcHRpb25zIGFyZSBub3QgYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGVQaWNrZXIpIHJldHVybjtcbiAgICBcbiAgICAvLyBDb25maWd1cmUgTmlsZURhdGVQaWNrZXJcbiAgICBjb25zdCBkYXRlRm9ybWF0ID0gdGhpcy5vcHRpb25zPy5kYXRlRm9ybWF0IHx8ICdZWVlZLU1NLUREJztcbiAgICB0aGlzLmRhdGVQaWNrZXIuc2V0QXR0cmlidXRlKCdkYXRlRm9ybWF0JywgZGF0ZUZvcm1hdCk7XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucmFuZ2UpIHtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5zZXRBdHRyaWJ1dGUoJ3JhbmdlJywgU3RyaW5nKHRoaXMub3B0aW9ucy5yYW5nZSkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zPy5zeW5jRGF0ZVBpY2tlcikge1xuICAgICAgdGhpcy5kYXRlUGlja2VyLnNldEF0dHJpYnV0ZSgnc3luY0RhdGVQaWNrZXInLCBTdHJpbmcodGhpcy5vcHRpb25zLnN5bmNEYXRlUGlja2VyKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRyaWdnZXIgZGl2IHN0eWxpbmcgKGRpc2FibGVkIHN0YXRlIGNhbiBiZSBpbmRpY2F0ZWQgd2l0aCBvcGFjaXR5KVxuICAgIGlmICh0aGlzLnRyaWdnZXJEaXYgJiYgdGhpcy5vcHRpb25zPy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy50cmlnZ2VyRGl2LnN0eWxlLm9wYWNpdHkgPSAnMC41JztcbiAgICAgIHRoaXMudHJpZ2dlckRpdi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYWxsIGV2ZW50IGxpc3RlbmVycyB3aXRoIHByb3BlciBjbGVhbnVwIHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0ZVBpY2tlciB8fCAhdGhpcy50cmlnZ2VyRGl2KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdmFsaWRhdGVPblNhdmUgPSB0aGlzLm9wdGlvbnM/LnZhbGlkYXRlT25TYXZlICE9PSBmYWxzZTtcbiAgICBcbiAgICAvLyBLZXlib2FyZCBldmVudHMgb24gdHJpZ2dlciBkaXZcbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5RXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUHJldmVudCBhbGwgb3RoZXIga2V5cHJlc3NlcyBmcm9tIHR5cGluZyBpbnRvIHRoZSBkaXZcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMudHJpZ2dlckRpdi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAna2V5ZG93bicsIGhhbmRsZXI6IGtleWRvd25IYW5kbGVyIH0pO1xuICAgIFxuICAgIC8vIG5pbGUtY2hhbmdlIGV2ZW50IG9uIGRhdGUgcGlja2VyXG4gICAgY29uc3QgY2hhbmdlSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgLy8gTmlsZURhdGVQaWNrZXIgZGV0YWlsIGhhcyBzdGFydERhdGUgYW5kIGVuZERhdGUsIG5vdCBhIHNpbmdsZSB2YWx1ZVxuICAgICAgY29uc3QgZGV0YWlsID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuICAgICAgbGV0IGRhdGVWYWx1ZSA9ICcnO1xuICAgICAgXG4gICAgICBpZiAoZGV0YWlsLnN0YXJ0RGF0ZSAmJiBkZXRhaWwuZW5kRGF0ZSkge1xuICAgICAgICAvLyBSYW5nZSBtb2RlOiBjb21iaW5lIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZVxuICAgICAgICBkYXRlVmFsdWUgPSBgJHtkZXRhaWwuc3RhcnREYXRlfSAtICR7ZGV0YWlsLmVuZERhdGV9YDtcbiAgICAgIH0gZWxzZSBpZiAoZGV0YWlsLnN0YXJ0RGF0ZSkge1xuICAgICAgICAvLyBTaW5nbGUgbW9kZTogb25seSBzdGFydERhdGVcbiAgICAgICAgZGF0ZVZhbHVlID0gZGV0YWlsLnN0YXJ0RGF0ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29udGV4dC5vblNhdmUodGhpcy5wYXJzZVZhbHVlKGRhdGVWYWx1ZSkpO1xuICAgIH07XG4gICAgdGhpcy5kYXRlUGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgY2hhbmdlSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWNoYW5nZScsIGhhbmRsZXI6IGNoYW5nZUhhbmRsZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB2YWx1ZSB3aXRoIG9wdGlvbmFsIHZhbGlkYXRpb25cbiAgICovXG4gIHByaXZhdGUgc2F2ZVZhbHVlKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+LCB2YWxpZGF0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRlUGlja2VyKSByZXR1cm47XG4gICAgY29udGV4dC5vblNhdmUodGhpcy5nZXRDdXJyZW50VmFsdWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdmFsdWUgZnJvbSBzdHJpbmcgdG8gYXBwcm9wcmlhdGUgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBUIHtcbiAgICAvLyBCb3RoIHNpbmdsZSBhbmQgcmFuZ2UgbW9kZXMgcmV0dXJuIHN0cmluZ1xuICAgIC8vIFNpbmdsZSBtb2RlOiAnWVlZWS1NTS1ERCdcbiAgICAvLyBSYW5nZSBtb2RlOiAnWVlZWS1NTS1ERCAtIFlZWVktTU0tREQnXG4gICAgcmV0dXJuICh2YWx1ZSB8fCAnJykgYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IFQge1xuICAgIGlmICghdGhpcy50cmlnZ2VyRGl2KSB7XG4gICAgICByZXR1cm4gJycgYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5wYXJzZVZhbHVlKHRoaXMudHJpZ2dlckRpdi50ZXh0Q29udGVudCA/PyAnJyk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVQaWNrZXIgfHwgdGhpcy50cmlnZ2VyRGl2KSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmRhdGVQaWNrZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnRyaWdnZXJEaXY/LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gW107XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmRhdGVQaWNrZXIpIHtcbiAgICAgICAgdGhpcy5kYXRlUGlja2VyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmRhdGVQaWNrZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMudHJpZ2dlckRpdiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJEaXY/LmZvY3VzKCk7XG4gIH1cbn1cbiJdfQ==