@openelement/element 0.41.0-alpha.1 → 0.41.0-alpha.3
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 +14 -4
- package/src/open-element-hydration.d.ts +23 -0
- package/src/open-element-hydration.js +19 -104
- package/src/open-element-render.d.ts +44 -0
- package/src/open-element-render.js +24 -35
- package/src/open-element.d.ts +12 -2
- package/src/open-element.js +58 -53
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openelement/element",
|
|
3
|
-
"version": "0.41.0-alpha.
|
|
3
|
+
"version": "0.41.0-alpha.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"types": "./src/index.d.ts",
|
|
@@ -9,6 +9,16 @@
|
|
|
9
9
|
"types": "./src/index.d.ts",
|
|
10
10
|
"import": "./src/index.js",
|
|
11
11
|
"default": "./src/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./open-element-render": {
|
|
14
|
+
"types": "./src/open-element-render.d.ts",
|
|
15
|
+
"import": "./src/open-element-render.js",
|
|
16
|
+
"default": "./src/open-element-render.js"
|
|
17
|
+
},
|
|
18
|
+
"./open-element-hydration": {
|
|
19
|
+
"types": "./src/open-element-hydration.d.ts",
|
|
20
|
+
"import": "./src/open-element-hydration.js",
|
|
21
|
+
"default": "./src/open-element-hydration.js"
|
|
12
22
|
}
|
|
13
23
|
},
|
|
14
24
|
"repository": {
|
|
@@ -23,8 +33,8 @@
|
|
|
23
33
|
"deno"
|
|
24
34
|
],
|
|
25
35
|
"dependencies": {
|
|
26
|
-
"@openelement/protocol": "^0.41.0-alpha.
|
|
27
|
-
"@openelement/core": "^0.41.0-alpha.
|
|
28
|
-
"@openelement/signal": "^0.41.0-alpha.
|
|
36
|
+
"@openelement/protocol": "^0.41.0-alpha.3",
|
|
37
|
+
"@openelement/core": "^0.41.0-alpha.3",
|
|
38
|
+
"@openelement/signal": "^0.41.0-alpha.3"
|
|
29
39
|
}
|
|
30
40
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal hydration helpers for OpenElement.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from open-element.ts to isolate DSD signal/event hydration logic
|
|
5
|
+
* from the base class lifecycle. Exposed as a package subpath so Deno can emit
|
|
6
|
+
* its types, but this is an internal implementation detail — consumers should
|
|
7
|
+
* use OpenElement instead.
|
|
8
|
+
*
|
|
9
|
+
* v0.41.0-alpha.2: The active hydration state now lives in a
|
|
10
|
+
* `@openelement/core/hydrate` HydrationScope. This module keeps thin adapter
|
|
11
|
+
* functions that forward to the scope so the OpenElement base class does not
|
|
12
|
+
* need to reach into HydrationScope internals directly.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
* @module @openelement/element/open-element-hydration
|
|
16
|
+
*/ import type { HydrationScope } from '@openelement/core/hydrate';
|
|
17
|
+
import type { OpenElementLike } from "./open-element-render.js";
|
|
18
|
+
/**
|
|
19
|
+
* Hydrate DSD DOM with signal and event bindings.
|
|
20
|
+
*
|
|
21
|
+
* v0.28 (ADR-0067): Disposes previous effects and events, then delegates to
|
|
22
|
+
* hydrateSignals().
|
|
23
|
+
*/ export declare function hydrateExistingDom(instance: OpenElementLike, scope: HydrationScope): void;
|
|
@@ -2,119 +2,34 @@
|
|
|
2
2
|
* Internal hydration helpers for OpenElement.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from open-element.ts to isolate DSD signal/event hydration logic
|
|
5
|
-
* from the base class lifecycle.
|
|
6
|
-
*
|
|
5
|
+
* from the base class lifecycle. Exposed as a package subpath so Deno can emit
|
|
6
|
+
* its types, but this is an internal implementation detail — consumers should
|
|
7
|
+
* use OpenElement instead.
|
|
8
|
+
*
|
|
9
|
+
* v0.41.0-alpha.2: The active hydration state now lives in a
|
|
10
|
+
* `@openelement/core/hydrate` HydrationScope. This module keeps thin adapter
|
|
11
|
+
* functions that forward to the scope so the OpenElement base class does not
|
|
12
|
+
* need to reach into HydrationScope internals directly.
|
|
7
13
|
*
|
|
8
14
|
* @internal
|
|
9
15
|
* @module @openelement/element/open-element-hydration
|
|
10
|
-
*/
|
|
11
|
-
import { DATA_SIGNAL, DATA_SIGNAL_ATTR, DATA_SIGNAL_CLASS, DATA_SIGNAL_RENDER, parseSignalAttrSpec } from '@openelement/protocol/hydration-markers';
|
|
12
|
-
import { disposeRenderBindings } from './open-element-render.js';
|
|
13
|
-
/**
|
|
16
|
+
*/ /**
|
|
14
17
|
* v0.28 (ADR-0067): Signal-native hydration.
|
|
15
18
|
*
|
|
16
|
-
*
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
* listeners are added to `eventCleanups`.
|
|
22
|
-
*/ function collectHydrationBindings(shadowRoot, signalRegistry) {
|
|
23
|
-
const descriptors = [];
|
|
24
|
-
// --- Signal → text / class / attribute bindings: data-signal="signalName" ---
|
|
25
|
-
for (const el of shadowRoot.querySelectorAll(`[${DATA_SIGNAL}]`)){
|
|
26
|
-
const name = el.getAttribute(DATA_SIGNAL);
|
|
27
|
-
if (!name) continue;
|
|
28
|
-
const sig = signalRegistry.get(name);
|
|
29
|
-
if (!sig) continue;
|
|
30
|
-
const hasClass = el.hasAttribute(DATA_SIGNAL_CLASS);
|
|
31
|
-
const hasAttr = el.hasAttribute(DATA_SIGNAL_ATTR);
|
|
32
|
-
if (hasClass) {
|
|
33
|
-
const className = el.getAttribute(DATA_SIGNAL_CLASS);
|
|
34
|
-
if (className) {
|
|
35
|
-
descriptors.push({
|
|
36
|
-
kind: 'signal-class',
|
|
37
|
-
el,
|
|
38
|
-
className,
|
|
39
|
-
signal: sig
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (hasAttr) {
|
|
44
|
-
const attrSpec = el.getAttribute(DATA_SIGNAL_ATTR);
|
|
45
|
-
if (attrSpec) {
|
|
46
|
-
const attrNames = parseSignalAttrSpec(attrSpec);
|
|
47
|
-
if (attrNames.length > 0) {
|
|
48
|
-
descriptors.push({
|
|
49
|
-
kind: 'signal-attr',
|
|
50
|
-
el,
|
|
51
|
-
attrNames,
|
|
52
|
-
signal: sig
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (!hasClass && !hasAttr) {
|
|
58
|
-
descriptors.push({
|
|
59
|
-
kind: 'signal-text',
|
|
60
|
-
el,
|
|
61
|
-
signal: sig
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// --- Signal → VNode rendering: data-signal-render="signalName" (v0.30.1 / ADR-0081) ---
|
|
66
|
-
for (const el of shadowRoot.querySelectorAll(`[${DATA_SIGNAL_RENDER}]`)){
|
|
67
|
-
const name = el.getAttribute(DATA_SIGNAL_RENDER);
|
|
68
|
-
if (!name) continue;
|
|
69
|
-
const sig = signalRegistry.get(name);
|
|
70
|
-
if (!sig) continue;
|
|
71
|
-
descriptors.push({
|
|
72
|
-
kind: 'signal-render',
|
|
73
|
-
el,
|
|
74
|
-
signal: sig,
|
|
75
|
-
lifecycle: {}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
return descriptors;
|
|
79
|
-
}
|
|
80
|
-
export function hydrateSignals(instance, shadowRoot, signalRegistry, effectDisposers, eventCleanups, cache) {
|
|
81
|
-
const lifecycle = {
|
|
82
|
-
disposers: effectDisposers
|
|
83
|
-
};
|
|
84
|
-
const descriptors = collectHydrationBindings(shadowRoot, signalRegistry);
|
|
85
|
-
for (const desc of descriptors){
|
|
86
|
-
if (desc.kind === 'signal-render') {
|
|
87
|
-
desc.lifecycle = lifecycle;
|
|
88
|
-
// Preserve the original DSD hydration contract: replace any SSR content
|
|
89
|
-
// with the client-rendered VNode tree on first activation.
|
|
90
|
-
while(desc.el.firstChild)desc.el.removeChild(desc.el.firstChild);
|
|
91
|
-
}
|
|
92
|
-
applyBindingDescriptor(desc, lifecycle);
|
|
93
|
-
}
|
|
94
|
-
// v0.28.1: Cache VNode so SSR and hydration use the same event IDs.
|
|
95
|
-
// render() may have been called at build time for SSR — reuse cached VNode
|
|
96
|
-
// if available, otherwise call render() once and cache for hydration.
|
|
97
|
-
if (!cache.get().valid) {
|
|
98
|
-
cache.set(instance.render());
|
|
99
|
-
}
|
|
100
|
-
const vnode = cache.get().vnode;
|
|
101
|
-
if (isVNode(vnode)) {
|
|
102
|
-
hydrateEventMarkers(shadowRoot, collectEventBindings(vnode), eventCleanups, instance);
|
|
103
|
-
}
|
|
104
|
-
// Chromium DSD layout fix: force reflow without DOM rebuild
|
|
105
|
-
requestAnimationFrame(()=>{
|
|
106
|
-
void instance.offsetHeight;
|
|
107
|
-
});
|
|
19
|
+
* Delegates to the HydrationScope that owns this element's lifecycle state.
|
|
20
|
+
*/ function hydrateSignals(instance, shadowRoot, scope) {
|
|
21
|
+
// Ensure the cache holds the current VNode before event-marker hydration.
|
|
22
|
+
scope.setCachedVNode(instance.render());
|
|
23
|
+
scope.hydrate(shadowRoot);
|
|
108
24
|
}
|
|
109
25
|
/**
|
|
110
26
|
* Hydrate DSD DOM with signal and event bindings.
|
|
111
27
|
*
|
|
112
28
|
* v0.28 (ADR-0067): Disposes previous effects and events, then delegates to
|
|
113
29
|
* hydrateSignals().
|
|
114
|
-
*/ export function hydrateExistingDom(instance,
|
|
115
|
-
if (!instance.shadowRoot) return
|
|
116
|
-
|
|
117
|
-
hydrateSignals(instance, instance.shadowRoot,
|
|
118
|
-
return newEventCleanups;
|
|
30
|
+
*/ export function hydrateExistingDom(instance, scope) {
|
|
31
|
+
if (!instance.shadowRoot) return;
|
|
32
|
+
scope.reset();
|
|
33
|
+
hydrateSignals(instance, instance.shadowRoot, scope);
|
|
119
34
|
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQtaHlkcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJuYWwgaHlkcmF0aW9uIGhlbHBlcnMgZm9yIE9wZW5FbGVtZW50LlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIG9wZW4tZWxlbWVudC50cyB0byBpc29sYXRlIERTRCBzaWduYWwvZXZlbnQgaHlkcmF0aW9uIGxvZ2ljXG4gKiBmcm9tIHRoZSBiYXNlIGNsYXNzIGxpZmVjeWNsZS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBOT1QgcGFydCBvZiB0aGUgcHVibGljXG4gKiBwYWNrYWdlIHN1cmZhY2UgYW5kIHNob3VsZCBvbmx5IGJlIGNvbnN1bWVkIGJ5IE9wZW5FbGVtZW50IGl0c2VsZi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBtb2R1bGUgQG9wZW5lbGVtZW50L2VsZW1lbnQvb3Blbi1lbGVtZW50LWh5ZHJhdGlvblxuICovXG5cbmltcG9ydCB7XG4gIGFwcGx5QmluZGluZ0Rlc2NyaXB0b3IsXG4gIGNvbGxlY3RFdmVudEJpbmRpbmdzLFxuICBoeWRyYXRlRXZlbnRNYXJrZXJzLFxuICBpc1ZOb2RlLFxufSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdEZXNjcmlwdG9yLCBCaW5kaW5nTGlmZWN5Y2xlIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBTaWduYWwgfSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvc2lnbmFsJztcbmltcG9ydCB7XG4gIERBVEFfU0lHTkFMLFxuICBEQVRBX1NJR05BTF9BVFRSLFxuICBEQVRBX1NJR05BTF9DTEFTUyxcbiAgREFUQV9TSUdOQUxfUkVOREVSLFxuICBwYXJzZVNpZ25hbEF0dHJTcGVjLFxufSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvaHlkcmF0aW9uLW1hcmtlcnMnO1xuaW1wb3J0IHsgZGlzcG9zZVJlbmRlckJpbmRpbmdzLCB0eXBlIFZOb2RlQ2FjaGVBY2Nlc3MgfSBmcm9tICcuL29wZW4tZWxlbWVudC1yZW5kZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBPcGVuRWxlbWVudCB9IGZyb20gJy4vb3Blbi1lbGVtZW50LmpzJztcblxuLyoqXG4gKiB2MC4yOCAoQURSLTAwNjcpOiBTaWduYWwtbmF0aXZlIGh5ZHJhdGlvbi5cbiAqXG4gKiBSZWFkcyBkYXRhLXNpZ25hbCBtYXJrZXJzIGZyb20gdGhlIERTRCBzaGFkb3cgcm9vdCBhbmQgY3JlYXRlcyBkaXJlY3RcbiAqIHNpZ25hbOKGkkRPTSBlZmZlY3QgYmluZGluZ3MuIE5vIHBvc2l0aW9uIG1hdGNoaW5nLCBubyBjaGlsZE5vZGVzIGZpbHRlcmluZyxcbiAqIG5vIFZOb2RlIHRyYXZlcnNhbC5cbiAqXG4gKiBFZmZlY3RzIGFyZSBhZGRlZCB0byBgZWZmZWN0RGlzcG9zZXJzYCBmb3IgYmF0Y2ggY2xlYW51cC4gVk5vZGUgZXZlbnQgbWFya2VyXG4gKiBsaXN0ZW5lcnMgYXJlIGFkZGVkIHRvIGBldmVudENsZWFudXBzYC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEh5ZHJhdGlvbkJpbmRpbmdzKFxuICBzaGFkb3dSb290OiBTaGFkb3dSb290LFxuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+Pixcbik6IEJpbmRpbmdEZXNjcmlwdG9yW10ge1xuICBjb25zdCBkZXNjcmlwdG9yczogQmluZGluZ0Rlc2NyaXB0b3JbXSA9IFtdO1xuXG4gIC8vIC0tLSBTaWduYWwg4oaSIHRleHQgLyBjbGFzcyAvIGF0dHJpYnV0ZSBiaW5kaW5nczogZGF0YS1zaWduYWw9XCJzaWduYWxOYW1lXCIgLS0tXG4gIGZvciAoY29uc3QgZWwgb2Ygc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtEQVRBX1NJR05BTH1dYCkpIHtcbiAgICBjb25zdCBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKERBVEFfU0lHTkFMKTtcbiAgICBpZiAoIW5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNpZyA9IHNpZ25hbFJlZ2lzdHJ5LmdldChuYW1lKTtcbiAgICBpZiAoIXNpZykgY29udGludWU7XG5cbiAgICBjb25zdCBoYXNDbGFzcyA9IGVsLmhhc0F0dHJpYnV0ZShEQVRBX1NJR05BTF9DTEFTUyk7XG4gICAgY29uc3QgaGFzQXR0ciA9IGVsLmhhc0F0dHJpYnV0ZShEQVRBX1NJR05BTF9BVFRSKTtcblxuICAgIGlmIChoYXNDbGFzcykge1xuICAgICAgY29uc3QgY2xhc3NOYW1lID0gZWwuZ2V0QXR0cmlidXRlKERBVEFfU0lHTkFMX0NMQVNTKTtcbiAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgZGVzY3JpcHRvcnMucHVzaCh7XG4gICAgICAgICAga2luZDogJ3NpZ25hbC1jbGFzcycsXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHNpZ25hbDogc2lnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQXR0cikge1xuICAgICAgY29uc3QgYXR0clNwZWMgPSBlbC5nZXRBdHRyaWJ1dGUoREFUQV9TSUdOQUxfQVRUUik7XG4gICAgICBpZiAoYXR0clNwZWMpIHtcbiAgICAgICAgY29uc3QgYXR0ck5hbWVzID0gcGFyc2VTaWduYWxBdHRyU3BlYyhhdHRyU3BlYyk7XG4gICAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlc2NyaXB0b3JzLnB1c2goe1xuICAgICAgICAgICAga2luZDogJ3NpZ25hbC1hdHRyJyxcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgYXR0ck5hbWVzLFxuICAgICAgICAgICAgc2lnbmFsOiBzaWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0NsYXNzICYmICFoYXNBdHRyKSB7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHtcbiAgICAgICAga2luZDogJ3NpZ25hbC10ZXh0JyxcbiAgICAgICAgZWwsXG4gICAgICAgIHNpZ25hbDogc2lnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIFNpZ25hbCDihpIgVk5vZGUgcmVuZGVyaW5nOiBkYXRhLXNpZ25hbC1yZW5kZXI9XCJzaWduYWxOYW1lXCIgKHYwLjMwLjEgLyBBRFItMDA4MSkgLS0tXG4gIGZvciAoY29uc3QgZWwgb2Ygc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtEQVRBX1NJR05BTF9SRU5ERVJ9XWApKSB7XG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShEQVRBX1NJR05BTF9SRU5ERVIpO1xuICAgIGlmICghbmFtZSkgY29udGludWU7XG4gICAgY29uc3Qgc2lnID0gc2lnbmFsUmVnaXN0cnkuZ2V0KG5hbWUpO1xuICAgIGlmICghc2lnKSBjb250aW51ZTtcblxuICAgIGRlc2NyaXB0b3JzLnB1c2goe1xuICAgICAga2luZDogJ3NpZ25hbC1yZW5kZXInLFxuICAgICAgZWwsXG4gICAgICBzaWduYWw6IHNpZyxcbiAgICAgIGxpZmVjeWNsZToge30sIC8vIEZpbGxlZCBieSBoeWRyYXRlU2lnbmFscyBiZWZvcmUgYXBwbGljYXRpb24uXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGVzY3JpcHRvcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlU2lnbmFscyhcbiAgaW5zdGFuY2U6IE9wZW5FbGVtZW50LFxuICBzaGFkb3dSb290OiBTaGFkb3dSb290LFxuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PixcbiAgZWZmZWN0RGlzcG9zZXJzOiBTZXQ8KCkgPT4gdm9pZD4sXG4gIGV2ZW50Q2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+LFxuICBjYWNoZTogVk5vZGVDYWNoZUFjY2Vzcyxcbik6IHZvaWQge1xuICBjb25zdCBsaWZlY3ljbGU6IEJpbmRpbmdMaWZlY3ljbGUgPSB7IGRpc3Bvc2VyczogZWZmZWN0RGlzcG9zZXJzIH07XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gY29sbGVjdEh5ZHJhdGlvbkJpbmRpbmdzKHNoYWRvd1Jvb3QsIHNpZ25hbFJlZ2lzdHJ5KTtcblxuICBmb3IgKGNvbnN0IGRlc2Mgb2YgZGVzY3JpcHRvcnMpIHtcbiAgICBpZiAoZGVzYy5raW5kID09PSAnc2lnbmFsLXJlbmRlcicpIHtcbiAgICAgIGRlc2MubGlmZWN5Y2xlID0gbGlmZWN5Y2xlO1xuICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIERTRCBoeWRyYXRpb24gY29udHJhY3Q6IHJlcGxhY2UgYW55IFNTUiBjb250ZW50XG4gICAgICAvLyB3aXRoIHRoZSBjbGllbnQtcmVuZGVyZWQgVk5vZGUgdHJlZSBvbiBmaXJzdCBhY3RpdmF0aW9uLlxuICAgICAgd2hpbGUgKGRlc2MuZWwuZmlyc3RDaGlsZCkgZGVzYy5lbC5yZW1vdmVDaGlsZChkZXNjLmVsLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBhcHBseUJpbmRpbmdEZXNjcmlwdG9yKGRlc2MsIGxpZmVjeWNsZSk7XG4gIH1cblxuICAvLyB2MC4yOC4xOiBDYWNoZSBWTm9kZSBzbyBTU1IgYW5kIGh5ZHJhdGlvbiB1c2UgdGhlIHNhbWUgZXZlbnQgSURzLlxuICAvLyByZW5kZXIoKSBtYXkgaGF2ZSBiZWVuIGNhbGxlZCBhdCBidWlsZCB0aW1lIGZvciBTU1Ig4oCUIHJldXNlIGNhY2hlZCBWTm9kZVxuICAvLyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBjYWxsIHJlbmRlcigpIG9uY2UgYW5kIGNhY2hlIGZvciBoeWRyYXRpb24uXG4gIGlmICghY2FjaGUuZ2V0KCkudmFsaWQpIHtcbiAgICBjYWNoZS5zZXQoaW5zdGFuY2UucmVuZGVyKCkpO1xuICB9XG4gIGNvbnN0IHZub2RlID0gY2FjaGUuZ2V0KCkudm5vZGU7XG4gIGlmIChpc1ZOb2RlKHZub2RlKSkge1xuICAgIGh5ZHJhdGVFdmVudE1hcmtlcnMoc2hhZG93Um9vdCwgY29sbGVjdEV2ZW50QmluZGluZ3Modm5vZGUpLCBldmVudENsZWFudXBzLCBpbnN0YW5jZSk7XG4gIH1cblxuICAvLyBDaHJvbWl1bSBEU0QgbGF5b3V0IGZpeDogZm9yY2UgcmVmbG93IHdpdGhvdXQgRE9NIHJlYnVpbGRcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICB2b2lkIChpbnN0YW5jZSBhcyBIVE1MRWxlbWVudCkub2Zmc2V0SGVpZ2h0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIERTRCBET00gd2l0aCBzaWduYWwgYW5kIGV2ZW50IGJpbmRpbmdzLlxuICpcbiAqIHYwLjI4IChBRFItMDA2Nyk6IERpc3Bvc2VzIHByZXZpb3VzIGVmZmVjdHMgYW5kIGV2ZW50cywgdGhlbiBkZWxlZ2F0ZXMgdG9cbiAqIGh5ZHJhdGVTaWduYWxzKCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlRXhpc3RpbmdEb20oXG4gIGluc3RhbmNlOiBPcGVuRWxlbWVudCxcbiAgc2lnbmFsUmVnaXN0cnk6IE1hcDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4sXG4gIGVmZmVjdERpc3Bvc2VyczogU2V0PCgpID0+IHZvaWQ+LFxuICBldmVudENsZWFudXBzOiBBcnJheTwoKSA9PiB2b2lkPixcbiAgY2FjaGU6IFZOb2RlQ2FjaGVBY2Nlc3MsXG4pOiBBcnJheTwoKSA9PiB2b2lkPiB7XG4gIGlmICghaW5zdGFuY2Uuc2hhZG93Um9vdCkgcmV0dXJuIGV2ZW50Q2xlYW51cHM7XG5cbiAgY29uc3QgbmV3RXZlbnRDbGVhbnVwcyA9IGRpc3Bvc2VSZW5kZXJCaW5kaW5ncyhlZmZlY3REaXNwb3NlcnMsIGV2ZW50Q2xlYW51cHMpO1xuICBoeWRyYXRlU2lnbmFscyhcbiAgICBpbnN0YW5jZSxcbiAgICBpbnN0YW5jZS5zaGFkb3dSb290LFxuICAgIHNpZ25hbFJlZ2lzdHJ5LFxuICAgIGVmZmVjdERpc3Bvc2VycyxcbiAgICBuZXdFdmVudENsZWFudXBzLFxuICAgIGNhY2hlLFxuICApO1xuXG4gIHJldHVybiBuZXdFdmVudENsZWFudXBzO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Q0FTQyxHQUVELFNBQ0Usc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsT0FBTyxRQUNGLG9CQUFvQjtBQUczQixTQUNFLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixtQkFBbUIsUUFDZCwwQ0FBMEM7QUFDakQsU0FBUyxxQkFBcUIsUUFBK0IsMkJBQTJCO0FBR3hGOzs7Ozs7Ozs7Q0FTQyxHQUNELFNBQVMseUJBQ1AsVUFBc0IsRUFDdEIsY0FBNEM7RUFFNUMsTUFBTSxjQUFtQyxFQUFFO0VBRTNDLCtFQUErRTtFQUMvRSxLQUFLLE1BQU0sTUFBTSxXQUFXLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUc7SUFDaEUsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNO0lBQ1gsTUFBTSxNQUFNLGVBQWUsR0FBRyxDQUFDO0lBQy9CLElBQUksQ0FBQyxLQUFLO0lBRVYsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztJQUVoQyxJQUFJLFVBQVU7TUFDWixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7TUFDbEMsSUFBSSxXQUFXO1FBQ2IsWUFBWSxJQUFJLENBQUM7VUFDZixNQUFNO1VBQ047VUFDQTtVQUNBLFFBQVE7UUFDVjtNQUNGO0lBQ0Y7SUFFQSxJQUFJLFNBQVM7TUFDWCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7TUFDakMsSUFBSSxVQUFVO1FBQ1osTUFBTSxZQUFZLG9CQUFvQjtRQUN0QyxJQUFJLFVBQVUsTUFBTSxHQUFHLEdBQUc7VUFDeEIsWUFBWSxJQUFJLENBQUM7WUFDZixNQUFNO1lBQ047WUFDQTtZQUNBLFFBQVE7VUFDVjtRQUNGO01BQ0Y7SUFDRjtJQUVBLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztNQUN6QixZQUFZLElBQUksQ0FBQztRQUNmLE1BQU07UUFDTjtRQUNBLFFBQVE7TUFDVjtJQUNGO0VBQ0Y7RUFFQSx5RkFBeUY7RUFDekYsS0FBSyxNQUFNLE1BQU0sV0FBVyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEVBQUc7SUFDdkUsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNO0lBQ1gsTUFBTSxNQUFNLGVBQWUsR0FBRyxDQUFDO0lBQy9CLElBQUksQ0FBQyxLQUFLO0lBRVYsWUFBWSxJQUFJLENBQUM7TUFDZixNQUFNO01BQ047TUFDQSxRQUFRO01BQ1IsV0FBVyxDQUFDO0lBQ2Q7RUFDRjtFQUVBLE9BQU87QUFDVDtBQUVBLE9BQU8sU0FBUyxlQUNkLFFBQXFCLEVBQ3JCLFVBQXNCLEVBQ3RCLGNBQTRDLEVBQzVDLGVBQWdDLEVBQ2hDLGFBQWdDLEVBQ2hDLEtBQXVCO0VBRXZCLE1BQU0sWUFBOEI7SUFBRSxXQUFXO0VBQWdCO0VBQ2pFLE1BQU0sY0FBYyx5QkFBeUIsWUFBWTtFQUV6RCxLQUFLLE1BQU0sUUFBUSxZQUFhO0lBQzlCLElBQUksS0FBSyxJQUFJLEtBQUssaUJBQWlCO01BQ2pDLEtBQUssU0FBUyxHQUFHO01BQ2pCLHdFQUF3RTtNQUN4RSwyREFBMkQ7TUFDM0QsTUFBTyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUUsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVU7SUFDbkU7SUFDQSx1QkFBdUIsTUFBTTtFQUMvQjtFQUVBLG9FQUFvRTtFQUNwRSwyRUFBMkU7RUFDM0Usc0VBQXNFO0VBQ3RFLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUU7SUFDdEIsTUFBTSxHQUFHLENBQUMsU0FBUyxNQUFNO0VBQzNCO0VBQ0EsTUFBTSxRQUFRLE1BQU0sR0FBRyxHQUFHLEtBQUs7RUFDL0IsSUFBSSxRQUFRLFFBQVE7SUFDbEIsb0JBQW9CLFlBQVkscUJBQXFCLFFBQVEsZUFBZTtFQUM5RTtFQUVBLDREQUE0RDtFQUM1RCxzQkFBc0I7SUFDcEIsS0FBSyxBQUFDLFNBQXlCLFlBQVk7RUFDN0M7QUFDRjtBQUVBOzs7OztDQUtDLEdBQ0QsT0FBTyxTQUFTLG1CQUNkLFFBQXFCLEVBQ3JCLGNBQTRDLEVBQzVDLGVBQWdDLEVBQ2hDLGFBQWdDLEVBQ2hDLEtBQXVCO0VBRXZCLElBQUksQ0FBQyxTQUFTLFVBQVUsRUFBRSxPQUFPO0VBRWpDLE1BQU0sbUJBQW1CLHNCQUFzQixpQkFBaUI7RUFDaEUsZUFDRSxVQUNBLFNBQVMsVUFBVSxFQUNuQixnQkFDQSxpQkFDQSxrQkFDQTtFQUdGLE9BQU87QUFDVCJ9
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQtaHlkcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJuYWwgaHlkcmF0aW9uIGhlbHBlcnMgZm9yIE9wZW5FbGVtZW50LlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIG9wZW4tZWxlbWVudC50cyB0byBpc29sYXRlIERTRCBzaWduYWwvZXZlbnQgaHlkcmF0aW9uIGxvZ2ljXG4gKiBmcm9tIHRoZSBiYXNlIGNsYXNzIGxpZmVjeWNsZS4gRXhwb3NlZCBhcyBhIHBhY2thZ2Ugc3VicGF0aCBzbyBEZW5vIGNhbiBlbWl0XG4gKiBpdHMgdHlwZXMsIGJ1dCB0aGlzIGlzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCDigJQgY29uc3VtZXJzIHNob3VsZFxuICogdXNlIE9wZW5FbGVtZW50IGluc3RlYWQuXG4gKlxuICogdjAuNDEuMC1hbHBoYS4yOiBUaGUgYWN0aXZlIGh5ZHJhdGlvbiBzdGF0ZSBub3cgbGl2ZXMgaW4gYVxuICogYEBvcGVuZWxlbWVudC9jb3JlL2h5ZHJhdGVgIEh5ZHJhdGlvblNjb3BlLiBUaGlzIG1vZHVsZSBrZWVwcyB0aGluIGFkYXB0ZXJcbiAqIGZ1bmN0aW9ucyB0aGF0IGZvcndhcmQgdG8gdGhlIHNjb3BlIHNvIHRoZSBPcGVuRWxlbWVudCBiYXNlIGNsYXNzIGRvZXMgbm90XG4gKiBuZWVkIHRvIHJlYWNoIGludG8gSHlkcmF0aW9uU2NvcGUgaW50ZXJuYWxzIGRpcmVjdGx5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQG1vZHVsZSBAb3BlbmVsZW1lbnQvZWxlbWVudC9vcGVuLWVsZW1lbnQtaHlkcmF0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBIeWRyYXRpb25TY29wZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2h5ZHJhdGUnO1xuaW1wb3J0IHR5cGUgeyBPcGVuRWxlbWVudExpa2UgfSBmcm9tICcuL29wZW4tZWxlbWVudC1yZW5kZXIuanMnO1xuXG4vKipcbiAqIHYwLjI4IChBRFItMDA2Nyk6IFNpZ25hbC1uYXRpdmUgaHlkcmF0aW9uLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgSHlkcmF0aW9uU2NvcGUgdGhhdCBvd25zIHRoaXMgZWxlbWVudCdzIGxpZmVjeWNsZSBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZVNpZ25hbHMoXG4gIGluc3RhbmNlOiBPcGVuRWxlbWVudExpa2UsXG4gIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QsXG4gIHNjb3BlOiBIeWRyYXRpb25TY29wZSxcbik6IHZvaWQge1xuICAvLyBFbnN1cmUgdGhlIGNhY2hlIGhvbGRzIHRoZSBjdXJyZW50IFZOb2RlIGJlZm9yZSBldmVudC1tYXJrZXIgaHlkcmF0aW9uLlxuICBzY29wZS5zZXRDYWNoZWRWTm9kZShpbnN0YW5jZS5yZW5kZXIoKSk7XG4gIHNjb3BlLmh5ZHJhdGUoc2hhZG93Um9vdCk7XG59XG5cbi8qKlxuICogSHlkcmF0ZSBEU0QgRE9NIHdpdGggc2lnbmFsIGFuZCBldmVudCBiaW5kaW5ncy5cbiAqXG4gKiB2MC4yOCAoQURSLTAwNjcpOiBEaXNwb3NlcyBwcmV2aW91cyBlZmZlY3RzIGFuZCBldmVudHMsIHRoZW4gZGVsZWdhdGVzIHRvXG4gKiBoeWRyYXRlU2lnbmFscygpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZUV4aXN0aW5nRG9tKFxuICBpbnN0YW5jZTogT3BlbkVsZW1lbnRMaWtlLFxuICBzY29wZTogSHlkcmF0aW9uU2NvcGUsXG4pOiB2b2lkIHtcbiAgaWYgKCFpbnN0YW5jZS5zaGFkb3dSb290KSByZXR1cm47XG5cbiAgc2NvcGUucmVzZXQoKTtcbiAgaHlkcmF0ZVNpZ25hbHMoaW5zdGFuY2UsIGluc3RhbmNlLnNoYWRvd1Jvb3QsIHNjb3BlKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FLRDs7OztDQUlDLEdBQ0QsU0FBUyxlQUNQLFFBQXlCLEVBQ3pCLFVBQXNCLEVBQ3RCLEtBQXFCO0VBRXJCLDBFQUEwRTtFQUMxRSxNQUFNLGNBQWMsQ0FBQyxTQUFTLE1BQU07RUFDcEMsTUFBTSxPQUFPLENBQUM7QUFDaEI7QUFFQTs7Ozs7Q0FLQyxHQUNELE9BQU8sU0FBUyxtQkFDZCxRQUF5QixFQUN6QixLQUFxQjtFQUVyQixJQUFJLENBQUMsU0FBUyxVQUFVLEVBQUU7RUFFMUIsTUFBTSxLQUFLO0VBQ1gsZUFBZSxVQUFVLFNBQVMsVUFBVSxFQUFFO0FBQ2hEIn0=
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal rendering helpers for OpenElement.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from open-element.ts to keep the base class focused on its
|
|
5
|
+
* public lifecycle API. Exposed as a package subpath so Deno can emit its
|
|
6
|
+
* types, but this is an internal implementation detail — consumers should
|
|
7
|
+
* use OpenElement instead.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
* @module @openelement/element/open-element-render
|
|
11
|
+
*/ import type { VNode } from '@openelement/protocol/vnode';
|
|
12
|
+
import type { Signal } from '@openelement/protocol/signal';
|
|
13
|
+
import type { HydrationScope } from '@openelement/core/hydrate';
|
|
14
|
+
/**
|
|
15
|
+
* Minimal structural stand-in for OpenElement instances.
|
|
16
|
+
*
|
|
17
|
+
* Avoids importing the real OpenElement class, which creates a circular
|
|
18
|
+
* dependency that confuses Deno's npm type-generation. Only the members
|
|
19
|
+
* actually used by the render helpers are declared.
|
|
20
|
+
*/ export interface OpenElementLike {
|
|
21
|
+
render(): unknown;
|
|
22
|
+
shadowRoot: ShadowRoot | null;
|
|
23
|
+
createRenderRoot(): void;
|
|
24
|
+
signalRegistry: Map<string, Signal<unknown>>;
|
|
25
|
+
tagName: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* CSR render path for light-DOM components.
|
|
29
|
+
*
|
|
30
|
+
* Clears previous bindings, calls render(), caches the result, and mounts the
|
|
31
|
+
* produced DOM into the element itself.
|
|
32
|
+
*/ export declare function renderIntoLightDom(instance: OpenElementLike, scope: HydrationScope): void;
|
|
33
|
+
/**
|
|
34
|
+
* CSR render path for shadow-DOM components.
|
|
35
|
+
*
|
|
36
|
+
* Clears previous bindings, calls render(), caches the result, and mounts the
|
|
37
|
+
* produced DOM into the shadow root.
|
|
38
|
+
*/ export declare function renderIntoShadowRoot(instance: OpenElementLike, scope: HydrationScope): void;
|
|
39
|
+
/**
|
|
40
|
+
* Render a fallback VNode when the unified client render/hydrate path throws.
|
|
41
|
+
*
|
|
42
|
+
* Ensures the render root exists, invokes onRenderError(), disposes any
|
|
43
|
+
* previous bindings, and mounts the fallback content.
|
|
44
|
+
*/ export declare function renderErrorFallback(instance: OpenElementLike, error: unknown, scope: HydrationScope, onRenderError: (error: unknown) => VNode | null): void;
|
|
@@ -2,76 +2,66 @@
|
|
|
2
2
|
* Internal rendering helpers for OpenElement.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from open-element.ts to keep the base class focused on its
|
|
5
|
-
* public lifecycle API.
|
|
6
|
-
*
|
|
5
|
+
* public lifecycle API. Exposed as a package subpath so Deno can emit its
|
|
6
|
+
* types, but this is an internal implementation detail — consumers should
|
|
7
|
+
* use OpenElement instead.
|
|
7
8
|
*
|
|
8
9
|
* @internal
|
|
9
10
|
* @module @openelement/element/open-element-render
|
|
10
11
|
*/ import { renderToDom } from '@openelement/core';
|
|
11
12
|
import { formatError } from '@openelement/core/errors';
|
|
12
13
|
import { createLogger } from '@openelement/core/logger';
|
|
13
|
-
/**
|
|
14
|
-
* Dispose all reactive effects and declarative event listeners created by
|
|
15
|
-
* previous renders or hydration passes.
|
|
16
|
-
*
|
|
17
|
-
* Returns a fresh, empty event-cleanup array so callers can replace their
|
|
18
|
-
* existing bag and avoid retaining stale closures.
|
|
19
|
-
*/ export function disposeRenderBindings(effectDisposers, eventCleanups) {
|
|
20
|
-
for (const d of effectDisposers)d();
|
|
21
|
-
effectDisposers.clear();
|
|
22
|
-
for (const f of eventCleanups)f();
|
|
23
|
-
return [];
|
|
24
|
-
}
|
|
25
14
|
/**
|
|
26
15
|
* CSR render path for light-DOM components.
|
|
27
16
|
*
|
|
28
17
|
* Clears previous bindings, calls render(), caches the result, and mounts the
|
|
29
18
|
* produced DOM into the element itself.
|
|
30
|
-
*/ export function renderIntoLightDom(instance,
|
|
31
|
-
|
|
19
|
+
*/ export function renderIntoLightDom(instance, scope) {
|
|
20
|
+
scope.reset();
|
|
32
21
|
const result = instance.render();
|
|
33
|
-
|
|
22
|
+
scope.setCachedVNode(result);
|
|
34
23
|
const self = instance;
|
|
35
24
|
while(self.firstChild){
|
|
36
25
|
self.removeChild(self.firstChild);
|
|
37
26
|
}
|
|
38
27
|
if (result != null) {
|
|
39
|
-
|
|
28
|
+
// Event listeners registered during render use the scope's explicit dispose
|
|
29
|
+
// path (HydrationScope.dispose()) rather than AbortSignal — the scope owns
|
|
30
|
+
// the lifecycle for all bindings created during render.
|
|
31
|
+
self.appendChild(renderToDom(result, scope.createLifecycle(), undefined, instance.signalRegistry));
|
|
40
32
|
}
|
|
41
|
-
return newEventCleanups;
|
|
42
33
|
}
|
|
43
34
|
/**
|
|
44
35
|
* CSR render path for shadow-DOM components.
|
|
45
36
|
*
|
|
46
37
|
* Clears previous bindings, calls render(), caches the result, and mounts the
|
|
47
38
|
* produced DOM into the shadow root.
|
|
48
|
-
*/ export function renderIntoShadowRoot(instance,
|
|
39
|
+
*/ export function renderIntoShadowRoot(instance, scope) {
|
|
49
40
|
const root = instance.shadowRoot;
|
|
50
|
-
if (!root) return
|
|
51
|
-
|
|
41
|
+
if (!root) return;
|
|
42
|
+
scope.reset();
|
|
52
43
|
const result = instance.render();
|
|
53
|
-
|
|
44
|
+
scope.setCachedVNode(result);
|
|
45
|
+
while(root.firstChild){
|
|
46
|
+
root.removeChild(root.firstChild);
|
|
47
|
+
}
|
|
54
48
|
if (result != null) {
|
|
55
|
-
|
|
56
|
-
root.removeChild(root.firstChild);
|
|
57
|
-
}
|
|
58
|
-
root.appendChild(renderToDom(result, undefined, effectDisposers, instance.signalRegistry));
|
|
49
|
+
root.appendChild(renderToDom(result, scope.createLifecycle(), undefined, instance.signalRegistry));
|
|
59
50
|
}
|
|
60
|
-
return newEventCleanups;
|
|
61
51
|
}
|
|
62
52
|
/**
|
|
63
|
-
* Render a fallback VNode when the unified render/hydrate path throws.
|
|
53
|
+
* Render a fallback VNode when the unified client render/hydrate path throws.
|
|
64
54
|
*
|
|
65
55
|
* Ensures the render root exists, invokes onRenderError(), disposes any
|
|
66
56
|
* previous bindings, and mounts the fallback content.
|
|
67
|
-
*/ export function renderErrorFallback(instance, error,
|
|
57
|
+
*/ export function renderErrorFallback(instance, error, scope, onRenderError) {
|
|
68
58
|
const ctor = instance.constructor;
|
|
69
59
|
const isLightDom = ctor.renderMode === 'light';
|
|
70
60
|
if (!instance.shadowRoot && !isLightDom) {
|
|
71
61
|
instance.createRenderRoot();
|
|
72
62
|
}
|
|
73
63
|
const target = isLightDom ? instance : instance.shadowRoot;
|
|
74
|
-
if (!target) return
|
|
64
|
+
if (!target) return;
|
|
75
65
|
let fallback;
|
|
76
66
|
try {
|
|
77
67
|
fallback = onRenderError(error);
|
|
@@ -79,13 +69,12 @@ import { createLogger } from '@openelement/core/logger';
|
|
|
79
69
|
createLogger('dsd').error(`<${instance.tagName.toLowerCase()}> onRenderError failed: ${formatError(fallbackError)}`);
|
|
80
70
|
fallback = null;
|
|
81
71
|
}
|
|
82
|
-
|
|
72
|
+
scope.reset();
|
|
83
73
|
if (fallback != null) {
|
|
84
74
|
while(target.firstChild){
|
|
85
75
|
target.removeChild(target.firstChild);
|
|
86
76
|
}
|
|
87
|
-
target.appendChild(renderToDom(fallback,
|
|
77
|
+
target.appendChild(renderToDom(fallback, scope.createLifecycle(), undefined, instance.signalRegistry));
|
|
88
78
|
}
|
|
89
|
-
return newEventCleanups;
|
|
90
79
|
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQtcmVuZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJuYWwgcmVuZGVyaW5nIGhlbHBlcnMgZm9yIE9wZW5FbGVtZW50LlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIG9wZW4tZWxlbWVudC50cyB0byBrZWVwIHRoZSBiYXNlIGNsYXNzIGZvY3VzZWQgb24gaXRzXG4gKiBwdWJsaWMgbGlmZWN5Y2xlIEFQSS4gRXhwb3NlZCBhcyBhIHBhY2thZ2Ugc3VicGF0aCBzbyBEZW5vIGNhbiBlbWl0IGl0c1xuICogdHlwZXMsIGJ1dCB0aGlzIGlzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCDigJQgY29uc3VtZXJzIHNob3VsZFxuICogdXNlIE9wZW5FbGVtZW50IGluc3RlYWQuXG4gKlxuICogQGludGVybmFsXG4gKiBAbW9kdWxlIEBvcGVuZWxlbWVudC9lbGVtZW50L29wZW4tZWxlbWVudC1yZW5kZXJcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZOb2RlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3Zub2RlJztcbmltcG9ydCB0eXBlIHsgU2lnbmFsIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3NpZ25hbCc7XG5pbXBvcnQgeyByZW5kZXJUb0RvbSB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlJztcbmltcG9ydCB7IGZvcm1hdEVycm9yIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IEh5ZHJhdGlvblNjb3BlIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvaHlkcmF0ZSc7XG5cbi8qKlxuICogTWluaW1hbCBzdHJ1Y3R1cmFsIHN0YW5kLWluIGZvciBPcGVuRWxlbWVudCBpbnN0YW5jZXMuXG4gKlxuICogQXZvaWRzIGltcG9ydGluZyB0aGUgcmVhbCBPcGVuRWxlbWVudCBjbGFzcywgd2hpY2ggY3JlYXRlcyBhIGNpcmN1bGFyXG4gKiBkZXBlbmRlbmN5IHRoYXQgY29uZnVzZXMgRGVubydzIG5wbSB0eXBlLWdlbmVyYXRpb24uIE9ubHkgdGhlIG1lbWJlcnNcbiAqIGFjdHVhbGx5IHVzZWQgYnkgdGhlIHJlbmRlciBoZWxwZXJzIGFyZSBkZWNsYXJlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRWxlbWVudExpa2Uge1xuICByZW5kZXIoKTogdW5rbm93bjtcbiAgc2hhZG93Um9vdDogU2hhZG93Um9vdCB8IG51bGw7XG4gIGNyZWF0ZVJlbmRlclJvb3QoKTogdm9pZDtcbiAgc2lnbmFsUmVnaXN0cnk6IE1hcDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj47XG4gIHRhZ05hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE9wZW5FbGVtZW50TGlrZUNvbnN0cnVjdG9yIHtcbiAgcmVuZGVyTW9kZT86ICdzaGFkb3cnIHwgJ2xpZ2h0Jztcbn1cblxuLyoqXG4gKiBDU1IgcmVuZGVyIHBhdGggZm9yIGxpZ2h0LURPTSBjb21wb25lbnRzLlxuICpcbiAqIENsZWFycyBwcmV2aW91cyBiaW5kaW5ncywgY2FsbHMgcmVuZGVyKCksIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgbW91bnRzIHRoZVxuICogcHJvZHVjZWQgRE9NIGludG8gdGhlIGVsZW1lbnQgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySW50b0xpZ2h0RG9tKFxuICBpbnN0YW5jZTogT3BlbkVsZW1lbnRMaWtlLFxuICBzY29wZTogSHlkcmF0aW9uU2NvcGUsXG4pOiB2b2lkIHtcbiAgc2NvcGUucmVzZXQoKTtcblxuICBjb25zdCByZXN1bHQgPSBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgc2NvcGUuc2V0Q2FjaGVkVk5vZGUocmVzdWx0KTtcblxuICBjb25zdCBzZWxmID0gaW5zdGFuY2UgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudDtcbiAgd2hpbGUgKHNlbGYuZmlyc3RDaGlsZCkge1xuICAgIHNlbGYucmVtb3ZlQ2hpbGQoc2VsZi5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgIC8vIEV2ZW50IGxpc3RlbmVycyByZWdpc3RlcmVkIGR1cmluZyByZW5kZXIgdXNlIHRoZSBzY29wZSdzIGV4cGxpY2l0IGRpc3Bvc2VcbiAgICAvLyBwYXRoIChIeWRyYXRpb25TY29wZS5kaXNwb3NlKCkpIHJhdGhlciB0aGFuIEFib3J0U2lnbmFsIOKAlCB0aGUgc2NvcGUgb3duc1xuICAgIC8vIHRoZSBsaWZlY3ljbGUgZm9yIGFsbCBiaW5kaW5ncyBjcmVhdGVkIGR1cmluZyByZW5kZXIuXG4gICAgc2VsZi5hcHBlbmRDaGlsZChcbiAgICAgIHJlbmRlclRvRG9tKFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlLmNyZWF0ZUxpZmVjeWNsZSgpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGluc3RhbmNlLnNpZ25hbFJlZ2lzdHJ5LFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ1NSIHJlbmRlciBwYXRoIGZvciBzaGFkb3ctRE9NIGNvbXBvbmVudHMuXG4gKlxuICogQ2xlYXJzIHByZXZpb3VzIGJpbmRpbmdzLCBjYWxscyByZW5kZXIoKSwgY2FjaGVzIHRoZSByZXN1bHQsIGFuZCBtb3VudHMgdGhlXG4gKiBwcm9kdWNlZCBET00gaW50byB0aGUgc2hhZG93IHJvb3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJbnRvU2hhZG93Um9vdChcbiAgaW5zdGFuY2U6IE9wZW5FbGVtZW50TGlrZSxcbiAgc2NvcGU6IEh5ZHJhdGlvblNjb3BlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHJvb3QgPSBpbnN0YW5jZS5zaGFkb3dSb290O1xuICBpZiAoIXJvb3QpIHJldHVybjtcblxuICBzY29wZS5yZXNldCgpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGluc3RhbmNlLnJlbmRlcigpO1xuICBzY29wZS5zZXRDYWNoZWRWTm9kZShyZXN1bHQpO1xuICB3aGlsZSAocm9vdC5maXJzdENoaWxkKSB7XG4gICAgcm9vdC5yZW1vdmVDaGlsZChyb290LmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgcm9vdC5hcHBlbmRDaGlsZChcbiAgICAgIHJlbmRlclRvRG9tKFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlLmNyZWF0ZUxpZmVjeWNsZSgpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGluc3RhbmNlLnNpZ25hbFJlZ2lzdHJ5LFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVyIGEgZmFsbGJhY2sgVk5vZGUgd2hlbiB0aGUgdW5pZmllZCBjbGllbnQgcmVuZGVyL2h5ZHJhdGUgcGF0aCB0aHJvd3MuXG4gKlxuICogRW5zdXJlcyB0aGUgcmVuZGVyIHJvb3QgZXhpc3RzLCBpbnZva2VzIG9uUmVuZGVyRXJyb3IoKSwgZGlzcG9zZXMgYW55XG4gKiBwcmV2aW91cyBiaW5kaW5ncywgYW5kIG1vdW50cyB0aGUgZmFsbGJhY2sgY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVycm9yRmFsbGJhY2soXG4gIGluc3RhbmNlOiBPcGVuRWxlbWVudExpa2UsXG4gIGVycm9yOiB1bmtub3duLFxuICBzY29wZTogSHlkcmF0aW9uU2NvcGUsXG4gIG9uUmVuZGVyRXJyb3I6IChlcnJvcjogdW5rbm93bikgPT4gVk5vZGUgfCBudWxsLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN0b3IgPSBpbnN0YW5jZS5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIE9wZW5FbGVtZW50TGlrZUNvbnN0cnVjdG9yO1xuICBjb25zdCBpc0xpZ2h0RG9tID0gY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnO1xuXG4gIGlmICghaW5zdGFuY2Uuc2hhZG93Um9vdCAmJiAhaXNMaWdodERvbSkge1xuICAgIGluc3RhbmNlLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldCA9IGlzTGlnaHREb20gPyAoaW5zdGFuY2UgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCkgOiBpbnN0YW5jZS5zaGFkb3dSb290O1xuICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gIGxldCBmYWxsYmFjazogVk5vZGUgfCBudWxsO1xuICB0cnkge1xuICAgIGZhbGxiYWNrID0gb25SZW5kZXJFcnJvcihlcnJvcik7XG4gIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3IpIHtcbiAgICBjcmVhdGVMb2dnZXIoJ2RzZCcpLmVycm9yKFxuICAgICAgYDwke2luc3RhbmNlLnRhZ05hbWUudG9Mb3dlckNhc2UoKX0+IG9uUmVuZGVyRXJyb3IgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGZhbGxiYWNrRXJyb3IpfWAsXG4gICAgKTtcbiAgICBmYWxsYmFjayA9IG51bGw7XG4gIH1cblxuICBzY29wZS5yZXNldCgpO1xuXG4gIGlmIChmYWxsYmFjayAhPSBudWxsKSB7XG4gICAgd2hpbGUgKHRhcmdldC5maXJzdENoaWxkKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQodGFyZ2V0LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoXG4gICAgICByZW5kZXJUb0RvbShcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIHNjb3BlLmNyZWF0ZUxpZmVjeWNsZSgpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGluc3RhbmNlLnNpZ25hbFJlZ2lzdHJ5LFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Q0FVQyxHQUlELFNBQVMsV0FBVyxRQUFRLG9CQUFvQjtBQUNoRCxTQUFTLFdBQVcsUUFBUSwyQkFBMkI7QUFDdkQsU0FBUyxZQUFZLFFBQVEsMkJBQTJCO0FBc0J4RDs7Ozs7Q0FLQyxHQUNELE9BQU8sU0FBUyxtQkFDZCxRQUF5QixFQUN6QixLQUFxQjtFQUVyQixNQUFNLEtBQUs7RUFFWCxNQUFNLFNBQVMsU0FBUyxNQUFNO0VBQzlCLE1BQU0sY0FBYyxDQUFDO0VBRXJCLE1BQU0sT0FBTztFQUNiLE1BQU8sS0FBSyxVQUFVLENBQUU7SUFDdEIsS0FBSyxXQUFXLENBQUMsS0FBSyxVQUFVO0VBQ2xDO0VBRUEsSUFBSSxVQUFVLE1BQU07SUFDbEIsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSx3REFBd0Q7SUFDeEQsS0FBSyxXQUFXLENBQ2QsWUFDRSxRQUNBLE1BQU0sZUFBZSxJQUNyQixXQUNBLFNBQVMsY0FBYztFQUc3QjtBQUNGO0FBRUE7Ozs7O0NBS0MsR0FDRCxPQUFPLFNBQVMscUJBQ2QsUUFBeUIsRUFDekIsS0FBcUI7RUFFckIsTUFBTSxPQUFPLFNBQVMsVUFBVTtFQUNoQyxJQUFJLENBQUMsTUFBTTtFQUVYLE1BQU0sS0FBSztFQUVYLE1BQU0sU0FBUyxTQUFTLE1BQU07RUFDOUIsTUFBTSxjQUFjLENBQUM7RUFDckIsTUFBTyxLQUFLLFVBQVUsQ0FBRTtJQUN0QixLQUFLLFdBQVcsQ0FBQyxLQUFLLFVBQVU7RUFDbEM7RUFFQSxJQUFJLFVBQVUsTUFBTTtJQUNsQixLQUFLLFdBQVcsQ0FDZCxZQUNFLFFBQ0EsTUFBTSxlQUFlLElBQ3JCLFdBQ0EsU0FBUyxjQUFjO0VBRzdCO0FBQ0Y7QUFFQTs7Ozs7Q0FLQyxHQUNELE9BQU8sU0FBUyxvQkFDZCxRQUF5QixFQUN6QixLQUFjLEVBQ2QsS0FBcUIsRUFDckIsYUFBK0M7RUFFL0MsTUFBTSxPQUFPLFNBQVMsV0FBVztFQUNqQyxNQUFNLGFBQWEsS0FBSyxVQUFVLEtBQUs7RUFFdkMsSUFBSSxDQUFDLFNBQVMsVUFBVSxJQUFJLENBQUMsWUFBWTtJQUN2QyxTQUFTLGdCQUFnQjtFQUMzQjtFQUVBLE1BQU0sU0FBUyxhQUFjLFdBQXNDLFNBQVMsVUFBVTtFQUN0RixJQUFJLENBQUMsUUFBUTtFQUViLElBQUk7RUFDSixJQUFJO0lBQ0YsV0FBVyxjQUFjO0VBQzNCLEVBQUUsT0FBTyxlQUFlO0lBQ3RCLGFBQWEsT0FBTyxLQUFLLENBQ3ZCLENBQUMsQ0FBQyxFQUFFLFNBQVMsT0FBTyxDQUFDLFdBQVcsR0FBRyx3QkFBd0IsRUFBRSxZQUFZLGdCQUFnQjtJQUUzRixXQUFXO0VBQ2I7RUFFQSxNQUFNLEtBQUs7RUFFWCxJQUFJLFlBQVksTUFBTTtJQUNwQixNQUFPLE9BQU8sVUFBVSxDQUFFO01BQ3hCLE9BQU8sV0FBVyxDQUFDLE9BQU8sVUFBVTtJQUN0QztJQUNBLE9BQU8sV0FBVyxDQUNoQixZQUNFLFVBQ0EsTUFBTSxlQUFlLElBQ3JCLFdBQ0EsU0FBUyxjQUFjO0VBRzdCO0FBQ0YifQ==
|
package/src/open-element.d.ts
CHANGED
|
@@ -45,6 +45,17 @@ import type { Signal } from '@openelement/protocol/signal';
|
|
|
45
45
|
*
|
|
46
46
|
* Exposed internally for render helper modules.
|
|
47
47
|
*/ signalRegistry: Map<string, Signal<unknown>>;
|
|
48
|
+
constructor();
|
|
49
|
+
/**
|
|
50
|
+
* Returns an AbortSignal that is aborted when the element is disconnected.
|
|
51
|
+
* Useful for tying async work (fetch, event listeners) to element lifecycle.
|
|
52
|
+
*/ protected _lifecycleSignal(): AbortSignal;
|
|
53
|
+
/**
|
|
54
|
+
* setTimeout wrapper that auto-clears when the element disconnects.
|
|
55
|
+
*/ protected _setTimeout(handler: TimerHandler, timeout?: number): number;
|
|
56
|
+
/**
|
|
57
|
+
* requestAnimationFrame wrapper that auto-cancels when the element disconnects.
|
|
58
|
+
*/ protected _requestAnimationFrame(callback: FrameRequestCallback): number;
|
|
48
59
|
/**
|
|
49
60
|
* Register a signal for hydration by name.
|
|
50
61
|
* Call in constructor: this.registerSignal('count', this.#count);
|
|
@@ -79,7 +90,6 @@ import type { Signal } from '@openelement/protocol/signal';
|
|
|
79
90
|
* If formAssociated is true, ElementInternals are attached.
|
|
80
91
|
*/ connectedCallback(): void;
|
|
81
92
|
private _renderOrHydrate: any;
|
|
82
|
-
private _hydrateSignals: any;
|
|
83
93
|
private _hydrateExistingDom: any;
|
|
84
94
|
/**
|
|
85
95
|
* v0.23.0: Hook called after DSD hydration completes.
|
|
@@ -107,7 +117,7 @@ import type { Signal } from '@openelement/protocol/signal';
|
|
|
107
117
|
* Called once after the element is connected, the shadow root
|
|
108
118
|
* is ready, and any DSD hydration or CSR rendering has completed.
|
|
109
119
|
* This is the right place for framework hydration (Preact, React,
|
|
110
|
-
* Vue, Lit) to take over the shadow
|
|
120
|
+
* Vue, Lit) to take over the shadow root.
|
|
111
121
|
*
|
|
112
122
|
* Default implementation is a no-op. Subclasses override this to
|
|
113
123
|
* hydrate or render framework components into the shadow root.
|
package/src/open-element.js
CHANGED
|
@@ -48,8 +48,9 @@
|
|
|
48
48
|
import { disposeStaticProps, handleStaticPropAttributeChange, initializeStaticProps, syncStaticPropsFromAttributes } from '@openelement/core/prop';
|
|
49
49
|
import { signal } from '@openelement/signal';
|
|
50
50
|
import { createLogger } from '@openelement/core/logger';
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
51
|
+
import { HydrationScope } from '@openelement/core/hydrate';
|
|
52
|
+
import { renderErrorFallback, renderIntoLightDom, renderIntoShadowRoot } from './open-element-render.js';
|
|
53
|
+
import { hydrateExistingDom } from './open-element-hydration.js';
|
|
53
54
|
/**
|
|
54
55
|
* SSR-safe base class for OpenElement.
|
|
55
56
|
*
|
|
@@ -100,15 +101,6 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
100
101
|
* Whether this element participates in form submission.
|
|
101
102
|
* When true, ElementInternals are attached in connectedCallback.
|
|
102
103
|
*/ static formAssociated;
|
|
103
|
-
/**
|
|
104
|
-
* Effect dispose tracking (ADR-0065).
|
|
105
|
-
* Replaces effectScope() — effects are created at top level
|
|
106
|
-
* so they fire on signal changes. Disposed as a batch in
|
|
107
|
-
* disconnectedCallback.
|
|
108
|
-
*/ #effectDisposers = new Set();
|
|
109
|
-
/** v0.28 (ADR-0067): Event listener cleanup tracking for _hydrateSignals(). */ #eventCleanups = [];
|
|
110
|
-
/** v0.28.1: Cached VNode from render() — avoids double-render mismatch between SSR and hydration. */ #vnodeCache = undefined;
|
|
111
|
-
#vnodeCacheValid = false;
|
|
112
104
|
/**
|
|
113
105
|
* Signal registry for attribute-based hydration (ADR-0065).
|
|
114
106
|
* Maps signal names → signal objects. Built by registerSignal()
|
|
@@ -116,6 +108,49 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
116
108
|
*
|
|
117
109
|
* Exposed internally for render helper modules.
|
|
118
110
|
*/ signalRegistry = new Map();
|
|
111
|
+
/**
|
|
112
|
+
* v0.41.0-alpha.2: Hydration lifecycle scope.
|
|
113
|
+
*
|
|
114
|
+
* Replaces the separate #effectDisposers, #eventCleanups, and #vnodeCache
|
|
115
|
+
* fields. The scope is owned by the element and disposed on disconnect.
|
|
116
|
+
* It is exposed to @openelement/core/hydrate so the same lifecycle model
|
|
117
|
+
* can be reused by third-party framework runtimes later.
|
|
118
|
+
*
|
|
119
|
+
* Initialized after signalRegistry in the constructor to avoid field-order
|
|
120
|
+
* dependency on class field initializer sequencing.
|
|
121
|
+
*/ #hydrationScope;
|
|
122
|
+
constructor(){
|
|
123
|
+
super();
|
|
124
|
+
this.#hydrationScope = new HydrationScope({
|
|
125
|
+
signalRegistry: this.signalRegistry
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/** AbortController tied to element lifecycle. Aborted in disconnectedCallback. */ #lifecycleAbort;
|
|
129
|
+
/**
|
|
130
|
+
* Returns an AbortSignal that is aborted when the element is disconnected.
|
|
131
|
+
* Useful for tying async work (fetch, event listeners) to element lifecycle.
|
|
132
|
+
*/ _lifecycleSignal() {
|
|
133
|
+
if (!this.#lifecycleAbort) this.#lifecycleAbort = new AbortController();
|
|
134
|
+
return this.#lifecycleAbort.signal;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* setTimeout wrapper that auto-clears when the element disconnects.
|
|
138
|
+
*/ _setTimeout(handler, timeout) {
|
|
139
|
+
const id = globalThis.setTimeout(handler, timeout);
|
|
140
|
+
this._lifecycleSignal().addEventListener('abort', ()=>globalThis.clearTimeout(id), {
|
|
141
|
+
once: true
|
|
142
|
+
});
|
|
143
|
+
return id;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* requestAnimationFrame wrapper that auto-cancels when the element disconnects.
|
|
147
|
+
*/ _requestAnimationFrame(callback) {
|
|
148
|
+
const id = globalThis.requestAnimationFrame(callback);
|
|
149
|
+
this._lifecycleSignal().addEventListener('abort', ()=>globalThis.cancelAnimationFrame(id), {
|
|
150
|
+
once: true
|
|
151
|
+
});
|
|
152
|
+
return id;
|
|
153
|
+
}
|
|
119
154
|
/**
|
|
120
155
|
* Register a signal for hydration by name.
|
|
121
156
|
* Call in constructor: this.registerSignal('count', this.#count);
|
|
@@ -253,30 +288,14 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
253
288
|
this._renderErrorFallback(err);
|
|
254
289
|
}
|
|
255
290
|
}
|
|
256
|
-
/**
|
|
257
|
-
* v0.28 (ADR-0067): Signal-native hydration.
|
|
258
|
-
*
|
|
259
|
-
* Replaces _walkAndBind() — reads data-signal markers
|
|
260
|
-
* from DSD shadow root and creates direct signal→DOM effect bindings.
|
|
261
|
-
* No position matching, no childNodes filtering, no VNode traversal.
|
|
262
|
-
*
|
|
263
|
-
* Effects are tracked in #effectDisposers for batch cleanup.
|
|
264
|
-
* VNode event marker listeners are tracked in #eventCleanups.
|
|
265
|
-
*
|
|
266
|
-
* Implementation lives in open-element-hydration.ts.
|
|
267
|
-
*/ _hydrateSignals() {
|
|
268
|
-
if (!this.shadowRoot) return;
|
|
269
|
-
hydrateSignals(this, this.shadowRoot, this.signalRegistry, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
|
|
270
|
-
}
|
|
271
291
|
/**
|
|
272
292
|
* Hydrate DSD DOM with signal and event bindings.
|
|
273
293
|
*
|
|
274
|
-
* v0.28 (ADR-0067):
|
|
275
|
-
* _walkAndBind position matching is DELETED.
|
|
294
|
+
* v0.28 (ADR-0067): Replaces _walkAndBind position matching.
|
|
276
295
|
*
|
|
277
296
|
* Implementation lives in open-element-hydration.ts.
|
|
278
297
|
*/ _hydrateExistingDom() {
|
|
279
|
-
|
|
298
|
+
hydrateExistingDom(this, this.#hydrationScope);
|
|
280
299
|
}
|
|
281
300
|
/**
|
|
282
301
|
* v0.23.0: Hook called after DSD hydration completes.
|
|
@@ -304,7 +323,7 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
304
323
|
* Called once after the element is connected, the shadow root
|
|
305
324
|
* is ready, and any DSD hydration or CSR rendering has completed.
|
|
306
325
|
* This is the right place for framework hydration (Preact, React,
|
|
307
|
-
* Vue, Lit) to take over the shadow
|
|
326
|
+
* Vue, Lit) to take over the shadow root.
|
|
308
327
|
*
|
|
309
328
|
* Default implementation is a no-op. Subclasses override this to
|
|
310
329
|
* hydrate or render framework components into the shadow root.
|
|
@@ -319,17 +338,19 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
319
338
|
return null;
|
|
320
339
|
}
|
|
321
340
|
_renderErrorFallback(error) {
|
|
322
|
-
|
|
341
|
+
renderErrorFallback(this, error, this.#hydrationScope, (err)=>this.onRenderError(err));
|
|
323
342
|
}
|
|
324
343
|
/**
|
|
325
344
|
* Lifecycle: called when the element is disconnected from the DOM.
|
|
326
345
|
* Aborts all hydration event listeners for cleanup.
|
|
327
346
|
*/ disconnectedCallback() {
|
|
328
|
-
this.#
|
|
347
|
+
this.#hydrationScope.dispose();
|
|
329
348
|
disposeStaticProps(this);
|
|
349
|
+
this.#lifecycleAbort?.abort();
|
|
350
|
+
this.#lifecycleAbort = undefined;
|
|
330
351
|
}
|
|
331
|
-
// v0.28 (ADR-0067): Effect + event lifecycle managed by
|
|
332
|
-
// _walkAndBind DELETED — replaced by
|
|
352
|
+
// v0.28 (ADR-0067): Effect + event lifecycle managed by HydrationScope.
|
|
353
|
+
// _walkAndBind DELETED — replaced by _hydrateExistingDom().
|
|
333
354
|
/**
|
|
334
355
|
* Lifecycle: called when an observed attribute changes.
|
|
335
356
|
*
|
|
@@ -369,26 +390,10 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
369
390
|
this.update();
|
|
370
391
|
}
|
|
371
392
|
_renderIntoLightDom() {
|
|
372
|
-
|
|
393
|
+
renderIntoLightDom(this, this.#hydrationScope);
|
|
373
394
|
}
|
|
374
395
|
_renderIntoShadowRoot() {
|
|
375
|
-
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Accessor for the private VNode cache used by extracted render/hydration
|
|
379
|
-
* helpers. Keeps #vnodeCache / #vnodeCacheValid encapsulated while allowing
|
|
380
|
-
* the logic to live in separate modules.
|
|
381
|
-
*/ #cacheAccess() {
|
|
382
|
-
return {
|
|
383
|
-
get: ()=>({
|
|
384
|
-
vnode: this.#vnodeCache,
|
|
385
|
-
valid: this.#vnodeCacheValid
|
|
386
|
-
}),
|
|
387
|
-
set: (vnode)=>{
|
|
388
|
-
this.#vnodeCache = vnode;
|
|
389
|
-
this.#vnodeCacheValid = true;
|
|
390
|
-
}
|
|
391
|
-
};
|
|
396
|
+
renderIntoShadowRoot(this, this.#hydrationScope);
|
|
392
397
|
}
|
|
393
398
|
/**
|
|
394
399
|
* Read locale from JS property (set by SSR injectProps) first,
|
|
@@ -416,4 +421,4 @@ if (typeof HTMLElement === 'undefined') {
|
|
|
416
421
|
return null;
|
|
417
422
|
}
|
|
418
423
|
}
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvZWxlbWVudCAtIE9wZW5FbGVtZW50IGJhc2UgY2xhc3MuXG4gKlxuICogWmVyby1kZXBlbmRlbmN5IEN1c3RvbSBFbGVtZW50IGJhc2UgY2xhc3MgcHJvdmlkaW5nOlxuICogICAtIERlY2xhcmF0aXZlIFNoYWRvdyBET00gKERTRCkgZGV0ZWN0aW9uIGF0IHVwZ3JhZGUgdGltZVxuICogICAtIENsaWVudC1TaWRlIFJlbmRlcmluZyAoQ1NSKSBmYWxsYmFjayB3aGVuIG5vIERTRCBjb250ZW50IGV4aXN0c1xuICogICAtIFN0eWxlU2hlZXQgKFNTUi1zYWZlIENTU1N0eWxlU2hlZXQpIHZpYSBhZG9wdGVkU3R5bGVTaGVldHNcbiAqICAgLSBEZWNsYXJhdGl2ZSBldmVudCBiaW5kaW5nIHZpYSBodG1sIHRlbXBsYXRlIEBjbGljayAvIEBrZXlkb3duIGV0Yy5cbiAqICAgLSBTaWduYWwtZHJpdmVuIGZpbmUtZ3JhaW5lZCBET00gcGF0Y2hpbmcgdmlhIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAqICAgLSBBYm9ydENvbnRyb2xsZXIgY2xlYW51cCBvbiBkaXNjb25uZWN0XG4gKiAgIC0gZm9ybUFzc29jaWF0ZWQgKyBkZWxlZ2F0ZXNGb2N1cyBzdXBwb3J0XG4gKlxuICogT3BlbkVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCBkaXJlY3RseSAtIFpFUk8gTGl0IGRlcGVuZGVuY3kuXG4gKiBDb21wb25lbnRzIHJldHVybiBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKlxuICogTGlmZWN5Y2xlOlxuICogICBTU1I6IGluc3RhbnRpYXRlIC0+IHNldCBwcm9wcyAtPiByZW5kZXIoKSAtPiB3cmFwIGluIERTRCB0ZW1wbGF0ZVxuICogICBDbGllbnQgKERTRCk6IGJyb3dzZXIgYXR0YWNoZXMgc2hhZG93IHJvb3QgZnJvbSBEU0QgLT4gdXBncmFkZSAtPiBiaW5kIHRlbXBsYXRlIGV2ZW50c1xuICogICBDbGllbnQgKENTUik6IGNvbm5lY3RlZENhbGxiYWNrIC0+IGNyZWF0ZVJlbmRlclJvb3QgLT4gcmVuZGVyIGludG8gc2hhZG93Um9vdFxuICpcbiAqIFVzYWdlIChzdGF0aWMgRFNEIGNvbXBvbmVudCk6XG4gKiBgYGB0c1xuICogY2xhc3MgTXlDYXJkIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICBzdGF0aWMgc3R5bGVzID0gbXlTdHlsZVNoZWV0O1xuICogICByZW5kZXIoKTogVk5vZGUge1xuICogICAgIHJldHVybiA8ZGl2IGNsYXNzPVwiY2FyZFwiPjxzbG90IC8+PC9kaXY+O1xuICogICB9XG4gKiB9XG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWNhcmQnLCBNeUNhcmQpO1xuICogYGBgXG4gKlxuICogVXNhZ2UgKHJlYWN0aXZlIERTRCBjb21wb25lbnQpOlxuICogYGBgdHNcbiAqIGNsYXNzIE15VG9nZ2xlIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICAjYWN0aXZlID0gc2lnbmFsKGZhbHNlKTtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiAoXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHRoaXMuI2FjdGl2ZS52YWx1ZSA9ICF0aGlzLiNhY3RpdmUudmFsdWV9PlxuICogICAgICAgICB7dGhpcy4jYWN0aXZlLnZhbHVlID8gJ09OJyA6ICdPRkYnfVxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSBAb3BlbmVsZW1lbnQvZWxlbWVudC9vcGVuLWVsZW1lbnRcbiAqL1xuXG5pbXBvcnQgeyBmb3JtYXRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3N0eWxlLXNoZWV0JztcbmltcG9ydCB7XG4gIGRpc3Bvc2VTdGF0aWNQcm9wcyxcbiAgaGFuZGxlU3RhdGljUHJvcEF0dHJpYnV0ZUNoYW5nZSxcbiAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzLFxuICBzeW5jU3RhdGljUHJvcHNGcm9tQXR0cmlidXRlcyxcbn0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvcHJvcCc7XG5pbXBvcnQgdHlwZSB7IFZOb2RlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3Zub2RlJztcbmltcG9ydCB0eXBlIHsgU2lnbmFsIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3NpZ25hbCc7XG5pbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAb3BlbmVsZW1lbnQvc2lnbmFsJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2xvZ2dlcic7XG5pbXBvcnQge1xuICBkaXNwb3NlUmVuZGVyQmluZGluZ3MsXG4gIHJlbmRlckVycm9yRmFsbGJhY2ssXG4gIHJlbmRlckludG9MaWdodERvbSxcbiAgcmVuZGVySW50b1NoYWRvd1Jvb3QsXG4gIHR5cGUgVk5vZGVDYWNoZUFjY2Vzcyxcbn0gZnJvbSAnLi9vcGVuLWVsZW1lbnQtcmVuZGVyLmpzJztcbmltcG9ydCB7IGh5ZHJhdGVFeGlzdGluZ0RvbSwgaHlkcmF0ZVNpZ25hbHMgfSBmcm9tICcuL29wZW4tZWxlbWVudC1oeWRyYXRpb24uanMnO1xuXG4vKipcbiAqIFNTUi1zYWZlIGJhc2UgY2xhc3MgZm9yIE9wZW5FbGVtZW50LlxuICpcbiAqIEluIGJyb3dzZXI6IGV4dGVuZHMgSFRNTEVsZW1lbnQgZGlyZWN0bHkuXG4gKiBJbiBTU1I6IGFzc2lnbnMgYSBtaW5pbWFsIHN0dWIgdG8gZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCBzbyB0aGUgZW50aXJlXG4gKiBkZXBlbmRlbmN5IGdyYXBoIHNoYXJlcyB0aGUgc2FtZSBiYXNlIGNsYXNzLlxuICovXG5jb25zdCBfQmFzZSA9IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBIVE1MRWxlbWVudCA6IChjbGFzcyB7XG4gIGhhc0F0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldEF0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc2V0QXR0cmlidXRlKF9uYW1lOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKTogdm9pZCB7fVxuICByZW1vdmVBdHRyaWJ1dGUoX25hbWU6IHN0cmluZyk6IHZvaWQge31cbiAgZ2V0IHRhZ05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgZ2V0IGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSBhcyB1bmtub3duIGFzIHR5cGVvZiBIVE1MRWxlbWVudCk7XG5cbi8vIEluIFNTUiwgYXNzaWduIGdsb2JhbFRoaXMuSFRNTEVsZW1lbnQgc28gb3RoZXIgY29kZSBjYW4gcmVmZXJlbmNlIGl0XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuSFRNTEVsZW1lbnQgPSBfQmFzZTtcbn1cblxuLyoqXG4gKiBaZXJvLWRlcGVuZGVuY3kgQ3VzdG9tIEVsZW1lbnQgYmFzZSBjbGFzcyBmb3IgRFNEIHJlbmRlcmluZy5cbiAqXG4gKiBQcm92aWRlcyBEU0QgZGV0ZWN0aW9uLCBDU1IgZmFsbGJhY2ssIGV2ZW50IGh5ZHJhdGlvbiwgYW5kIHN0eWxlIG1hbmFnZW1lbnRcbiAqIHdpdGhvdXQgYW55IGZyYW1ld29yayBkZXBlbmRlbmN5IChubyBMaXQsIG5vIHJlYWN0aXZlLWVsZW1lbnQpLlxuICpcbiAqIFN1YmNsYXNzZXMgTVVTVCBvdmVycmlkZSBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuRWxlbWVudCBleHRlbmRzIF9CYXNlIHtcbiAgLyoqIENvbXBvbmVudCBzdHlsZXNoZWV0cyAoU1NSLXNhZmUgLSBTdHlsZVNoZWV0IGRlbGVnYXRlcyB0byBuYXRpdmUgQ1NTU3R5bGVTaGVldCBpbiBicm93c2VyKS4gKi9cbiAgc3RhdGljIHN0eWxlcz86IFN0eWxlU2hlZXRMaWtlIHwgU3R5bGVTaGVldExpa2VbXTtcblxuICAvKiogUmVuZGVyaW5nIG1vZGUuIERlZmF1bHRzIHRvIHNoYWRvdy9EU0Q7IGxpZ2h0IERPTSBpcyBleHBsaWNpdCBvcHQtaW4uICovXG4gIHN0YXRpYyByZW5kZXJNb2RlPzogJ3NoYWRvdycgfCAnbGlnaHQnO1xuXG4gIC8qKiB2MC4yNS4wOiBQYWdlIGhlYWQgbWV0YWRhdGEuIFNTRyByZWFkcyB0aGlzIHRvIGluamVjdCA8dGl0bGU+IGFuZCA8bWV0YT4gdGFncy4gKi9cbiAgc3RhdGljIGhlYWQ/OiB7IHRpdGxlPzogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgb2dJbWFnZT86IHN0cmluZyB9O1xuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHVzZSBvcGVuUGlwZWxpbmUoeyBpc2xhbmQ6IHsgdXBncmFkZVN0cmF0ZWd5IH0gfSkgaW5zdGVhZCAqL1xuICBzdGF0aWMgY2xpZW50PzogeyBzdHJhdGVneT86ICdsb2FkJyB8ICdpZGxlJyB8ICd2aXNpYmxlJyB8ICdvbmx5JyB9O1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIHRoYXQgdHJpZ2dlciBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suXG4gICAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyB0byBkZWNsYXJlIHJlYWN0aXZlIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZWdhdGUgZm9jdXMgd2l0aGluIHRoZSBzaGFkb3cgcm9vdC5cbiAgICogV2hlbiB0cnVlLCBhdHRhY2hTaGFkb3cgaXMgY2FsbGVkIHdpdGggYGRlbGVnYXRlc0ZvY3VzOiB0cnVlYC5cbiAgICovXG4gIHN0YXRpYyBkZWxlZ2F0ZXNGb2N1cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlbGVtZW50IHBhcnRpY2lwYXRlcyBpbiBmb3JtIHN1Ym1pc3Npb24uXG4gICAqIFdoZW4gdHJ1ZSwgRWxlbWVudEludGVybmFscyBhcmUgYXR0YWNoZWQgaW4gY29ubmVjdGVkQ2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFZmZlY3QgZGlzcG9zZSB0cmFja2luZyAoQURSLTAwNjUpLlxuICAgKiBSZXBsYWNlcyBlZmZlY3RTY29wZSgpIOKAlCBlZmZlY3RzIGFyZSBjcmVhdGVkIGF0IHRvcCBsZXZlbFxuICAgKiBzbyB0aGV5IGZpcmUgb24gc2lnbmFsIGNoYW5nZXMuIERpc3Bvc2VkIGFzIGEgYmF0Y2ggaW5cbiAgICogZGlzY29ubmVjdGVkQ2FsbGJhY2suXG4gICAqL1xuICAjZWZmZWN0RGlzcG9zZXJzOiBTZXQ8KCkgPT4gdm9pZD4gPSBuZXcgU2V0KCk7XG5cbiAgLyoqIHYwLjI4IChBRFItMDA2Nyk6IEV2ZW50IGxpc3RlbmVyIGNsZWFudXAgdHJhY2tpbmcgZm9yIF9oeWRyYXRlU2lnbmFscygpLiAqL1xuICAjZXZlbnRDbGVhbnVwczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICAvKiogdjAuMjguMTogQ2FjaGVkIFZOb2RlIGZyb20gcmVuZGVyKCkg4oCUIGF2b2lkcyBkb3VibGUtcmVuZGVyIG1pc21hdGNoIGJldHdlZW4gU1NSIGFuZCBoeWRyYXRpb24uICovXG4gICN2bm9kZUNhY2hlOiB1bmtub3duID0gdW5kZWZpbmVkO1xuICAjdm5vZGVDYWNoZVZhbGlkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNpZ25hbCByZWdpc3RyeSBmb3IgYXR0cmlidXRlLWJhc2VkIGh5ZHJhdGlvbiAoQURSLTAwNjUpLlxuICAgKiBNYXBzIHNpZ25hbCBuYW1lcyDihpIgc2lnbmFsIG9iamVjdHMuIEJ1aWx0IGJ5IHJlZ2lzdGVyU2lnbmFsKClcbiAgICogaW4gY29tcG9uZW50IGNvbnN0cnVjdG9ycywgY29uc3VtZWQgZHVyaW5nIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogRXhwb3NlZCBpbnRlcm5hbGx5IGZvciByZW5kZXIgaGVscGVyIG1vZHVsZXMuXG4gICAqL1xuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzaWduYWwgZm9yIGh5ZHJhdGlvbiBieSBuYW1lLlxuICAgKiBDYWxsIGluIGNvbnN0cnVjdG9yOiB0aGlzLnJlZ2lzdGVyU2lnbmFsKCdjb3VudCcsIHRoaXMuI2NvdW50KTtcbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclNpZ25hbChuYW1lOiBzdHJpbmcsIHNpZzogU2lnbmFsPHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5zaWduYWxSZWdpc3RyeS5zZXQobmFtZSwgc2lnKTtcbiAgfVxuXG4gIC8qKiBSZWFjdGl2ZSByb3V0ZSBwYXJhbWV0ZXJzIFNpZ25hbC4gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IG9uIFNQQSBuYXZpZ2F0aW9uLiAqL1xuICAjcGFyYW1zID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KTtcblxuICAvKiogUmVhY3RpdmUgcm91dGUgcGFyYW1ldGVycy4gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IG9uIFNQQSBuYXZpZ2F0aW9uLiAqL1xuICBnZXQgcGFyYW1zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLiNwYXJhbXMudmFsdWU7XG4gIH1cblxuICBzZXQgcGFyYW1zKHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgdGhpcy4jcGFyYW1zLnZhbHVlID0geyAuLi52YWx1ZSB9O1xuICB9XG5cbiAgLyoqIEVsZW1lbnRJbnRlcm5hbHMgZm9yIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgKi9cbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM/OiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgcmV1c2UgdGhlIHNoYWRvdyByb290LlxuICAgKlxuICAgKiBEU0QgZGV0ZWN0aW9uOiBpZiBgdGhpcy5zaGFkb3dSb290YCBhbHJlYWR5IGV4aXN0cyBhbmQgaGFzIG5vZGVzLFxuICAgKiB0aGUgYnJvd3NlciBwcmUtcG9wdWxhdGVkIGl0IGZyb20gYSA8dGVtcGxhdGUgc2hhZG93cm9vdG1vZGU+IHRhZy5cbiAgICogSW4gdGhhdCBjYXNlIHdlIG1hcmsgYF9kc2RIeWRyYXRlZCA9IHRydWVgIGFuZCByZXR1cm4gdGhlIGV4aXN0aW5nIHJvb3QuXG4gICAqXG4gICAqIENTUiBmYWxsYmFjazogaWYgbm8gc2hhZG93IHJvb3QgZXhpc3RzLCB3ZSBjYWxsIGBhdHRhY2hTaGFkb3coKWAuIElmIGFuXG4gICAqIGVtcHR5IHNoYWRvdyByb290IGFscmVhZHkgZXhpc3RzLCB3ZSByZXVzZSBpdCBhbmQgbGV0IGNvbm5lY3RlZENhbGxiYWNrKClcbiAgICogcG9wdWxhdGUgaXQgZnJvbSByZW5kZXIoKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGV4aXN0aW5nIG9yIG5ld2x5IGNyZWF0ZWQgU2hhZG93Um9vdC5cbiAgICovXG4gIGNyZWF0ZVJlbmRlclJvb3QoKTogU2hhZG93Um9vdCB8IHRoaXMge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPcGVuRWxlbWVudDtcbiAgICBpZiAoY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEU0QgcHJlLXBvcHVsYXRlZCBzaGFkb3cgcm9vdCBkZXRlY3Rpb25cbiAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhjdG9yLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvLyBDU1I6IGNyZWF0ZSBhIG5ldyBzaGFkb3cgcm9vdFxuICAgIGNvbnN0IGRlbGVnYXRlc0ZvY3VzID0gY3Rvci5kZWxlZ2F0ZXNGb2N1cyA/PyBmYWxzZTtcbiAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicsIGRlbGVnYXRlc0ZvY3VzIH0pO1xuXG4gICAgLy8gQXBwbHkgc3RhdGljIHN0eWxlcyB2aWEgYWRvcHRlZFN0eWxlU2hlZXRzXG4gICAgdGhpcy5fYXBwbHlTdHlsZXMoY3Rvciwgcm9vdCk7XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBzdGF0aWMgc3R5bGVzIHRvIHRoZSBzaGFkb3cgcm9vdCB2aWEgYWRvcHRlZFN0eWxlU2hlZXRzLlxuICAgKiBTaGFyZWQgYmV0d2VlbiBDU1IgKGNyZWF0ZVJlbmRlclJvb3QpIGFuZCBEU0QgKGNvbm5lY3RlZENhbGxiYWNrKSBwYXRocy5cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5U3R5bGVzKGN0b3I6IHR5cGVvZiBPcGVuRWxlbWVudCwgcm9vdD86IFNoYWRvd1Jvb3QpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSByb290ID8/IHRoaXMuc2hhZG93Um9vdDtcbiAgICBpZiAoIXRhcmdldCB8fCAhY3Rvci5zdHlsZXMpIHJldHVybjtcbiAgICBjb25zdCBzaGVldHMgPSBBcnJheS5pc0FycmF5KGN0b3Iuc3R5bGVzKSA/IGN0b3Iuc3R5bGVzIDogW2N0b3Iuc3R5bGVzXTtcbiAgICBpZiAoc2hlZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFN0eWxlU2hlZXQgZGVsZWdhdGVzIHRvIG5hdGl2ZSBDU1NTdHlsZVNoZWV0IGluIGJyb3dzZXJcbiAgICAgIC8vIHR5cGUtZXNjYXBlOiBhZG9wdGVkU3R5bGVTaGVldHMgbWF5IG5vdCBiZSBpbiB0aGUgY29uZmlndXJlZCBET00gbGliXG4gICAgICAodGFyZ2V0IGFzIHVua25vd24gYXMgeyBhZG9wdGVkU3R5bGVTaGVldHM6IHR5cGVvZiBzaGVldHMgfSkuYWRvcHRlZFN0eWxlU2hlZXRzID0gc2hlZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKlxuICAgKiBEU0QgcGF0aCAoX2RzZEh5ZHJhdGVkID0gdHJ1ZSk6XG4gICAqICAgLSBDYWxscyBfaHlkcmF0ZUV2ZW50cygpIHRvIGJpbmQgZGVjbGFyYXRpdmUgZXZlbnRzIG9uIGV4aXN0aW5nIERPTS5cbiAgICpcbiAgICogQ1NSIHBhdGggKF9kc2RIeWRyYXRlZCA9IGZhbHNlKTpcbiAgICogICAtIENhbGxzIGNyZWF0ZVJlbmRlclJvb3QoKSBpZiBubyBzaGFkb3cgcm9vdCBleGlzdHMuXG4gICAqICAgLSBSZW5kZXJzIHRoaXMucmVuZGVyKCkgdGhyb3VnaCB0aGUgVk5vZGUgRE9NIHJlbmRlcmVyLlxuICAgKlxuICAgKiBJZiBmb3JtQXNzb2NpYXRlZCBpcyB0cnVlLCBFbGVtZW50SW50ZXJuYWxzIGFyZSBhdHRhY2hlZC5cbiAgICovXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPcGVuRWxlbWVudDtcblxuICAgIC8vIHYwLjI0LjEgKEFEUi0wMDU3KTogSW5pdGlhbGl6ZSBzdGF0aWMgcHJvcHMgc2lnbmFscyBhbmQgYWNjZXNzb3JzXG4gICAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzKHRoaXMpO1xuICAgIHN5bmNTdGF0aWNQcm9wc0Zyb21BdHRyaWJ1dGVzKHRoaXMpO1xuXG4gICAgY29uc3QgaXNMaWdodERvbSA9IGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0JztcblxuICAgIC8vIEVuc3VyZSByZW5kZXIgdGFyZ2V0IGV4aXN0cyBhbmQgZGV0ZWN0IERTRCBwcmUtcG9wdWxhdGlvblxuICAgIGlmICghdGhpcy5zaGFkb3dSb290ICYmICFpc0xpZ2h0RG9tKSB7XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgLy8gRFNEIHBhdGg6IHNoYWRvdyByb290IGFscmVhZHkgcG9wdWxhdGVkLlxuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKGN0b3IpO1xuICAgIH1cblxuICAgIC8vIFN5bmMgZGF0YS10aGVtZSBmcm9tIGRvY3VtZW50IHJvb3RcbiAgICBjb25zdCBkb2NUaGVtZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8uZGF0YXNldD8udGhlbWU7XG4gICAgaWYgKGRvY1RoZW1lICYmICF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS10aGVtZScpKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsIGRvY1RoZW1lKTtcbiAgICB9XG5cbiAgICAvLyBURy0wMTogUmVhZCByb3V0ZSBwYXJhbXMgZnJvbSBhdHRyaWJ1dGUgaWYgcHJlc2VudC5cbiAgICAvLyAoU1NSL1NTRyBpbmplY3RzIHBhcmFtcyBhcyBKUyBwcm9wZXJ0eSB2aWEgaW5qZWN0UHJvcHMg4oCUIHNldHRlciBoYW5kbGVzIGl0KVxuICAgIGNvbnN0IGF0dHJQYXJhbXMgPSB0aGlzLmdldEF0dHJpYnV0ZSgncGFyYW1zJyk7XG4gICAgaWYgKGF0dHJQYXJhbXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuI3BhcmFtcy52YWx1ZSA9IEpTT04ucGFyc2UoYXR0clBhcmFtcyk7XG4gICAgICB9IGNhdGNoIHsgLyogaWdub3JlIG1hbGZvcm1lZCBKU09OICovIH1cbiAgICB9XG5cbiAgICAvLyB2MC4yNS4wIChTT1AtMDEyKTogVW5pZmllZCByZW5kZXIgcGF0aCDigJQgRFNEIGFuZCBDU1IgYm90aCBnbyB0aHJvdWdoXG4gICAgLy8gX3JlbmRlck9ySHlkcmF0ZSgpLiBUaGUgX2RzZEh5ZHJhdGVkIGZsYWcgYW5kIF9iaW5kQ3VycmVudFJlbmRlclRlbXBsYXRlKClcbiAgICAvLyBhcmUgcmVtb3ZlZC4gRFNEIHByZS1wb3B1bGF0ZWQgRE9NIGlzIHByZXNlcnZlZDsgb25seSBldmVudHMgYW5kIHNpZ25hbFxuICAgIC8vIHN1YnNjcmlwdGlvbnMgYXJlIGFkZGVkLlxuICAgIHRoaXMuX3JlbmRlck9ySHlkcmF0ZSgpO1xuXG4gICAgLy8gdjAuNDAuMDogQ2xpZW50LXNpZGUgYWN0aXZhdGlvbiBob29rIGZvciBmcmFtZXdvcmsgaHlkcmF0aW9uXG4gICAgdGhpcy5jbGllbnRBY3RpdmF0ZSgpO1xuXG4gICAgLy8gQXR0YWNoIEVsZW1lbnRJbnRlcm5hbHMgZm9yIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHNcbiAgICBpZiAoY3Rvci5mb3JtQXNzb2NpYXRlZCAmJiB0eXBlb2YgdGhpcy5hdHRhY2hJbnRlcm5hbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2ludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHYwLjI1LjAgKFNPUC0wMTIpOiBVbmlmaWVkIHJlbmRlciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyT3JIeWRyYXRlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgICBpZiAoY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlckludG9MaWdodERvbSgpO1xuICAgICAgICB0aGlzLm9uQ3NyUmVuZGVyZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0RzZCA9IHRoaXMuc2hhZG93Um9vdCAmJiB0aGlzLnNoYWRvd1Jvb3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwO1xuICAgICAgaWYgKGlzRHNkKSB7XG4gICAgICAgIC8vIERTRDogRE9NIGFscmVhZHkgY29ycmVjdCDigJQgYmluZCBldmVudHMgdmlhIFZOb2RlIHdhbGtcbiAgICAgICAgdGhpcy5faHlkcmF0ZUV4aXN0aW5nRG9tKCk7XG4gICAgICAgIHRoaXMub25Ec2RIeWRyYXRlZCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gQ1NSOiBmdWxsIHJlbmRlciBmcm9tIFZOb2RlXG4gICAgICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gICAgICAgIHRoaXMub25Dc3JSZW5kZXJlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fcmVuZGVyRXJyb3JGYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yOCAoQURSLTAwNjcpOiBTaWduYWwtbmF0aXZlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogUmVwbGFjZXMgX3dhbGtBbmRCaW5kKCkg4oCUIHJlYWRzIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAgICogZnJvbSBEU0Qgc2hhZG93IHJvb3QgYW5kIGNyZWF0ZXMgZGlyZWN0IHNpZ25hbOKGkkRPTSBlZmZlY3QgYmluZGluZ3MuXG4gICAqIE5vIHBvc2l0aW9uIG1hdGNoaW5nLCBubyBjaGlsZE5vZGVzIGZpbHRlcmluZywgbm8gVk5vZGUgdHJhdmVyc2FsLlxuICAgKlxuICAgKiBFZmZlY3RzIGFyZSB0cmFja2VkIGluICNlZmZlY3REaXNwb3NlcnMgZm9yIGJhdGNoIGNsZWFudXAuXG4gICAqIFZOb2RlIGV2ZW50IG1hcmtlciBsaXN0ZW5lcnMgYXJlIHRyYWNrZWQgaW4gI2V2ZW50Q2xlYW51cHMuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9uIGxpdmVzIGluIG9wZW4tZWxlbWVudC1oeWRyYXRpb24udHMuXG4gICAqL1xuICBwcml2YXRlIF9oeWRyYXRlU2lnbmFscygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgcmV0dXJuO1xuICAgIGh5ZHJhdGVTaWduYWxzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2hhZG93Um9vdCxcbiAgICAgIHRoaXMuc2lnbmFsUmVnaXN0cnksXG4gICAgICB0aGlzLiNlZmZlY3REaXNwb3NlcnMsXG4gICAgICB0aGlzLiNldmVudENsZWFudXBzLFxuICAgICAgdGhpcy4jY2FjaGVBY2Nlc3MoKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEh5ZHJhdGUgRFNEIERPTSB3aXRoIHNpZ25hbCBhbmQgZXZlbnQgYmluZGluZ3MuXG4gICAqXG4gICAqIHYwLjI4IChBRFItMDA2Nyk6IERlbGVnYXRlcyB0byBfaHlkcmF0ZVNpZ25hbHMoKS5cbiAgICogX3dhbGtBbmRCaW5kIHBvc2l0aW9uIG1hdGNoaW5nIGlzIERFTEVURUQuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9uIGxpdmVzIGluIG9wZW4tZWxlbWVudC1oeWRyYXRpb24udHMuXG4gICAqL1xuICBwcml2YXRlIF9oeWRyYXRlRXhpc3RpbmdEb20oKTogdm9pZCB7XG4gICAgdGhpcy4jZXZlbnRDbGVhbnVwcyA9IGh5ZHJhdGVFeGlzdGluZ0RvbShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNpZ25hbFJlZ2lzdHJ5LFxuICAgICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLFxuICAgICAgdGhpcy4jZXZlbnRDbGVhbnVwcyxcbiAgICAgIHRoaXMuI2NhY2hlQWNjZXNzKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yMy4wOiBIb29rIGNhbGxlZCBhZnRlciBEU0QgaHlkcmF0aW9uIGNvbXBsZXRlcy5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIGluc3RlYWQgb2YgcmVseWluZyBvbiBmcmFnaWxlXG4gICAqIGBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpYCBjYWxsIG9yZGVyLiBBdCB0aGlzIHBvaW50IHRoZVxuICAgKiBzaGFkb3cgRE9NIGlzIHBvcHVsYXRlZCBmcm9tIERTRCBhbmQgZGVjbGFyYXRpdmUgZXZlbnRzXG4gICAqIChAY2xpY2ssIEBrZXlkb3duKSBhcmUgYm91bmQuXG4gICAqXG4gICAqIE5vLW9wIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Ec2RIeWRyYXRlZCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIHYwLjIzLjA6IEhvb2sgY2FsbGVkIGFmdGVyIENTUiBmaXJzdCByZW5kZXIgY29tcGxldGVzLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgZm9yIHBvc3QtcmVuZGVyIGluaXRpYWxpemF0aW9uXG4gICAqIHRoYXQgZGVwZW5kcyBvbiB0aGUgc2hhZG93IERPTSBiZWluZyBwb3B1bGF0ZWQuIEF0IHRoaXNcbiAgICogcG9pbnQgcmVuZGVyKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBkZWNsYXJhdGl2ZSBldmVudHNcbiAgICogYXJlIGJvdW5kLlxuICAgKlxuICAgKiBOby1vcCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ3NyUmVuZGVyZWQoKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiB2MC40MC4wOiBDbGllbnQtc2lkZSBhY3RpdmF0aW9uIGhvb2suXG4gICAqXG4gICAqIENhbGxlZCBvbmNlIGFmdGVyIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCwgdGhlIHNoYWRvdyByb290XG4gICAqIGlzIHJlYWR5LCBhbmQgYW55IERTRCBoeWRyYXRpb24gb3IgQ1NSIHJlbmRlcmluZyBoYXMgY29tcGxldGVkLlxuICAgKiBUaGlzIGlzIHRoZSByaWdodCBwbGFjZSBmb3IgZnJhbWV3b3JrIGh5ZHJhdGlvbiAoUHJlYWN0LCBSZWFjdCxcbiAgICogVnVlLCBMaXQpIHRvIHRha2Ugb3ZlciB0aGUgc2hhZG93IERPTS5cbiAgICpcbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG9cbiAgICogaHlkcmF0ZSBvciByZW5kZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMgaW50byB0aGUgc2hhZG93IHJvb3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2xpZW50QWN0aXZhdGUoKTogdm9pZCB7XG4gICAgLy8gZGVmYXVsdCBuby1vcFxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHdoZW4gdGhlIHVuaWZpZWQgY2xpZW50IHJlbmRlci9oeWRyYXRlIHBhdGggdGhyb3dzLlxuICAgKiBTdWJjbGFzc2VzIG1heSByZXR1cm4gYSBWTm9kZSBmYWxsYmFjay5cbiAgICovXG4gIHByb3RlY3RlZCBvblJlbmRlckVycm9yKGVycm9yOiB1bmtub3duKTogVk5vZGUgfCBudWxsIHtcbiAgICBjcmVhdGVMb2dnZXIoJ2RzZCcpLmVycm9yKFxuICAgICAgYDwke3RoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gcmVuZGVyL2h5ZHJhdGUgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGVycm9yKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJFcnJvckZhbGxiYWNrKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy4jZXZlbnRDbGVhbnVwcyA9IHJlbmRlckVycm9yRmFsbGJhY2soXG4gICAgICB0aGlzLFxuICAgICAgZXJyb3IsXG4gICAgICB0aGlzLiNlZmZlY3REaXNwb3NlcnMsXG4gICAgICB0aGlzLiNldmVudENsZWFudXBzLFxuICAgICAgKGVycikgPT4gdGhpcy5vblJlbmRlckVycm9yKGVyciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00uXG4gICAqIEFib3J0cyBhbGwgaHlkcmF0aW9uIGV2ZW50IGxpc3RlbmVycyBmb3IgY2xlYW51cC5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMgPSBkaXNwb3NlUmVuZGVyQmluZGluZ3ModGhpcy4jZWZmZWN0RGlzcG9zZXJzLCB0aGlzLiNldmVudENsZWFudXBzKTtcbiAgICBkaXNwb3NlU3RhdGljUHJvcHModGhpcyk7XG4gIH1cblxuICAvLyB2MC4yOCAoQURSLTAwNjcpOiBFZmZlY3QgKyBldmVudCBsaWZlY3ljbGUgbWFuYWdlZCBieSBTZXQvQXJyYXkuXG4gIC8vIF93YWxrQW5kQmluZCBERUxFVEVEIOKAlCByZXBsYWNlZCBieSBfaHlkcmF0ZVNpZ25hbHMoKS5cblxuICAvKipcbiAgICogTGlmZWN5Y2xlOiBjYWxsZWQgd2hlbiBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUgY2hhbmdlcy5cbiAgICpcbiAgICogQmFzZSBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gcmVhY3RcbiAgICogdG8gYXR0cmlidXRlIGNoYW5nZXMsIHR5cGljYWxseSBieSBjYWxsaW5nIGB0aGlzLnJlbmRlcigpYCB0byB1cGRhdGVcbiAgICogdGhlIHNoYWRvdyBET00uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQXR0cmlidXRlIG5hbWUgKGxvd2VyY2FzZSkuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSAtIFByZXZpb3VzIHZhbHVlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIF9uYW1lOiBzdHJpbmcsXG4gICAgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgIF9uZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gdjAuMjQuMSAoQURSLTAwNTcpOiBSb3V0ZSB0byBzdGF0aWMgcHJvcHMgaGFuZGxlclxuICAgIGhhbmRsZVN0YXRpY1Byb3BBdHRyaWJ1dGVDaGFuZ2UoXG4gICAgICB0aGlzLFxuICAgICAgX25hbWUsXG4gICAgICBfb2xkVmFsdWUsXG4gICAgICBfbmV3VmFsdWUsXG4gICAgKTtcbiAgICAvLyBTdWJjbGFzcyBvdmVycmlkZSBwb2ludCAtIGJhc2UgaW1wbGVtZW50YXRpb24gaXMgaW50ZW50aW9uYWxseSBlbXB0eS5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZW5kZXIgdGhlIHNoYWRvdyBET00gZnJvbSBgcmVuZGVyKClgIGFuZCByZS1iaW5kIGRlY2xhcmF0aXZlIGV2ZW50cy5cbiAgICpcbiAgICogT3BlbkVsZW1lbnQgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBpbmNsdWRlIGEgcmVhY3RpdmUgc2NoZWR1bGVyLiBDb21wb25lbnRzXG4gICAqIHdpdGggbG9jYWwgc3RhdGUgY2FuIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mXG4gICAqIGR1cGxpY2F0aW5nIHJlbmRlclRvRG9tKCkgYW5kIGV2ZW50IGh5ZHJhdGlvbi5cbiAgICovXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgaWYgKGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgdGhpcy5fcmVuZGVySW50b0xpZ2h0RG9tKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RpdmVDb250cm9sbGVyLWNvbXBhdGlibGUgdXBkYXRlIGhvb2suXG4gICAqXG4gICAqIEFzeW5jIHN0YXRlIGNvbnRyb2xsZXJzIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBzdGF0ZSBjaGFuZ2VzLiBLZWVwaW5nIHRoaXNcbiAgICogdGlueSBhbGlhcyBsZXRzIE9wZW5FbGVtZW50IGhvc3QgY29udHJvbGxlcnMgd2l0aG91dCBpbmhlcml0aW5nIExpdCBvciBhXG4gICAqIHNjaGVkdWxlci5cbiAgICovXG4gIHJlcXVlc3RVcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckludG9MaWdodERvbSgpOiB2b2lkIHtcbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gcmVuZGVySW50b0xpZ2h0RG9tKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuI2VmZmVjdERpc3Bvc2VycyxcbiAgICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMsXG4gICAgICB0aGlzLiNjYWNoZUFjY2VzcygpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJJbnRvU2hhZG93Um9vdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gcmVuZGVySW50b1NoYWRvd1Jvb3QoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLFxuICAgICAgdGhpcy4jZXZlbnRDbGVhbnVwcyxcbiAgICAgIHRoaXMuI2NhY2hlQWNjZXNzKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3NvciBmb3IgdGhlIHByaXZhdGUgVk5vZGUgY2FjaGUgdXNlZCBieSBleHRyYWN0ZWQgcmVuZGVyL2h5ZHJhdGlvblxuICAgKiBoZWxwZXJzLiBLZWVwcyAjdm5vZGVDYWNoZSAvICN2bm9kZUNhY2hlVmFsaWQgZW5jYXBzdWxhdGVkIHdoaWxlIGFsbG93aW5nXG4gICAqIHRoZSBsb2dpYyB0byBsaXZlIGluIHNlcGFyYXRlIG1vZHVsZXMuXG4gICAqL1xuICAjY2FjaGVBY2Nlc3MoKTogVk5vZGVDYWNoZUFjY2VzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKCkgPT4gKHsgdm5vZGU6IHRoaXMuI3Zub2RlQ2FjaGUsIHZhbGlkOiB0aGlzLiN2bm9kZUNhY2hlVmFsaWQgfSksXG4gICAgICBzZXQ6ICh2bm9kZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aGlzLiN2bm9kZUNhY2hlID0gdm5vZGU7XG4gICAgICAgIHRoaXMuI3Zub2RlQ2FjaGVWYWxpZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBsb2NhbGUgZnJvbSBKUyBwcm9wZXJ0eSAoc2V0IGJ5IFNTUiBpbmplY3RQcm9wcykgZmlyc3QsXG4gICAqIHRoZW4gSFRNTCBhdHRyaWJ1dGUsIHRoZW4gZmFsbGJhY2sgdG8gcHJvdmlkZWQgZGVmYXVsdC5cbiAgICpcbiAgICogU1NSIGluamVjdFByb3BzKCkgc2V0cyBjYW1lbENhc2UgSlMgcHJvcGVydGllcyAoZS5nLiB0aGlzLmxvY2FsZSA9ICdlbicpXG4gICAqIGJ1dCBnZXRBdHRyaWJ1dGUoKSBvbmx5IHJlYWRzIEhUTUwgYXR0cmlidXRlcywgd2hpY2ggcmVtYWluIG51bGwuXG4gICAqIFRoaXMgbWV0aG9kIHJlc29sdmVzIHRoZSBtaXNtYXRjaCBieSBjaGVja2luZyBKUyBwcm9wZXJ0eSBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gRGVmYXVsdCB2YWx1ZSB3aGVuIG5laXRoZXIgc291cmNlIGhhcyBhIHZhbHVlLiBEZWZhdWx0cyB0byAnZW4nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRMb2NhbGUoZmFsbGJhY2sgPSAnZW4nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wID0gKHRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxvY2FsZTtcbiAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnICYmIHByb3ApIHJldHVybiBwcm9wO1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbG9jYWxlJykgfHwgZmFsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIFNoYWRvdyBET00gY29udGVudCBhcyBhIFZOb2RlLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIE1VU1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIER1cmluZyBTU1IsIHJlbmRlcmVkIGNvbnRlbnQgaXNcbiAgICogd3JhcHBlZCBpbiBhIDx0ZW1wbGF0ZSBzaGFkb3dyb290bW9kZT1cIm9wZW5cIj4gdGFnLiBEdXJpbmcgQ1NSLCBWTm9kZSB2YWx1ZXNcbiAgICogYXJlIHJlbmRlcmVkIHZpYSByZW5kZXJUb0RvbSgpIHdpdGggZXZlbnQgYmluZGluZyBhbmQgc2lnbmFsIHRyYWNraW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBWTm9kZSBmb3IgdGhlIHNoYWRvdyBET00gY29udGVudCwgb3IgbnVsbCBmb3IgZW1wdHkgY29udGVudC5cbiAgICovXG4gIHJlbmRlcigpOiBWTm9kZSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKiBPcGVuRWxlbWVudCBjb25zdHJ1Y3RvciB3aXRoIGZyYW1ld29yay1jb252ZW50aW9uIHN0YXRpYyBwcm9wZXJ0aWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRWxlbWVudENvbXBvbmVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgc3R5bGVzPzpcbiAgICB8IFN0eWxlU2hlZXRMaWtlXG4gICAgfCBTdHlsZVNoZWV0TGlrZVtdO1xuICB0YWdOYW1lPzogc3RyaW5nO1xuICByZW5kZXJNb2RlPzogJ3NoYWRvdycgfCAnbGlnaHQnO1xuICBvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThDQyxHQUVE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
|
|
424
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvZWxlbWVudCAtIE9wZW5FbGVtZW50IGJhc2UgY2xhc3MuXG4gKlxuICogWmVyby1kZXBlbmRlbmN5IEN1c3RvbSBFbGVtZW50IGJhc2UgY2xhc3MgcHJvdmlkaW5nOlxuICogICAtIERlY2xhcmF0aXZlIFNoYWRvdyBET00gKERTRCkgZGV0ZWN0aW9uIGF0IHVwZ3JhZGUgdGltZVxuICogICAtIENsaWVudC1TaWRlIFJlbmRlcmluZyAoQ1NSKSBmYWxsYmFjayB3aGVuIG5vIERTRCBjb250ZW50IGV4aXN0c1xuICogICAtIFN0eWxlU2hlZXQgKFNTUi1zYWZlIENTU1N0eWxlU2hlZXQpIHZpYSBhZG9wdGVkU3R5bGVTaGVldHNcbiAqICAgLSBEZWNsYXJhdGl2ZSBldmVudCBiaW5kaW5nIHZpYSBodG1sIHRlbXBsYXRlIEBjbGljayAvIEBrZXlkb3duIGV0Yy5cbiAqICAgLSBTaWduYWwtZHJpdmVuIGZpbmUtZ3JhaW5lZCBET00gcGF0Y2hpbmcgdmlhIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAqICAgLSBBYm9ydENvbnRyb2xsZXIgY2xlYW51cCBvbiBkaXNjb25uZWN0XG4gKiAgIC0gZm9ybUFzc29jaWF0ZWQgKyBkZWxlZ2F0ZXNGb2N1cyBzdXBwb3J0XG4gKlxuICogT3BlbkVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCBkaXJlY3RseSAtIFpFUk8gTGl0IGRlcGVuZGVuY3kuXG4gKiBDb21wb25lbnRzIHJldHVybiBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKlxuICogTGlmZWN5Y2xlOlxuICogICBTU1I6IGluc3RhbnRpYXRlIC0+IHNldCBwcm9wcyAtPiByZW5kZXIoKSAtPiB3cmFwIGluIERTRCB0ZW1wbGF0ZVxuICogICBDbGllbnQgKERTRCk6IGJyb3dzZXIgYXR0YWNoZXMgc2hhZG93IHJvb3QgZnJvbSBEU0QgLT4gdXBncmFkZSAtPiBiaW5kIHRlbXBsYXRlIGV2ZW50c1xuICogICBDbGllbnQgKENTUik6IGNvbm5lY3RlZENhbGxiYWNrIC0+IGNyZWF0ZVJlbmRlclJvb3QgLT4gcmVuZGVyIGludG8gc2hhZG93Um9vdFxuICpcbiAqIFVzYWdlIChzdGF0aWMgRFNEIGNvbXBvbmVudCk6XG4gKiBgYGB0c1xuICogY2xhc3MgTXlDYXJkIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICBzdGF0aWMgc3R5bGVzID0gbXlTdHlsZVNoZWV0O1xuICogICByZW5kZXIoKTogVk5vZGUge1xuICogICAgIHJldHVybiA8ZGl2IGNsYXNzPVwiY2FyZFwiPjxzbG90IC8+PC9kaXY+O1xuICogICB9XG4gKiB9XG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWNhcmQnLCBNeUNhcmQpO1xuICogYGBgXG4gKlxuICogVXNhZ2UgKHJlYWN0aXZlIERTRCBjb21wb25lbnQpOlxuICogYGBgdHNcbiAqIGNsYXNzIE15VG9nZ2xlIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICAjYWN0aXZlID0gc2lnbmFsKGZhbHNlKTtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiAoXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHRoaXMuI2FjdGl2ZS52YWx1ZSA9ICF0aGlzLiNhY3RpdmUudmFsdWV9PlxuICogICAgICAgICB7dGhpcy4jYWN0aXZlLnZhbHVlID8gJ09OJyA6ICdPRkYnfVxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSBAb3BlbmVsZW1lbnQvZWxlbWVudC9vcGVuLWVsZW1lbnRcbiAqL1xuXG5pbXBvcnQgeyBmb3JtYXRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3N0eWxlLXNoZWV0JztcbmltcG9ydCB7XG4gIGRpc3Bvc2VTdGF0aWNQcm9wcyxcbiAgaGFuZGxlU3RhdGljUHJvcEF0dHJpYnV0ZUNoYW5nZSxcbiAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzLFxuICBzeW5jU3RhdGljUHJvcHNGcm9tQXR0cmlidXRlcyxcbn0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvcHJvcCc7XG5pbXBvcnQgdHlwZSB7IFZOb2RlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3Zub2RlJztcbmltcG9ydCB0eXBlIHsgU2lnbmFsIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3NpZ25hbCc7XG5pbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAb3BlbmVsZW1lbnQvc2lnbmFsJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2xvZ2dlcic7XG5pbXBvcnQgeyBIeWRyYXRpb25TY29wZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2h5ZHJhdGUnO1xuaW1wb3J0IHtcbiAgcmVuZGVyRXJyb3JGYWxsYmFjayxcbiAgcmVuZGVySW50b0xpZ2h0RG9tLFxuICByZW5kZXJJbnRvU2hhZG93Um9vdCxcbn0gZnJvbSAnLi9vcGVuLWVsZW1lbnQtcmVuZGVyLmpzJztcbmltcG9ydCB7IGh5ZHJhdGVFeGlzdGluZ0RvbSB9IGZyb20gJy4vb3Blbi1lbGVtZW50LWh5ZHJhdGlvbi5qcyc7XG5cbi8qKlxuICogU1NSLXNhZmUgYmFzZSBjbGFzcyBmb3IgT3BlbkVsZW1lbnQuXG4gKlxuICogSW4gYnJvd3NlcjogZXh0ZW5kcyBIVE1MRWxlbWVudCBkaXJlY3RseS5cbiAqIEluIFNTUjogYXNzaWducyBhIG1pbmltYWwgc3R1YiB0byBnbG9iYWxUaGlzLkhUTUxFbGVtZW50IHNvIHRoZSBlbnRpcmVcbiAqIGRlcGVuZGVuY3kgZ3JhcGggc2hhcmVzIHRoZSBzYW1lIGJhc2UgY2xhc3MuXG4gKi9cbmNvbnN0IF9CYXNlID0gdHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyA/IEhUTUxFbGVtZW50IDogKGNsYXNzIHtcbiAgaGFzQXR0cmlidXRlKF9uYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0QXR0cmlidXRlKF9uYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzZXRBdHRyaWJ1dGUoX25hbWU6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpOiB2b2lkIHt9XG4gIHJlbW92ZUF0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogdm9pZCB7fVxuICBnZXQgdGFnTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBnZXQgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IGFzIHVua25vd24gYXMgdHlwZW9mIEhUTUxFbGVtZW50KTtcblxuLy8gSW4gU1NSLCBhc3NpZ24gZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCBzbyBvdGhlciBjb2RlIGNhbiByZWZlcmVuY2UgaXRcbmlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gIChnbG9iYWxUaGlzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5IVE1MRWxlbWVudCA9IF9CYXNlO1xufVxuXG4vKipcbiAqIFplcm8tZGVwZW5kZW5jeSBDdXN0b20gRWxlbWVudCBiYXNlIGNsYXNzIGZvciBEU0QgcmVuZGVyaW5nLlxuICpcbiAqIFByb3ZpZGVzIERTRCBkZXRlY3Rpb24sIENTUiBmYWxsYmFjaywgZXZlbnQgaHlkcmF0aW9uLCBhbmQgc3R5bGUgbWFuYWdlbWVudFxuICogd2l0aG91dCBhbnkgZnJhbWV3b3JrIGRlcGVuZGVuY3kgKG5vIExpdCwgbm8gcmVhY3RpdmUtZWxlbWVudCkuXG4gKlxuICogU3ViY2xhc3NlcyBNVVNUIG92ZXJyaWRlIGByZW5kZXIoKTogVk5vZGUgfCBudWxsYC5cbiAqL1xuZXhwb3J0IGNsYXNzIE9wZW5FbGVtZW50IGV4dGVuZHMgX0Jhc2Uge1xuICAvKiogQ29tcG9uZW50IHN0eWxlc2hlZXRzIChTU1Itc2FmZSAtIFN0eWxlU2hlZXQgZGVsZWdhdGVzIHRvIG5hdGl2ZSBDU1NTdHlsZVNoZWV0IGluIGJyb3dzZXIpLiAqL1xuICBzdGF0aWMgc3R5bGVzPzogU3R5bGVTaGVldExpa2UgfCBTdHlsZVNoZWV0TGlrZVtdO1xuXG4gIC8qKiBSZW5kZXJpbmcgbW9kZS4gRGVmYXVsdHMgdG8gc2hhZG93L0RTRDsgbGlnaHQgRE9NIGlzIGV4cGxpY2l0IG9wdC1pbi4gKi9cbiAgc3RhdGljIHJlbmRlck1vZGU/OiAnc2hhZG93JyB8ICdsaWdodCc7XG5cbiAgLyoqIHYwLjI1LjA6IFBhZ2UgaGVhZCBtZXRhZGF0YS4gU1NHIHJlYWRzIHRoaXMgdG8gaW5qZWN0IDx0aXRsZT4gYW5kIDxtZXRhPiB0YWdzLiAqL1xuICBzdGF0aWMgaGVhZD86IHsgdGl0bGU/OiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBvZ0ltYWdlPzogc3RyaW5nIH07XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgdXNlIG9wZW5QaXBlbGluZSh7IGlzbGFuZDogeyB1cGdyYWRlU3RyYXRlZ3kgfSB9KSBpbnN0ZWFkICovXG4gIHN0YXRpYyBjbGllbnQ/OiB7IHN0cmF0ZWd5PzogJ2xvYWQnIHwgJ2lkbGUnIHwgJ3Zpc2libGUnIHwgJ29ubHknIH07XG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMgdGhhdCB0cmlnZ2VyIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjay5cbiAgICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIHRvIGRlY2xhcmUgcmVhY3RpdmUgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxlZ2F0ZSBmb2N1cyB3aXRoaW4gdGhlIHNoYWRvdyByb290LlxuICAgKiBXaGVuIHRydWUsIGF0dGFjaFNoYWRvdyBpcyBjYWxsZWQgd2l0aCBgZGVsZWdhdGVzRm9jdXM6IHRydWVgLlxuICAgKi9cbiAgc3RhdGljIGRlbGVnYXRlc0ZvY3VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGVsZW1lbnQgcGFydGljaXBhdGVzIGluIGZvcm0gc3VibWlzc2lvbi5cbiAgICogV2hlbiB0cnVlLCBFbGVtZW50SW50ZXJuYWxzIGFyZSBhdHRhY2hlZCBpbiBjb25uZWN0ZWRDYWxsYmFjay5cbiAgICovXG4gIHN0YXRpYyBmb3JtQXNzb2NpYXRlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNpZ25hbCByZWdpc3RyeSBmb3IgYXR0cmlidXRlLWJhc2VkIGh5ZHJhdGlvbiAoQURSLTAwNjUpLlxuICAgKiBNYXBzIHNpZ25hbCBuYW1lcyDihpIgc2lnbmFsIG9iamVjdHMuIEJ1aWx0IGJ5IHJlZ2lzdGVyU2lnbmFsKClcbiAgICogaW4gY29tcG9uZW50IGNvbnN0cnVjdG9ycywgY29uc3VtZWQgZHVyaW5nIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogRXhwb3NlZCBpbnRlcm5hbGx5IGZvciByZW5kZXIgaGVscGVyIG1vZHVsZXMuXG4gICAqL1xuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogdjAuNDEuMC1hbHBoYS4yOiBIeWRyYXRpb24gbGlmZWN5Y2xlIHNjb3BlLlxuICAgKlxuICAgKiBSZXBsYWNlcyB0aGUgc2VwYXJhdGUgI2VmZmVjdERpc3Bvc2VycywgI2V2ZW50Q2xlYW51cHMsIGFuZCAjdm5vZGVDYWNoZVxuICAgKiBmaWVsZHMuIFRoZSBzY29wZSBpcyBvd25lZCBieSB0aGUgZWxlbWVudCBhbmQgZGlzcG9zZWQgb24gZGlzY29ubmVjdC5cbiAgICogSXQgaXMgZXhwb3NlZCB0byBAb3BlbmVsZW1lbnQvY29yZS9oeWRyYXRlIHNvIHRoZSBzYW1lIGxpZmVjeWNsZSBtb2RlbFxuICAgKiBjYW4gYmUgcmV1c2VkIGJ5IHRoaXJkLXBhcnR5IGZyYW1ld29yayBydW50aW1lcyBsYXRlci5cbiAgICpcbiAgICogSW5pdGlhbGl6ZWQgYWZ0ZXIgc2lnbmFsUmVnaXN0cnkgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIGF2b2lkIGZpZWxkLW9yZGVyXG4gICAqIGRlcGVuZGVuY3kgb24gY2xhc3MgZmllbGQgaW5pdGlhbGl6ZXIgc2VxdWVuY2luZy5cbiAgICovXG4gICNoeWRyYXRpb25TY29wZSE6IEh5ZHJhdGlvblNjb3BlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jaHlkcmF0aW9uU2NvcGUgPSBuZXcgSHlkcmF0aW9uU2NvcGUoe1xuICAgICAgc2lnbmFsUmVnaXN0cnk6IHRoaXMuc2lnbmFsUmVnaXN0cnksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQWJvcnRDb250cm9sbGVyIHRpZWQgdG8gZWxlbWVudCBsaWZlY3ljbGUuIEFib3J0ZWQgaW4gZGlzY29ubmVjdGVkQ2FsbGJhY2suICovXG4gICNsaWZlY3ljbGVBYm9ydD86IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBBYm9ydFNpZ25hbCB0aGF0IGlzIGFib3J0ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQuXG4gICAqIFVzZWZ1bCBmb3IgdHlpbmcgYXN5bmMgd29yayAoZmV0Y2gsIGV2ZW50IGxpc3RlbmVycykgdG8gZWxlbWVudCBsaWZlY3ljbGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2xpZmVjeWNsZVNpZ25hbCgpOiBBYm9ydFNpZ25hbCB7XG4gICAgaWYgKCF0aGlzLiNsaWZlY3ljbGVBYm9ydCkgdGhpcy4jbGlmZWN5Y2xlQWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIHRoaXMuI2xpZmVjeWNsZUFib3J0LnNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRUaW1lb3V0IHdyYXBwZXIgdGhhdCBhdXRvLWNsZWFycyB3aGVuIHRoZSBlbGVtZW50IGRpc2Nvbm5lY3RzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZXRUaW1lb3V0KGhhbmRsZXI6IFRpbWVySGFuZGxlciwgdGltZW91dD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlU2lnbmFsKCkuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBnbG9iYWxUaGlzLmNsZWFyVGltZW91dChpZCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlcXVlc3RBbmltYXRpb25GcmFtZSB3cmFwcGVyIHRoYXQgYXV0by1jYW5jZWxzIHdoZW4gdGhlIGVsZW1lbnQgZGlzY29ubmVjdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXIge1xuICAgIGNvbnN0IGlkID0gZ2xvYmFsVGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spO1xuICAgIHRoaXMuX2xpZmVjeWNsZVNpZ25hbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gZ2xvYmFsVGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZShpZCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgc2lnbmFsIGZvciBoeWRyYXRpb24gYnkgbmFtZS5cbiAgICogQ2FsbCBpbiBjb25zdHJ1Y3RvcjogdGhpcy5yZWdpc3RlclNpZ25hbCgnY291bnQnLCB0aGlzLiNjb3VudCk7XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJTaWduYWwobmFtZTogc3RyaW5nLCBzaWc6IFNpZ25hbDx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2lnbmFsUmVnaXN0cnkuc2V0KG5hbWUsIHNpZyk7XG4gIH1cblxuICAvKiogUmVhY3RpdmUgcm91dGUgcGFyYW1ldGVycyBTaWduYWwuIFVwZGF0ZXMgYXV0b21hdGljYWxseSBvbiBTUEEgbmF2aWdhdGlvbi4gKi9cbiAgI3BhcmFtcyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XG5cbiAgLyoqIFJlYWN0aXZlIHJvdXRlIHBhcmFtZXRlcnMuIFVwZGF0ZXMgYXV0b21hdGljYWxseSBvbiBTUEEgbmF2aWdhdGlvbi4gKi9cbiAgZ2V0IHBhcmFtcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy4jcGFyYW1zLnZhbHVlO1xuICB9XG5cbiAgc2V0IHBhcmFtcyh2YWx1ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIHRoaXMuI3BhcmFtcy52YWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgfVxuXG4gIC8qKiBFbGVtZW50SW50ZXJuYWxzIGZvciBmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRzICovXG4gIHByb3RlY3RlZCBfaW50ZXJuYWxzPzogRWxlbWVudEludGVybmFscztcblxuICAvKipcbiAgICogQ3JlYXRlIG9yIHJldXNlIHRoZSBzaGFkb3cgcm9vdC5cbiAgICpcbiAgICogRFNEIGRldGVjdGlvbjogaWYgYHRoaXMuc2hhZG93Um9vdGAgYWxyZWFkeSBleGlzdHMgYW5kIGhhcyBub2RlcyxcbiAgICogdGhlIGJyb3dzZXIgcHJlLXBvcHVsYXRlZCBpdCBmcm9tIGEgPHRlbXBsYXRlIHNoYWRvd3Jvb3Rtb2RlPiB0YWcuXG4gICAqIEluIHRoYXQgY2FzZSB3ZSBtYXJrIGBfZHNkSHlkcmF0ZWQgPSB0cnVlYCBhbmQgcmV0dXJuIHRoZSBleGlzdGluZyByb290LlxuICAgKlxuICAgKiBDU1IgZmFsbGJhY2s6IGlmIG5vIHNoYWRvdyByb290IGV4aXN0cywgd2UgY2FsbCBgYXR0YWNoU2hhZG93KClgLiBJZiBhblxuICAgKiBlbXB0eSBzaGFkb3cgcm9vdCBhbHJlYWR5IGV4aXN0cywgd2UgcmV1c2UgaXQgYW5kIGxldCBjb25uZWN0ZWRDYWxsYmFjaygpXG4gICAqIHBvcHVsYXRlIGl0IGZyb20gcmVuZGVyKCkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBleGlzdGluZyBvciBuZXdseSBjcmVhdGVkIFNoYWRvd1Jvb3QuXG4gICAqL1xuICBjcmVhdGVSZW5kZXJSb290KCk6IFNoYWRvd1Jvb3QgfCB0aGlzIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgaWYgKGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRFNEIHByZS1wb3B1bGF0ZWQgc2hhZG93IHJvb3QgZGV0ZWN0aW9uXG4gICAgaWYgKHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgdGhpcy5fYXBwbHlTdHlsZXMoY3RvciwgdGhpcy5zaGFkb3dSb290KTtcbiAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgfVxuXG4gICAgLy8gQ1NSOiBjcmVhdGUgYSBuZXcgc2hhZG93IHJvb3RcbiAgICBjb25zdCBkZWxlZ2F0ZXNGb2N1cyA9IGN0b3IuZGVsZWdhdGVzRm9jdXMgPz8gZmFsc2U7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nLCBkZWxlZ2F0ZXNGb2N1cyB9KTtcblxuICAgIC8vIEFwcGx5IHN0YXRpYyBzdHlsZXMgdmlhIGFkb3B0ZWRTdHlsZVNoZWV0c1xuICAgIHRoaXMuX2FwcGx5U3R5bGVzKGN0b3IsIHJvb3QpO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgc3RhdGljIHN0eWxlcyB0byB0aGUgc2hhZG93IHJvb3QgdmlhIGFkb3B0ZWRTdHlsZVNoZWV0cy5cbiAgICogU2hhcmVkIGJldHdlZW4gQ1NSIChjcmVhdGVSZW5kZXJSb290KSBhbmQgRFNEIChjb25uZWN0ZWRDYWxsYmFjaykgcGF0aHMuXG4gICAqL1xuICBwcml2YXRlIF9hcHBseVN0eWxlcyhjdG9yOiB0eXBlb2YgT3BlbkVsZW1lbnQsIHJvb3Q/OiBTaGFkb3dSb290KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gcm9vdCA/PyB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgaWYgKCF0YXJnZXQgfHwgIWN0b3Iuc3R5bGVzKSByZXR1cm47XG4gICAgY29uc3Qgc2hlZXRzID0gQXJyYXkuaXNBcnJheShjdG9yLnN0eWxlcykgPyBjdG9yLnN0eWxlcyA6IFtjdG9yLnN0eWxlc107XG4gICAgaWYgKHNoZWV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBTdHlsZVNoZWV0IGRlbGVnYXRlcyB0byBuYXRpdmUgQ1NTU3R5bGVTaGVldCBpbiBicm93c2VyXG4gICAgICAvLyB0eXBlLWVzY2FwZTogYWRvcHRlZFN0eWxlU2hlZXRzIG1heSBub3QgYmUgaW4gdGhlIGNvbmZpZ3VyZWQgRE9NIGxpYlxuICAgICAgKHRhcmdldCBhcyB1bmtub3duIGFzIHsgYWRvcHRlZFN0eWxlU2hlZXRzOiB0eXBlb2Ygc2hlZXRzIH0pLmFkb3B0ZWRTdHlsZVNoZWV0cyA9IHNoZWV0cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlOiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICpcbiAgICogRFNEIHBhdGggKF9kc2RIeWRyYXRlZCA9IHRydWUpOlxuICAgKiAgIC0gQ2FsbHMgX2h5ZHJhdGVFdmVudHMoKSB0byBiaW5kIGRlY2xhcmF0aXZlIGV2ZW50cyBvbiBleGlzdGluZyBET00uXG4gICAqXG4gICAqIENTUiBwYXRoIChfZHNkSHlkcmF0ZWQgPSBmYWxzZSk6XG4gICAqICAgLSBDYWxscyBjcmVhdGVSZW5kZXJSb290KCkgaWYgbm8gc2hhZG93IHJvb3QgZXhpc3RzLlxuICAgKiAgIC0gUmVuZGVycyB0aGlzLnJlbmRlcigpIHRocm91Z2ggdGhlIFZOb2RlIERPTSByZW5kZXJlci5cbiAgICpcbiAgICogSWYgZm9ybUFzc29jaWF0ZWQgaXMgdHJ1ZSwgRWxlbWVudEludGVybmFscyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG5cbiAgICAvLyB2MC4yNC4xIChBRFItMDA1Nyk6IEluaXRpYWxpemUgc3RhdGljIHByb3BzIHNpZ25hbHMgYW5kIGFjY2Vzc29yc1xuICAgIGluaXRpYWxpemVTdGF0aWNQcm9wcyh0aGlzKTtcbiAgICBzeW5jU3RhdGljUHJvcHNGcm9tQXR0cmlidXRlcyh0aGlzKTtcblxuICAgIGNvbnN0IGlzTGlnaHREb20gPSBjdG9yLnJlbmRlck1vZGUgPT09ICdsaWdodCc7XG5cbiAgICAvLyBFbnN1cmUgcmVuZGVyIHRhcmdldCBleGlzdHMgYW5kIGRldGVjdCBEU0QgcHJlLXBvcHVsYXRpb25cbiAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCAmJiAhaXNMaWdodERvbSkge1xuICAgICAgdGhpcy5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgIC8vIERTRCBwYXRoOiBzaGFkb3cgcm9vdCBhbHJlYWR5IHBvcHVsYXRlZC5cbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhjdG9yKTtcbiAgICB9XG5cbiAgICAvLyBTeW5jIGRhdGEtdGhlbWUgZnJvbSBkb2N1bWVudCByb290XG4gICAgY29uc3QgZG9jVGhlbWUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LmRhdGFzZXQ/LnRoZW1lO1xuICAgIGlmIChkb2NUaGVtZSAmJiAhdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnKSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCBkb2NUaGVtZSk7XG4gICAgfVxuXG4gICAgLy8gVEctMDE6IFJlYWQgcm91dGUgcGFyYW1zIGZyb20gYXR0cmlidXRlIGlmIHByZXNlbnQuXG4gICAgLy8gKFNTUi9TU0cgaW5qZWN0cyBwYXJhbXMgYXMgSlMgcHJvcGVydHkgdmlhIGluamVjdFByb3BzIOKAlCBzZXR0ZXIgaGFuZGxlcyBpdClcbiAgICBjb25zdCBhdHRyUGFyYW1zID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3BhcmFtcycpO1xuICAgIGlmIChhdHRyUGFyYW1zKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLiNwYXJhbXMudmFsdWUgPSBKU09OLnBhcnNlKGF0dHJQYXJhbXMpO1xuICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSBtYWxmb3JtZWQgSlNPTiAqLyB9XG4gICAgfVxuXG4gICAgLy8gdjAuMjUuMCAoU09QLTAxMik6IFVuaWZpZWQgcmVuZGVyIHBhdGgg4oCUIERTRCBhbmQgQ1NSIGJvdGggZ28gdGhyb3VnaFxuICAgIC8vIF9yZW5kZXJPckh5ZHJhdGUoKS4gVGhlIF9kc2RIeWRyYXRlZCBmbGFnIGFuZCBfYmluZEN1cnJlbnRSZW5kZXJUZW1wbGF0ZSgpXG4gICAgLy8gYXJlIHJlbW92ZWQuIERTRCBwcmUtcG9wdWxhdGVkIERPTSBpcyBwcmVzZXJ2ZWQ7IG9ubHkgZXZlbnRzIGFuZCBzaWduYWxcbiAgICAvLyBzdWJzY3JpcHRpb25zIGFyZSBhZGRlZC5cbiAgICB0aGlzLl9yZW5kZXJPckh5ZHJhdGUoKTtcblxuICAgIC8vIHYwLjQwLjA6IENsaWVudC1zaWRlIGFjdGl2YXRpb24gaG9vayBmb3IgZnJhbWV3b3JrIGh5ZHJhdGlvblxuICAgIHRoaXMuY2xpZW50QWN0aXZhdGUoKTtcblxuICAgIC8vIEF0dGFjaCBFbGVtZW50SW50ZXJuYWxzIGZvciBmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRzXG4gICAgaWYgKGN0b3IuZm9ybUFzc29jaWF0ZWQgJiYgdHlwZW9mIHRoaXMuYXR0YWNoSW50ZXJuYWxzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yNS4wIChTT1AtMDEyKTogVW5pZmllZCByZW5kZXIgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgX3JlbmRlck9ySHlkcmF0ZSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3RvciA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9wZW5FbGVtZW50O1xuICAgICAgaWYgKGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRvTGlnaHREb20oKTtcbiAgICAgICAgdGhpcy5vbkNzclJlbmRlcmVkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNEc2QgPSB0aGlzLnNoYWRvd1Jvb3QgJiYgdGhpcy5zaGFkb3dSb290LmNoaWxkTm9kZXMubGVuZ3RoID4gMDtcbiAgICAgIGlmIChpc0RzZCkge1xuICAgICAgICAvLyBEU0Q6IERPTSBhbHJlYWR5IGNvcnJlY3Qg4oCUIGJpbmQgZXZlbnRzIHZpYSBWTm9kZSB3YWxrXG4gICAgICAgIHRoaXMuX2h5ZHJhdGVFeGlzdGluZ0RvbSgpO1xuICAgICAgICB0aGlzLm9uRHNkSHlkcmF0ZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIC8vIENTUjogZnVsbCByZW5kZXIgZnJvbSBWTm9kZVxuICAgICAgICB0aGlzLl9yZW5kZXJJbnRvU2hhZG93Um9vdCgpO1xuICAgICAgICB0aGlzLm9uQ3NyUmVuZGVyZWQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX3JlbmRlckVycm9yRmFsbGJhY2soZXJyKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEh5ZHJhdGUgRFNEIERPTSB3aXRoIHNpZ25hbCBhbmQgZXZlbnQgYmluZGluZ3MuXG4gICAqXG4gICAqIHYwLjI4IChBRFItMDA2Nyk6IFJlcGxhY2VzIF93YWxrQW5kQmluZCBwb3NpdGlvbiBtYXRjaGluZy5cbiAgICpcbiAgICogSW1wbGVtZW50YXRpb24gbGl2ZXMgaW4gb3Blbi1lbGVtZW50LWh5ZHJhdGlvbi50cy5cbiAgICovXG4gIHByaXZhdGUgX2h5ZHJhdGVFeGlzdGluZ0RvbSgpOiB2b2lkIHtcbiAgICBoeWRyYXRlRXhpc3RpbmdEb20odGhpcywgdGhpcy4jaHlkcmF0aW9uU2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHYwLjIzLjA6IEhvb2sgY2FsbGVkIGFmdGVyIERTRCBoeWRyYXRpb24gY29tcGxldGVzLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGZyYWdpbGVcbiAgICogYHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKClgIGNhbGwgb3JkZXIuIEF0IHRoaXMgcG9pbnQgdGhlXG4gICAqIHNoYWRvdyBET00gaXMgcG9wdWxhdGVkIGZyb20gRFNEIGFuZCBkZWNsYXJhdGl2ZSBldmVudHNcbiAgICogKEBjbGljaywgQGtleWRvd24pIGFyZSBib3VuZC5cbiAgICpcbiAgICogTm8tb3AgYnkgZGVmYXVsdC5cbiAgICovXG4gIHByb3RlY3RlZCBvbkRzZEh5ZHJhdGVkKCk6IHZvaWQge31cblxuICAvKipcbiAgICogdjAuMjMuMDogSG9vayBjYWxsZWQgYWZ0ZXIgQ1NSIGZpcnN0IHJlbmRlciBjb21wbGV0ZXMuXG4gICAqXG4gICAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBmb3IgcG9zdC1yZW5kZXIgaW5pdGlhbGl6YXRpb25cbiAgICogdGhhdCBkZXBlbmRzIG9uIHRoZSBzaGFkb3cgRE9NIGJlaW5nIHBvcHVsYXRlZC4gQXQgdGhpc1xuICAgKiBwb2ludCByZW5kZXIoKSBoYXMgYmVlbiBjYWxsZWQgYW5kIGRlY2xhcmF0aXZlIGV2ZW50c1xuICAgKiBhcmUgYm91bmQuXG4gICAqXG4gICAqIE5vLW9wIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Dc3JSZW5kZXJlZCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIHYwLjQwLjA6IENsaWVudC1zaWRlIGFjdGl2YXRpb24gaG9vay5cbiAgICpcbiAgICogQ2FsbGVkIG9uY2UgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkLCB0aGUgc2hhZG93IHJvb3RcbiAgICogaXMgcmVhZHksIGFuZCBhbnkgRFNEIGh5ZHJhdGlvbiBvciBDU1IgcmVuZGVyaW5nIGhhcyBjb21wbGV0ZWQuXG4gICAqIFRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlIGZvciBmcmFtZXdvcmsgaHlkcmF0aW9uIChQcmVhY3QsIFJlYWN0LFxuICAgKiBWdWUsIExpdCkgdG8gdGFrZSBvdmVyIHRoZSBzaGFkb3cgcm9vdC5cbiAgICpcbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG9cbiAgICogaHlkcmF0ZSBvciByZW5kZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMgaW50byB0aGUgc2hhZG93IHJvb3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2xpZW50QWN0aXZhdGUoKTogdm9pZCB7XG4gICAgLy8gZGVmYXVsdCBuby1vcFxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHdoZW4gdGhlIHVuaWZpZWQgY2xpZW50IHJlbmRlci9oeWRyYXRlIHBhdGggdGhyb3dzLlxuICAgKiBTdWJjbGFzc2VzIG1heSByZXR1cm4gYSBWTm9kZSBmYWxsYmFjay5cbiAgICovXG4gIHByb3RlY3RlZCBvblJlbmRlckVycm9yKGVycm9yOiB1bmtub3duKTogVk5vZGUgfCBudWxsIHtcbiAgICBjcmVhdGVMb2dnZXIoJ2RzZCcpLmVycm9yKFxuICAgICAgYDwke3RoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gcmVuZGVyL2h5ZHJhdGUgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGVycm9yKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJFcnJvckZhbGxiYWNrKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgcmVuZGVyRXJyb3JGYWxsYmFjayhcbiAgICAgIHRoaXMsXG4gICAgICBlcnJvcixcbiAgICAgIHRoaXMuI2h5ZHJhdGlvblNjb3BlLFxuICAgICAgKGVycikgPT4gdGhpcy5vblJlbmRlckVycm9yKGVyciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00uXG4gICAqIEFib3J0cyBhbGwgaHlkcmF0aW9uIGV2ZW50IGxpc3RlbmVycyBmb3IgY2xlYW51cC5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuI2h5ZHJhdGlvblNjb3BlLmRpc3Bvc2UoKTtcbiAgICBkaXNwb3NlU3RhdGljUHJvcHModGhpcyk7XG4gICAgdGhpcy4jbGlmZWN5Y2xlQWJvcnQ/LmFib3J0KCk7XG4gICAgdGhpcy4jbGlmZWN5Y2xlQWJvcnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyB2MC4yOCAoQURSLTAwNjcpOiBFZmZlY3QgKyBldmVudCBsaWZlY3ljbGUgbWFuYWdlZCBieSBIeWRyYXRpb25TY29wZS5cbiAgLy8gX3dhbGtBbmRCaW5kIERFTEVURUQg4oCUIHJlcGxhY2VkIGJ5IF9oeWRyYXRlRXhpc3RpbmdEb20oKS5cblxuICAvKipcbiAgICogTGlmZWN5Y2xlOiBjYWxsZWQgd2hlbiBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUgY2hhbmdlcy5cbiAgICpcbiAgICogQmFzZSBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gcmVhY3RcbiAgICogdG8gYXR0cmlidXRlIGNoYW5nZXMsIHR5cGljYWxseSBieSBjYWxsaW5nIGB0aGlzLnJlbmRlcigpYCB0byB1cGRhdGVcbiAgICogdGhlIHNoYWRvdyBET00uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQXR0cmlidXRlIG5hbWUgKGxvd2VyY2FzZSkuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSAtIFByZXZpb3VzIHZhbHVlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIF9uYW1lOiBzdHJpbmcsXG4gICAgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgIF9uZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gdjAuMjQuMSAoQURSLTAwNTcpOiBSb3V0ZSB0byBzdGF0aWMgcHJvcHMgaGFuZGxlclxuICAgIGhhbmRsZVN0YXRpY1Byb3BBdHRyaWJ1dGVDaGFuZ2UoXG4gICAgICB0aGlzLFxuICAgICAgX25hbWUsXG4gICAgICBfb2xkVmFsdWUsXG4gICAgICBfbmV3VmFsdWUsXG4gICAgKTtcbiAgICAvLyBTdWJjbGFzcyBvdmVycmlkZSBwb2ludCAtIGJhc2UgaW1wbGVtZW50YXRpb24gaXMgaW50ZW50aW9uYWxseSBlbXB0eS5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZW5kZXIgdGhlIHNoYWRvdyBET00gZnJvbSBgcmVuZGVyKClgIGFuZCByZS1iaW5kIGRlY2xhcmF0aXZlIGV2ZW50cy5cbiAgICpcbiAgICogT3BlbkVsZW1lbnQgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBpbmNsdWRlIGEgcmVhY3RpdmUgc2NoZWR1bGVyLiBDb21wb25lbnRzXG4gICAqIHdpdGggbG9jYWwgc3RhdGUgY2FuIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mXG4gICAqIGR1cGxpY2F0aW5nIHJlbmRlclRvRG9tKCkgYW5kIGV2ZW50IGh5ZHJhdGlvbi5cbiAgICovXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgaWYgKGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgdGhpcy5fcmVuZGVySW50b0xpZ2h0RG9tKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RpdmVDb250cm9sbGVyLWNvbXBhdGlibGUgdXBkYXRlIGhvb2suXG4gICAqXG4gICAqIEFzeW5jIHN0YXRlIGNvbnRyb2xsZXJzIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBzdGF0ZSBjaGFuZ2VzLiBLZWVwaW5nIHRoaXNcbiAgICogdGlueSBhbGlhcyBsZXRzIE9wZW5FbGVtZW50IGhvc3QgY29udHJvbGxlcnMgd2l0aG91dCBpbmhlcml0aW5nIExpdCBvciBhXG4gICAqIHNjaGVkdWxlci5cbiAgICovXG4gIHJlcXVlc3RVcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckludG9MaWdodERvbSgpOiB2b2lkIHtcbiAgICByZW5kZXJJbnRvTGlnaHREb20odGhpcywgdGhpcy4jaHlkcmF0aW9uU2NvcGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW50b1NoYWRvd1Jvb3QoKTogdm9pZCB7XG4gICAgcmVuZGVySW50b1NoYWRvd1Jvb3QodGhpcywgdGhpcy4jaHlkcmF0aW9uU2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgbG9jYWxlIGZyb20gSlMgcHJvcGVydHkgKHNldCBieSBTU1IgaW5qZWN0UHJvcHMpIGZpcnN0LFxuICAgKiB0aGVuIEhUTUwgYXR0cmlidXRlLCB0aGVuIGZhbGxiYWNrIHRvIHByb3ZpZGVkIGRlZmF1bHQuXG4gICAqXG4gICAqIFNTUiBpbmplY3RQcm9wcygpIHNldHMgY2FtZWxDYXNlIEpTIHByb3BlcnRpZXMgKGUuZy4gdGhpcy5sb2NhbGUgPSAnZW4nKVxuICAgKiBidXQgZ2V0QXR0cmlidXRlKCkgb25seSByZWFkcyBIVE1MIGF0dHJpYnV0ZXMsIHdoaWNoIHJlbWFpbiBudWxsLlxuICAgKiBUaGlzIG1ldGhvZCByZXNvbHZlcyB0aGUgbWlzbWF0Y2ggYnkgY2hlY2tpbmcgSlMgcHJvcGVydHkgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIERlZmF1bHQgdmFsdWUgd2hlbiBuZWl0aGVyIHNvdXJjZSBoYXMgYSB2YWx1ZS4gRGVmYXVsdHMgdG8gJ2VuJy5cbiAgICovXG4gIHByb3RlY3RlZCBfZ2V0TG9jYWxlKGZhbGxiYWNrID0gJ2VuJyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvcCA9ICh0aGlzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5sb2NhbGU7XG4gICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wKSByZXR1cm4gcHJvcDtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2xvY2FsZScpIHx8IGZhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBTaGFkb3cgRE9NIGNvbnRlbnQgYXMgYSBWTm9kZS5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBNVVNUIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBEdXJpbmcgU1NSLCByZW5kZXJlZCBjb250ZW50IGlzXG4gICAqIHdyYXBwZWQgaW4gYSA8dGVtcGxhdGUgc2hhZG93cm9vdG1vZGU9XCJvcGVuXCI+IHRhZy4gRHVyaW5nIENTUiwgVk5vZGUgdmFsdWVzXG4gICAqIGFyZSByZW5kZXJlZCB2aWEgcmVuZGVyVG9Eb20oKSB3aXRoIGV2ZW50IGJpbmRpbmcgYW5kIHNpZ25hbCB0cmFja2luZy5cbiAgICpcbiAgICogQHJldHVybnMgVk5vZGUgZm9yIHRoZSBzaGFkb3cgRE9NIGNvbnRlbnQsIG9yIG51bGwgZm9yIGVtcHR5IGNvbnRlbnQuXG4gICAqL1xuICByZW5kZXIoKTogVk5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKiogT3BlbkVsZW1lbnQgY29uc3RydWN0b3Igd2l0aCBmcmFtZXdvcmstY29udmVudGlvbiBzdGF0aWMgcHJvcGVydGllcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkVsZW1lbnRDb21wb25lbnRDb25zdHJ1Y3RvciBleHRlbmRzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvciB7XG4gIHN0eWxlcz86XG4gICAgfCBTdHlsZVNoZWV0TGlrZVxuICAgIHwgU3R5bGVTaGVldExpa2VbXTtcbiAgdGFnTmFtZT86IHN0cmluZztcbiAgcmVuZGVyTW9kZT86ICdzaGFkb3cnIHwgJ2xpZ2h0JztcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4Q0MsR0FFRCxTQUFTLFdBQVcsUUFBUSwyQkFBMkI7QUFFdkQsU0FDRSxrQkFBa0IsRUFDbEIsK0JBQStCLEVBQy9CLHFCQUFxQixFQUNyQiw2QkFBNkIsUUFDeEIseUJBQXlCO0FBR2hDLFNBQVMsTUFBTSxRQUFRLHNCQUFzQjtBQUM3QyxTQUFTLFlBQVksUUFBUSwyQkFBMkI7QUFDeEQsU0FBUyxjQUFjLFFBQVEsNEJBQTRCO0FBQzNELFNBQ0UsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixvQkFBb0IsUUFDZiwyQkFBMkI7QUFDbEMsU0FBUyxrQkFBa0IsUUFBUSw4QkFBOEI7QUFFakU7Ozs7OztDQU1DLEdB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
|