@rooted/elements 1.0.0-alpha.6 → 1.0.0-alpha.8

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.
@@ -1,29 +1,88 @@
1
- import { ElementOnHandlers } from '@rooted/events';
2
-
1
+ import { ElementOnHandlers } from "@rooted/events";
2
+ //#region src/aria.d.mts
3
3
  type StripAria<S extends string> = S extends `aria${infer Rest}` ? Uncapitalize<Rest> : S;
4
- type AriaStringProperties = {
5
- [P in keyof ARIAMixin as ARIAMixin[P] extends string | null ? StripAria<string & P> : never]?: string | null;
6
- };
4
+ type AriaStringProperties = { [P in keyof ARIAMixin as ARIAMixin[P] extends string | null ? StripAria<string & P> : never]?: string | null; };
7
5
  type AriaIdReferenceProperties = {
8
- /** {@inheritdoc ARIAMixin['ariaActiveDescendantElement']} */
9
- activeDescendant?: string | Element | null;
10
- /** {@inheritdoc ARIAMixin['ariaControlsElements']} */
11
- controls?: string | Element | null;
12
- /** {@inheritdoc ARIAMixin['ariaDescribedByElements']} */
13
- describedBy?: string | Element | null;
14
- /** {@inheritdoc ARIAMixin['ariaDetailsElements']} */
15
- details?: string | Element | null;
16
- /** {@inheritdoc ARIAMixin['ariaErrorMessageElements']} */
17
- errorMessage?: string | Element | null;
18
- /** {@inheritdoc ARIAMixin['ariaFlowToElements']} */
19
- flowTo?: string | Element | null;
20
- /** {@inheritdoc ARIAMixin['ariaLabelledByElements']} */
21
- labelledBy?: string | Element | null;
22
- /** {@inheritdoc ARIAMixin['ariaOwnsElements']} */
23
- owns?: string | Element | null;
6
+ /** {@inheritdoc ARIAMixin['ariaActiveDescendantElement']} */
7
+ activeDescendant?: string | Element | null;
8
+ /** {@inheritdoc ARIAMixin['ariaControlsElements']} */
9
+ controls?: string | Element | null;
10
+ /** {@inheritdoc ARIAMixin['ariaDescribedByElements']} */
11
+ describedBy?: string | Element | null;
12
+ /** {@inheritdoc ARIAMixin['ariaDetailsElements']} */
13
+ details?: string | Element | null;
14
+ /** {@inheritdoc ARIAMixin['ariaErrorMessageElements']} */
15
+ errorMessage?: string | Element | null;
16
+ /** {@inheritdoc ARIAMixin['ariaFlowToElements']} */
17
+ flowTo?: string | Element | null;
18
+ /** {@inheritdoc ARIAMixin['ariaLabelledByElements']} */
19
+ labelledBy?: string | Element | null;
20
+ /** {@inheritdoc ARIAMixin['ariaOwnsElements']} */
21
+ owns?: string | Element | null;
24
22
  };
23
+ /**
24
+ * Shape of the `aria` prop on `element(...)`. Accepts every ARIA attribute
25
+ * defined on `ARIAMixin`, with the `aria` prefix stripped (so `aria-label`
26
+ * becomes `label`, `aria-describedby` becomes `describedBy`).
27
+ *
28
+ * For ID-reference attributes (`aria-labelledby`, `aria-controls`, etc.) the
29
+ * value can be a string ID or an `Element` reference. Element references are
30
+ * set via the IDL reflection property when supported, falling back to the
31
+ * attribute value otherwise.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * element('button', {
36
+ * aria: {
37
+ * label: 'Save',
38
+ * describedBy: helpTextElement,
39
+ * pressed: 'false',
40
+ * },
41
+ * })
42
+ * ```
43
+ */
25
44
  type Aria = AriaStringProperties & AriaIdReferenceProperties;
26
-
45
+ //#endregion
46
+ //#region src/children.d.mts
47
+ /**
48
+ * A single child of an element: a `Node` or a string of text. `undefined` and
49
+ * `null` are allowed too, and get skipped when the children are appended, so
50
+ * conditional children don't need a guard.
51
+ */
52
+ type ElementChild = Node | string | undefined | null;
53
+ /**
54
+ * One or more children accepted by the `children` prop of every element
55
+ * created via `element()`, `create()` or `append()`.
56
+ *
57
+ * - A single `Node` or string is appended as-is.
58
+ * - An array is appended in order, skipping `undefined` and `null` entries.
59
+ *
60
+ * Because those entries are skipped, conditional children can be written
61
+ * inline with `optional()`. A plain ternary ending in `undefined` works too,
62
+ * it just reads worse.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { optional } from '@rooted/components'
67
+ *
68
+ * element('label', {
69
+ * children: [
70
+ * element('span', {
71
+ * textContent: 'Name',
72
+ * }),
73
+ * optional(required,
74
+ * element('abbr', {
75
+ * title: 'required',
76
+ * textContent: '*',
77
+ * })
78
+ * ),
79
+ * ],
80
+ * })
81
+ * ```
82
+ */
83
+ type ElementChildren = Array<ElementChild> | ElementChild;
84
+ //#endregion
85
+ //#region src/classes.d.mts
27
86
  /**
28
87
  * A single CSS class value. Falsy variants (`undefined` and `null`) are
29
88
  * automatically filtered out when building a class list, so conditional
@@ -42,86 +101,143 @@ type CssClass = string | undefined | null;
42
101
  */
43
102
  type CssClasses = Array<CssClass> | CssClass;
44
103
  /**
45
- * Returns `className` when `visible` is truthy, otherwise `undefined`.
104
+ * Class names mapped to whether they apply. Only `true` includes the class,
105
+ * anything else leaves it out.
106
+ *
107
+ * Keys have to be strings, so this doesn't work with a `CssModule` value that
108
+ * TypeScript thinks might be `undefined`. Use the list form of
109
+ * {@link cssClasses} for those.
110
+ *
111
+ * @see {@link cssClasses} for the function that reads this.
112
+ */
113
+ type CssClassDictionary = Record<string, boolean | null | undefined>;
114
+ /**
115
+ * Returns `className` when `visible` is `true`, otherwise `undefined`.
46
116
  *
47
117
  * Designed to compose cleanly with {@link CssClasses}: falsy values are
48
118
  * filtered out automatically, so static and conditional classes can be mixed
49
- * in a single array without branching.
119
+ * in a single array without branching. Called with just a class name it
120
+ * returns that name, which is handy when the rest of the array is conditional.
121
+ *
122
+ * The condition comes first, same as `optional()`.
50
123
  *
124
+ * @param visible - When `true` the class is returned, any other value produces
125
+ * `undefined`.
51
126
  * @param className - The CSS class to apply.
52
- * @param visible - When `true` (the default) the class is returned; any other
53
- * value produces `undefined`.
54
127
  *
55
128
  * @example
56
129
  * ```ts
57
130
  * append('button', {
58
131
  * classes: [
59
132
  * 'btn',
60
- * cssClass('btn--active', isActive),
61
- * cssClass('btn--disabled', isDisabled),
133
+ * cssClass(isActive, 'btn--active'),
134
+ * cssClass(isDisabled, 'btn--disabled'),
62
135
  * ],
63
136
  * })
64
137
  * ```
65
138
  */
66
- declare function cssClass(className: string): CssClass;
67
- declare function cssClass(className: string, visible: boolean | null | undefined): CssClass;
68
139
  declare function cssClass(className: CssClass): CssClass;
69
- declare function cssClass(className: CssClass, visible: boolean | null | undefined): CssClass;
70
-
140
+ declare function cssClass(visible: boolean | null | undefined, className: CssClass): CssClass;
141
+ /**
142
+ * Joins several class names into one {@link CssClass}, dropping the falsy
143
+ * ones. Returns `undefined` when nothing is left, so the result disappears
144
+ * from a `classes` array instead of adding an empty string.
145
+ *
146
+ * Three ways to call it:
147
+ *
148
+ * - `cssClasses('a', 'b')` joins what you pass.
149
+ * - `cssClasses(visible, 'a', 'b')` joins them only when `visible` is `true`.
150
+ * - `cssClasses({ a: true, b: false })` keeps the keys mapped to `true`.
151
+ *
152
+ * Watch out for one overlap: a leading `undefined` or `null` is read as the
153
+ * condition, so `cssClasses(undefined, 'a')` is `undefined` and not `'a'`.
154
+ * A class name that might be `undefined`, like anything off a `CssModule`,
155
+ * belongs after the condition rather than first.
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * append('button', {
160
+ * classes: [
161
+ * cssClasses(styles.button, styles.rounded),
162
+ * cssClasses(isActive, styles.active, styles.raised),
163
+ * cssClasses({
164
+ * 'btn--disabled': isDisabled,
165
+ * }),
166
+ * ],
167
+ * })
168
+ * ```
169
+ */
170
+ declare function cssClasses(visible: boolean | null | undefined, ...classNames: Array<CssClass>): CssClass;
171
+ declare function cssClasses(...classNames: Array<CssClass>): CssClass;
172
+ declare function cssClasses(classNames: CssClassDictionary): CssClass;
173
+ //#endregion
174
+ //#region src/element-type-utilities.d.mts
71
175
  type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? A : B;
72
- type NonWritableKeys<T> = {
73
- [P in keyof T]-?: IfEquals<{
74
- [Q in P]: T[P];
75
- }, {
76
- -readonly [Q in P]: T[P];
77
- }, never, P>;
78
- }[keyof T];
79
- type FunctionKeys<T> = {
80
- [P in keyof T]: NonNullable<T[P]> extends (...arguments_: never[]) => unknown ? P : never;
81
- }[keyof T];
82
- type OnHandlerKeys<T> = {
83
- [P in keyof T]: P extends `on${string}` ? P : never;
84
- }[keyof T];
176
+ type NonWritableKeys<T> = { [P in keyof T]-?: IfEquals<{ [Q in P]: T[P]; }, { -readonly [Q in P]: T[P]; }, never, P>; }[keyof T];
177
+ type FunctionKeys<T> = { [P in keyof T]: NonNullable<T[P]> extends ((...arguments_: never[]) => unknown) ? P : never; }[keyof T];
178
+ type OnHandlerKeys<T> = { [P in keyof T]: P extends `on${string}` ? P : never; }[keyof T];
85
179
  /** A subset of CSSStyleDeclaration containing only the individual CSS style properties. */
86
- type InlineStyle = {
87
- [K in keyof CSSStyleDeclaration as CSSStyleDeclaration[K] extends string ? K extends 'cssText' ? never : K : never]?: string;
88
- };
89
-
180
+ type InlineStyle = { [K in keyof CSSStyleDeclaration as CSSStyleDeclaration[K] extends string ? K extends 'cssText' ? never : K : never]?: string; };
181
+ //#endregion
182
+ //#region src/html-element-properties.d.mts
90
183
  type SanitizedHtmlProperties<TElement extends HTMLElement> = Omit<TElement, NonWritableKeys<TElement> | FunctionKeys<TElement> | Exclude<keyof ARIAMixin, 'role'> | OnHandlerKeys<TElement> | 'children' | 'className' | 'classList' | 'style'>;
91
184
  type HtmlElementPropertiesMapped<TElement extends HTMLElement> = Partial<SanitizedHtmlProperties<TElement>> & {
92
- [key: string]: unknown;
93
- children?: Array<Node | string> | Node | string;
94
- classes?: CssClasses;
95
- style?: InlineStyle;
96
- aria?: Aria;
97
- on?: ElementOnHandlers<TElement>;
185
+ [key: string]: unknown;
186
+ children?: ElementChildren;
187
+ classes?: CssClasses;
188
+ style?: InlineStyle;
189
+ aria?: Aria;
190
+ on?: ElementOnHandlers<TElement>;
98
191
  };
192
+ /**
193
+ * Typed properties for the HTML element with tag `KElement`. Returned as the
194
+ * second argument to `element(tag, props)` for HTML tags.
195
+ *
196
+ * Includes the writable DOM properties of the element, plus rooted's own
197
+ * `classes`, `style`, `aria`, `on`, and `children` shorthands. Unknown keys
198
+ * (`data-*`, custom attributes) fall through as strings.
199
+ */
99
200
  type HtmlElementProperties<KElement extends keyof HTMLElementTagNameMap> = HtmlElementPropertiesMapped<HTMLElementTagNameMap[KElement]>;
100
-
201
+ //#endregion
202
+ //#region src/svg-element-properties.d.mts
203
+ /**
204
+ * Tag names accepted by `element(...)` for SVG. Use `'svg'` for the root
205
+ * element and `'svg:<name>'` for the rest. The prefix avoids collisions with
206
+ * same-named HTML tags (`a`, `title`, etc.).
207
+ */
101
208
  type SvgTagName = 'svg' | `svg:${Exclude<keyof SVGElementTagNameMap, 'svg'>}`;
209
+ /** Maps a {@link SvgTagName} back to the concrete SVG element class. */
102
210
  type SvgTagElement<T extends SvgTagName> = T extends 'svg' ? SVGSVGElement : T extends `svg:${infer K extends keyof SVGElementTagNameMap}` ? SVGElementTagNameMap[K] : never;
103
211
  type SanitizedSvgProperties<TElement extends SVGElement> = Omit<TElement, NonWritableKeys<TElement> | FunctionKeys<TElement> | Exclude<keyof ARIAMixin, 'role'> | OnHandlerKeys<TElement> | 'children' | 'className' | 'classList' | 'style'>;
104
212
  type SvgElementPropertiesMapped<TElement extends SVGElement> = Partial<SanitizedSvgProperties<TElement>> & {
105
- [key: string]: unknown;
106
- classes?: CssClasses;
107
- style?: InlineStyle;
108
- children?: Array<Node | string> | Node | string;
109
- aria?: Aria;
110
- on?: ElementOnHandlers<TElement>;
213
+ [key: string]: unknown;
214
+ classes?: CssClasses;
215
+ style?: InlineStyle;
216
+ children?: ElementChildren;
217
+ aria?: Aria;
218
+ on?: ElementOnHandlers<TElement>;
111
219
  };
220
+ /**
221
+ * Typed properties for the SVG element with tag `K`. Returned as the second
222
+ * argument to `element(tag, props)` for SVG tags. Unknown keys fall through
223
+ * to `setAttribute`, so SVG-specific attributes (`viewBox`, `d`, `href`)
224
+ * work without special-casing.
225
+ */
112
226
  type SvgElementProperties<K extends SvgTagName> = SvgElementPropertiesMapped<SvgTagElement<K> & SVGElement>;
113
-
227
+ //#endregion
228
+ //#region src/element-factory.d.mts
114
229
  type ElementCreator = (key: string, ns?: string) => Element;
115
230
  /**
116
231
  * The overloaded function type returned by {@link createElementFactory}.
117
232
  * Accepts HTML or SVG tag names and returns the matching element type.
118
233
  */
119
234
  interface ElementCreatorFunction {
120
- (tag: 'svg', properties?: SvgElementProperties<'svg'>): SVGSVGElement;
121
- <K extends Exclude<SvgTagName, 'svg'>>(tag: K, properties?: SvgElementProperties<K>): SvgTagElement<K>;
122
- <K extends keyof HTMLElementTagNameMap>(tag: K, properties?: NoInfer<HtmlElementProperties<K>>): HTMLElementTagNameMap[K];
235
+ (tag: 'svg', properties?: SvgElementProperties<'svg'>): SVGSVGElement;
236
+ <K extends Exclude<SvgTagName, 'svg'>>(tag: K, properties?: SvgElementProperties<K>): SvgTagElement<K>;
237
+ <K extends keyof HTMLElementTagNameMap>(tag: K, properties?: NoInfer<HtmlElementProperties<K>>): HTMLElementTagNameMap[K];
123
238
  }
124
239
  type ElementFactory = ElementCreatorFunction;
125
240
  declare function createElementFactory(constructElement: ElementCreator, signal: AbortSignal): ElementCreatorFunction;
126
-
127
- export { type Aria, type CssClass, type CssClasses, type ElementCreator, type ElementCreatorFunction, type ElementFactory, type HtmlElementProperties, type SvgElementProperties, type SvgTagElement, type SvgTagName, createElementFactory, cssClass };
241
+ //#endregion
242
+ export { type Aria, CssClass, CssClassDictionary, CssClasses, ElementChild, ElementChildren, ElementCreator, ElementCreatorFunction, ElementFactory, type HtmlElementProperties, type SvgElementProperties, type SvgTagElement, type SvgTagName, createElementFactory, cssClass, cssClasses };
243
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FyaWEubXRzIiwiLi4vc3JjL2NoaWxkcmVuLm10cyIsIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9lbGVtZW50LXR5cGUtdXRpbGl0aWVzLm10cyIsIi4uL3NyYy9odG1sLWVsZW1lbnQtcHJvcGVydGllcy5tdHMiLCIuLi9zcmMvc3ZnLWVsZW1lbnQtcHJvcGVydGllcy5tdHMiLCIuLi9zcmMvZWxlbWVudC1mYWN0b3J5Lm10cyJdLCJtYXBwaW5ncyI6Ijs7S0FBSyxVQUFVLG9CQUFvQix1QkFBdUIsU0FBUyxhQUFhLFFBQVE7S0FFbkYsMEJBQ0gsV0FBVyxhQUFhLFVBQVUsMkJBQTJCLG1CQUFtQjtLQUk3RTs7RUFFSiw0QkFBNEI7O0VBRTVCLG9CQUFvQjs7RUFFcEIsdUJBQXVCOztFQUV2QixtQkFBbUI7O0VBRW5CLHdCQUF3Qjs7RUFFeEIsa0JBQWtCOztFQUVsQixzQkFBc0I7O0VBRXRCLGdCQUFnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F3QkwsT0FBTyx1QkFBdUI7Ozs7Ozs7O0tDMUM5QixlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBZ0NmLGtCQUFrQixNQUFNLGdCQUFnQjs7Ozs7Ozs7S0NoQ3hDOzs7Ozs7Ozs7OztLQVlBLGFBQWEsTUFBTSxZQUFZOzs7Ozs7Ozs7OztLQVkvQixxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQTJCakIsU0FBUyxXQUFXLFdBQVc7aUJBQy9CLFNBQVMscUNBQXFDLFdBQVcsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQXNDcEUsV0FBVyx3Q0FBd0MsWUFBWSxNQUFNLFlBQVk7aUJBQ2pGLGNBQWMsWUFBWSxNQUFNLFlBQVk7aUJBQzVDLFdBQVcsWUFBWSxxQkFBcUI7OztLQ2pHaEQsU0FBUyxHQUFHLEdBQUcsSUFBSSxHQUFHLGVBQWUsUUFBUSxVQUFVLHFCQUFxQixRQUFRLFVBQVUsYUFBYSxJQUFJO0tBQy9HLGdCQUFnQixRQUMxQixXQUFXLE1BQU0sWUFBWSxLQUFLLElBQUksRUFBRSxvQkFBbUIsS0FBSyxJQUFJLEVBQUUsY0FBYSxZQUM3RTtLQUNJLGFBQWEsUUFDdkIsV0FBVyxJQUFJLFlBQVksRUFBRSxpQkFBZ0IsbUNBQWtDLG1CQUN6RTtLQUNJLGNBQWMsUUFBUSxXQUFXLElBQUksMEJBQTBCLG1CQUFrQjs7S0FHakYsaUJBQWlCLFdBQVcsdUJBQXVCLG9CQUFvQixvQkFBb0IsOEJBQThCOzs7S0NIaEksd0JBQXdCLGlCQUFpQixlQUFlLEtBQzVELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiw0QkFBNEIsaUJBQWlCLGVBQy9DLFFBQVEsd0JBQXdCO0dBR2hDO0VBQ0QsV0FBVztFQUNYLFVBQVU7RUFDVixRQUFRO0VBQ1IsT0FBTztFQUNQLEtBQUssa0JBQWtCOzs7Ozs7Ozs7O0tBV2Isc0JBQXNCLHVCQUF1Qix5QkFDdEQsNEJBQTRCLHNCQUFzQjs7Ozs7Ozs7S0N6QnpDLDRCQUE0QixjQUFjOztLQUcxQyxjQUFjLFVBQVUsY0FDakMsa0JBQWtCLGdCQUNsQix1QkFBdUIsZ0JBQWdCLHlCQUF5QixxQkFBcUI7S0FHbkYsdUJBQXVCLGlCQUFpQixjQUFjLEtBQzFELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiwyQkFBMkIsaUJBQWlCLGNBQzlDLFFBQVEsdUJBQXVCO0dBRy9CO0VBQ0QsVUFBVTtFQUNWLFFBQVE7RUFDUixXQUFXO0VBQ1gsT0FBTztFQUNQLEtBQUssa0JBQWtCOzs7Ozs7OztLQVNiLHFCQUFxQixVQUFVLGNBQ3hDLDJCQUEyQixjQUFjLEtBQUs7OztLQ1ByQyxrQkFBa0IsYUFBYSxnQkFBZ0I7Ozs7O1VBTTFDO0dBQ2YsWUFBWSxhQUFhLDhCQUE4QjtHQUN2RCxVQUFVLFFBQVEsb0JBQW9CLEtBQUssR0FBRyxhQUFhLHFCQUFxQixLQUFLLGNBQWM7R0FDbkcsZ0JBQWdCLHVCQUF1QixLQUFLLEdBQUcsYUFBYSxRQUFRLHNCQUFzQixNQUFNLHNCQUFzQjs7S0FHNUcsaUJBQWlCO2lCQUNiLHFCQUFxQixrQkFBa0IsZ0JBQWdCLFFBQVEsY0FBYyJ9
package/dist/elements.mjs CHANGED
@@ -1,132 +1,135 @@
1
- // src/classes.mts
2
- function cssClass(className, visible = true) {
3
- if (visible !== true) return;
4
- return className;
1
+ //#region src/classes.mts
2
+ function cssClass(...arguments_) {
3
+ if (arguments_.length === 1) return arguments_[0];
4
+ const [visible, className] = arguments_;
5
+ if (visible !== true) return;
6
+ return className;
5
7
  }
6
-
7
- // src/aria.mts
8
- var ariaIdReferenceAttributes = {
9
- activeDescendant: "aria-activedescendant",
10
- controls: "aria-controls",
11
- describedBy: "aria-describedby",
12
- details: "aria-details",
13
- errorMessage: "aria-errormessage",
14
- flowTo: "aria-flowto",
15
- labelledBy: "aria-labelledby",
16
- owns: "aria-owns"
8
+ function cssClasses(...arguments_) {
9
+ const [first, ...rest] = arguments_;
10
+ if (typeof first === "string") return joinClassNames([first, ...rest]);
11
+ if (first === void 0 || first === null || typeof first === "boolean") {
12
+ if (first !== true) return;
13
+ return joinClassNames(rest);
14
+ }
15
+ return joinClassNames(Object.entries(first).filter(([, visible]) => visible === true).map(([className]) => className));
16
+ }
17
+ function joinClassNames(classNames) {
18
+ const className = classNames.filter(Boolean).join(" ");
19
+ if (!className) return;
20
+ return className;
21
+ }
22
+ //#endregion
23
+ //#region src/aria.mts
24
+ const ariaIdReferenceAttributes = {
25
+ activeDescendant: "aria-activedescendant",
26
+ controls: "aria-controls",
27
+ describedBy: "aria-describedby",
28
+ details: "aria-details",
29
+ errorMessage: "aria-errormessage",
30
+ flowTo: "aria-flowto",
31
+ labelledBy: "aria-labelledby",
32
+ owns: "aria-owns"
17
33
  };
18
- var ariaIdReferenceElementProperties = {
19
- activeDescendant: "ariaActiveDescendantElement",
20
- controls: "ariaControlsElements",
21
- describedBy: "ariaDescribedByElements",
22
- details: "ariaDetailsElements",
23
- errorMessage: "ariaErrorMessageElements",
24
- flowTo: "ariaFlowToElements",
25
- labelledBy: "ariaLabelledByElements",
26
- owns: "ariaOwnsElements"
34
+ const ariaIdReferenceElementProperties = {
35
+ activeDescendant: "ariaActiveDescendantElement",
36
+ controls: "ariaControlsElements",
37
+ describedBy: "ariaDescribedByElements",
38
+ details: "ariaDetailsElements",
39
+ errorMessage: "ariaErrorMessageElements",
40
+ flowTo: "ariaFlowToElements",
41
+ labelledBy: "ariaLabelledByElements",
42
+ owns: "ariaOwnsElements"
27
43
  };
28
44
  function setProperty(element, key, value) {
29
- element[key] = value;
45
+ element[key] = value;
30
46
  }
31
47
  function buildAriaProperties(aria, element) {
32
- if (!aria) return;
33
- for (const [key, value] of Object.entries(aria)) {
34
- if (!(key in ariaIdReferenceAttributes)) {
35
- const domKey = `aria${key[0].toUpperCase()}${key.slice(1)}`;
36
- setProperty(element, domKey, value);
37
- continue;
38
- }
39
- if (value === null || value === void 0) {
40
- element.removeAttribute(ariaIdReferenceAttributes[key]);
41
- continue;
42
- }
43
- if (value instanceof Element) {
44
- const idlKey = ariaIdReferenceElementProperties[key];
45
- setProperty(element, idlKey, idlKey.endsWith("Elements") ? [value] : value);
46
- continue;
47
- }
48
- element.setAttribute(ariaIdReferenceAttributes[key], value);
49
- }
48
+ if (!aria) return;
49
+ for (const [key, value] of Object.entries(aria)) {
50
+ if (!(key in ariaIdReferenceAttributes)) {
51
+ setProperty(element, `aria${key[0].toUpperCase()}${key.slice(1)}`, value);
52
+ continue;
53
+ }
54
+ if (value === null || value === void 0) {
55
+ element.removeAttribute(ariaIdReferenceAttributes[key]);
56
+ continue;
57
+ }
58
+ if (value instanceof Element) {
59
+ const idlKey = ariaIdReferenceElementProperties[key];
60
+ setProperty(element, idlKey, idlKey.endsWith("Elements") ? [value] : value);
61
+ continue;
62
+ }
63
+ element.setAttribute(ariaIdReferenceAttributes[key], value);
64
+ }
50
65
  }
51
-
52
- // src/element-factory.mts
66
+ //#endregion
67
+ //#region src/element-factory.mts
53
68
  function buildOnHandlers(on, element, signal) {
54
- if (!on) return;
55
- for (const [key, handler] of Object.entries(on)) {
56
- if (!handler) continue;
57
- element.addEventListener(
58
- key,
59
- (event) => void handler(event),
60
- signal ? { signal } : void 0
61
- );
62
- }
69
+ if (!on) return;
70
+ for (const [key, handler] of Object.entries(on)) {
71
+ if (!handler) continue;
72
+ element.addEventListener(key, (event) => void handler(event), signal ? { signal } : void 0);
73
+ }
63
74
  }
64
75
  function buildClassList(classes) {
65
- if (classes === null || classes === void 0) return {};
66
- if (Array.isArray(classes)) return { className: classes.filter(Boolean).join(" ") };
67
- return { className: String(classes) };
76
+ if (classes === null || classes === void 0) return {};
77
+ if (Array.isArray(classes)) return { className: classes.filter(Boolean).join(" ") };
78
+ return { className: String(classes) };
68
79
  }
69
80
  function isWritableDomProperty(element, key) {
70
- let proto = element;
71
- while (proto) {
72
- const desc = Object.getOwnPropertyDescriptor(proto, key);
73
- if (desc) return !!(desc.writable || desc.set);
74
- proto = Object.getPrototypeOf(proto);
75
- }
76
- return false;
81
+ let prototype = element;
82
+ while (prototype) {
83
+ const desc = Object.getOwnPropertyDescriptor(prototype, key);
84
+ if (desc) return !!(desc.writable || desc.set);
85
+ prototype = Object.getPrototypeOf(prototype);
86
+ }
87
+ return false;
77
88
  }
78
89
  function createElementFactory(constructElement, signal) {
79
- function createElement(tag, properties) {
80
- if (tag === "svg" || tag.startsWith("svg:")) {
81
- const actualTag = tag === "svg" ? "svg" : tag.slice(4);
82
- const { classes: classes2, children: children2, aria: aria2, on: on2, style: style2, ...attributes } = properties ?? {};
83
- const newElement2 = constructElement(actualTag, "http://www.w3.org/2000/svg");
84
- for (const [key, value] of Object.entries(attributes)) {
85
- if (value === void 0 || value === null) continue;
86
- if (isWritableDomProperty(newElement2, key)) {
87
- newElement2[key] = value;
88
- } else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
89
- newElement2.setAttribute(key, String(value));
90
- }
91
- }
92
- const { className: className2 } = buildClassList(classes2);
93
- if (className2) newElement2.setAttribute("class", className2);
94
- if (style2) Object.assign(newElement2.style, style2);
95
- buildAriaProperties(aria2, newElement2);
96
- buildOnHandlers(on2, newElement2, signal);
97
- appendChildren(newElement2, children2);
98
- return newElement2;
99
- }
100
- const { aria, children, classes, on, style, ...assignableProperties } = properties ?? {};
101
- const newElement = constructElement(tag);
102
- const { className } = buildClassList(classes);
103
- if (className) newElement.className = className;
104
- for (const [key, value] of Object.entries(assignableProperties)) {
105
- if (value === void 0 || value === null) continue;
106
- if (isWritableDomProperty(newElement, key)) {
107
- newElement[key] = value;
108
- } else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
109
- newElement.setAttribute(key, String(value));
110
- }
111
- }
112
- if (style) Object.assign(newElement.style, style);
113
- buildAriaProperties(aria, newElement);
114
- buildOnHandlers(on, newElement, signal);
115
- appendChildren(newElement, children);
116
- return newElement;
117
- }
118
- return createElement;
90
+ function createElement(tag, properties) {
91
+ if (tag === "svg" || tag.startsWith("svg:")) {
92
+ const actualTag = tag === "svg" ? "svg" : tag.slice(4);
93
+ const { classes, children, aria, on, style, ...attributes } = properties ?? {};
94
+ const newElement = constructElement(actualTag, "http://www.w3.org/2000/svg");
95
+ for (const [key, value] of Object.entries(attributes)) {
96
+ if (value === void 0 || value === null) continue;
97
+ if (isWritableDomProperty(newElement, key)) newElement[key] = value;
98
+ else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") newElement.setAttribute(key, String(value));
99
+ }
100
+ const { className } = buildClassList(classes);
101
+ if (className) newElement.setAttribute("class", className);
102
+ if (style) Object.assign(newElement.style, style);
103
+ buildAriaProperties(aria, newElement);
104
+ buildOnHandlers(on, newElement, signal);
105
+ appendChildren(newElement, children);
106
+ return newElement;
107
+ }
108
+ const { aria, children, classes, on, style, ...assignableProperties } = properties ?? {};
109
+ const newElement = constructElement(tag);
110
+ const { className } = buildClassList(classes);
111
+ if (className) newElement.className = className;
112
+ for (const [key, value] of Object.entries(assignableProperties)) {
113
+ if (value === void 0 || value === null) continue;
114
+ if (isWritableDomProperty(newElement, key)) newElement[key] = value;
115
+ else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") newElement.setAttribute(key, String(value));
116
+ }
117
+ if (style) Object.assign(newElement.style, style);
118
+ buildAriaProperties(aria, newElement);
119
+ buildOnHandlers(on, newElement, signal);
120
+ appendChildren(newElement, children);
121
+ return newElement;
122
+ }
123
+ return createElement;
119
124
  }
120
125
  function appendChildren(element, children) {
121
- if (Array.isArray(children)) {
122
- for (const child of children) {
123
- element.append(child);
124
- }
125
- } else if (children) {
126
- element.append(children);
127
- }
126
+ if (Array.isArray(children)) for (const child of children) {
127
+ if (child === void 0 || child === null) continue;
128
+ element.append(child);
129
+ }
130
+ else if (children) element.append(children);
128
131
  }
132
+ //#endregion
133
+ export { createElementFactory, cssClass, cssClasses };
129
134
 
130
- export { createElementFactory, cssClass };
131
- //# sourceMappingURL=elements.mjs.map
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9hcmlhLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sIm5hbWVzIjpbImNsYXNzZXMiLCJjaGlsZHJlbiIsImFyaWEiLCJvbiIsInN0eWxlIiwibmV3RWxlbWVudCIsImNsYXNzTmFtZSJdLCJtYXBwaW5ncyI6IjtBQTZDTyxTQUFTLFFBQUEsQ0FBUyxTQUFBLEVBQXFCLE9BQUEsR0FBc0MsSUFBQSxFQUFnQjtBQUNuRyxFQUFBLElBQUksWUFBWSxJQUFBLEVBQU07QUFDdEIsRUFBQSxPQUFPLFNBQUE7QUFDUjs7O0FDcEJBLElBQU0seUJBQUEsR0FBNkU7QUFBQSxFQUNsRixnQkFBQSxFQUFrQix1QkFBQTtBQUFBLEVBQ2xCLFFBQUEsRUFBVSxlQUFBO0FBQUEsRUFDVixXQUFBLEVBQWEsa0JBQUE7QUFBQSxFQUNiLE9BQUEsRUFBUyxjQUFBO0FBQUEsRUFDVCxZQUFBLEVBQWMsbUJBQUE7QUFBQSxFQUNkLE1BQUEsRUFBUSxhQUFBO0FBQUEsRUFDUixVQUFBLEVBQVksaUJBQUE7QUFBQSxFQUNaLElBQUEsRUFBTTtBQUNQLENBQUE7QUFHQSxJQUFNLGdDQUFBLEdBQW9GO0FBQUEsRUFDekYsZ0JBQUEsRUFBa0IsNkJBQUE7QUFBQSxFQUNsQixRQUFBLEVBQVUsc0JBQUE7QUFBQSxFQUNWLFdBQUEsRUFBYSx5QkFBQTtBQUFBLEVBQ2IsT0FBQSxFQUFTLHFCQUFBO0FBQUEsRUFDVCxZQUFBLEVBQWMsMEJBQUE7QUFBQSxFQUNkLE1BQUEsRUFBUSxvQkFBQTtBQUFBLEVBQ1IsVUFBQSxFQUFZLHdCQUFBO0FBQUEsRUFDWixJQUFBLEVBQU07QUFDUCxDQUFBO0FBRUEsU0FBUyxXQUFBLENBQVksT0FBQSxFQUFrQixHQUFBLEVBQWEsS0FBQSxFQUFzQjtBQUN6RSxFQUFDLE9BQUEsQ0FBK0MsR0FBRyxDQUFBLEdBQUksS0FBQTtBQUN4RDtBQUVPLFNBQVMsbUJBQUEsQ0FBb0IsTUFBd0IsT0FB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QyxDQUFBO0FBQUEsTUFDM0M7QUFBQSxJQUNEO0FBRUEsSUFBQSxJQUFJLEtBQUEsRUFBTyxNQUFBLENBQU8sTUFBQSxDQUFPLFVBQUEsQ0FBVyxPQUFPLEtBQUssQ0FBQTtBQUNoRCxJQUFBLG1CQUFBLENBQW9CLE1BQTBCLFVBQVUsQ0FBQTtBQUN4RCxJQUFBLGVBQUEsQ0FBZ0IsRUFBQSxFQUFrRCxZQUFZLE1BQU0sQ0FBQTtBQUNwRixJQUFBLGNBQUEsQ0FBZSxZQUFZLFFBQTRELENBQUE7QUFFdkYsSUFBQSxPQUFPLFVBQUE7QUFBQSxFQUNSO0FBRUEsRUFBQSxPQUFPLGFBQUE7QUFDUjtBQUVBLFNBQVMsY0FBQSxDQUFlLFNBQWtCLFFBQUEsRUFBa0U7QUFDM0csRUFBQSxJQUFJLEtBQUEsQ0FBTSxPQUFBLENBQVEsUUFBUSxDQUFBLEVBQUc7QUFDNUIsSUFBQSxLQUFBLE1BQVcsU0FBUyxRQUFBLEVBQVU7QUFDN0IsTUFBQSxPQUFBLENBQVEsT0FBTyxLQUFLLENBQUE7QUFBQSxJQUNyQjtBQUFBLEVBQ0QsV0FDUyxRQUFBLEVBQVU7QUFDbEIsSUFBQSxPQUFBLENBQVEsT0FBTyxRQUFRLENBQUE7QUFBQSxFQUN4QjtBQUNEIiwiZmlsZSI6ImVsZW1lbnRzLm1qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzaW5nbGUgQ1NTIGNsYXNzIHZhbHVlLiBGYWxzeSB2YXJpYW50cyAoYHVuZGVmaW5lZGAgYW5kIGBudWxsYCkgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dCB3aGVuIGJ1aWxkaW5nIGEgY2xhc3MgbGlzdCwgc28gY29uZGl0aW9uYWxcbiAqIGNsYXNzZXMgY2FuIGJlIGV4cHJlc3NlZCB3aXRob3V0IGV4cGxpY2l0IGd1YXJkcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3MgPSBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG5cbi8qKlxuICogT25lIG9yIG1vcmUgQ1NTIGNsYXNzIHZhbHVlcyBhY2NlcHRlZCBieSB0aGUgYGNsYXNzZXNgIHByb3Agb2YgZXZlcnkgSFRNTFxuICogZWxlbWVudCBjcmVhdGVkIHZpYSBgY3JlYXRlKClgIG9yIGBhcHBlbmQoKWAuXG4gKlxuICogLSBBIHNpbmdsZSBzdHJpbmcgaXMgdXNlZCBhcy1pcy5cbiAqIC0gQW4gYXJyYXkgb2Yge0BsaW5rIENzc0NsYXNzfSB2YWx1ZXMgaXMgam9pbmVkIHdpdGggc3BhY2VzIGFmdGVyIGZhbHN5XG4gKiAgIGVudHJpZXMgYXJlIHJlbW92ZWQuXG4gKlxuICogQHNlZSB7QGxpbmsgY3NzQ2xhc3N9IGZvciBjb21wb3NpbmcgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENzc0NsYXNzZXMgPSBBcnJheTxDc3NDbGFzcz4gfCBDc3NDbGFzc1xuXG4vKipcbiAqIFJldHVybnMgYGNsYXNzTmFtZWAgd2hlbiBgdmlzaWJsZWAgaXMgdHJ1dGh5LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gKlxuICogRGVzaWduZWQgdG8gY29tcG9zZSBjbGVhbmx5IHdpdGgge0BsaW5rIENzc0NsYXNzZXN9OiBmYWxzeSB2YWx1ZXMgYXJlXG4gKiBmaWx0ZXJlZCBvdXQgYXV0b21hdGljYWxseSwgc28gc3RhdGljIGFuZCBjb25kaXRpb25hbCBjbGFzc2VzIGNhbiBiZSBtaXhlZFxuICogaW4gYSBzaW5nbGUgYXJyYXkgd2l0aG91dCBicmFuY2hpbmcuXG4gKlxuICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkuXG4gKiBAcGFyYW0gdmlzaWJsZSAtIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCkgdGhlIGNsYXNzIGlzIHJldHVybmVkOyBhbnkgb3RoZXJcbiAqICAgdmFsdWUgcHJvZHVjZXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhcHBlbmQoJ2J1dHRvbicsIHtcbiAqICAgY2xhc3NlczogW1xuICogICAgICdidG4nLFxuICogICAgIGNzc0NsYXNzKCdidG4tLWFjdGl2ZScsIGlzQWN0aXZlKSxcbiAqICAgICBjc3NDbGFzcygnYnRuLS1kaXNhYmxlZCcsIGlzRGlzYWJsZWQpLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcyk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcywgdmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKGNsYXNzTmFtZTogQ3NzQ2xhc3MsIHZpc2libGU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkID0gdHJ1ZSk6IENzc0NsYXNzIHtcblx0aWYgKHZpc2libGUgIT09IHRydWUpIHJldHVyblxuXHRyZXR1cm4gY2xhc3NOYW1lXG59XG4iLCJ0eXBlIFN0cmlwQXJpYTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgYXJpYSR7aW5mZXIgUmVzdH1gID8gVW5jYXBpdGFsaXplPFJlc3Q+IDogU1xuXG50eXBlIEFyaWFTdHJpbmdQcm9wZXJ0aWVzID0ge1xuXHRbUCBpbiBrZXlvZiBBUklBTWl4aW4gYXMgQVJJQU1peGluW1BdIGV4dGVuZHMgc3RyaW5nIHwgbnVsbCA/IFN0cmlwQXJpYTxzdHJpbmcgJiBQPiA6IG5ldmVyXT86IHN0cmluZyB8IG51bGxcbn1cblxuLy8gUHJvcGVydGllcyB0aGF0IG9ubHkgZXhpc3QgYXMgRWxlbWVudFtdIGluIEFSSUFNaXhpbiDigJQgYWNjZXB0cyBhIHN0cmluZyBJRCBvciBhbiBFbGVtZW50IGRpcmVjdGx5XG50eXBlIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXMgPSB7XG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhQWN0aXZlRGVzY2VuZGFudEVsZW1lbnQnXX0gKi9cblx0YWN0aXZlRGVzY2VuZGFudD86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhQ29udHJvbHNFbGVtZW50cyddfSAqL1xuXHRjb250cm9scz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhRGVzY3JpYmVkQnlFbGVtZW50cyddfSAqL1xuXHRkZXNjcmliZWRCeT86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhRGV0YWlsc0VsZW1lbnRzJ119ICovXG5cdGRldGFpbHM/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUVycm9yTWVzc2FnZUVsZW1lbnRzJ119ICovXG5cdGVycm9yTWVzc2FnZT86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhRmxvd1RvRWxlbWVudHMnXX0gKi9cblx0Zmxvd1RvPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFMYWJlbGxlZEJ5RWxlbWVudHMnXX0gKi9cblx0bGFiZWxsZWRCeT86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhT3duc0VsZW1lbnRzJ119ICovXG5cdG93bnM/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxufVxuXG5leHBvcnQgdHlwZSBBcmlhID0gQXJpYVN0cmluZ1Byb3BlcnRpZXMgJiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzXG5cbmNvbnN0IGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXM6IFJlY29yZDxrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzLCBzdHJpbmc+ID0ge1xuXHRhY3RpdmVEZXNjZW5kYW50OiAnYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyxcblx0Y29udHJvbHM6ICdhcmlhLWNvbnRyb2xzJyxcblx0ZGVzY3JpYmVkQnk6ICdhcmlhLWRlc2NyaWJlZGJ5Jyxcblx0ZGV0YWlsczogJ2FyaWEtZGV0YWlscycsXG5cdGVycm9yTWVzc2FnZTogJ2FyaWEtZXJyb3JtZXNzYWdlJyxcblx0Zmxvd1RvOiAnYXJpYS1mbG93dG8nLFxuXHRsYWJlbGxlZEJ5OiAnYXJpYS1sYWJlbGxlZGJ5Jyxcblx0b3duczogJ2FyaWEtb3ducycsXG59XG5cbi8vIGFyaWFBY3RpdmVEZXNjZW5kYW50RWxlbWVudCBpcyBzaW5ndWxhcjsgdGhlIHJlc3QgdGFrZSBFbGVtZW50W11cbmNvbnN0IGFyaWFJZFJlZmVyZW5jZUVsZW1lbnRQcm9wZXJ0aWVzOiBSZWNvcmQ8a2V5b2YgQXJpYUlkUmVmZXJlbmNlUHJvcGVydGllcywgc3RyaW5nPiA9IHtcblx0YWN0aXZlRGVzY2VuZGFudDogJ2FyaWFBY3RpdmVEZXNjZW5kYW50RWxlbWVudCcsXG5cdGNvbnRyb2xzOiAnYXJpYUNvbnRyb2xzRWxlbWVudHMnLFxuXHRkZXNjcmliZWRCeTogJ2FyaWFEZXNjcmliZWRCeUVsZW1lbnRzJyxcblx0ZGV0YWlsczogJ2FyaWFEZXRhaWxzRWxlbWVudHMnLFxuXHRlcnJvck1lc3NhZ2U6ICdhcmlhRXJyb3JNZXNzYWdlRWxlbWVudHMnLFxuXHRmbG93VG86ICdhcmlhRmxvd1RvRWxlbWVudHMnLFxuXHRsYWJlbGxlZEJ5OiAnYXJpYUxhYmVsbGVkQnlFbGVtZW50cycsXG5cdG93bnM6ICdhcmlhT3duc0VsZW1lbnRzJyxcbn1cblxuZnVuY3Rpb24gc2V0UHJvcGVydHkoZWxlbWVudDogRWxlbWVudCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdChlbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcmlhUHJvcGVydGllcyhhcmlhOiBBcmlhIHwgdW5kZWZpbmVkLCBlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG5cdGlmICghYXJpYSkgcmV0dXJuXG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyaWEpKSB7XG5cdFx0aWYgKCEoa2V5IGluIGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRjb25zdCBkb21LZXkgPSBgYXJpYSR7a2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YFxuXHRcdFx0c2V0UHJvcGVydHkoZWxlbWVudCwgZG9tS2V5LCB2YWx1ZSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhcmlhSWRSZWZlcmVuY2VBdHRyaWJ1dGVzW2tleSBhcyBrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzXSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcblx0XHRcdGNvbnN0IGlkbEtleSA9IGFyaWFJZFJlZmVyZW5jZUVsZW1lbnRQcm9wZXJ0aWVzW2tleSBhcyBrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzXVxuXHRcdFx0c2V0UHJvcGVydHkoZWxlbWVudCwgaWRsS2V5LCBpZGxLZXkuZW5kc1dpdGgoJ0VsZW1lbnRzJykgPyBbdmFsdWVdIDogdmFsdWUpXG5cdFx0XHRjb250aW51ZVxuXHRcdH1cblx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShhcmlhSWRSZWZlcmVuY2VBdHRyaWJ1dGVzW2tleSBhcyBrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzXSwgdmFsdWUpXG5cdH1cbn1cbiIsImltcG9ydCB7IEVsZW1lbnRPbkhhbmRsZXJzIH0gZnJvbSAnQHJvb3RlZC9ldmVudHMnXG5cbmltcG9ydCB7IHR5cGUgQXJpYSwgYnVpbGRBcmlhUHJvcGVydGllcyB9IGZyb20gJy4vYXJpYS5tdHMnXG5pbXBvcnQgeyBDc3NDbGFzc2VzIH0gZnJvbSAnLi9jbGFzc2VzLm10cydcbmltcG9ydCB7IEh0bWxFbGVtZW50UHJvcGVydGllcyB9IGZyb20gJy4vaHRtbC1lbGVtZW50LXByb3BlcnRpZXMubXRzJ1xuaW1wb3J0IHsgU3ZnRWxlbWVudFByb3BlcnRpZXMsIFN2Z1RhZ0VsZW1lbnQsIFN2Z1RhZ05hbWUgfSBmcm9tICcuL3N2Zy1lbGVtZW50LXByb3BlcnRpZXMubXRzJ1xuXG5mdW5jdGlvbiBidWlsZE9uSGFuZGxlcnM8VEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50Pihcblx0b246IEVsZW1lbnRPbkhhbmRsZXJzPFRFbGVtZW50PiB8IHVuZGVmaW5lZCxcblx0ZWxlbWVudDogVEVsZW1lbnQsXG5cdHNpZ25hbDogQWJvcnRTaWduYWwsXG4pOiB2b2lkIHtcblx0aWYgKCFvbikgcmV0dXJuXG5cdGZvciAoY29uc3QgW2tleSwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXMob24pKSB7XG5cdFx0aWYgKCFoYW5kbGVyKSBjb250aW51ZVxuXHRcdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcdGtleSxcblx0XHRcdGV2ZW50ID0+IHZvaWQgKGhhbmRsZXIgYXMgKGV2ZW50PzogRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KShldmVudCksXG5cdFx0XHRzaWduYWwgPyB7IHNpZ25hbCB9IDogdW5kZWZpbmVkLFxuXHRcdClcblx0fVxufVxuXG5mdW5jdGlvbiBidWlsZENsYXNzTGlzdChjbGFzc2VzOiBDc3NDbGFzc2VzIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjbGFzc2VzID09PSBudWxsIHx8IGNsYXNzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHt9XG5cdGlmIChBcnJheS5pc0FycmF5KGNsYXNzZXMpKSByZXR1cm4geyBjbGFzc05hbWU6IGNsYXNzZXMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKSB9XG5cblx0cmV0dXJuIHsgY2xhc3NOYW1lOiBTdHJpbmcoY2xhc3NlcykgfVxufVxuXG5mdW5jdGlvbiBpc1dyaXRhYmxlRG9tUHJvcGVydHkoZWxlbWVudDogRWxlbWVudCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0bGV0IHByb3RvOiBvYmplY3QgfCBudWxsID0gZWxlbWVudFxuXHR3aGlsZSAocHJvdG8pIHtcblx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywga2V5KVxuXHRcdGlmIChkZXNjKSByZXR1cm4gISEoZGVzYy53cml0YWJsZSB8fCBkZXNjLnNldClcblx0XHRwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgYXMgb2JqZWN0IHwgbnVsbFxuXHR9XG5cdHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50Q3JlYXRvciA9IChrZXk6IHN0cmluZywgbnM/OiBzdHJpbmcpID0+IEVsZW1lbnRcblxuLyoqXG4gKiBUaGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0eXBlIHJldHVybmVkIGJ5IHtAbGluayBjcmVhdGVFbGVtZW50RmFjdG9yeX0uXG4gKiBBY2NlcHRzIEhUTUwgb3IgU1ZHIHRhZyBuYW1lcyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgZWxlbWVudCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRDcmVhdG9yRnVuY3Rpb24ge1xuXHQodGFnOiAnc3ZnJywgcHJvcGVydGllcz86IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzPCdzdmcnPik6IFNWR1NWR0VsZW1lbnRcblx0PEsgZXh0ZW5kcyBFeGNsdWRlPFN2Z1RhZ05hbWUsICdzdmcnPj4odGFnOiBLLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8Sz4pOiBTdmdUYWdFbGVtZW50PEs+XG5cdDxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIHByb3BlcnRpZXM/OiBOb0luZmVyPEh0bWxFbGVtZW50UHJvcGVydGllczxLPj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS11cbn1cblxuZXhwb3J0IHR5cGUgRWxlbWVudEZhY3RvcnkgPSBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudEZhY3RvcnkoY29uc3RydWN0RWxlbWVudDogRWxlbWVudENyZWF0b3IsIHNpZ25hbDogQWJvcnRTaWduYWwpOiBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uIHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgSFRNTCBvciBTVkcgZWxlbWVudC4gVGhlIGVsZW1lbnQgaXMgKipub3QqKiBhcHBlbmRlZCB0byB0aGVcblx0ICogZG9jdW1lbnQgYXV0b21hdGljYWxseS5cblx0ICpcblx0ICogKipIVE1MIGVsZW1lbnRzKiog4oCUIHBhc3MgYW55IHRhZyBmcm9tIGBIVE1MRWxlbWVudFRhZ05hbWVNYXBgOlxuXHQgKiBgYGB0c1xuXHQgKiBlbGVtZW50KCdkaXYnLCB7IGNsYXNzZXM6ICdjYXJkJywgY2hpbGRyZW46IFsuLi5dIH0pXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiAqKlNWRyBlbGVtZW50cyoqIOKAlCB1c2UgYCdzdmcnYCBmb3IgdGhlIHJvb3QgZWxlbWVudCwgb3IgcHJlZml4IG90aGVyIFNWR1xuXHQgKiB0YWdzIHdpdGggYCdzdmc6J2AgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIHNhbWUtbmFtZWQgSFRNTCB0YWdzOlxuXHQgKiBgYGB0c1xuXHQgKiBlbGVtZW50KCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgMjQgMjQnLCBjaGlsZHJlbjogZWxlbWVudCgnc3ZnOnVzZScsIHsgaHJlZjogdXJsIH0pIH0pXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiAqKmBjbGFzc2VzYCoqIOKAlCBhY2NlcHRzIGEgc2luZ2xlIGNsYXNzIHN0cmluZyBvciBhIHtAbGluayBDc3NDbGFzc2VzfSBhcnJheTtcblx0ICogZmFsc3kgZW50cmllcyBhcmUgZmlsdGVyZWQgb3V0IGF1dG9tYXRpY2FsbHkuXG5cdCAqXG5cdCAqICoqRE9NIHByb3BlcnR5IG5hbWVzKiog4oCUIGZvciBIVE1MIGVsZW1lbnRzLCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBzZXQgdmlhXG5cdCAqIGBPYmplY3QuYXNzaWduYCBhbmQgbXVzdCB1c2UgRE9NIHByb3BlcnR5IG5hbWVzLCBub3QgSFRNTCBhdHRyaWJ1dGUgbmFtZXM6XG5cdCAqIHwgSFRNTCBhdHRyaWJ1dGUgfCBET00gcHJvcGVydHkgfFxuXHQgKiB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXxcblx0ICogfCBgZm9yYCAgICAgICAgICB8IGBodG1sRm9yYCAgICB8XG5cdCAqIHwgYHJlYWRvbmx5YCAgICAgfCBgcmVhZE9ubHlgICAgfFxuXHQgKlxuXHQgKiBGb3IgU1ZHIGVsZW1lbnRzLCB3cml0YWJsZSBET00gcHJvcGVydGllcyBhcmUgc2V0IGRpcmVjdGx5OyBhbnl0aGluZyBlbHNlXG5cdCAqIChlLmcuIGB2aWV3Qm94YCwgYGhyZWZgKSBmYWxscyBiYWNrIHRvIGBzZXRBdHRyaWJ1dGVgIGF1dG9tYXRpY2FsbHkuXG5cdCAqXG5cdCAqICoqQ2hpbGRyZW4qKiDigJQgcGFzcyBhIHNpbmdsZSBgTm9kZWAgb3IgYW4gYXJyYXkgb2YgYE5vZGVgcyB2aWEgdGhlXG5cdCAqIGBjaGlsZHJlbmAgcHJvcGVydHk7IHRoZXkgYXJlIGFwcGVuZGVkIGluIG9yZGVyLlxuXHQgKlxuXHQgKiAqKkV2ZW50IGxpc3RlbmVycyoqIOKAlCB1c2UgdGhlIGBvbmAgcHJvcCB3aXRoIGFuIG9iamVjdCBvZiBldmVudCBoYW5kbGVycy5cblx0ICogTGlzdGVuZXJzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzLlxuXHQgKlxuXHQgKiAqKkFSSUEqKiDigJQgdXNlIHRoZSBgYXJpYWAgcHJvcCBmb3IgQVJJQSBhdHRyaWJ1dGVzLiBBY2NlcHRzIHN0cmluZyBJRHMgb3Jcblx0ICogYEVsZW1lbnRgIHJlZmVyZW5jZXMgZm9yIElETCByZWZsZWN0aW9uIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIGNvbnN0IGRpdiA9IGVsZW1lbnQoJ2RpdicsIHtcblx0ICogICBjbGFzc2VzOiAnY2FyZCcsXG5cdCAqICAgYXJpYTogeyBsYWJlbDogJ0NhcmQnLCBsYWJlbGxlZEJ5OiBoZWFkaW5nRWwgfSxcblx0ICogICBjaGlsZHJlbjogW1xuXHQgKiAgICAgZWxlbWVudCgnaDInLCB7IHRleHRDb250ZW50OiAnVGl0bGUnIH0pLFxuXHQgKiAgICAgZWxlbWVudCgncCcsICB7IHRleHRDb250ZW50OiAnQm9keScgIH0pLFxuXHQgKiAgIF0sXG5cdCAqIH0pXG5cdCAqXG5cdCAqIGNvbnN0IGljb24gPSBlbGVtZW50KCdzdmcnLCB7XG5cdCAqICAgdmlld0JveDogJzAgMCAyNCAyNCcsXG5cdCAqICAgYXJpYTogeyBoaWRkZW46ICd0cnVlJyB9LFxuXHQgKiAgIGNoaWxkcmVuOiBlbGVtZW50KCdzdmc6dXNlJywgeyBocmVmOiBzcHJpdGVVcmwgfSksXG5cdCAqIH0pXG5cdCAqIGBgYFxuXHQgKi9cblx0ZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0YWc6ICdzdmcnLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8J3N2Zyc+KTogU1ZHU1ZHRWxlbWVudFxuXHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50PEsgZXh0ZW5kcyBFeGNsdWRlPFN2Z1RhZ05hbWUsICdzdmcnPj4odGFnOiBLLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8Sz4pOiBTdmdUYWdFbGVtZW50PEs+XG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQ8S0VsZW1lbnQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KHRhZzogS0VsZW1lbnQsIHByb3BlcnRpZXM/OiBOb0luZmVyPEh0bWxFbGVtZW50UHJvcGVydGllczxLRWxlbWVudD4+KTogSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tFbGVtZW50XVxuXHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBFbGVtZW50IHtcblx0XHRpZiAodGFnID09PSAnc3ZnJyB8fCB0YWcuc3RhcnRzV2l0aCgnc3ZnOicpKSB7XG5cdFx0XHRjb25zdCBhY3R1YWxUYWcgPSB0YWcgPT09ICdzdmcnID8gJ3N2ZycgOiB0YWcuc2xpY2UoNClcblx0XHRcdGNvbnN0IHsgY2xhc3NlcywgY2hpbGRyZW4sIGFyaWEsIG9uLCBzdHlsZSwgLi4uYXR0cmlidXRlcyB9ID0gcHJvcGVydGllcyA/PyB7fVxuXHRcdFx0Y29uc3QgbmV3RWxlbWVudCA9IGNvbnN0cnVjdEVsZW1lbnQoYWN0dWFsVGFnLCAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKSBhcyBTVkdFbGVtZW50XG5cblx0XHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSBjb250aW51ZVxuXHRcdFx0XHRpZiAoaXNXcml0YWJsZURvbVByb3BlcnR5KG5ld0VsZW1lbnQsIGtleSkpIHtcblx0XHRcdFx0XHQ7KG5ld0VsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRcdFx0bmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHsgY2xhc3NOYW1lIH0gPSBidWlsZENsYXNzTGlzdChjbGFzc2VzIGFzIENzc0NsYXNzZXMgfCB1bmRlZmluZWQpXG5cdFx0XHRpZiAoY2xhc3NOYW1lKSBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbGFzc05hbWUpXG5cblx0XHRcdGlmIChzdHlsZSkgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCBzdHlsZSlcblx0XHRcdGJ1aWxkQXJpYVByb3BlcnRpZXMoYXJpYSBhcyBBcmlhIHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50KVxuXHRcdFx0YnVpbGRPbkhhbmRsZXJzKG9uIGFzIEVsZW1lbnRPbkhhbmRsZXJzPEVsZW1lbnQ+IHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50LCBzaWduYWwpXG5cblx0XHRcdGFwcGVuZENoaWxkcmVuKG5ld0VsZW1lbnQsIGNoaWxkcmVuIGFzIEFycmF5PE5vZGUgfCBzdHJpbmc+IHwgTm9kZSB8IHN0cmluZyB8IHVuZGVmaW5lZClcblxuXHRcdFx0cmV0dXJuIG5ld0VsZW1lbnRcblx0XHR9XG5cblx0XHRjb25zdCB7IGFyaWEsIGNoaWxkcmVuLCBjbGFzc2VzLCBvbiwgc3R5bGUsIC4uLmFzc2lnbmFibGVQcm9wZXJ0aWVzIH0gPSBwcm9wZXJ0aWVzID8/IHt9XG5cdFx0Y29uc3QgbmV3RWxlbWVudCA9IGNvbnN0cnVjdEVsZW1lbnQodGFnKSBhcyBIVE1MRWxlbWVudFxuXG5cdFx0Y29uc3QgeyBjbGFzc05hbWUgfSA9IGJ1aWxkQ2xhc3NMaXN0KGNsYXNzZXMgYXMgQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZClcblx0XHRpZiAoY2xhc3NOYW1lKSBuZXdFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxuXG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXNzaWduYWJsZVByb3BlcnRpZXMpKSB7XG5cdFx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgY29udGludWVcblx0XHRcdGlmIChpc1dyaXRhYmxlRG9tUHJvcGVydHkobmV3RWxlbWVudCwga2V5KSkge1xuXHRcdFx0XHQ7KG5ld0VsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0bmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzdHlsZSkgT2JqZWN0LmFzc2lnbihuZXdFbGVtZW50LnN0eWxlLCBzdHlsZSlcblx0XHRidWlsZEFyaWFQcm9wZXJ0aWVzKGFyaWEgYXMgQXJpYSB8IHVuZGVmaW5lZCwgbmV3RWxlbWVudClcblx0XHRidWlsZE9uSGFuZGxlcnMob24gYXMgRWxlbWVudE9uSGFuZGxlcnM8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50LCBzaWduYWwpXG5cdFx0YXBwZW5kQ2hpbGRyZW4obmV3RWxlbWVudCwgY2hpbGRyZW4gYXMgQXJyYXk8Tm9kZSB8IHN0cmluZz4gfCBOb2RlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKVxuXG5cdFx0cmV0dXJuIG5ld0VsZW1lbnRcblx0fVxuXG5cdHJldHVybiBjcmVhdGVFbGVtZW50IGFzIHVua25vd24gYXMgRWxlbWVudENyZWF0b3JGdW5jdGlvblxufVxuXG5mdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihlbGVtZW50OiBFbGVtZW50LCBjaGlsZHJlbjogQXJyYXk8Tm9kZSB8IHN0cmluZz4gfCBOb2RlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuXHRcdGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcblx0XHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkKVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmIChjaGlsZHJlbikge1xuXHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkcmVuKVxuXHR9XG59XG4iXX0=
135
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMubWpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9hcmlhLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzaW5nbGUgQ1NTIGNsYXNzIHZhbHVlLiBGYWxzeSB2YXJpYW50cyAoYHVuZGVmaW5lZGAgYW5kIGBudWxsYCkgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dCB3aGVuIGJ1aWxkaW5nIGEgY2xhc3MgbGlzdCwgc28gY29uZGl0aW9uYWxcbiAqIGNsYXNzZXMgY2FuIGJlIGV4cHJlc3NlZCB3aXRob3V0IGV4cGxpY2l0IGd1YXJkcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3MgPSBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG5cbi8qKlxuICogT25lIG9yIG1vcmUgQ1NTIGNsYXNzIHZhbHVlcyBhY2NlcHRlZCBieSB0aGUgYGNsYXNzZXNgIHByb3Agb2YgZXZlcnkgSFRNTFxuICogZWxlbWVudCBjcmVhdGVkIHZpYSBgY3JlYXRlKClgIG9yIGBhcHBlbmQoKWAuXG4gKlxuICogLSBBIHNpbmdsZSBzdHJpbmcgaXMgdXNlZCBhcy1pcy5cbiAqIC0gQW4gYXJyYXkgb2Yge0BsaW5rIENzc0NsYXNzfSB2YWx1ZXMgaXMgam9pbmVkIHdpdGggc3BhY2VzIGFmdGVyIGZhbHN5XG4gKiAgIGVudHJpZXMgYXJlIHJlbW92ZWQuXG4gKlxuICogQHNlZSB7QGxpbmsgY3NzQ2xhc3N9IGZvciBjb21wb3NpbmcgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENzc0NsYXNzZXMgPSBBcnJheTxDc3NDbGFzcz4gfCBDc3NDbGFzc1xuXG4vKipcbiAqIENsYXNzIG5hbWVzIG1hcHBlZCB0byB3aGV0aGVyIHRoZXkgYXBwbHkuIE9ubHkgYHRydWVgIGluY2x1ZGVzIHRoZSBjbGFzcyxcbiAqIGFueXRoaW5nIGVsc2UgbGVhdmVzIGl0IG91dC5cbiAqXG4gKiBLZXlzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBhIGBDc3NNb2R1bGVgIHZhbHVlIHRoYXRcbiAqIFR5cGVTY3JpcHQgdGhpbmtzIG1pZ2h0IGJlIGB1bmRlZmluZWRgLiBVc2UgdGhlIGxpc3QgZm9ybSBvZlxuICoge0BsaW5rIGNzc0NsYXNzZXN9IGZvciB0aG9zZS5cbiAqXG4gKiBAc2VlIHtAbGluayBjc3NDbGFzc2VzfSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgcmVhZHMgdGhpcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3NEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+XG5cbi8qKlxuICogUmV0dXJucyBgY2xhc3NOYW1lYCB3aGVuIGB2aXNpYmxlYCBpcyBgdHJ1ZWAsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBEZXNpZ25lZCB0byBjb21wb3NlIGNsZWFubHkgd2l0aCB7QGxpbmsgQ3NzQ2xhc3Nlc306IGZhbHN5IHZhbHVlcyBhcmVcbiAqIGZpbHRlcmVkIG91dCBhdXRvbWF0aWNhbGx5LCBzbyBzdGF0aWMgYW5kIGNvbmRpdGlvbmFsIGNsYXNzZXMgY2FuIGJlIG1peGVkXG4gKiBpbiBhIHNpbmdsZSBhcnJheSB3aXRob3V0IGJyYW5jaGluZy4gQ2FsbGVkIHdpdGgganVzdCBhIGNsYXNzIG5hbWUgaXRcbiAqIHJldHVybnMgdGhhdCBuYW1lLCB3aGljaCBpcyBoYW5keSB3aGVuIHRoZSByZXN0IG9mIHRoZSBhcnJheSBpcyBjb25kaXRpb25hbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uIGNvbWVzIGZpcnN0LCBzYW1lIGFzIGBvcHRpb25hbCgpYC5cbiAqXG4gKiBAcGFyYW0gdmlzaWJsZSAtIFdoZW4gYHRydWVgIHRoZSBjbGFzcyBpcyByZXR1cm5lZCwgYW55IG90aGVyIHZhbHVlIHByb2R1Y2VzXG4gKiAgIGB1bmRlZmluZWRgLlxuICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhcHBlbmQoJ2J1dHRvbicsIHtcbiAqICAgY2xhc3NlczogW1xuICogICAgICdidG4nLFxuICogICAgIGNzc0NsYXNzKGlzQWN0aXZlLCAnYnRuLS1hY3RpdmUnKSxcbiAqICAgICBjc3NDbGFzcyhpc0Rpc2FibGVkLCAnYnRuLS1kaXNhYmxlZCcpLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcyk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3ModmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIGNsYXNzTmFtZTogQ3NzQ2xhc3MpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKC4uLmFyZ3VtZW50c186IFtDc3NDbGFzc10gfCBbYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIENzc0NsYXNzXSk6IENzc0NsYXNzIHtcblx0aWYgKGFyZ3VtZW50c18ubGVuZ3RoID09PSAxKSByZXR1cm4gYXJndW1lbnRzX1swXVxuXG5cdGNvbnN0IFt2aXNpYmxlLCBjbGFzc05hbWVdID0gYXJndW1lbnRzX1xuXHRpZiAodmlzaWJsZSAhPT0gdHJ1ZSkgcmV0dXJuXG5cdHJldHVybiBjbGFzc05hbWVcbn1cblxuLyoqXG4gKiBKb2lucyBzZXZlcmFsIGNsYXNzIG5hbWVzIGludG8gb25lIHtAbGluayBDc3NDbGFzc30sIGRyb3BwaW5nIHRoZSBmYWxzeVxuICogb25lcy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIG5vdGhpbmcgaXMgbGVmdCwgc28gdGhlIHJlc3VsdCBkaXNhcHBlYXJzXG4gKiBmcm9tIGEgYGNsYXNzZXNgIGFycmF5IGluc3RlYWQgb2YgYWRkaW5nIGFuIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBUaHJlZSB3YXlzIHRvIGNhbGwgaXQ6XG4gKlxuICogLSBgY3NzQ2xhc3NlcygnYScsICdiJylgIGpvaW5zIHdoYXQgeW91IHBhc3MuXG4gKiAtIGBjc3NDbGFzc2VzKHZpc2libGUsICdhJywgJ2InKWAgam9pbnMgdGhlbSBvbmx5IHdoZW4gYHZpc2libGVgIGlzIGB0cnVlYC5cbiAqIC0gYGNzc0NsYXNzZXMoeyBhOiB0cnVlLCBiOiBmYWxzZSB9KWAga2VlcHMgdGhlIGtleXMgbWFwcGVkIHRvIGB0cnVlYC5cbiAqXG4gKiBXYXRjaCBvdXQgZm9yIG9uZSBvdmVybGFwOiBhIGxlYWRpbmcgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGlzIHJlYWQgYXMgdGhlXG4gKiBjb25kaXRpb24sIHNvIGBjc3NDbGFzc2VzKHVuZGVmaW5lZCwgJ2EnKWAgaXMgYHVuZGVmaW5lZGAgYW5kIG5vdCBgJ2EnYC5cbiAqIEEgY2xhc3MgbmFtZSB0aGF0IG1pZ2h0IGJlIGB1bmRlZmluZWRgLCBsaWtlIGFueXRoaW5nIG9mZiBhIGBDc3NNb2R1bGVgLFxuICogYmVsb25ncyBhZnRlciB0aGUgY29uZGl0aW9uIHJhdGhlciB0aGFuIGZpcnN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYXBwZW5kKCdidXR0b24nLCB7XG4gKiAgIGNsYXNzZXM6IFtcbiAqICAgICBjc3NDbGFzc2VzKHN0eWxlcy5idXR0b24sIHN0eWxlcy5yb3VuZGVkKSxcbiAqICAgICBjc3NDbGFzc2VzKGlzQWN0aXZlLCBzdHlsZXMuYWN0aXZlLCBzdHlsZXMucmFpc2VkKSxcbiAqICAgICBjc3NDbGFzc2VzKHtcbiAqICAgICAgICdidG4tLWRpc2FibGVkJzogaXNEaXNhYmxlZCxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzZXModmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmNsYXNzTmFtZXM6IEFycmF5PENzc0NsYXNzPik6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3NlcyguLi5jbGFzc05hbWVzOiBBcnJheTxDc3NDbGFzcz4pOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzZXMoY2xhc3NOYW1lczogQ3NzQ2xhc3NEaWN0aW9uYXJ5KTogQ3NzQ2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBjc3NDbGFzc2VzKFxuXHQuLi5hcmd1bWVudHNfOiBbQ3NzQ2xhc3NEaWN0aW9uYXJ5XSB8IFtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uQXJyYXk8Q3NzQ2xhc3M+XSB8IEFycmF5PENzc0NsYXNzPlxuKTogQ3NzQ2xhc3Mge1xuXHRjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gYXJndW1lbnRzX1xuXG5cdGlmICh0eXBlb2YgZmlyc3QgPT09ICdzdHJpbmcnKSByZXR1cm4gam9pbkNsYXNzTmFtZXMoW2ZpcnN0LCAuLi5yZXN0XSBhcyBBcnJheTxDc3NDbGFzcz4pXG5cblx0aWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgZmlyc3QgPT09IG51bGwgfHwgdHlwZW9mIGZpcnN0ID09PSAnYm9vbGVhbicpIHtcblx0XHRpZiAoZmlyc3QgIT09IHRydWUpIHJldHVyblxuXHRcdHJldHVybiBqb2luQ2xhc3NOYW1lcyhyZXN0IGFzIEFycmF5PENzc0NsYXNzPilcblx0fVxuXG5cdHJldHVybiBqb2luQ2xhc3NOYW1lcyhPYmplY3Rcblx0XHQuZW50cmllcyhmaXJzdClcblx0XHQuZmlsdGVyKChbLCB2aXNpYmxlXSkgPT4gdmlzaWJsZSA9PT0gdHJ1ZSlcblx0XHQubWFwKChbY2xhc3NOYW1lXSkgPT4gY2xhc3NOYW1lKSlcbn1cblxuZnVuY3Rpb24gam9pbkNsYXNzTmFtZXMoY2xhc3NOYW1lczogQXJyYXk8Q3NzQ2xhc3M+KTogQ3NzQ2xhc3Mge1xuXHRjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJylcblx0aWYgKCFjbGFzc05hbWUpIHJldHVyblxuXHRyZXR1cm4gY2xhc3NOYW1lXG59XG4iLCJ0eXBlIFN0cmlwQXJpYTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgYXJpYSR7aW5mZXIgUmVzdH1gID8gVW5jYXBpdGFsaXplPFJlc3Q+IDogU1xuXG50eXBlIEFyaWFTdHJpbmdQcm9wZXJ0aWVzID0ge1xuXHRbUCBpbiBrZXlvZiBBUklBTWl4aW4gYXMgQVJJQU1peGluW1BdIGV4dGVuZHMgc3RyaW5nIHwgbnVsbCA/IFN0cmlwQXJpYTxzdHJpbmcgJiBQPiA6IG5ldmVyXT86IHN0cmluZyB8IG51bGxcbn1cblxuLy8gUHJvcGVydGllcyB0aGF0IG9ubHkgZXhpc3QgYXMgRWxlbWVudFtdIGluIEFSSUFNaXhpbi4gQWNjZXB0cyBhIHN0cmluZyBJRCBvciBhbiBFbGVtZW50IGRpcmVjdGx5LlxudHlwZSBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzID0ge1xuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50J119ICovXG5cdGFjdGl2ZURlc2NlbmRhbnQ/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUNvbnRyb2xzRWxlbWVudHMnXX0gKi9cblx0Y29udHJvbHM/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnXX0gKi9cblx0ZGVzY3JpYmVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURldGFpbHNFbGVtZW50cyddfSAqL1xuXHRkZXRhaWxzPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cyddfSAqL1xuXHRlcnJvck1lc3NhZ2U/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUZsb3dUb0VsZW1lbnRzJ119ICovXG5cdGZsb3dUbz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJ119ICovXG5cdGxhYmVsbGVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYU93bnNFbGVtZW50cyddfSAqL1xuXHRvd25zPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcbn1cblxuLyoqXG4gKiBTaGFwZSBvZiB0aGUgYGFyaWFgIHByb3Agb24gYGVsZW1lbnQoLi4uKWAuIEFjY2VwdHMgZXZlcnkgQVJJQSBhdHRyaWJ1dGVcbiAqIGRlZmluZWQgb24gYEFSSUFNaXhpbmAsIHdpdGggdGhlIGBhcmlhYCBwcmVmaXggc3RyaXBwZWQgKHNvIGBhcmlhLWxhYmVsYFxuICogYmVjb21lcyBgbGFiZWxgLCBgYXJpYS1kZXNjcmliZWRieWAgYmVjb21lcyBgZGVzY3JpYmVkQnlgKS5cbiAqXG4gKiBGb3IgSUQtcmVmZXJlbmNlIGF0dHJpYnV0ZXMgKGBhcmlhLWxhYmVsbGVkYnlgLCBgYXJpYS1jb250cm9sc2AsIGV0Yy4pIHRoZVxuICogdmFsdWUgY2FuIGJlIGEgc3RyaW5nIElEIG9yIGFuIGBFbGVtZW50YCByZWZlcmVuY2UuIEVsZW1lbnQgcmVmZXJlbmNlcyBhcmVcbiAqIHNldCB2aWEgdGhlIElETCByZWZsZWN0aW9uIHByb3BlcnR5IHdoZW4gc3VwcG9ydGVkLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBhdHRyaWJ1dGUgdmFsdWUgb3RoZXJ3aXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZWxlbWVudCgnYnV0dG9uJywge1xuICogICBhcmlhOiB7XG4gKiAgICAgbGFiZWw6ICdTYXZlJyxcbiAqICAgICBkZXNjcmliZWRCeTogaGVscFRleHRFbGVtZW50LFxuICogICAgIHByZXNzZWQ6ICdmYWxzZScsXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFyaWEgPSBBcmlhU3RyaW5nUHJvcGVydGllcyAmIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNcblxuY29uc3QgYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlczogUmVjb3JkPGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXMsIHN0cmluZz4gPSB7XG5cdGFjdGl2ZURlc2NlbmRhbnQ6ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLFxuXHRjb250cm9sczogJ2FyaWEtY29udHJvbHMnLFxuXHRkZXNjcmliZWRCeTogJ2FyaWEtZGVzY3JpYmVkYnknLFxuXHRkZXRhaWxzOiAnYXJpYS1kZXRhaWxzJyxcblx0ZXJyb3JNZXNzYWdlOiAnYXJpYS1lcnJvcm1lc3NhZ2UnLFxuXHRmbG93VG86ICdhcmlhLWZsb3d0bycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhLWxhYmVsbGVkYnknLFxuXHRvd25zOiAnYXJpYS1vd25zJyxcbn1cblxuLy8gYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50IGlzIHNpbmd1bGFyOyB0aGUgcmVzdCB0YWtlIEVsZW1lbnRbXVxuY29uc3QgYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXM6IFJlY29yZDxrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzLCBzdHJpbmc+ID0ge1xuXHRhY3RpdmVEZXNjZW5kYW50OiAnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50Jyxcblx0Y29udHJvbHM6ICdhcmlhQ29udHJvbHNFbGVtZW50cycsXG5cdGRlc2NyaWJlZEJ5OiAnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnLFxuXHRkZXRhaWxzOiAnYXJpYURldGFpbHNFbGVtZW50cycsXG5cdGVycm9yTWVzc2FnZTogJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cycsXG5cdGZsb3dUbzogJ2FyaWFGbG93VG9FbGVtZW50cycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJyxcblx0b3duczogJ2FyaWFPd25zRWxlbWVudHMnLFxufVxuXG5mdW5jdGlvbiBzZXRQcm9wZXJ0eShlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFyaWFQcm9wZXJ0aWVzKGFyaWE6IEFyaWEgfCB1bmRlZmluZWQsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcblx0aWYgKCFhcmlhKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJpYSkpIHtcblx0XHRpZiAoIShrZXkgaW4gYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlcykpIHtcblx0XHRcdGNvbnN0IGRvbUtleSA9IGBhcmlhJHtrZXlbMF0udG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBkb21LZXksIHZhbHVlKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgaWRsS2V5ID0gYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBpZGxLZXksIGlkbEtleS5lbmRzV2l0aCgnRWxlbWVudHMnKSA/IFt2YWx1ZV0gOiB2YWx1ZSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdLCB2YWx1ZSlcblx0fVxufVxuIiwiaW1wb3J0IHsgRWxlbWVudE9uSGFuZGxlcnMgfSBmcm9tICdAcm9vdGVkL2V2ZW50cydcblxuaW1wb3J0IHsgdHlwZSBBcmlhLCBidWlsZEFyaWFQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hcmlhLm10cydcbmltcG9ydCB7IEVsZW1lbnRDaGlsZHJlbiB9IGZyb20gJy4vY2hpbGRyZW4ubXRzJ1xuaW1wb3J0IHsgQ3NzQ2xhc3NlcyB9IGZyb20gJy4vY2xhc3Nlcy5tdHMnXG5pbXBvcnQgeyBIdG1sRWxlbWVudFByb3BlcnRpZXMgfSBmcm9tICcuL2h0bWwtZWxlbWVudC1wcm9wZXJ0aWVzLm10cydcbmltcG9ydCB7IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzLCBTdmdUYWdFbGVtZW50LCBTdmdUYWdOYW1lIH0gZnJvbSAnLi9zdmctZWxlbWVudC1wcm9wZXJ0aWVzLm10cydcblxuZnVuY3Rpb24gYnVpbGRPbkhhbmRsZXJzPFRFbGVtZW50IGV4dGVuZHMgRWxlbWVudD4oXG5cdG9uOiBFbGVtZW50T25IYW5kbGVyczxURWxlbWVudD4gfCB1bmRlZmluZWQsXG5cdGVsZW1lbnQ6IFRFbGVtZW50LFxuXHRzaWduYWw6IEFib3J0U2lnbmFsLFxuKTogdm9pZCB7XG5cdGlmICghb24pIHJldHVyblxuXHRmb3IgKGNvbnN0IFtrZXksIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9uKSkge1xuXHRcdGlmICghaGFuZGxlcikgY29udGludWVcblx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRrZXksXG5cdFx0XHRldmVudCA9PiB2b2lkIChoYW5kbGVyIGFzIChldmVudD86IEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikoZXZlbnQpLFxuXHRcdFx0c2lnbmFsID8geyBzaWduYWwgfSA6IHVuZGVmaW5lZCxcblx0XHQpXG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc0xpc3QoY2xhc3NlczogQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY2xhc3NlcyA9PT0gbnVsbCB8fCBjbGFzc2VzID09PSB1bmRlZmluZWQpIHJldHVybiB7fVxuXHRpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkgcmV0dXJuIHsgY2xhc3NOYW1lOiBjbGFzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfVxuXG5cdHJldHVybiB7IGNsYXNzTmFtZTogU3RyaW5nKGNsYXNzZXMpIH1cbn1cblxuZnVuY3Rpb24gaXNXcml0YWJsZURvbVByb3BlcnR5KGVsZW1lbnQ6IEVsZW1lbnQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBwcm90b3R5cGU6IG9iamVjdCB8IG51bGwgPSBlbGVtZW50XG5cdHdoaWxlIChwcm90b3R5cGUpIHtcblx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGtleSlcblx0XHRpZiAoZGVzYykgcmV0dXJuICEhKGRlc2Mud3JpdGFibGUgfHwgZGVzYy5zZXQpXG5cdFx0cHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgYXMgb2JqZWN0IHwgbnVsbFxuXHR9XG5cdHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50Q3JlYXRvciA9IChrZXk6IHN0cmluZywgbnM/OiBzdHJpbmcpID0+IEVsZW1lbnRcblxuLyoqXG4gKiBUaGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0eXBlIHJldHVybmVkIGJ5IHtAbGluayBjcmVhdGVFbGVtZW50RmFjdG9yeX0uXG4gKiBBY2NlcHRzIEhUTUwgb3IgU1ZHIHRhZyBuYW1lcyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgZWxlbWVudCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRDcmVhdG9yRnVuY3Rpb24ge1xuXHQodGFnOiAnc3ZnJywgcHJvcGVydGllcz86IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzPCdzdmcnPik6IFNWR1NWR0VsZW1lbnRcblx0PEsgZXh0ZW5kcyBFeGNsdWRlPFN2Z1RhZ05hbWUsICdzdmcnPj4odGFnOiBLLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8Sz4pOiBTdmdUYWdFbGVtZW50PEs+XG5cdDxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIHByb3BlcnRpZXM/OiBOb0luZmVyPEh0bWxFbGVtZW50UHJvcGVydGllczxLPj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS11cbn1cblxuZXhwb3J0IHR5cGUgRWxlbWVudEZhY3RvcnkgPSBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudEZhY3RvcnkoY29uc3RydWN0RWxlbWVudDogRWxlbWVudENyZWF0b3IsIHNpZ25hbDogQWJvcnRTaWduYWwpOiBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uIHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gSFRNTCBvciBTVkcgZWxlbWVudC4gVGhlIGVsZW1lbnQgaXMgTk9UIGFwcGVuZGVkIHRvIHRoZVxuXHQgKiBkb2N1bWVudDsgcGFzcyBpdCB0byBgYXBwZW5kYCwgYHByZXBlbmRgLCBvciBzZXQgaXQgYXMgYGNoaWxkcmVuYCBvZlxuXHQgKiBhbm90aGVyIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEhUTUwgdGFncyB1c2UgdGhlIHJlZ3VsYXIgYEhUTUxFbGVtZW50VGFnTmFtZU1hcGAga2V5cy4gU1ZHIHRhZ3MgdXNlXG5cdCAqIGAnc3ZnJ2AgZm9yIHRoZSByb290IGFuZCBgJ3N2Zzo8bmFtZT4nYCBmb3IgZXZlcnl0aGluZyBlbHNlICh0aGUgcHJlZml4XG5cdCAqIGtlZXBzIHRoZW0gZnJvbSBjb2xsaWRpbmcgd2l0aCBzYW1lLW5hbWVkIEhUTUwgdGFncykuXG5cdCAqXG5cdCAqIFByb3BlcnRpZXM6XG5cdCAqIC0gYGNsYXNzZXNgOiBhIGNsYXNzIHN0cmluZyBvciBhIHtAbGluayBDc3NDbGFzc2VzfSBhcnJheS4gRmFsc3lcblx0ICogICBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBvdXQuXG5cdCAqIC0gYGFyaWFgOiBBUklBIGF0dHJpYnV0ZXMuIEFjY2VwdHMgc3RyaW5nIElEcyBvciBgRWxlbWVudGAgcmVmZXJlbmNlc1xuXHQgKiAgIGZvciBJREwgcmVmbGVjdGlvbiBwcm9wZXJ0aWVzIChlLmcuIGBhcmlhLWxhYmVsbGVkYnlgKS5cblx0ICogLSBgb25gOiBhbiBvYmplY3Qgb2YgZXZlbnQgaGFuZGxlcnMuIEVhY2ggbGlzdGVuZXIgaXMgcmVtb3ZlZCB3aGVuIHRoZVxuXHQgKiAgIGNvbXBvbmVudCB1bm1vdW50cy5cblx0ICogLSBgY2hpbGRyZW5gOiBhIHNpbmdsZSBgTm9kZWAgb3IgYW4gYXJyYXk7IGFwcGVuZGVkIGluIG9yZGVyLiBgdW5kZWZpbmVkYFxuXHQgKiAgIGFuZCBgbnVsbGAgZW50cmllcyBhcmUgc2tpcHBlZCwgc2FtZSBhcyBgY2xhc3Nlc2AuXG5cdCAqIC0gT3RoZXIgcHJvcHMgYXJlIHNldCBhcyBET00gcHJvcGVydGllcyAoc28gYGh0bWxGb3JgIG5vdCBgZm9yYCxcblx0ICogICBgcmVhZE9ubHlgIG5vdCBgcmVhZG9ubHlgKS4gT24gU1ZHLCBhbnl0aGluZyB0aGF0IGlzbid0IGEgd3JpdGFibGVcblx0ICogICBET00gcHJvcGVydHkgZmFsbHMgYmFjayB0byBgc2V0QXR0cmlidXRlYC5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogY29uc3QgZGl2ID0gZWxlbWVudCgnZGl2Jywge1xuXHQgKiAgIGNsYXNzZXM6ICdjYXJkJyxcblx0ICogICBhcmlhOiB7XG5cdCAqICAgICBsYWJlbDogJ0NhcmQnLFxuXHQgKiAgICAgbGFiZWxsZWRCeTogaGVhZGluZ0VsLFxuXHQgKiAgIH0sXG5cdCAqICAgY2hpbGRyZW46IFtcblx0ICogICAgIGVsZW1lbnQoJ2gyJywge1xuXHQgKiAgICAgICB0ZXh0Q29udGVudDogJ1RpdGxlJyxcblx0ICogICAgIH0pLFxuXHQgKiAgICAgZWxlbWVudCgncCcsIHtcblx0ICogICAgICAgdGV4dENvbnRlbnQ6ICdCb2R5Jyxcblx0ICogICAgIH0pLFxuXHQgKiAgIF0sXG5cdCAqIH0pXG5cdCAqXG5cdCAqIGNvbnN0IGljb24gPSBlbGVtZW50KCdzdmcnLCB7XG5cdCAqICAgdmlld0JveDogJzAgMCAyNCAyNCcsXG5cdCAqICAgYXJpYToge1xuXHQgKiAgICAgaGlkZGVuOiAndHJ1ZScsXG5cdCAqICAgfSxcblx0ICogICBjaGlsZHJlbjogZWxlbWVudCgnc3ZnOnVzZScsIHtcblx0ICogICAgIGhyZWY6IHNwcml0ZVVybCxcblx0ICogICB9KSxcblx0ICogfSlcblx0ICogYGBgXG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogJ3N2ZycsIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczwnc3ZnJz4pOiBTVkdTVkdFbGVtZW50XG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQ8SyBleHRlbmRzIEV4Y2x1ZGU8U3ZnVGFnTmFtZSwgJ3N2Zyc+Pih0YWc6IEssIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczxLPik6IFN2Z1RhZ0VsZW1lbnQ8Sz5cblx0ZnVuY3Rpb24gY3JlYXRlRWxlbWVudDxLRWxlbWVudCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLRWxlbWVudCwgcHJvcGVydGllcz86IE5vSW5mZXI8SHRtbEVsZW1lbnRQcm9wZXJ0aWVzPEtFbGVtZW50Pj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS0VsZW1lbnRdXG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IEVsZW1lbnQge1xuXHRcdGlmICh0YWcgPT09ICdzdmcnIHx8IHRhZy5zdGFydHNXaXRoKCdzdmc6JykpIHtcblx0XHRcdGNvbnN0IGFjdHVhbFRhZyA9IHRhZyA9PT0gJ3N2ZycgPyAnc3ZnJyA6IHRhZy5zbGljZSg0KVxuXHRcdFx0Y29uc3QgeyBjbGFzc2VzLCBjaGlsZHJlbiwgYXJpYSwgb24sIHN0eWxlLCAuLi5hdHRyaWJ1dGVzIH0gPSBwcm9wZXJ0aWVzID8/IHt9XG5cdFx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudChhY3R1YWxUYWcsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpIGFzIFNWR0VsZW1lbnRcblxuXHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlXG5cdFx0XHRcdGlmIChpc1dyaXRhYmxlRG9tUHJvcGVydHkobmV3RWxlbWVudCwga2V5KSkge1xuXHRcdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgeyBjbGFzc05hbWUgfSA9IGJ1aWxkQ2xhc3NMaXN0KGNsYXNzZXMgYXMgQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZClcblx0XHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNsYXNzTmFtZSlcblxuXHRcdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdFx0YnVpbGRBcmlhUHJvcGVydGllcyhhcmlhIGFzIEFyaWEgfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQpXG5cdFx0XHRidWlsZE9uSGFuZGxlcnMob24gYXMgRWxlbWVudE9uSGFuZGxlcnM8RWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblxuXHRcdFx0YXBwZW5kQ2hpbGRyZW4obmV3RWxlbWVudCwgY2hpbGRyZW4gYXMgRWxlbWVudENoaWxkcmVuKVxuXG5cdFx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHRcdH1cblxuXHRcdGNvbnN0IHsgYXJpYSwgY2hpbGRyZW4sIGNsYXNzZXMsIG9uLCBzdHlsZSwgLi4uYXNzaWduYWJsZVByb3BlcnRpZXMgfSA9IHByb3BlcnRpZXMgPz8ge31cblx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudCh0YWcpIGFzIEhUTUxFbGVtZW50XG5cblx0XHRjb25zdCB7IGNsYXNzTmFtZSB9ID0gYnVpbGRDbGFzc0xpc3QoY2xhc3NlcyBhcyBDc3NDbGFzc2VzIHwgdW5kZWZpbmVkKVxuXHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lXG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3NpZ25hYmxlUHJvcGVydGllcykpIHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSBjb250aW51ZVxuXHRcdFx0aWYgKGlzV3JpdGFibGVEb21Qcm9wZXJ0eShuZXdFbGVtZW50LCBrZXkpKSB7XG5cdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdGJ1aWxkQXJpYVByb3BlcnRpZXMoYXJpYSBhcyBBcmlhIHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50KVxuXHRcdGJ1aWxkT25IYW5kbGVycyhvbiBhcyBFbGVtZW50T25IYW5kbGVyczxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblx0XHRhcHBlbmRDaGlsZHJlbihuZXdFbGVtZW50LCBjaGlsZHJlbiBhcyBFbGVtZW50Q2hpbGRyZW4pXG5cblx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnRcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWxlbWVudDogRWxlbWVudCwgY2hpbGRyZW46IEVsZW1lbnRDaGlsZHJlbik6IHZvaWQge1xuXHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkgY29udGludWVcblx0XHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkKVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmIChjaGlsZHJlbikge1xuXHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkcmVuKVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUEwREEsU0FBZ0IsU0FBUyxHQUFHLFlBQTJFO0NBQ3RHLElBQUksV0FBVyxXQUFXLEdBQUcsT0FB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
package/dist/events.d.mts CHANGED
@@ -1 +1 @@
1
- export * from '@rooted/events';
1
+ export * from "@rooted/events";
package/dist/events.mjs CHANGED
@@ -1,3 +1 @@
1
- export * from '@rooted/events';
2
- //# sourceMappingURL=events.mjs.map
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJldmVudHMubWpzIiwic291cmNlc0NvbnRlbnQiOltdfQ==
1
+ export * from "@rooted/events";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rooted/elements",
3
- "version": "1.0.0-alpha.6",
4
- "description": "rooted html element utilities",
3
+ "version": "1.0.0-alpha.8",
4
+ "description": "Typed HTML and SVG element factory for the rooted framework",
5
5
  "keywords": [
6
6
  "web-components",
7
7
  "custom-elements",
@@ -44,17 +44,17 @@
44
44
  "scripts": {
45
45
  "build": "pnpm build:ci",
46
46
  "build:dev": "pnpm build:ci && rooted-development extract-api",
47
- "build:ci": "tsup",
48
- "watch": "tsup --watch --no-clean & rooted-development extract-api",
47
+ "build:ci": "tsdown",
48
+ "watch": "tsdown --watch --no-clean",
49
49
  "clean": "rm -rf dist",
50
50
  "extract-api": "rooted-development extract-api"
51
51
  },
52
52
  "peerDependencies": {
53
- "@rooted/events": "1.0.0-alpha.6"
53
+ "@rooted/events": "1.0.0-alpha.8"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@rooted/development": "workspace:*",
57
- "@rooted/events": "1.0.0-alpha.6",
58
- "tsx": "^4.19.0"
57
+ "@rooted/events": "1.0.0-alpha.8",
58
+ "tsx": "^4.23.12"
59
59
  }
60
60
  }
package/readme.md CHANGED
@@ -1,7 +1,39 @@
1
1
  # [`@rooted/elements`](https://www.npmjs.com/package/@rooted/elements)
2
2
 
3
- Html element utilities for the [@rooted/*](https://github.com/Marvin-Brouwer/rooted?tab=readme-ov-file#rooted) framework.
3
+ Typed HTML and SVG element factory. Usable on its own, or as the DOM helper layer for the [`@rooted/*`](https://github.com/Marvin-Brouwer/rooted#rooted) framework.
4
4
 
5
- This library creates `HTMLElement`s and can also be used stand-alone.
5
+ > [!IMPORTANT]
6
+ > This package is still in alpha.
6
7
 
7
- > [!IMPORTANT] This package is still in `ALPHA`
8
+ ```sh
9
+ pnpm add @rooted/elements
10
+ ```
11
+
12
+ The package ships a factory builder rather than a ready-made `element`. You hand it the function that creates nodes and an `AbortSignal`, and you get the typed `element(...)` back. Inside a rooted component that's already done for you, `element` is on the mount context.
13
+
14
+ ```ts
15
+ import { createElementFactory, type ElementCreator } from '@rooted/elements'
16
+
17
+ const controller = new AbortController()
18
+ const createElement: ElementCreator = (tag, ns) => ns
19
+ ? document.createElementNS(ns, tag)
20
+ : document.createElement(tag)
21
+
22
+ const element = createElementFactory(createElement, controller.signal)
23
+
24
+ const card = element('div', {
25
+ classes: 'card',
26
+ children: [
27
+ element('h2', {
28
+ textContent: 'Title',
29
+ }),
30
+ element('p', {
31
+ textContent: 'Body',
32
+ }),
33
+ ],
34
+ })
35
+ ```
36
+
37
+ The `ns` branch is what makes `element('svg', ...)` and the `svg:*` tags work, so don't drop it. Aborting the controller removes every listener registered through the `on` prop, which is how components clean up on unmount.
38
+
39
+ More in the [elements page](https://github.com/Marvin-Brouwer/rooted/blob/main/docs/advanced/elements.md).