angular-three 2.13.0 → 3.0.0
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/fesm2022/angular-three-nativescript.mjs +3 -3
- package/fesm2022/angular-three-nativescript.mjs.map +1 -1
- package/fesm2022/angular-three-testing.mjs +12 -14
- package/fesm2022/angular-three-testing.mjs.map +1 -1
- package/fesm2022/angular-three.mjs +123 -106
- package/fesm2022/angular-three.mjs.map +1 -1
- package/lib/canvas.d.ts +7 -7
- package/lib/html.d.ts +2 -2
- package/lib/portal.d.ts +2 -2
- package/lib/routed-scene.d.ts +8 -2
- package/lib/utils/object-events.d.ts +0 -19
- package/package.json +4 -10
- package/plugin/src/generators/init/schema.json +8 -8
- package/testing/lib/utils/web-gl-rendering-context.d.ts +1 -1
- package/esm2022/angular-three.mjs +0 -5
- package/esm2022/index.mjs +0 -25
- package/esm2022/lib/canvas.mjs +0 -188
- package/esm2022/lib/directives/args.mjs +0 -53
- package/esm2022/lib/directives/selection.mjs +0 -69
- package/esm2022/lib/dom/events.mjs +0 -73
- package/esm2022/lib/events.mjs +0 -361
- package/esm2022/lib/html.mjs +0 -44
- package/esm2022/lib/instance.mjs +0 -83
- package/esm2022/lib/loader.mjs +0 -93
- package/esm2022/lib/loop.mjs +0 -141
- package/esm2022/lib/pipes/hexify.mjs +0 -86
- package/esm2022/lib/portal.mjs +0 -220
- package/esm2022/lib/renderer/catalogue.mjs +0 -7
- package/esm2022/lib/renderer/constants.mjs +0 -23
- package/esm2022/lib/renderer/index.mjs +0 -544
- package/esm2022/lib/renderer/state.mjs +0 -54
- package/esm2022/lib/renderer/utils.mjs +0 -223
- package/esm2022/lib/roots.mjs +0 -275
- package/esm2022/lib/routed-scene.mjs +0 -33
- package/esm2022/lib/store.mjs +0 -176
- package/esm2022/lib/three-types.mjs +0 -2
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/utils/apply-props.mjs +0 -130
- package/esm2022/lib/utils/attach.mjs +0 -46
- package/esm2022/lib/utils/before-render.mjs +0 -41
- package/esm2022/lib/utils/is.mjs +0 -52
- package/esm2022/lib/utils/make.mjs +0 -52
- package/esm2022/lib/utils/object-events.mjs +0 -137
- package/esm2022/lib/utils/output-ref.mjs +0 -9
- package/esm2022/lib/utils/parameters.mjs +0 -70
- package/esm2022/lib/utils/resolve-ref.mjs +0 -8
- package/esm2022/lib/utils/signal-store.mjs +0 -90
- package/esm2022/lib/utils/update.mjs +0 -37
- package/esm2022/nativescript/angular-three-nativescript.mjs +0 -5
- package/esm2022/nativescript/index.mjs +0 -2
- package/esm2022/nativescript/lib/canvas.mjs +0 -127
- package/esm2022/testing/angular-three-testing.mjs +0 -5
- package/esm2022/testing/index.mjs +0 -3
- package/esm2022/testing/lib/test-bed.mjs +0 -130
- package/esm2022/testing/lib/test-canvas.mjs +0 -45
- package/esm2022/testing/lib/utils/mock-canvas.mjs +0 -37
- package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +0 -752
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { DebugNode } from '@angular/core';
|
|
2
|
-
export function createNode(type, node, document) {
|
|
3
|
-
const state = [type, null, [], false, undefined, undefined, undefined, undefined];
|
|
4
|
-
const rendererNode = Object.assign(node, { __ngt_renderer__: state });
|
|
5
|
-
// NOTE: assign ownerDocument to node so we can use HostListener in Component
|
|
6
|
-
if (!rendererNode['ownerDocument'])
|
|
7
|
-
rendererNode['ownerDocument'] = document;
|
|
8
|
-
// NOTE: assign injectorFactory on non-three type since
|
|
9
|
-
// rendererNode is an instance of DOM Node
|
|
10
|
-
if (state[0 /* NgtRendererClassId.type */] !== 'three') {
|
|
11
|
-
state[7 /* NgtRendererClassId.debugNodeFactory */] = () => {
|
|
12
|
-
if (!state[6 /* NgtRendererClassId.debugNode */]) {
|
|
13
|
-
state[6 /* NgtRendererClassId.debugNode */] = new DebugNode(rendererNode);
|
|
14
|
-
}
|
|
15
|
-
return state[6 /* NgtRendererClassId.debugNode */];
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
return rendererNode;
|
|
19
|
-
}
|
|
20
|
-
export function isDOM(node) {
|
|
21
|
-
const rS = node['__ngt_renderer__'];
|
|
22
|
-
return !rS || node instanceof Element || node instanceof Document || node instanceof Window;
|
|
23
|
-
}
|
|
24
|
-
export function getClosestParentWithInstance(node) {
|
|
25
|
-
let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
26
|
-
if (parent &&
|
|
27
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'portal' &&
|
|
28
|
-
parent.__ngt_renderer__[5 /* NgtRendererClassId.portalContainer */]?.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three') {
|
|
29
|
-
return parent.__ngt_renderer__[5 /* NgtRendererClassId.portalContainer */];
|
|
30
|
-
}
|
|
31
|
-
while (parent && parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'three') {
|
|
32
|
-
parent = parent.__ngt_renderer__[5 /* NgtRendererClassId.portalContainer */]
|
|
33
|
-
? parent.__ngt_renderer__[5 /* NgtRendererClassId.portalContainer */]
|
|
34
|
-
: parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
35
|
-
}
|
|
36
|
-
return parent;
|
|
37
|
-
}
|
|
38
|
-
export function setParent(node, parent) {
|
|
39
|
-
if (!node.__ngt_renderer__[1 /* NgtRendererClassId.parent */]) {
|
|
40
|
-
node.__ngt_renderer__[1 /* NgtRendererClassId.parent */] = parent;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export function addChild(node, child) {
|
|
44
|
-
if (!node.__ngt_renderer__[2 /* NgtRendererClassId.children */].includes(child)) {
|
|
45
|
-
node.__ngt_renderer__[2 /* NgtRendererClassId.children */].push(child);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export function removeChild(node, child) {
|
|
49
|
-
const index = node.__ngt_renderer__?.[2 /* NgtRendererClassId.children */].findIndex((c) => child === c);
|
|
50
|
-
if (index >= 0) {
|
|
51
|
-
node.__ngt_renderer__[2 /* NgtRendererClassId.children */].splice(index, 1);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBb0IxQyxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0IsRUFBRSxRQUFrQjtJQUNqSCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFVLEVBQUUsU0FBVSxFQUFFLFNBQVUsRUFBRSxTQUFVLENBQXFCLENBQUM7SUFFMUcsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXRFLDZFQUE2RTtJQUM3RSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztRQUFFLFlBQVksQ0FBQyxlQUFlLENBQUMsR0FBRyxRQUFRLENBQUM7SUFFN0UsdURBQXVEO0lBQ3ZELDBDQUEwQztJQUMxQyxJQUFJLEtBQUssaUNBQXlCLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDaEQsS0FBSyw2Q0FBcUMsR0FBRyxHQUFHLEVBQUU7WUFDakQsSUFBSSxDQUFDLEtBQUssc0NBQThCLEVBQUUsQ0FBQztnQkFDMUMsS0FBSyxzQ0FBOEIsR0FBRyxJQUFJLFNBQVMsQ0FBQyxZQUErQixDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE9BQU8sS0FBSyxzQ0FBOEIsQ0FBQztRQUM1QyxDQUFDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxZQUFZLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQUMsSUFBa0I7SUFDdkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDcEMsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLFlBQVksT0FBTyxJQUFJLElBQUksWUFBWSxRQUFRLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQztBQUM3RixDQUFDO0FBRUQsTUFBTSxVQUFVLDRCQUE0QixDQUFDLElBQXFCO0lBQ2pFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsbUNBQTJCLENBQUM7SUFFOUQsSUFDQyxNQUFNO1FBQ04sTUFBTSxDQUFDLGdCQUFnQixpQ0FBeUIsS0FBSyxRQUFRO1FBQzdELE1BQU0sQ0FBQyxnQkFBZ0IsNENBQW9DLEVBQUUsZ0JBQWdCLGlDQUF5QixLQUFLLE9BQU8sRUFDakgsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLGdCQUFnQiw0Q0FBb0MsQ0FBQztJQUNwRSxDQUFDO0lBRUQsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLGdCQUFnQixpQ0FBeUIsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMvRSxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQiw0Q0FBb0M7WUFDbkUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsNENBQW9DO1lBQzdELENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLG1DQUEyQixDQUFDO0lBQ3ZELENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQXFCLEVBQUUsTUFBdUI7SUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsbUNBQTJCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLG1DQUEyQixHQUFHLE1BQU0sQ0FBQztJQUMzRCxDQUFDO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBcUIsRUFBRSxLQUFzQjtJQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixxQ0FBNkIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxJQUFJLENBQUMsZ0JBQWdCLHFDQUE2QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBcUIsRUFBRSxLQUFzQjtJQUN4RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUscUNBQTZCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDakcsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixxQ0FBNkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVidWdOb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBOZ3RSZW5kZXJlckNsYXNzSWQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJTdGF0ZSA9IFtcblx0dHlwZTogJ3RocmVlJyB8ICdwb3J0YWwnIHwgJ2NvbW1lbnQnIHwgJ2RvbScsXG5cdHBhcmVudDogTmd0UmVuZGVyZXJOb2RlIHwgbnVsbCxcblx0Y2hpbGRyZW46IE5ndFJlbmRlcmVyTm9kZVtdLFxuXHRkZXN0cm95ZWQ6IGJvb2xlYW4sXG5cdHJhd1ZhbHVlOiBhbnksXG5cdHBvcnRhbENvbnRhaW5lcjogTmd0UmVuZGVyZXJOb2RlLFxuXHRkZWJ1Z05vZGU6IERlYnVnTm9kZSB8IHVuZGVmaW5lZCxcblx0ZGVidWdOb2RlRmFjdG9yeTogKCkgPT4gRGVidWdOb2RlIHwgdW5kZWZpbmVkLFxuXTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RSZW5kZXJlck5vZGUge1xuXHRfX25ndF9yZW5kZXJlcl9fOiBOZ3RSZW5kZXJlclN0YXRlO1xuXHRfX25ndF9kb21fcGFyZW50X18/OiBIVE1MRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGUodHlwZTogTmd0UmVuZGVyZXJTdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0sIG5vZGU6IE5ndEFueVJlY29yZCwgZG9jdW1lbnQ6IERvY3VtZW50KSB7XG5cdGNvbnN0IHN0YXRlID0gW3R5cGUsIG51bGwsIFtdLCBmYWxzZSwgdW5kZWZpbmVkISwgdW5kZWZpbmVkISwgdW5kZWZpbmVkISwgdW5kZWZpbmVkIV0gYXMgTmd0UmVuZGVyZXJTdGF0ZTtcblxuXHRjb25zdCByZW5kZXJlck5vZGUgPSBPYmplY3QuYXNzaWduKG5vZGUsIHsgX19uZ3RfcmVuZGVyZXJfXzogc3RhdGUgfSk7XG5cblx0Ly8gTk9URTogYXNzaWduIG93bmVyRG9jdW1lbnQgdG8gbm9kZSBzbyB3ZSBjYW4gdXNlIEhvc3RMaXN0ZW5lciBpbiBDb21wb25lbnRcblx0aWYgKCFyZW5kZXJlck5vZGVbJ293bmVyRG9jdW1lbnQnXSkgcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10gPSBkb2N1bWVudDtcblxuXHQvLyBOT1RFOiBhc3NpZ24gaW5qZWN0b3JGYWN0b3J5IG9uIG5vbi10aHJlZSB0eXBlIHNpbmNlXG5cdC8vIHJlbmRlcmVyTm9kZSBpcyBhbiBpbnN0YW5jZSBvZiBET00gTm9kZVxuXHRpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAndGhyZWUnKSB7XG5cdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmRlYnVnTm9kZUZhY3RvcnldID0gKCkgPT4ge1xuXHRcdFx0aWYgKCFzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuZGVidWdOb2RlXSkge1xuXHRcdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuZGVidWdOb2RlXSA9IG5ldyBEZWJ1Z05vZGUocmVuZGVyZXJOb2RlIGFzIHVua25vd24gYXMgTm9kZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmRlYnVnTm9kZV07XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiByZW5kZXJlck5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RPTShub2RlOiBOZ3RBbnlSZWNvcmQpIHtcblx0Y29uc3QgclMgPSBub2RlWydfX25ndF9yZW5kZXJlcl9fJ107XG5cdHJldHVybiAhclMgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBXaW5kb3c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSk6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwge1xuXHRsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXG5cdGlmIChcblx0XHRwYXJlbnQgJiZcblx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnICYmXG5cdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0/Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnXG5cdCkge1xuXHRcdHJldHVybiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXTtcblx0fVxuXG5cdHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAndGhyZWUnKSB7XG5cdFx0cGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cblx0XHRcdD8gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cblx0XHRcdDogcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdH1cblxuXHRyZXR1cm4gcGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UGFyZW50KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50OiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0aWYgKCFub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0gPSBwYXJlbnQ7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZENoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmluY2x1ZGVzKGNoaWxkKSkge1xuXHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLnB1c2goY2hpbGQpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0Y29uc3QgaW5kZXggPSBub2RlLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmZpbmRJbmRleCgoYykgPT4gY2hpbGQgPT09IGMpO1xuXHRpZiAoaW5kZXggPj0gMCkge1xuXHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLnNwbGljZShpbmRleCwgMSk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
import { untracked } from '@angular/core';
|
|
2
|
-
import { EventDispatcher } from 'three';
|
|
3
|
-
import { removeInteractivity } from '../events';
|
|
4
|
-
import { getLocalState, invalidateInstance } from '../instance';
|
|
5
|
-
import { attach, detach } from '../utils/attach';
|
|
6
|
-
import { is } from '../utils/is';
|
|
7
|
-
import { SPECIAL_EVENTS, THREE_NATIVE_EVENTS } from './constants';
|
|
8
|
-
export function kebabToPascal(str) {
|
|
9
|
-
if (!str)
|
|
10
|
-
return str; // Handle empty input
|
|
11
|
-
let pascalStr = '';
|
|
12
|
-
let capitalizeNext = true; // Flag to track capitalization
|
|
13
|
-
for (let i = 0; i < str.length; i++) {
|
|
14
|
-
const char = str[i];
|
|
15
|
-
if (char === '-') {
|
|
16
|
-
capitalizeNext = true;
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
pascalStr += capitalizeNext ? char.toUpperCase() : char;
|
|
20
|
-
capitalizeNext = false;
|
|
21
|
-
}
|
|
22
|
-
return pascalStr;
|
|
23
|
-
}
|
|
24
|
-
export function attachThreeChild(parent, child) {
|
|
25
|
-
const pLS = getLocalState(parent);
|
|
26
|
-
const cLS = getLocalState(child);
|
|
27
|
-
if (!pLS || !cLS) {
|
|
28
|
-
throw new Error(`[NGT] THREE instances need to be prepared with local state.`);
|
|
29
|
-
}
|
|
30
|
-
// whether the child is added to the parent with parent.add()
|
|
31
|
-
let added = false;
|
|
32
|
-
// assign store on child if not already exist
|
|
33
|
-
// or child store is not the same as parent store
|
|
34
|
-
// or child store is the parent of parent store
|
|
35
|
-
if (!cLS.store || cLS.store !== pLS.store || cLS.store === pLS.store.get('previousRoot')) {
|
|
36
|
-
cLS.store = pLS.store;
|
|
37
|
-
const grandchildren = [
|
|
38
|
-
...(cLS.objects ? untracked(cLS.objects) : []),
|
|
39
|
-
...(cLS.nonObjects ? untracked(cLS.nonObjects) : []),
|
|
40
|
-
];
|
|
41
|
-
for (const grandchild of grandchildren) {
|
|
42
|
-
const grandChildLS = getLocalState(grandchild);
|
|
43
|
-
if (!grandChildLS)
|
|
44
|
-
continue;
|
|
45
|
-
grandChildLS.store = cLS.store;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
if (cLS.attach) {
|
|
49
|
-
const attachProp = cLS.attach;
|
|
50
|
-
if (typeof attachProp === 'function') {
|
|
51
|
-
let attachCleanUp = undefined;
|
|
52
|
-
if (cLS.isRaw) {
|
|
53
|
-
if (cLS.instanceStore.get('parent') !== parent) {
|
|
54
|
-
cLS.setParent(parent);
|
|
55
|
-
}
|
|
56
|
-
// at this point we don't have rawValue yet, so we bail and wait until the Renderer recalls attach
|
|
57
|
-
if (child.__ngt_renderer__[4 /* NgtRendererClassId.rawValue */] === undefined)
|
|
58
|
-
return;
|
|
59
|
-
attachCleanUp = attachProp(parent, child.__ngt_renderer__[4 /* NgtRendererClassId.rawValue */], cLS.store);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
attachCleanUp = attachProp(parent, child, cLS.store);
|
|
63
|
-
}
|
|
64
|
-
if (attachCleanUp)
|
|
65
|
-
cLS.previousAttach = attachCleanUp;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
// we skip attach none if set explicitly
|
|
69
|
-
if (attachProp[0] === 'none') {
|
|
70
|
-
invalidateInstance(child);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
// handle material array
|
|
74
|
-
if (attachProp[0] === 'material' &&
|
|
75
|
-
attachProp[1] &&
|
|
76
|
-
typeof Number(attachProp[1]) === 'number' &&
|
|
77
|
-
is.material(child) &&
|
|
78
|
-
!Array.isArray(parent['material'])) {
|
|
79
|
-
parent['material'] = [];
|
|
80
|
-
}
|
|
81
|
-
// attach
|
|
82
|
-
if (cLS.isRaw) {
|
|
83
|
-
if (cLS.instanceStore.get('parent') !== parent) {
|
|
84
|
-
cLS.setParent(parent);
|
|
85
|
-
}
|
|
86
|
-
// at this point we don't have rawValue yet, so we bail and wait until the Renderer recalls attach
|
|
87
|
-
if (child.__ngt_renderer__[4 /* NgtRendererClassId.rawValue */] === undefined)
|
|
88
|
-
return;
|
|
89
|
-
attach(parent, child.__ngt_renderer__[4 /* NgtRendererClassId.rawValue */], attachProp, true);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
attach(parent, child, attachProp);
|
|
93
|
-
}
|
|
94
|
-
// save value
|
|
95
|
-
cLS.previousAttach = attachProp.reduce((value, property) => value[property], parent);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
else if (is.object3D(parent) && is.object3D(child)) {
|
|
99
|
-
parent.add(child);
|
|
100
|
-
added = true;
|
|
101
|
-
}
|
|
102
|
-
if (pLS.add) {
|
|
103
|
-
pLS.add(child, added ? 'objects' : 'nonObjects');
|
|
104
|
-
}
|
|
105
|
-
if (cLS.parent && untracked(cLS.parent) !== parent) {
|
|
106
|
-
cLS.setParent(parent);
|
|
107
|
-
}
|
|
108
|
-
// NOTE: this does not mean that the child is actually attached to the parent on the scenegraph.
|
|
109
|
-
// a child on the Angular template can also emit onAttach
|
|
110
|
-
if (cLS.onAttach)
|
|
111
|
-
cLS.onAttach({ parent, node: child });
|
|
112
|
-
invalidateInstance(child);
|
|
113
|
-
invalidateInstance(parent);
|
|
114
|
-
}
|
|
115
|
-
export function removeThreeChild(child, parent, dispose) {
|
|
116
|
-
const pLS = getLocalState(parent);
|
|
117
|
-
const cLS = getLocalState(child);
|
|
118
|
-
// clear parent ref
|
|
119
|
-
cLS?.setParent(null);
|
|
120
|
-
// remove child from parent
|
|
121
|
-
pLS?.remove(child, 'objects');
|
|
122
|
-
pLS?.remove(child, 'nonObjects');
|
|
123
|
-
if (parent) {
|
|
124
|
-
if (cLS?.attach) {
|
|
125
|
-
detach(parent, child, cLS.attach);
|
|
126
|
-
}
|
|
127
|
-
else if (is.object3D(parent) && is.object3D(child)) {
|
|
128
|
-
parent.remove(child);
|
|
129
|
-
const store = cLS?.store || pLS?.store;
|
|
130
|
-
if (store)
|
|
131
|
-
removeInteractivity(store, child);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
const isPrimitive = cLS?.primitive;
|
|
135
|
-
if (!isPrimitive) {
|
|
136
|
-
removeThreeRecursive(cLS?.instanceStore.get('objects') || [], child, !!dispose);
|
|
137
|
-
removeThreeRecursive(child.children, child, !!dispose);
|
|
138
|
-
}
|
|
139
|
-
// dispose
|
|
140
|
-
if (!isPrimitive && child['dispose'] && !is.scene(child)) {
|
|
141
|
-
queueMicrotask(() => child['dispose']());
|
|
142
|
-
}
|
|
143
|
-
if (parent) {
|
|
144
|
-
invalidateInstance(parent);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
function removeThreeRecursive(array, parent, dispose) {
|
|
148
|
-
if (array)
|
|
149
|
-
[...array].forEach((child) => removeThreeChild(child, parent, dispose));
|
|
150
|
-
}
|
|
151
|
-
export function processThreeEvent(instance, priority, eventName, callback) {
|
|
152
|
-
const lS = getLocalState(instance);
|
|
153
|
-
if (!lS) {
|
|
154
|
-
console.warn('[NGT] instance has not been prepared yet.');
|
|
155
|
-
return () => { };
|
|
156
|
-
}
|
|
157
|
-
if (eventName === SPECIAL_EVENTS.BEFORE_RENDER) {
|
|
158
|
-
return lS.store
|
|
159
|
-
.get('internal')
|
|
160
|
-
.subscribe((state) => callback({ state, object: instance }), priority || lS.priority || 0);
|
|
161
|
-
}
|
|
162
|
-
if (eventName === SPECIAL_EVENTS.ATTACHED) {
|
|
163
|
-
lS.onAttach = callback;
|
|
164
|
-
if (untracked(lS.parent)) {
|
|
165
|
-
lS.onAttach({ parent: untracked(lS.parent), node: instance });
|
|
166
|
-
}
|
|
167
|
-
return () => {
|
|
168
|
-
lS.onAttach = undefined;
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
if (eventName === SPECIAL_EVENTS.UPDATED) {
|
|
172
|
-
lS.onUpdate = callback;
|
|
173
|
-
return () => {
|
|
174
|
-
lS.onUpdate = undefined;
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
if (THREE_NATIVE_EVENTS.includes(eventName) && instance instanceof EventDispatcher) {
|
|
178
|
-
// NOTE: rename to dispose because that's the event type, not disposed.
|
|
179
|
-
if (eventName === 'disposed') {
|
|
180
|
-
eventName = 'dispose';
|
|
181
|
-
}
|
|
182
|
-
if (instance.parent && (eventName === 'added' || eventName === 'removed')) {
|
|
183
|
-
callback({ type: eventName, target: instance });
|
|
184
|
-
}
|
|
185
|
-
instance.addEventListener(eventName, callback);
|
|
186
|
-
return () => instance.removeEventListener(eventName, callback);
|
|
187
|
-
}
|
|
188
|
-
if (!lS.handlers)
|
|
189
|
-
lS.handlers = {};
|
|
190
|
-
// try to get the previous handler. compound might have one, the THREE object might also have one with the same name
|
|
191
|
-
const previousHandler = lS.handlers[eventName];
|
|
192
|
-
// readjust the callback
|
|
193
|
-
const updatedCallback = (event) => {
|
|
194
|
-
if (previousHandler)
|
|
195
|
-
previousHandler(event);
|
|
196
|
-
callback(event);
|
|
197
|
-
};
|
|
198
|
-
Object.assign(lS.handlers, { [eventName]: updatedCallback });
|
|
199
|
-
// increment the count everytime
|
|
200
|
-
lS.eventCount += 1;
|
|
201
|
-
// but only add the instance (target) to the interaction array (so that it is handled by the EventManager with Raycast)
|
|
202
|
-
// the first time eventCount is incremented
|
|
203
|
-
if (lS.eventCount === 1 && instance['raycast']) {
|
|
204
|
-
let root = lS.store;
|
|
205
|
-
while (root.get('previousRoot')) {
|
|
206
|
-
root = root.get('previousRoot');
|
|
207
|
-
}
|
|
208
|
-
const interactions = root.get('internal', 'interaction') || [];
|
|
209
|
-
interactions.push(instance);
|
|
210
|
-
}
|
|
211
|
-
// clean up the event listener by removing the target from the interaction array
|
|
212
|
-
return () => {
|
|
213
|
-
const lS = getLocalState(instance);
|
|
214
|
-
if (lS) {
|
|
215
|
-
lS.eventCount -= 1;
|
|
216
|
-
const interactions = lS.store.get('internal', 'interaction') || [];
|
|
217
|
-
const index = interactions.findIndex((obj) => obj.uuid === instance.uuid);
|
|
218
|
-
if (index >= 0)
|
|
219
|
-
interactions.splice(index, 1);
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQVksTUFBTSxPQUFPLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFjbEUsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFXO0lBQ3hDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxxQkFBcUI7SUFFM0MsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ25CLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLCtCQUErQjtJQUUxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNsQixjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLFNBQVM7UUFDVixDQUFDO1FBRUQsU0FBUyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEQsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUF1QixFQUFFLEtBQXNCO0lBQy9FLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsNkRBQTZEO0lBQzdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztJQUVsQiw2Q0FBNkM7SUFDN0MsaURBQWlEO0lBQ2pELCtDQUErQztJQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzFGLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUN0QixNQUFNLGFBQWEsR0FBRztZQUNyQixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEQsQ0FBQztRQUNGLEtBQUssTUFBTSxVQUFVLElBQUksYUFBYSxFQUFFLENBQUM7WUFDeEMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZO2dCQUFFLFNBQVM7WUFDNUIsWUFBWSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7SUFDRixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUU5QixJQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLElBQUksYUFBYSxHQUE4QyxTQUFTLENBQUM7WUFFekUsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDaEQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztnQkFDRCxrR0FBa0c7Z0JBQ2xHLElBQUksS0FBSyxDQUFDLGdCQUFnQixxQ0FBNkIsS0FBSyxTQUFTO29CQUFFLE9BQU87Z0JBQzlFLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IscUNBQTZCLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BHLENBQUM7aUJBQU0sQ0FBQztnQkFDUCxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFFRCxJQUFJLGFBQWE7Z0JBQUUsR0FBRyxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDUCx3Q0FBd0M7WUFDeEMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixPQUFPO1lBQ1IsQ0FBQztZQUVELHdCQUF3QjtZQUN4QixJQUNDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVO2dCQUM1QixVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNiLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7Z0JBQ3pDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNsQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ2pDLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixDQUFDO1lBRUQsU0FBUztZQUNULElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQ2hELEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0Qsa0dBQWtHO2dCQUNsRyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IscUNBQTZCLEtBQUssU0FBUztvQkFBRSxPQUFPO2dCQUM5RSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IscUNBQTZCLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7aUJBQU0sQ0FBQztnQkFDUCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsYUFBYTtZQUNiLEdBQUcsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0YsQ0FBQztTQUFNLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNwRCxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsMERBQTBEO0lBQzFELElBQUksR0FBRyxDQUFDLFFBQVE7UUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXhELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBc0IsRUFBRSxNQUF3QixFQUFFLE9BQWlCO0lBQ25HLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakMsbUJBQW1CO0lBQ25CLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckIsMkJBQTJCO0lBQzNCLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWpDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWixJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUM7WUFDdkMsSUFBSSxLQUFLO2dCQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0YsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxTQUFTLENBQUM7SUFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xCLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsVUFBVTtJQUNWLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFELGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1osa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztBQUNGLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQXdCLEVBQUUsTUFBdUIsRUFBRSxPQUFnQjtJQUNoRyxJQUFJLEtBQUs7UUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDcEYsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FDaEMsUUFBeUIsRUFDekIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsUUFBOEI7SUFFOUIsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMxRCxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxTQUFTLEtBQUssY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hELE9BQU8sRUFBRSxDQUFDLEtBQUs7YUFDYixHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELElBQUksU0FBUyxLQUFLLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxFQUFFLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN2QixJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sR0FBRyxFQUFFO1lBQ1gsRUFBRSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDekIsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksU0FBUyxLQUFLLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxFQUFFLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN2QixPQUFPLEdBQUcsRUFBRTtZQUNYLEVBQUUsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLENBQUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRLFlBQVksZUFBZSxFQUFFLENBQUM7UUFDcEYsdUVBQXVFO1FBQ3ZFLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzlCLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUssUUFBcUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pGLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVE7UUFBRSxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUVuQyxvSEFBb0g7SUFDcEgsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFxQyxDQUFDLENBQUM7SUFDM0Usd0JBQXdCO0lBQ3hCLE1BQU0sZUFBZSxHQUFvQixDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2xELElBQUksZUFBZTtZQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBRTdELGdDQUFnQztJQUNoQyxFQUFFLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztJQUNuQix1SEFBdUg7SUFDdkgsMkNBQTJDO0lBQzNDLElBQUksRUFBRSxDQUFDLFVBQVUsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixPQUFPLEdBQUcsRUFBRTtRQUNYLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1IsRUFBRSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLEtBQUssSUFBSSxDQUFDO2dCQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDRixDQUFDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIsIE9iamVjdDNEIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgcmVtb3ZlSW50ZXJhY3Rpdml0eSB9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBnZXRMb2NhbFN0YXRlLCBpbnZhbGlkYXRlSW5zdGFuY2UgfSBmcm9tICcuLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBOZ3RJbnN0YW5jZU5vZGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhdHRhY2gsIGRldGFjaCB9IGZyb20gJy4uL3V0aWxzL2F0dGFjaCc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB7IFNQRUNJQUxfRVZFTlRTLCBUSFJFRV9OQVRJVkVfRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBlbnVtIE5ndFJlbmRlcmVyQ2xhc3NJZCB7XG5cdHR5cGUsXG5cdHBhcmVudCxcblx0Y2hpbGRyZW4sXG5cdGRlc3Ryb3llZCxcblx0cmF3VmFsdWUsXG5cdHBvcnRhbENvbnRhaW5lcixcblx0ZGVidWdOb2RlLFxuXHRkZWJ1Z05vZGVGYWN0b3J5LFxufVxuXG5leHBvcnQgZnVuY3Rpb24ga2ViYWJUb1Bhc2NhbChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICghc3RyKSByZXR1cm4gc3RyOyAvLyBIYW5kbGUgZW1wdHkgaW5wdXRcblxuXHRsZXQgcGFzY2FsU3RyID0gJyc7XG5cdGxldCBjYXBpdGFsaXplTmV4dCA9IHRydWU7IC8vIEZsYWcgdG8gdHJhY2sgY2FwaXRhbGl6YXRpb25cblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IGNoYXIgPSBzdHJbaV07XG5cdFx0aWYgKGNoYXIgPT09ICctJykge1xuXHRcdFx0Y2FwaXRhbGl6ZU5leHQgPSB0cnVlO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0cGFzY2FsU3RyICs9IGNhcGl0YWxpemVOZXh0ID8gY2hhci50b1VwcGVyQ2FzZSgpIDogY2hhcjtcblx0XHRjYXBpdGFsaXplTmV4dCA9IGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHBhc2NhbFN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50OiBOZ3RJbnN0YW5jZU5vZGUsIGNoaWxkOiBOZ3RJbnN0YW5jZU5vZGUpIHtcblx0Y29uc3QgcExTID0gZ2V0TG9jYWxTdGF0ZShwYXJlbnQpO1xuXHRjb25zdCBjTFMgPSBnZXRMb2NhbFN0YXRlKGNoaWxkKTtcblxuXHRpZiAoIXBMUyB8fCAhY0xTKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBbTkdUXSBUSFJFRSBpbnN0YW5jZXMgbmVlZCB0byBiZSBwcmVwYXJlZCB3aXRoIGxvY2FsIHN0YXRlLmApO1xuXHR9XG5cblx0Ly8gd2hldGhlciB0aGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIHBhcmVudCB3aXRoIHBhcmVudC5hZGQoKVxuXHRsZXQgYWRkZWQgPSBmYWxzZTtcblxuXHQvLyBhc3NpZ24gc3RvcmUgb24gY2hpbGQgaWYgbm90IGFscmVhZHkgZXhpc3Rcblx0Ly8gb3IgY2hpbGQgc3RvcmUgaXMgbm90IHRoZSBzYW1lIGFzIHBhcmVudCBzdG9yZVxuXHQvLyBvciBjaGlsZCBzdG9yZSBpcyB0aGUgcGFyZW50IG9mIHBhcmVudCBzdG9yZVxuXHRpZiAoIWNMUy5zdG9yZSB8fCBjTFMuc3RvcmUgIT09IHBMUy5zdG9yZSB8fCBjTFMuc3RvcmUgPT09IHBMUy5zdG9yZS5nZXQoJ3ByZXZpb3VzUm9vdCcpKSB7XG5cdFx0Y0xTLnN0b3JlID0gcExTLnN0b3JlO1xuXHRcdGNvbnN0IGdyYW5kY2hpbGRyZW4gPSBbXG5cdFx0XHQuLi4oY0xTLm9iamVjdHMgPyB1bnRyYWNrZWQoY0xTLm9iamVjdHMpIDogW10pLFxuXHRcdFx0Li4uKGNMUy5ub25PYmplY3RzID8gdW50cmFja2VkKGNMUy5ub25PYmplY3RzKSA6IFtdKSxcblx0XHRdO1xuXHRcdGZvciAoY29uc3QgZ3JhbmRjaGlsZCBvZiBncmFuZGNoaWxkcmVuKSB7XG5cdFx0XHRjb25zdCBncmFuZENoaWxkTFMgPSBnZXRMb2NhbFN0YXRlKGdyYW5kY2hpbGQpO1xuXHRcdFx0aWYgKCFncmFuZENoaWxkTFMpIGNvbnRpbnVlO1xuXHRcdFx0Z3JhbmRDaGlsZExTLnN0b3JlID0gY0xTLnN0b3JlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChjTFMuYXR0YWNoKSB7XG5cdFx0Y29uc3QgYXR0YWNoUHJvcCA9IGNMUy5hdHRhY2g7XG5cblx0XHRpZiAodHlwZW9mIGF0dGFjaFByb3AgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGxldCBhdHRhY2hDbGVhblVwOiBSZXR1cm5UeXBlPHR5cGVvZiBhdHRhY2hQcm9wPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKGNMUy5pc1Jhdykge1xuXHRcdFx0XHRpZiAoY0xTLmluc3RhbmNlU3RvcmUuZ2V0KCdwYXJlbnQnKSAhPT0gcGFyZW50KSB7XG5cdFx0XHRcdFx0Y0xTLnNldFBhcmVudChwYXJlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgaGF2ZSByYXdWYWx1ZSB5ZXQsIHNvIHdlIGJhaWwgYW5kIHdhaXQgdW50aWwgdGhlIFJlbmRlcmVyIHJlY2FsbHMgYXR0YWNoXG5cdFx0XHRcdGlmIChjaGlsZC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXHRcdFx0XHRhdHRhY2hDbGVhblVwID0gYXR0YWNoUHJvcChwYXJlbnQsIGNoaWxkLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSwgY0xTLnN0b3JlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGF0dGFjaENsZWFuVXAgPSBhdHRhY2hQcm9wKHBhcmVudCwgY2hpbGQsIGNMUy5zdG9yZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhdHRhY2hDbGVhblVwKSBjTFMucHJldmlvdXNBdHRhY2ggPSBhdHRhY2hDbGVhblVwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB3ZSBza2lwIGF0dGFjaCBub25lIGlmIHNldCBleHBsaWNpdGx5XG5cdFx0XHRpZiAoYXR0YWNoUHJvcFswXSA9PT0gJ25vbmUnKSB7XG5cdFx0XHRcdGludmFsaWRhdGVJbnN0YW5jZShjaGlsZCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaGFuZGxlIG1hdGVyaWFsIGFycmF5XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGF0dGFjaFByb3BbMF0gPT09ICdtYXRlcmlhbCcgJiZcblx0XHRcdFx0YXR0YWNoUHJvcFsxXSAmJlxuXHRcdFx0XHR0eXBlb2YgTnVtYmVyKGF0dGFjaFByb3BbMV0pID09PSAnbnVtYmVyJyAmJlxuXHRcdFx0XHRpcy5tYXRlcmlhbChjaGlsZCkgJiZcblx0XHRcdFx0IUFycmF5LmlzQXJyYXkocGFyZW50WydtYXRlcmlhbCddKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHBhcmVudFsnbWF0ZXJpYWwnXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBhdHRhY2hcblx0XHRcdGlmIChjTFMuaXNSYXcpIHtcblx0XHRcdFx0aWYgKGNMUy5pbnN0YW5jZVN0b3JlLmdldCgncGFyZW50JykgIT09IHBhcmVudCkge1xuXHRcdFx0XHRcdGNMUy5zZXRQYXJlbnQocGFyZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGhhdmUgcmF3VmFsdWUgeWV0LCBzbyB3ZSBiYWlsIGFuZCB3YWl0IHVudGlsIHRoZSBSZW5kZXJlciByZWNhbGxzIGF0dGFjaFxuXHRcdFx0XHRpZiAoY2hpbGQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID09PSB1bmRlZmluZWQpIHJldHVybjtcblx0XHRcdFx0YXR0YWNoKHBhcmVudCwgY2hpbGQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdLCBhdHRhY2hQcm9wLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGF0dGFjaChwYXJlbnQsIGNoaWxkLCBhdHRhY2hQcm9wKTtcblx0XHRcdH1cblx0XHRcdC8vIHNhdmUgdmFsdWVcblx0XHRcdGNMUy5wcmV2aW91c0F0dGFjaCA9IGF0dGFjaFByb3AucmVkdWNlKCh2YWx1ZSwgcHJvcGVydHkpID0+IHZhbHVlW3Byb3BlcnR5XSwgcGFyZW50KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoaXMub2JqZWN0M0QocGFyZW50KSAmJiBpcy5vYmplY3QzRChjaGlsZCkpIHtcblx0XHRwYXJlbnQuYWRkKGNoaWxkKTtcblx0XHRhZGRlZCA9IHRydWU7XG5cdH1cblxuXHRpZiAocExTLmFkZCkge1xuXHRcdHBMUy5hZGQoY2hpbGQsIGFkZGVkID8gJ29iamVjdHMnIDogJ25vbk9iamVjdHMnKTtcblx0fVxuXG5cdGlmIChjTFMucGFyZW50ICYmIHVudHJhY2tlZChjTFMucGFyZW50KSAhPT0gcGFyZW50KSB7XG5cdFx0Y0xTLnNldFBhcmVudChwYXJlbnQpO1xuXHR9XG5cblx0Ly8gTk9URTogdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGNoaWxkIGlzIGFjdHVhbGx5IGF0dGFjaGVkIHRvIHRoZSBwYXJlbnQgb24gdGhlIHNjZW5lZ3JhcGguXG5cdC8vICBhIGNoaWxkIG9uIHRoZSBBbmd1bGFyIHRlbXBsYXRlIGNhbiBhbHNvIGVtaXQgb25BdHRhY2hcblx0aWYgKGNMUy5vbkF0dGFjaCkgY0xTLm9uQXR0YWNoKHsgcGFyZW50LCBub2RlOiBjaGlsZCB9KTtcblxuXHRpbnZhbGlkYXRlSW5zdGFuY2UoY2hpbGQpO1xuXHRpbnZhbGlkYXRlSW5zdGFuY2UocGFyZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRocmVlQ2hpbGQoY2hpbGQ6IE5ndEluc3RhbmNlTm9kZSwgcGFyZW50PzogTmd0SW5zdGFuY2VOb2RlLCBkaXNwb3NlPzogYm9vbGVhbikge1xuXHRjb25zdCBwTFMgPSBnZXRMb2NhbFN0YXRlKHBhcmVudCk7XG5cdGNvbnN0IGNMUyA9IGdldExvY2FsU3RhdGUoY2hpbGQpO1xuXG5cdC8vIGNsZWFyIHBhcmVudCByZWZcblx0Y0xTPy5zZXRQYXJlbnQobnVsbCk7XG5cblx0Ly8gcmVtb3ZlIGNoaWxkIGZyb20gcGFyZW50XG5cdHBMUz8ucmVtb3ZlKGNoaWxkLCAnb2JqZWN0cycpO1xuXHRwTFM/LnJlbW92ZShjaGlsZCwgJ25vbk9iamVjdHMnKTtcblxuXHRpZiAocGFyZW50KSB7XG5cdFx0aWYgKGNMUz8uYXR0YWNoKSB7XG5cdFx0XHRkZXRhY2gocGFyZW50LCBjaGlsZCwgY0xTLmF0dGFjaCk7XG5cdFx0fSBlbHNlIGlmIChpcy5vYmplY3QzRChwYXJlbnQpICYmIGlzLm9iamVjdDNEKGNoaWxkKSkge1xuXHRcdFx0cGFyZW50LnJlbW92ZShjaGlsZCk7XG5cdFx0XHRjb25zdCBzdG9yZSA9IGNMUz8uc3RvcmUgfHwgcExTPy5zdG9yZTtcblx0XHRcdGlmIChzdG9yZSkgcmVtb3ZlSW50ZXJhY3Rpdml0eShzdG9yZSwgY2hpbGQpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGlzUHJpbWl0aXZlID0gY0xTPy5wcmltaXRpdmU7XG5cdGlmICghaXNQcmltaXRpdmUpIHtcblx0XHRyZW1vdmVUaHJlZVJlY3Vyc2l2ZShjTFM/Lmluc3RhbmNlU3RvcmUuZ2V0KCdvYmplY3RzJykgfHwgW10sIGNoaWxkLCAhIWRpc3Bvc2UpO1xuXHRcdHJlbW92ZVRocmVlUmVjdXJzaXZlKGNoaWxkLmNoaWxkcmVuLCBjaGlsZCwgISFkaXNwb3NlKTtcblx0fVxuXG5cdC8vIGRpc3Bvc2Vcblx0aWYgKCFpc1ByaW1pdGl2ZSAmJiBjaGlsZFsnZGlzcG9zZSddICYmICFpcy5zY2VuZShjaGlsZCkpIHtcblx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiBjaGlsZFsnZGlzcG9zZSddKCkpO1xuXHR9XG5cblx0aWYgKHBhcmVudCkge1xuXHRcdGludmFsaWRhdGVJbnN0YW5jZShwYXJlbnQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRocmVlUmVjdXJzaXZlKGFycmF5OiBOZ3RJbnN0YW5jZU5vZGVbXSwgcGFyZW50OiBOZ3RJbnN0YW5jZU5vZGUsIGRpc3Bvc2U6IGJvb2xlYW4pIHtcblx0aWYgKGFycmF5KSBbLi4uYXJyYXldLmZvckVhY2goKGNoaWxkKSA9PiByZW1vdmVUaHJlZUNoaWxkKGNoaWxkLCBwYXJlbnQsIGRpc3Bvc2UpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUaHJlZUV2ZW50KFxuXHRpbnN0YW5jZTogTmd0SW5zdGFuY2VOb2RlLFxuXHRwcmlvcml0eTogbnVtYmVyLFxuXHRldmVudE5hbWU6IHN0cmluZyxcblx0Y2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkLFxuKTogKCkgPT4gdm9pZCB7XG5cdGNvbnN0IGxTID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cdGlmICghbFMpIHtcblx0XHRjb25zb2xlLndhcm4oJ1tOR1RdIGluc3RhbmNlIGhhcyBub3QgYmVlbiBwcmVwYXJlZCB5ZXQuJyk7XG5cdFx0cmV0dXJuICgpID0+IHt9O1xuXHR9XG5cblx0aWYgKGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQkVGT1JFX1JFTkRFUikge1xuXHRcdHJldHVybiBsUy5zdG9yZVxuXHRcdFx0LmdldCgnaW50ZXJuYWwnKVxuXHRcdFx0LnN1YnNjcmliZSgoc3RhdGUpID0+IGNhbGxiYWNrKHsgc3RhdGUsIG9iamVjdDogaW5zdGFuY2UgfSksIHByaW9yaXR5IHx8IGxTLnByaW9yaXR5IHx8IDApO1xuXHR9XG5cblx0aWYgKGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQVRUQUNIRUQpIHtcblx0XHRsUy5vbkF0dGFjaCA9IGNhbGxiYWNrO1xuXHRcdGlmICh1bnRyYWNrZWQobFMucGFyZW50KSkge1xuXHRcdFx0bFMub25BdHRhY2goeyBwYXJlbnQ6IHVudHJhY2tlZChsUy5wYXJlbnQpLCBub2RlOiBpbnN0YW5jZSB9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0bFMub25BdHRhY2ggPSB1bmRlZmluZWQ7XG5cdFx0fTtcblx0fVxuXG5cdGlmIChldmVudE5hbWUgPT09IFNQRUNJQUxfRVZFTlRTLlVQREFURUQpIHtcblx0XHRsUy5vblVwZGF0ZSA9IGNhbGxiYWNrO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRsUy5vblVwZGF0ZSA9IHVuZGVmaW5lZDtcblx0XHR9O1xuXHR9XG5cblx0aWYgKFRIUkVFX05BVElWRV9FVkVOVFMuaW5jbHVkZXMoZXZlbnROYW1lKSAmJiBpbnN0YW5jZSBpbnN0YW5jZW9mIEV2ZW50RGlzcGF0Y2hlcikge1xuXHRcdC8vIE5PVEU6IHJlbmFtZSB0byBkaXNwb3NlIGJlY2F1c2UgdGhhdCdzIHRoZSBldmVudCB0eXBlLCBub3QgZGlzcG9zZWQuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gJ2Rpc3Bvc2VkJykge1xuXHRcdFx0ZXZlbnROYW1lID0gJ2Rpc3Bvc2UnO1xuXHRcdH1cblxuXHRcdGlmICgoaW5zdGFuY2UgYXMgT2JqZWN0M0QpLnBhcmVudCAmJiAoZXZlbnROYW1lID09PSAnYWRkZWQnIHx8IGV2ZW50TmFtZSA9PT0gJ3JlbW92ZWQnKSkge1xuXHRcdFx0Y2FsbGJhY2soeyB0eXBlOiBldmVudE5hbWUsIHRhcmdldDogaW5zdGFuY2UgfSk7XG5cdFx0fVxuXG5cdFx0aW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcblx0XHRyZXR1cm4gKCkgPT4gaW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcblx0fVxuXG5cdGlmICghbFMuaGFuZGxlcnMpIGxTLmhhbmRsZXJzID0ge307XG5cblx0Ly8gdHJ5IHRvIGdldCB0aGUgcHJldmlvdXMgaGFuZGxlci4gY29tcG91bmQgbWlnaHQgaGF2ZSBvbmUsIHRoZSBUSFJFRSBvYmplY3QgbWlnaHQgYWxzbyBoYXZlIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWVcblx0Y29uc3QgcHJldmlvdXNIYW5kbGVyID0gbFMuaGFuZGxlcnNbZXZlbnROYW1lIGFzIGtleW9mIHR5cGVvZiBsUy5oYW5kbGVyc107XG5cdC8vIHJlYWRqdXN0IHRoZSBjYWxsYmFja1xuXHRjb25zdCB1cGRhdGVkQ2FsbGJhY2s6IHR5cGVvZiBjYWxsYmFjayA9IChldmVudCkgPT4ge1xuXHRcdGlmIChwcmV2aW91c0hhbmRsZXIpIHByZXZpb3VzSGFuZGxlcihldmVudCk7XG5cdFx0Y2FsbGJhY2soZXZlbnQpO1xuXHR9O1xuXG5cdE9iamVjdC5hc3NpZ24obFMuaGFuZGxlcnMsIHsgW2V2ZW50TmFtZV06IHVwZGF0ZWRDYWxsYmFjayB9KTtcblxuXHQvLyBpbmNyZW1lbnQgdGhlIGNvdW50IGV2ZXJ5dGltZVxuXHRsUy5ldmVudENvdW50ICs9IDE7XG5cdC8vIGJ1dCBvbmx5IGFkZCB0aGUgaW5zdGFuY2UgKHRhcmdldCkgdG8gdGhlIGludGVyYWN0aW9uIGFycmF5IChzbyB0aGF0IGl0IGlzIGhhbmRsZWQgYnkgdGhlIEV2ZW50TWFuYWdlciB3aXRoIFJheWNhc3QpXG5cdC8vIHRoZSBmaXJzdCB0aW1lIGV2ZW50Q291bnQgaXMgaW5jcmVtZW50ZWRcblx0aWYgKGxTLmV2ZW50Q291bnQgPT09IDEgJiYgaW5zdGFuY2VbJ3JheWNhc3QnXSkge1xuXHRcdGxldCByb290ID0gbFMuc3RvcmU7XG5cdFx0d2hpbGUgKHJvb3QuZ2V0KCdwcmV2aW91c1Jvb3QnKSkge1xuXHRcdFx0cm9vdCA9IHJvb3QuZ2V0KCdwcmV2aW91c1Jvb3QnKSE7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJhY3Rpb25zID0gcm9vdC5nZXQoJ2ludGVybmFsJywgJ2ludGVyYWN0aW9uJykgfHwgW107XG5cdFx0aW50ZXJhY3Rpb25zLnB1c2goaW5zdGFuY2UpO1xuXHR9XG5cblx0Ly8gY2xlYW4gdXAgdGhlIGV2ZW50IGxpc3RlbmVyIGJ5IHJlbW92aW5nIHRoZSB0YXJnZXQgZnJvbSB0aGUgaW50ZXJhY3Rpb24gYXJyYXlcblx0cmV0dXJuICgpID0+IHtcblx0XHRjb25zdCBsUyA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpO1xuXHRcdGlmIChsUykge1xuXHRcdFx0bFMuZXZlbnRDb3VudCAtPSAxO1xuXHRcdFx0Y29uc3QgaW50ZXJhY3Rpb25zID0gbFMuc3RvcmUuZ2V0KCdpbnRlcm5hbCcsICdpbnRlcmFjdGlvbicpIHx8IFtdO1xuXHRcdFx0Y29uc3QgaW5kZXggPSBpbnRlcmFjdGlvbnMuZmluZEluZGV4KChvYmopID0+IG9iai51dWlkID09PSBpbnN0YW5jZS51dWlkKTtcblx0XHRcdGlmIChpbmRleCA+PSAwKSBpbnRlcmFjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9XG5cdH07XG59XG4iXX0=
|