angular-three 2.0.0-beta.31 → 2.0.0-beta.310
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 +221 -4
- package/esm2022/index.mjs +13 -13
- package/esm2022/lib/canvas.mjs +128 -200
- package/esm2022/lib/directives/args.mjs +46 -20
- package/esm2022/lib/directives/selection.mjs +65 -0
- package/esm2022/lib/dom/events.mjs +2 -2
- package/esm2022/lib/events.mjs +33 -31
- package/esm2022/lib/html.mjs +40 -0
- package/esm2022/lib/instance.mjs +43 -36
- package/esm2022/lib/loader.mjs +62 -31
- package/esm2022/lib/loop.mjs +28 -25
- package/esm2022/lib/pipes/hexify.mjs +67 -0
- package/esm2022/lib/portal.mjs +173 -193
- package/esm2022/lib/renderer/catalogue.mjs +2 -2
- package/esm2022/lib/renderer/constants.mjs +5 -6
- package/esm2022/lib/renderer/index.mjs +387 -234
- package/esm2022/lib/renderer/state.mjs +49 -0
- package/esm2022/lib/renderer/utils.mjs +107 -95
- package/esm2022/lib/roots.mjs +85 -61
- package/esm2022/lib/routed-scene.mjs +6 -7
- package/esm2022/lib/store.mjs +170 -194
- package/esm2022/lib/three-types.mjs +2 -2
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/apply-props.mjs +24 -28
- package/esm2022/lib/utils/attach.mjs +12 -9
- package/esm2022/lib/utils/before-render.mjs +12 -0
- package/esm2022/lib/utils/is.mjs +6 -5
- package/esm2022/lib/utils/make.mjs +19 -17
- package/esm2022/lib/utils/non-nullish.mjs +7 -0
- package/esm2022/lib/utils/object-events.mjs +92 -0
- package/esm2022/lib/utils/parameters.mjs +70 -0
- package/esm2022/lib/utils/resolve-ref.mjs +8 -0
- package/esm2022/lib/utils/signal-store.mjs +52 -58
- package/esm2022/lib/utils/update.mjs +8 -4
- package/esm2022/testing/angular-three-testing.mjs +5 -0
- package/esm2022/testing/index.mjs +3 -0
- package/esm2022/testing/lib/test-bed.mjs +130 -0
- package/esm2022/testing/lib/test-canvas.mjs +45 -0
- package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
- package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
- package/fesm2022/angular-three-testing.mjs +966 -0
- package/fesm2022/angular-three-testing.mjs.map +1 -0
- package/fesm2022/angular-three.mjs +2506 -2539
- package/fesm2022/angular-three.mjs.map +1 -1
- package/index.d.ts +14 -12
- package/lib/canvas.d.ts +366 -96
- package/lib/directives/args.d.ts +14 -7
- package/lib/directives/selection.d.ts +17 -0
- package/lib/dom/events.d.ts +2 -3
- package/lib/events.d.ts +4 -80
- package/lib/html.d.ts +17 -0
- package/lib/instance.d.ts +3 -35
- package/lib/loader.d.ts +18 -6
- package/lib/loop.d.ts +11 -59
- package/lib/pipes/hexify.d.ts +20 -0
- package/lib/portal.d.ts +54 -48
- package/lib/renderer/catalogue.d.ts +7 -3
- package/lib/renderer/constants.d.ts +4 -5
- package/lib/renderer/index.d.ts +64 -4
- package/lib/renderer/state.d.ts +24 -0
- package/lib/renderer/utils.d.ts +9 -27
- package/lib/roots.d.ts +9 -7
- package/lib/store.d.ts +13 -141
- package/lib/three-types.d.ts +500 -147
- package/lib/types.d.ts +291 -0
- package/lib/utils/apply-props.d.ts +1 -3
- package/lib/utils/attach.d.ts +3 -5
- package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
- package/lib/utils/is.d.ts +13 -14
- package/lib/utils/make.d.ts +7 -13
- package/lib/utils/non-nullish.d.ts +4 -0
- package/lib/utils/object-events.d.ts +34 -0
- package/lib/utils/parameters.d.ts +20 -0
- package/lib/utils/resolve-ref.d.ts +2 -0
- package/lib/utils/signal-store.d.ts +13 -4
- package/lib/utils/update.d.ts +1 -1
- package/metadata.json +1 -1
- package/package.json +40 -24
- package/plugin/generators.json +8 -30
- package/plugin/package.json +3 -22
- package/plugin/src/generators/add-soba/compat.js.map +1 -0
- package/plugin/src/generators/add-soba/generator.d.ts +3 -0
- package/plugin/src/generators/add-soba/generator.js +78 -0
- package/plugin/src/generators/add-soba/generator.js.map +1 -0
- package/plugin/src/generators/add-soba/schema.json +4 -0
- package/plugin/src/generators/init/compat.d.ts +1 -3
- package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -7
- package/plugin/src/generators/init/generator.d.ts +5 -5
- package/plugin/src/generators/init/generator.js +100 -106
- package/plugin/src/generators/init/generator.js.map +1 -1
- package/plugin/src/generators/init/schema.json +8 -12
- package/plugin/src/generators/utils.js +4 -3
- package/plugin/src/generators/utils.js.map +1 -1
- package/plugin/src/generators/version.d.ts +17 -0
- package/plugin/src/generators/version.js +21 -0
- package/plugin/src/generators/version.js.map +1 -0
- package/plugin/src/index.d.ts +0 -3
- package/plugin/src/index.js +0 -9
- package/plugin/src/index.js.map +1 -1
- package/testing/README.md +3 -0
- package/testing/index.d.ts +2 -0
- package/testing/lib/test-bed.d.ts +38 -0
- package/testing/lib/test-canvas.d.ts +11 -0
- package/testing/lib/utils/mock-canvas.d.ts +5 -0
- package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
- package/testing/package.json +3 -0
- package/web-types.json +1 -1
- package/esm2022/lib/before-render.mjs +0 -13
- package/esm2022/lib/directives/common.mjs +0 -41
- package/esm2022/lib/directives/key.mjs +0 -29
- package/esm2022/lib/directives/parent.mjs +0 -35
- package/esm2022/lib/ref.mjs +0 -48
- package/esm2022/lib/renderer/store.mjs +0 -408
- package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
- package/lib/directives/common.d.ts +0 -15
- package/lib/directives/key.d.ts +0 -10
- package/lib/directives/parent.d.ts +0 -11
- package/lib/ref.d.ts +0 -8
- package/lib/renderer/store.d.ts +0 -67
- package/lib/utils/safe-detect-changes.d.ts +0 -2
- package/plugin/migrations.json +0 -16
- package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +0 -4
- package/plugin/src/generators/init-cannon/compat.js.map +0 -1
- package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
- package/plugin/src/generators/init-cannon/generator.js +0 -23
- package/plugin/src/generators/init-cannon/generator.js.map +0 -1
- package/plugin/src/generators/init-cannon/schema.json +0 -6
- package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
- package/plugin/src/generators/init-postprocessing/compat.js +0 -6
- package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
- package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
- package/plugin/src/generators/init-postprocessing/generator.js +0 -21
- package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
- package/plugin/src/generators/init-postprocessing/schema.json +0 -6
- package/plugin/src/generators/init-soba/compat.d.ts +0 -2
- package/plugin/src/generators/init-soba/compat.js +0 -6
- package/plugin/src/generators/init-soba/compat.js.map +0 -1
- package/plugin/src/generators/init-soba/generator.d.ts +0 -2
- package/plugin/src/generators/init-soba/generator.js +0 -27
- package/plugin/src/generators/init-soba/generator.js.map +0 -1
- package/plugin/src/generators/init-soba/schema.json +0 -6
- package/plugin/src/generators/versions.d.ts +0 -13
- package/plugin/src/generators/versions.js +0 -17
- package/plugin/src/generators/versions.js.map +0 -1
- package/plugin/src/migrations/migrate-to-ngxtension/compat.d.ts +0 -2
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js +0 -6
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js.map +0 -1
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.d.ts +0 -2
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js +0 -41
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js.map +0 -1
- /package/plugin/src/generators/{init-cannon → add-soba}/compat.d.ts +0 -0
- /package/plugin/src/generators/{init-cannon → add-soba}/compat.js +0 -0
|
@@ -1,408 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, Injector, Type, getDebugNode, untracked } from '@angular/core';
|
|
2
|
-
import { NgtArgs } from '../directives/args';
|
|
3
|
-
import { NgtParent } from '../directives/parent';
|
|
4
|
-
import { getLocalState } from '../instance';
|
|
5
|
-
import { NGT_STORE } from '../store';
|
|
6
|
-
import { applyProps } from '../utils/apply-props';
|
|
7
|
-
import { is } from '../utils/is';
|
|
8
|
-
import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES } from './constants';
|
|
9
|
-
import { NgtCompoundClassId, NgtQueueOpClassId, NgtRendererClassId, attachThreeChild, removeThreeChild } from './utils';
|
|
10
|
-
export const NGT_COMPOUND_PREFIXES = new InjectionToken('NgtCompoundPrefixes');
|
|
11
|
-
export class NgtRendererStore {
|
|
12
|
-
constructor(root) {
|
|
13
|
-
this.root = root;
|
|
14
|
-
this.comments = [];
|
|
15
|
-
}
|
|
16
|
-
createNode(type, node) {
|
|
17
|
-
const state = [
|
|
18
|
-
type,
|
|
19
|
-
null,
|
|
20
|
-
null,
|
|
21
|
-
[],
|
|
22
|
-
false,
|
|
23
|
-
undefined,
|
|
24
|
-
undefined,
|
|
25
|
-
undefined,
|
|
26
|
-
undefined,
|
|
27
|
-
undefined,
|
|
28
|
-
undefined,
|
|
29
|
-
undefined,
|
|
30
|
-
undefined,
|
|
31
|
-
undefined,
|
|
32
|
-
undefined,
|
|
33
|
-
];
|
|
34
|
-
const rendererNode = Object.assign(node, { __ngt_renderer__: state });
|
|
35
|
-
// NOTE: assign ownerDocument to node so we can use HostListener in Component
|
|
36
|
-
if (!rendererNode['ownerDocument'])
|
|
37
|
-
rendererNode['ownerDocument'] = this.root.document;
|
|
38
|
-
// NOTE: assign injectorFactory on non-three type since
|
|
39
|
-
// rendererNode is an instance of DOM Node
|
|
40
|
-
if (state[NgtRendererClassId.type] !== 'three') {
|
|
41
|
-
state[NgtRendererClassId.injectorFactory] = () => getDebugNode(rendererNode).injector;
|
|
42
|
-
}
|
|
43
|
-
if (state[NgtRendererClassId.type] === 'comment') {
|
|
44
|
-
// NOTE: we attach an arrow function to the Comment node
|
|
45
|
-
// In our directives, we can call this function to then start tracking the RendererNode
|
|
46
|
-
// this is done to limit the amount of Nodes we need to process for getCreationState
|
|
47
|
-
rendererNode[SPECIAL_INTERNAL_ADD_COMMENT] = (node) => {
|
|
48
|
-
if (node && node.__ngt_renderer__[NgtRendererClassId.type] === 'portal') {
|
|
49
|
-
this.portals.push(node);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
this.comments.push(rendererNode);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
return rendererNode;
|
|
56
|
-
}
|
|
57
|
-
if (state[NgtRendererClassId.type] === 'compound') {
|
|
58
|
-
state[NgtRendererClassId.queueOps] = new Set();
|
|
59
|
-
state[NgtRendererClassId.attributes] = {};
|
|
60
|
-
state[NgtRendererClassId.properties] = {};
|
|
61
|
-
return rendererNode;
|
|
62
|
-
}
|
|
63
|
-
return rendererNode;
|
|
64
|
-
}
|
|
65
|
-
setParent(node, parent) {
|
|
66
|
-
if (!node.__ngt_renderer__[NgtRendererClassId.parent]) {
|
|
67
|
-
node.__ngt_renderer__[NgtRendererClassId.parent] = parent;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
addChild(node, child) {
|
|
71
|
-
if (!node.__ngt_renderer__[NgtRendererClassId.children].includes(child)) {
|
|
72
|
-
node.__ngt_renderer__[NgtRendererClassId.children].push(child);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
removeChild(node, child) {
|
|
76
|
-
const index = node.__ngt_renderer__?.[NgtRendererClassId.children].findIndex((c) => child === c);
|
|
77
|
-
if (index >= 0) {
|
|
78
|
-
node.__ngt_renderer__[NgtRendererClassId.children].splice(index, 1);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
setCompound(compound, instance) {
|
|
82
|
-
const instanceRS = instance.__ngt_renderer__;
|
|
83
|
-
if (instanceRS && instanceRS[NgtRendererClassId.parent]) {
|
|
84
|
-
const parentRS = instanceRS[NgtRendererClassId.parent].__ngt_renderer__;
|
|
85
|
-
// NOTE: if instance is already compounded by its parent. skip
|
|
86
|
-
if (parentRS[NgtRendererClassId.type] === 'compound' &&
|
|
87
|
-
parentRS[NgtRendererClassId.compounded] === instance) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const rS = compound.__ngt_renderer__;
|
|
92
|
-
rS[NgtRendererClassId.compounded] = instance;
|
|
93
|
-
const attributes = Object.keys(rS[NgtRendererClassId.attributes]);
|
|
94
|
-
const properties = Object.keys(rS[NgtRendererClassId.properties]);
|
|
95
|
-
for (const key of attributes) {
|
|
96
|
-
this.applyAttribute(instance, key, rS[NgtRendererClassId.attributes][key]);
|
|
97
|
-
}
|
|
98
|
-
for (const key of properties) {
|
|
99
|
-
this.applyProperty(instance, key, rS[NgtRendererClassId.properties][key]);
|
|
100
|
-
}
|
|
101
|
-
this.executeOperation(compound);
|
|
102
|
-
}
|
|
103
|
-
queueOperation(node, op) {
|
|
104
|
-
node.__ngt_renderer__[NgtRendererClassId.queueOps].add(op);
|
|
105
|
-
}
|
|
106
|
-
executeOperation(node, type = 'op') {
|
|
107
|
-
const rS = node.__ngt_renderer__;
|
|
108
|
-
if (rS[NgtRendererClassId.queueOps]?.size) {
|
|
109
|
-
rS[NgtRendererClassId.queueOps].forEach((op) => {
|
|
110
|
-
if (op[NgtQueueOpClassId.type] === type) {
|
|
111
|
-
op[NgtQueueOpClassId.op]();
|
|
112
|
-
rS[NgtRendererClassId.queueOps].delete(op);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
processPortalContainer(portal) {
|
|
118
|
-
const injectorFactory = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory];
|
|
119
|
-
const injector = injectorFactory?.();
|
|
120
|
-
if (!injector)
|
|
121
|
-
return;
|
|
122
|
-
const portalStore = injector.get(NGT_STORE, null);
|
|
123
|
-
if (!portalStore)
|
|
124
|
-
return;
|
|
125
|
-
const portalContainer = portalStore.get('scene');
|
|
126
|
-
if (!portalContainer)
|
|
127
|
-
return;
|
|
128
|
-
portal.__ngt_renderer__[NgtRendererClassId.portalContainer] = this.createNode('three', portalContainer);
|
|
129
|
-
}
|
|
130
|
-
applyAttribute(node, name, value) {
|
|
131
|
-
const rS = node.__ngt_renderer__;
|
|
132
|
-
if (rS[NgtRendererClassId.destroyed])
|
|
133
|
-
return;
|
|
134
|
-
if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
|
|
135
|
-
// NOTE: priority needs to be set as an attribute string so that they can be set as early as possible
|
|
136
|
-
// we convert that string to a number. if it's invalid, default 0
|
|
137
|
-
let priority = Number(value);
|
|
138
|
-
if (isNaN(priority)) {
|
|
139
|
-
priority = 0;
|
|
140
|
-
console.warn(`[NGT] "priority" is an invalid number, default to 0`);
|
|
141
|
-
}
|
|
142
|
-
getLocalState(node).priority = priority;
|
|
143
|
-
}
|
|
144
|
-
if (name === SPECIAL_PROPERTIES.COMPOUND) {
|
|
145
|
-
// NOTE: we set the compound property on instance node now so we know that this instance is being compounded
|
|
146
|
-
rS[NgtRendererClassId.compound] = [value === '' || value === 'first', {}];
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
150
|
-
// NOTE: handle attach as tring
|
|
151
|
-
const paths = value.split('.');
|
|
152
|
-
if (paths.length)
|
|
153
|
-
getLocalState(node).attach = paths;
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
if (name === SPECIAL_PROPERTIES.VALUE) {
|
|
157
|
-
// NOTE: coercion
|
|
158
|
-
let maybeCoerced = value;
|
|
159
|
-
if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
|
|
160
|
-
maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
|
|
161
|
-
}
|
|
162
|
-
else if (!isNaN(Number(maybeCoerced))) {
|
|
163
|
-
maybeCoerced = Number(maybeCoerced);
|
|
164
|
-
}
|
|
165
|
-
rS[NgtRendererClassId.rawValue] = maybeCoerced;
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
applyProps(node, { [name]: value });
|
|
169
|
-
this.updateNativeProps(node, name, value);
|
|
170
|
-
}
|
|
171
|
-
applyProperty(node, name, value) {
|
|
172
|
-
const rS = node.__ngt_renderer__;
|
|
173
|
-
if (rS[NgtRendererClassId.destroyed])
|
|
174
|
-
return;
|
|
175
|
-
// [ref]
|
|
176
|
-
if (name === SPECIAL_PROPERTIES.REF && is.ref(value)) {
|
|
177
|
-
rS[NgtRendererClassId.ref] = value;
|
|
178
|
-
value.nativeElement = node;
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
const parent = getLocalState(node).parent() || rS[NgtRendererClassId.parent];
|
|
182
|
-
// [rawValue]
|
|
183
|
-
if (getLocalState(node).isRaw && name === SPECIAL_PROPERTIES.VALUE) {
|
|
184
|
-
rS[NgtRendererClassId.rawValue] = value;
|
|
185
|
-
if (parent)
|
|
186
|
-
attachThreeChild(parent, node);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
// [attach]
|
|
190
|
-
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
191
|
-
getLocalState(node).attach = Array.isArray(value) ? value.map((v) => v.toString()) : value;
|
|
192
|
-
if (parent)
|
|
193
|
-
attachThreeChild(parent, node);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
const compound = rS[NgtRendererClassId.compound];
|
|
197
|
-
if (compound?.[NgtCompoundClassId.props] &&
|
|
198
|
-
name in compound[NgtCompoundClassId.props] &&
|
|
199
|
-
!compound[NgtCompoundClassId.applyFirst]) {
|
|
200
|
-
value = compound[NgtCompoundClassId.props][name];
|
|
201
|
-
}
|
|
202
|
-
applyProps(node, { [name]: value });
|
|
203
|
-
this.updateNativeProps(node, name, value);
|
|
204
|
-
}
|
|
205
|
-
isCompound(name) {
|
|
206
|
-
return this.root.compoundPrefixes.some((prefix) => name.startsWith(prefix));
|
|
207
|
-
}
|
|
208
|
-
isDOM(node) {
|
|
209
|
-
const rS = node['__ngt_renderer__'];
|
|
210
|
-
return (!rS ||
|
|
211
|
-
(rS[NgtRendererClassId.type] !== 'compound' &&
|
|
212
|
-
(node instanceof Element || node instanceof Document || node instanceof Window)));
|
|
213
|
-
}
|
|
214
|
-
get rootScene() {
|
|
215
|
-
return this.root.store.get('scene');
|
|
216
|
-
}
|
|
217
|
-
get portals() {
|
|
218
|
-
return this.root.portals;
|
|
219
|
-
}
|
|
220
|
-
getClosestParentWithInstance(node) {
|
|
221
|
-
let parent = node.__ngt_renderer__[NgtRendererClassId.parent];
|
|
222
|
-
while (parent && parent.__ngt_renderer__[NgtRendererClassId.type] !== 'three') {
|
|
223
|
-
parent = parent.__ngt_renderer__[NgtRendererClassId.portalContainer]
|
|
224
|
-
? parent.__ngt_renderer__[NgtRendererClassId.portalContainer]
|
|
225
|
-
: parent.__ngt_renderer__[NgtRendererClassId.parent];
|
|
226
|
-
}
|
|
227
|
-
return parent;
|
|
228
|
-
}
|
|
229
|
-
getClosestParentWithCompound(node) {
|
|
230
|
-
if (node.__ngt_renderer__[NgtRendererClassId.compoundParent]) {
|
|
231
|
-
return node.__ngt_renderer__[NgtRendererClassId.compoundParent];
|
|
232
|
-
}
|
|
233
|
-
let parent = node.__ngt_renderer__[NgtRendererClassId.parent];
|
|
234
|
-
if (parent &&
|
|
235
|
-
parent.__ngt_renderer__[NgtRendererClassId.type] === 'compound' &&
|
|
236
|
-
!parent.__ngt_renderer__[NgtRendererClassId.compounded]) {
|
|
237
|
-
return parent;
|
|
238
|
-
}
|
|
239
|
-
while (parent &&
|
|
240
|
-
(parent.__ngt_renderer__[NgtRendererClassId.type] === 'three' ||
|
|
241
|
-
!parent.__ngt_renderer__[NgtRendererClassId.compoundParent] ||
|
|
242
|
-
parent.__ngt_renderer__[NgtRendererClassId.type] !== 'compound')) {
|
|
243
|
-
parent = parent.__ngt_renderer__[NgtRendererClassId.parent];
|
|
244
|
-
}
|
|
245
|
-
if (!parent)
|
|
246
|
-
return;
|
|
247
|
-
if (parent.__ngt_renderer__[NgtRendererClassId.type] === 'three' &&
|
|
248
|
-
parent.__ngt_renderer__[NgtRendererClassId.compoundParent]) {
|
|
249
|
-
return parent.__ngt_renderer__[NgtRendererClassId.compoundParent];
|
|
250
|
-
}
|
|
251
|
-
if (!parent.__ngt_renderer__[NgtRendererClassId.compounded]) {
|
|
252
|
-
return parent;
|
|
253
|
-
}
|
|
254
|
-
return null;
|
|
255
|
-
}
|
|
256
|
-
getCreationState() {
|
|
257
|
-
const injectedArgs = this.firstNonInjectedDirective(NgtArgs)?.args || [];
|
|
258
|
-
const injectedParent = this.firstNonInjectedDirective(NgtParent)?.parent || null;
|
|
259
|
-
const store = this.tryGetPortalStore();
|
|
260
|
-
return { injectedArgs, injectedParent, store };
|
|
261
|
-
}
|
|
262
|
-
destroy(node, parent) {
|
|
263
|
-
const rS = node.__ngt_renderer__;
|
|
264
|
-
if (!rS || rS[NgtRendererClassId.destroyed])
|
|
265
|
-
return;
|
|
266
|
-
if (rS[NgtRendererClassId.type] === 'three') {
|
|
267
|
-
rS[NgtRendererClassId.compound] = undefined;
|
|
268
|
-
rS[NgtRendererClassId.compoundParent] = undefined;
|
|
269
|
-
const localState = getLocalState(node);
|
|
270
|
-
if (localState.objects) {
|
|
271
|
-
untracked(localState.objects).forEach((obj) => this.destroy(obj, parent));
|
|
272
|
-
}
|
|
273
|
-
if (localState.nonObjects) {
|
|
274
|
-
untracked(localState.nonObjects).forEach((obj) => this.destroy(obj, parent));
|
|
275
|
-
}
|
|
276
|
-
if (localState.afterUpdate)
|
|
277
|
-
localState.afterUpdate.complete();
|
|
278
|
-
if (localState.afterAttach)
|
|
279
|
-
localState.afterAttach.complete();
|
|
280
|
-
delete localState['objects'];
|
|
281
|
-
delete localState['nonObjects'];
|
|
282
|
-
delete localState['nativeProps'];
|
|
283
|
-
delete localState['add'];
|
|
284
|
-
delete localState['remove'];
|
|
285
|
-
delete localState['afterUpdate'];
|
|
286
|
-
delete localState['afterAttach'];
|
|
287
|
-
delete localState['store'];
|
|
288
|
-
delete localState['handlers'];
|
|
289
|
-
if (!localState.primitive) {
|
|
290
|
-
delete node['__ngt__'];
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (rS[NgtRendererClassId.type] === 'comment') {
|
|
294
|
-
rS[NgtRendererClassId.injectorFactory] = null;
|
|
295
|
-
delete node[SPECIAL_INTERNAL_ADD_COMMENT];
|
|
296
|
-
const index = this.comments.findIndex((comment) => comment === node);
|
|
297
|
-
if (index > -1) {
|
|
298
|
-
this.comments.splice(index, 1);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
if (rS[NgtRendererClassId.type] === 'portal') {
|
|
302
|
-
rS[NgtRendererClassId.injectorFactory] = null;
|
|
303
|
-
const index = this.portals.findIndex((portal) => portal === node);
|
|
304
|
-
if (index > -1) {
|
|
305
|
-
this.portals.splice(index, 1);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
if (rS[NgtRendererClassId.type] === 'compound') {
|
|
309
|
-
rS[NgtRendererClassId.compounded] = undefined;
|
|
310
|
-
rS[NgtRendererClassId.attributes] = null;
|
|
311
|
-
rS[NgtRendererClassId.properties] = null;
|
|
312
|
-
this.executeOperation(node, 'cleanUp');
|
|
313
|
-
rS[NgtRendererClassId.queueOps].clear();
|
|
314
|
-
rS[NgtRendererClassId.queueOps] = null;
|
|
315
|
-
}
|
|
316
|
-
if (rS[NgtRendererClassId.ref]) {
|
|
317
|
-
// nullify ref
|
|
318
|
-
// but we do it later so that it doesn't hinder render
|
|
319
|
-
// TODO: will this cause memory leak?
|
|
320
|
-
requestAnimationFrame(() => {
|
|
321
|
-
rS[NgtRendererClassId.ref].nativeElement = null;
|
|
322
|
-
rS[NgtRendererClassId.ref] = undefined;
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
// nullify parent
|
|
326
|
-
rS[NgtRendererClassId.parent] = null;
|
|
327
|
-
for (const renderChild of rS[NgtRendererClassId.children] || []) {
|
|
328
|
-
if (renderChild.__ngt_renderer__?.[NgtRendererClassId.type] === 'three' && parent) {
|
|
329
|
-
const closestInstance = this.getClosestParentWithInstance(parent);
|
|
330
|
-
if (closestInstance) {
|
|
331
|
-
removeThreeChild(closestInstance, renderChild, true);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
this.destroy(renderChild, parent);
|
|
335
|
-
}
|
|
336
|
-
rS[NgtRendererClassId.children] = [];
|
|
337
|
-
rS[NgtRendererClassId.destroyed] = true;
|
|
338
|
-
if (parent) {
|
|
339
|
-
this.removeChild(parent, node);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
updateNativeProps(node, key, value) {
|
|
343
|
-
const localState = getLocalState(node);
|
|
344
|
-
if (!localState || !localState.nativeProps)
|
|
345
|
-
return;
|
|
346
|
-
localState.nativeProps.set({ [key]: value });
|
|
347
|
-
}
|
|
348
|
-
firstNonInjectedDirective(dir) {
|
|
349
|
-
let directive;
|
|
350
|
-
const destroyed = [];
|
|
351
|
-
let i = this.comments.length - 1;
|
|
352
|
-
while (i >= 0) {
|
|
353
|
-
const comment = this.comments[i];
|
|
354
|
-
if (comment.__ngt_renderer__[NgtRendererClassId.destroyed]) {
|
|
355
|
-
destroyed.push(i);
|
|
356
|
-
i--;
|
|
357
|
-
continue;
|
|
358
|
-
}
|
|
359
|
-
const injector = comment.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
|
|
360
|
-
if (!injector) {
|
|
361
|
-
i--;
|
|
362
|
-
continue;
|
|
363
|
-
}
|
|
364
|
-
const instance = injector.get(dir, null);
|
|
365
|
-
if (instance && instance.validate()) {
|
|
366
|
-
directive = instance;
|
|
367
|
-
break;
|
|
368
|
-
}
|
|
369
|
-
i--;
|
|
370
|
-
}
|
|
371
|
-
destroyed.forEach((index) => {
|
|
372
|
-
this.comments.splice(index, 1);
|
|
373
|
-
});
|
|
374
|
-
return directive;
|
|
375
|
-
}
|
|
376
|
-
tryGetPortalStore() {
|
|
377
|
-
let store;
|
|
378
|
-
const destroyed = [];
|
|
379
|
-
// we only care about the portal states because NgtStore only differs per Portal
|
|
380
|
-
let i = this.portals.length - 1;
|
|
381
|
-
while (i >= 0) {
|
|
382
|
-
// loop through the portal state backwards to find the closest NgtStore
|
|
383
|
-
const portal = this.portals[i];
|
|
384
|
-
if (portal.__ngt_renderer__[NgtRendererClassId.destroyed]) {
|
|
385
|
-
destroyed.push(i);
|
|
386
|
-
i--;
|
|
387
|
-
continue;
|
|
388
|
-
}
|
|
389
|
-
const injector = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
|
|
390
|
-
if (!injector) {
|
|
391
|
-
i--;
|
|
392
|
-
continue;
|
|
393
|
-
}
|
|
394
|
-
const instance = injector.get(NGT_STORE, null);
|
|
395
|
-
// only the instance with previousRoot should pass
|
|
396
|
-
if (instance && instance.get('previousRoot')) {
|
|
397
|
-
store = instance;
|
|
398
|
-
break;
|
|
399
|
-
}
|
|
400
|
-
i--;
|
|
401
|
-
}
|
|
402
|
-
destroyed.forEach((index) => {
|
|
403
|
-
this.portals.splice(index, 1);
|
|
404
|
-
});
|
|
405
|
-
return store || this.root.store;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQXdCLE1BQU0sYUFBYSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxTQUFTLEVBQWlCLE1BQU0sVUFBVSxDQUFDO0FBRXBELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQVcscUJBQXFCLENBQUMsQ0FBQztBQWdDekYsTUFBTSxPQUFPLGdCQUFnQjtJQUc1QixZQUFvQixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUZ0QyxhQUFRLEdBQUcsRUFBNEIsQ0FBQztJQUVDLENBQUM7SUFFbEQsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDN0UsTUFBTSxLQUFLLEdBQUc7WUFDYixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7U0FDVSxDQUFDO1FBRXRCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV0RSw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7WUFBRSxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFdkYsdURBQXVEO1FBQ3ZELDBDQUEwQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLEVBQUU7WUFDL0MsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkY7UUFFRCxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDakQsd0RBQXdEO1lBQ3hELHVGQUF1RjtZQUN2RixvRkFBb0Y7WUFDcEYsWUFBWSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxJQUFzQixFQUFFLEVBQUU7Z0JBQ3ZFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ3hFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDakM7WUFDRixDQUFDLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQztTQUNwQjtRQUVELElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNsRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsT0FBTyxZQUFZLENBQUM7U0FDcEI7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUNyQixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQXFCLEVBQUUsTUFBdUI7UUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO1NBQzFEO0lBQ0YsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFxQixFQUFFLEtBQXNCO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0Q7SUFDRixDQUFDO0lBRUQsV0FBVyxDQUFDLElBQXFCLEVBQUUsS0FBc0I7UUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakcsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDcEU7SUFDRixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7UUFDL0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBRTdDLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4RCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLENBQUM7WUFDeEUsOERBQThEO1lBQzlELElBQ0MsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVU7Z0JBQ2hELFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxRQUFRLEVBQ25EO2dCQUNELE9BQU87YUFDUDtTQUNEO1FBRUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNsRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRWxFLEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO1lBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMzRTtRQUVELEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMxRTtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQXFCLEVBQUUsRUFBYztRQUNuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFxQixFQUFFLE9BQTJDLElBQUk7UUFDOUYsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRTtZQUMxQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQzlDLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDeEMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQzNDO1lBQ0YsQ0FBQyxDQUFDLENBQUM7U0FDSDtJQUNGLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxNQUF1QjtRQUM3QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEYsTUFBTSxRQUFRLEdBQUcsZUFBZSxFQUFFLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBRXpCLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBRTdCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQWE7UUFDaEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU87UUFDN0MsSUFBSSxJQUFJLEtBQUssa0JBQWtCLENBQUMsZUFBZSxFQUFFO1lBQ2hELHFHQUFxRztZQUNyRyxpRUFBaUU7WUFDakUsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNwQixRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQzthQUNwRTtZQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxJQUFJLEtBQUssa0JBQWtCLENBQUMsUUFBUSxFQUFFO1lBQ3pDLDRHQUE0RztZQUM1RyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUUsT0FBTztTQUNQO1FBRUQsSUFBSSxJQUFJLEtBQUssa0JBQWtCLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLCtCQUErQjtZQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDckQsT0FBTztTQUNQO1FBRUQsSUFBSSxJQUFJLEtBQUssa0JBQWtCLENBQUMsS0FBSyxFQUFFO1lBQ3RDLGlCQUFpQjtZQUNqQixJQUFJLFlBQVksR0FBOEIsS0FBSyxDQUFDO1lBQ3BELElBQUksWUFBWSxLQUFLLEVBQUUsSUFBSSxZQUFZLEtBQUssTUFBTSxJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUU7Z0JBQy9FLFlBQVksR0FBRyxZQUFZLEtBQUssTUFBTSxJQUFJLFlBQVksS0FBSyxFQUFFLENBQUM7YUFDOUQ7aUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRTtnQkFDeEMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNwQztZQUNELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUM7WUFDL0MsT0FBTztTQUNQO1FBRUQsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQXFCLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDNUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU87UUFFN0MsUUFBUTtRQUNSLElBQUksSUFBSSxLQUFLLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDbkMsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDM0IsT0FBTztTQUNQO1FBRUQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3RSxhQUFhO1FBQ2IsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7WUFDbkUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN4QyxJQUFJLE1BQU07Z0JBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU87U0FDUDtRQUVELFdBQVc7UUFDWCxJQUFJLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDdkMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzNGLElBQUksTUFBTTtnQkFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0MsT0FBTztTQUNQO1FBRUQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELElBQ0MsUUFBUSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQ3BDLElBQUksSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQzFDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUN2QztZQUNELEtBQUssR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakQ7UUFFRCxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWTtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFrQjtRQUN2QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQ04sQ0FBQyxFQUFFO1lBQ0gsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVTtnQkFDMUMsQ0FBQyxJQUFJLFlBQVksT0FBTyxJQUFJLElBQUksWUFBWSxRQUFRLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksT0FBTztRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQXFCO1FBQ2pELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxFQUFFO1lBQzlFLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDO2dCQUNuRSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztnQkFDN0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0RDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQXFCO1FBQ2pELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELElBQ0MsTUFBTTtZQUNOLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVO1lBQy9ELENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUN0RDtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2Q7UUFFRCxPQUNDLE1BQU07WUFDTixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPO2dCQUM1RCxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUM7Z0JBQzNELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsRUFDaEU7WUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBCLElBQ0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU87WUFDNUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxFQUN6RDtZQUNELE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1RCxPQUFPLE1BQU0sQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDakYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFxQixFQUFFLE1BQXdCO1FBQ3RELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPO1FBQ3BELElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU8sRUFBRTtZQUM1QyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBVSxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxTQUFVLENBQUM7WUFFbkQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDdkIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDMUU7WUFFRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzFCLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQzdFO1lBRUQsSUFBSSxVQUFVLENBQUMsV0FBVztnQkFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlELElBQUksVUFBVSxDQUFDLFdBQVc7Z0JBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUU5RCxPQUFRLFVBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MsT0FBUSxVQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xELE9BQVEsVUFBMkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxPQUFRLFVBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsT0FBUSxVQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLE9BQVEsVUFBMkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxPQUFRLFVBQTJCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkQsT0FBUSxVQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE9BQVEsVUFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVoRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtnQkFDMUIsT0FBUSxJQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Q7UUFFRCxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDOUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUssQ0FBQztZQUMvQyxPQUFRLElBQXFCLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3JFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvQjtTQUNEO1FBRUQsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQzdDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFLLENBQUM7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNsRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDOUI7U0FDRDtRQUVELElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUMvQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBVSxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFLLENBQUM7WUFDMUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUssQ0FBQztZQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsY0FBYztZQUNkLHNEQUFzRDtZQUN0RCxxQ0FBcUM7WUFDckMscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUMxQixFQUFFLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDaEQsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVUsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztTQUNIO1FBRUQsaUJBQWlCO1FBQ2pCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDckMsS0FBSyxNQUFNLFdBQVcsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hFLElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLE1BQU0sRUFBRTtnQkFDbEYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLGVBQWUsRUFBRTtvQkFDcEIsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDckQ7YUFDRDtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLElBQUksTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDL0I7SUFDRixDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBcUIsRUFBRSxHQUFXLEVBQUUsS0FBVTtRQUN2RSxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUNuRCxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8seUJBQXlCLENBQStCLEdBQVk7UUFDM0UsSUFBSSxTQUF3QixDQUFDO1FBRTdCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDM0QsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osU0FBUzthQUNUO1lBQ0QsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDaEYsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZCxDQUFDLEVBQUUsQ0FBQztnQkFDSixTQUFTO2FBQ1Q7WUFDRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3BDLFNBQVMsR0FBRyxRQUFRLENBQUM7Z0JBQ3JCLE1BQU07YUFDTjtZQUVELENBQUMsRUFBRSxDQUFDO1NBQ0o7UUFFRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVPLGlCQUFpQjtRQUN4QixJQUFJLEtBQTJDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGdGQUFnRjtRQUNoRixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsdUVBQXVFO1lBQ3ZFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzFELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsRUFBRSxDQUFDO2dCQUNKLFNBQVM7YUFDVDtZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQy9FLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2QsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osU0FBUzthQUNUO1lBQ0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0Msa0RBQWtEO1lBQ2xELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQzdDLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ2pCLE1BQU07YUFDTjtZQUNELENBQUMsRUFBRSxDQUFDO1NBQ0o7UUFFRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yLCBUeXBlLCBnZXREZWJ1Z05vZGUsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncyB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYXJncyc7XG5pbXBvcnQgdHlwZSB7IE5ndENvbW1vbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY29tbW9uJztcbmltcG9ydCB7IE5ndFBhcmVudCB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcGFyZW50JztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUsIHR5cGUgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi4vaW5zdGFuY2UnO1xuaW1wb3J0IHR5cGUgeyBOZ3RSZWYgfSBmcm9tICcuLi9yZWYnO1xuaW1wb3J0IHsgTkdUX1NUT1JFLCB0eXBlIE5ndFN0YXRlIH0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgdHlwZSB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi4vdXRpbHMvc2lnbmFsLXN0b3JlJztcbmltcG9ydCB7IFNQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlQsIFNQRUNJQUxfUFJPUEVSVElFUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5ndENvbXBvdW5kQ2xhc3NJZCwgTmd0UXVldWVPcENsYXNzSWQsIE5ndFJlbmRlcmVyQ2xhc3NJZCwgYXR0YWNoVGhyZWVDaGlsZCwgcmVtb3ZlVGhyZWVDaGlsZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgTkdUX0NPTVBPVU5EX1BSRUZJWEVTID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZ1tdPignTmd0Q29tcG91bmRQcmVmaXhlcycpO1xuXG50eXBlIE5ndFJlbmRlcmVyUm9vdFN0YXRlID0ge1xuXHRzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+O1xuXHRjb21wb3VuZFByZWZpeGVzOiBzdHJpbmdbXTtcblx0ZG9jdW1lbnQ6IERvY3VtZW50O1xuXHRwb3J0YWxzOiBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xufTtcblxudHlwZSBOZ3RRdWV1ZU9wID0gW3R5cGU6ICdvcCcgfCAnY2xlYW5VcCcsIG9wOiAoKSA9PiB2b2lkLCBkb25lPzogdHJ1ZV07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyU3RhdGUgPSBbXG5cdHR5cGU6ICd0aHJlZScgfCAnY29tcG91bmQnIHwgJ3BvcnRhbCcgfCAnY29tbWVudCcgfCAnZG9tJyxcblx0cGFyZW50OiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsLFxuXHRpbmplY3RlZFBhcmVudDogTmd0UmVmPE5ndFJlbmRlcmVyTm9kZT4gfCBudWxsLFxuXHRjaGlsZHJlbjogTmd0UmVuZGVyZXJOb2RlW10sXG5cdGRlc3Ryb3llZDogYm9vbGVhbixcblx0Y29tcG91bmQ6IFthcHBseUZpcnN0OiBib29sZWFuLCBwcm9wczogTmd0QW55UmVjb3JkXSxcblx0Y29tcG91bmRQYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0Y29tcG91bmRlZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRxdWV1ZU9wczogU2V0PE5ndFF1ZXVlT3A+LFxuXHRhdHRyaWJ1dGVzOiBOZ3RBbnlSZWNvcmQsXG5cdHByb3BlcnRpZXM6IE5ndEFueVJlY29yZCxcblx0cmF3VmFsdWU6IGFueSxcblx0cmVmOiBhbnksXG5cdHBvcnRhbENvbnRhaW5lcjogTmd0UmVuZGVyZXJOb2RlLFxuXHRpbmplY3RvckZhY3Rvcnk6ICgpID0+IEluamVjdG9yLFxuXTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJOb2RlID0ge1xuXHRfX25ndF9yZW5kZXJlcl9fOiBOZ3RSZW5kZXJlclN0YXRlO1xufTtcbmV4cG9ydCBjbGFzcyBOZ3RSZW5kZXJlclN0b3JlIHtcblx0cHJpdmF0ZSBjb21tZW50cyA9IFtdIGFzIEFycmF5PE5ndFJlbmRlcmVyTm9kZT47XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSByb290OiBOZ3RSZW5kZXJlclJvb3RTdGF0ZSkge31cblxuXHRjcmVhdGVOb2RlKHR5cGU6IE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdLCBub2RlOiBOZ3RBbnlSZWNvcmQpIHtcblx0XHRjb25zdCBzdGF0ZSA9IFtcblx0XHRcdHR5cGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0bnVsbCxcblx0XHRcdFtdLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdF0gYXMgTmd0UmVuZGVyZXJTdGF0ZTtcblxuXHRcdGNvbnN0IHJlbmRlcmVyTm9kZSA9IE9iamVjdC5hc3NpZ24obm9kZSwgeyBfX25ndF9yZW5kZXJlcl9fOiBzdGF0ZSB9KTtcblxuXHRcdC8vIE5PVEU6IGFzc2lnbiBvd25lckRvY3VtZW50IHRvIG5vZGUgc28gd2UgY2FuIHVzZSBIb3N0TGlzdGVuZXIgaW4gQ29tcG9uZW50XG5cdFx0aWYgKCFyZW5kZXJlck5vZGVbJ293bmVyRG9jdW1lbnQnXSkgcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10gPSB0aGlzLnJvb3QuZG9jdW1lbnQ7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gaW5qZWN0b3JGYWN0b3J5IG9uIG5vbi10aHJlZSB0eXBlIHNpbmNlXG5cdFx0Ly8gcmVuZGVyZXJOb2RlIGlzIGFuIGluc3RhbmNlIG9mIERPTSBOb2RlXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSAoKSA9PiBnZXREZWJ1Z05vZGUocmVuZGVyZXJOb2RlKSEuaW5qZWN0b3I7XG5cdFx0fVxuXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHQvLyBOT1RFOiB3ZSBhdHRhY2ggYW4gYXJyb3cgZnVuY3Rpb24gdG8gdGhlIENvbW1lbnQgbm9kZVxuXHRcdFx0Ly8gSW4gb3VyIGRpcmVjdGl2ZXMsIHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdGhlbiBzdGFydCB0cmFja2luZyB0aGUgUmVuZGVyZXJOb2RlXG5cdFx0XHQvLyB0aGlzIGlzIGRvbmUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBOb2RlcyB3ZSBuZWVkIHRvIHByb2Nlc3MgZm9yIGdldENyZWF0aW9uU3RhdGVcblx0XHRcdHJlbmRlcmVyTm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXSA9IChub2RlPzogTmd0UmVuZGVyZXJOb2RlKSA9PiB7XG5cdFx0XHRcdGlmIChub2RlICYmIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG5cdFx0XHRcdFx0dGhpcy5wb3J0YWxzLnB1c2gobm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jb21tZW50cy5wdXNoKHJlbmRlcmVyTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gcmVuZGVyZXJOb2RlO1xuXHRcdH1cblxuXHRcdGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10gPSBuZXcgU2V0KCk7XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10gPSB7fTtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IHt9O1xuXHRcdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVuZGVyZXJOb2RlO1xuXHR9XG5cblx0c2V0UGFyZW50KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50OiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuXHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gcGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdGFkZENoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGlmICghbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uaW5jbHVkZXMoY2hpbGQpKSB7XG5cdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH1cblxuXHRyZW1vdmVDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbmRleCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uZmluZEluZGV4KChjKSA9PiBjaGlsZCA9PT0gYyk7XG5cdFx0aWYgKGluZGV4ID49IDApIHtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fVxuXHR9XG5cblx0c2V0Q29tcG91bmQoY29tcG91bmQ6IE5ndFJlbmRlcmVyTm9kZSwgaW5zdGFuY2U6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IGluc3RhbmNlUlMgPSBpbnN0YW5jZS5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0aWYgKGluc3RhbmNlUlMgJiYgaW5zdGFuY2VSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuXHRcdFx0Y29uc3QgcGFyZW50UlMgPSBpbnN0YW5jZVJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0XHQvLyBOT1RFOiBpZiBpbnN0YW5jZSBpcyBhbHJlYWR5IGNvbXBvdW5kZWQgYnkgaXRzIHBhcmVudC4gc2tpcFxuXHRcdFx0aWYgKFxuXHRcdFx0XHRwYXJlbnRSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiZcblx0XHRcdFx0cGFyZW50UlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID09PSBpbnN0YW5jZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByUyA9IGNvbXBvdW5kLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gaW5zdGFuY2U7XG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSk7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSk7XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHR0aGlzLmFwcGx5QXR0cmlidXRlKGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXVtrZXldKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0aWVzKSB7XG5cdFx0XHR0aGlzLmFwcGx5UHJvcGVydHkoaW5zdGFuY2UsIGtleSwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdW2tleV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjb21wb3VuZCk7XG5cdH1cblxuXHRxdWV1ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG9wOiBOZ3RRdWV1ZU9wKSB7XG5cdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uYWRkKG9wKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHR5cGU6IE5ndFF1ZXVlT3BbTmd0UXVldWVPcENsYXNzSWQudHlwZV0gPSAnb3AnKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10/LnNpemUpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZm9yRWFjaCgob3ApID0+IHtcblx0XHRcdFx0aWYgKG9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID09PSB0eXBlKSB7XG5cdFx0XHRcdFx0b3BbTmd0UXVldWVPcENsYXNzSWQub3BdKCk7XG5cdFx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5kZWxldGUob3ApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBvcnRhbDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgaW5qZWN0b3JGYWN0b3J5ID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV07XG5cdFx0Y29uc3QgaW5qZWN0b3IgPSBpbmplY3RvckZhY3Rvcnk/LigpO1xuXHRcdGlmICghaW5qZWN0b3IpIHJldHVybjtcblxuXHRcdGNvbnN0IHBvcnRhbFN0b3JlID0gaW5qZWN0b3IuZ2V0KE5HVF9TVE9SRSwgbnVsbCk7XG5cdFx0aWYgKCFwb3J0YWxTdG9yZSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcG9ydGFsQ29udGFpbmVyID0gcG9ydGFsU3RvcmUuZ2V0KCdzY2VuZScpO1xuXHRcdGlmICghcG9ydGFsQ29udGFpbmVyKSByZXR1cm47XG5cblx0XHRwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSA9IHRoaXMuY3JlYXRlTm9kZSgndGhyZWUnLCBwb3J0YWxDb250YWluZXIpO1xuXHR9XG5cblx0YXBwbHlBdHRyaWJ1dGUobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFTkRFUl9QUklPUklUWSkge1xuXHRcdFx0Ly8gTk9URTogcHJpb3JpdHkgbmVlZHMgdG8gYmUgc2V0IGFzIGFuIGF0dHJpYnV0ZSBzdHJpbmcgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgYXMgZWFybHkgYXMgcG9zc2libGVcblx0XHRcdC8vIHdlIGNvbnZlcnQgdGhhdCBzdHJpbmcgdG8gYSBudW1iZXIuIGlmIGl0J3MgaW52YWxpZCwgZGVmYXVsdCAwXG5cdFx0XHRsZXQgcHJpb3JpdHkgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0aWYgKGlzTmFOKHByaW9yaXR5KSkge1xuXHRcdFx0XHRwcmlvcml0eSA9IDA7XG5cdFx0XHRcdGNvbnNvbGUud2FybihgW05HVF0gXCJwcmlvcml0eVwiIGlzIGFuIGludmFsaWQgbnVtYmVyLCBkZWZhdWx0IHRvIDBgKTtcblx0XHRcdH1cblx0XHRcdGdldExvY2FsU3RhdGUobm9kZSkucHJpb3JpdHkgPSBwcmlvcml0eTtcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkNPTVBPVU5EKSB7XG5cdFx0XHQvLyBOT1RFOiB3ZSBzZXQgdGhlIGNvbXBvdW5kIHByb3BlcnR5IG9uIGluc3RhbmNlIG5vZGUgbm93IHNvIHdlIGtub3cgdGhhdCB0aGlzIGluc3RhbmNlIGlzIGJlaW5nIGNvbXBvdW5kZWRcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSBbdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnZmlyc3QnLCB7fV07XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdC8vIE5PVEU6IGhhbmRsZSBhdHRhY2ggYXMgdHJpbmdcblx0XHRcdGNvbnN0IHBhdGhzID0gdmFsdWUuc3BsaXQoJy4nKTtcblx0XHRcdGlmIChwYXRocy5sZW5ndGgpIGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gcGF0aHM7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuXHRcdFx0Ly8gTk9URTogY29lcmNpb25cblx0XHRcdGxldCBtYXliZUNvZXJjZWQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gPSB2YWx1ZTtcblx0XHRcdGlmIChtYXliZUNvZXJjZWQgPT09ICcnIHx8IG1heWJlQ29lcmNlZCA9PT0gJ3RydWUnIHx8IG1heWJlQ29lcmNlZCA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0XHRtYXliZUNvZXJjZWQgPSBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICcnO1xuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oTnVtYmVyKG1heWJlQ29lcmNlZCkpKSB7XG5cdFx0XHRcdG1heWJlQ29lcmNlZCA9IE51bWJlcihtYXliZUNvZXJjZWQpO1xuXHRcdFx0fVxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IG1heWJlQ29lcmNlZDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRhcHBseVByb3BzKG5vZGUsIHsgW25hbWVdOiB2YWx1ZSB9KTtcblx0XHR0aGlzLnVwZGF0ZU5hdGl2ZVByb3BzKG5vZGUsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGFwcGx5UHJvcGVydHkobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblxuXHRcdC8vIFtyZWZdXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRUYgJiYgaXMucmVmKHZhbHVlKSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB2YWx1ZTtcblx0XHRcdHZhbHVlLm5hdGl2ZUVsZW1lbnQgPSBub2RlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcmVudCA9IGdldExvY2FsU3RhdGUobm9kZSkucGFyZW50KCkgfHwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cblx0XHQvLyBbcmF3VmFsdWVdXG5cdFx0aWYgKGdldExvY2FsU3RhdGUobm9kZSkuaXNSYXcgJiYgbmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlZBTFVFKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gdmFsdWU7XG5cdFx0XHRpZiAocGFyZW50KSBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbm9kZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gW2F0dGFjaF1cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkFUVEFDSCkge1xuXHRcdFx0Z2V0TG9jYWxTdGF0ZShub2RlKS5hdHRhY2ggPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcCgodikgPT4gdi50b1N0cmluZygpKSA6IHZhbHVlO1xuXHRcdFx0aWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbXBvdW5kID0gclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXTtcblx0XHRpZiAoXG5cdFx0XHRjb21wb3VuZD8uW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcblx0XHRcdG5hbWUgaW4gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXSAmJlxuXHRcdFx0IWNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5hcHBseUZpcnN0XVxuXHRcdCkge1xuXHRcdFx0dmFsdWUgPSBjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdW25hbWVdO1xuXHRcdH1cblxuXHRcdGFwcGx5UHJvcHMobm9kZSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuXHRcdHRoaXMudXBkYXRlTmF0aXZlUHJvcHMobm9kZSwgbmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0aXNDb21wb3VuZChuYW1lOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290LmNvbXBvdW5kUHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSk7XG5cdH1cblxuXHRpc0RPTShub2RlOiBOZ3RBbnlSZWNvcmQpIHtcblx0XHRjb25zdCByUyA9IG5vZGVbJ19fbmd0X3JlbmRlcmVyX18nXTtcblx0XHRyZXR1cm4gKFxuXHRcdFx0IXJTIHx8XG5cdFx0XHQoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAnY29tcG91bmQnICYmXG5cdFx0XHRcdChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFdpbmRvdykpXG5cdFx0KTtcblx0fVxuXG5cdGdldCByb290U2NlbmUoKSB7XG5cdFx0cmV0dXJuIHRoaXMucm9vdC5zdG9yZS5nZXQoJ3NjZW5lJyk7XG5cdH1cblxuXHRnZXQgcG9ydGFscygpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290LnBvcnRhbHM7XG5cdH1cblxuXHRnZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSk6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwge1xuXHRcdGxldCBwYXJlbnQgPSBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0d2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcblx0XHRcdHBhcmVudCA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG5cdFx0XHRcdD8gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cblx0XHRcdFx0OiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyZW50O1xuXHR9XG5cblx0Z2V0Q2xvc2VzdFBhcmVudFdpdGhDb21wb3VuZChub2RlOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAobm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0pIHtcblx0XHRcdHJldHVybiBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XTtcblx0XHR9XG5cblx0XHRsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdGlmIChcblx0XHRcdHBhcmVudCAmJlxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmXG5cdFx0XHQhcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50O1xuXHRcdH1cblxuXHRcdHdoaWxlIChcblx0XHRcdHBhcmVudCAmJlxuXHRcdFx0KHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyB8fFxuXHRcdFx0XHQhcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSB8fFxuXHRcdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcpXG5cdFx0KSB7XG5cdFx0XHRwYXJlbnQgPSBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHR9XG5cblx0XHRpZiAoIXBhcmVudCkgcmV0dXJuO1xuXG5cdFx0aWYgKFxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XTtcblx0XHR9XG5cblx0XHRpZiAoIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuXHRcdFx0cmV0dXJuIHBhcmVudDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldENyZWF0aW9uU3RhdGUoKSB7XG5cdFx0Y29uc3QgaW5qZWN0ZWRBcmdzID0gdGhpcy5maXJzdE5vbkluamVjdGVkRGlyZWN0aXZlKE5ndEFyZ3MpPy5hcmdzIHx8IFtdO1xuXHRcdGNvbnN0IGluamVjdGVkUGFyZW50ID0gdGhpcy5maXJzdE5vbkluamVjdGVkRGlyZWN0aXZlKE5ndFBhcmVudCk/LnBhcmVudCB8fCBudWxsO1xuXHRcdGNvbnN0IHN0b3JlID0gdGhpcy50cnlHZXRQb3J0YWxTdG9yZSgpO1xuXHRcdHJldHVybiB7IGluamVjdGVkQXJncywgaW5qZWN0ZWRQYXJlbnQsIHN0b3JlIH07XG5cdH1cblxuXHRkZXN0cm95KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50PzogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKCFyUyB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSB1bmRlZmluZWQhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSA9IHVuZGVmaW5lZCE7XG5cblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdFx0aWYgKGxvY2FsU3RhdGUub2JqZWN0cykge1xuXHRcdFx0XHR1bnRyYWNrZWQobG9jYWxTdGF0ZS5vYmplY3RzKS5mb3JFYWNoKChvYmopID0+IHRoaXMuZGVzdHJveShvYmosIHBhcmVudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobG9jYWxTdGF0ZS5ub25PYmplY3RzKSB7XG5cdFx0XHRcdHVudHJhY2tlZChsb2NhbFN0YXRlLm5vbk9iamVjdHMpLmZvckVhY2goKG9iaikgPT4gdGhpcy5kZXN0cm95KG9iaiwgcGFyZW50KSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsb2NhbFN0YXRlLmFmdGVyVXBkYXRlKSBsb2NhbFN0YXRlLmFmdGVyVXBkYXRlLmNvbXBsZXRlKCk7XG5cdFx0XHRpZiAobG9jYWxTdGF0ZS5hZnRlckF0dGFjaCkgbG9jYWxTdGF0ZS5hZnRlckF0dGFjaC5jb21wbGV0ZSgpO1xuXG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnb2JqZWN0cyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ25vbk9iamVjdHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWyduYXRpdmVQcm9wcyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FkZCddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3JlbW92ZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyVXBkYXRlJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJBdHRhY2gnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydzdG9yZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2hhbmRsZXJzJ107XG5cblx0XHRcdGlmICghbG9jYWxTdGF0ZS5wcmltaXRpdmUpIHtcblx0XHRcdFx0ZGVsZXRlIChub2RlIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tbWVudCcpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gbnVsbCE7XG5cdFx0XHRkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXTtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jb21tZW50cy5maW5kSW5kZXgoKGNvbW1lbnQpID0+IGNvbW1lbnQgPT09IG5vZGUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0dGhpcy5jb21tZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLnBvcnRhbHMuZmluZEluZGV4KChwb3J0YWwpID0+IHBvcnRhbCA9PT0gbm9kZSk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHR0aGlzLnBvcnRhbHMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gPSB1bmRlZmluZWQhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdID0gbnVsbCE7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10gPSBudWxsITtcblx0XHRcdHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihub2RlLCAnY2xlYW5VcCcpO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5jbGVhcigpO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXSA9IG51bGwhO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSkge1xuXHRcdFx0Ly8gbnVsbGlmeSByZWZcblx0XHRcdC8vIGJ1dCB3ZSBkbyBpdCBsYXRlciBzbyB0aGF0IGl0IGRvZXNuJ3QgaGluZGVyIHJlbmRlclxuXHRcdFx0Ly8gVE9ETzogd2lsbCB0aGlzIGNhdXNlIG1lbW9yeSBsZWFrP1xuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0ubmF0aXZlRWxlbWVudCA9IG51bGw7XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdW5kZWZpbmVkITtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIG51bGxpZnkgcGFyZW50XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0gPSBudWxsO1xuXHRcdGZvciAoY29uc3QgcmVuZGVyQ2hpbGQgb2YgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXSB8fCBbXSkge1xuXHRcdFx0aWYgKHJlbmRlckNoaWxkLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgcGFyZW50KSB7XG5cdFx0XHRcdGNvbnN0IGNsb3Nlc3RJbnN0YW5jZSA9IHRoaXMuZ2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShwYXJlbnQpO1xuXHRcdFx0XHRpZiAoY2xvc2VzdEluc3RhbmNlKSB7XG5cdFx0XHRcdFx0cmVtb3ZlVGhyZWVDaGlsZChjbG9zZXN0SW5zdGFuY2UsIHJlbmRlckNoaWxkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kZXN0cm95KHJlbmRlckNoaWxkLCBwYXJlbnQpO1xuXHRcdH1cblxuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gPSBbXTtcblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSA9IHRydWU7XG5cdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0dGhpcy5yZW1vdmVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlTmF0aXZlUHJvcHMobm9kZTogTmd0SW5zdGFuY2VOb2RlLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdGlmICghbG9jYWxTdGF0ZSB8fCAhbG9jYWxTdGF0ZS5uYXRpdmVQcm9wcykgcmV0dXJuO1xuXHRcdGxvY2FsU3RhdGUubmF0aXZlUHJvcHMuc2V0KHsgW2tleV06IHZhbHVlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmaXJzdE5vbkluamVjdGVkRGlyZWN0aXZlPFQgZXh0ZW5kcyBOZ3RDb21tb25EaXJlY3RpdmU+KGRpcjogVHlwZTxUPikge1xuXHRcdGxldCBkaXJlY3RpdmU6IFQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBkZXN0cm95ZWQgPSBbXTtcblxuXHRcdGxldCBpID0gdGhpcy5jb21tZW50cy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRzW2ldO1xuXHRcdFx0aWYgKGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuXHRcdFx0XHRkZXN0cm95ZWQucHVzaChpKTtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluamVjdG9yID0gY29tbWVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCk7XG5cdFx0XHRpZiAoIWluamVjdG9yKSB7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IGluamVjdG9yLmdldChkaXIsIG51bGwpO1xuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLnZhbGlkYXRlKCkpIHtcblx0XHRcdFx0ZGlyZWN0aXZlID0gaW5zdGFuY2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRpLS07XG5cdFx0fVxuXG5cdFx0ZGVzdHJveWVkLmZvckVhY2goKGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLmNvbW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZGlyZWN0aXZlO1xuXHR9XG5cblx0cHJpdmF0ZSB0cnlHZXRQb3J0YWxTdG9yZSgpIHtcblx0XHRsZXQgc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBkZXN0cm95ZWQgPSBbXTtcblx0XHQvLyB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHBvcnRhbCBzdGF0ZXMgYmVjYXVzZSBOZ3RTdG9yZSBvbmx5IGRpZmZlcnMgcGVyIFBvcnRhbFxuXHRcdGxldCBpID0gdGhpcy5wb3J0YWxzLmxlbmd0aCAtIDE7XG5cdFx0d2hpbGUgKGkgPj0gMCkge1xuXHRcdFx0Ly8gbG9vcCB0aHJvdWdoIHRoZSBwb3J0YWwgc3RhdGUgYmFja3dhcmRzIHRvIGZpbmQgdGhlIGNsb3Nlc3QgTmd0U3RvcmVcblx0XHRcdGNvbnN0IHBvcnRhbCA9IHRoaXMucG9ydGFsc1tpXTtcblx0XHRcdGlmIChwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuXHRcdFx0XHRkZXN0cm95ZWQucHVzaChpKTtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaW5qZWN0b3IgPSBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuXHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoTkdUX1NUT1JFLCBudWxsKTtcblx0XHRcdC8vIG9ubHkgdGhlIGluc3RhbmNlIHdpdGggcHJldmlvdXNSb290IHNob3VsZCBwYXNzXG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZ2V0KCdwcmV2aW91c1Jvb3QnKSkge1xuXHRcdFx0XHRzdG9yZSA9IGluc3RhbmNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGktLTtcblx0XHR9XG5cblx0XHRkZXN0cm95ZWQuZm9yRWFjaCgoaW5kZXgpID0+IHtcblx0XHRcdHRoaXMucG9ydGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHN0b3JlIHx8IHRoaXMucm9vdCEuc3RvcmU7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export function safeDetectChanges(...cdrs) {
|
|
2
|
-
cdrs.forEach((cdr) => {
|
|
3
|
-
if (!cdr)
|
|
4
|
-
return;
|
|
5
|
-
try {
|
|
6
|
-
// dynamic created component with ViewContainerRef#createComponent does not have Context
|
|
7
|
-
// but it has _attachedToViewContainer
|
|
8
|
-
if (cdr['_attachedToViewContainer'] || !!cdr['context']) {
|
|
9
|
-
cdr.detectChanges();
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
catch (e) {
|
|
13
|
-
cdr.markForCheck();
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1kZXRlY3QtY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL3NhZmUtZGV0ZWN0LWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQUcsSUFBOEM7SUFDbEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ3BCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUNqQixJQUFJO1lBQ0gsd0ZBQXdGO1lBQ3hGLHNDQUFzQztZQUN0QyxJQUFLLEdBQW9CLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUUsR0FBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDNUYsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3BCO1NBQ0Q7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNYLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNuQjtJQUNGLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2FmZURldGVjdENoYW5nZXMoLi4uY2RyczogKENoYW5nZURldGVjdG9yUmVmIHwgdW5kZWZpbmVkIHwgbnVsbClbXSkge1xuXHRjZHJzLmZvckVhY2goKGNkcikgPT4ge1xuXHRcdGlmICghY2RyKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGR5bmFtaWMgY3JlYXRlZCBjb21wb25lbnQgd2l0aCBWaWV3Q29udGFpbmVyUmVmI2NyZWF0ZUNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIENvbnRleHRcblx0XHRcdC8vIGJ1dCBpdCBoYXMgX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyXG5cdFx0XHRpZiAoKGNkciBhcyBOZ3RBbnlSZWNvcmQpWydfYXR0YWNoZWRUb1ZpZXdDb250YWluZXInXSB8fCAhIShjZHIgYXMgTmd0QW55UmVjb3JkKVsnY29udGV4dCddKSB7XG5cdFx0XHRcdGNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Y2RyLm1hcmtGb3JDaGVjaygpO1xuXHRcdH1cblx0fSk7XG59XG4iXX0=
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
|
-
export declare abstract class NgtCommonDirective {
|
|
3
|
-
protected static processComment: boolean;
|
|
4
|
-
private vcr;
|
|
5
|
-
private zone;
|
|
6
|
-
private template;
|
|
7
|
-
protected injected: boolean;
|
|
8
|
-
protected shouldCreateView: boolean;
|
|
9
|
-
private view?;
|
|
10
|
-
constructor();
|
|
11
|
-
abstract validate(): boolean;
|
|
12
|
-
protected createView(): void;
|
|
13
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgtCommonDirective, never>;
|
|
14
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtCommonDirective, never, never, {}, {}, never, never, false, never>;
|
|
15
|
-
}
|
package/lib/directives/key.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { NgtCommonDirective } from './common';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export declare class NgtKey extends NgtCommonDirective {
|
|
4
|
-
static processComment: boolean;
|
|
5
|
-
private lastKey;
|
|
6
|
-
validate(): boolean;
|
|
7
|
-
set key(key: string | number | object);
|
|
8
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgtKey, never>;
|
|
9
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtKey, "ng-template[key]", never, { "key": { "alias": "key"; "required": false; }; }, {}, never, never, true, never>;
|
|
10
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { NgtRef } from '../ref';
|
|
2
|
-
import { NgtCommonDirective } from './common';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class NgtParent extends NgtCommonDirective {
|
|
5
|
-
private injectedParent;
|
|
6
|
-
set parent(parent: string | NgtRef<THREE.Object3D>);
|
|
7
|
-
get parent(): string | NgtRef<THREE.Object3D>;
|
|
8
|
-
validate(): boolean;
|
|
9
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgtParent, never>;
|
|
10
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtParent, "ng-template[parent]", never, { "parent": { "alias": "parent"; "required": false; }; }, {}, never, never, true, never>;
|
|
11
|
-
}
|
package/lib/ref.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ElementRef, type Injector, type Signal } from '@angular/core';
|
|
2
|
-
import { type NgtInstanceNode } from './instance';
|
|
3
|
-
export type NgtInjectedRef<TElement> = ElementRef<TElement> & {
|
|
4
|
-
children: (type?: 'objects' | 'nonObjects' | 'both') => Signal<NgtInstanceNode[]>;
|
|
5
|
-
untracked: TElement;
|
|
6
|
-
};
|
|
7
|
-
export type NgtRef<TElement> = TElement | NgtInjectedRef<TElement>;
|
|
8
|
-
export declare function injectNgtRef<TElement>(initial?: ElementRef<TElement> | TElement, injector?: Injector): NgtInjectedRef<TElement>;
|
package/lib/renderer/store.d.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, Injector } from '@angular/core';
|
|
2
|
-
import type { NgtRef } from '../ref';
|
|
3
|
-
import { type NgtState } from '../store';
|
|
4
|
-
import type { NgtAnyRecord } from '../types';
|
|
5
|
-
import type { NgtSignalStore } from '../utils/signal-store';
|
|
6
|
-
import { NgtRendererClassId } from './utils';
|
|
7
|
-
export declare const NGT_COMPOUND_PREFIXES: InjectionToken<string[]>;
|
|
8
|
-
type NgtRendererRootState = {
|
|
9
|
-
store: NgtSignalStore<NgtState>;
|
|
10
|
-
compoundPrefixes: string[];
|
|
11
|
-
document: Document;
|
|
12
|
-
portals: Array<NgtRendererNode>;
|
|
13
|
-
};
|
|
14
|
-
type NgtQueueOp = [type: 'op' | 'cleanUp', op: () => void, done?: true];
|
|
15
|
-
export type NgtRendererState = [
|
|
16
|
-
type: 'three' | 'compound' | 'portal' | 'comment' | 'dom',
|
|
17
|
-
parent: NgtRendererNode | null,
|
|
18
|
-
injectedParent: NgtRef<NgtRendererNode> | null,
|
|
19
|
-
children: NgtRendererNode[],
|
|
20
|
-
destroyed: boolean,
|
|
21
|
-
compound: [applyFirst: boolean, props: NgtAnyRecord],
|
|
22
|
-
compoundParent: NgtRendererNode,
|
|
23
|
-
compounded: NgtRendererNode,
|
|
24
|
-
queueOps: Set<NgtQueueOp>,
|
|
25
|
-
attributes: NgtAnyRecord,
|
|
26
|
-
properties: NgtAnyRecord,
|
|
27
|
-
rawValue: any,
|
|
28
|
-
ref: any,
|
|
29
|
-
portalContainer: NgtRendererNode,
|
|
30
|
-
injectorFactory: () => Injector
|
|
31
|
-
];
|
|
32
|
-
export type NgtRendererNode = {
|
|
33
|
-
__ngt_renderer__: NgtRendererState;
|
|
34
|
-
};
|
|
35
|
-
export declare class NgtRendererStore {
|
|
36
|
-
private root;
|
|
37
|
-
private comments;
|
|
38
|
-
constructor(root: NgtRendererRootState);
|
|
39
|
-
createNode(type: NgtRendererState[NgtRendererClassId.type], node: NgtAnyRecord): NgtAnyRecord & {
|
|
40
|
-
__ngt_renderer__: NgtRendererState;
|
|
41
|
-
};
|
|
42
|
-
setParent(node: NgtRendererNode, parent: NgtRendererNode): void;
|
|
43
|
-
addChild(node: NgtRendererNode, child: NgtRendererNode): void;
|
|
44
|
-
removeChild(node: NgtRendererNode, child: NgtRendererNode): void;
|
|
45
|
-
setCompound(compound: NgtRendererNode, instance: NgtRendererNode): void;
|
|
46
|
-
queueOperation(node: NgtRendererNode, op: NgtQueueOp): void;
|
|
47
|
-
private executeOperation;
|
|
48
|
-
processPortalContainer(portal: NgtRendererNode): void;
|
|
49
|
-
applyAttribute(node: NgtRendererNode, name: string, value: string): void;
|
|
50
|
-
applyProperty(node: NgtRendererNode, name: string, value: any): void;
|
|
51
|
-
isCompound(name: string): boolean;
|
|
52
|
-
isDOM(node: NgtAnyRecord): boolean;
|
|
53
|
-
get rootScene(): import("three").Scene;
|
|
54
|
-
get portals(): NgtRendererNode[];
|
|
55
|
-
getClosestParentWithInstance(node: NgtRendererNode): NgtRendererNode | null;
|
|
56
|
-
getClosestParentWithCompound(node: NgtRendererNode): NgtRendererNode | null | undefined;
|
|
57
|
-
getCreationState(): {
|
|
58
|
-
injectedArgs: any[];
|
|
59
|
-
injectedParent: string | NgtRef<import("three").Object3D<import("three").Object3DEventMap>> | null;
|
|
60
|
-
store: NgtSignalStore<NgtState>;
|
|
61
|
-
};
|
|
62
|
-
destroy(node: NgtRendererNode, parent?: NgtRendererNode): void;
|
|
63
|
-
private updateNativeProps;
|
|
64
|
-
private firstNonInjectedDirective;
|
|
65
|
-
private tryGetPortalStore;
|
|
66
|
-
}
|
|
67
|
-
export {};
|
package/plugin/migrations.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"generators": {
|
|
3
|
-
"migrate-to-ngxtension": {
|
|
4
|
-
"version": "2.0.0-beta.30",
|
|
5
|
-
"description": "Migrate some APIs to ngxtension",
|
|
6
|
-
"implementation": "./src/migrations/migrate-to-ngxtension/migrate-to-ngxtension"
|
|
7
|
-
}
|
|
8
|
-
},
|
|
9
|
-
"schematics": {
|
|
10
|
-
"migrate-to-ngxtension": {
|
|
11
|
-
"version": "2.0.0-beta.30",
|
|
12
|
-
"description": "Migrate some APIs to ngxtension",
|
|
13
|
-
"implementation": "./src/migrations/migrate-to-ngxtension/compat"
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|