@openelement/core 0.41.0-alpha.2 → 0.41.0-alpha.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openelement/core",
3
- "version": "0.41.0-alpha.2",
3
+ "version": "0.41.0-alpha.4",
4
4
  "type": "module",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -118,7 +118,7 @@
118
118
  "deno"
119
119
  ],
120
120
  "dependencies": {
121
- "@openelement/protocol": "^0.41.0-alpha.2",
122
- "@openelement/signal": "^0.41.0-alpha.2"
121
+ "@openelement/protocol": "^0.41.0-alpha.4",
122
+ "@openelement/signal": "^0.41.0-alpha.4"
123
123
  }
124
124
  }
@@ -0,0 +1,17 @@
1
+ export interface ClientRuntimeOptions {
2
+ /** Optional CustomElementRegistry. If not provided, uses globalThis.customElements. */ registry?: CustomElementRegistry;
3
+ }
4
+ /**
5
+ * Hydrate all openElement components in a root element.
6
+ *
7
+ * Scans for `<template shadowrootmode="open">` declarative shadow roots,
8
+ * upgrades custom elements, and hydrates data-signal markers.
9
+ *
10
+ * Returns a dispose function that cleans up all effects and event listeners.
11
+ */ export declare function hydrateOpenElement(root: ParentNode, options?: ClientRuntimeOptions): () => void;
12
+ /**
13
+ * Dispose all hydrated openElement components in a root element.
14
+ *
15
+ * Walks the tree looking for host elements that were hydrated by
16
+ * `hydrateOpenElement` and calls their cleanup functions.
17
+ */ export declare function disposeOpenElement(root: ParentNode): void;
@@ -0,0 +1,156 @@
1
+ /**
2
+ * @openelement/core/hydrate - Client runtime for third-party frameworks.
3
+ *
4
+ * Lightweight entry point that scans DSD templates, upgrades custom elements,
5
+ * and hydrates signal markers without importing @openelement/element.
6
+ *
7
+ * ADR-0109 alpha.4: client-runtime for Fresh, React, etc.
8
+ */ import { HydrationScope } from './hydration-scope.js';
9
+ const hostDisposers = new WeakMap();
10
+ /**
11
+ * Walk a subtree collecting all <template shadowrootmode="open"> elements.
12
+ * In Chromium, DSD templates are parsed and their content moved into the
13
+ * host's shadowRoot automatically, leaving an empty template element behind.
14
+ */ function collectDsdTemplates(root) {
15
+ const results = [];
16
+ // Use a TreeWalker when available; fall back to manual traversal.
17
+ if (typeof document !== 'undefined' && document.createTreeWalker) {
18
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
19
+ acceptNode (node) {
20
+ const el = node;
21
+ if (el.tagName === 'TEMPLATE' && el.getAttribute('shadowrootmode') === 'open') {
22
+ return NodeFilter.FILTER_ACCEPT;
23
+ }
24
+ return NodeFilter.FILTER_SKIP;
25
+ }
26
+ });
27
+ let n;
28
+ while(n = walker.nextNode()){
29
+ results.push(n);
30
+ }
31
+ } else {
32
+ // Fallback for environments without a real TreeWalker (e.g. test doubles).
33
+ // ponytail: walk childNodes instead of children since test doubles may not
34
+ // implement ParentNode.children. Only process ELEMENT_NODE children.
35
+ const walk = (node)=>{
36
+ const container = node;
37
+ const nodes = Array.from(container.children ?? container.childNodes ?? []);
38
+ for (const child of nodes.filter((c)=>c.nodeType === 1)){
39
+ const el = child;
40
+ if (el.tagName === 'TEMPLATE' && el.getAttribute('shadowrootmode') === 'open') {
41
+ results.push(el);
42
+ }
43
+ const childContainer = child;
44
+ if (childContainer.childNodes) {
45
+ walk(child);
46
+ }
47
+ }
48
+ };
49
+ walk(root);
50
+ }
51
+ return results;
52
+ }
53
+ /**
54
+ * Create a shadow root from a DSD template's content.
55
+ *
56
+ * In a real browser, DSD parsing already moved the template's content into
57
+ * the host's shadowRoot. This handles the case where that hasn't happened
58
+ * (e.g. programmatic hydration via innerHTML or test doubles).
59
+ */ function createShadowRootFromTemplate(host, template) {
60
+ // If the host already has a shadow root (DSD was parsed by the browser),
61
+ // return it directly.
62
+ const existing = host.shadowRoot;
63
+ if (existing && existing.childNodes.length > 0) return existing;
64
+ // Otherwise, create from template content.
65
+ const shadow = host.attachShadow({
66
+ mode: 'open'
67
+ });
68
+ if (template.content) {
69
+ shadow.append(...Array.from(template.content.childNodes));
70
+ } else {
71
+ // ponytail: template.content may not exist in test doubles; fall back to
72
+ // moving childNodes directly. Real User-Agents always have template.content.
73
+ while(template.firstChild){
74
+ shadow.appendChild(template.firstChild);
75
+ }
76
+ }
77
+ return shadow;
78
+ }
79
+ function templateHost(template) {
80
+ if (template.parentElement) return template.parentElement;
81
+ const parent = template.parentNode;
82
+ return parent?.nodeType === 1 ? parent : null;
83
+ }
84
+ function getSignalRegistry(host) {
85
+ return host.signalRegistry;
86
+ }
87
+ function disposeScope(scope) {
88
+ try {
89
+ scope.dispose();
90
+ } catch {
91
+ /* ignore dispose errors */ }
92
+ }
93
+ /**
94
+ * Hydrate all openElement components in a root element.
95
+ *
96
+ * Scans for `<template shadowrootmode="open">` declarative shadow roots,
97
+ * upgrades custom elements, and hydrates data-signal markers.
98
+ *
99
+ * Returns a dispose function that cleans up all effects and event listeners.
100
+ */ export function hydrateOpenElement(root, options) {
101
+ const registry = options?.registry ?? globalThis.customElements;
102
+ const templates = collectDsdTemplates(root);
103
+ const scopes = [];
104
+ const hydratedHosts = [];
105
+ for (const template of templates){
106
+ const host = templateHost(template);
107
+ if (!host || !registry) continue;
108
+ const tagName = host.tagName.toLowerCase();
109
+ const ctor = registry.get(tagName);
110
+ if (!ctor) continue; // Skip non-custom-element hosts.
111
+ const shadowRoot = createShadowRootFromTemplate(host, template);
112
+ // Read signal registry from the upgraded element instance.
113
+ // OpenElement sets signalRegistry in its constructor.
114
+ const hostReg = getSignalRegistry(host);
115
+ const scope = new HydrationScope({
116
+ signalRegistry: hostReg
117
+ });
118
+ scope.hydrate(shadowRoot, hostReg);
119
+ scopes.push(scope);
120
+ hydratedHosts.push(host);
121
+ // Store disposer on the host so disposeOpenElement can find it.
122
+ hostDisposers.set(host, ()=>disposeScope(scope));
123
+ }
124
+ return ()=>{
125
+ for (const scope of scopes){
126
+ disposeScope(scope);
127
+ }
128
+ for (const host of hydratedHosts){
129
+ hostDisposers.delete(host);
130
+ }
131
+ };
132
+ }
133
+ /**
134
+ * Dispose all hydrated openElement components in a root element.
135
+ *
136
+ * Walks the tree looking for host elements that were hydrated by
137
+ * `hydrateOpenElement` and calls their cleanup functions.
138
+ */ export function disposeOpenElement(root) {
139
+ // ponytail: O(n) walk so callers can dispose an arbitrary container.
140
+ const walk = (node)=>{
141
+ if (node.nodeType !== 1) return;
142
+ const el = node;
143
+ const disposer = hostDisposers.get(el);
144
+ if (disposer) {
145
+ disposer();
146
+ hostDisposers.delete(el);
147
+ }
148
+ // Walk children (supports both real DOM children and test double childNodes).
149
+ const container = el;
150
+ for (const child of Array.from(container.children ?? container.childNodes ?? [])){
151
+ walk(child);
152
+ }
153
+ };
154
+ walk(root);
155
+ }
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9jbGllbnQtcnVudGltZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBvcGVuZWxlbWVudC9jb3JlL2h5ZHJhdGUgLSBDbGllbnQgcnVudGltZSBmb3IgdGhpcmQtcGFydHkgZnJhbWV3b3Jrcy5cbiAqXG4gKiBMaWdodHdlaWdodCBlbnRyeSBwb2ludCB0aGF0IHNjYW5zIERTRCB0ZW1wbGF0ZXMsIHVwZ3JhZGVzIGN1c3RvbSBlbGVtZW50cyxcbiAqIGFuZCBoeWRyYXRlcyBzaWduYWwgbWFya2VycyB3aXRob3V0IGltcG9ydGluZyBAb3BlbmVsZW1lbnQvZWxlbWVudC5cbiAqXG4gKiBBRFItMDEwOSBhbHBoYS40OiBjbGllbnQtcnVudGltZSBmb3IgRnJlc2gsIFJlYWN0LCBldGMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTaWduYWwgfSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvc2lnbmFsJztcbmltcG9ydCB7IEh5ZHJhdGlvblNjb3BlIH0gZnJvbSAnLi9oeWRyYXRpb24tc2NvcGUuanMnO1xuXG5jb25zdCBob3N0RGlzcG9zZXJzID0gbmV3IFdlYWtNYXA8RWxlbWVudCwgKCkgPT4gdm9pZD4oKTtcblxuaW50ZXJmYWNlIENoaWxkQ29udGFpbmVyIHtcbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBJdGVyYWJsZTxOb2RlPjtcbiAgcmVhZG9ubHkgY2hpbGROb2Rlcz86IEl0ZXJhYmxlPE5vZGU+O1xufVxuXG5pbnRlcmZhY2UgU2lnbmFsUmVnaXN0cnlIb3N0IHtcbiAgc2lnbmFsUmVnaXN0cnk/OiBNYXA8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFJ1bnRpbWVPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIEN1c3RvbUVsZW1lbnRSZWdpc3RyeS4gSWYgbm90IHByb3ZpZGVkLCB1c2VzIGdsb2JhbFRoaXMuY3VzdG9tRWxlbWVudHMuICovXG4gIHJlZ2lzdHJ5PzogQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5O1xufVxuXG4vKipcbiAqIFdhbGsgYSBzdWJ0cmVlIGNvbGxlY3RpbmcgYWxsIDx0ZW1wbGF0ZSBzaGFkb3dyb290bW9kZT1cIm9wZW5cIj4gZWxlbWVudHMuXG4gKiBJbiBDaHJvbWl1bSwgRFNEIHRlbXBsYXRlcyBhcmUgcGFyc2VkIGFuZCB0aGVpciBjb250ZW50IG1vdmVkIGludG8gdGhlXG4gKiBob3N0J3Mgc2hhZG93Um9vdCBhdXRvbWF0aWNhbGx5LCBsZWF2aW5nIGFuIGVtcHR5IHRlbXBsYXRlIGVsZW1lbnQgYmVoaW5kLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0RHNkVGVtcGxhdGVzKHJvb3Q6IFBhcmVudE5vZGUpOiBIVE1MVGVtcGxhdGVFbGVtZW50W10ge1xuICBjb25zdCByZXN1bHRzOiBIVE1MVGVtcGxhdGVFbGVtZW50W10gPSBbXTtcbiAgLy8gVXNlIGEgVHJlZVdhbGtlciB3aGVuIGF2YWlsYWJsZTsgZmFsbCBiYWNrIHRvIG1hbnVhbCB0cmF2ZXJzYWwuXG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIpIHtcbiAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxuICAgICAgcm9vdCxcbiAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULFxuICAgICAge1xuICAgICAgICBhY2NlcHROb2RlKG5vZGU6IE5vZGUpOiBudW1iZXIge1xuICAgICAgICAgIGNvbnN0IGVsID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnRhZ05hbWUgPT09ICdURU1QTEFURScgJiZcbiAgICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnc2hhZG93cm9vdG1vZGUnKSA9PT0gJ29wZW4nXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfU0tJUDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBsZXQgbjogTm9kZSB8IG51bGw7XG4gICAgd2hpbGUgKChuID0gd2Fsa2VyLm5leHROb2RlKCkpKSB7XG4gICAgICByZXN1bHRzLnB1c2gobiBhcyBIVE1MVGVtcGxhdGVFbGVtZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGEgcmVhbCBUcmVlV2Fsa2VyIChlLmcuIHRlc3QgZG91YmxlcykuXG4gICAgLy8gcG9ueXRhaWw6IHdhbGsgY2hpbGROb2RlcyBpbnN0ZWFkIG9mIGNoaWxkcmVuIHNpbmNlIHRlc3QgZG91YmxlcyBtYXkgbm90XG4gICAgLy8gaW1wbGVtZW50IFBhcmVudE5vZGUuY2hpbGRyZW4uIE9ubHkgcHJvY2VzcyBFTEVNRU5UX05PREUgY2hpbGRyZW4uXG4gICAgY29uc3Qgd2FsayA9IChub2RlOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBub2RlIGFzIENoaWxkQ29udGFpbmVyO1xuICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKGNvbnRhaW5lci5jaGlsZHJlbiA/PyBjb250YWluZXIuY2hpbGROb2RlcyA/PyBbXSk7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGVzLmZpbHRlcigoYzogTm9kZSkgPT4gYy5ub2RlVHlwZSA9PT0gMSkpIHtcbiAgICAgICAgY29uc3QgZWwgPSBjaGlsZCBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFTVBMQVRFJyAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnc2hhZG93cm9vdG1vZGUnKSA9PT0gJ29wZW4nXG4gICAgICAgICkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChlbCBhcyBIVE1MVGVtcGxhdGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZENvbnRhaW5lciA9IGNoaWxkIGFzIENoaWxkQ29udGFpbmVyO1xuICAgICAgICBpZiAoY2hpbGRDb250YWluZXIuY2hpbGROb2Rlcykge1xuICAgICAgICAgIHdhbGsoY2hpbGQgYXMgUGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsocm9vdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2hhZG93IHJvb3QgZnJvbSBhIERTRCB0ZW1wbGF0ZSdzIGNvbnRlbnQuXG4gKlxuICogSW4gYSByZWFsIGJyb3dzZXIsIERTRCBwYXJzaW5nIGFscmVhZHkgbW92ZWQgdGhlIHRlbXBsYXRlJ3MgY29udGVudCBpbnRvXG4gKiB0aGUgaG9zdCdzIHNoYWRvd1Jvb3QuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGF0IGhhc24ndCBoYXBwZW5lZFxuICogKGUuZy4gcHJvZ3JhbW1hdGljIGh5ZHJhdGlvbiB2aWEgaW5uZXJIVE1MIG9yIHRlc3QgZG91YmxlcykuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNoYWRvd1Jvb3RGcm9tVGVtcGxhdGUoXG4gIGhvc3Q6IEVsZW1lbnQsXG4gIHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50LFxuKTogU2hhZG93Um9vdCB7XG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgc2hhZG93IHJvb3QgKERTRCB3YXMgcGFyc2VkIGJ5IHRoZSBicm93c2VyKSxcbiAgLy8gcmV0dXJuIGl0IGRpcmVjdGx5LlxuICBjb25zdCBleGlzdGluZyA9IChob3N0IGFzIEhUTUxFbGVtZW50KS5zaGFkb3dSb290O1xuICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSByZXR1cm4gZXhpc3Rpbmc7XG5cbiAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgZnJvbSB0ZW1wbGF0ZSBjb250ZW50LlxuICBjb25zdCBzaGFkb3cgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgaWYgKHRlbXBsYXRlLmNvbnRlbnQpIHtcbiAgICBzaGFkb3cuYXBwZW5kKC4uLkFycmF5LmZyb20odGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcG9ueXRhaWw6IHRlbXBsYXRlLmNvbnRlbnQgbWF5IG5vdCBleGlzdCBpbiB0ZXN0IGRvdWJsZXM7IGZhbGwgYmFjayB0b1xuICAgIC8vIG1vdmluZyBjaGlsZE5vZGVzIGRpcmVjdGx5LiBSZWFsIFVzZXItQWdlbnRzIGFsd2F5cyBoYXZlIHRlbXBsYXRlLmNvbnRlbnQuXG4gICAgd2hpbGUgKHRlbXBsYXRlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIHNoYWRvdy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNoYWRvdztcbn1cblxuZnVuY3Rpb24gdGVtcGxhdGVIb3N0KHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50KTogRWxlbWVudCB8IG51bGwge1xuICBpZiAodGVtcGxhdGUucGFyZW50RWxlbWVudCkgcmV0dXJuIHRlbXBsYXRlLnBhcmVudEVsZW1lbnQ7XG4gIGNvbnN0IHBhcmVudCA9IHRlbXBsYXRlLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQ/Lm5vZGVUeXBlID09PSAxID8gcGFyZW50IGFzIEVsZW1lbnQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRTaWduYWxSZWdpc3RyeShob3N0OiBFbGVtZW50KTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAoaG9zdCBhcyBTaWduYWxSZWdpc3RyeUhvc3QpLnNpZ25hbFJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiBkaXNwb3NlU2NvcGUoc2NvcGU6IEh5ZHJhdGlvblNjb3BlKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgc2NvcGUuZGlzcG9zZSgpO1xuICB9IGNhdGNoIHtcbiAgICAvKiBpZ25vcmUgZGlzcG9zZSBlcnJvcnMgKi9cbiAgfVxufVxuXG4vKipcbiAqIEh5ZHJhdGUgYWxsIG9wZW5FbGVtZW50IGNvbXBvbmVudHMgaW4gYSByb290IGVsZW1lbnQuXG4gKlxuICogU2NhbnMgZm9yIGA8dGVtcGxhdGUgc2hhZG93cm9vdG1vZGU9XCJvcGVuXCI+YCBkZWNsYXJhdGl2ZSBzaGFkb3cgcm9vdHMsXG4gKiB1cGdyYWRlcyBjdXN0b20gZWxlbWVudHMsIGFuZCBoeWRyYXRlcyBkYXRhLXNpZ25hbCBtYXJrZXJzLlxuICpcbiAqIFJldHVybnMgYSBkaXNwb3NlIGZ1bmN0aW9uIHRoYXQgY2xlYW5zIHVwIGFsbCBlZmZlY3RzIGFuZCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlT3BlbkVsZW1lbnQoXG4gIHJvb3Q6IFBhcmVudE5vZGUsXG4gIG9wdGlvbnM/OiBDbGllbnRSdW50aW1lT3B0aW9ucyxcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCByZWdpc3RyeTogQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5IHwgdW5kZWZpbmVkID0gb3B0aW9ucz8ucmVnaXN0cnkgPz9cbiAgICBnbG9iYWxUaGlzLmN1c3RvbUVsZW1lbnRzO1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBjb2xsZWN0RHNkVGVtcGxhdGVzKHJvb3QpO1xuICBjb25zdCBzY29wZXM6IEh5ZHJhdGlvblNjb3BlW10gPSBbXTtcbiAgY29uc3QgaHlkcmF0ZWRIb3N0czogRWxlbWVudFtdID0gW107XG5cbiAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiB0ZW1wbGF0ZXMpIHtcbiAgICBjb25zdCBob3N0ID0gdGVtcGxhdGVIb3N0KHRlbXBsYXRlKTtcbiAgICBpZiAoIWhvc3QgfHwgIXJlZ2lzdHJ5KSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhZ05hbWUgPSBob3N0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjdG9yID0gcmVnaXN0cnkuZ2V0KHRhZ05hbWUpO1xuICAgIGlmICghY3RvcikgY29udGludWU7IC8vIFNraXAgbm9uLWN1c3RvbS1lbGVtZW50IGhvc3RzLlxuXG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGNyZWF0ZVNoYWRvd1Jvb3RGcm9tVGVtcGxhdGUoaG9zdCwgdGVtcGxhdGUpO1xuXG4gICAgLy8gUmVhZCBzaWduYWwgcmVnaXN0cnkgZnJvbSB0aGUgdXBncmFkZWQgZWxlbWVudCBpbnN0YW5jZS5cbiAgICAvLyBPcGVuRWxlbWVudCBzZXRzIHNpZ25hbFJlZ2lzdHJ5IGluIGl0cyBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBob3N0UmVnID0gZ2V0U2lnbmFsUmVnaXN0cnkoaG9zdCk7XG5cbiAgICBjb25zdCBzY29wZSA9IG5ldyBIeWRyYXRpb25TY29wZSh7IHNpZ25hbFJlZ2lzdHJ5OiBob3N0UmVnIH0pO1xuICAgIHNjb3BlLmh5ZHJhdGUoc2hhZG93Um9vdCwgaG9zdFJlZyk7XG4gICAgc2NvcGVzLnB1c2goc2NvcGUpO1xuICAgIGh5ZHJhdGVkSG9zdHMucHVzaChob3N0KTtcblxuICAgIC8vIFN0b3JlIGRpc3Bvc2VyIG9uIHRoZSBob3N0IHNvIGRpc3Bvc2VPcGVuRWxlbWVudCBjYW4gZmluZCBpdC5cbiAgICBob3N0RGlzcG9zZXJzLnNldChob3N0LCAoKSA9PiBkaXNwb3NlU2NvcGUoc2NvcGUpKTtcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgIGRpc3Bvc2VTY29wZShzY29wZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaG9zdCBvZiBoeWRyYXRlZEhvc3RzKSB7XG4gICAgICBob3N0RGlzcG9zZXJzLmRlbGV0ZShob3N0KTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRGlzcG9zZSBhbGwgaHlkcmF0ZWQgb3BlbkVsZW1lbnQgY29tcG9uZW50cyBpbiBhIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBXYWxrcyB0aGUgdHJlZSBsb29raW5nIGZvciBob3N0IGVsZW1lbnRzIHRoYXQgd2VyZSBoeWRyYXRlZCBieVxuICogYGh5ZHJhdGVPcGVuRWxlbWVudGAgYW5kIGNhbGxzIHRoZWlyIGNsZWFudXAgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZU9wZW5FbGVtZW50KHJvb3Q6IFBhcmVudE5vZGUpOiB2b2lkIHtcbiAgLy8gcG9ueXRhaWw6IE8obikgd2FsayBzbyBjYWxsZXJzIGNhbiBkaXNwb3NlIGFuIGFyYml0cmFyeSBjb250YWluZXIuXG4gIGNvbnN0IHdhbGsgPSAobm9kZTogTm9kZSkgPT4ge1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgY29uc3QgZGlzcG9zZXIgPSBob3N0RGlzcG9zZXJzLmdldChlbCk7XG4gICAgaWYgKGRpc3Bvc2VyKSB7XG4gICAgICBkaXNwb3NlcigpO1xuICAgICAgaG9zdERpc3Bvc2Vycy5kZWxldGUoZWwpO1xuICAgIH1cbiAgICAvLyBXYWxrIGNoaWxkcmVuIChzdXBwb3J0cyBib3RoIHJlYWwgRE9NIGNoaWxkcmVuIGFuZCB0ZXN0IGRvdWJsZSBjaGlsZE5vZGVzKS5cbiAgICBjb25zdCBjb250YWluZXIgPSBlbCBhcyBDaGlsZENvbnRhaW5lcjtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20oY29udGFpbmVyLmNoaWxkcmVuID8/IGNvbnRhaW5lci5jaGlsZE5vZGVzID8/IFtdKSkge1xuICAgICAgd2FsayhjaGlsZCBhcyBOb2RlKTtcbiAgICB9XG4gIH07XG5cbiAgd2Fsayhyb290IGFzIE5vZGUpO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0NBT0MsR0FHRCxTQUFTLGNBQWMsUUFBUSx1QkFBdUI7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
@@ -10,6 +10,7 @@
10
10
  * @module @openelement/core/event-marker
11
11
  */ import { DATA_EID } from '@openelement/protocol/hydration-markers';
12
12
  const EVENT_PROP_RE = /^on[A-Z]/;
13
+ const DASHED_EVENT_PROP_RE = /^on-[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
13
14
  const EVENT_TYPE_ALIASES = {
14
15
  Dblclick: 'dblclick',
15
16
  DoubleClick: 'dblclick',
@@ -38,6 +39,7 @@ export function eventMarkerId(index) {
38
39
  return `e${index}`;
39
40
  }
40
41
  export function eventTypeFromProp(prop) {
42
+ if (DASHED_EVENT_PROP_RE.test(prop)) return prop.slice(3);
41
43
  if (!EVENT_PROP_RE.test(prop)) return null;
42
44
  const eventName = prop.slice(2);
43
45
  return EVENT_TYPE_ALIASES[eventName] ?? eventName.toLowerCase();
@@ -51,4 +53,4 @@ export function serializeEventMarkers(props, context) {
51
53
  }
52
54
  return '';
53
55
  }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9ldmVudC1tYXJrZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvY29yZSAtIERldGVybWluaXN0aWMgZXZlbnQgbWFya2VyIGdlbmVyYXRpb24gZm9yIFNTUiBvdXRwdXQuXG4gKlxuICogUHVyZSwgc2lkZS1lZmZlY3QtZnJlZSBoZWxwZXIgdXNlZCBieSB0aGUgU1NSIHJlbmRlcmVyIHRvIGVtaXQgYGRhdGEtZWlkYFxuICogbWFya2Vycy4gVGhpcyBtb2R1bGUgaW50ZW50aW9uYWxseSBkb2VzIE5PVCBkZXBlbmQgb24gdGhlIERPTSBiaW5kaW5nIGxheWVyXG4gKiBzbyB0aGF0IHN0YXRpYy1vbmx5IGJ1bmRsZXMgY2FuIHVzZSBpdCB3aXRob3V0IHB1bGxpbmcgaW4gaHlkcmF0aW9uIGNvZGUuXG4gKlxuICogSHlkcmF0aW9uLXRpbWUgYmluZGluZyBsb2dpYyBsaXZlcyBpbiBgZXZlbnQtaHlkcmF0aW9uLnRzYC5cbiAqXG4gKiBAbW9kdWxlIEBvcGVuZWxlbWVudC9jb3JlL2V2ZW50LW1hcmtlclxuICovXG5cbmltcG9ydCB7IERBVEFfRUlEIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL2h5ZHJhdGlvbi1tYXJrZXJzJztcblxuY29uc3QgRVZFTlRfUFJPUF9SRSA9IC9eb25bQS1aXS87XG5jb25zdCBFVkVOVF9UWVBFX0FMSUFTRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIERibGNsaWNrOiAnZGJsY2xpY2snLFxuICBEb3VibGVDbGljazogJ2RibGNsaWNrJyxcbiAgRm9jdXNJbjogJ2ZvY3VzaW4nLFxuICBGb2N1c091dDogJ2ZvY3Vzb3V0JyxcbiAgTW91c2VFbnRlcjogJ21vdXNlZW50ZXInLFxuICBNb3VzZUxlYXZlOiAnbW91c2VsZWF2ZScsXG4gIFBvaW50ZXJDYW5jZWw6ICdwb2ludGVyY2FuY2VsJyxcbiAgUG9pbnRlckRvd246ICdwb2ludGVyZG93bicsXG4gIFBvaW50ZXJFbnRlcjogJ3BvaW50ZXJlbnRlcicsXG4gIFBvaW50ZXJMZWF2ZTogJ3BvaW50ZXJsZWF2ZScsXG4gIFBvaW50ZXJNb3ZlOiAncG9pbnRlcm1vdmUnLFxuICBQb2ludGVyT3V0OiAncG9pbnRlcm91dCcsXG4gIFBvaW50ZXJPdmVyOiAncG9pbnRlcm92ZXInLFxuICBQb2ludGVyVXA6ICdwb2ludGVydXAnLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudE1hcmtlckNvbnRleHQge1xuICBuZXh0SWQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRNYXJrZXJDb250ZXh0KCk6IEV2ZW50TWFya2VyQ29udGV4dCB7XG4gIGxldCBjb3VudCA9IDA7XG4gIHJldHVybiB7XG4gICAgbmV4dElkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXZlbnRNYXJrZXJJZChjb3VudCsrKTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRNYXJrZXJJZChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBlJHtpbmRleH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRUeXBlRnJvbVByb3AocHJvcDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghRVZFTlRfUFJPUF9SRS50ZXN0KHByb3ApKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZXZlbnROYW1lID0gcHJvcC5zbGljZSgyKTtcbiAgcmV0dXJuIEVWRU5UX1RZUEVfQUxJQVNFU1tldmVudE5hbWVdID8/IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplRXZlbnRNYXJrZXJzKFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IEV2ZW50TWFya2VyQ29udGV4dCxcbik6IHN0cmluZyB7XG4gIGlmICghcHJvcHMpIHJldHVybiAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgaWYgKGV2ZW50VHlwZUZyb21Qcm9wKGtleSkgJiYgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYCAke0RBVEFfRUlEfT1cIiR7Y29udGV4dC5uZXh0SWQoKX1cImA7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztDQVVDLEdBRUQsU0FBUyxRQUFRLFFBQVEsMENBQTBDO0FBRW5FLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0scUJBQTZDO0VBQ2pELFVBQVU7RUFDVixhQUFhO0VBQ2IsU0FBUztFQUNULFVBQVU7RUFDVixZQUFZO0VBQ1osWUFBWTtFQUNaLGVBQWU7RUFDZixhQUFhO0VBQ2IsY0FBYztFQUNkLGNBQWM7RUFDZCxhQUFhO0VBQ2IsWUFBWTtFQUNaLGFBQWE7RUFDYixXQUFXO0FBQ2I7QUFNQSxPQUFPLFNBQVM7RUFDZCxJQUFJLFFBQVE7RUFDWixPQUFPO0lBQ0w7TUFDRSxPQUFPLGNBQWM7SUFDdkI7RUFDRjtBQUNGO0FBRUEsT0FBTyxTQUFTLGNBQWMsS0FBYTtFQUN6QyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU87QUFDcEI7QUFFQSxPQUFPLFNBQVMsa0JBQWtCLElBQVk7RUFDNUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sT0FBTztFQUN0QyxNQUFNLFlBQVksS0FBSyxLQUFLLENBQUM7RUFDN0IsT0FBTyxrQkFBa0IsQ0FBQyxVQUFVLElBQUksVUFBVSxXQUFXO0FBQy9EO0FBRUEsT0FBTyxTQUFTLHNCQUNkLEtBQTBDLEVBQzFDLE9BQTJCO0VBRTNCLElBQUksQ0FBQyxPQUFPLE9BQU87RUFDbkIsS0FBSyxNQUFNLENBQUMsS0FBSyxNQUFNLElBQUksT0FBTyxPQUFPLENBQUMsT0FBUTtJQUNoRCxJQUFJLGtCQUFrQixRQUFRLE9BQU8sVUFBVSxZQUFZO01BQ3pELE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsUUFBUSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdDO0VBQ0Y7RUFDQSxPQUFPO0FBQ1QifQ==
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9ldmVudC1tYXJrZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvY29yZSAtIERldGVybWluaXN0aWMgZXZlbnQgbWFya2VyIGdlbmVyYXRpb24gZm9yIFNTUiBvdXRwdXQuXG4gKlxuICogUHVyZSwgc2lkZS1lZmZlY3QtZnJlZSBoZWxwZXIgdXNlZCBieSB0aGUgU1NSIHJlbmRlcmVyIHRvIGVtaXQgYGRhdGEtZWlkYFxuICogbWFya2Vycy4gVGhpcyBtb2R1bGUgaW50ZW50aW9uYWxseSBkb2VzIE5PVCBkZXBlbmQgb24gdGhlIERPTSBiaW5kaW5nIGxheWVyXG4gKiBzbyB0aGF0IHN0YXRpYy1vbmx5IGJ1bmRsZXMgY2FuIHVzZSBpdCB3aXRob3V0IHB1bGxpbmcgaW4gaHlkcmF0aW9uIGNvZGUuXG4gKlxuICogSHlkcmF0aW9uLXRpbWUgYmluZGluZyBsb2dpYyBsaXZlcyBpbiBgZXZlbnQtaHlkcmF0aW9uLnRzYC5cbiAqXG4gKiBAbW9kdWxlIEBvcGVuZWxlbWVudC9jb3JlL2V2ZW50LW1hcmtlclxuICovXG5cbmltcG9ydCB7IERBVEFfRUlEIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL2h5ZHJhdGlvbi1tYXJrZXJzJztcblxuY29uc3QgRVZFTlRfUFJPUF9SRSA9IC9eb25bQS1aXS87XG5jb25zdCBEQVNIRURfRVZFTlRfUFJPUF9SRSA9IC9eb24tW2Etel1bYS16MC05XSooPzotW2EtejAtOV0rKSokLztcbmNvbnN0IEVWRU5UX1RZUEVfQUxJQVNFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgRGJsY2xpY2s6ICdkYmxjbGljaycsXG4gIERvdWJsZUNsaWNrOiAnZGJsY2xpY2snLFxuICBGb2N1c0luOiAnZm9jdXNpbicsXG4gIEZvY3VzT3V0OiAnZm9jdXNvdXQnLFxuICBNb3VzZUVudGVyOiAnbW91c2VlbnRlcicsXG4gIE1vdXNlTGVhdmU6ICdtb3VzZWxlYXZlJyxcbiAgUG9pbnRlckNhbmNlbDogJ3BvaW50ZXJjYW5jZWwnLFxuICBQb2ludGVyRG93bjogJ3BvaW50ZXJkb3duJyxcbiAgUG9pbnRlckVudGVyOiAncG9pbnRlcmVudGVyJyxcbiAgUG9pbnRlckxlYXZlOiAncG9pbnRlcmxlYXZlJyxcbiAgUG9pbnRlck1vdmU6ICdwb2ludGVybW92ZScsXG4gIFBvaW50ZXJPdXQ6ICdwb2ludGVyb3V0JyxcbiAgUG9pbnRlck92ZXI6ICdwb2ludGVyb3ZlcicsXG4gIFBvaW50ZXJVcDogJ3BvaW50ZXJ1cCcsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50TWFya2VyQ29udGV4dCB7XG4gIG5leHRJZCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudE1hcmtlckNvbnRleHQoKTogRXZlbnRNYXJrZXJDb250ZXh0IHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgcmV0dXJuIHtcbiAgICBuZXh0SWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBldmVudE1hcmtlcklkKGNvdW50KyspO1xuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE1hcmtlcklkKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYGUke2luZGV4fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudFR5cGVGcm9tUHJvcChwcm9wOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKERBU0hFRF9FVkVOVF9QUk9QX1JFLnRlc3QocHJvcCkpIHJldHVybiBwcm9wLnNsaWNlKDMpO1xuICBpZiAoIUVWRU5UX1BST1BfUkUudGVzdChwcm9wKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGV2ZW50TmFtZSA9IHByb3Auc2xpY2UoMik7XG4gIHJldHVybiBFVkVOVF9UWVBFX0FMSUFTRVNbZXZlbnROYW1lXSA/PyBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUV2ZW50TWFya2VycyhcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBFdmVudE1hcmtlckNvbnRleHQsXG4pOiBzdHJpbmcge1xuICBpZiAoIXByb3BzKSByZXR1cm4gJyc7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgIGlmIChldmVudFR5cGVGcm9tUHJvcChrZXkpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGAgJHtEQVRBX0VJRH09XCIke2NvbnRleHQubmV4dElkKCl9XCJgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Q0FVQyxHQUVELFNBQVMsUUFBUSxRQUFRLDBDQUEwQztBQUVuRSxNQUFNLGdCQUFnQjtBQUN0QixNQUFNLHVCQUF1QjtBQUM3QixNQUFNLHFCQUE2QztFQUNqRCxVQUFVO0VBQ1YsYUFBYTtFQUNiLFNBQVM7RUFDVCxVQUFVO0VBQ1YsWUFBWTtFQUNaLFlBQVk7RUFDWixlQUFlO0VBQ2YsYUFBYTtFQUNiLGNBQWM7RUFDZCxjQUFjO0VBQ2QsYUFBYTtFQUNiLFlBQVk7RUFDWixhQUFhO0VBQ2IsV0FBVztBQUNiO0FBTUEsT0FBTyxTQUFTO0VBQ2QsSUFBSSxRQUFRO0VBQ1osT0FBTztJQUNMO01BQ0UsT0FBTyxjQUFjO0lBQ3ZCO0VBQ0Y7QUFDRjtBQUVBLE9BQU8sU0FBUyxjQUFjLEtBQWE7RUFDekMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPO0FBQ3BCO0FBRUEsT0FBTyxTQUFTLGtCQUFrQixJQUFZO0VBQzVDLElBQUkscUJBQXFCLElBQUksQ0FBQyxPQUFPLE9BQU8sS0FBSyxLQUFLLENBQUM7RUFDdkQsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sT0FBTztFQUN0QyxNQUFNLFlBQVksS0FBSyxLQUFLLENBQUM7RUFDN0IsT0FBTyxrQkFBa0IsQ0FBQyxVQUFVLElBQUksVUFBVSxXQUFXO0FBQy9EO0FBRUEsT0FBTyxTQUFTLHNCQUNkLEtBQTBDLEVBQzFDLE9BQTJCO0VBRTNCLElBQUksQ0FBQyxPQUFPLE9BQU87RUFDbkIsS0FBSyxNQUFNLENBQUMsS0FBSyxNQUFNLElBQUksT0FBTyxPQUFPLENBQUMsT0FBUTtJQUNoRCxJQUFJLGtCQUFrQixRQUFRLE9BQU8sVUFBVSxZQUFZO01BQ3pELE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsUUFBUSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdDO0VBQ0Y7RUFDQSxPQUFPO0FBQ1QifQ==
package/src/hydrate.d.ts CHANGED
@@ -15,3 +15,5 @@ export { collectEventBindings, eventRecordsToDescriptors, hydrateEventMarkers }
15
15
  export type { EventBinding, EventBindingRecord } from "./event-hydration.js";
16
16
  export { createDsdRenderRoot, hydrateDsdEvents } from "./dsd-hydration.js";
17
17
  export type { Constructor, DsdHydration } from "./dsd-hydration.js";
18
+ export { disposeOpenElement, hydrateOpenElement } from "./client-runtime.js";
19
+ export type { ClientRuntimeOptions } from "./client-runtime.js";
package/src/hydrate.js CHANGED
@@ -14,4 +14,6 @@ export { applyBindingDescriptor, commitBindings, registerBindingKind } from './b
14
14
  export { collectEventBindings, eventRecordsToDescriptors, hydrateEventMarkers } from './event-hydration.js';
15
15
  // DSD hydration contract
16
16
  export { createDsdRenderRoot, hydrateDsdEvents } from './dsd-hydration.js';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG9wZW5lbGVtZW50L2NvcmUvaHlkcmF0ZSAtIERTRCBpbnRlcmFjdGl2ZSBydW50aW1lIHN1cmZhY2UuXG4gKlxuICogSW5jbHVkZXMgdGhlIHN0YXRpYyByZW5kZXJpbmcgc3VyZmFjZSBwbHVzIG1hcmtlci1iYXNlZCBldmVudCBoeWRyYXRpb25cbiAqIGFuZCBEU0Qgc2hhZG93LXJvb3QgaHlkcmF0aW9uIGhlbHBlcnMuIFVzZWQgYnkgRFNEIGludGVyYWN0aXZlIGlzbGFuZHMuXG4gKlxuICogQURSLTAxMDkgUGhhc2UgMTogc3BsaXQgQG9wZW5lbGVtZW50L2NvcmUgaW50byBzdGF0aWMsIGh5ZHJhdGUsIGFuZCBjc3IuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9zdGF0aWMuanMnO1xuXG4vLyBIeWRyYXRpb24gc2NvcGVcbmV4cG9ydCB7IEh5ZHJhdGlvblNjb3BlIH0gZnJvbSAnLi9oeWRyYXRpb24tc2NvcGUuanMnO1xuZXhwb3J0IHR5cGUgeyBIeWRyYXRpb25TY29wZURlYnVnLCBIeWRyYXRpb25TY29wZU9wdGlvbnMgfSBmcm9tICcuL2h5ZHJhdGlvbi1zY29wZS5qcyc7XG5cbi8vIEJpbmRpbmcgbGF5ZXJcbmV4cG9ydCB0eXBlIHtcbiAgQmluZGluZ0Rlc2NyaXB0b3IsXG4gIEJpbmRpbmdEaXNwb3NlLFxuICBCaW5kaW5nTGlmZWN5Y2xlLFxuICBCaW5kaW5nUmVuZGVyZXIsXG59IGZyb20gJy4vYmluZGluZy1kZXNjcmlwdG9yLmpzJztcbmV4cG9ydCB7XG4gIGJpbmRBdHRyLFxuICBiaW5kQ2xhc3MsXG4gIGJpbmRDb25kaXRpb25hbCxcbiAgYmluZEV2ZW50LFxuICBiaW5kSHRtbCxcbiAgYmluZExpc3QsXG4gIGJpbmRSZWYsXG4gIGJpbmRSZW5kZXIsXG4gIGJpbmRTdGF0aWNBdHRyLFxuICBiaW5kU3RhdGljQm9vbGVhbixcbiAgYmluZFN0YXRpY1Byb3AsXG4gIGJpbmRTdGF0aWNTdHlsZSxcbiAgYmluZFRleHQsXG59IGZyb20gJy4vYmluZGluZy1kZXNjcmlwdG9yLmpzJztcbmV4cG9ydCB7XG4gIGFwcGx5QmluZGluZ0Rlc2NyaXB0b3IsXG4gIGNvbW1pdEJpbmRpbmdzLFxuICByZWdpc3RlckJpbmRpbmdLaW5kLFxufSBmcm9tICcuL2JpbmRpbmctYWN0aXZhdGlvbi5qcyc7XG5cbi8vIE1hcmtlci1iYXNlZCBldmVudCBoeWRyYXRpb24gKERPTS1zcGVjaWZpYyBwYXJ0cyBub3QgaW4gc3RhdGljLnRzKVxuZXhwb3J0IHtcbiAgY29sbGVjdEV2ZW50QmluZGluZ3MsXG4gIGV2ZW50UmVjb3Jkc1RvRGVzY3JpcHRvcnMsXG4gIGh5ZHJhdGVFdmVudE1hcmtlcnMsXG59IGZyb20gJy4vZXZlbnQtaHlkcmF0aW9uLmpzJztcbmV4cG9ydCB0eXBlIHsgRXZlbnRCaW5kaW5nLCBFdmVudEJpbmRpbmdSZWNvcmQgfSBmcm9tICcuL2V2ZW50LWh5ZHJhdGlvbi5qcyc7XG5cbi8vIERTRCBoeWRyYXRpb24gY29udHJhY3RcbmV4cG9ydCB7IGNyZWF0ZURzZFJlbmRlclJvb3QsIGh5ZHJhdGVEc2RFdmVudHMgfSBmcm9tICcuL2RzZC1oeWRyYXRpb24uanMnO1xuZXhwb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciwgRHNkSHlkcmF0aW9uIH0gZnJvbSAnLi9kc2QtaHlkcmF0aW9uLmpzJztcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztDQU9DLEdBRUQsY0FBYyxjQUFjO0FBRTVCLGtCQUFrQjtBQUNsQixTQUFTLGNBQWMsUUFBUSx1QkFBdUI7QUFVdEQsU0FDRSxRQUFRLEVBQ1IsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1AsVUFBVSxFQUNWLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGVBQWUsRUFDZixRQUFRLFFBQ0gsMEJBQTBCO0FBQ2pDLFNBQ0Usc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxtQkFBbUIsUUFDZCwwQkFBMEI7QUFFakMscUVBQXFFO0FBQ3JFLFNBQ0Usb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QixtQkFBbUIsUUFDZCx1QkFBdUI7QUFHOUIseUJBQXlCO0FBQ3pCLFNBQVMsbUJBQW1CLEVBQUUsZ0JBQWdCLFFBQVEscUJBQXFCIn0=
17
+ // Client runtime for third-party frameworks
18
+ export { disposeOpenElement, hydrateOpenElement } from './client-runtime.js';
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG9wZW5lbGVtZW50L2NvcmUvaHlkcmF0ZSAtIERTRCBpbnRlcmFjdGl2ZSBydW50aW1lIHN1cmZhY2UuXG4gKlxuICogSW5jbHVkZXMgdGhlIHN0YXRpYyByZW5kZXJpbmcgc3VyZmFjZSBwbHVzIG1hcmtlci1iYXNlZCBldmVudCBoeWRyYXRpb25cbiAqIGFuZCBEU0Qgc2hhZG93LXJvb3QgaHlkcmF0aW9uIGhlbHBlcnMuIFVzZWQgYnkgRFNEIGludGVyYWN0aXZlIGlzbGFuZHMuXG4gKlxuICogQURSLTAxMDkgUGhhc2UgMTogc3BsaXQgQG9wZW5lbGVtZW50L2NvcmUgaW50byBzdGF0aWMsIGh5ZHJhdGUsIGFuZCBjc3IuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9zdGF0aWMuanMnO1xuXG4vLyBIeWRyYXRpb24gc2NvcGVcbmV4cG9ydCB7IEh5ZHJhdGlvblNjb3BlIH0gZnJvbSAnLi9oeWRyYXRpb24tc2NvcGUuanMnO1xuZXhwb3J0IHR5cGUgeyBIeWRyYXRpb25TY29wZURlYnVnLCBIeWRyYXRpb25TY29wZU9wdGlvbnMgfSBmcm9tICcuL2h5ZHJhdGlvbi1zY29wZS5qcyc7XG5cbi8vIEJpbmRpbmcgbGF5ZXJcbmV4cG9ydCB0eXBlIHtcbiAgQmluZGluZ0Rlc2NyaXB0b3IsXG4gIEJpbmRpbmdEaXNwb3NlLFxuICBCaW5kaW5nTGlmZWN5Y2xlLFxuICBCaW5kaW5nUmVuZGVyZXIsXG59IGZyb20gJy4vYmluZGluZy1kZXNjcmlwdG9yLmpzJztcbmV4cG9ydCB7XG4gIGJpbmRBdHRyLFxuICBiaW5kQ2xhc3MsXG4gIGJpbmRDb25kaXRpb25hbCxcbiAgYmluZEV2ZW50LFxuICBiaW5kSHRtbCxcbiAgYmluZExpc3QsXG4gIGJpbmRSZWYsXG4gIGJpbmRSZW5kZXIsXG4gIGJpbmRTdGF0aWNBdHRyLFxuICBiaW5kU3RhdGljQm9vbGVhbixcbiAgYmluZFN0YXRpY1Byb3AsXG4gIGJpbmRTdGF0aWNTdHlsZSxcbiAgYmluZFRleHQsXG59IGZyb20gJy4vYmluZGluZy1kZXNjcmlwdG9yLmpzJztcbmV4cG9ydCB7XG4gIGFwcGx5QmluZGluZ0Rlc2NyaXB0b3IsXG4gIGNvbW1pdEJpbmRpbmdzLFxuICByZWdpc3RlckJpbmRpbmdLaW5kLFxufSBmcm9tICcuL2JpbmRpbmctYWN0aXZhdGlvbi5qcyc7XG5cbi8vIE1hcmtlci1iYXNlZCBldmVudCBoeWRyYXRpb24gKERPTS1zcGVjaWZpYyBwYXJ0cyBub3QgaW4gc3RhdGljLnRzKVxuZXhwb3J0IHtcbiAgY29sbGVjdEV2ZW50QmluZGluZ3MsXG4gIGV2ZW50UmVjb3Jkc1RvRGVzY3JpcHRvcnMsXG4gIGh5ZHJhdGVFdmVudE1hcmtlcnMsXG59IGZyb20gJy4vZXZlbnQtaHlkcmF0aW9uLmpzJztcbmV4cG9ydCB0eXBlIHsgRXZlbnRCaW5kaW5nLCBFdmVudEJpbmRpbmdSZWNvcmQgfSBmcm9tICcuL2V2ZW50LWh5ZHJhdGlvbi5qcyc7XG5cbi8vIERTRCBoeWRyYXRpb24gY29udHJhY3RcbmV4cG9ydCB7IGNyZWF0ZURzZFJlbmRlclJvb3QsIGh5ZHJhdGVEc2RFdmVudHMgfSBmcm9tICcuL2RzZC1oeWRyYXRpb24uanMnO1xuZXhwb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciwgRHNkSHlkcmF0aW9uIH0gZnJvbSAnLi9kc2QtaHlkcmF0aW9uLmpzJztcblxuLy8gQ2xpZW50IHJ1bnRpbWUgZm9yIHRoaXJkLXBhcnR5IGZyYW1ld29ya3NcbmV4cG9ydCB7IGRpc3Bvc2VPcGVuRWxlbWVudCwgaHlkcmF0ZU9wZW5FbGVtZW50IH0gZnJvbSAnLi9jbGllbnQtcnVudGltZS5qcyc7XG5leHBvcnQgdHlwZSB7IENsaWVudFJ1bnRpbWVPcHRpb25zIH0gZnJvbSAnLi9jbGllbnQtcnVudGltZS5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Q0FPQyxHQUVELGNBQWMsY0FBYztBQUU1QixrQkFBa0I7QUFDbEIsU0FBUyxjQUFjLFFBQVEsdUJBQXVCO0FBVXRELFNBQ0UsUUFBUSxFQUNSLFNBQVMsRUFDVCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsRUFDVixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsUUFBUSxRQUNILDBCQUEwQjtBQUNqQyxTQUNFLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsbUJBQW1CLFFBQ2QsMEJBQTBCO0FBRWpDLHFFQUFxRTtBQUNyRSxTQUNFLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsbUJBQW1CLFFBQ2QsdUJBQXVCO0FBRzlCLHlCQUF5QjtBQUN6QixTQUFTLG1CQUFtQixFQUFFLGdCQUFnQixRQUFRLHFCQUFxQjtBQUczRSw0Q0FBNEM7QUFDNUMsU0FBUyxrQkFBa0IsRUFBRSxrQkFBa0IsUUFBUSxzQkFBc0IifQ==
@@ -104,7 +104,7 @@ import { DATA_SIGNAL, DATA_SIGNAL_ATTR, DATA_SIGNAL_CLASS, DATA_SIGNAL_RENDER, p
104
104
  hydrateEventMarkers(shadowRoot, eventBindings, this.#eventCleanups, shadowRoot.host ?? undefined);
105
105
  }
106
106
  // Chromium DSD layout fix: force reflow without DOM rebuild.
107
- requestAnimationFrame(()=>{
107
+ globalThis.requestAnimationFrame?.(()=>{
108
108
  void shadowRoot.host?.offsetHeight;
109
109
  });
110
110
  }
@@ -157,4 +157,4 @@ import { DATA_SIGNAL, DATA_SIGNAL_ATTR, DATA_SIGNAL_CLASS, DATA_SIGNAL_RENDER, p
157
157
  return undefined;
158
158
  }
159
159
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRpb24tc2NvcGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvY29yZS9oeWRyYXRlIC0gSHlkcmF0aW9uU2NvcGUgdmFsdWUgb2JqZWN0LlxuICpcbiAqIFN0YW5kYWxvbmUgY29udGFpbmVyIGZvciB0aGUgbGlmZWN5Y2xlIHN0YXRlIG9mIGEgaHlkcmF0ZWQgc2hhZG93IHJvb3QuXG4gKiBPd25zIGVmZmVjdCBkaXNwb3NlcnMsIGV2ZW50IGNsZWFudXBzLCBhbmQgdGhlIGNhY2hlZCBWTm9kZSB1c2VkIGZvclxuICogZGVjbGFyYXRpdmUgZXZlbnQgbWFya2VyIGJpbmRpbmcuIERlc2lnbmVkIHRvIGJlIHVzYWJsZSB3aXRob3V0IGFuXG4gKiBPcGVuRWxlbWVudCBpbnN0YW5jZSBzbyB0aGlyZC1wYXJ0eSBmcmFtZXdvcmsgcnVudGltZXMgY2FuIGh5ZHJhdGUgdGhlXG4gKiBzYW1lIERTRCBzaGFkb3cgcm9vdCBsYXRlci5cbiAqXG4gKiBAbW9kdWxlIEBvcGVuZWxlbWVudC9jb3JlL2h5ZHJhdGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNpZ25hbCB9IGZyb20gJ0BvcGVuZWxlbWVudC9wcm90b2NvbC9zaWduYWwnO1xuaW1wb3J0IHsgYXBwbHlCaW5kaW5nRGVzY3JpcHRvciB9IGZyb20gJy4vYmluZGluZy1hY3RpdmF0aW9uLmpzJztcbmltcG9ydCB7IGNvbGxlY3RFdmVudEJpbmRpbmdzLCBoeWRyYXRlRXZlbnRNYXJrZXJzIH0gZnJvbSAnLi9ldmVudC1oeWRyYXRpb24uanMnO1xuaW1wb3J0IHsgcmVuZGVyVG9Eb20gfSBmcm9tICcuL2pzeC1yZW5kZXItZG9tLmpzJztcbmltcG9ydCB7IGlzVk5vZGUgfSBmcm9tICcuL3Zub2RlLmpzJztcbmltcG9ydCB7IGJpbmRBdHRyLCBiaW5kQ2xhc3MsIGJpbmRSZW5kZXIsIGJpbmRUZXh0IH0gZnJvbSAnLi9iaW5kaW5nLWRlc2NyaXB0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nRGVzY3JpcHRvciwgQmluZGluZ0xpZmVjeWNsZSwgQmluZGluZ1JlbmRlcmVyIH0gZnJvbSAnLi9iaW5kaW5nLWRlc2NyaXB0b3IuanMnO1xuaW1wb3J0IHtcbiAgREFUQV9TSUdOQUwsXG4gIERBVEFfU0lHTkFMX0FUVFIsXG4gIERBVEFfU0lHTkFMX0NMQVNTLFxuICBEQVRBX1NJR05BTF9SRU5ERVIsXG4gIHBhcnNlU2lnbmFsQXR0clNwZWMsXG59IGZyb20gJ0BvcGVuZWxlbWVudC9wcm90b2NvbC9oeWRyYXRpb24tbWFya2Vycyc7XG5cbi8qKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIEh5ZHJhdGlvblNjb3BlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIeWRyYXRpb25TY29wZU9wdGlvbnMge1xuICAvKiogU2lnbmFsIHJlZ2lzdHJ5IHVzZWQgdG8gcmVzb2x2ZSBkYXRhLXNpZ25hbCBtYXJrZXJzLiAqL1xuICBzaWduYWxSZWdpc3RyeT86IE1hcDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj47XG4gIC8qKiBSZW5kZXJlciB1c2VkIGZvciBzaWduYWwtcmVuZGVyIGFuZCBldmVudC1tYXJrZXIgVk5vZGUgcmVuZGVyaW5nLiAqL1xuICByZW5kZXJlcj86IEJpbmRpbmdSZW5kZXJlcjtcbiAgLyoqIFJlbmRlciBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIHRoZSBWTm9kZSB1c2VkIGZvciBldmVudC1tYXJrZXIgaHlkcmF0aW9uLiAqL1xuICByZW5kZXI/OiAoKSA9PiB1bmtub3duO1xufVxuXG4vKiogUmVhZC1vbmx5IG9ic2VydmFibGVzIGV4cG9zZWQgZm9yIGRlYnVnZ2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHlkcmF0aW9uU2NvcGVEZWJ1ZyB7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICBlZmZlY3RDb3VudDogbnVtYmVyO1xuICBldmVudENsZWFudXBDb3VudDogbnVtYmVyO1xufVxuXG4vKiogQ29sbGVjdCBiaW5kaW5nIGRlc2NyaXB0b3JzIGZyb20gZGF0YS1zaWduYWwgbWFya2VycyBpbiBhIHNoYWRvdyByb290LiAqL1xuZnVuY3Rpb24gY29sbGVjdEh5ZHJhdGlvbkJpbmRpbmdzKFxuICBzaGFkb3dSb290OiBTaGFkb3dSb290LFxuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PixcbiAgbGlmZWN5Y2xlOiBCaW5kaW5nTGlmZWN5Y2xlLFxuKTogQmluZGluZ0Rlc2NyaXB0b3JbXSB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzOiBCaW5kaW5nRGVzY3JpcHRvcltdID0gW107XG5cbiAgZm9yIChjb25zdCBlbCBvZiBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske0RBVEFfU0lHTkFMfV1gKSkge1xuICAgIGNvbnN0IG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUwpO1xuICAgIGlmICghbmFtZSkgY29udGludWU7XG4gICAgY29uc3Qgc2lnID0gc2lnbmFsUmVnaXN0cnkuZ2V0KG5hbWUpO1xuICAgIGlmICghc2lnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGhhc0NsYXNzID0gZWwuaGFzQXR0cmlidXRlKERBVEFfU0lHTkFMX0NMQVNTKTtcbiAgICBjb25zdCBoYXNBdHRyID0gZWwuaGFzQXR0cmlidXRlKERBVEFfU0lHTkFMX0FUVFIpO1xuXG4gICAgaWYgKGhhc0NsYXNzKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfQ0xBU1MpO1xuICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICBkZXNjcmlwdG9ycy5wdXNoKGJpbmRDbGFzcyhlbCwgY2xhc3NOYW1lLCBzaWcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQXR0cikge1xuICAgICAgY29uc3QgYXR0clNwZWMgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfQVRUUik7XG4gICAgICBpZiAoYXR0clNwZWMpIHtcbiAgICAgICAgY29uc3QgYXR0ck5hbWVzID0gcGFyc2VTaWduYWxBdHRyU3BlYyhhdHRyU3BlYyk7XG4gICAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlc2NyaXB0b3JzLnB1c2goYmluZEF0dHIoZWwsIGF0dHJOYW1lcywgc2lnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0NsYXNzICYmICFoYXNBdHRyKSB7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKGJpbmRUZXh0KGVsLCBzaWcpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVsIG9mIHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7REFUQV9TSUdOQUxfUkVOREVSfV1gKSkge1xuICAgIGNvbnN0IG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfUkVOREVSKTtcbiAgICBpZiAoIW5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNpZyA9IHNpZ25hbFJlZ2lzdHJ5LmdldChuYW1lKTtcbiAgICBpZiAoIXNpZykgY29udGludWU7XG5cbiAgICBkZXNjcmlwdG9ycy5wdXNoKGJpbmRSZW5kZXIoZWwsIHNpZywgbGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gZGVzY3JpcHRvcnM7XG59XG5cbi8qKlxuICogTGlmZWN5Y2xlIHNjb3BlIGZvciBhIGh5ZHJhdGVkIHNoYWRvdyByb290LlxuICpcbiAqIEtlZXBzIGVmZmVjdCBkaXNwb3NlcnMsIGV2ZW50IGxpc3RlbmVyIGNsZWFudXBzLCBhbmQgdGhlIGNhY2hlZCBWTm9kZSBpbiBvbmVcbiAqIHBsYWNlIHNvIHRoZXkgY2FuIGJlIGRpc3Bvc2VkIGFzIGEgdW5pdC4gVGhlIHNjb3BlIGRvZXMgbm90IGRlcGVuZCBvblxuICogT3BlbkVsZW1lbnQ7IGNhbGxlcnMgcHJvdmlkZSB0aGUgc2lnbmFsIHJlZ2lzdHJ5IGFuZCBvcHRpb25hbCByZW5kZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBIeWRyYXRpb25TY29wZSB7XG4gICNlZmZlY3REaXNwb3NlcnM6IFNldDwoKSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcbiAgI2V2ZW50Q2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG4gICNzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PjtcbiAgI3JlbmRlcmVyOiBCaW5kaW5nUmVuZGVyZXI7XG4gICNyZW5kZXI/OiAoKSA9PiB1bmtub3duO1xuICAjY2FjaGVkVk5vZGU6IHVua25vd24gPSB1bmRlZmluZWQ7XG4gICNjYWNoZVZhbGlkID0gZmFsc2U7XG4gICNhY3RpdmUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEh5ZHJhdGlvblNjb3BlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy4jc2lnbmFsUmVnaXN0cnkgPSBvcHRpb25zLnNpZ25hbFJlZ2lzdHJ5ID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLiNyZW5kZXJlciA9IG9wdGlvbnMucmVuZGVyZXIgPz8ge1xuICAgICAgcmVuZGVyOiAobm9kZSwgbGlmZWN5Y2xlKSA9PiByZW5kZXJUb0RvbShub2RlLCBsaWZlY3ljbGUpLFxuICAgIH07XG4gICAgdGhpcy4jcmVuZGVyID0gb3B0aW9ucy5yZW5kZXI7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgQmluZGluZ0xpZmVjeWNsZSBiYWNrZWQgYnkgdGhpcyBzY29wZSdzIGVmZmVjdCBkaXNwb3NlcnMuICovXG4gIGNyZWF0ZUxpZmVjeWNsZSgpOiBCaW5kaW5nTGlmZWN5Y2xlIHtcbiAgICByZXR1cm4geyBkaXNwb3NlcnM6IHRoaXMuI2VmZmVjdERpc3Bvc2VycyB9O1xuICB9XG5cbiAgLyoqIFNldCB0aGUgY2FjaGVkIFZOb2RlIGZvciBldmVudC1tYXJrZXIgaHlkcmF0aW9uLiAqL1xuICBzZXRDYWNoZWRWTm9kZSh2bm9kZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuI2NhY2hlZFZOb2RlID0gdm5vZGU7XG4gICAgdGhpcy4jY2FjaGVWYWxpZCA9IHRydWU7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkYXRhLXNpZ25hbCBtYXJrZXJzIGluIGEgc2hhZG93IHJvb3QgYW5kIGFjdGl2YXRlIGJpbmRpbmdzLiAqL1xuICBoeWRyYXRlKHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QsIHNpZ25hbFJlZ2lzdHJ5PzogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+Pik6IHZvaWQge1xuICAgIGlmICghdGhpcy4jYWN0aXZlKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RyeSA9IHNpZ25hbFJlZ2lzdHJ5ID8/IHRoaXMuI3NpZ25hbFJlZ2lzdHJ5O1xuICAgIGNvbnN0IGxpZmVjeWNsZTogQmluZGluZ0xpZmVjeWNsZSA9IHsgZGlzcG9zZXJzOiB0aGlzLiNlZmZlY3REaXNwb3NlcnMgfTtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IGNvbGxlY3RIeWRyYXRpb25CaW5kaW5ncyhzaGFkb3dSb290LCByZWdpc3RyeSwgbGlmZWN5Y2xlKTtcblxuICAgIGZvciAoY29uc3QgZGVzYyBvZiBkZXNjcmlwdG9ycykge1xuICAgICAgaWYgKGRlc2Mua2luZCA9PT0gJ3NpZ25hbC1yZW5kZXInKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBEU0QgaHlkcmF0aW9uIGNvbnRyYWN0OiByZXBsYWNlIGFueSBTU1IgY29udGVudFxuICAgICAgICAvLyB3aXRoIHRoZSBjbGllbnQtcmVuZGVyZWQgVk5vZGUgdHJlZSBvbiBmaXJzdCBhY3RpdmF0aW9uLlxuICAgICAgICB3aGlsZSAoZGVzYy5lbC5maXJzdENoaWxkKSBkZXNjLmVsLnJlbW92ZUNoaWxkKGRlc2MuZWwuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBhcHBseUJpbmRpbmdEZXNjcmlwdG9yKGRlc2MsIGxpZmVjeWNsZSwgdGhpcy4jcmVuZGVyZXIpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgZGVjbGFyYXRpdmUgZXZlbnQgbWFya2VycyBmcm9tIHRoZSBjYWNoZWQgb3IgZnJlc2hseS1yZW5kZXJlZCBWTm9kZS5cbiAgICBjb25zdCB2bm9kZSA9IHRoaXMuI3Jlc29sdmVWTm9kZSgpO1xuICAgIGlmIChpc1ZOb2RlKHZub2RlKSkge1xuICAgICAgY29uc3QgZXZlbnRCaW5kaW5ncyA9IGNvbGxlY3RFdmVudEJpbmRpbmdzKHZub2RlKTtcbiAgICAgIGh5ZHJhdGVFdmVudE1hcmtlcnMoXG4gICAgICAgIHNoYWRvd1Jvb3QsXG4gICAgICAgIGV2ZW50QmluZGluZ3MsXG4gICAgICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMsXG4gICAgICAgIHNoYWRvd1Jvb3QuaG9zdCA/PyB1bmRlZmluZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENocm9taXVtIERTRCBsYXlvdXQgZml4OiBmb3JjZSByZWZsb3cgd2l0aG91dCBET00gcmVidWlsZC5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdm9pZCAoc2hhZG93Um9vdC5ob3N0IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKT8ub2Zmc2V0SGVpZ2h0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIERpc3Bvc2UgYWxsIGVmZmVjdHMgYW5kIGV2ZW50IGxpc3RlbmVycyB0cmFja2VkIGJ5IHRoaXMgc2NvcGUuICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiNhY3RpdmUpIHJldHVybjtcbiAgICB0aGlzLiNhY3RpdmUgPSBmYWxzZTtcblxuICAgIHRoaXMuI2NsZWFyQmluZGluZ3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBlZmZlY3RzIGFuZCBldmVudCBsaXN0ZW5lcnMgd2l0aG91dCBkZWFjdGl2YXRpbmcgdGhlIHNjb3BlLlxuICAgKlxuICAgKiBVc2VkIGJlZm9yZSByZS1yZW5kZXJpbmcgb3IgcmUtaHlkcmF0aW5nIGFuIGV4aXN0aW5nIHNoYWRvdyByb290IHNvIHRoZVxuICAgKiBzY29wZSBjYW4gYWNjZXB0IGEgZnJlc2ggc2V0IG9mIGJpbmRpbmdzLiBEb2VzIG5vdCBnYXRlIG9uICNhY3RpdmUgc29cbiAgICogdGhhdCBhIGRpc2Nvbm5lY3RlZC10aGVuLXJlY29ubmVjdGVkIGVsZW1lbnQgY2FuIGJlIHJlLWh5ZHJhdGVkLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy4jY2xlYXJCaW5kaW5ncygpO1xuICAgIHRoaXMuI2FjdGl2ZSA9IHRydWU7XG4gIH1cblxuICAjY2xlYXJCaW5kaW5ncygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy4jZWZmZWN0RGlzcG9zZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkKCk7XG4gICAgICB9IGNhdGNoIHsgLyogaWdub3JlIGRpc3Bvc2UgZXJyb3JzICovIH1cbiAgICB9XG4gICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IGYgb2YgdGhpcy4jZXZlbnRDbGVhbnVwcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZigpO1xuICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSBjbGVhbnVwIGVycm9ycyAqLyB9XG4gICAgfVxuICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMgPSBbXTtcblxuICAgIHRoaXMuI2NhY2hlZFZOb2RlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuI2NhY2hlVmFsaWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBEZWJ1ZyBvYnNlcnZhYmxlcyBmb3IgdGVzdGluZyBhbmQgZGV2dG9vbHMuICovXG4gIGdldCBkZWJ1ZygpOiBIeWRyYXRpb25TY29wZURlYnVnIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBY3RpdmU6IHRoaXMuI2FjdGl2ZSxcbiAgICAgIGVmZmVjdENvdW50OiB0aGlzLiNlZmZlY3REaXNwb3NlcnMuc2l6ZSxcbiAgICAgIGV2ZW50Q2xlYW51cENvdW50OiB0aGlzLiNldmVudENsZWFudXBzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgI3Jlc29sdmVWTm9kZSgpOiB1bmtub3duIHtcbiAgICBpZiAodGhpcy4jY2FjaGVWYWxpZCkgcmV0dXJuIHRoaXMuI2NhY2hlZFZOb2RlO1xuICAgIGlmICh0aGlzLiNyZW5kZXIpIHtcbiAgICAgIGNvbnN0IHZub2RlID0gdGhpcy4jcmVuZGVyKCk7XG4gICAgICB0aGlzLiNjYWNoZWRWTm9kZSA9IHZub2RlO1xuICAgICAgdGhpcy4jY2FjaGVWYWxpZCA9IHRydWU7XG4gICAgICByZXR1cm4gdm5vZGU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztDQVVDLEdBR0QsU0FBUyxzQkFBc0IsUUFBUSwwQkFBMEI7QUFDakUsU0FBUyxvQkFBb0IsRUFBRSxtQkFBbUIsUUFBUSx1QkFBdUI7QUFDakYsU0FBUyxXQUFXLFFBQVEsc0JBQXNCO0FBQ2xELFNBQVMsT0FBTyxRQUFRLGFBQWE7QUFDckMsU0FBUyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLFFBQVEsMEJBQTBCO0FBRXBGLFNBQ0UsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLG1CQUFtQixRQUNkLDBDQUEwQztBQW1CakQsMkVBQTJFLEdBQzNFLFNBQVMseUJBQ1AsVUFBc0IsRUFDdEIsY0FBNEMsRUFDNUMsU0FBMkI7RUFFM0IsTUFBTSxjQUFtQyxFQUFFO0VBRTNDLEtBQUssTUFBTSxNQUFNLFdBQVcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFBRztJQUNoRSxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7SUFDN0IsSUFBSSxDQUFDLE1BQU07SUFDWCxNQUFNLE1BQU0sZUFBZSxHQUFHLENBQUM7SUFDL0IsSUFBSSxDQUFDLEtBQUs7SUFFVixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFD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
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRpb24tc2NvcGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvY29yZS9oeWRyYXRlIC0gSHlkcmF0aW9uU2NvcGUgdmFsdWUgb2JqZWN0LlxuICpcbiAqIFN0YW5kYWxvbmUgY29udGFpbmVyIGZvciB0aGUgbGlmZWN5Y2xlIHN0YXRlIG9mIGEgaHlkcmF0ZWQgc2hhZG93IHJvb3QuXG4gKiBPd25zIGVmZmVjdCBkaXNwb3NlcnMsIGV2ZW50IGNsZWFudXBzLCBhbmQgdGhlIGNhY2hlZCBWTm9kZSB1c2VkIGZvclxuICogZGVjbGFyYXRpdmUgZXZlbnQgbWFya2VyIGJpbmRpbmcuIERlc2lnbmVkIHRvIGJlIHVzYWJsZSB3aXRob3V0IGFuXG4gKiBPcGVuRWxlbWVudCBpbnN0YW5jZSBzbyB0aGlyZC1wYXJ0eSBmcmFtZXdvcmsgcnVudGltZXMgY2FuIGh5ZHJhdGUgdGhlXG4gKiBzYW1lIERTRCBzaGFkb3cgcm9vdCBsYXRlci5cbiAqXG4gKiBAbW9kdWxlIEBvcGVuZWxlbWVudC9jb3JlL2h5ZHJhdGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNpZ25hbCB9IGZyb20gJ0BvcGVuZWxlbWVudC9wcm90b2NvbC9zaWduYWwnO1xuaW1wb3J0IHsgYXBwbHlCaW5kaW5nRGVzY3JpcHRvciB9IGZyb20gJy4vYmluZGluZy1hY3RpdmF0aW9uLmpzJztcbmltcG9ydCB7IGNvbGxlY3RFdmVudEJpbmRpbmdzLCBoeWRyYXRlRXZlbnRNYXJrZXJzIH0gZnJvbSAnLi9ldmVudC1oeWRyYXRpb24uanMnO1xuaW1wb3J0IHsgcmVuZGVyVG9Eb20gfSBmcm9tICcuL2pzeC1yZW5kZXItZG9tLmpzJztcbmltcG9ydCB7IGlzVk5vZGUgfSBmcm9tICcuL3Zub2RlLmpzJztcbmltcG9ydCB7IGJpbmRBdHRyLCBiaW5kQ2xhc3MsIGJpbmRSZW5kZXIsIGJpbmRUZXh0IH0gZnJvbSAnLi9iaW5kaW5nLWRlc2NyaXB0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nRGVzY3JpcHRvciwgQmluZGluZ0xpZmVjeWNsZSwgQmluZGluZ1JlbmRlcmVyIH0gZnJvbSAnLi9iaW5kaW5nLWRlc2NyaXB0b3IuanMnO1xuaW1wb3J0IHtcbiAgREFUQV9TSUdOQUwsXG4gIERBVEFfU0lHTkFMX0FUVFIsXG4gIERBVEFfU0lHTkFMX0NMQVNTLFxuICBEQVRBX1NJR05BTF9SRU5ERVIsXG4gIHBhcnNlU2lnbmFsQXR0clNwZWMsXG59IGZyb20gJ0BvcGVuZWxlbWVudC9wcm90b2NvbC9oeWRyYXRpb24tbWFya2Vycyc7XG5cbi8qKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIEh5ZHJhdGlvblNjb3BlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIeWRyYXRpb25TY29wZU9wdGlvbnMge1xuICAvKiogU2lnbmFsIHJlZ2lzdHJ5IHVzZWQgdG8gcmVzb2x2ZSBkYXRhLXNpZ25hbCBtYXJrZXJzLiAqL1xuICBzaWduYWxSZWdpc3RyeT86IE1hcDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj47XG4gIC8qKiBSZW5kZXJlciB1c2VkIGZvciBzaWduYWwtcmVuZGVyIGFuZCBldmVudC1tYXJrZXIgVk5vZGUgcmVuZGVyaW5nLiAqL1xuICByZW5kZXJlcj86IEJpbmRpbmdSZW5kZXJlcjtcbiAgLyoqIFJlbmRlciBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIHRoZSBWTm9kZSB1c2VkIGZvciBldmVudC1tYXJrZXIgaHlkcmF0aW9uLiAqL1xuICByZW5kZXI/OiAoKSA9PiB1bmtub3duO1xufVxuXG4vKiogUmVhZC1vbmx5IG9ic2VydmFibGVzIGV4cG9zZWQgZm9yIGRlYnVnZ2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHlkcmF0aW9uU2NvcGVEZWJ1ZyB7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICBlZmZlY3RDb3VudDogbnVtYmVyO1xuICBldmVudENsZWFudXBDb3VudDogbnVtYmVyO1xufVxuXG4vKiogQ29sbGVjdCBiaW5kaW5nIGRlc2NyaXB0b3JzIGZyb20gZGF0YS1zaWduYWwgbWFya2VycyBpbiBhIHNoYWRvdyByb290LiAqL1xuZnVuY3Rpb24gY29sbGVjdEh5ZHJhdGlvbkJpbmRpbmdzKFxuICBzaGFkb3dSb290OiBTaGFkb3dSb290LFxuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PixcbiAgbGlmZWN5Y2xlOiBCaW5kaW5nTGlmZWN5Y2xlLFxuKTogQmluZGluZ0Rlc2NyaXB0b3JbXSB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzOiBCaW5kaW5nRGVzY3JpcHRvcltdID0gW107XG5cbiAgZm9yIChjb25zdCBlbCBvZiBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske0RBVEFfU0lHTkFMfV1gKSkge1xuICAgIGNvbnN0IG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUwpO1xuICAgIGlmICghbmFtZSkgY29udGludWU7XG4gICAgY29uc3Qgc2lnID0gc2lnbmFsUmVnaXN0cnkuZ2V0KG5hbWUpO1xuICAgIGlmICghc2lnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGhhc0NsYXNzID0gZWwuaGFzQXR0cmlidXRlKERBVEFfU0lHTkFMX0NMQVNTKTtcbiAgICBjb25zdCBoYXNBdHRyID0gZWwuaGFzQXR0cmlidXRlKERBVEFfU0lHTkFMX0FUVFIpO1xuXG4gICAgaWYgKGhhc0NsYXNzKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfQ0xBU1MpO1xuICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICBkZXNjcmlwdG9ycy5wdXNoKGJpbmRDbGFzcyhlbCwgY2xhc3NOYW1lLCBzaWcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQXR0cikge1xuICAgICAgY29uc3QgYXR0clNwZWMgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfQVRUUik7XG4gICAgICBpZiAoYXR0clNwZWMpIHtcbiAgICAgICAgY29uc3QgYXR0ck5hbWVzID0gcGFyc2VTaWduYWxBdHRyU3BlYyhhdHRyU3BlYyk7XG4gICAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlc2NyaXB0b3JzLnB1c2goYmluZEF0dHIoZWwsIGF0dHJOYW1lcywgc2lnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0NsYXNzICYmICFoYXNBdHRyKSB7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKGJpbmRUZXh0KGVsLCBzaWcpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVsIG9mIHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7REFUQV9TSUdOQUxfUkVOREVSfV1gKSkge1xuICAgIGNvbnN0IG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfUkVOREVSKTtcbiAgICBpZiAoIW5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNpZyA9IHNpZ25hbFJlZ2lzdHJ5LmdldChuYW1lKTtcbiAgICBpZiAoIXNpZykgY29udGludWU7XG5cbiAgICBkZXNjcmlwdG9ycy5wdXNoKGJpbmRSZW5kZXIoZWwsIHNpZywgbGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gZGVzY3JpcHRvcnM7XG59XG5cbi8qKlxuICogTGlmZWN5Y2xlIHNjb3BlIGZvciBhIGh5ZHJhdGVkIHNoYWRvdyByb290LlxuICpcbiAqIEtlZXBzIGVmZmVjdCBkaXNwb3NlcnMsIGV2ZW50IGxpc3RlbmVyIGNsZWFudXBzLCBhbmQgdGhlIGNhY2hlZCBWTm9kZSBpbiBvbmVcbiAqIHBsYWNlIHNvIHRoZXkgY2FuIGJlIGRpc3Bvc2VkIGFzIGEgdW5pdC4gVGhlIHNjb3BlIGRvZXMgbm90IGRlcGVuZCBvblxuICogT3BlbkVsZW1lbnQ7IGNhbGxlcnMgcHJvdmlkZSB0aGUgc2lnbmFsIHJlZ2lzdHJ5IGFuZCBvcHRpb25hbCByZW5kZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBIeWRyYXRpb25TY29wZSB7XG4gICNlZmZlY3REaXNwb3NlcnM6IFNldDwoKSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcbiAgI2V2ZW50Q2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG4gICNzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PjtcbiAgI3JlbmRlcmVyOiBCaW5kaW5nUmVuZGVyZXI7XG4gICNyZW5kZXI/OiAoKSA9PiB1bmtub3duO1xuICAjY2FjaGVkVk5vZGU6IHVua25vd24gPSB1bmRlZmluZWQ7XG4gICNjYWNoZVZhbGlkID0gZmFsc2U7XG4gICNhY3RpdmUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEh5ZHJhdGlvblNjb3BlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy4jc2lnbmFsUmVnaXN0cnkgPSBvcHRpb25zLnNpZ25hbFJlZ2lzdHJ5ID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLiNyZW5kZXJlciA9IG9wdGlvbnMucmVuZGVyZXIgPz8ge1xuICAgICAgcmVuZGVyOiAobm9kZSwgbGlmZWN5Y2xlKSA9PiByZW5kZXJUb0RvbShub2RlLCBsaWZlY3ljbGUpLFxuICAgIH07XG4gICAgdGhpcy4jcmVuZGVyID0gb3B0aW9ucy5yZW5kZXI7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgQmluZGluZ0xpZmVjeWNsZSBiYWNrZWQgYnkgdGhpcyBzY29wZSdzIGVmZmVjdCBkaXNwb3NlcnMuICovXG4gIGNyZWF0ZUxpZmVjeWNsZSgpOiBCaW5kaW5nTGlmZWN5Y2xlIHtcbiAgICByZXR1cm4geyBkaXNwb3NlcnM6IHRoaXMuI2VmZmVjdERpc3Bvc2VycyB9O1xuICB9XG5cbiAgLyoqIFNldCB0aGUgY2FjaGVkIFZOb2RlIGZvciBldmVudC1tYXJrZXIgaHlkcmF0aW9uLiAqL1xuICBzZXRDYWNoZWRWTm9kZSh2bm9kZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuI2NhY2hlZFZOb2RlID0gdm5vZGU7XG4gICAgdGhpcy4jY2FjaGVWYWxpZCA9IHRydWU7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkYXRhLXNpZ25hbCBtYXJrZXJzIGluIGEgc2hhZG93IHJvb3QgYW5kIGFjdGl2YXRlIGJpbmRpbmdzLiAqL1xuICBoeWRyYXRlKFxuICAgIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QsXG4gICAgc2lnbmFsUmVnaXN0cnk/OiBNYXA8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI2FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVnaXN0cnkgPSBzaWduYWxSZWdpc3RyeSA/PyB0aGlzLiNzaWduYWxSZWdpc3RyeTtcbiAgICBjb25zdCBsaWZlY3ljbGU6IEJpbmRpbmdMaWZlY3ljbGUgPSB7IGRpc3Bvc2VyczogdGhpcy4jZWZmZWN0RGlzcG9zZXJzIH07XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBjb2xsZWN0SHlkcmF0aW9uQmluZGluZ3MoXG4gICAgICBzaGFkb3dSb290LFxuICAgICAgcmVnaXN0cnksXG4gICAgICBsaWZlY3ljbGUsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgZGVzYyBvZiBkZXNjcmlwdG9ycykge1xuICAgICAgaWYgKGRlc2Mua2luZCA9PT0gJ3NpZ25hbC1yZW5kZXInKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBEU0QgaHlkcmF0aW9uIGNvbnRyYWN0OiByZXBsYWNlIGFueSBTU1IgY29udGVudFxuICAgICAgICAvLyB3aXRoIHRoZSBjbGllbnQtcmVuZGVyZWQgVk5vZGUgdHJlZSBvbiBmaXJzdCBhY3RpdmF0aW9uLlxuICAgICAgICB3aGlsZSAoZGVzYy5lbC5maXJzdENoaWxkKSBkZXNjLmVsLnJlbW92ZUNoaWxkKGRlc2MuZWwuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBhcHBseUJpbmRpbmdEZXNjcmlwdG9yKGRlc2MsIGxpZmVjeWNsZSwgdGhpcy4jcmVuZGVyZXIpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgZGVjbGFyYXRpdmUgZXZlbnQgbWFya2VycyBmcm9tIHRoZSBjYWNoZWQgb3IgZnJlc2hseS1yZW5kZXJlZCBWTm9kZS5cbiAgICBjb25zdCB2bm9kZSA9IHRoaXMuI3Jlc29sdmVWTm9kZSgpO1xuICAgIGlmIChpc1ZOb2RlKHZub2RlKSkge1xuICAgICAgY29uc3QgZXZlbnRCaW5kaW5ncyA9IGNvbGxlY3RFdmVudEJpbmRpbmdzKHZub2RlKTtcbiAgICAgIGh5ZHJhdGVFdmVudE1hcmtlcnMoXG4gICAgICAgIHNoYWRvd1Jvb3QsXG4gICAgICAgIGV2ZW50QmluZGluZ3MsXG4gICAgICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMsXG4gICAgICAgIHNoYWRvd1Jvb3QuaG9zdCA/PyB1bmRlZmluZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENocm9taXVtIERTRCBsYXlvdXQgZml4OiBmb3JjZSByZWZsb3cgd2l0aG91dCBET00gcmVidWlsZC5cbiAgICBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZT8uKCgpID0+IHtcbiAgICAgIHZvaWQgKHNoYWRvd1Jvb3QuaG9zdCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk/Lm9mZnNldEhlaWdodDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEaXNwb3NlIGFsbCBlZmZlY3RzIGFuZCBldmVudCBsaXN0ZW5lcnMgdHJhY2tlZCBieSB0aGlzIHNjb3BlLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jYWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy4jYWN0aXZlID0gZmFsc2U7XG5cbiAgICB0aGlzLiNjbGVhckJpbmRpbmdzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgZWZmZWN0cyBhbmQgZXZlbnQgbGlzdGVuZXJzIHdpdGhvdXQgZGVhY3RpdmF0aW5nIHRoZSBzY29wZS5cbiAgICpcbiAgICogVXNlZCBiZWZvcmUgcmUtcmVuZGVyaW5nIG9yIHJlLWh5ZHJhdGluZyBhbiBleGlzdGluZyBzaGFkb3cgcm9vdCBzbyB0aGVcbiAgICogc2NvcGUgY2FuIGFjY2VwdCBhIGZyZXNoIHNldCBvZiBiaW5kaW5ncy4gRG9lcyBub3QgZ2F0ZSBvbiAjYWN0aXZlIHNvXG4gICAqIHRoYXQgYSBkaXNjb25uZWN0ZWQtdGhlbi1yZWNvbm5lY3RlZCBlbGVtZW50IGNhbiBiZSByZS1oeWRyYXRlZC5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuI2NsZWFyQmluZGluZ3MoKTtcbiAgICB0aGlzLiNhY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgI2NsZWFyQmluZGluZ3MoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuI2VmZmVjdERpc3Bvc2Vycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZCgpO1xuICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSBkaXNwb3NlIGVycm9ycyAqLyB9XG4gICAgfVxuICAgIHRoaXMuI2VmZmVjdERpc3Bvc2Vycy5jbGVhcigpO1xuXG4gICAgZm9yIChjb25zdCBmIG9mIHRoaXMuI2V2ZW50Q2xlYW51cHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGYoKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgY2xlYW51cCBlcnJvcnMgKi8gfVxuICAgIH1cbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gW107XG5cbiAgICB0aGlzLiNjYWNoZWRWTm9kZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLiNjYWNoZVZhbGlkID0gZmFsc2U7XG4gIH1cblxuICAvKiogRGVidWcgb2JzZXJ2YWJsZXMgZm9yIHRlc3RpbmcgYW5kIGRldnRvb2xzLiAqL1xuICBnZXQgZGVidWcoKTogSHlkcmF0aW9uU2NvcGVEZWJ1ZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQWN0aXZlOiB0aGlzLiNhY3RpdmUsXG4gICAgICBlZmZlY3RDb3VudDogdGhpcy4jZWZmZWN0RGlzcG9zZXJzLnNpemUsXG4gICAgICBldmVudENsZWFudXBDb3VudDogdGhpcy4jZXZlbnRDbGVhbnVwcy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gICNyZXNvbHZlVk5vZGUoKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuI2NhY2hlVmFsaWQpIHJldHVybiB0aGlzLiNjYWNoZWRWTm9kZTtcbiAgICBpZiAodGhpcy4jcmVuZGVyKSB7XG4gICAgICBjb25zdCB2bm9kZSA9IHRoaXMuI3JlbmRlcigpO1xuICAgICAgdGhpcy4jY2FjaGVkVk5vZGUgPSB2bm9kZTtcbiAgICAgIHRoaXMuI2NhY2hlVmFsaWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHZub2RlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Q0FVQyxHQUdELFNBQVMsc0JBQXNCLFFBQVEsMEJBQTBCO0FBQ2pFLFNBQVMsb0JBQW9CLEVBQUUsbUJBQW1CLFFBQVEsdUJBQXVCO0FBQ2pGLFNBQVMsV0FBVyxRQUFRLHNCQUFzQjtBQUNsRCxTQUFTLE9BQU8sUUFBUSxhQUFhO0FBQ3JDLFNBQVMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxRQUFRLDBCQUEwQjtBQUVwRixTQUNFLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixtQkFBbUIsUUFDZCwwQ0FBMEM7QUFtQmpELDJFQUEyRSxHQUMzRSxTQUFTLHlCQUNQLFVBQXNCLEVBQ3RCLGNBQTRDLEVBQzVDLFNBQTJCO0VBRTNCLE1BQU0sY0FBbUMsRUFBRTtFQUUzQyxLQUFLLE1BQU0sTUFBTSxXQUFXLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUc7SUFDaEUsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNO0lBQ1gsTUFBTSxNQUFNLGVBQWUsR0FBRyxD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