angular-three 2.0.0-beta.2 → 2.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -147
- package/esm2022/angular-three.mjs +1 -1
- package/esm2022/index.mjs +11 -10
- package/esm2022/lib/before-render.mjs +13 -0
- package/esm2022/lib/canvas.mjs +130 -161
- package/esm2022/lib/directives/args.mjs +13 -11
- package/esm2022/lib/directives/common.mjs +29 -27
- package/esm2022/lib/directives/key.mjs +29 -0
- package/esm2022/lib/directives/parent.mjs +13 -11
- package/esm2022/lib/directives/repeat.mjs +5 -6
- package/esm2022/lib/dom/events.mjs +6 -1
- package/esm2022/lib/events.mjs +75 -58
- package/esm2022/lib/instance.mjs +65 -0
- package/esm2022/lib/loader.mjs +30 -37
- package/esm2022/lib/loop.mjs +6 -3
- package/esm2022/lib/portal.mjs +91 -102
- package/esm2022/lib/ref.mjs +48 -0
- package/esm2022/lib/renderer/catalogue.mjs +7 -0
- package/esm2022/lib/renderer/constants.mjs +21 -0
- package/esm2022/lib/renderer/index.mjs +419 -0
- package/esm2022/lib/renderer/store.mjs +144 -108
- package/esm2022/lib/renderer/utils.mjs +63 -48
- package/esm2022/lib/roots.mjs +249 -0
- package/esm2022/lib/routed-scene.mjs +11 -8
- package/esm2022/lib/store.mjs +207 -0
- package/esm2022/lib/three-types.mjs +2 -2
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/apply-props.mjs +23 -11
- package/esm2022/lib/utils/assert-injection-context.mjs +14 -0
- package/esm2022/lib/utils/attach.mjs +2 -2
- package/esm2022/lib/utils/create-injection-token.mjs +47 -0
- package/esm2022/lib/utils/is.mjs +1 -1
- package/esm2022/lib/utils/make.mjs +1 -1
- package/esm2022/lib/utils/safe-detect-changes.mjs +15 -13
- package/esm2022/lib/utils/signal-store.mjs +91 -0
- package/esm2022/lib/utils/update.mjs +1 -1
- package/fesm2022/angular-three.mjs +1770 -1589
- package/fesm2022/angular-three.mjs.map +1 -1
- package/index.d.ts +10 -9
- package/lib/{di/before-render.d.ts → before-render.d.ts} +1 -1
- package/lib/canvas.d.ts +81 -11
- package/lib/directives/args.d.ts +2 -2
- package/lib/directives/common.d.ts +5 -1
- package/lib/directives/key.d.ts +10 -0
- package/lib/directives/parent.d.ts +5 -5
- package/lib/dom/events.d.ts +3 -2
- package/lib/events.d.ts +78 -2
- package/lib/instance.d.ts +36 -0
- package/lib/loader.d.ts +13 -2
- package/lib/loop.d.ts +64 -6
- package/lib/portal.d.ts +20 -12
- package/lib/{di/ref.d.ts → ref.d.ts} +3 -2
- package/lib/renderer/catalogue.d.ts +9 -0
- package/lib/renderer/constants.d.ts +20 -0
- package/lib/renderer/index.d.ts +5 -0
- package/lib/renderer/store.d.ts +19 -15
- package/lib/renderer/utils.d.ts +28 -18
- package/lib/roots.d.ts +11 -0
- package/lib/routed-scene.d.ts +1 -1
- package/lib/store.d.ts +143 -0
- package/lib/three-types.d.ts +6 -6
- package/lib/types.d.ts +1 -309
- package/lib/utils/apply-props.d.ts +4 -2
- package/lib/utils/attach.d.ts +5 -3
- package/lib/utils/create-injection-token.d.ts +27 -0
- package/lib/utils/is.d.ts +4 -3
- package/lib/utils/make.d.ts +12 -1
- package/lib/utils/safe-detect-changes.d.ts +2 -2
- package/lib/utils/signal-store.d.ts +17 -0
- package/lib/utils/update.d.ts +1 -1
- package/metadata.json +1 -1
- package/package.json +5 -4
- package/plugin/generators.json +47 -17
- package/plugin/package.json +2 -5
- package/plugin/src/generators/init/compat.d.ts +3 -1
- package/plugin/src/generators/init/compat.js +2 -2
- package/plugin/src/generators/init/compat.js.map +1 -1
- package/plugin/src/generators/init/files/experience/experience.component.html.__tmpl__ +4 -0
- package/plugin/src/generators/init/files/experience/experience.component.ts.__tmpl__ +17 -0
- package/plugin/src/generators/init/generator.d.ts +6 -0
- package/plugin/src/generators/init/generator.js +144 -0
- package/plugin/src/generators/init/generator.js.map +1 -0
- package/plugin/src/generators/init/schema.json +15 -4
- package/plugin/src/generators/init-cannon/compat.d.ts +2 -0
- package/plugin/src/generators/init-cannon/compat.js +6 -0
- package/plugin/src/generators/init-cannon/compat.js.map +1 -0
- package/plugin/src/generators/init-cannon/generator.d.ts +2 -0
- package/plugin/src/generators/init-cannon/generator.js +22 -0
- package/plugin/src/generators/init-cannon/generator.js.map +1 -0
- package/plugin/src/generators/init-cannon/schema.json +6 -0
- package/plugin/src/generators/init-postprocessing/compat.d.ts +2 -0
- package/plugin/src/generators/init-postprocessing/compat.js +6 -0
- package/plugin/src/generators/init-postprocessing/compat.js.map +1 -0
- package/plugin/src/generators/init-postprocessing/generator.d.ts +2 -0
- package/plugin/src/generators/init-postprocessing/generator.js +20 -0
- package/plugin/src/generators/init-postprocessing/generator.js.map +1 -0
- package/plugin/src/generators/init-postprocessing/schema.json +6 -0
- package/plugin/src/generators/init-soba/compat.d.ts +2 -0
- package/plugin/src/generators/init-soba/compat.js +6 -0
- package/plugin/src/generators/init-soba/compat.js.map +1 -0
- package/plugin/src/generators/init-soba/generator.d.ts +2 -0
- package/plugin/src/generators/init-soba/generator.js +26 -0
- package/plugin/src/generators/init-soba/generator.js.map +1 -0
- package/plugin/src/generators/init-soba/schema.json +6 -0
- package/plugin/src/generators/utils.d.ts +2 -0
- package/plugin/src/generators/utils.js +34 -0
- package/plugin/src/generators/utils.js.map +1 -0
- package/plugin/src/generators/versions.d.ts +12 -0
- package/plugin/src/generators/versions.js +16 -0
- package/plugin/src/generators/versions.js.map +1 -0
- package/plugin/src/index.d.ts +3 -1
- package/plugin/src/index.js +7 -3
- package/plugin/src/index.js.map +1 -1
- package/web-types.json +1 -1
- package/esm2022/lib/di/before-render.mjs +0 -13
- package/esm2022/lib/di/catalogue.mjs +0 -7
- package/esm2022/lib/di/ref.mjs +0 -49
- package/esm2022/lib/renderer/di.mjs +0 -3
- package/esm2022/lib/renderer/enums.mjs +0 -2
- package/esm2022/lib/renderer/provider.mjs +0 -18
- package/esm2022/lib/renderer/renderer.mjs +0 -365
- package/esm2022/lib/stores/signal.store.mjs +0 -81
- package/esm2022/lib/stores/store.mjs +0 -423
- package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
- package/esm2022/lib/utils/instance.mjs +0 -63
- package/esm2022/lib/utils/signal.mjs +0 -24
- package/esm2022/lib/utils/timing.mjs +0 -21
- package/lib/di/catalogue.d.ts +0 -3
- package/lib/renderer/di.d.ts +0 -2
- package/lib/renderer/enums.d.ts +0 -26
- package/lib/renderer/provider.d.ts +0 -8
- package/lib/renderer/renderer.d.ts +0 -49
- package/lib/stores/signal.store.d.ts +0 -20
- package/lib/stores/store.d.ts +0 -13
- package/lib/utils/instance.d.ts +0 -4
- package/lib/utils/signal.d.ts +0 -2
- package/lib/utils/timing.d.ts +0 -4
- package/plugin/src/generators/init/init.d.ts +0 -5
- package/plugin/src/generators/init/init.js +0 -56
- package/plugin/src/generators/init/init.js.map +0 -1
- /package/lib/utils/{assert-in-injection-context.d.ts → assert-injection-context.d.ts} +0 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { ChangeDetectorRef, Injectable, Injector, NgZone, RendererFactory2, effect, getDebugNode, inject, makeEnvironmentProviders, provideZoneChangeDetection, signal, untracked, } from '@angular/core';
|
|
3
|
+
import { getLocalState, prepare } from '../instance';
|
|
4
|
+
import { injectNgtStore, provideNgtStore } from '../store';
|
|
5
|
+
import { is } from '../utils/is';
|
|
6
|
+
import { injectNgtCatalogue } from './catalogue';
|
|
7
|
+
import { HTML, ROUTED_SCENE, SPECIAL_DOM_TAG } from './constants';
|
|
8
|
+
import { NGT_COMPOUND_PREFIXES, NgtRendererStore } from './store';
|
|
9
|
+
import { NgtCompoundClassId, NgtRendererClassId, attachThreeChild, kebabToPascal, processThreeEvent, removeThreeChild, } from './utils';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
class NgtRendererFactory {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.delegateRendererFactory = inject(RendererFactory2, { skipSelf: true });
|
|
14
|
+
this.zone = inject(NgZone);
|
|
15
|
+
this.catalogue = injectNgtCatalogue();
|
|
16
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
17
|
+
this.rendererMap = new Map();
|
|
18
|
+
this.routedSet = new Set();
|
|
19
|
+
// all Renderer instances share the same Store
|
|
20
|
+
this.rendererStore = new NgtRendererStore({
|
|
21
|
+
portals: [],
|
|
22
|
+
store: injectNgtStore(),
|
|
23
|
+
compoundPrefixes: inject(NGT_COMPOUND_PREFIXES),
|
|
24
|
+
document: inject(DOCUMENT),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
createRenderer(hostElement, type) {
|
|
28
|
+
const delegate = this.delegateRendererFactory.createRenderer(hostElement, type);
|
|
29
|
+
if (!type)
|
|
30
|
+
return delegate;
|
|
31
|
+
// TODO: handle html in canvas
|
|
32
|
+
if (type['type'][HTML]) {
|
|
33
|
+
this.rendererMap.set(type.id, delegate);
|
|
34
|
+
return delegate;
|
|
35
|
+
}
|
|
36
|
+
if (type['type'][ROUTED_SCENE]) {
|
|
37
|
+
this.routedSet.add(type.id);
|
|
38
|
+
}
|
|
39
|
+
let renderer = this.rendererMap.get(type.id);
|
|
40
|
+
if (!renderer) {
|
|
41
|
+
renderer = new NgtRenderer(delegate, this.rendererStore, this.catalogue, this.zone, this.cdr,
|
|
42
|
+
// setting root scene if there's no routed scene OR this component is the routed Scene
|
|
43
|
+
!hostElement && (this.routedSet.size === 0 || this.routedSet.has(type.id)));
|
|
44
|
+
this.rendererMap.set(type.id, renderer);
|
|
45
|
+
}
|
|
46
|
+
return renderer;
|
|
47
|
+
}
|
|
48
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
49
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRendererFactory }); }
|
|
50
|
+
}
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRendererFactory, decorators: [{
|
|
52
|
+
type: Injectable
|
|
53
|
+
}] });
|
|
54
|
+
/**
|
|
55
|
+
* Anything abbreviated with rS/RS stands for RendererState
|
|
56
|
+
*/
|
|
57
|
+
class NgtRenderer {
|
|
58
|
+
constructor(delegate, store, catalogue, zone, cdr, root = true) {
|
|
59
|
+
this.delegate = delegate;
|
|
60
|
+
this.store = store;
|
|
61
|
+
this.catalogue = catalogue;
|
|
62
|
+
this.zone = zone;
|
|
63
|
+
this.cdr = cdr;
|
|
64
|
+
this.root = root;
|
|
65
|
+
this.createText = this.delegate.createText.bind(this.delegate);
|
|
66
|
+
this.destroy = this.delegate.destroy.bind(this.delegate);
|
|
67
|
+
this.destroyNode = null;
|
|
68
|
+
this.selectRootElement = this.delegate.selectRootElement.bind(this.delegate);
|
|
69
|
+
this.nextSibling = this.delegate.nextSibling.bind(this.delegate);
|
|
70
|
+
this.removeAttribute = this.delegate.removeAttribute.bind(this.delegate);
|
|
71
|
+
this.addClass = this.delegate.addClass.bind(this.delegate);
|
|
72
|
+
this.removeClass = this.delegate.removeClass.bind(this.delegate);
|
|
73
|
+
this.setStyle = this.delegate.setStyle.bind(this.delegate);
|
|
74
|
+
this.removeStyle = this.delegate.removeStyle.bind(this.delegate);
|
|
75
|
+
this.setValue = this.delegate.setValue.bind(this.delegate);
|
|
76
|
+
}
|
|
77
|
+
createElement(name, namespace) {
|
|
78
|
+
const element = this.delegate.createElement(name, namespace);
|
|
79
|
+
// on first pass, we return the Root Scene as the root node
|
|
80
|
+
if (this.root) {
|
|
81
|
+
this.root = false;
|
|
82
|
+
const node = this.store.createNode('three', this.store.rootScene);
|
|
83
|
+
node.__ngt_renderer__[NgtRendererClassId.injectorFactory] = () => getDebugNode(element).injector;
|
|
84
|
+
return node;
|
|
85
|
+
}
|
|
86
|
+
// handle compound
|
|
87
|
+
if (this.store.isCompound(name)) {
|
|
88
|
+
return this.store.createNode('compound', element);
|
|
89
|
+
}
|
|
90
|
+
// handle portal
|
|
91
|
+
if (name === SPECIAL_DOM_TAG.NGT_PORTAL) {
|
|
92
|
+
return this.store.createNode('portal', element);
|
|
93
|
+
}
|
|
94
|
+
// handle raw value
|
|
95
|
+
if (name === SPECIAL_DOM_TAG.NGT_VALUE) {
|
|
96
|
+
return this.store.createNode('three', Object.assign({ __ngt_renderer__: { rawValue: undefined } },
|
|
97
|
+
// NOTE: we assign this manually to a raw value node
|
|
98
|
+
// because we say it is a 'three' node but we're not using prepare()
|
|
99
|
+
{ __ngt__: { isRaw: true, parent: signal(null) } }));
|
|
100
|
+
}
|
|
101
|
+
const { injectedArgs, injectedParent, store } = this.store.getCreationState();
|
|
102
|
+
let parent = injectedParent;
|
|
103
|
+
if (typeof injectedParent === 'string') {
|
|
104
|
+
parent = store
|
|
105
|
+
.get('scene')
|
|
106
|
+
.getObjectByName(injectedParent);
|
|
107
|
+
}
|
|
108
|
+
// handle primitive
|
|
109
|
+
if (name === SPECIAL_DOM_TAG.NGT_PRIMITIVE) {
|
|
110
|
+
if (!injectedArgs[0])
|
|
111
|
+
throw new Error(`[NGT] ngt-primitive without args is invalid`);
|
|
112
|
+
const object = injectedArgs[0];
|
|
113
|
+
let localState = getLocalState(object);
|
|
114
|
+
if (!Object.keys(localState).length) {
|
|
115
|
+
// NOTE: if an object isn't already "prepared", we prepare it
|
|
116
|
+
localState = getLocalState(prepare(object, { store, args: injectedArgs, primitive: true }));
|
|
117
|
+
}
|
|
118
|
+
if (!localState.store)
|
|
119
|
+
localState.store = store;
|
|
120
|
+
const node = this.store.createNode('three', object);
|
|
121
|
+
if (parent) {
|
|
122
|
+
node.__ngt_renderer__[NgtRendererClassId.injectedParent] = parent;
|
|
123
|
+
}
|
|
124
|
+
return node;
|
|
125
|
+
}
|
|
126
|
+
const threeTag = name.startsWith('ngt') ? name.slice(4) : name;
|
|
127
|
+
const threeName = kebabToPascal(threeTag);
|
|
128
|
+
const threeTarget = this.catalogue[threeName];
|
|
129
|
+
// we have the THREE constructor here, handle it
|
|
130
|
+
if (threeTarget) {
|
|
131
|
+
const instance = prepare(new threeTarget(...injectedArgs), { store, args: injectedArgs });
|
|
132
|
+
const node = this.store.createNode('three', instance);
|
|
133
|
+
const localState = getLocalState(instance);
|
|
134
|
+
// auto-attach for geometry and material
|
|
135
|
+
if (is.geometry(instance)) {
|
|
136
|
+
localState.attach = ['geometry'];
|
|
137
|
+
}
|
|
138
|
+
else if (is.material(instance)) {
|
|
139
|
+
localState.attach = ['material'];
|
|
140
|
+
}
|
|
141
|
+
if (parent) {
|
|
142
|
+
node.__ngt_renderer__[NgtRendererClassId.injectedParent] = parent;
|
|
143
|
+
}
|
|
144
|
+
return node;
|
|
145
|
+
}
|
|
146
|
+
return this.store.createNode('dom', element);
|
|
147
|
+
}
|
|
148
|
+
createComment(value) {
|
|
149
|
+
return this.store.createNode('comment', this.delegate.createComment(value));
|
|
150
|
+
}
|
|
151
|
+
appendChild(parent, newChild) {
|
|
152
|
+
const pRS = parent.__ngt_renderer__;
|
|
153
|
+
const cRS = newChild.__ngt_renderer__;
|
|
154
|
+
if (pRS[NgtRendererClassId.type] === 'dom' &&
|
|
155
|
+
(newChild instanceof Text || cRS[NgtRendererClassId.type] === 'dom')) {
|
|
156
|
+
this.store.addChild(parent, newChild);
|
|
157
|
+
this.delegate.appendChild(parent, newChild);
|
|
158
|
+
if (cRS) {
|
|
159
|
+
this.store.setParent(newChild, parent);
|
|
160
|
+
if (this.shouldFindGrandparentInstance(pRS, cRS, newChild)) {
|
|
161
|
+
// we'll try to get the grandparent instance here so that we can run appendChild with both instances
|
|
162
|
+
const closestGrandparentInstance = this.store.getClosestParentWithInstance(parent);
|
|
163
|
+
if (closestGrandparentInstance)
|
|
164
|
+
this.appendChild(closestGrandparentInstance, newChild);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (cRS?.[NgtRendererClassId.type] === 'comment') {
|
|
170
|
+
this.store.setParent(newChild, parent);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (cRS?.[NgtRendererClassId.injectedParent]) {
|
|
174
|
+
if (is.ref(cRS[NgtRendererClassId.injectedParent])) {
|
|
175
|
+
const injector = cRS[NgtRendererClassId.injectorFactory]().get(Injector, null);
|
|
176
|
+
if (!injector) {
|
|
177
|
+
console.warn(`[NGT] NgtRenderer is attempting to start an effect for injectedParent but no Injector is found.`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const watcher = effect(() => {
|
|
181
|
+
const injectedParent = cRS[NgtRendererClassId.injectedParent].nativeElement;
|
|
182
|
+
if (injectedParent && injectedParent !== parent) {
|
|
183
|
+
this.appendChild(injectedParent, newChild);
|
|
184
|
+
// only run this effect once
|
|
185
|
+
// as soon as we re-run appendChild with the injectedParent, we stop the effect
|
|
186
|
+
watcher.destroy();
|
|
187
|
+
}
|
|
188
|
+
}, { injector, manualCleanup: true });
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
else if (parent !== cRS[NgtRendererClassId.injectedParent]) {
|
|
192
|
+
this.appendChild(cRS[NgtRendererClassId.injectedParent], newChild);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
this.store.setParent(newChild, parent);
|
|
197
|
+
this.store.addChild(parent, newChild);
|
|
198
|
+
// if new child is a portal
|
|
199
|
+
if (cRS?.[NgtRendererClassId.type] === 'portal') {
|
|
200
|
+
this.store.processPortalContainer(newChild);
|
|
201
|
+
if (cRS[NgtRendererClassId.portalContainer]) {
|
|
202
|
+
this.appendChild(parent, cRS[NgtRendererClassId.portalContainer]);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// if parent is a portal
|
|
207
|
+
if (pRS[NgtRendererClassId.type] === 'portal') {
|
|
208
|
+
this.store.processPortalContainer(parent);
|
|
209
|
+
if (pRS[NgtRendererClassId.portalContainer]) {
|
|
210
|
+
this.appendChild(pRS[NgtRendererClassId.portalContainer], newChild);
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// if both are three instances, straightforward case
|
|
215
|
+
if (pRS[NgtRendererClassId.type] === 'three' && cRS?.[NgtRendererClassId.type] === 'three') {
|
|
216
|
+
// if child already attached to a parent, skip
|
|
217
|
+
if (getLocalState(newChild).parent && untracked(getLocalState(newChild).parent))
|
|
218
|
+
return;
|
|
219
|
+
// attach THREE child
|
|
220
|
+
attachThreeChild(parent, newChild);
|
|
221
|
+
// here, we handle the special case of if the parent has a compoundParent, which means this child is part of a compound parent template
|
|
222
|
+
if (!cRS[NgtRendererClassId.compound])
|
|
223
|
+
return;
|
|
224
|
+
const closestGrandparentWithCompound = this.store.getClosestParentWithCompound(parent);
|
|
225
|
+
if (!closestGrandparentWithCompound)
|
|
226
|
+
return;
|
|
227
|
+
this.appendChild(closestGrandparentWithCompound, newChild);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// if only the parent is the THREE instance
|
|
231
|
+
if (pRS[NgtRendererClassId.type] === 'three') {
|
|
232
|
+
for (const renderChild of cRS?.[NgtRendererClassId.children]) {
|
|
233
|
+
this.appendChild(parent, renderChild);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// if parent is a compound
|
|
237
|
+
if (pRS[NgtRendererClassId.type] === 'compound') {
|
|
238
|
+
// if compound doesn't have a THREE instance set yet
|
|
239
|
+
if (!pRS[NgtRendererClassId.compounded] && cRS[NgtRendererClassId.type] === 'three') {
|
|
240
|
+
// if child is indeed an ngtCompound
|
|
241
|
+
if (cRS[NgtRendererClassId.compound])
|
|
242
|
+
this.store.setCompound(parent, newChild);
|
|
243
|
+
// if not, we track the parent (that is supposedly the compound component) on this three instance
|
|
244
|
+
else if (!cRS[NgtRendererClassId.compoundParent])
|
|
245
|
+
cRS[NgtRendererClassId.compoundParent] = parent;
|
|
246
|
+
}
|
|
247
|
+
// reset the compound if it's changed
|
|
248
|
+
if (pRS[NgtRendererClassId.compounded] &&
|
|
249
|
+
cRS[NgtRendererClassId.type] === 'three' &&
|
|
250
|
+
cRS[NgtRendererClassId.compound] &&
|
|
251
|
+
pRS[NgtRendererClassId.compounded] !== newChild) {
|
|
252
|
+
this.store.setCompound(parent, newChild);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (this.shouldFindGrandparentInstance(pRS, cRS, newChild)) {
|
|
256
|
+
// we'll try to get the grandparent instance here so that we can run appendChild with both instances
|
|
257
|
+
const closestGrandparentInstance = this.store.getClosestParentWithInstance(parent);
|
|
258
|
+
if (closestGrandparentInstance)
|
|
259
|
+
this.appendChild(closestGrandparentInstance, newChild);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
insertBefore(parent, newChild) {
|
|
264
|
+
if (parent == null || !parent.__ngt_renderer__ || parent === newChild)
|
|
265
|
+
return;
|
|
266
|
+
this.appendChild(parent, newChild);
|
|
267
|
+
}
|
|
268
|
+
removeChild(parent, oldChild, isHostElement) {
|
|
269
|
+
const pRS = parent.__ngt_renderer__;
|
|
270
|
+
const cRS = oldChild.__ngt_renderer__;
|
|
271
|
+
if ((!cRS || !pRS) &&
|
|
272
|
+
parent instanceof Element &&
|
|
273
|
+
(oldChild instanceof Element || oldChild instanceof Text || oldChild instanceof Comment)) {
|
|
274
|
+
this.delegate.removeChild(parent, oldChild);
|
|
275
|
+
this.store.destroy(oldChild, parent);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (cRS[NgtRendererClassId.type] === 'dom' && (!pRS || pRS[NgtRendererClassId.type] === 'dom')) {
|
|
279
|
+
this.delegate.removeChild(parent, oldChild);
|
|
280
|
+
this.store.destroy(oldChild, parent);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (pRS[NgtRendererClassId.type] === 'three' && cRS[NgtRendererClassId.type] === 'three') {
|
|
284
|
+
removeThreeChild(parent, oldChild, true);
|
|
285
|
+
this.store.destroy(oldChild, parent);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (pRS[NgtRendererClassId.type] === 'compound' && pRS[NgtRendererClassId.parent]) {
|
|
289
|
+
this.removeChild(pRS[NgtRendererClassId.parent], oldChild, isHostElement);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (pRS[NgtRendererClassId.type] === 'three') {
|
|
293
|
+
this.store.destroy(oldChild, parent);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const closestGrandparentInstance = this.store.getClosestParentWithInstance(parent);
|
|
297
|
+
if (closestGrandparentInstance)
|
|
298
|
+
this.removeChild(closestGrandparentInstance, oldChild, isHostElement);
|
|
299
|
+
this.store.destroy(oldChild, closestGrandparentInstance);
|
|
300
|
+
}
|
|
301
|
+
parentNode(node) {
|
|
302
|
+
const rS = node.__ngt_renderer__;
|
|
303
|
+
if (rS?.[NgtRendererClassId.parent])
|
|
304
|
+
return rS[NgtRendererClassId.parent];
|
|
305
|
+
return this.delegate.parentNode(node);
|
|
306
|
+
}
|
|
307
|
+
setAttribute(el, name, value, namespace) {
|
|
308
|
+
const rS = el.__ngt_renderer__;
|
|
309
|
+
if (rS[NgtRendererClassId.type] === 'compound') {
|
|
310
|
+
// we don't have the compound instance yet
|
|
311
|
+
rS[NgtRendererClassId.attributes][name] = value;
|
|
312
|
+
if (!rS[NgtRendererClassId.compounded]) {
|
|
313
|
+
this.store.queueOperation(el, ['op', () => this.setAttribute(el, name, value, namespace)]);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
this.setAttribute(rS[NgtRendererClassId.compounded], name, value, namespace);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (rS[NgtRendererClassId.type] === 'three') {
|
|
320
|
+
this.store.applyAttribute(el, name, value);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
return this.delegate.setAttribute(el, name, value);
|
|
324
|
+
}
|
|
325
|
+
setProperty(el, name, value) {
|
|
326
|
+
// TODO: should we support ref value
|
|
327
|
+
const rS = el.__ngt_renderer__;
|
|
328
|
+
if (rS[NgtRendererClassId.type] === 'compound') {
|
|
329
|
+
// we don't have the compound instance yet
|
|
330
|
+
rS[NgtRendererClassId.properties][name] = value;
|
|
331
|
+
if (!rS[NgtRendererClassId.compounded]) {
|
|
332
|
+
this.store.queueOperation(el, ['op', () => this.setProperty(el, name, value)]);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (rS[NgtRendererClassId.compounded].__ngt_renderer__[NgtRendererClassId.compound]) {
|
|
336
|
+
Object.assign(rS[NgtRendererClassId.compounded].__ngt_renderer__[NgtRendererClassId.compound][NgtCompoundClassId.props], { [name]: value });
|
|
337
|
+
}
|
|
338
|
+
this.setProperty(rS[NgtRendererClassId.compounded], name, value);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (rS[NgtRendererClassId.type] === 'three') {
|
|
342
|
+
this.store.applyProperty(el, name, value);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
return this.delegate.setProperty(el, name, value);
|
|
346
|
+
}
|
|
347
|
+
listen(target, eventName, callback) {
|
|
348
|
+
const rS = target.__ngt_renderer__;
|
|
349
|
+
// if the target doesn't have __ngt_renderer__, we delegate
|
|
350
|
+
// if target is DOM node, then we pass that to delegate Renderer
|
|
351
|
+
if (!rS || this.store.isDOM(target)) {
|
|
352
|
+
return this.delegate.listen(target, eventName, callback);
|
|
353
|
+
}
|
|
354
|
+
if (rS[NgtRendererClassId.type] === 'three' ||
|
|
355
|
+
(rS[NgtRendererClassId.type] === 'compound' && rS[NgtRendererClassId.compounded])) {
|
|
356
|
+
const instance = rS[NgtRendererClassId.compounded] || target;
|
|
357
|
+
const priority = getLocalState(target).priority;
|
|
358
|
+
const targetCdr = rS[NgtRendererClassId.injectorFactory]?.().get(ChangeDetectorRef, null) ||
|
|
359
|
+
rS[NgtRendererClassId.parent]?.__ngt_renderer__?.[NgtRendererClassId.injectorFactory]?.().get(ChangeDetectorRef, null);
|
|
360
|
+
return processThreeEvent(instance, priority || 0, eventName, callback, this.zone, this.cdr, targetCdr);
|
|
361
|
+
}
|
|
362
|
+
if (rS[NgtRendererClassId.type] === 'compound' && !rS[NgtRendererClassId.compounded]) {
|
|
363
|
+
this.store.queueOperation(target, [
|
|
364
|
+
'op',
|
|
365
|
+
() => this.store.queueOperation(target, ['cleanUp', this.listen(target, eventName, callback)]),
|
|
366
|
+
]);
|
|
367
|
+
return () => { };
|
|
368
|
+
}
|
|
369
|
+
// @ts-expect-error - we know that target is not DOM node
|
|
370
|
+
if (target === this.store.rootScene) {
|
|
371
|
+
let [domTarget, event] = eventName.split(':');
|
|
372
|
+
if (event == null) {
|
|
373
|
+
event = domTarget;
|
|
374
|
+
domTarget = '';
|
|
375
|
+
}
|
|
376
|
+
const eventTarget = domTarget === 'window'
|
|
377
|
+
? target['ownerDocument']['defaultView']
|
|
378
|
+
: target['ownerDocument'];
|
|
379
|
+
return this.delegate.listen(eventTarget, event, callback);
|
|
380
|
+
}
|
|
381
|
+
return () => { };
|
|
382
|
+
}
|
|
383
|
+
shouldFindGrandparentInstance(pRS, cRS, child) {
|
|
384
|
+
const pType = pRS[NgtRendererClassId.type];
|
|
385
|
+
const cType = cRS[NgtRendererClassId.type];
|
|
386
|
+
const isParentCompounded = pRS[NgtRendererClassId.compounded];
|
|
387
|
+
const isChildCompounded = cRS[NgtRendererClassId.compounded];
|
|
388
|
+
// if child is three but haven't been attached to a parent yet
|
|
389
|
+
const isDanglingThreeChild = cType === 'three' && !untracked(getLocalState(child).parent);
|
|
390
|
+
// or both parent and child are DOM elements
|
|
391
|
+
// or they are compound AND haven't had a THREE instance yet
|
|
392
|
+
const isParentStillDOM = pType === 'dom' || (pType === 'compound' && !isParentCompounded);
|
|
393
|
+
const isChildStillDOM = cType === 'dom' || (cType === 'compound' && !isChildCompounded);
|
|
394
|
+
// and the child is a compounded compound
|
|
395
|
+
const isCompoundChildCompounded = cType === 'compound' && !!isChildCompounded;
|
|
396
|
+
return (isDanglingThreeChild ||
|
|
397
|
+
(isParentStillDOM && isChildStillDOM) ||
|
|
398
|
+
(isParentStillDOM && isCompoundChildCompounded));
|
|
399
|
+
}
|
|
400
|
+
get data() {
|
|
401
|
+
return this.delegate.data;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
export function provideNgtRenderer(store, compoundPrefixes, cdr) {
|
|
405
|
+
if (!compoundPrefixes.includes('ngts'))
|
|
406
|
+
compoundPrefixes.push('ngts');
|
|
407
|
+
if (!compoundPrefixes.includes('ngtp'))
|
|
408
|
+
compoundPrefixes.push('ngtp');
|
|
409
|
+
return makeEnvironmentProviders([
|
|
410
|
+
{ provide: RendererFactory2, useClass: NgtRendererFactory },
|
|
411
|
+
{ provide: NGT_COMPOUND_PREFIXES, useValue: compoundPrefixes },
|
|
412
|
+
{ provide: ChangeDetectorRef, useValue: cdr },
|
|
413
|
+
provideNgtStore(store),
|
|
414
|
+
provideZoneChangeDetection({ runCoalescing: true, eventCoalescing: true }),
|
|
415
|
+
]);
|
|
416
|
+
}
|
|
417
|
+
export { extend } from './catalogue';
|
|
418
|
+
export { HTML } from './constants';
|
|
419
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixNQUFNLEVBQ04sU0FBUyxHQUdULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFpQixNQUFNLFVBQVUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBMEIsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBK0MsTUFBTSxTQUFTLENBQUM7QUFDL0csT0FBTyxFQUNOLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2hCLE1BQU0sU0FBUyxDQUFDOztBQUVqQixNQUNNLGtCQUFrQjtJQUR4QjtRQUVTLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIs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QUFDO0tBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0SW5qZWN0YWJsZSxcblx0SW5qZWN0b3IsXG5cdE5nWm9uZSxcblx0UmVuZGVyZXJGYWN0b3J5Mixcblx0ZWZmZWN0LFxuXHRnZXREZWJ1Z05vZGUsXG5cdGluamVjdCxcblx0bWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuXHRwcm92aWRlWm9uZUNoYW5nZURldGVjdGlvbixcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG5cdHR5cGUgUmVuZGVyZXIyLFxuXHR0eXBlIFJlbmRlcmVyVHlwZTIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB0eXBlIHsgTmd0SW5qZWN0ZWRSZWYgfSBmcm9tICcuLi9yZWYnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0U3RvcmUsIHByb3ZpZGVOZ3RTdG9yZSwgdHlwZSBOZ3RTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgeyBpbmplY3ROZ3RDYXRhbG9ndWUsIHR5cGUgTmd0QW55Q29uc3RydWN0b3IgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5pbXBvcnQgeyBIVE1MLCBST1VURURfU0NFTkUsIFNQRUNJQUxfRE9NX1RBRyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5HVF9DT01QT1VORF9QUkVGSVhFUywgTmd0UmVuZGVyZXJTdG9yZSwgdHlwZSBOZ3RSZW5kZXJlck5vZGUsIHR5cGUgTmd0UmVuZGVyZXJTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHtcblx0Tmd0Q29tcG91bmRDbGFzc0lkLFxuXHROZ3RSZW5kZXJlckNsYXNzSWQsXG5cdGF0dGFjaFRocmVlQ2hpbGQsXG5cdGtlYmFiVG9QYXNjYWwsXG5cdHByb2Nlc3NUaHJlZUV2ZW50LFxuXHRyZW1vdmVUaHJlZUNoaWxkLFxufSBmcm9tICcuL3V0aWxzJztcblxuQEluamVjdGFibGUoKVxuY2xhc3MgTmd0UmVuZGVyZXJGYWN0b3J5IGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5MiB7XG5cdHByaXZhdGUgZGVsZWdhdGVSZW5kZXJlckZhY3RvcnkgPSBpbmplY3QoUmVuZGVyZXJGYWN0b3J5MiwgeyBza2lwU2VsZjogdHJ1ZSB9KTtcblx0cHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cdHByaXZhdGUgY2F0YWxvZ3VlID0gaW5qZWN0Tmd0Q2F0YWxvZ3VlKCk7XG5cdHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuXHRwcml2YXRlIHJlbmRlcmVyTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlbmRlcmVyMj4oKTtcblx0cHJpdmF0ZSByb3V0ZWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuXHQvLyBhbGwgUmVuZGVyZXIgaW5zdGFuY2VzIHNoYXJlIHRoZSBzYW1lIFN0b3JlXG5cdHByaXZhdGUgcmVuZGVyZXJTdG9yZSA9IG5ldyBOZ3RSZW5kZXJlclN0b3JlKHtcblx0XHRwb3J0YWxzOiBbXSxcblx0XHRzdG9yZTogaW5qZWN0Tmd0U3RvcmUoKSxcblx0XHRjb21wb3VuZFByZWZpeGVzOiBpbmplY3QoTkdUX0NPTVBPVU5EX1BSRUZJWEVTKSxcblx0XHRkb2N1bWVudDogaW5qZWN0KERPQ1VNRU5UKSxcblx0fSk7XG5cblx0Y3JlYXRlUmVuZGVyZXIoaG9zdEVsZW1lbnQ6IGFueSwgdHlwZTogUmVuZGVyZXJUeXBlMiB8IG51bGwpOiBSZW5kZXJlcjIge1xuXHRcdGNvbnN0IGRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZVJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihob3N0RWxlbWVudCwgdHlwZSk7XG5cdFx0aWYgKCF0eXBlKSByZXR1cm4gZGVsZWdhdGU7XG5cdFx0Ly8gVE9ETzogaGFuZGxlIGh0bWwgaW4gY2FudmFzXG5cdFx0aWYgKCh0eXBlIGFzIE5ndEFueVJlY29yZClbJ3R5cGUnXVtIVE1MXSkge1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQodHlwZS5pZCwgZGVsZWdhdGUpO1xuXHRcdFx0cmV0dXJuIGRlbGVnYXRlO1xuXHRcdH1cblx0XHRpZiAoKHR5cGUgYXMgTmd0QW55UmVjb3JkKVsndHlwZSddW1JPVVRFRF9TQ0VORV0pIHtcblx0XHRcdHRoaXMucm91dGVkU2V0LmFkZCh0eXBlLmlkKTtcblx0XHR9XG5cblx0XHRsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyTWFwLmdldCh0eXBlLmlkKTtcblxuXHRcdGlmICghcmVuZGVyZXIpIHtcblx0XHRcdHJlbmRlcmVyID0gbmV3IE5ndFJlbmRlcmVyKFxuXHRcdFx0XHRkZWxlZ2F0ZSxcblx0XHRcdFx0dGhpcy5yZW5kZXJlclN0b3JlLFxuXHRcdFx0XHR0aGlzLmNhdGFsb2d1ZSxcblx0XHRcdFx0dGhpcy56b25lLFxuXHRcdFx0XHR0aGlzLmNkcixcblx0XHRcdFx0Ly8gc2V0dGluZyByb290IHNjZW5lIGlmIHRoZXJlJ3Mgbm8gcm91dGVkIHNjZW5lIE9SIHRoaXMgY29tcG9uZW50IGlzIHRoZSByb3V0ZWQgU2NlbmVcblx0XHRcdFx0IWhvc3RFbGVtZW50ICYmICh0aGlzLnJvdXRlZFNldC5zaXplID09PSAwIHx8IHRoaXMucm91dGVkU2V0Lmhhcyh0eXBlLmlkKSksXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQodHlwZS5pZCwgcmVuZGVyZXIpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVuZGVyZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBBbnl0aGluZyBhYmJyZXZpYXRlZCB3aXRoIHJTL1JTIHN0YW5kcyBmb3IgUmVuZGVyZXJTdGF0ZVxuICovXG5jbGFzcyBOZ3RSZW5kZXJlciBpbXBsZW1lbnRzIFJlbmRlcmVyMiB7XG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgZGVsZWdhdGU6IFJlbmRlcmVyMixcblx0XHRwcml2YXRlIHN0b3JlOiBOZ3RSZW5kZXJlclN0b3JlLFxuXHRcdHByaXZhdGUgY2F0YWxvZ3VlOiBSZWNvcmQ8c3RyaW5nLCBOZ3RBbnlDb25zdHJ1Y3Rvcj4sXG5cdFx0cHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG5cdFx0cHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuXHRcdHByaXZhdGUgcm9vdCA9IHRydWUsXG5cdCkge31cblxuXHRjcmVhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKTtcblxuXHRcdC8vIG9uIGZpcnN0IHBhc3MsIHdlIHJldHVybiB0aGUgUm9vdCBTY2VuZSBhcyB0aGUgcm9vdCBub2RlXG5cdFx0aWYgKHRoaXMucm9vdCkge1xuXHRcdFx0dGhpcy5yb290ID0gZmFsc2U7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIHRoaXMuc3RvcmUucm9vdFNjZW5lKTtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShlbGVtZW50KSEuaW5qZWN0b3I7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgY29tcG91bmRcblx0XHRpZiAodGhpcy5zdG9yZS5pc0NvbXBvdW5kKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdjb21wb3VuZCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSBwb3J0YWxcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QT1JUQUwpIHtcblx0XHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3BvcnRhbCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByYXcgdmFsdWVcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9WQUxVRSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZShcblx0XHRcdFx0J3RocmVlJyxcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7IF9fbmd0X3JlbmRlcmVyX186IHsgcmF3VmFsdWU6IHVuZGVmaW5lZCB9IH0sXG5cdFx0XHRcdFx0Ly8gTk9URTogd2UgYXNzaWduIHRoaXMgbWFudWFsbHkgdG8gYSByYXcgdmFsdWUgbm9kZVxuXHRcdFx0XHRcdC8vIGJlY2F1c2Ugd2Ugc2F5IGl0IGlzIGEgJ3RocmVlJyBub2RlIGJ1dCB3ZSdyZSBub3QgdXNpbmcgcHJlcGFyZSgpXG5cdFx0XHRcdFx0eyBfX25ndF9fOiB7IGlzUmF3OiB0cnVlLCBwYXJlbnQ6IHNpZ25hbChudWxsKSB9IH0sXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfSA9IHRoaXMuc3RvcmUuZ2V0Q3JlYXRpb25TdGF0ZSgpO1xuXG5cdFx0bGV0IHBhcmVudCA9IGluamVjdGVkUGFyZW50IGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHRpZiAodHlwZW9mIGluamVjdGVkUGFyZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cGFyZW50ID0gc3RvcmVcblx0XHRcdFx0LmdldCgnc2NlbmUnKVxuXHRcdFx0XHQuZ2V0T2JqZWN0QnlOYW1lKGluamVjdGVkUGFyZW50KSBhcyB1bmtub3duIGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgcHJpbWl0aXZlXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfRE9NX1RBRy5OR1RfUFJJTUlUSVZFKSB7XG5cdFx0XHRpZiAoIWluamVjdGVkQXJnc1swXSkgdGhyb3cgbmV3IEVycm9yKGBbTkdUXSBuZ3QtcHJpbWl0aXZlIHdpdGhvdXQgYXJncyBpcyBpbnZhbGlkYCk7XG5cdFx0XHRjb25zdCBvYmplY3QgPSBpbmplY3RlZEFyZ3NbMF07XG5cdFx0XHRsZXQgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUob2JqZWN0KTtcblx0XHRcdGlmICghT2JqZWN0LmtleXMobG9jYWxTdGF0ZSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIE5PVEU6IGlmIGFuIG9iamVjdCBpc24ndCBhbHJlYWR5IFwicHJlcGFyZWRcIiwgd2UgcHJlcGFyZSBpdFxuXHRcdFx0XHRsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShwcmVwYXJlKG9iamVjdCwgeyBzdG9yZSwgYXJnczogaW5qZWN0ZWRBcmdzLCBwcmltaXRpdmU6IHRydWUgfSkpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFsb2NhbFN0YXRlLnN0b3JlKSBsb2NhbFN0YXRlLnN0b3JlID0gc3RvcmU7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIG9iamVjdCk7XG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGhyZWVUYWcgPSBuYW1lLnN0YXJ0c1dpdGgoJ25ndCcpID8gbmFtZS5zbGljZSg0KSA6IG5hbWU7XG5cdFx0Y29uc3QgdGhyZWVOYW1lID0ga2ViYWJUb1Bhc2NhbCh0aHJlZVRhZyk7XG5cdFx0Y29uc3QgdGhyZWVUYXJnZXQgPSB0aGlzLmNhdGFsb2d1ZVt0aHJlZU5hbWVdO1xuXHRcdC8vIHdlIGhhdmUgdGhlIFRIUkVFIGNvbnN0cnVjdG9yIGhlcmUsIGhhbmRsZSBpdFxuXHRcdGlmICh0aHJlZVRhcmdldCkge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBwcmVwYXJlKG5ldyB0aHJlZVRhcmdldCguLi5pbmplY3RlZEFyZ3MpLCB7IHN0b3JlLCBhcmdzOiBpbmplY3RlZEFyZ3MgfSk7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIGluc3RhbmNlKTtcblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKTtcblxuXHRcdFx0Ly8gYXV0by1hdHRhY2ggZm9yIGdlb21ldHJ5IGFuZCBtYXRlcmlhbFxuXHRcdFx0aWYgKGlzLmdlb21ldHJ5KGluc3RhbmNlKSkge1xuXHRcdFx0XHRsb2NhbFN0YXRlLmF0dGFjaCA9IFsnZ2VvbWV0cnknXTtcblx0XHRcdH0gZWxzZSBpZiAoaXMubWF0ZXJpYWwoaW5zdGFuY2UpKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUuYXR0YWNoID0gWydtYXRlcmlhbCddO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdkb20nLCBlbGVtZW50KTtcblx0fVxuXG5cdGNyZWF0ZUNvbW1lbnQodmFsdWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ2NvbW1lbnQnLCB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodmFsdWUpKTtcblx0fVxuXG5cdGFwcGVuZENoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlKTogdm9pZCB7XG5cdFx0Y29uc3QgcFJTID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX187XG5cdFx0Y29uc3QgY1JTID0gbmV3Q2hpbGQuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdGlmIChcblx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nICYmXG5cdFx0XHQobmV3Q2hpbGQgaW5zdGFuY2VvZiBUZXh0IHx8IGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5zdG9yZS5hZGRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdHRoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUuc2V0UGFyZW50KG5ld0NoaWxkLCBwYXJlbnQpO1xuXHRcdFx0XHRpZiAodGhpcy5zaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZShwUlMsIGNSUywgbmV3Q2hpbGQpKSB7XG5cdFx0XHRcdFx0Ly8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuXHRcdFx0XHRcdGNvbnN0IGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlID0gdGhpcy5zdG9yZS5nZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKHBhcmVudCk7XG5cdFx0XHRcdFx0aWYgKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlKSB0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlLCBuZXdDaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0dGhpcy5zdG9yZS5zZXRQYXJlbnQobmV3Q2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pIHtcblx0XHRcdGlmIChpcy5yZWYoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pKSB7XG5cdFx0XHRcdGNvbnN0IGluamVjdG9yID0gY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCkuZ2V0KEluamVjdG9yLCBudWxsKTtcblx0XHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHRcdGBbTkdUXSBOZ3RSZW5kZXJlciBpcyBhdHRlbXB0aW5nIHRvIHN0YXJ0IGFuIGVmZmVjdCBmb3IgaW5qZWN0ZWRQYXJlbnQgYnV0IG5vIEluamVjdG9yIGlzIGZvdW5kLmAsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGVmZmVjdChcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbmplY3RlZFBhcmVudCA9IChcblx0XHRcdFx0XHRcdFx0Y1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0gYXMgTmd0SW5qZWN0ZWRSZWY8Tmd0UmVuZGVyZXJOb2RlPlxuXHRcdFx0XHRcdFx0KS5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRcdFx0aWYgKGluamVjdGVkUGFyZW50ICYmIGluamVjdGVkUGFyZW50ICE9PSBwYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZChpbmplY3RlZFBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0XHQvLyBvbmx5IHJ1biB0aGlzIGVmZmVjdCBvbmNlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHNvb24gYXMgd2UgcmUtcnVuIGFwcGVuZENoaWxkIHdpdGggdGhlIGluamVjdGVkUGFyZW50LCB3ZSBzdG9wIHRoZSBlZmZlY3Rcblx0XHRcdFx0XHRcdFx0d2F0Y2hlci5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7IGluamVjdG9yLCBtYW51YWxDbGVhbnVwOiB0cnVlIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSBpZiAocGFyZW50ICE9PSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSkge1xuXHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdLCBuZXdDaGlsZCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnN0b3JlLnNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcblx0XHR0aGlzLnN0b3JlLmFkZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXG5cdFx0Ly8gaWYgbmV3IGNoaWxkIGlzIGEgcG9ydGFsXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdHRoaXMuc3RvcmUucHJvY2Vzc1BvcnRhbENvbnRhaW5lcihuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIHBhcmVudCBpcyBhIHBvcnRhbFxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0dGhpcy5zdG9yZS5wcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBhcmVudCk7XG5cdFx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdLCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gaWYgYm90aCBhcmUgdGhyZWUgaW5zdGFuY2VzLCBzdHJhaWdodGZvcndhcmQgY2FzZVxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Ly8gaWYgY2hpbGQgYWxyZWFkeSBhdHRhY2hlZCB0byBhIHBhcmVudCwgc2tpcFxuXHRcdFx0aWYgKGdldExvY2FsU3RhdGUobmV3Q2hpbGQpLnBhcmVudCAmJiB1bnRyYWNrZWQoZ2V0TG9jYWxTdGF0ZShuZXdDaGlsZCkucGFyZW50KSkgcmV0dXJuO1xuXHRcdFx0Ly8gYXR0YWNoIFRIUkVFIGNoaWxkXG5cdFx0XHRhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0Ly8gaGVyZSwgd2UgaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgaWYgdGhlIHBhcmVudCBoYXMgYSBjb21wb3VuZFBhcmVudCwgd2hpY2ggbWVhbnMgdGhpcyBjaGlsZCBpcyBwYXJ0IG9mIGEgY29tcG91bmQgcGFyZW50IHRlbXBsYXRlXG5cdFx0XHRpZiAoIWNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdKSByZXR1cm47XG5cdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRXaXRoQ29tcG91bmQgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQocGFyZW50KTtcblx0XHRcdGlmICghY2xvc2VzdEdyYW5kcGFyZW50V2l0aENvbXBvdW5kKSByZXR1cm47XG5cdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudFdpdGhDb21wb3VuZCwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIG9ubHkgdGhlIHBhcmVudCBpcyB0aGUgVEhSRUUgaW5zdGFuY2Vcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Zm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiBjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCByZW5kZXJDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gaWYgcGFyZW50IGlzIGEgY29tcG91bmRcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gaWYgY29tcG91bmQgZG9lc24ndCBoYXZlIGEgVEhSRUUgaW5zdGFuY2Ugc2V0IHlldFxuXHRcdFx0aWYgKCFwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdFx0Ly8gaWYgY2hpbGQgaXMgaW5kZWVkIGFuIG5ndENvbXBvdW5kXG5cdFx0XHRcdGlmIChjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSkgdGhpcy5zdG9yZS5zZXRDb21wb3VuZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdFx0Ly8gaWYgbm90LCB3ZSB0cmFjayB0aGUgcGFyZW50ICh0aGF0IGlzIHN1cHBvc2VkbHkgdGhlIGNvbXBvdW5kIGNvbXBvbmVudCkgb24gdGhpcyB0aHJlZSBpbnN0YW5jZVxuXHRcdFx0XHRlbHNlIGlmICghY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0pIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZXNldCB0aGUgY29tcG91bmQgaWYgaXQncyBjaGFuZ2VkXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gJiZcblx0XHRcdFx0Y1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuXHRcdFx0XHRjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSAmJlxuXHRcdFx0XHRwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICE9PSBuZXdDaGlsZFxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUuc2V0Q29tcG91bmQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTLCBjUlMsIG5ld0NoaWxkKSkge1xuXHRcdFx0Ly8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuXHRcdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5hcHBlbmRDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGluc2VydEJlZm9yZShcblx0XHRwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0XHRuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRcdC8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdGhlc2U/XG5cdFx0Ly8gcmVmQ2hpbGQ6IE5ndFJlbmRlcmVyTm9kZVxuXHRcdC8vIGlzTW92ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXyB8fCBwYXJlbnQgPT09IG5ld0NoaWxkKSByZXR1cm47XG5cdFx0dGhpcy5hcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0fVxuXG5cdHJlbW92ZUNoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBvbGRDaGlsZDogTmd0UmVuZGVyZXJOb2RlLCBpc0hvc3RFbGVtZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGNvbnN0IGNSUyA9IG9sZENoaWxkLl9fbmd0X3JlbmRlcmVyX187XG5cblx0XHRpZiAoXG5cdFx0XHQoIWNSUyB8fCAhcFJTKSAmJlxuXHRcdFx0cGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuXHRcdFx0KG9sZENoaWxkIGluc3RhbmNlb2YgRWxlbWVudCB8fCBvbGRDaGlsZCBpbnN0YW5jZW9mIFRleHQgfHwgb2xkQ2hpbGQgaW5zdGFuY2VvZiBDb21tZW50KVxuXHRcdCkge1xuXHRcdFx0dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKTtcblx0XHRcdHRoaXMuc3RvcmUuZGVzdHJveShvbGRDaGlsZCwgcGFyZW50KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgJiYgKCFwUlMgfHwgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScpKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnJlbW92ZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQpO1xuXHRcdFx0dGhpcy5zdG9yZS5kZXN0cm95KG9sZENoaWxkLCBwYXJlbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJlbW92ZVRocmVlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSB7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRpZiAoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UpIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkLCBpc0hvc3RFbGVtZW50KTtcblx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlIGFzIE5ndFJlbmRlcmVyTm9kZSk7XG5cdH1cblxuXHRwYXJlbnROb2RlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSByZXR1cm4gclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUucGFyZW50Tm9kZShub2RlKTtcblx0fVxuXG5cdHNldEF0dHJpYnV0ZShlbDogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gd2UgZG9uJ3QgaGF2ZSB0aGUgY29tcG91bmQgaW5zdGFuY2UgeWV0XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11bbmFtZV0gPSB2YWx1ZTtcblx0XHRcdGlmICghclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUucXVldWVPcGVyYXRpb24oZWwsIFsnb3AnLCAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSldKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZShyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0sIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHRoaXMuc3RvcmUuYXBwbHlBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdHNldFByb3BlcnR5KGVsOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdC8vIFRPRE86IHNob3VsZCB3ZSBzdXBwb3J0IHJlZiB2YWx1ZVxuXG5cdFx0Y29uc3QgclMgPSBlbC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcblx0XHRcdC8vIHdlIGRvbid0IGhhdmUgdGhlIGNvbXBvdW5kIGluc3RhbmNlIHlldFxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdW25hbWVdID0gdmFsdWU7XG5cdFx0XHRpZiAoIXJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuXHRcdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKGVsLCBbJ29wJywgKCkgPT4gdGhpcy5zZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpXSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0pIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdW1xuXHRcdFx0XHRcdFx0Tmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR7IFtuYW1lXTogdmFsdWUgfSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2V0UHJvcGVydHkoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdLCBuYW1lLCB2YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0dGhpcy5zdG9yZS5hcHBseVByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGxpc3Rlbih0YXJnZXQ6IE5ndFJlbmRlcmVyTm9kZSwgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gYm9vbGVhbiB8IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHRjb25zdCByUyA9IHRhcmdldC5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0Ly8gaWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgX19uZ3RfcmVuZGVyZXJfXywgd2UgZGVsZWdhdGVcblx0XHQvLyBpZiB0YXJnZXQgaXMgRE9NIG5vZGUsIHRoZW4gd2UgcGFzcyB0aGF0IHRvIGRlbGVnYXRlIFJlbmRlcmVyXG5cdFx0aWYgKCFyUyB8fCB0aGlzLnN0b3JlLmlzRE9NKHRhcmdldCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyB8fFxuXHRcdFx0KHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSB8fCB0YXJnZXQ7XG5cdFx0XHRjb25zdCBwcmlvcml0eSA9IGdldExvY2FsU3RhdGUodGFyZ2V0KS5wcmlvcml0eTtcblx0XHRcdGNvbnN0IHRhcmdldENkciA9XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldPy4oKS5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpIHx8XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdPy5fX25ndF9yZW5kZXJlcl9fPy5bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0/LigpLmdldChcblx0XHRcdFx0XHRDaGFuZ2VEZXRlY3RvclJlZixcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gcHJvY2Vzc1RocmVlRXZlbnQoaW5zdGFuY2UsIHByaW9yaXR5IHx8IDAsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIHRoaXMuem9uZSwgdGhpcy5jZHIsIHRhcmdldENkcik7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiAhclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgW1xuXHRcdFx0XHQnb3AnLFxuXHRcdFx0XHQoKSA9PiB0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgWydjbGVhblVwJywgdGhpcy5saXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKV0pLFxuXHRcdFx0XSk7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge307XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGtub3cgdGhhdCB0YXJnZXQgaXMgbm90IERPTSBub2RlXG5cdFx0aWYgKHRhcmdldCA9PT0gdGhpcy5zdG9yZS5yb290U2NlbmUpIHtcblx0XHRcdGxldCBbZG9tVGFyZ2V0LCBldmVudF0gPSBldmVudE5hbWUuc3BsaXQoJzonKTtcblx0XHRcdGlmIChldmVudCA9PSBudWxsKSB7XG5cdFx0XHRcdGV2ZW50ID0gZG9tVGFyZ2V0O1xuXHRcdFx0XHRkb21UYXJnZXQgPSAnJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV2ZW50VGFyZ2V0ID1cblx0XHRcdFx0ZG9tVGFyZ2V0ID09PSAnd2luZG93J1xuXHRcdFx0XHRcdD8gKHRhcmdldCBhcyBOZ3RBbnlSZWNvcmQpWydvd25lckRvY3VtZW50J11bJ2RlZmF1bHRWaWV3J11cblx0XHRcdFx0XHQ6ICh0YXJnZXQgYXMgTmd0QW55UmVjb3JkKVsnb3duZXJEb2N1bWVudCddO1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKGV2ZW50VGFyZ2V0LCBldmVudCwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdHJldHVybiAoKSA9PiB7fTtcblx0fVxuXG5cdHByaXZhdGUgc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTOiBOZ3RSZW5kZXJlclN0YXRlLCBjUlM6IE5ndFJlbmRlcmVyU3RhdGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBwVHlwZSA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV07XG5cdFx0Y29uc3QgY1R5cGUgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdO1xuXHRcdGNvbnN0IGlzUGFyZW50Q29tcG91bmRlZCA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF07XG5cdFx0Y29uc3QgaXNDaGlsZENvbXBvdW5kZWQgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdO1xuXG5cdFx0Ly8gaWYgY2hpbGQgaXMgdGhyZWUgYnV0IGhhdmVuJ3QgYmVlbiBhdHRhY2hlZCB0byBhIHBhcmVudCB5ZXRcblx0XHRjb25zdCBpc0RhbmdsaW5nVGhyZWVDaGlsZCA9IGNUeXBlID09PSAndGhyZWUnICYmICF1bnRyYWNrZWQoZ2V0TG9jYWxTdGF0ZShjaGlsZCkucGFyZW50KTtcblx0XHQvLyBvciBib3RoIHBhcmVudCBhbmQgY2hpbGQgYXJlIERPTSBlbGVtZW50c1xuXHRcdC8vIG9yIHRoZXkgYXJlIGNvbXBvdW5kIEFORCBoYXZlbid0IGhhZCBhIFRIUkVFIGluc3RhbmNlIHlldFxuXHRcdGNvbnN0IGlzUGFyZW50U3RpbGxET00gPSBwVHlwZSA9PT0gJ2RvbScgfHwgKHBUeXBlID09PSAnY29tcG91bmQnICYmICFpc1BhcmVudENvbXBvdW5kZWQpO1xuXHRcdGNvbnN0IGlzQ2hpbGRTdGlsbERPTSA9IGNUeXBlID09PSAnZG9tJyB8fCAoY1R5cGUgPT09ICdjb21wb3VuZCcgJiYgIWlzQ2hpbGRDb21wb3VuZGVkKTtcblx0XHQvLyBhbmQgdGhlIGNoaWxkIGlzIGEgY29tcG91bmRlZCBjb21wb3VuZFxuXHRcdGNvbnN0IGlzQ29tcG91bmRDaGlsZENvbXBvdW5kZWQgPSBjVHlwZSA9PT0gJ2NvbXBvdW5kJyAmJiAhIWlzQ2hpbGRDb21wb3VuZGVkO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGlzRGFuZ2xpbmdUaHJlZUNoaWxkIHx8XG5cdFx0XHQoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NoaWxkU3RpbGxET00pIHx8XG5cdFx0XHQoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NvbXBvdW5kQ2hpbGRDb21wb3VuZGVkKVxuXHRcdCk7XG5cdH1cblxuXHRjcmVhdGVUZXh0ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVUZXh0LmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGRlc3Ryb3kgPSB0aGlzLmRlbGVnYXRlLmRlc3Ryb3kuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0ZGVzdHJveU5vZGU6ICgobm9kZTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXHRzZWxlY3RSb290RWxlbWVudCA9IHRoaXMuZGVsZWdhdGUuc2VsZWN0Um9vdEVsZW1lbnQuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0bmV4dFNpYmxpbmcgPSB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZUF0dHJpYnV0ZSA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGFkZENsYXNzID0gdGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcy5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRyZW1vdmVDbGFzcyA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0c2V0U3R5bGUgPSB0aGlzLmRlbGVnYXRlLnNldFN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZVN0eWxlID0gdGhpcy5kZWxlZ2F0ZS5yZW1vdmVTdHlsZS5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRzZXRWYWx1ZSA9IHRoaXMuZGVsZWdhdGUuc2V0VmFsdWUuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0Z2V0IGRhdGEoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuZGF0YTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZU5ndFJlbmRlcmVyKHN0b3JlOiBOZ3RTdG9yZSwgY29tcG91bmRQcmVmaXhlczogc3RyaW5nW10sIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0aWYgKCFjb21wb3VuZFByZWZpeGVzLmluY2x1ZGVzKCduZ3RzJykpIGNvbXBvdW5kUHJlZml4ZXMucHVzaCgnbmd0cycpO1xuXHRpZiAoIWNvbXBvdW5kUHJlZml4ZXMuaW5jbHVkZXMoJ25ndHAnKSkgY29tcG91bmRQcmVmaXhlcy5wdXNoKCduZ3RwJyk7XG5cblx0cmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG5cdFx0eyBwcm92aWRlOiBSZW5kZXJlckZhY3RvcnkyLCB1c2VDbGFzczogTmd0UmVuZGVyZXJGYWN0b3J5IH0sXG5cdFx0eyBwcm92aWRlOiBOR1RfQ09NUE9VTkRfUFJFRklYRVMsIHVzZVZhbHVlOiBjb21wb3VuZFByZWZpeGVzIH0sXG5cdFx0eyBwcm92aWRlOiBDaGFuZ2VEZXRlY3RvclJlZiwgdXNlVmFsdWU6IGNkciB9LFxuXHRcdHByb3ZpZGVOZ3RTdG9yZShzdG9yZSksXG5cdFx0cHJvdmlkZVpvbmVDaGFuZ2VEZXRlY3Rpb24oeyBydW5Db2FsZXNjaW5nOiB0cnVlLCBldmVudENvYWxlc2Npbmc6IHRydWUgfSksXG5cdF0pO1xufVxuXG5leHBvcnQgeyBleHRlbmQgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5leHBvcnQgeyBIVE1MIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
|