@pecb-ui/components 1.1.2 → 1.2.0

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 (56) hide show
  1. package/README.md +556 -556
  2. package/fesm2022/pecb-ui-components.mjs +3826 -1945
  3. package/fesm2022/pecb-ui-components.mjs.map +1 -1
  4. package/index.d.ts +3937 -3
  5. package/package.json +6 -8
  6. package/esm2022/lib/components/button/button.component.mjs +0 -171
  7. package/esm2022/lib/components/card/card.component.mjs +0 -182
  8. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
  9. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
  11. package/esm2022/lib/components/input/input.component.mjs +0 -321
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
  13. package/esm2022/lib/components/radio/radio.component.mjs +0 -147
  14. package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
  15. package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
  16. package/esm2022/lib/components/status/status.component.mjs +0 -50
  17. package/esm2022/lib/components/tab/tab.component.mjs +0 -151
  18. package/esm2022/lib/components/table/table.component.mjs +0 -503
  19. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
  20. package/esm2022/lib/pecb-components.module.mjs +0 -118
  21. package/esm2022/lib/services/loading.service.mjs +0 -182
  22. package/esm2022/lib/services/notification.service.mjs +0 -144
  23. package/esm2022/lib/services/theme.service.mjs +0 -232
  24. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
  25. package/esm2022/lib/shared/types/common.types.mjs +0 -6
  26. package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
  27. package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
  28. package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
  29. package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
  30. package/esm2022/pecb-ui-components.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -53
  32. package/lib/components/button/button.component.d.ts +0 -130
  33. package/lib/components/card/card.component.d.ts +0 -140
  34. package/lib/components/checkbox/checkbox.component.d.ts +0 -74
  35. package/lib/components/datepicker/datepicker.component.d.ts +0 -155
  36. package/lib/components/dropdown/dropdown.component.d.ts +0 -144
  37. package/lib/components/input/input.component.d.ts +0 -215
  38. package/lib/components/pagination/pagination.component.d.ts +0 -53
  39. package/lib/components/radio/radio.component.d.ts +0 -93
  40. package/lib/components/right-modal/right-modal.component.d.ts +0 -137
  41. package/lib/components/sidebar/sidebar.component.d.ts +0 -97
  42. package/lib/components/status/status.component.d.ts +0 -19
  43. package/lib/components/tab/tab.component.d.ts +0 -102
  44. package/lib/components/table/table.component.d.ts +0 -403
  45. package/lib/components/toggle/toggle.component.d.ts +0 -74
  46. package/lib/pecb-components.module.d.ts +0 -37
  47. package/lib/services/loading.service.d.ts +0 -129
  48. package/lib/services/notification.service.d.ts +0 -136
  49. package/lib/services/theme.service.d.ts +0 -142
  50. package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
  51. package/lib/shared/types/common.types.d.ts +0 -86
  52. package/lib/shared/utils/accessibility.utils.d.ts +0 -167
  53. package/lib/shared/utils/dom.utils.d.ts +0 -108
  54. package/lib/shared/utils/error.utils.d.ts +0 -191
  55. package/lib/shared/utils/string.utils.d.ts +0 -144
  56. package/public-api.d.ts +0 -24
@@ -1,232 +0,0 @@
1
- import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
2
- import { isPlatformBrowser } from '@angular/common';
3
- import { BehaviorSubject } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * Storage key for persisting theme preference
7
- */
8
- const THEME_STORAGE_KEY = 'pecb-ui-theme';
9
- /**
10
- * A stateless, injectable theme service for managing application themes.
11
- *
12
- * This service provides reactive theme management with support for light/dark modes,
13
- * system preference detection, and custom CSS variable overrides.
14
- *
15
- * @example
16
- * ```typescript
17
- * import { ThemeService } from '@pecb-ui/components';
18
- *
19
- * @Component({...})
20
- * export class MyComponent {
21
- * constructor(private themeService: ThemeService) {}
22
- *
23
- * toggleTheme(): void {
24
- * this.themeService.toggleTheme();
25
- * }
26
- *
27
- * setDarkMode(): void {
28
- * this.themeService.setTheme('dark');
29
- * }
30
- * }
31
- * ```
32
- *
33
- * @publicApi
34
- */
35
- export class ThemeService {
36
- constructor(platformId) {
37
- this.mediaQuery = null;
38
- this.isBrowser = isPlatformBrowser(platformId);
39
- const initialTheme = this.getInitialTheme();
40
- this.themeSubject = new BehaviorSubject(this.createThemeConfig(initialTheme));
41
- if (this.isBrowser) {
42
- this.setupSystemThemeListener();
43
- this.applyTheme(this.themeSubject.value);
44
- }
45
- }
46
- /**
47
- * Observable stream of theme configuration changes
48
- */
49
- get theme$() {
50
- return this.themeSubject.asObservable();
51
- }
52
- /**
53
- * Get the current theme configuration
54
- */
55
- get currentTheme() {
56
- return this.themeSubject.value;
57
- }
58
- /**
59
- * Get the current theme mode
60
- */
61
- get currentMode() {
62
- return this.themeSubject.value.mode;
63
- }
64
- /**
65
- * Check if the current resolved theme is dark
66
- */
67
- get isDarkMode() {
68
- return this.themeSubject.value.resolvedTheme === 'dark';
69
- }
70
- /**
71
- * Set the theme mode
72
- * @param mode - The theme mode to set (light, dark, or system)
73
- */
74
- setTheme(mode) {
75
- const config = this.createThemeConfig(mode);
76
- this.themeSubject.next(config);
77
- this.persistTheme(mode);
78
- if (this.isBrowser) {
79
- this.applyTheme(config);
80
- }
81
- }
82
- /**
83
- * Toggle between light and dark themes
84
- * If currently using system preference, switches to the opposite of the resolved theme
85
- */
86
- toggleTheme() {
87
- const current = this.themeSubject.value;
88
- const newMode = current.resolvedTheme === 'light' ? 'dark' : 'light';
89
- this.setTheme(newMode);
90
- }
91
- /**
92
- * Reset to system preference
93
- */
94
- useSystemTheme() {
95
- this.setTheme('system');
96
- }
97
- /**
98
- * Apply custom CSS variables to the document
99
- * @param variables - Object containing CSS variable overrides
100
- */
101
- setCustomVariables(variables) {
102
- if (!this.isBrowser) {
103
- return;
104
- }
105
- const root = document.documentElement;
106
- Object.entries(variables).forEach(([key, value]) => {
107
- if (value !== undefined) {
108
- const cssVarName = this.toCssVariableName(key);
109
- root.style.setProperty(cssVarName, value);
110
- }
111
- });
112
- }
113
- /**
114
- * Remove custom CSS variables from the document
115
- * @param variableNames - Array of variable names to remove
116
- */
117
- removeCustomVariables(variableNames) {
118
- if (!this.isBrowser) {
119
- return;
120
- }
121
- const root = document.documentElement;
122
- variableNames.forEach(name => {
123
- const cssVarName = this.toCssVariableName(name);
124
- root.style.removeProperty(cssVarName);
125
- });
126
- }
127
- /**
128
- * Get the initial theme from storage or system preference
129
- */
130
- getInitialTheme() {
131
- if (!this.isBrowser) {
132
- return 'light';
133
- }
134
- const stored = localStorage.getItem(THEME_STORAGE_KEY);
135
- if (stored && ['light', 'dark', 'system'].includes(stored)) {
136
- return stored;
137
- }
138
- return 'system';
139
- }
140
- /**
141
- * Create a theme configuration object
142
- */
143
- createThemeConfig(mode) {
144
- const resolvedTheme = this.resolveTheme(mode);
145
- return {
146
- mode,
147
- resolvedTheme,
148
- cssClass: `pecb-theme-${resolvedTheme}`
149
- };
150
- }
151
- /**
152
- * Resolve the actual theme from mode (handles 'system' mode)
153
- */
154
- resolveTheme(mode) {
155
- if (mode === 'system') {
156
- return this.getSystemPreference();
157
- }
158
- return mode;
159
- }
160
- /**
161
- * Get the system color scheme preference
162
- */
163
- getSystemPreference() {
164
- if (!this.isBrowser) {
165
- return 'light';
166
- }
167
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
168
- }
169
- /**
170
- * Setup listener for system theme changes
171
- */
172
- setupSystemThemeListener() {
173
- if (!this.isBrowser) {
174
- return;
175
- }
176
- this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
177
- const listener = () => {
178
- if (this.themeSubject.value.mode === 'system') {
179
- const config = this.createThemeConfig('system');
180
- this.themeSubject.next(config);
181
- this.applyTheme(config);
182
- }
183
- };
184
- // Use addEventListener for modern browsers
185
- if (this.mediaQuery.addEventListener) {
186
- this.mediaQuery.addEventListener('change', listener);
187
- }
188
- }
189
- /**
190
- * Apply the theme to the document
191
- */
192
- applyTheme(config) {
193
- if (!this.isBrowser) {
194
- return;
195
- }
196
- const root = document.documentElement;
197
- // Remove existing theme classes
198
- root.classList.remove('pecb-theme-light', 'pecb-theme-dark');
199
- // Add new theme class
200
- root.classList.add(config.cssClass);
201
- // Set data attribute for CSS selectors
202
- root.setAttribute('data-pecb-theme', config.resolvedTheme);
203
- }
204
- /**
205
- * Persist theme preference to storage
206
- */
207
- persistTheme(mode) {
208
- if (!this.isBrowser) {
209
- return;
210
- }
211
- localStorage.setItem(THEME_STORAGE_KEY, mode);
212
- }
213
- /**
214
- * Convert camelCase property name to CSS variable name
215
- */
216
- toCssVariableName(name) {
217
- const kebabCase = name.replace(/([A-Z])/g, '-$1').toLowerCase();
218
- return `--pecb-${kebabCase}`;
219
- }
220
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ThemeService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
221
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ThemeService, providedIn: 'root' }); }
222
- }
223
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ThemeService, decorators: [{
224
- type: Injectable,
225
- args: [{
226
- providedIn: 'root'
227
- }]
228
- }], ctorParameters: () => [{ type: undefined, decorators: [{
229
- type: Inject,
230
- args: [PLATFORM_ID]
231
- }] }] });
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy90aGVtZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQXVDbkQ7O0dBRUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztBQUUxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBS3ZCLFlBQWlDLFVBQWtCO1FBRjNDLGVBQVUsR0FBMEIsSUFBSSxDQUFDO1FBRy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFM0YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FB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UyxFQUFFLENBQUM7SUFDL0IsQ0FBQzsrR0ExTlUsWUFBWSxrQkFLSCxXQUFXO21IQUxwQixZQUFZLGNBRlgsTUFBTTs7NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQU1jLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbi8qKlxyXG4gKiBBdmFpbGFibGUgdGhlbWUgbW9kZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIFRoZW1lTW9kZSA9ICdsaWdodCcgfCAnZGFyaycgfCAnc3lzdGVtJztcclxuXHJcbi8qKlxyXG4gKiBUaGVtZSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaGVtZUNvbmZpZyB7XHJcbiAgLyoqIEN1cnJlbnQgdGhlbWUgbW9kZSAqL1xyXG4gIG1vZGU6IFRoZW1lTW9kZTtcclxuICAvKiogUmVzb2x2ZWQgdGhlbWUgKGxpZ2h0IG9yIGRhcmssIG5ldmVyIHN5c3RlbSkgKi9cclxuICByZXNvbHZlZFRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnO1xyXG4gIC8qKiBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGRvY3VtZW50ICovXHJcbiAgY3NzQ2xhc3M6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSB0aGVtZSB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaGVtZVZhcmlhYmxlcyB7XHJcbiAgLyoqIFByaW1hcnkgY29sb3IgKi9cclxuICBwcmltYXJ5Q29sb3I/OiBzdHJpbmc7XHJcbiAgLyoqIFNlY29uZGFyeSBjb2xvciAqL1xyXG4gIHNlY29uZGFyeUNvbG9yPzogc3RyaW5nO1xyXG4gIC8qKiBCYWNrZ3JvdW5kIGNvbG9yICovXHJcbiAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xyXG4gIC8qKiBUZXh0IGNvbG9yICovXHJcbiAgdGV4dENvbG9yPzogc3RyaW5nO1xyXG4gIC8qKiBCb3JkZXIgcmFkaXVzICovXHJcbiAgYm9yZGVyUmFkaXVzPzogc3RyaW5nO1xyXG4gIC8qKiBGb250IGZhbWlseSAqL1xyXG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XHJcbiAgLyoqIEN1c3RvbSBDU1MgdmFyaWFibGVzICovXHJcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKipcclxuICogU3RvcmFnZSBrZXkgZm9yIHBlcnNpc3RpbmcgdGhlbWUgcHJlZmVyZW5jZVxyXG4gKi9cclxuY29uc3QgVEhFTUVfU1RPUkFHRV9LRVkgPSAncGVjYi11aS10aGVtZSc7XHJcblxyXG4vKipcclxuICogQSBzdGF0ZWxlc3MsIGluamVjdGFibGUgdGhlbWUgc2VydmljZSBmb3IgbWFuYWdpbmcgYXBwbGljYXRpb24gdGhlbWVzLlxyXG4gKlxyXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgcmVhY3RpdmUgdGhlbWUgbWFuYWdlbWVudCB3aXRoIHN1cHBvcnQgZm9yIGxpZ2h0L2RhcmsgbW9kZXMsXHJcbiAqIHN5c3RlbSBwcmVmZXJlbmNlIGRldGVjdGlvbiwgYW5kIGN1c3RvbSBDU1MgdmFyaWFibGUgb3ZlcnJpZGVzLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJ0BwZWNiLXVpL2NvbXBvbmVudHMnO1xyXG4gKlxyXG4gKiBAQ29tcG9uZW50KHsuLi59KVxyXG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xyXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UpIHt9XHJcbiAqXHJcbiAqICAgdG9nZ2xlVGhlbWUoKTogdm9pZCB7XHJcbiAqICAgICB0aGlzLnRoZW1lU2VydmljZS50b2dnbGVUaGVtZSgpO1xyXG4gKiAgIH1cclxuICpcclxuICogICBzZXREYXJrTW9kZSgpOiB2b2lkIHtcclxuICogICAgIHRoaXMudGhlbWVTZXJ2aWNlLnNldFRoZW1lKCdkYXJrJyk7XHJcbiAqICAgfVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljQXBpXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8VGhlbWVDb25maWc+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgbWVkaWFRdWVyeTogTWVkaWFRdWVyeUxpc3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XHJcbiAgICB0aGlzLmlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xyXG5cclxuICAgIGNvbnN0IGluaXRpYWxUaGVtZSA9IHRoaXMuZ2V0SW5pdGlhbFRoZW1lKCk7XHJcbiAgICB0aGlzLnRoZW1lU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGhlbWVDb25maWc+KHRoaXMuY3JlYXRlVGhlbWVDb25maWcoaW5pdGlhbFRoZW1lKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XHJcbiAgICAgIHRoaXMuc2V0dXBTeXN0ZW1UaGVtZUxpc3RlbmVyKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlUaGVtZSh0aGlzLnRoZW1lU3ViamVjdC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIHN0cmVhbSBvZiB0aGVtZSBjb25maWd1cmF0aW9uIGNoYW5nZXNcclxuICAgKi9cclxuICBnZXQgdGhlbWUkKCk6IE9ic2VydmFibGU8VGhlbWVDb25maWc+IHtcclxuICAgIHJldHVybiB0aGlzLnRoZW1lU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCB0aGVtZSBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgZ2V0IGN1cnJlbnRUaGVtZSgpOiBUaGVtZUNvbmZpZyB7XHJcbiAgICByZXR1cm4gdGhpcy50aGVtZVN1YmplY3QudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdGhlbWUgbW9kZVxyXG4gICAqL1xyXG4gIGdldCBjdXJyZW50TW9kZSgpOiBUaGVtZU1vZGUge1xyXG4gICAgcmV0dXJuIHRoaXMudGhlbWVTdWJqZWN0LnZhbHVlLm1vZGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCByZXNvbHZlZCB0aGVtZSBpcyBkYXJrXHJcbiAgICovXHJcbiAgZ2V0IGlzRGFya01vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50aGVtZVN1YmplY3QudmFsdWUucmVzb2x2ZWRUaGVtZSA9PT0gJ2RhcmsnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB0aGVtZSBtb2RlXHJcbiAgICogQHBhcmFtIG1vZGUgLSBUaGUgdGhlbWUgbW9kZSB0byBzZXQgKGxpZ2h0LCBkYXJrLCBvciBzeXN0ZW0pXHJcbiAgICovXHJcbiAgc2V0VGhlbWUobW9kZTogVGhlbWVNb2RlKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNyZWF0ZVRoZW1lQ29uZmlnKG1vZGUpO1xyXG4gICAgdGhpcy50aGVtZVN1YmplY3QubmV4dChjb25maWcpO1xyXG4gICAgdGhpcy5wZXJzaXN0VGhlbWUobW9kZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUaGVtZShjb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGJldHdlZW4gbGlnaHQgYW5kIGRhcmsgdGhlbWVzXHJcbiAgICogSWYgY3VycmVudGx5IHVzaW5nIHN5c3RlbSBwcmVmZXJlbmNlLCBzd2l0Y2hlcyB0byB0aGUgb3Bwb3NpdGUgb2YgdGhlIHJlc29sdmVkIHRoZW1lXHJcbiAgICovXHJcbiAgdG9nZ2xlVGhlbWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy50aGVtZVN1YmplY3QudmFsdWU7XHJcbiAgICBjb25zdCBuZXdNb2RlOiBUaGVtZU1vZGUgPSBjdXJyZW50LnJlc29sdmVkVGhlbWUgPT09ICdsaWdodCcgPyAnZGFyaycgOiAnbGlnaHQnO1xyXG4gICAgdGhpcy5zZXRUaGVtZShuZXdNb2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRvIHN5c3RlbSBwcmVmZXJlbmNlXHJcbiAgICovXHJcbiAgdXNlU3lzdGVtVGhlbWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFRoZW1lKCdzeXN0ZW0nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGN1c3RvbSBDU1MgdmFyaWFibGVzIHRvIHRoZSBkb2N1bWVudFxyXG4gICAqIEBwYXJhbSB2YXJpYWJsZXMgLSBPYmplY3QgY29udGFpbmluZyBDU1MgdmFyaWFibGUgb3ZlcnJpZGVzXHJcbiAgICovXHJcbiAgc2V0Q3VzdG9tVmFyaWFibGVzKHZhcmlhYmxlczogVGhlbWVWYXJpYWJsZXMpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgICBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGNzc1Zhck5hbWUgPSB0aGlzLnRvQ3NzVmFyaWFibGVOYW1lKGtleSk7XHJcbiAgICAgICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eShjc3NWYXJOYW1lLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGN1c3RvbSBDU1MgdmFyaWFibGVzIGZyb20gdGhlIGRvY3VtZW50XHJcbiAgICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgLSBBcnJheSBvZiB2YXJpYWJsZSBuYW1lcyB0byByZW1vdmVcclxuICAgKi9cclxuICByZW1vdmVDdXN0b21WYXJpYWJsZXModmFyaWFibGVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgIGNvbnN0IGNzc1Zhck5hbWUgPSB0aGlzLnRvQ3NzVmFyaWFibGVOYW1lKG5hbWUpO1xyXG4gICAgICByb290LnN0eWxlLnJlbW92ZVByb3BlcnR5KGNzc1Zhck5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGluaXRpYWwgdGhlbWUgZnJvbSBzdG9yYWdlIG9yIHN5c3RlbSBwcmVmZXJlbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRJbml0aWFsVGhlbWUoKTogVGhlbWVNb2RlIHtcclxuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcclxuICAgICAgcmV0dXJuICdsaWdodCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oVEhFTUVfU1RPUkFHRV9LRVkpO1xyXG4gICAgaWYgKHN0b3JlZCAmJiBbJ2xpZ2h0JywgJ2RhcmsnLCAnc3lzdGVtJ10uaW5jbHVkZXMoc3RvcmVkKSkge1xyXG4gICAgICByZXR1cm4gc3RvcmVkIGFzIFRoZW1lTW9kZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJ3N5c3RlbSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSB0aGVtZSBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlVGhlbWVDb25maWcobW9kZTogVGhlbWVNb2RlKTogVGhlbWVDb25maWcge1xyXG4gICAgY29uc3QgcmVzb2x2ZWRUaGVtZSA9IHRoaXMucmVzb2x2ZVRoZW1lKG1vZGUpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbW9kZSxcclxuICAgICAgcmVzb2x2ZWRUaGVtZSxcclxuICAgICAgY3NzQ2xhc3M6IGBwZWNiLXRoZW1lLSR7cmVzb2x2ZWRUaGVtZX1gXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZSB0aGUgYWN0dWFsIHRoZW1lIGZyb20gbW9kZSAoaGFuZGxlcyAnc3lzdGVtJyBtb2RlKVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVRoZW1lKG1vZGU6IFRoZW1lTW9kZSk6ICdsaWdodCcgfCAnZGFyaycge1xyXG4gICAgaWYgKG1vZGUgPT09ICdzeXN0ZW0nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFN5c3RlbVByZWZlcmVuY2UoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtb2RlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzeXN0ZW0gY29sb3Igc2NoZW1lIHByZWZlcmVuY2VcclxuICAgKi9cclxuICBwcml2YXRlIGdldFN5c3RlbVByZWZlcmVuY2UoKTogJ2xpZ2h0JyB8ICdkYXJrJyB7XHJcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XHJcbiAgICAgIHJldHVybiAnbGlnaHQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBsaXN0ZW5lciBmb3Igc3lzdGVtIHRoZW1lIGNoYW5nZXNcclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwU3lzdGVtVGhlbWVMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVkaWFRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJyk7XHJcblxyXG4gICAgY29uc3QgbGlzdGVuZXIgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnRoZW1lU3ViamVjdC52YWx1ZS5tb2RlID09PSAnc3lzdGVtJykge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY3JlYXRlVGhlbWVDb25maWcoJ3N5c3RlbScpO1xyXG4gICAgICAgIHRoaXMudGhlbWVTdWJqZWN0Lm5leHQoY29uZmlnKTtcclxuICAgICAgICB0aGlzLmFwcGx5VGhlbWUoY29uZmlnKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBVc2UgYWRkRXZlbnRMaXN0ZW5lciBmb3IgbW9kZXJuIGJyb3dzZXJzXHJcbiAgICBpZiAodGhpcy5tZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5tZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IHRoZSB0aGVtZSB0byB0aGUgZG9jdW1lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5VGhlbWUoY29uZmlnOiBUaGVtZUNvbmZpZyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuXHJcbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgdGhlbWUgY2xhc3Nlc1xyXG4gICAgcm9vdC5jbGFzc0xpc3QucmVtb3ZlKCdwZWNiLXRoZW1lLWxpZ2h0JywgJ3BlY2ItdGhlbWUtZGFyaycpO1xyXG5cclxuICAgIC8vIEFkZCBuZXcgdGhlbWUgY2xhc3NcclxuICAgIHJvb3QuY2xhc3NMaXN0LmFkZChjb25maWcuY3NzQ2xhc3MpO1xyXG5cclxuICAgIC8vIFNldCBkYXRhIGF0dHJpYnV0ZSBmb3IgQ1NTIHNlbGVjdG9yc1xyXG4gICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGVjYi10aGVtZScsIGNvbmZpZy5yZXNvbHZlZFRoZW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcnNpc3QgdGhlbWUgcHJlZmVyZW5jZSB0byBzdG9yYWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwZXJzaXN0VGhlbWUobW9kZTogVGhlbWVNb2RlKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFRIRU1FX1NUT1JBR0VfS0VZLCBtb2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgY2FtZWxDYXNlIHByb3BlcnR5IG5hbWUgdG8gQ1NTIHZhcmlhYmxlIG5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIHRvQ3NzVmFyaWFibGVOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZWJhYkNhc2UgPSBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgJy0kMScpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gYC0tcGVjYi0ke2tlYmFiQ2FzZX1gO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZXMvY29tcG9uZW50LmludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbG9yVmFyaWFudCwgQ29tcG9uZW50U2l6ZSwgVmFsaWRhdGlvblN0YXRlIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLnR5cGVzJztcclxuXHJcbi8qKlxyXG4gKiBDb21tb24gaW50ZXJmYWNlIGZvciBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGRpc2FibGVkXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERpc2FibGVhYmxlIHtcclxuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkICovXHJcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21tb24gaW50ZXJmYWNlIGZvciBjb21wb25lbnRzIHdpdGggbG9hZGluZyBzdGF0ZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBMb2FkYWJsZSB7XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBhIGxvYWRpbmcgc3RhdGUgKi9cclxuICBsb2FkaW5nOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tbW9uIGludGVyZmFjZSBmb3IgY29tcG9uZW50cyB3aXRoIHNpemUgdmFyaWFudHNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZWFibGUge1xyXG4gIC8qKiBUaGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50ICovXHJcbiAgc2l6ZTogQ29tcG9uZW50U2l6ZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGNvbXBvbmVudHMgd2l0aCBjb2xvciB2YXJpYW50c1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb2xvcmFibGUge1xyXG4gIC8qKiBUaGUgY29sb3IgdmFyaWFudCBvZiB0aGUgY29tcG9uZW50ICovXHJcbiAgdmFyaWFudDogQ29sb3JWYXJpYW50O1xyXG59XHJcblxyXG4vKipcclxuICogQ29tbW9uIGludGVyZmFjZSBmb3IgZm9jdXNhYmxlIGNvbXBvbmVudHNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNhYmxlIHtcclxuICAvKiogRm9jdXMgdGhlIGNvbXBvbmVudCBwcm9ncmFtbWF0aWNhbGx5ICovXHJcbiAgZm9jdXMoKTogdm9pZDtcclxuICAvKiogQmx1ciB0aGUgY29tcG9uZW50IHByb2dyYW1tYXRpY2FsbHkgKi9cclxuICBibHVyKCk6IHZvaWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgZm9ybSBjb250cm9sIGNvbXBvbmVudHNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbnRyb2xCYXNlIGV4dGVuZHMgRGlzYWJsZWFibGUge1xyXG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRyb2wgKi9cclxuICBpZDogc3RyaW5nO1xyXG4gIC8qKiBOYW1lIGF0dHJpYnV0ZSBmb3IgZm9ybSBzdWJtaXNzaW9uICovXHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZCAqL1xyXG4gIHJlcXVpcmVkOiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZWFkb25seSAqL1xyXG4gIHJlYWRvbmx5OiBib29sZWFuO1xyXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0ICovXHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgLyoqIEFjY2Vzc2libGUgbGFiZWwgKi9cclxuICBhcmlhTGFiZWw/OiBzdHJpbmc7XHJcbiAgLyoqIElEIG9mIGVsZW1lbnQgdGhhdCBsYWJlbHMgdGhpcyBjb250cm9sICovXHJcbiAgYXJpYUxhYmVsbGVkQnk/OiBzdHJpbmc7XHJcbiAgLyoqIElEIG9mIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgdGhpcyBjb250cm9sICovXHJcbiAgYXJpYURlc2NyaWJlZEJ5Pzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBjb21wb25lbnRzIHdpdGggdmFsaWRhdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0YWJsZSB7XHJcbiAgLyoqIEN1cnJlbnQgdmFsaWRhdGlvbiBzdGF0ZSAqL1xyXG4gIHZhbGlkYXRpb25TdGF0ZTogVmFsaWRhdGlvblN0YXRlO1xyXG4gIC8qKiBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgKi9cclxuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgLyoqIFN1Y2Nlc3MgbWVzc2FnZSB0byBkaXNwbGF5ICovXHJcbiAgc3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgLyoqIEhlbHBlciB0ZXh0IHRvIGRpc3BsYXkgKi9cclxuICBoZWxwZXJUZXh0Pzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBzZWxlY3RhYmxlIGl0ZW1zIChkcm9wZG93biwgbGlzdCwgZXRjLilcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUl0ZW08VCA9IHVua25vd24+IHtcclxuICAvKiogVW5pcXVlIHZhbHVlIGZvciB0aGUgaXRlbSAqL1xyXG4gIHZhbHVlOiBUO1xyXG4gIC8qKiBEaXNwbGF5IGxhYmVsICovXHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogV2hldGhlciB0aGUgaXRlbSBpcyBkaXNhYmxlZCAqL1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICAvKiogT3B0aW9uYWwgaWNvbiBuYW1lICovXHJcbiAgaWNvbj86IHN0cmluZztcclxuICAvKiogT3B0aW9uYWwgZGVzY3JpcHRpb24gKi9cclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICAvKiogT3B0aW9uYWwgZ3JvdXAgbmFtZSBmb3IgY2F0ZWdvcml6YXRpb24gKi9cclxuICBncm91cD86IHN0cmluZztcclxuICAvKiogQWRkaXRpb25hbCBtZXRhZGF0YSAqL1xyXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IGN1c3RvbSB0ZW1wbGF0ZXNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGFibGUge1xyXG4gIC8qKiBDdXN0b20gdGVtcGxhdGUgZm9yIHJlbmRlcmluZyAqL1xyXG4gIHRlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIG92ZXJsYXkgY29tcG9uZW50cyAobW9kYWwsIHBvcG92ZXIsIHRvb2x0aXApXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlDb21wb25lbnQge1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVybGF5IGlzIGN1cnJlbnRseSB2aXNpYmxlICovXHJcbiAgaXNPcGVuOiBib29sZWFuO1xyXG4gIC8qKiBPcGVuIHRoZSBvdmVybGF5ICovXHJcbiAgb3BlbigpOiB2b2lkO1xyXG4gIC8qKiBDbG9zZSB0aGUgb3ZlcmxheSAqL1xyXG4gIGNsb3NlKCk6IHZvaWQ7XHJcbiAgLyoqIFRvZ2dsZSB0aGUgb3ZlcmxheSBzdGF0ZSAqL1xyXG4gIHRvZ2dsZSgpOiB2b2lkO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBjb21wb25lbnRzIHdpdGggYmVmb3JlL2FmdGVyIGNsb3NlIGhvb2tzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENsb3NhYmxlV2l0aEhvb2tzIHtcclxuICAvKiogQ2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGNsb3Nlcy4gUmV0dXJuIGZhbHNlIHRvIHByZXZlbnQgY2xvc2luZyAqL1xyXG4gIGJlZm9yZUNsb3NlPzogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgLyoqIENhbGxlZCBhZnRlciB0aGUgY29tcG9uZW50IGNsb3NlcyAqL1xyXG4gIGFmdGVyQ2xvc2U/OiAoKSA9PiB2b2lkO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciB0YWJsZSBjb2x1bW4gZGVmaW5pdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtbjxUID0gdW5rbm93bj4ge1xyXG4gIC8qKiBVbmlxdWUgY29sdW1uIGtleSAqL1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIC8qKiBDb2x1bW4gaGVhZGVyIGxhYmVsICovXHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogUHJvcGVydHkgcGF0aCB0byBhY2Nlc3MgZGF0YSAoc3VwcG9ydHMgZG90IG5vdGF0aW9uKSAqL1xyXG4gIGZpZWxkPzoga2V5b2YgVCB8IHN0cmluZztcclxuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlICovXHJcbiAgc29ydGFibGU/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgZmlsdGVyYWJsZSAqL1xyXG4gIGZpbHRlcmFibGU/OiBib29sZWFuO1xyXG4gIC8qKiBDb2x1bW4gd2lkdGggKENTUyB2YWx1ZSkgKi9cclxuICB3aWR0aD86IHN0cmluZztcclxuICAvKiogTWluaW11bSBjb2x1bW4gd2lkdGggKi9cclxuICBtaW5XaWR0aD86IHN0cmluZztcclxuICAvKiogTWF4aW11bSBjb2x1bW4gd2lkdGggKi9cclxuICBtYXhXaWR0aD86IHN0cmluZztcclxuICAvKiogVGV4dCBhbGlnbm1lbnQgKi9cclxuICBhbGlnbj86ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JztcclxuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIHZpc2libGUgKi9cclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIHN0aWNreSAqL1xyXG4gIHN0aWNreT86ICdzdGFydCcgfCAnZW5kJztcclxuICAvKiogQ3VzdG9tIGNlbGwgdGVtcGxhdGUgKi9cclxuICBjZWxsVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuICAvKiogQ3VzdG9tIGhlYWRlciB0ZW1wbGF0ZSAqL1xyXG4gIGhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcbiAgLyoqIFZhbHVlIGZvcm1hdHRlciBmdW5jdGlvbiAqL1xyXG4gIGZvcm1hdHRlcj86ICh2YWx1ZTogdW5rbm93biwgcm93OiBUKSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIHBhZ2luYXRpb24gc3RhdGVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblN0YXRlIHtcclxuICAvKiogQ3VycmVudCBwYWdlICgxLWluZGV4ZWQpICovXHJcbiAgY3VycmVudFBhZ2U6IG51bWJlcjtcclxuICAvKiogTnVtYmVyIG9mIGl0ZW1zIHBlciBwYWdlICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKiogVG90YWwgbnVtYmVyIG9mIGl0ZW1zICovXHJcbiAgdG90YWxJdGVtczogbnVtYmVyO1xyXG4gIC8qKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMgKGNhbGN1bGF0ZWQpICovXHJcbiAgdG90YWxQYWdlczogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBzb3J0IHN0YXRlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRTdGF0ZSB7XHJcbiAgLyoqIENvbHVtbiBrZXkgdG8gc29ydCBieSAqL1xyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIC8qKiBTb3J0IGRpcmVjdGlvbiAqL1xyXG4gIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBmaWx0ZXIgc3RhdGVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyU3RhdGUge1xyXG4gIC8qKiBDb2x1bW4ga2V5IHRvIGZpbHRlciAqL1xyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIC8qKiBGaWx0ZXIgb3BlcmF0b3IgKi9cclxuICBvcGVyYXRvcjogJ2VxdWFscycgfCAnY29udGFpbnMnIHwgJ3N0YXJ0c1dpdGgnIHwgJ2VuZHNXaXRoJyB8ICdndCcgfCAnbHQnIHwgJ2d0ZScgfCAnbHRlJyB8ICdiZXR3ZWVuJyB8ICdpbic7XHJcbiAgLyoqIEZpbHRlciB2YWx1ZShzKSAqL1xyXG4gIHZhbHVlOiB1bmtub3duO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciB0cmVlIG5vZGUgc3RydWN0dXJlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlPFQgPSB1bmtub3duPiB7XHJcbiAgLyoqIFVuaXF1ZSBub2RlIGlkZW50aWZpZXIgKi9cclxuICBpZDogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIC8qKiBOb2RlIGRhdGEgKi9cclxuICBkYXRhOiBUO1xyXG4gIC8qKiBDaGlsZCBub2RlcyAqL1xyXG4gIGNoaWxkcmVuPzogVHJlZU5vZGU8VD5bXTtcclxuICAvKiogV2hldGhlciB0aGUgbm9kZSBpcyBleHBhbmRlZCAqL1xyXG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgbm9kZSBpcyBzZWxlY3RlZCAqL1xyXG4gIHNlbGVjdGVkPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgbm9kZSBpcyBkaXNhYmxlZCAqL1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIGxlYWYgKG5vIGNoaWxkcmVuKSAqL1xyXG4gIGxlYWY/OiBib29sZWFuO1xyXG4gIC8qKiBQYXJlbnQgbm9kZSBJRCAqL1xyXG4gIHBhcmVudElkPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIC8qKiBOb2RlIGxldmVsIGluIHRoZSB0cmVlICgwLWluZGV4ZWQpICovXHJcbiAgbGV2ZWw/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIGJyZWFkY3J1bWIgaXRlbVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBCcmVhZGNydW1iSXRlbSB7XHJcbiAgLyoqIERpc3BsYXkgbGFiZWwgKi9cclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBOYXZpZ2F0aW9uIFVSTCBvciByb3V0ZSAqL1xyXG4gIHVybD86IHN0cmluZztcclxuICAvKiogUm91dGUgcGF0aCBhcnJheSBmb3Igcm91dGVyTGluayAqL1xyXG4gIHJvdXRlckxpbms/OiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAvKiogUXVlcnkgcGFyYW1ldGVycyAqL1xyXG4gIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICAvKiogSWNvbiBuYW1lICovXHJcbiAgaWNvbj86IHN0cmluZztcclxuICAvKiogV2hldGhlciB0aGlzIGlzIHRoZSBhY3RpdmUvY3VycmVudCBpdGVtICovXHJcbiAgYWN0aXZlPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgaXRlbSBpcyBkaXNhYmxlZCAqL1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSBmb3IgdGFiIGl0ZW1cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFiSXRlbSB7XHJcbiAgLyoqIFVuaXF1ZSB0YWIgaWRlbnRpZmllciAqL1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLyoqIFRhYiBsYWJlbCAqL1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoqIFRhYiBpY29uICovXHJcbiAgaWNvbj86IHN0cmluZztcclxuICAvKiogV2hldGhlciB0aGUgdGFiIGlzIGRpc2FibGVkICovXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSB0YWIgaXMgY2xvc2FibGUgKi9cclxuICBjbG9zYWJsZT86IGJvb2xlYW47XHJcbiAgLyoqIEJhZGdlIGNvbnRlbnQgKi9cclxuICBiYWRnZT86IHN0cmluZyB8IG51bWJlcjtcclxuICAvKiogQ29udGVudCB0ZW1wbGF0ZSAqL1xyXG4gIGNvbnRlbnQ/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSBmb3IgbWVudSBpdGVtXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVJdGVtIHtcclxuICAvKiogVW5pcXVlIGl0ZW0gaWRlbnRpZmllciAqL1xyXG4gIGlkPzogc3RyaW5nO1xyXG4gIC8qKiBEaXNwbGF5IGxhYmVsICovXHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogSWNvbiBuYW1lICovXHJcbiAgaWNvbj86IHN0cmluZztcclxuICAvKiogQ29tbWFuZCB0byBleGVjdXRlIG9uIGNsaWNrICovXHJcbiAgY29tbWFuZD86ICgpID0+IHZvaWQ7XHJcbiAgLyoqIFVSTCBmb3IgbmF2aWdhdGlvbiAqL1xyXG4gIHVybD86IHN0cmluZztcclxuICAvKiogUm91dGVyIGxpbmsgKi9cclxuICByb3V0ZXJMaW5rPzogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgLyoqIFF1ZXJ5IHBhcmFtZXRlcnMgKi9cclxuICBxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGl0ZW0gaXMgZGlzYWJsZWQgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGl0ZW0gaXMgdmlzaWJsZSAqL1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIC8qKiBDaGlsZCBpdGVtcyBmb3Igc3VibWVudSAqL1xyXG4gIGl0ZW1zPzogTWVudUl0ZW1bXTtcclxuICAvKiogV2hldGhlciB0aGlzIGlzIGEgc2VwYXJhdG9yICovXHJcbiAgc2VwYXJhdG9yPzogYm9vbGVhbjtcclxuICAvKiogQWRkaXRpb25hbCBDU1MgY2xhc3MgKi9cclxuICBzdHlsZUNsYXNzPzogc3RyaW5nO1xyXG4gIC8qKiBUb29sdGlwIHRleHQgKi9cclxuICB0b29sdGlwPzogc3RyaW5nO1xyXG4gIC8qKiBCYWRnZSBjb250ZW50ICovXHJcbiAgYmFkZ2U/OiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgLyoqIEJhZGdlIGNvbG9yIHZhcmlhbnQgKi9cclxuICBiYWRnZVZhcmlhbnQ/OiBDb2xvclZhcmlhbnQ7XHJcbn1cclxuIl19
@@ -1,6 +0,0 @@
1
- /**
2
- * Common type definitions for PECB UI Components
3
- * @module types
4
- */
5
- export {};
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL3NoYXJlZC90eXBlcy9jb21tb24udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvbW1vbiB0eXBlIGRlZmluaXRpb25zIGZvciBQRUNCIFVJIENvbXBvbmVudHNcclxuICogQG1vZHVsZSB0eXBlc1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTdGFuZGFyZCBzaXplIHZhcmlhbnRzIHVzZWQgYWNyb3NzIGNvbXBvbmVudHNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNpemUgPSAneHMnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJztcclxuXHJcbi8qKlxyXG4gKiBTdGFuZGFyZCBjb21wb25lbnQgc2l6ZSBtYXBwaW5nXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDb21wb25lbnRTaXplID0gJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJztcclxuXHJcbi8qKlxyXG4gKiBTZW1hbnRpYyBjb2xvciB2YXJpYW50c1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ29sb3JWYXJpYW50ID0gJ3ByaW1hcnknIHwgJ3NlY29uZGFyeScgfCAnc3VjY2VzcycgfCAnZGFuZ2VyJyB8ICd3YXJuaW5nJyB8ICdpbmZvJztcclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRlZCBjb2xvciB2YXJpYW50cyBpbmNsdWRpbmcgbmV1dHJhbCBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBFeHRlbmRlZENvbG9yVmFyaWFudCA9IENvbG9yVmFyaWFudCB8ICduZXV0cmFsJyB8ICdtdXRlZCc7XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50IHN0YXRlIHZhcmlhbnRzXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTdGF0ZVZhcmlhbnQgPSAnZGVmYXVsdCcgfCAnaG92ZXInIHwgJ2FjdGl2ZScgfCAnZm9jdXMnIHwgJ2Rpc2FibGVkJztcclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbiBvcHRpb25zIGZvciBvdmVybGF5cyBhbmQgcG9wdXBzXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBQb3NpdGlvbiA9XHJcbiAgfCAndG9wJ1xyXG4gIHwgJ3RvcC1zdGFydCdcclxuICB8ICd0b3AtZW5kJ1xyXG4gIHwgJ2JvdHRvbSdcclxuICB8ICdib3R0b20tc3RhcnQnXHJcbiAgfCAnYm90dG9tLWVuZCdcclxuICB8ICdsZWZ0J1xyXG4gIHwgJ2xlZnQtc3RhcnQnXHJcbiAgfCAnbGVmdC1lbmQnXHJcbiAgfCAncmlnaHQnXHJcbiAgfCAncmlnaHQtc3RhcnQnXHJcbiAgfCAncmlnaHQtZW5kJztcclxuXHJcbi8qKlxyXG4gKiBBbGlnbm1lbnQgb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgQWxpZ25tZW50ID0gJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCAnc3RyZXRjaCc7XHJcblxyXG4vKipcclxuICogRGlyZWN0aW9uIG9wdGlvbnMgZm9yIGxheW91dHNcclxuICovXHJcbmV4cG9ydCB0eXBlIERpcmVjdGlvbiA9ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XHJcblxyXG4vKipcclxuICogT3JpZW50YXRpb24gYWxpYXMgZm9yIGRpcmVjdGlvblxyXG4gKi9cclxuZXhwb3J0IHR5cGUgT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xyXG5cclxuLyoqXHJcbiAqIFNwYWNpbmcgc2NhbGUgdmFsdWVzXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTcGFjaW5nU2NhbGUgPSAnbm9uZScgfCAneHMnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJyB8ICd4eGwnO1xyXG5cclxuLyoqXHJcbiAqIEJvcmRlciByYWRpdXMgc2NhbGUgdmFsdWVzXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBSYWRpdXNTY2FsZSA9ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnZnVsbCc7XHJcblxyXG4vKipcclxuICogU2hhZG93IGVsZXZhdGlvbiBsZXZlbHNcclxuICovXHJcbmV4cG9ydCB0eXBlIEVsZXZhdGlvbkxldmVsID0gJ25vbmUnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJztcclxuXHJcbi8qKlxyXG4gKiBBbmltYXRpb24gdGltaW5nIHByZXNldHNcclxuICovXHJcbmV4cG9ydCB0eXBlIEFuaW1hdGlvblRpbWluZyA9ICdpbnN0YW50JyB8ICdmYXN0JyB8ICdub3JtYWwnIHwgJ3Nsb3cnO1xyXG5cclxuLyoqXHJcbiAqIEJyZWFrcG9pbnQgbmFtZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIEJyZWFrcG9pbnQgPSAneHMnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJyB8ICd4eGwnO1xyXG5cclxuLyoqXHJcbiAqIEZvcm0gdmFsaWRhdGlvbiBzdGF0ZVxyXG4gKi9cclxuZXhwb3J0IHR5cGUgVmFsaWRhdGlvblN0YXRlID0gJ3ZhbGlkJyB8ICdpbnZhbGlkJyB8ICdwZW5kaW5nJyB8ICdwcmlzdGluZSc7XHJcblxyXG4vKipcclxuICogR2VuZXJpYyBjYWxsYmFjayBmdW5jdGlvbiB0eXBlXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDYWxsYmFjazxUID0gdm9pZD4gPSAoKSA9PiBUO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyaWMgZXZlbnQgaGFuZGxlciB0eXBlXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBFdmVudEhhbmRsZXI8VCA9IEV2ZW50PiA9IChldmVudDogVCkgPT4gdm9pZDtcclxuXHJcbi8qKlxyXG4gKiBNYWtlIHNwZWNpZmljIHByb3BlcnRpZXMgcmVxdWlyZWRcclxuICovXHJcbmV4cG9ydCB0eXBlIFJlcXVpcmVQcm9wczxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBUICYgUmVxdWlyZWQ8UGljazxULCBLPj47XHJcblxyXG4vKipcclxuICogTWFrZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9wdGlvbmFsXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBPcHRpb25hbFByb3BzPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IE9taXQ8VCwgSz4gJiBQYXJ0aWFsPFBpY2s8VCwgSz4+O1xyXG5cclxuLyoqXHJcbiAqIEV4dHJhY3Qgbm9uLW51bGxhYmxlIHR5cGVcclxuICovXHJcbmV4cG9ydCB0eXBlIE5vbk51bGxhYmxlUHJvcHM8VD4gPSB7XHJcbiAgW0sgaW4ga2V5b2YgVF06IE5vbk51bGxhYmxlPFRbS10+O1xyXG59O1xyXG4iXX0=
@@ -1,223 +0,0 @@
1
- /**
2
- * Accessibility utility functions for PECB UI Components
3
- * Helps ensure WCAG 2.1 compliance
4
- * @module utils/accessibility
5
- */
6
- import { generateUniqueId } from './dom.utils';
7
- /**
8
- * Generate ARIA attributes for a button component
9
- * @param options - Button accessibility options
10
- * @returns ARIA attributes object
11
- */
12
- export function getButtonAriaAttributes(options) {
13
- const attrs = {};
14
- if (options.label) {
15
- attrs['aria-label'] = options.label;
16
- }
17
- if (options.pressed !== undefined) {
18
- attrs['aria-pressed'] = options.pressed;
19
- }
20
- if (options.expanded !== undefined) {
21
- attrs['aria-expanded'] = options.expanded;
22
- }
23
- if (options.disabled) {
24
- attrs['aria-disabled'] = true;
25
- }
26
- if (options.controls) {
27
- attrs['aria-controls'] = options.controls;
28
- }
29
- if (options.haspopup) {
30
- attrs['aria-haspopup'] = options.haspopup;
31
- }
32
- if (options.describedby) {
33
- attrs['aria-describedby'] = options.describedby;
34
- }
35
- return attrs;
36
- }
37
- /**
38
- * Generate ARIA attributes for a dialog/modal component
39
- * @param options - Dialog accessibility options
40
- * @returns ARIA attributes object
41
- */
42
- export function getDialogAriaAttributes(options) {
43
- return {
44
- role: 'dialog',
45
- 'aria-labelledby': options.labelledby,
46
- 'aria-describedby': options.describedby,
47
- 'aria-modal': options.modal
48
- };
49
- }
50
- /**
51
- * Generate ARIA attributes for a form input
52
- * @param options - Input accessibility options
53
- * @returns ARIA attributes object
54
- */
55
- export function getInputAriaAttributes(options) {
56
- const attrs = {};
57
- if (options.label) {
58
- attrs['aria-label'] = options.label;
59
- }
60
- if (options.labelledby) {
61
- attrs['aria-labelledby'] = options.labelledby;
62
- }
63
- // Build aria-describedby from multiple sources
64
- const describedbyParts = [];
65
- if (options.describedby) {
66
- describedbyParts.push(options.describedby);
67
- }
68
- if (options.invalid && options.errorId) {
69
- describedbyParts.push(options.errorId);
70
- }
71
- if (options.helperId) {
72
- describedbyParts.push(options.helperId);
73
- }
74
- if (describedbyParts.length > 0) {
75
- attrs['aria-describedby'] = describedbyParts.join(' ');
76
- }
77
- if (options.invalid !== undefined) {
78
- attrs['aria-invalid'] = options.invalid;
79
- }
80
- if (options.required) {
81
- attrs['aria-required'] = true;
82
- }
83
- if (options.readonly) {
84
- attrs['aria-readonly'] = true;
85
- }
86
- if (options.disabled) {
87
- attrs['aria-disabled'] = true;
88
- }
89
- return attrs;
90
- }
91
- /**
92
- * Generate ARIA attributes for a progress bar
93
- * @param options - Progress accessibility options
94
- * @returns ARIA attributes object
95
- */
96
- export function getProgressAriaAttributes(options) {
97
- return {
98
- role: 'progressbar',
99
- 'aria-valuenow': options.value,
100
- 'aria-valuemin': options.min ?? 0,
101
- 'aria-valuemax': options.max ?? 100,
102
- 'aria-label': options.label,
103
- 'aria-valuetext': options.valueText ?? `${options.value}%`
104
- };
105
- }
106
- /**
107
- * Generate ARIA attributes for a tab component
108
- * @param options - Tab accessibility options
109
- * @returns ARIA attributes for tab and tabpanel
110
- */
111
- export function getTabAriaAttributes(options) {
112
- return {
113
- tab: {
114
- role: 'tab',
115
- 'aria-selected': options.selected,
116
- 'aria-controls': options.panelId,
117
- 'aria-disabled': options.disabled,
118
- tabindex: options.selected ? 0 : -1
119
- },
120
- panel: {
121
- role: 'tabpanel',
122
- 'aria-labelledby': options.tabId,
123
- 'aria-hidden': !options.selected,
124
- tabindex: 0
125
- }
126
- };
127
- }
128
- /**
129
- * Generate ARIA attributes for a listbox option
130
- * @param options - Option accessibility options
131
- * @returns ARIA attributes object
132
- */
133
- export function getOptionAriaAttributes(options) {
134
- return {
135
- role: 'option',
136
- 'aria-selected': options.selected,
137
- 'aria-disabled': options.disabled,
138
- 'aria-setsize': options.setsize,
139
- 'aria-posinset': options.posinset
140
- };
141
- }
142
- /**
143
- * Generate linked IDs for label and input association
144
- * @param baseName - Base name for generating IDs
145
- * @returns Object with inputId, labelId, errorId, and helperId
146
- */
147
- export function generateLinkedIds(baseName) {
148
- const base = baseName || generateUniqueId('input');
149
- return {
150
- inputId: base,
151
- labelId: `${base}-label`,
152
- errorId: `${base}-error`,
153
- helperId: `${base}-helper`
154
- };
155
- }
156
- /**
157
- * Create a visually hidden element for screen readers
158
- * @returns CSS styles for visually hidden content
159
- */
160
- export function getVisuallyHiddenStyles() {
161
- return {
162
- position: 'absolute',
163
- width: '1px',
164
- height: '1px',
165
- padding: '0',
166
- margin: '-1px',
167
- overflow: 'hidden',
168
- clip: 'rect(0, 0, 0, 0)',
169
- whiteSpace: 'nowrap',
170
- border: '0'
171
- };
172
- }
173
- /**
174
- * Check if the user has enabled reduced motion preference
175
- * @returns True if user prefers reduced motion
176
- */
177
- export function prefersReducedMotion() {
178
- if (typeof window === 'undefined')
179
- return false;
180
- return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
181
- }
182
- /**
183
- * Check if the user has enabled high contrast mode
184
- * @returns True if high contrast mode is enabled
185
- */
186
- export function prefersHighContrast() {
187
- if (typeof window === 'undefined')
188
- return false;
189
- return window.matchMedia('(prefers-contrast: more)').matches;
190
- }
191
- /**
192
- * Announce a message to screen readers using aria-live regions
193
- * @param message - The message to announce
194
- * @param politeness - The urgency level (polite or assertive)
195
- */
196
- export function announceToScreenReader(message, politeness = 'polite') {
197
- if (typeof document === 'undefined')
198
- return;
199
- const announcement = document.createElement('div');
200
- announcement.setAttribute('role', 'status');
201
- announcement.setAttribute('aria-live', politeness);
202
- announcement.setAttribute('aria-atomic', 'true');
203
- Object.assign(announcement.style, getVisuallyHiddenStyles());
204
- document.body.appendChild(announcement);
205
- // Delay slightly to ensure screen readers pick up the change
206
- setTimeout(() => {
207
- announcement.textContent = message;
208
- }, 100);
209
- // Clean up after announcement is read
210
- setTimeout(() => {
211
- document.body.removeChild(announcement);
212
- }, 1000);
213
- }
214
- /**
215
- * Get the appropriate aria-current value for navigation items
216
- * @param isActive - Whether the item is active/current
217
- * @param type - The type of current indicator
218
- * @returns The aria-current value or undefined
219
- */
220
- export function getAriaCurrent(isActive, type = 'page') {
221
- return isActive ? type : undefined;
222
- }
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzaWJpbGl0eS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvdXRpbHMvYWNjZXNzaWJpbGl0eS51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBb0YvQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BUXZDO0lBQ0MsTUFBTSxLQUFLLEdBQW1CLEVBQUUsQ0FBQztJQUVqQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQixLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJ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QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFFN0QsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFeEMsNkRBQTZEO0lBQzdELFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxZQUFZLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUNyQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFUixzQ0FBc0M7SUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLFFBQWlCLEVBQ2pCLE9BQXVELE1BQU07SUFFN0QsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQWNjZXNzaWJpbGl0eSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgUEVDQiBVSSBDb21wb25lbnRzXHJcbiAqIEhlbHBzIGVuc3VyZSBXQ0FHIDIuMSBjb21wbGlhbmNlXHJcbiAqIEBtb2R1bGUgdXRpbHMvYWNjZXNzaWJpbGl0eVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICcuL2RvbS51dGlscyc7XHJcblxyXG4vKipcclxuICogQVJJQSBsaXZlIHJlZ2lvbiBwb2xpdGVuZXNzIGxldmVsc1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgQXJpYUxpdmUgPSAnb2ZmJyB8ICdwb2xpdGUnIHwgJ2Fzc2VydGl2ZSc7XHJcblxyXG4vKipcclxuICogQVJJQSByb2xlcyBjb21tb25seSB1c2VkIGluIGNvbXBvbmVudHNcclxuICovXHJcbmV4cG9ydCB0eXBlIEFyaWFSb2xlID1cclxuICB8ICdhbGVydCdcclxuICB8ICdhbGVydGRpYWxvZydcclxuICB8ICdidXR0b24nXHJcbiAgfCAnY2hlY2tib3gnXHJcbiAgfCAnY29tYm9ib3gnXHJcbiAgfCAnZGlhbG9nJ1xyXG4gIHwgJ2dyaWQnXHJcbiAgfCAnZ3JpZGNlbGwnXHJcbiAgfCAnbGluaydcclxuICB8ICdsaXN0Ym94J1xyXG4gIHwgJ21lbnUnXHJcbiAgfCAnbWVudWJhcidcclxuICB8ICdtZW51aXRlbSdcclxuICB8ICdtZW51aXRlbWNoZWNrYm94J1xyXG4gIHwgJ21lbnVpdGVtcmFkaW8nXHJcbiAgfCAnb3B0aW9uJ1xyXG4gIHwgJ3Byb2dyZXNzYmFyJ1xyXG4gIHwgJ3JhZGlvJ1xyXG4gIHwgJ3JhZGlvZ3JvdXAnXHJcbiAgfCAnc2Nyb2xsYmFyJ1xyXG4gIHwgJ3NlYXJjaGJveCdcclxuICB8ICdzbGlkZXInXHJcbiAgfCAnc3BpbmJ1dHRvbidcclxuICB8ICdzdGF0dXMnXHJcbiAgfCAnc3dpdGNoJ1xyXG4gIHwgJ3RhYidcclxuICB8ICd0YWJsaXN0J1xyXG4gIHwgJ3RhYnBhbmVsJ1xyXG4gIHwgJ3RleHRib3gnXHJcbiAgfCAndG9vbHRpcCdcclxuICB8ICd0cmVlJ1xyXG4gIHwgJ3RyZWVncmlkJ1xyXG4gIHwgJ3RyZWVpdGVtJztcclxuXHJcbi8qKlxyXG4gKiBTdGFuZGFyZCBBUklBIGF0dHJpYnV0ZXMgaW50ZXJmYWNlIGZvciBjb21wb25lbnRzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFyaWFBdHRyaWJ1dGVzIHtcclxuICByb2xlPzogQXJpYVJvbGU7XHJcbiAgJ2FyaWEtbGFiZWwnPzogc3RyaW5nO1xyXG4gICdhcmlhLWxhYmVsbGVkYnknPzogc3RyaW5nO1xyXG4gICdhcmlhLWRlc2NyaWJlZGJ5Jz86IHN0cmluZztcclxuICAnYXJpYS1leHBhbmRlZCc/OiBib29sZWFuO1xyXG4gICdhcmlhLXNlbGVjdGVkJz86IGJvb2xlYW47XHJcbiAgJ2FyaWEtY2hlY2tlZCc/OiBib29sZWFuIHwgJ21peGVkJztcclxuICAnYXJpYS1kaXNhYmxlZCc/OiBib29sZWFuO1xyXG4gICdhcmlhLWhpZGRlbic/OiBib29sZWFuO1xyXG4gICdhcmlhLWludmFsaWQnPzogYm9vbGVhbjtcclxuICAnYXJpYS1yZXF1aXJlZCc/OiBib29sZWFuO1xyXG4gICdhcmlhLXJlYWRvbmx5Jz86IGJvb2xlYW47XHJcbiAgJ2FyaWEtcHJlc3NlZCc/OiBib29sZWFuIHwgJ21peGVkJztcclxuICAnYXJpYS1jdXJyZW50Jz86IGJvb2xlYW4gfCAncGFnZScgfCAnc3RlcCcgfCAnbG9jYXRpb24nIHwgJ2RhdGUnIHwgJ3RpbWUnO1xyXG4gICdhcmlhLWhhc3BvcHVwJz86IGJvb2xlYW4gfCAnbWVudScgfCAnbGlzdGJveCcgfCAndHJlZScgfCAnZ3JpZCcgfCAnZGlhbG9nJztcclxuICAnYXJpYS1jb250cm9scyc/OiBzdHJpbmc7XHJcbiAgJ2FyaWEtb3ducyc/OiBzdHJpbmc7XHJcbiAgJ2FyaWEtbGl2ZSc/OiBBcmlhTGl2ZTtcclxuICAnYXJpYS1hdG9taWMnPzogYm9vbGVhbjtcclxuICAnYXJpYS1idXN5Jz86IGJvb2xlYW47XHJcbiAgJ2FyaWEtdmFsdWVtaW4nPzogbnVtYmVyO1xyXG4gICdhcmlhLXZhbHVlbWF4Jz86IG51bWJlcjtcclxuICAnYXJpYS12YWx1ZW5vdyc/OiBudW1iZXI7XHJcbiAgJ2FyaWEtdmFsdWV0ZXh0Jz86IHN0cmluZztcclxuICAnYXJpYS1vcmllbnRhdGlvbic/OiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xyXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnPzogc3RyaW5nO1xyXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc/OiAnbm9uZScgfCAnaW5saW5lJyB8ICdsaXN0JyB8ICdib3RoJztcclxuICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnPzogYm9vbGVhbjtcclxuICAnYXJpYS1zb3J0Jz86ICdub25lJyB8ICdhc2NlbmRpbmcnIHwgJ2Rlc2NlbmRpbmcnIHwgJ290aGVyJztcclxuICAnYXJpYS1sZXZlbCc/OiBudW1iZXI7XHJcbiAgJ2FyaWEtc2V0c2l6ZSc/OiBudW1iZXI7XHJcbiAgJ2FyaWEtcG9zaW5zZXQnPzogbnVtYmVyO1xyXG4gIHRhYmluZGV4PzogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgQVJJQSBhdHRyaWJ1dGVzIGZvciBhIGJ1dHRvbiBjb21wb25lbnRcclxuICogQHBhcmFtIG9wdGlvbnMgLSBCdXR0b24gYWNjZXNzaWJpbGl0eSBvcHRpb25zXHJcbiAqIEByZXR1cm5zIEFSSUEgYXR0cmlidXRlcyBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCdXR0b25BcmlhQXR0cmlidXRlcyhvcHRpb25zOiB7XHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgcHJlc3NlZD86IGJvb2xlYW47XHJcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICBjb250cm9scz86IHN0cmluZztcclxuICBoYXNwb3B1cD86IEFyaWFBdHRyaWJ1dGVzWydhcmlhLWhhc3BvcHVwJ107XHJcbiAgZGVzY3JpYmVkYnk/OiBzdHJpbmc7XHJcbn0pOiBBcmlhQXR0cmlidXRlcyB7XHJcbiAgY29uc3QgYXR0cnM6IEFyaWFBdHRyaWJ1dGVzID0ge307XHJcblxyXG4gIGlmIChvcHRpb25zLmxhYmVsKSB7XHJcbiAgICBhdHRyc1snYXJpYS1sYWJlbCddID0gb3B0aW9ucy5sYWJlbDtcclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucHJlc3NlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBhdHRyc1snYXJpYS1wcmVzc2VkJ10gPSBvcHRpb25zLnByZXNzZWQ7XHJcbiAgfVxyXG4gIGlmIChvcHRpb25zLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGF0dHJzWydhcmlhLWV4cGFuZGVkJ10gPSBvcHRpb25zLmV4cGFuZGVkO1xyXG4gIH1cclxuICBpZiAob3B0aW9ucy5kaXNhYmxlZCkge1xyXG4gICAgYXR0cnNbJ2FyaWEtZGlzYWJsZWQnXSA9IHRydWU7XHJcbiAgfVxyXG4gIGlmIChvcHRpb25zLmNvbnRyb2xzKSB7XHJcbiAgICBhdHRyc1snYXJpYS1jb250cm9scyddID0gb3B0aW9ucy5jb250cm9scztcclxuICB9XHJcbiAgaWYgKG9wdGlvbnMuaGFzcG9wdXApIHtcclxuICAgIGF0dHJzWydhcmlhLWhhc3BvcHVwJ10gPSBvcHRpb25zLmhhc3BvcHVwO1xyXG4gIH1cclxuICBpZiAob3B0aW9ucy5kZXNjcmliZWRieSkge1xyXG4gICAgYXR0cnNbJ2FyaWEtZGVzY3JpYmVkYnknXSA9IG9wdGlvbnMuZGVzY3JpYmVkYnk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gYXR0cnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBBUklBIGF0dHJpYnV0ZXMgZm9yIGEgZGlhbG9nL21vZGFsIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBhY2Nlc3NpYmlsaXR5IG9wdGlvbnNcclxuICogQHJldHVybnMgQVJJQSBhdHRyaWJ1dGVzIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERpYWxvZ0FyaWFBdHRyaWJ1dGVzKG9wdGlvbnM6IHtcclxuICBsYWJlbGxlZGJ5Pzogc3RyaW5nO1xyXG4gIGRlc2NyaWJlZGJ5Pzogc3RyaW5nO1xyXG4gIG1vZGFsPzogYm9vbGVhbjtcclxufSk6IEFyaWFBdHRyaWJ1dGVzIHtcclxuICByZXR1cm4ge1xyXG4gICAgcm9sZTogJ2RpYWxvZycsXHJcbiAgICAnYXJpYS1sYWJlbGxlZGJ5Jzogb3B0aW9ucy5sYWJlbGxlZGJ5LFxyXG4gICAgJ2FyaWEtZGVzY3JpYmVkYnknOiBvcHRpb25zLmRlc2NyaWJlZGJ5LFxyXG4gICAgJ2FyaWEtbW9kYWwnOiBvcHRpb25zLm1vZGFsXHJcbiAgfSBhcyBBcmlhQXR0cmlidXRlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIEFSSUEgYXR0cmlidXRlcyBmb3IgYSBmb3JtIGlucHV0XHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gSW5wdXQgYWNjZXNzaWJpbGl0eSBvcHRpb25zXHJcbiAqIEByZXR1cm5zIEFSSUEgYXR0cmlidXRlcyBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnB1dEFyaWFBdHRyaWJ1dGVzKG9wdGlvbnM6IHtcclxuICBsYWJlbD86IHN0cmluZztcclxuICBsYWJlbGxlZGJ5Pzogc3RyaW5nO1xyXG4gIGRlc2NyaWJlZGJ5Pzogc3RyaW5nO1xyXG4gIGludmFsaWQ/OiBib29sZWFuO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICByZWFkb25seT86IGJvb2xlYW47XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIGVycm9ySWQ/OiBzdHJpbmc7XHJcbiAgaGVscGVySWQ/OiBzdHJpbmc7XHJcbn0pOiBBcmlhQXR0cmlidXRlcyB7XHJcbiAgY29uc3QgYXR0cnM6IEFyaWFBdHRyaWJ1dGVzID0ge307XHJcblxyXG4gIGlmIChvcHRpb25zLmxhYmVsKSB7XHJcbiAgICBhdHRyc1snYXJpYS1sYWJlbCddID0gb3B0aW9ucy5sYWJlbDtcclxuICB9XHJcbiAgaWYgKG9wdGlvbnMubGFiZWxsZWRieSkge1xyXG4gICAgYXR0cnNbJ2FyaWEtbGFiZWxsZWRieSddID0gb3B0aW9ucy5sYWJlbGxlZGJ5O1xyXG4gIH1cclxuXHJcbiAgLy8gQnVpbGQgYXJpYS1kZXNjcmliZWRieSBmcm9tIG11bHRpcGxlIHNvdXJjZXNcclxuICBjb25zdCBkZXNjcmliZWRieVBhcnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGlmIChvcHRpb25zLmRlc2NyaWJlZGJ5KSB7XHJcbiAgICBkZXNjcmliZWRieVBhcnRzLnB1c2gob3B0aW9ucy5kZXNjcmliZWRieSk7XHJcbiAgfVxyXG4gIGlmIChvcHRpb25zLmludmFsaWQgJiYgb3B0aW9ucy5lcnJvcklkKSB7XHJcbiAgICBkZXNjcmliZWRieVBhcnRzLnB1c2gob3B0aW9ucy5lcnJvcklkKTtcclxuICB9XHJcbiAgaWYgKG9wdGlvbnMuaGVscGVySWQpIHtcclxuICAgIGRlc2NyaWJlZGJ5UGFydHMucHVzaChvcHRpb25zLmhlbHBlcklkKTtcclxuICB9XHJcbiAgaWYgKGRlc2NyaWJlZGJ5UGFydHMubGVuZ3RoID4gMCkge1xyXG4gICAgYXR0cnNbJ2FyaWEtZGVzY3JpYmVkYnknXSA9IGRlc2NyaWJlZGJ5UGFydHMuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgaWYgKG9wdGlvbnMuaW52YWxpZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBhdHRyc1snYXJpYS1pbnZhbGlkJ10gPSBvcHRpb25zLmludmFsaWQ7XHJcbiAgfVxyXG4gIGlmIChvcHRpb25zLnJlcXVpcmVkKSB7XHJcbiAgICBhdHRyc1snYXJpYS1yZXF1aXJlZCddID0gdHJ1ZTtcclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucmVhZG9ubHkpIHtcclxuICAgIGF0dHJzWydhcmlhLXJlYWRvbmx5J10gPSB0cnVlO1xyXG4gIH1cclxuICBpZiAob3B0aW9ucy5kaXNhYmxlZCkge1xyXG4gICAgYXR0cnNbJ2FyaWEtZGlzYWJsZWQnXSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gYXR0cnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBBUklBIGF0dHJpYnV0ZXMgZm9yIGEgcHJvZ3Jlc3MgYmFyXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gUHJvZ3Jlc3MgYWNjZXNzaWJpbGl0eSBvcHRpb25zXHJcbiAqIEByZXR1cm5zIEFSSUEgYXR0cmlidXRlcyBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmVzc0FyaWFBdHRyaWJ1dGVzKG9wdGlvbnM6IHtcclxuICB2YWx1ZTogbnVtYmVyO1xyXG4gIG1pbj86IG51bWJlcjtcclxuICBtYXg/OiBudW1iZXI7XHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgdmFsdWVUZXh0Pzogc3RyaW5nO1xyXG59KTogQXJpYUF0dHJpYnV0ZXMge1xyXG4gIHJldHVybiB7XHJcbiAgICByb2xlOiAncHJvZ3Jlc3NiYXInLFxyXG4gICAgJ2FyaWEtdmFsdWVub3cnOiBvcHRpb25zLnZhbHVlLFxyXG4gICAgJ2FyaWEtdmFsdWVtaW4nOiBvcHRpb25zLm1pbiA/PyAwLFxyXG4gICAgJ2FyaWEtdmFsdWVtYXgnOiBvcHRpb25zLm1heCA/PyAxMDAsXHJcbiAgICAnYXJpYS1sYWJlbCc6IG9wdGlvbnMubGFiZWwsXHJcbiAgICAnYXJpYS12YWx1ZXRleHQnOiBvcHRpb25zLnZhbHVlVGV4dCA/PyBgJHtvcHRpb25zLnZhbHVlfSVgXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIEFSSUEgYXR0cmlidXRlcyBmb3IgYSB0YWIgY29tcG9uZW50XHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFiIGFjY2Vzc2liaWxpdHkgb3B0aW9uc1xyXG4gKiBAcmV0dXJucyBBUklBIGF0dHJpYnV0ZXMgZm9yIHRhYiBhbmQgdGFicGFuZWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJBcmlhQXR0cmlidXRlcyhvcHRpb25zOiB7XHJcbiAgdGFiSWQ6IHN0cmluZztcclxuICBwYW5lbElkOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG59KTogeyB0YWI6IEFyaWFBdHRyaWJ1dGVzOyBwYW5lbDogQXJpYUF0dHJpYnV0ZXMgfSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHRhYjoge1xyXG4gICAgICByb2xlOiAndGFiJyxcclxuICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiBvcHRpb25zLnNlbGVjdGVkLFxyXG4gICAgICAnYXJpYS1jb250cm9scyc6IG9wdGlvbnMucGFuZWxJZCxcclxuICAgICAgJ2FyaWEtZGlzYWJsZWQnOiBvcHRpb25zLmRpc2FibGVkLFxyXG4gICAgICB0YWJpbmRleDogb3B0aW9ucy5zZWxlY3RlZCA/IDAgOiAtMVxyXG4gICAgfSxcclxuICAgIHBhbmVsOiB7XHJcbiAgICAgIHJvbGU6ICd0YWJwYW5lbCcsXHJcbiAgICAgICdhcmlhLWxhYmVsbGVkYnknOiBvcHRpb25zLnRhYklkLFxyXG4gICAgICAnYXJpYS1oaWRkZW4nOiAhb3B0aW9ucy5zZWxlY3RlZCxcclxuICAgICAgdGFiaW5kZXg6IDBcclxuICAgIH1cclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgQVJJQSBhdHRyaWJ1dGVzIGZvciBhIGxpc3Rib3ggb3B0aW9uXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uIGFjY2Vzc2liaWxpdHkgb3B0aW9uc1xyXG4gKiBAcmV0dXJucyBBUklBIGF0dHJpYnV0ZXMgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3B0aW9uQXJpYUF0dHJpYnV0ZXMob3B0aW9uczoge1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICBzZXRzaXplPzogbnVtYmVyO1xyXG4gIHBvc2luc2V0PzogbnVtYmVyO1xyXG59KTogQXJpYUF0dHJpYnV0ZXMge1xyXG4gIHJldHVybiB7XHJcbiAgICByb2xlOiAnb3B0aW9uJyxcclxuICAgICdhcmlhLXNlbGVjdGVkJzogb3B0aW9ucy5zZWxlY3RlZCxcclxuICAgICdhcmlhLWRpc2FibGVkJzogb3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICdhcmlhLXNldHNpemUnOiBvcHRpb25zLnNldHNpemUsXHJcbiAgICAnYXJpYS1wb3NpbnNldCc6IG9wdGlvbnMucG9zaW5zZXRcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgbGlua2VkIElEcyBmb3IgbGFiZWwgYW5kIGlucHV0IGFzc29jaWF0aW9uXHJcbiAqIEBwYXJhbSBiYXNlTmFtZSAtIEJhc2UgbmFtZSBmb3IgZ2VuZXJhdGluZyBJRHNcclxuICogQHJldHVybnMgT2JqZWN0IHdpdGggaW5wdXRJZCwgbGFiZWxJZCwgZXJyb3JJZCwgYW5kIGhlbHBlcklkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVMaW5rZWRJZHMoYmFzZU5hbWU/OiBzdHJpbmcpOiB7XHJcbiAgaW5wdXRJZDogc3RyaW5nO1xyXG4gIGxhYmVsSWQ6IHN0cmluZztcclxuICBlcnJvcklkOiBzdHJpbmc7XHJcbiAgaGVscGVySWQ6IHN0cmluZztcclxufSB7XHJcbiAgY29uc3QgYmFzZSA9IGJhc2VOYW1lIHx8IGdlbmVyYXRlVW5pcXVlSWQoJ2lucHV0Jyk7XHJcbiAgcmV0dXJuIHtcclxuICAgIGlucHV0SWQ6IGJhc2UsXHJcbiAgICBsYWJlbElkOiBgJHtiYXNlfS1sYWJlbGAsXHJcbiAgICBlcnJvcklkOiBgJHtiYXNlfS1lcnJvcmAsXHJcbiAgICBoZWxwZXJJZDogYCR7YmFzZX0taGVscGVyYFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSB2aXN1YWxseSBoaWRkZW4gZWxlbWVudCBmb3Igc2NyZWVuIHJlYWRlcnNcclxuICogQHJldHVybnMgQ1NTIHN0eWxlcyBmb3IgdmlzdWFsbHkgaGlkZGVuIGNvbnRlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRWaXN1YWxseUhpZGRlblN0eWxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICB3aWR0aDogJzFweCcsXHJcbiAgICBoZWlnaHQ6ICcxcHgnLFxyXG4gICAgcGFkZGluZzogJzAnLFxyXG4gICAgbWFyZ2luOiAnLTFweCcsXHJcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXHJcbiAgICBjbGlwOiAncmVjdCgwLCAwLCAwLCAwKScsXHJcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcclxuICAgIGJvcmRlcjogJzAnXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkIHJlZHVjZWQgbW90aW9uIHByZWZlcmVuY2VcclxuICogQHJldHVybnMgVHJ1ZSBpZiB1c2VyIHByZWZlcnMgcmVkdWNlZCBtb3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmVmZXJzUmVkdWNlZE1vdGlvbigpOiBib29sZWFuIHtcclxuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcclxuICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkIGhpZ2ggY29udHJhc3QgbW9kZVxyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGhpZ2ggY29udHJhc3QgbW9kZSBpcyBlbmFibGVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJlZmVyc0hpZ2hDb250cmFzdCgpOiBib29sZWFuIHtcclxuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcclxuICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbnRyYXN0OiBtb3JlKScpLm1hdGNoZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbm5vdW5jZSBhIG1lc3NhZ2UgdG8gc2NyZWVuIHJlYWRlcnMgdXNpbmcgYXJpYS1saXZlIHJlZ2lvbnNcclxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBhbm5vdW5jZVxyXG4gKiBAcGFyYW0gcG9saXRlbmVzcyAtIFRoZSB1cmdlbmN5IGxldmVsIChwb2xpdGUgb3IgYXNzZXJ0aXZlKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFubm91bmNlVG9TY3JlZW5SZWFkZXIoXHJcbiAgbWVzc2FnZTogc3RyaW5nLFxyXG4gIHBvbGl0ZW5lc3M6ICdwb2xpdGUnIHwgJ2Fzc2VydGl2ZScgPSAncG9saXRlJ1xyXG4pOiB2b2lkIHtcclxuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xyXG5cclxuICBjb25zdCBhbm5vdW5jZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICBhbm5vdW5jZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xyXG4gIGFubm91bmNlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIHBvbGl0ZW5lc3MpO1xyXG4gIGFubm91bmNlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYXRvbWljJywgJ3RydWUnKTtcclxuICBPYmplY3QuYXNzaWduKGFubm91bmNlbWVudC5zdHlsZSwgZ2V0VmlzdWFsbHlIaWRkZW5TdHlsZXMoKSk7XHJcblxyXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYW5ub3VuY2VtZW50KTtcclxuXHJcbiAgLy8gRGVsYXkgc2xpZ2h0bHkgdG8gZW5zdXJlIHNjcmVlbiByZWFkZXJzIHBpY2sgdXAgdGhlIGNoYW5nZVxyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgYW5ub3VuY2VtZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTtcclxuICB9LCAxMDApO1xyXG5cclxuICAvLyBDbGVhbiB1cCBhZnRlciBhbm5vdW5jZW1lbnQgaXMgcmVhZFxyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhbm5vdW5jZW1lbnQpO1xyXG4gIH0sIDEwMDApO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBhcHByb3ByaWF0ZSBhcmlhLWN1cnJlbnQgdmFsdWUgZm9yIG5hdmlnYXRpb24gaXRlbXNcclxuICogQHBhcmFtIGlzQWN0aXZlIC0gV2hldGhlciB0aGUgaXRlbSBpcyBhY3RpdmUvY3VycmVudFxyXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIGN1cnJlbnQgaW5kaWNhdG9yXHJcbiAqIEByZXR1cm5zIFRoZSBhcmlhLWN1cnJlbnQgdmFsdWUgb3IgdW5kZWZpbmVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJpYUN1cnJlbnQoXHJcbiAgaXNBY3RpdmU6IGJvb2xlYW4sXHJcbiAgdHlwZTogJ3BhZ2UnIHwgJ3N0ZXAnIHwgJ2xvY2F0aW9uJyB8ICdkYXRlJyB8ICd0aW1lJyA9ICdwYWdlJ1xyXG4pOiBBcmlhQXR0cmlidXRlc1snYXJpYS1jdXJyZW50J10ge1xyXG4gIHJldHVybiBpc0FjdGl2ZSA/IHR5cGUgOiB1bmRlZmluZWQ7XHJcbn1cclxuIl19