@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.
- package/README.md +556 -556
- package/fesm2022/pecb-ui-components.mjs +3826 -1945
- package/fesm2022/pecb-ui-components.mjs.map +1 -1
- package/index.d.ts +3937 -3
- package/package.json +6 -8
- package/esm2022/lib/components/button/button.component.mjs +0 -171
- package/esm2022/lib/components/card/card.component.mjs +0 -182
- package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
- package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
- package/esm2022/lib/components/input/input.component.mjs +0 -321
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
- package/esm2022/lib/components/radio/radio.component.mjs +0 -147
- package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
- package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
- package/esm2022/lib/components/status/status.component.mjs +0 -50
- package/esm2022/lib/components/tab/tab.component.mjs +0 -151
- package/esm2022/lib/components/table/table.component.mjs +0 -503
- package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
- package/esm2022/lib/pecb-components.module.mjs +0 -118
- package/esm2022/lib/services/loading.service.mjs +0 -182
- package/esm2022/lib/services/notification.service.mjs +0 -144
- package/esm2022/lib/services/theme.service.mjs +0 -232
- package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
- package/esm2022/lib/shared/types/common.types.mjs +0 -6
- package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
- package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
- package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
- package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
- package/esm2022/pecb-ui-components.mjs +0 -5
- package/esm2022/public-api.mjs +0 -53
- package/lib/components/button/button.component.d.ts +0 -130
- package/lib/components/card/card.component.d.ts +0 -140
- package/lib/components/checkbox/checkbox.component.d.ts +0 -74
- package/lib/components/datepicker/datepicker.component.d.ts +0 -155
- package/lib/components/dropdown/dropdown.component.d.ts +0 -144
- package/lib/components/input/input.component.d.ts +0 -215
- package/lib/components/pagination/pagination.component.d.ts +0 -53
- package/lib/components/radio/radio.component.d.ts +0 -93
- package/lib/components/right-modal/right-modal.component.d.ts +0 -137
- package/lib/components/sidebar/sidebar.component.d.ts +0 -97
- package/lib/components/status/status.component.d.ts +0 -19
- package/lib/components/tab/tab.component.d.ts +0 -102
- package/lib/components/table/table.component.d.ts +0 -403
- package/lib/components/toggle/toggle.component.d.ts +0 -74
- package/lib/pecb-components.module.d.ts +0 -37
- package/lib/services/loading.service.d.ts +0 -129
- package/lib/services/notification.service.d.ts +0 -136
- package/lib/services/theme.service.d.ts +0 -142
- package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
- package/lib/shared/types/common.types.d.ts +0 -86
- package/lib/shared/utils/accessibility.utils.d.ts +0 -167
- package/lib/shared/utils/dom.utils.d.ts +0 -108
- package/lib/shared/utils/error.utils.d.ts +0 -191
- package/lib/shared/utils/string.utils.d.ts +0 -144
- 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
|