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.
Files changed (57) hide show
  1. package/fesm2022/angular-three-nativescript.mjs +3 -3
  2. package/fesm2022/angular-three-nativescript.mjs.map +1 -1
  3. package/fesm2022/angular-three-testing.mjs +12 -14
  4. package/fesm2022/angular-three-testing.mjs.map +1 -1
  5. package/fesm2022/angular-three.mjs +123 -106
  6. package/fesm2022/angular-three.mjs.map +1 -1
  7. package/lib/canvas.d.ts +7 -7
  8. package/lib/html.d.ts +2 -2
  9. package/lib/portal.d.ts +2 -2
  10. package/lib/routed-scene.d.ts +8 -2
  11. package/lib/utils/object-events.d.ts +0 -19
  12. package/package.json +4 -10
  13. package/plugin/src/generators/init/schema.json +8 -8
  14. package/testing/lib/utils/web-gl-rendering-context.d.ts +1 -1
  15. package/esm2022/angular-three.mjs +0 -5
  16. package/esm2022/index.mjs +0 -25
  17. package/esm2022/lib/canvas.mjs +0 -188
  18. package/esm2022/lib/directives/args.mjs +0 -53
  19. package/esm2022/lib/directives/selection.mjs +0 -69
  20. package/esm2022/lib/dom/events.mjs +0 -73
  21. package/esm2022/lib/events.mjs +0 -361
  22. package/esm2022/lib/html.mjs +0 -44
  23. package/esm2022/lib/instance.mjs +0 -83
  24. package/esm2022/lib/loader.mjs +0 -93
  25. package/esm2022/lib/loop.mjs +0 -141
  26. package/esm2022/lib/pipes/hexify.mjs +0 -86
  27. package/esm2022/lib/portal.mjs +0 -220
  28. package/esm2022/lib/renderer/catalogue.mjs +0 -7
  29. package/esm2022/lib/renderer/constants.mjs +0 -23
  30. package/esm2022/lib/renderer/index.mjs +0 -544
  31. package/esm2022/lib/renderer/state.mjs +0 -54
  32. package/esm2022/lib/renderer/utils.mjs +0 -223
  33. package/esm2022/lib/roots.mjs +0 -275
  34. package/esm2022/lib/routed-scene.mjs +0 -33
  35. package/esm2022/lib/store.mjs +0 -176
  36. package/esm2022/lib/three-types.mjs +0 -2
  37. package/esm2022/lib/types.mjs +0 -2
  38. package/esm2022/lib/utils/apply-props.mjs +0 -130
  39. package/esm2022/lib/utils/attach.mjs +0 -46
  40. package/esm2022/lib/utils/before-render.mjs +0 -41
  41. package/esm2022/lib/utils/is.mjs +0 -52
  42. package/esm2022/lib/utils/make.mjs +0 -52
  43. package/esm2022/lib/utils/object-events.mjs +0 -137
  44. package/esm2022/lib/utils/output-ref.mjs +0 -9
  45. package/esm2022/lib/utils/parameters.mjs +0 -70
  46. package/esm2022/lib/utils/resolve-ref.mjs +0 -8
  47. package/esm2022/lib/utils/signal-store.mjs +0 -90
  48. package/esm2022/lib/utils/update.mjs +0 -37
  49. package/esm2022/nativescript/angular-three-nativescript.mjs +0 -5
  50. package/esm2022/nativescript/index.mjs +0 -2
  51. package/esm2022/nativescript/lib/canvas.mjs +0 -127
  52. package/esm2022/testing/angular-three-testing.mjs +0 -5
  53. package/esm2022/testing/index.mjs +0 -3
  54. package/esm2022/testing/lib/test-bed.mjs +0 -130
  55. package/esm2022/testing/lib/test-canvas.mjs +0 -45
  56. package/esm2022/testing/lib/utils/mock-canvas.mjs +0 -37
  57. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +0 -752
@@ -1,69 +0,0 @@
1
- import { booleanAttribute, Directive, effect, ElementRef, inject, input, signal, untracked } from '@angular/core';
2
- import { getLocalState } from '../instance';
3
- import * as i0 from "@angular/core";
4
- export class NgtSelection {
5
- constructor() {
6
- this.enabled = input(true, { alias: 'ngtSelection', transform: booleanAttribute });
7
- this.source = signal([]);
8
- this.selected = this.source.asReadonly();
9
- }
10
- update(...args) {
11
- if (!this.enabled())
12
- return;
13
- this.source.update(...args);
14
- }
15
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
16
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.11", type: NgtSelection, isStandalone: true, selector: "[ngtSelection]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngtSelection", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
17
- }
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtSelection, decorators: [{
19
- type: Directive,
20
- args: [{ standalone: true, selector: '[ngtSelection]' }]
21
- }] });
22
- export class NgtSelect {
23
- constructor() {
24
- this.enabled = input(false, { transform: booleanAttribute, alias: 'ngtSelect' });
25
- const elementRef = inject(ElementRef);
26
- const selection = inject(NgtSelection);
27
- effect((onCleanup) => {
28
- const selectionEnabled = selection.enabled();
29
- if (!selectionEnabled)
30
- return;
31
- const enabled = this.enabled();
32
- if (!enabled)
33
- return;
34
- const host = elementRef.nativeElement;
35
- if (!host)
36
- return;
37
- const localState = getLocalState(host);
38
- if (!localState)
39
- return;
40
- // ngt-mesh[ngtSelect]
41
- if (host.type === 'Mesh') {
42
- selection.update((prev) => [...prev, host]);
43
- onCleanup(() => selection.update((prev) => prev.filter((el) => el !== host)));
44
- return;
45
- }
46
- const [collection] = [untracked(selection.selected), localState.objects()];
47
- let changed = false;
48
- const current = [];
49
- host.traverse((child) => {
50
- child.type === 'Mesh' && current.push(child);
51
- if (collection.indexOf(child) === -1)
52
- changed = true;
53
- });
54
- if (!changed)
55
- return;
56
- selection.update((prev) => [...prev, ...current]);
57
- onCleanup(() => {
58
- selection.update((prev) => prev.filter((el) => !current.includes(el)));
59
- });
60
- }, { allowSignalWrites: true });
61
- }
62
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
63
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.11", type: NgtSelect, isStandalone: true, selector: "ngt-group[ngtSelect], ngt-mesh[ngtSelect]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngtSelect", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
64
- }
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtSelect, decorators: [{
66
- type: Directive,
67
- args: [{ standalone: true, selector: 'ngt-group[ngtSelect], ngt-mesh[ngtSelect]' }]
68
- }], ctorParameters: () => [] });
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGlyZWN0aXZlcy9zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUc1QyxNQUFNLE9BQU8sWUFBWTtJQUR6QjtRQUVDLFlBQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRXRFLFdBQU0sR0FBRyxNQUFNLENBQXlDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLGFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0tBTXBDO0lBSkEsTUFBTSxDQUFDLEdBQUcsSUFBMkM7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFPO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzsrR0FUVyxZQUFZO21HQUFaLFlBQVk7OzRGQUFaLFlBQVk7a0JBRHhCLFNBQVM7bUJBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRTs7QUFjM0QsTUFBTSxPQUFPLFNBQVM7SUFHckI7UUFGQSxZQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUczRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQTJCLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV2QyxNQUFNLENBQ0wsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNiLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsT0FBTztZQUU5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTztZQUVyQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFFbEIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVO2dCQUFFLE9BQU87WUFFeEIsc0JBQXNCO1lBQ3RCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUUsT0FBTztZQUNSLENBQUM7WUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwQixNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPO1lBRXJCLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDO0lBQ0gsQ0FBQzsrR0E3Q1csU0FBUzttR0FBVCxTQUFTOzs0RkFBVCxTQUFTO2tCQURyQixTQUFTO21CQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsMkNBQTJDLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBib29sZWFuQXR0cmlidXRlLCBEaXJlY3RpdmUsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyb3VwLCBNZXNoLCBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUgfSBmcm9tICcuLi9pbnN0YW5jZSc7XG5cbkBEaXJlY3RpdmUoeyBzdGFuZGFsb25lOiB0cnVlLCBzZWxlY3RvcjogJ1tuZ3RTZWxlY3Rpb25dJyB9KVxuZXhwb3J0IGNsYXNzIE5ndFNlbGVjdGlvbiB7XG5cdGVuYWJsZWQgPSBpbnB1dCh0cnVlLCB7IGFsaWFzOiAnbmd0U2VsZWN0aW9uJywgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG5cdHByaXZhdGUgc291cmNlID0gc2lnbmFsPEFycmF5PEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0Q+PihbXSk7XG5cdHNlbGVjdGVkID0gdGhpcy5zb3VyY2UuYXNSZWFkb25seSgpO1xuXG5cdHVwZGF0ZSguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnNvdXJjZS51cGRhdGU+KSB7XG5cdFx0aWYgKCF0aGlzLmVuYWJsZWQoKSkgcmV0dXJuO1xuXHRcdHRoaXMuc291cmNlLnVwZGF0ZSguLi5hcmdzKTtcblx0fVxufVxuXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSwgc2VsZWN0b3I6ICduZ3QtZ3JvdXBbbmd0U2VsZWN0XSwgbmd0LW1lc2hbbmd0U2VsZWN0XScgfSlcbmV4cG9ydCBjbGFzcyBOZ3RTZWxlY3Qge1xuXHRlbmFibGVkID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ25ndFNlbGVjdCcgfSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3QgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEdyb3VwIHwgTWVzaD4+KEVsZW1lbnRSZWYpO1xuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IGluamVjdChOZ3RTZWxlY3Rpb24pO1xuXG5cdFx0ZWZmZWN0KFxuXHRcdFx0KG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0XHRjb25zdCBzZWxlY3Rpb25FbmFibGVkID0gc2VsZWN0aW9uLmVuYWJsZWQoKTtcblx0XHRcdFx0aWYgKCFzZWxlY3Rpb25FbmFibGVkKSByZXR1cm47XG5cblx0XHRcdFx0Y29uc3QgZW5hYmxlZCA9IHRoaXMuZW5hYmxlZCgpO1xuXHRcdFx0XHRpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBob3N0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRpZiAoIWhvc3QpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShob3N0KTtcblx0XHRcdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdFx0Ly8gbmd0LW1lc2hbbmd0U2VsZWN0XVxuXHRcdFx0XHRpZiAoaG9zdC50eXBlID09PSAnTWVzaCcpIHtcblx0XHRcdFx0XHRzZWxlY3Rpb24udXBkYXRlKChwcmV2KSA9PiBbLi4ucHJldiwgaG9zdF0pO1xuXHRcdFx0XHRcdG9uQ2xlYW51cCgoKSA9PiBzZWxlY3Rpb24udXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigoZWwpID0+IGVsICE9PSBob3N0KSkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IFtjb2xsZWN0aW9uXSA9IFt1bnRyYWNrZWQoc2VsZWN0aW9uLnNlbGVjdGVkKSwgbG9jYWxTdGF0ZS5vYmplY3RzKCldO1xuXHRcdFx0XHRsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50OiBPYmplY3QzRFtdID0gW107XG5cdFx0XHRcdGhvc3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XG5cdFx0XHRcdFx0Y2hpbGQudHlwZSA9PT0gJ01lc2gnICYmIGN1cnJlbnQucHVzaChjaGlsZCk7XG5cdFx0XHRcdFx0aWYgKGNvbGxlY3Rpb24uaW5kZXhPZihjaGlsZCkgPT09IC0xKSBjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKCFjaGFuZ2VkKSByZXR1cm47XG5cblx0XHRcdFx0c2VsZWN0aW9uLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIC4uLmN1cnJlbnRdKTtcblx0XHRcdFx0b25DbGVhbnVwKCgpID0+IHtcblx0XHRcdFx0XHRzZWxlY3Rpb24udXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigoZWwpID0+ICFjdXJyZW50LmluY2x1ZGVzKGVsIGFzIE9iamVjdDNEKSkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG5cdFx0KTtcblx0fVxufVxuIl19
@@ -1,73 +0,0 @@
1
- import { createEvents } from '../events';
2
- const DOM_EVENTS = {
3
- click: false,
4
- contextmenu: false,
5
- dblclick: false,
6
- wheel: false, // passive wheel errors with OrbitControls
7
- pointerdown: true,
8
- pointerup: true,
9
- pointerleave: true,
10
- pointermove: true,
11
- pointercancel: true,
12
- lostpointercapture: true,
13
- };
14
- export const supportedEvents = [
15
- 'click',
16
- 'contextmenu',
17
- 'dblclick',
18
- 'pointerup',
19
- 'pointerdown',
20
- 'pointerover',
21
- 'pointerout',
22
- 'pointerenter',
23
- 'pointerleave',
24
- 'pointermove',
25
- 'pointermissed',
26
- 'pointercancel',
27
- 'wheel',
28
- ];
29
- export function createPointerEvents(store) {
30
- const { handlePointer } = createEvents(store);
31
- return {
32
- priority: 1,
33
- enabled: true,
34
- compute: (event, root) => {
35
- const state = root.get();
36
- // https://github.com/pmndrs/react-three-fiber/pull/782
37
- // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
38
- state.pointer.set((event.offsetX / state.size.width) * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
39
- state.raycaster.setFromCamera(state.pointer, state.camera);
40
- },
41
- connected: undefined,
42
- handlers: Object.keys(DOM_EVENTS).reduce((handlers, supportedEventName) => {
43
- handlers[supportedEventName] = handlePointer(supportedEventName);
44
- return handlers;
45
- }, {}),
46
- update: () => {
47
- const { events, internal } = store.get();
48
- if (internal.lastEvent?.nativeElement && events.handlers)
49
- events.handlers.pointermove(internal.lastEvent.nativeElement);
50
- },
51
- connect: (target) => {
52
- const state = store.get();
53
- state.events.disconnect?.();
54
- state.setEvents({ connected: target });
55
- Object.entries(state.events.handlers ?? {}).forEach(([eventName, eventHandler]) => {
56
- const passive = DOM_EVENTS[eventName];
57
- target.addEventListener(eventName, eventHandler, { passive });
58
- });
59
- },
60
- disconnect: () => {
61
- const { events, setEvents } = store.get();
62
- if (events.connected) {
63
- Object.entries(events.handlers ?? {}).forEach(([eventName, eventHandler]) => {
64
- if (events.connected instanceof HTMLElement) {
65
- events.connected.removeEventListener(eventName, eventHandler);
66
- }
67
- });
68
- setEvents({ connected: undefined });
69
- }
70
- },
71
- };
72
- }
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZG9tL2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXpDLE1BQU0sVUFBVSxHQUFHO0lBQ2xCLEtBQUssRUFBRSxLQUFLO0lBQ1osV0FBVyxFQUFFLEtBQUs7SUFDbEIsUUFBUSxFQUFFLEtBQUs7SUFDZixLQUFLLEVBQUUsS0FBSyxFQUFFLDBDQUEwQztJQUN4RCxXQUFXLEVBQUUsSUFBSTtJQUNqQixTQUFTLEVBQUUsSUFBSTtJQUNmLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLGtCQUFrQixFQUFFLElBQUk7Q0FDZixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzlCLE9BQU87SUFDUCxhQUFhO0lBQ2IsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsYUFBYTtJQUNiLFlBQVk7SUFDWixjQUFjO0lBQ2QsY0FBYztJQUNkLGFBQWE7SUFDYixlQUFlO0lBQ2YsZUFBZTtJQUNmLE9BQU87Q0FDRSxDQUFDO0FBRVgsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQStCO0lBQ2xFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUMsT0FBTztRQUNOLFFBQVEsRUFBRSxDQUFDO1FBQ1gsT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUUsQ0FBQyxLQUFrQixFQUFFLElBQThCLEVBQUUsRUFBRTtZQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsdURBQXVEO1lBQ3ZELDRGQUE0RjtZQUM1RixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVHLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxTQUFTLEVBQUUsU0FBUztRQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFzQixFQUFFLGtCQUFrQixFQUFFLEVBQUU7WUFDdkYsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakUsT0FBTyxRQUFRLENBQUM7UUFDakIsQ0FBQyxFQUFFLEVBQUUsQ0FBYztRQUNuQixNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQ1osTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekMsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLGFBQWEsSUFBSSxNQUFNLENBQUMsUUFBUTtnQkFDdkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsTUFBbUIsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFFNUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUEwQixFQUFFLEVBQUU7Z0JBQzFHLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxTQUFvQyxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMvRCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUM7UUFDRCxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUEwQixFQUFFLEVBQUU7b0JBQ3BHLElBQUksTUFBTSxDQUFDLFNBQVMsWUFBWSxXQUFXLEVBQUUsQ0FBQzt3QkFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQy9ELENBQUM7Z0JBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNGLENBQUM7S0FDRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUV2ZW50cyB9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBOZ3RBbnlSZWNvcmQsIE5ndERvbUV2ZW50LCBOZ3RFdmVudE1hbmFnZXIsIE5ndEV2ZW50cywgTmd0U3RhdGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4uL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5cbmNvbnN0IERPTV9FVkVOVFMgPSB7XG5cdGNsaWNrOiBmYWxzZSxcblx0Y29udGV4dG1lbnU6IGZhbHNlLFxuXHRkYmxjbGljazogZmFsc2UsXG5cdHdoZWVsOiBmYWxzZSwgLy8gcGFzc2l2ZSB3aGVlbCBlcnJvcnMgd2l0aCBPcmJpdENvbnRyb2xzXG5cdHBvaW50ZXJkb3duOiB0cnVlLFxuXHRwb2ludGVydXA6IHRydWUsXG5cdHBvaW50ZXJsZWF2ZTogdHJ1ZSxcblx0cG9pbnRlcm1vdmU6IHRydWUsXG5cdHBvaW50ZXJjYW5jZWw6IHRydWUsXG5cdGxvc3Rwb2ludGVyY2FwdHVyZTogdHJ1ZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRFdmVudHMgPSBbXG5cdCdjbGljaycsXG5cdCdjb250ZXh0bWVudScsXG5cdCdkYmxjbGljaycsXG5cdCdwb2ludGVydXAnLFxuXHQncG9pbnRlcmRvd24nLFxuXHQncG9pbnRlcm92ZXInLFxuXHQncG9pbnRlcm91dCcsXG5cdCdwb2ludGVyZW50ZXInLFxuXHQncG9pbnRlcmxlYXZlJyxcblx0J3BvaW50ZXJtb3ZlJyxcblx0J3BvaW50ZXJtaXNzZWQnLFxuXHQncG9pbnRlcmNhbmNlbCcsXG5cdCd3aGVlbCcsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9pbnRlckV2ZW50cyhzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+KTogTmd0RXZlbnRNYW5hZ2VyPEhUTUxFbGVtZW50PiB7XG5cdGNvbnN0IHsgaGFuZGxlUG9pbnRlciB9ID0gY3JlYXRlRXZlbnRzKHN0b3JlKTtcblxuXHRyZXR1cm4ge1xuXHRcdHByaW9yaXR5OiAxLFxuXHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0Y29tcHV0ZTogKGV2ZW50OiBOZ3REb21FdmVudCwgcm9vdDogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+KSA9PiB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHJvb3QuZ2V0KCk7XG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3JlYWN0LXRocmVlLWZpYmVyL3B1bGwvNzgyXG5cdFx0XHQvLyBFdmVudHMgdHJpZ2dlciBvdXRzaWRlIG9mIGNhbnZhcyB3aGVuIG1vdmVkLCB1c2Ugb2Zmc2V0WC9ZIGJ5IGRlZmF1bHQgYW5kIGFsbG93IG92ZXJyaWRlc1xuXHRcdFx0c3RhdGUucG9pbnRlci5zZXQoKGV2ZW50Lm9mZnNldFggLyBzdGF0ZS5zaXplLndpZHRoKSAqIDIgLSAxLCAtKGV2ZW50Lm9mZnNldFkgLyBzdGF0ZS5zaXplLmhlaWdodCkgKiAyICsgMSk7XG5cdFx0XHRzdGF0ZS5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYShzdGF0ZS5wb2ludGVyLCBzdGF0ZS5jYW1lcmEpO1xuXHRcdH0sXG5cdFx0Y29ubmVjdGVkOiB1bmRlZmluZWQsXG5cdFx0aGFuZGxlcnM6IE9iamVjdC5rZXlzKERPTV9FVkVOVFMpLnJlZHVjZSgoaGFuZGxlcnM6IE5ndEFueVJlY29yZCwgc3VwcG9ydGVkRXZlbnROYW1lKSA9PiB7XG5cdFx0XHRoYW5kbGVyc1tzdXBwb3J0ZWRFdmVudE5hbWVdID0gaGFuZGxlUG9pbnRlcihzdXBwb3J0ZWRFdmVudE5hbWUpO1xuXHRcdFx0cmV0dXJuIGhhbmRsZXJzO1xuXHRcdH0sIHt9KSBhcyBOZ3RFdmVudHMsXG5cdFx0dXBkYXRlOiAoKSA9PiB7XG5cdFx0XHRjb25zdCB7IGV2ZW50cywgaW50ZXJuYWwgfSA9IHN0b3JlLmdldCgpO1xuXHRcdFx0aWYgKGludGVybmFsLmxhc3RFdmVudD8ubmF0aXZlRWxlbWVudCAmJiBldmVudHMuaGFuZGxlcnMpXG5cdFx0XHRcdGV2ZW50cy5oYW5kbGVycy5wb2ludGVybW92ZShpbnRlcm5hbC5sYXN0RXZlbnQubmF0aXZlRWxlbWVudCk7XG5cdFx0fSxcblx0XHRjb25uZWN0OiAodGFyZ2V0OiBIVE1MRWxlbWVudCkgPT4ge1xuXHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5nZXQoKTtcblx0XHRcdHN0YXRlLmV2ZW50cy5kaXNjb25uZWN0Py4oKTtcblxuXHRcdFx0c3RhdGUuc2V0RXZlbnRzKHsgY29ubmVjdGVkOiB0YXJnZXQgfSk7XG5cblx0XHRcdE9iamVjdC5lbnRyaWVzKHN0YXRlLmV2ZW50cy5oYW5kbGVycyA/PyB7fSkuZm9yRWFjaCgoW2V2ZW50TmFtZSwgZXZlbnRIYW5kbGVyXTogW3N0cmluZywgRXZlbnRMaXN0ZW5lcl0pID0+IHtcblx0XHRcdFx0Y29uc3QgcGFzc2l2ZSA9IERPTV9FVkVOVFNbZXZlbnROYW1lIGFzIGtleW9mIHR5cGVvZiBET01fRVZFTlRTXTtcblx0XHRcdFx0dGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIsIHsgcGFzc2l2ZSB9KTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0ZGlzY29ubmVjdDogKCkgPT4ge1xuXHRcdFx0Y29uc3QgeyBldmVudHMsIHNldEV2ZW50cyB9ID0gc3RvcmUuZ2V0KCk7XG5cdFx0XHRpZiAoZXZlbnRzLmNvbm5lY3RlZCkge1xuXHRcdFx0XHRPYmplY3QuZW50cmllcyhldmVudHMuaGFuZGxlcnMgPz8ge30pLmZvckVhY2goKFtldmVudE5hbWUsIGV2ZW50SGFuZGxlcl06IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJdKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGV2ZW50cy5jb25uZWN0ZWQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0ZXZlbnRzLmNvbm5lY3RlZC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHNldEV2ZW50cyh7IGNvbm5lY3RlZDogdW5kZWZpbmVkIH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdH07XG59XG4iXX0=
@@ -1,361 +0,0 @@
1
- import { Vector3 } from 'three';
2
- import { getLocalState } from './instance';
3
- import { makeId } from './utils/make';
4
- /**
5
- * Release pointer captures.
6
- * This is called by releasePointerCapture in the API, and when an object is removed.
7
- */
8
- function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
9
- const captureData = captures.get(obj);
10
- if (captureData) {
11
- captures.delete(obj);
12
- // If this was the last capturing object for this pointer
13
- if (captures.size === 0) {
14
- capturedMap.delete(pointerId);
15
- captureData.target.releasePointerCapture(pointerId);
16
- }
17
- }
18
- }
19
- export function removeInteractivity(store, object) {
20
- const { internal } = store.snapshot;
21
- // Removes every trace of an object from the data store
22
- internal.interaction = internal.interaction.filter((o) => o !== object);
23
- internal.initialHits = internal.initialHits.filter((o) => o !== object);
24
- internal.hovered.forEach((value, key) => {
25
- if (value.eventObject === object || value.object === object) {
26
- // Clear out intersects, they are outdated by now
27
- internal.hovered.delete(key);
28
- }
29
- });
30
- internal.capturedMap.forEach((captures, pointerId) => {
31
- releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
32
- });
33
- }
34
- export function createEvents(store) {
35
- /** Calculates delta */
36
- function calculateDistance(event) {
37
- const internal = store.get('internal');
38
- const dx = event.offsetX - internal.initialClick[0];
39
- const dy = event.offsetY - internal.initialClick[1];
40
- return Math.round(Math.sqrt(dx * dx + dy * dy));
41
- }
42
- /** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
43
- function filterPointerEvents(objects) {
44
- return objects.filter((obj) => ['move', 'over', 'enter', 'out', 'leave'].some((name) => {
45
- const eventName = `pointer${name}`;
46
- return getLocalState(obj)?.handlers?.[eventName];
47
- }));
48
- }
49
- function intersect(event, filter) {
50
- const state = store.get();
51
- const duplicates = new Set();
52
- const intersections = [];
53
- // Allow callers to eliminate event objects
54
- const eventsObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
55
- // Reset all raycaster cameras to undefined
56
- for (let i = 0; i < eventsObjects.length; i++) {
57
- const objectRootState = getLocalState(eventsObjects[i])?.store.snapshot;
58
- if (objectRootState) {
59
- objectRootState.raycaster.camera = undefined;
60
- }
61
- }
62
- if (!state.previousRoot) {
63
- // Make sure root-level pointer and ray are set up
64
- state.events.compute?.(event, store, null);
65
- }
66
- function handleRaycast(obj) {
67
- const objStore = getLocalState(obj)?.store;
68
- const objState = objStore?.snapshot;
69
- // Skip event handling when noEvents is set, or when the raycasters camera is null
70
- if (!objState || !objState.events.enabled || objState.raycaster.camera === null)
71
- return [];
72
- // When the camera is undefined we have to call the event layers update function
73
- if (objState.raycaster.camera === undefined) {
74
- objState.events.compute?.(event, objStore, objState.previousRoot);
75
- // If the camera is still undefined we have to skip this layer entirely
76
- if (objState.raycaster.camera === undefined)
77
- objState.raycaster.camera = null;
78
- }
79
- // Intersect object by object
80
- return objState.raycaster.camera ? objState.raycaster.intersectObject(obj, true) : [];
81
- }
82
- // Collect events
83
- let hits = eventsObjects
84
- // Intersect objects
85
- .flatMap(handleRaycast)
86
- // Sort by event priority and distance
87
- .sort((a, b) => {
88
- const aState = getLocalState(a.object)?.store.snapshot;
89
- const bState = getLocalState(b.object)?.store.snapshot;
90
- if (!aState || !bState)
91
- return a.distance - b.distance;
92
- return bState.events.priority - aState.events.priority || a.distance - b.distance;
93
- })
94
- // Filter out duplicates
95
- .filter((item) => {
96
- const id = makeId(item);
97
- if (duplicates.has(id))
98
- return false;
99
- duplicates.add(id);
100
- return true;
101
- });
102
- // https://github.com/mrdoob/three.js/issues/16031
103
- // Allow custom userland intersect sort order, this likely only makes sense on the root filter
104
- if (state.events.filter)
105
- hits = state.events.filter(hits, store);
106
- // Bubble up the events, find the event source (eventObject)
107
- for (const hit of hits) {
108
- let eventObject = hit.object;
109
- // bubble event up
110
- while (eventObject) {
111
- if (getLocalState(eventObject)?.eventCount)
112
- intersections.push({ ...hit, eventObject });
113
- eventObject = eventObject.parent;
114
- }
115
- }
116
- // If the interaction is captured, make all capturing targets part of the intersect.
117
- if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
118
- for (const captureData of state.internal.capturedMap.get(event.pointerId).values()) {
119
- if (!duplicates.has(makeId(captureData.intersection)))
120
- intersections.push(captureData.intersection);
121
- }
122
- }
123
- return intersections;
124
- }
125
- /** Handles intersections by forwarding them to handlers */
126
- function handleIntersects(intersections, event, delta, callback) {
127
- const rootState = store.snapshot;
128
- // If anything has been found, forward it to the event listeners
129
- if (intersections.length) {
130
- const localState = { stopped: false };
131
- for (const hit of intersections) {
132
- const { raycaster, pointer, camera, internal } = getLocalState(hit.object)?.store.snapshot || rootState;
133
- const unprojectedPoint = new Vector3(pointer.x, pointer.y, 0).unproject(camera);
134
- const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
135
- const setPointerCapture = (id) => {
136
- const captureData = { intersection: hit, target: event.target };
137
- if (internal.capturedMap.has(id)) {
138
- // if the pointerId was previously captured, we add the hit to the
139
- // event capturedMap.
140
- internal.capturedMap.get(id).set(hit.eventObject, captureData);
141
- }
142
- else {
143
- // if the pointerId was not previously captured, we create a map
144
- // containing the hitObject, and the hit. hitObject is used for
145
- // faster access.
146
- internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
147
- }
148
- // Call the original event now
149
- event.target.setPointerCapture(id);
150
- };
151
- const releasePointerCapture = (id) => {
152
- const captures = internal.capturedMap.get(id);
153
- if (captures) {
154
- releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
155
- }
156
- };
157
- // Add native event props
158
- const extractEventProps = {};
159
- // This iterates over the event's properties including the inherited ones. Native PointerEvents have most of their props as getters which are inherited, but polyfilled PointerEvents have them all as their own properties (i.e. not inherited). We can't use Object.keys() or Object.entries() as they only return "own" properties; nor Object.getPrototypeOf(event) as that *doesn't* return "own" properties, only inherited ones.
160
- for (const prop in event) {
161
- const property = event[prop];
162
- // Only copy over atomics, leave functions alone as these should be
163
- // called as event.nativeEvent.fn()
164
- if (typeof property !== 'function')
165
- extractEventProps[prop] = property;
166
- }
167
- const raycastEvent = {
168
- ...hit,
169
- ...extractEventProps,
170
- pointer,
171
- intersections,
172
- stopped: localState.stopped,
173
- delta,
174
- unprojectedPoint,
175
- ray: raycaster.ray,
176
- camera,
177
- // Hijack stopPropagation, which just sets a flag
178
- stopPropagation() {
179
- // https://github.com/pmndrs/react-three-fiber/issues/596
180
- // Events are not allowed to stop propagation if the pointer has been captured
181
- const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId);
182
- // We only authorize stopPropagation...
183
- if (
184
- // ...if this pointer hasn't been captured
185
- !capturesForPointer ||
186
- // ... or if the hit object is capturing the pointer
187
- capturesForPointer.has(hit.eventObject)) {
188
- raycastEvent.stopped = localState.stopped = true;
189
- // Propagation is stopped, remove all other hover records
190
- // An event handler is only allowed to flush other handlers if it is hovered itself
191
- if (internal.hovered.size &&
192
- Array.from(internal.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
193
- // Objects cannot flush out higher up objects that have already caught the event
194
- const higher = intersections.slice(0, intersections.indexOf(hit));
195
- cancelPointer([...higher, hit]);
196
- }
197
- }
198
- },
199
- // there should be a distinction between target and currentTarget
200
- target: { hasPointerCapture, setPointerCapture, releasePointerCapture },
201
- currentTarget: { hasPointerCapture, setPointerCapture, releasePointerCapture },
202
- nativeEvent: event,
203
- };
204
- // Call subscribers
205
- callback(raycastEvent);
206
- // Event bubbling may be interrupted by stopPropagation
207
- if (localState.stopped)
208
- break;
209
- }
210
- }
211
- return intersections;
212
- }
213
- function cancelPointer(intersections) {
214
- const internal = store.get('internal');
215
- for (const hoveredObj of internal.hovered.values()) {
216
- // When no objects were hit or the the hovered object wasn't found underneath the cursor
217
- // we call onPointerOut and delete the object from the hovered-elements map
218
- if (!intersections.length ||
219
- !intersections.find((hit) => hit.object === hoveredObj.object &&
220
- hit.index === hoveredObj.index &&
221
- hit.instanceId === hoveredObj.instanceId)) {
222
- const eventObject = hoveredObj.eventObject;
223
- const instance = getLocalState(eventObject);
224
- const handlers = instance?.handlers;
225
- internal.hovered.delete(makeId(hoveredObj));
226
- if (instance?.eventCount) {
227
- // Clear out intersects, they are outdated by now
228
- const data = { ...hoveredObj, intersections };
229
- handlers?.pointerout?.(data);
230
- handlers?.pointerleave?.(data);
231
- }
232
- }
233
- }
234
- }
235
- function pointerMissed(event, objects) {
236
- for (let i = 0; i < objects.length; i++) {
237
- const instance = getLocalState(objects[i]);
238
- instance?.handlers.pointermissed?.(event);
239
- }
240
- }
241
- function handlePointer(name) {
242
- // Deal with cancelation
243
- switch (name) {
244
- case 'pointerleave':
245
- case 'pointercancel':
246
- return () => cancelPointer([]);
247
- case 'lostpointercapture':
248
- return (event) => {
249
- const { internal } = store.snapshot;
250
- if ('pointerId' in event && internal.capturedMap.has(event.pointerId)) {
251
- // If the object event interface had lostpointercapture, we'd call it here on every
252
- // object that's getting removed. We call it on the next frame because lostpointercapture
253
- // fires before pointerup. Otherwise pointerUp would never be called if the event didn't
254
- // happen in the object it originated from, leaving components in a in-between state.
255
- requestAnimationFrame(() => {
256
- // Only release if pointer-up didn't do it already
257
- if (internal.capturedMap.has(event.pointerId)) {
258
- internal.capturedMap.delete(event.pointerId);
259
- cancelPointer([]);
260
- }
261
- });
262
- }
263
- };
264
- }
265
- // Any other pointer goes here ...
266
- return function handleEvent(event) {
267
- // NOTE: pointerMissed$ on NgtStore is private
268
- const pointerMissed$ = store['pointerMissed$'];
269
- const internal = store.get('internal');
270
- // prepareRay(event)
271
- internal.lastEvent.nativeElement = event;
272
- // Get fresh intersects
273
- const isPointerMove = name === 'pointermove';
274
- const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
275
- const filter = isPointerMove ? filterPointerEvents : undefined;
276
- const hits = intersect(event, filter);
277
- const delta = isClickEvent ? calculateDistance(event) : 0;
278
- // Save initial coordinates on pointer-down
279
- if (name === 'pointerdown') {
280
- internal.initialClick = [event.offsetX, event.offsetY];
281
- internal.initialHits = hits.map((hit) => hit.eventObject);
282
- }
283
- // If a click yields no results, pass it back to the user as a miss
284
- // Missed events have to come first in order to establish user-land side-effect clean up
285
- if (isClickEvent && !hits.length) {
286
- if (delta <= 2) {
287
- pointerMissed(event, internal.interaction);
288
- pointerMissed$.next(event);
289
- }
290
- }
291
- // Take care of unhover
292
- if (isPointerMove)
293
- cancelPointer(hits);
294
- function onIntersect(data) {
295
- const eventObject = data.eventObject;
296
- const instance = getLocalState(eventObject);
297
- const handlers = instance?.handlers;
298
- // Check presence of handlers
299
- if (!instance?.eventCount)
300
- return;
301
- /*
302
- MAYBE TODO, DELETE IF NOT:
303
- Check if the object is captured, captured events should not have intersects running in parallel
304
- But wouldn't it be better to just replace capturedMap with a single entry?
305
- Also, are we OK with straight up making picking up multiple objects impossible?
306
-
307
- const pointerId = (data as ThreeEvent<PointerEvent>).pointerId
308
- if (pointerId !== undefined) {
309
- const capturedMeshSet = internal.capturedMap.get(pointerId)
310
- if (capturedMeshSet) {
311
- const captured = capturedMeshSet.get(eventObject)
312
- if (captured && captured.localState.stopped) return
313
- }
314
- }*/
315
- if (isPointerMove) {
316
- // Move event ...
317
- if (handlers?.pointerover || handlers?.pointerenter || handlers?.pointerout || handlers?.pointerleave) {
318
- // When enter or out is present take care of hover-state
319
- const id = makeId(data);
320
- const hoveredItem = internal.hovered.get(id);
321
- if (!hoveredItem) {
322
- // If the object wasn't previously hovered, book it and call its handler
323
- internal.hovered.set(id, data);
324
- handlers.pointerover?.(data);
325
- handlers.pointerenter?.(data);
326
- }
327
- else if (hoveredItem.stopped) {
328
- // If the object was previously hovered and stopped, we shouldn't allow other items to proceed
329
- data.stopPropagation();
330
- }
331
- }
332
- // Call mouse move
333
- handlers?.pointermove?.(data);
334
- }
335
- else {
336
- // All other events ...
337
- const handler = handlers?.[name];
338
- if (handler) {
339
- // Forward all events back to their respective handlers with the exception of click events,
340
- // which must use the initial target
341
- if (!isClickEvent || internal.initialHits.includes(eventObject)) {
342
- // Missed events have to come first
343
- pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
344
- // Now call the handler
345
- handler(data);
346
- }
347
- }
348
- else {
349
- // Trigger onPointerMissed on all elements that have pointer over/out handlers, but not click and weren't hit
350
- if (isClickEvent && internal.initialHits.includes(eventObject)) {
351
- pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
352
- }
353
- }
354
- }
355
- }
356
- handleIntersects(hits, event, delta, onIntersect);
357
- };
358
- }
359
- return { handlePointer };
360
- }
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBMEIsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFVM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd0Qzs7O0dBR0c7QUFDSCxTQUFTLDZCQUE2QixDQUNyQyxXQUFnRSxFQUNoRSxHQUFhLEVBQ2IsUUFBZ0QsRUFDaEQsU0FBaUI7SUFFakIsTUFBTSxXQUFXLEdBQXdDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHlEQUF5RDtRQUN6RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixXQUFXLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUErQixFQUFFLE1BQWdCO0lBQ3BGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ3BDLHVEQUF1RDtJQUN2RCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDeEUsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0s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QUFDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlcnNlY3Rpb24sIE9iamVjdDNELCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHtcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3REb21FdmVudCxcblx0Tmd0RXZlbnRIYW5kbGVycyxcblx0Tmd0SW50ZXJzZWN0aW9uLFxuXHROZ3RQb2ludGVyQ2FwdHVyZVRhcmdldCxcblx0Tmd0U3RhdGUsXG5cdE5ndFRocmVlRXZlbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgbWFrZUlkIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuXG4vKipcbiAqIFJlbGVhc2UgcG9pbnRlciBjYXB0dXJlcy5cbiAqIFRoaXMgaXMgY2FsbGVkIGJ5IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpbiB0aGUgQVBJLCBhbmQgd2hlbiBhbiBvYmplY3QgaXMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoXG5cdGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8T2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj4sXG5cdG9iajogT2JqZWN0M0QsXG5cdGNhcHR1cmVzOiBNYXA8T2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pixcblx0cG9pbnRlcklkOiBudW1iZXIsXG4pOiB2b2lkIHtcblx0Y29uc3QgY2FwdHVyZURhdGE6IE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0IHwgdW5kZWZpbmVkID0gY2FwdHVyZXMuZ2V0KG9iaik7XG5cdGlmIChjYXB0dXJlRGF0YSkge1xuXHRcdGNhcHR1cmVzLmRlbGV0ZShvYmopO1xuXHRcdC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNhcHR1cmluZyBvYmplY3QgZm9yIHRoaXMgcG9pbnRlclxuXHRcdGlmIChjYXB0dXJlcy5zaXplID09PSAwKSB7XG5cdFx0XHRjYXB0dXJlZE1hcC5kZWxldGUocG9pbnRlcklkKTtcblx0XHRcdGNhcHR1cmVEYXRhLnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgb2JqZWN0OiBPYmplY3QzRCkge1xuXHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0Ly8gUmVtb3ZlcyBldmVyeSB0cmFjZSBvZiBhbiBvYmplY3QgZnJvbSB0aGUgZGF0YSBzdG9yZVxuXHRpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcblx0aW50ZXJuYWwuaW5pdGlhbEhpdHMgPSBpbnRlcm5hbC5pbml0aWFsSGl0cy5maWx0ZXIoKG8pID0+IG8gIT09IG9iamVjdCk7XG5cdGludGVybmFsLmhvdmVyZWQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuXHRcdGlmICh2YWx1ZS5ldmVudE9iamVjdCA9PT0gb2JqZWN0IHx8IHZhbHVlLm9iamVjdCA9PT0gb2JqZWN0KSB7XG5cdFx0XHQvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG5cdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0fSk7XG5cdGludGVybmFsLmNhcHR1cmVkTWFwLmZvckVhY2goKGNhcHR1cmVzLCBwb2ludGVySWQpID0+IHtcblx0XHRyZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShpbnRlcm5hbC5jYXB0dXJlZE1hcCwgb2JqZWN0LCBjYXB0dXJlcywgcG9pbnRlcklkKTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudHMoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHQvKiogQ2FsY3VsYXRlcyBkZWx0YSAqL1xuXHRmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRjb25zdCBkeCA9IGV2ZW50Lm9mZnNldFggLSBpbnRlcm5hbC5pbml0aWFsQ2xpY2tbMF07XG5cdFx0Y29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiBhbiBpbnN0YW5jZSBoYXMgYSB2YWxpZCBwb2ludGVyLWV2ZW50IHJlZ2lzdGVyZWQsIHRoaXMgZXhjbHVkZXMgc2Nyb2xsLCBjbGlja3MgZXRjICovXG5cdGZ1bmN0aW9uIGZpbHRlclBvaW50ZXJFdmVudHMob2JqZWN0czogT2JqZWN0M0RbXSkge1xuXHRcdHJldHVybiBvYmplY3RzLmZpbHRlcigob2JqKSA9PlxuXHRcdFx0Wydtb3ZlJywgJ292ZXInLCAnZW50ZXInLCAnb3V0JywgJ2xlYXZlJ10uc29tZSgobmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBldmVudE5hbWUgPSBgcG9pbnRlciR7bmFtZX1gIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnM7XG5cdFx0XHRcdHJldHVybiBnZXRMb2NhbFN0YXRlKG9iaik/LmhhbmRsZXJzPy5bZXZlbnROYW1lXTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnRlcnNlY3QoZXZlbnQ6IE5ndERvbUV2ZW50LCBmaWx0ZXI/OiAob2JqZWN0czogT2JqZWN0M0RbXSkgPT4gT2JqZWN0M0RbXSkge1xuXHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cdFx0Y29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGNvbnN0IGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdID0gW107XG5cdFx0Ly8gQWxsb3cgY2FsbGVycyB0byBlbGltaW5hdGUgZXZlbnQgb2JqZWN0c1xuXHRcdGNvbnN0IGV2ZW50c09iamVjdHMgPSBmaWx0ZXIgPyBmaWx0ZXIoc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb24pIDogc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb247XG5cdFx0Ly8gUmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgb2JqZWN0Um9vdFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShldmVudHNPYmplY3RzW2ldKT8uc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRpZiAob2JqZWN0Um9vdFN0YXRlKSB7XG5cdFx0XHRcdG9iamVjdFJvb3RTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gdW5kZWZpbmVkITtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXN0YXRlLnByZXZpb3VzUm9vdCkge1xuXHRcdFx0Ly8gTWFrZSBzdXJlIHJvb3QtbGV2ZWwgcG9pbnRlciBhbmQgcmF5IGFyZSBzZXQgdXBcblx0XHRcdHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIHN0b3JlLCBudWxsKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVSYXljYXN0KG9iajogT2JqZWN0M0QpIHtcblx0XHRcdGNvbnN0IG9ialN0b3JlID0gZ2V0TG9jYWxTdGF0ZShvYmopPy5zdG9yZTtcblx0XHRcdGNvbnN0IG9ialN0YXRlID0gb2JqU3RvcmU/LnNuYXBzaG90O1xuXHRcdFx0Ly8gU2tpcCBldmVudCBoYW5kbGluZyB3aGVuIG5vRXZlbnRzIGlzIHNldCwgb3Igd2hlbiB0aGUgcmF5Y2FzdGVycyBjYW1lcmEgaXMgbnVsbFxuXHRcdFx0aWYgKCFvYmpTdGF0ZSB8fCAhb2JqU3RhdGUuZXZlbnRzLmVuYWJsZWQgfHwgb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG5cdFx0XHQvLyBXaGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkIHdlIGhhdmUgdG8gY2FsbCB0aGUgZXZlbnQgbGF5ZXJzIHVwZGF0ZSBmdW5jdGlvblxuXHRcdFx0aWYgKG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYmpTdGF0ZS5ldmVudHMuY29tcHV0ZT8uKGV2ZW50LCBvYmpTdG9yZSwgb2JqU3RhdGUucHJldmlvdXNSb290KTtcblx0XHRcdFx0Ly8gSWYgdGhlIGNhbWVyYSBpcyBzdGlsbCB1bmRlZmluZWQgd2UgaGF2ZSB0byBza2lwIHRoaXMgbGF5ZXIgZW50aXJlbHlcblx0XHRcdFx0aWYgKG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkgb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9IG51bGwhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbnRlcnNlY3Qgb2JqZWN0IGJ5IG9iamVjdFxuXHRcdFx0cmV0dXJuIG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPyBvYmpTdGF0ZS5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG9iaiwgdHJ1ZSkgOiBbXTtcblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGV2ZW50c1xuXHRcdGxldCBoaXRzOiBJbnRlcnNlY3Rpb248T2JqZWN0M0Q+W10gPSBldmVudHNPYmplY3RzXG5cdFx0XHQvLyBJbnRlcnNlY3Qgb2JqZWN0c1xuXHRcdFx0LmZsYXRNYXAoaGFuZGxlUmF5Y2FzdClcblx0XHRcdC8vIFNvcnQgYnkgZXZlbnQgcHJpb3JpdHkgYW5kIGRpc3RhbmNlXG5cdFx0XHQuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRjb25zdCBhU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGEub2JqZWN0KT8uc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRcdGNvbnN0IGJTdGF0ZSA9IGdldExvY2FsU3RhdGUoYi5vYmplY3QpPy5zdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0aWYgKCFhU3RhdGUgfHwgIWJTdGF0ZSkgcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXHRcdFx0XHRyZXR1cm4gYlN0YXRlLmV2ZW50cy5wcmlvcml0eSAtIGFTdGF0ZS5ldmVudHMucHJpb3JpdHkgfHwgYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cdFx0XHR9KVxuXHRcdFx0Ly8gRmlsdGVyIG91dCBkdXBsaWNhdGVzXG5cdFx0XHQuZmlsdGVyKChpdGVtKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkID0gbWFrZUlkKGl0ZW0gYXMgTmd0SW50ZXJzZWN0aW9uKTtcblx0XHRcdFx0aWYgKGR1cGxpY2F0ZXMuaGFzKGlkKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRkdXBsaWNhdGVzLmFkZChpZCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xNjAzMVxuXHRcdC8vIEFsbG93IGN1c3RvbSB1c2VybGFuZCBpbnRlcnNlY3Qgc29ydCBvcmRlciwgdGhpcyBsaWtlbHkgb25seSBtYWtlcyBzZW5zZSBvbiB0aGUgcm9vdCBmaWx0ZXJcblx0XHRpZiAoc3RhdGUuZXZlbnRzLmZpbHRlcikgaGl0cyA9IHN0YXRlLmV2ZW50cy5maWx0ZXIoaGl0cywgc3RvcmUpO1xuXG5cdFx0Ly8gQnViYmxlIHVwIHRoZSBldmVudHMsIGZpbmQgdGhlIGV2ZW50IHNvdXJjZSAoZXZlbnRPYmplY3QpXG5cdFx0Zm9yIChjb25zdCBoaXQgb2YgaGl0cykge1xuXHRcdFx0bGV0IGV2ZW50T2JqZWN0OiBPYmplY3QzRCB8IG51bGwgPSBoaXQub2JqZWN0O1xuXHRcdFx0Ly8gYnViYmxlIGV2ZW50IHVwXG5cdFx0XHR3aGlsZSAoZXZlbnRPYmplY3QpIHtcblx0XHRcdFx0aWYgKGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpPy5ldmVudENvdW50KSBpbnRlcnNlY3Rpb25zLnB1c2goeyAuLi5oaXQsIGV2ZW50T2JqZWN0IH0pO1xuXHRcdFx0XHRldmVudE9iamVjdCA9IGV2ZW50T2JqZWN0LnBhcmVudDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgaW50ZXJhY3Rpb24gaXMgY2FwdHVyZWQsIG1ha2UgYWxsIGNhcHR1cmluZyB0YXJnZXRzIHBhcnQgb2YgdGhlIGludGVyc2VjdC5cblx0XHRpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdGZvciAoY29uc3QgY2FwdHVyZURhdGEgb2Ygc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCkhLnZhbHVlcygpKSB7XG5cdFx0XHRcdGlmICghZHVwbGljYXRlcy5oYXMobWFrZUlkKGNhcHR1cmVEYXRhLmludGVyc2VjdGlvbikpKSBpbnRlcnNlY3Rpb25zLnB1c2goY2FwdHVyZURhdGEuaW50ZXJzZWN0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGludGVyc2VjdGlvbnM7XG5cdH1cblxuXHQvKiogIEhhbmRsZXMgaW50ZXJzZWN0aW9ucyBieSBmb3J3YXJkaW5nIHRoZW0gdG8gaGFuZGxlcnMgKi9cblx0ZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcblx0XHRpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSxcblx0XHRldmVudDogTmd0RG9tRXZlbnQsXG5cdFx0ZGVsdGE6IG51bWJlcixcblx0XHRjYWxsYmFjazogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50PikgPT4gdm9pZCxcblx0KSB7XG5cdFx0Y29uc3Qgcm9vdFN0YXRlID0gc3RvcmUuc25hcHNob3Q7XG5cblx0XHQvLyBJZiBhbnl0aGluZyBoYXMgYmVlbiBmb3VuZCwgZm9yd2FyZCBpdCB0byB0aGUgZXZlbnQgbGlzdGVuZXJzXG5cdFx0aWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuXHRcdFx0Zm9yIChjb25zdCBoaXQgb2YgaW50ZXJzZWN0aW9ucykge1xuXHRcdFx0XHRjb25zdCB7IHJheWNhc3RlciwgcG9pbnRlciwgY2FtZXJhLCBpbnRlcm5hbCB9ID0gZ2V0TG9jYWxTdGF0ZShoaXQub2JqZWN0KT8uc3RvcmUuc25hcHNob3QgfHwgcm9vdFN0YXRlO1xuXHRcdFx0XHRjb25zdCB1bnByb2plY3RlZFBvaW50ID0gbmV3IFZlY3RvcjMocG9pbnRlci54LCBwb2ludGVyLnksIDApLnVucHJvamVjdChjYW1lcmEpO1xuXHRcdFx0XHRjb25zdCBoYXNQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpPy5oYXMoaGl0LmV2ZW50T2JqZWN0KSA/PyBmYWxzZTtcblxuXHRcdFx0XHRjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2FwdHVyZURhdGEgPSB7IGludGVyc2VjdGlvbjogaGl0LCB0YXJnZXQ6IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50IH07XG5cdFx0XHRcdFx0aWYgKGludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhpZCkpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIHByZXZpb3VzbHkgY2FwdHVyZWQsIHdlIGFkZCB0aGUgaGl0IHRvIHRoZVxuXHRcdFx0XHRcdFx0Ly8gZXZlbnQgY2FwdHVyZWRNYXAuXG5cdFx0XHRcdFx0XHRpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpIS5zZXQoaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlRGF0YSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIG5vdCBwcmV2aW91c2x5IGNhcHR1cmVkLCB3ZSBjcmVhdGUgYSBtYXBcblx0XHRcdFx0XHRcdC8vIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvclxuXHRcdFx0XHRcdFx0Ly8gZmFzdGVyIGFjY2Vzcy5cblx0XHRcdFx0XHRcdGludGVybmFsLmNhcHR1cmVkTWFwLnNldChpZCwgbmV3IE1hcChbW2hpdC5ldmVudE9iamVjdCwgY2FwdHVyZURhdGFdXSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDYWxsIHRoZSBvcmlnaW5hbCBldmVudCBub3dcblx0XHRcdFx0XHQoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGlkKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCByZWxlYXNlUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhcHR1cmVzID0gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKTtcblx0XHRcdFx0XHRpZiAoY2FwdHVyZXMpIHtcblx0XHRcdFx0XHRcdHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVzLCBpZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIEFkZCBuYXRpdmUgZXZlbnQgcHJvcHNcblx0XHRcdFx0Y29uc3QgZXh0cmFjdEV2ZW50UHJvcHM6IGFueSA9IHt9O1xuXHRcdFx0XHQvLyBUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGV2ZW50J3MgcHJvcGVydGllcyBpbmNsdWRpbmcgdGhlIGluaGVyaXRlZCBvbmVzLiBOYXRpdmUgUG9pbnRlckV2ZW50cyBoYXZlIG1vc3Qgb2YgdGhlaXIgcHJvcHMgYXMgZ2V0dGVycyB3aGljaCBhcmUgaW5oZXJpdGVkLCBidXQgcG9seWZpbGxlZCBQb2ludGVyRXZlbnRzIGhhdmUgdGhlbSBhbGwgYXMgdGhlaXIgb3duIHByb3BlcnRpZXMgKGkuZS4gbm90IGluaGVyaXRlZCkuIFdlIGNhbid0IHVzZSBPYmplY3Qua2V5cygpIG9yIE9iamVjdC5lbnRyaWVzKCkgYXMgdGhleSBvbmx5IHJldHVybiBcIm93blwiIHByb3BlcnRpZXM7IG5vciBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpIGFzIHRoYXQgKmRvZXNuJ3QqIHJldHVybiBcIm93blwiIHByb3BlcnRpZXMsIG9ubHkgaW5oZXJpdGVkIG9uZXMuXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcCBpbiBldmVudCkge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZXZlbnRbcHJvcCBhcyBrZXlvZiBOZ3REb21FdmVudF07XG5cdFx0XHRcdFx0Ly8gT25seSBjb3B5IG92ZXIgYXRvbWljcywgbGVhdmUgZnVuY3Rpb25zIGFsb25lIGFzIHRoZXNlIHNob3VsZCBiZVxuXHRcdFx0XHRcdC8vIGNhbGxlZCBhcyBldmVudC5uYXRpdmVFdmVudC5mbigpXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ2Z1bmN0aW9uJykgZXh0cmFjdEV2ZW50UHJvcHNbcHJvcF0gPSBwcm9wZXJ0eTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHJheWNhc3RFdmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4gPSB7XG5cdFx0XHRcdFx0Li4uaGl0LFxuXHRcdFx0XHRcdC4uLmV4dHJhY3RFdmVudFByb3BzLFxuXHRcdFx0XHRcdHBvaW50ZXIsXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9ucyxcblx0XHRcdFx0XHRzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG5cdFx0XHRcdFx0ZGVsdGEsXG5cdFx0XHRcdFx0dW5wcm9qZWN0ZWRQb2ludCxcblx0XHRcdFx0XHRyYXk6IHJheWNhc3Rlci5yYXksXG5cdFx0XHRcdFx0Y2FtZXJhLFxuXHRcdFx0XHRcdC8vIEhpamFjayBzdG9wUHJvcGFnYXRpb24sIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWdcblx0XHRcdFx0XHRzdG9wUHJvcGFnYXRpb24oKSB7XG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3JlYWN0LXRocmVlLWZpYmVyL2lzc3Vlcy81OTZcblx0XHRcdFx0XHRcdC8vIEV2ZW50cyBhcmUgbm90IGFsbG93ZWQgdG8gc3RvcCBwcm9wYWdhdGlvbiBpZiB0aGUgcG9pbnRlciBoYXMgYmVlbiBjYXB0dXJlZFxuXHRcdFx0XHRcdFx0Y29uc3QgY2FwdHVyZXNGb3JQb2ludGVyID0gJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIG9ubHkgYXV0aG9yaXplIHN0b3BQcm9wYWdhdGlvbi4uLlxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pZiB0aGlzIHBvaW50ZXIgaGFzbid0IGJlZW4gY2FwdHVyZWRcblx0XHRcdFx0XHRcdFx0IWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuXHRcdFx0XHRcdFx0XHQvLyAuLi4gb3IgaWYgdGhlIGhpdCBvYmplY3QgaXMgY2FwdHVyaW5nIHRoZSBwb2ludGVyXG5cdFx0XHRcdFx0XHRcdGNhcHR1cmVzRm9yUG9pbnRlci5oYXMoaGl0LmV2ZW50T2JqZWN0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGFnYXRpb24gaXMgc3RvcHBlZCwgcmVtb3ZlIGFsbCBvdGhlciBob3ZlciByZWNvcmRzXG5cdFx0XHRcdFx0XHRcdC8vIEFuIGV2ZW50IGhhbmRsZXIgaXMgb25seSBhbGxvd2VkIHRvIGZsdXNoIG90aGVyIGhhbmRsZXJzIGlmIGl0IGlzIGhvdmVyZWQgaXRzZWxmXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLnNpemUgJiZcblx0XHRcdFx0XHRcdFx0XHRBcnJheS5mcm9tKGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpLmZpbmQoKGkpID0+IGkuZXZlbnRPYmplY3QgPT09IGhpdC5ldmVudE9iamVjdClcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT2JqZWN0cyBjYW5ub3QgZmx1c2ggb3V0IGhpZ2hlciB1cCBvYmplY3RzIHRoYXQgaGF2ZSBhbHJlYWR5IGNhdWdodCB0aGUgZXZlbnRcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcblx0XHRcdFx0XHRcdFx0XHRjYW5jZWxQb2ludGVyKFsuLi5oaWdoZXIsIGhpdF0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvLyB0aGVyZSBzaG91bGQgYmUgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgY3VycmVudFRhcmdldFxuXHRcdFx0XHRcdHRhcmdldDogeyBoYXNQb2ludGVyQ2FwdHVyZSwgc2V0UG9pbnRlckNhcHR1cmUsIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSB9LFxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQ6IHsgaGFzUG9pbnRlckNhcHR1cmUsIHNldFBvaW50ZXJDYXB0dXJlLCByZWxlYXNlUG9pbnRlckNhcHR1cmUgfSxcblx0XHRcdFx0XHRuYXRpdmVFdmVudDogZXZlbnQsXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ2FsbCBzdWJzY3JpYmVyc1xuXHRcdFx0XHRjYWxsYmFjayhyYXljYXN0RXZlbnQpO1xuXHRcdFx0XHQvLyBFdmVudCBidWJibGluZyBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG5cdFx0XHRcdGlmIChsb2NhbFN0YXRlLnN0b3BwZWQpIGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW50ZXJzZWN0aW9ucztcblx0fVxuXG5cdGZ1bmN0aW9uIGNhbmNlbFBvaW50ZXIoaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10pIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRmb3IgKGNvbnN0IGhvdmVyZWRPYmogb2YgaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkge1xuXHRcdFx0Ly8gV2hlbiBubyBvYmplY3RzIHdlcmUgaGl0IG9yIHRoZSB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuXHRcdFx0Ly8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpbnRlcnNlY3Rpb25zLmxlbmd0aCB8fFxuXHRcdFx0XHQhaW50ZXJzZWN0aW9ucy5maW5kKFxuXHRcdFx0XHRcdChoaXQpID0+XG5cdFx0XHRcdFx0XHRoaXQub2JqZWN0ID09PSBob3ZlcmVkT2JqLm9iamVjdCAmJlxuXHRcdFx0XHRcdFx0aGl0LmluZGV4ID09PSBob3ZlcmVkT2JqLmluZGV4ICYmXG5cdFx0XHRcdFx0XHRoaXQuaW5zdGFuY2VJZCA9PT0gaG92ZXJlZE9iai5pbnN0YW5jZUlkLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRPYmplY3QgPSBob3ZlcmVkT2JqLmV2ZW50T2JqZWN0O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcblx0XHRcdFx0aW50ZXJuYWwuaG92ZXJlZC5kZWxldGUobWFrZUlkKGhvdmVyZWRPYmopKTtcblx0XHRcdFx0aWYgKGluc3RhbmNlPy5ldmVudENvdW50KSB7XG5cdFx0XHRcdFx0Ly8gQ2xlYXIgb3V0IGludGVyc2VjdHMsIHRoZXkgYXJlIG91dGRhdGVkIGJ5IG5vd1xuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB7IC4uLmhvdmVyZWRPYmosIGludGVyc2VjdGlvbnMgfTtcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcm91dD8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcmxlYXZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcG9pbnRlck1pc3NlZChldmVudDogTW91c2VFdmVudCwgb2JqZWN0czogT2JqZWN0M0RbXSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBnZXRMb2NhbFN0YXRlKG9iamVjdHNbaV0pO1xuXHRcdFx0aW5zdGFuY2U/LmhhbmRsZXJzLnBvaW50ZXJtaXNzZWQ/LihldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gaGFuZGxlUG9pbnRlcihuYW1lOiBzdHJpbmcpIHtcblx0XHQvLyBEZWFsIHdpdGggY2FuY2VsYXRpb25cblx0XHRzd2l0Y2ggKG5hbWUpIHtcblx0XHRcdGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG5cdFx0XHRjYXNlICdwb2ludGVyY2FuY2VsJzpcblx0XHRcdFx0cmV0dXJuICgpID0+IGNhbmNlbFBvaW50ZXIoW10pO1xuXHRcdFx0Y2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcblx0XHRcdFx0cmV0dXJuIChldmVudDogTmd0RG9tRXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3QgZXZlbnQgaW50ZXJmYWNlIGhhZCBsb3N0cG9pbnRlcmNhcHR1cmUsIHdlJ2QgY2FsbCBpdCBoZXJlIG9uIGV2ZXJ5XG5cdFx0XHRcdFx0XHQvLyBvYmplY3QgdGhhdCdzIGdldHRpbmcgcmVtb3ZlZC4gV2UgY2FsbCBpdCBvbiB0aGUgbmV4dCBmcmFtZSBiZWNhdXNlIGxvc3Rwb2ludGVyY2FwdHVyZVxuXHRcdFx0XHRcdFx0Ly8gZmlyZXMgYmVmb3JlIHBvaW50ZXJ1cC4gT3RoZXJ3aXNlIHBvaW50ZXJVcCB3b3VsZCBuZXZlciBiZSBjYWxsZWQgaWYgdGhlIGV2ZW50IGRpZG4ndFxuXHRcdFx0XHRcdFx0Ly8gaGFwcGVuIGluIHRoZSBvYmplY3QgaXQgb3JpZ2luYXRlZCBmcm9tLCBsZWF2aW5nIGNvbXBvbmVudHMgaW4gYSBpbi1iZXR3ZWVuIHN0YXRlLlxuXHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gT25seSByZWxlYXNlIGlmIHBvaW50ZXItdXAgZGlkbid0IGRvIGl0IGFscmVhZHlcblx0XHRcdFx0XHRcdFx0aWYgKGludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuY2FwdHVyZWRNYXAuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG5cdFx0XHRcdFx0XHRcdFx0Y2FuY2VsUG9pbnRlcihbXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBBbnkgb3RoZXIgcG9pbnRlciBnb2VzIGhlcmUgLi4uXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50OiBOZ3REb21FdmVudCkge1xuXHRcdFx0Ly8gTk9URTogcG9pbnRlck1pc3NlZCQgb24gTmd0U3RvcmUgaXMgcHJpdmF0ZVxuXHRcdFx0Y29uc3QgcG9pbnRlck1pc3NlZCQ6IFN1YmplY3Q8TW91c2VFdmVudD4gPSAoc3RvcmUgYXMgTmd0QW55UmVjb3JkKVsncG9pbnRlck1pc3NlZCQnXTtcblx0XHRcdGNvbnN0IGludGVybmFsID0gc3RvcmUuZ2V0KCdpbnRlcm5hbCcpO1xuXG5cdFx0XHQvLyBwcmVwYXJlUmF5KGV2ZW50KVxuXHRcdFx0aW50ZXJuYWwubGFzdEV2ZW50Lm5hdGl2ZUVsZW1lbnQgPSBldmVudDtcblxuXHRcdFx0Ly8gR2V0IGZyZXNoIGludGVyc2VjdHNcblx0XHRcdGNvbnN0IGlzUG9pbnRlck1vdmUgPSBuYW1lID09PSAncG9pbnRlcm1vdmUnO1xuXHRcdFx0Y29uc3QgaXNDbGlja0V2ZW50ID0gbmFtZSA9PT0gJ2NsaWNrJyB8fCBuYW1lID09PSAnY29udGV4dG1lbnUnIHx8IG5hbWUgPT09ICdkYmxjbGljayc7XG5cdFx0XHRjb25zdCBmaWx0ZXIgPSBpc1BvaW50ZXJNb3ZlID8gZmlsdGVyUG9pbnRlckV2ZW50cyA6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3QgaGl0cyA9IGludGVyc2VjdChldmVudCwgZmlsdGVyKTtcblx0XHRcdGNvbnN0IGRlbHRhID0gaXNDbGlja0V2ZW50ID8gY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpIDogMDtcblxuXHRcdFx0Ly8gU2F2ZSBpbml0aWFsIGNvb3JkaW5hdGVzIG9uIHBvaW50ZXItZG93blxuXHRcdFx0aWYgKG5hbWUgPT09ICdwb2ludGVyZG93bicpIHtcblx0XHRcdFx0aW50ZXJuYWwuaW5pdGlhbENsaWNrID0gW2V2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFldO1xuXHRcdFx0XHRpbnRlcm5hbC5pbml0aWFsSGl0cyA9IGhpdHMubWFwKChoaXQpID0+IGhpdC5ldmVudE9iamVjdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgY2xpY2sgeWllbGRzIG5vIHJlc3VsdHMsIHBhc3MgaXQgYmFjayB0byB0aGUgdXNlciBhcyBhIG1pc3Ncblx0XHRcdC8vIE1pc3NlZCBldmVudHMgaGF2ZSB0byBjb21lIGZpcnN0IGluIG9yZGVyIHRvIGVzdGFibGlzaCB1c2VyLWxhbmQgc2lkZS1lZmZlY3QgY2xlYW4gdXBcblx0XHRcdGlmIChpc0NsaWNrRXZlbnQgJiYgIWhpdHMubGVuZ3RoKSB7XG5cdFx0XHRcdGlmIChkZWx0YSA8PSAyKSB7XG5cdFx0XHRcdFx0cG9pbnRlck1pc3NlZChldmVudCwgaW50ZXJuYWwuaW50ZXJhY3Rpb24pO1xuXHRcdFx0XHRcdHBvaW50ZXJNaXNzZWQkLm5leHQoZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgY2FyZSBvZiB1bmhvdmVyXG5cdFx0XHRpZiAoaXNQb2ludGVyTW92ZSkgY2FuY2VsUG9pbnRlcihoaXRzKTtcblxuXHRcdFx0ZnVuY3Rpb24gb25JbnRlcnNlY3QoZGF0YTogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRPYmplY3QgPSBkYXRhLmV2ZW50T2JqZWN0O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcblxuXHRcdFx0XHQvLyBDaGVjayBwcmVzZW5jZSBvZiBoYW5kbGVyc1xuXHRcdFx0XHRpZiAoIWluc3RhbmNlPy5ldmVudENvdW50KSByZXR1cm47XG5cblx0XHRcdFx0LypcbiAgICAgICAgTUFZQkUgVE9ETywgREVMRVRFIElGIE5PVDpcbiAgICAgICAgICBDaGVjayBpZiB0aGUgb2JqZWN0IGlzIGNhcHR1cmVkLCBjYXB0dXJlZCBldmVudHMgc2hvdWxkIG5vdCBoYXZlIGludGVyc2VjdHMgcnVubmluZyBpbiBwYXJhbGxlbFxuICAgICAgICAgIEJ1dCB3b3VsZG4ndCBpdCBiZSBiZXR0ZXIgdG8ganVzdCByZXBsYWNlIGNhcHR1cmVkTWFwIHdpdGggYSBzaW5nbGUgZW50cnk/XG4gICAgICAgICAgQWxzbywgYXJlIHdlIE9LIHdpdGggc3RyYWlnaHQgdXAgbWFraW5nIHBpY2tpbmcgdXAgbXVsdGlwbGUgb2JqZWN0cyBpbXBvc3NpYmxlP1xuXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IChkYXRhIGFzIFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikucG9pbnRlcklkXG4gICAgICAgIGlmIChwb2ludGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGNhcHR1cmVkTWVzaFNldCA9IGludGVybmFsLmNhcHR1cmVkTWFwLmdldChwb2ludGVySWQpXG4gICAgICAgICAgaWYgKGNhcHR1cmVkTWVzaFNldCkge1xuICAgICAgICAgICAgY29uc3QgY2FwdHVyZWQgPSBjYXB0dXJlZE1lc2hTZXQuZ2V0KGV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgaWYgKGNhcHR1cmVkICYmIGNhcHR1cmVkLmxvY2FsU3RhdGUuc3RvcHBlZCkgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9Ki9cblxuXHRcdFx0XHRpZiAoaXNQb2ludGVyTW92ZSkge1xuXHRcdFx0XHRcdC8vIE1vdmUgZXZlbnQgLi4uXG5cdFx0XHRcdFx0aWYgKGhhbmRsZXJzPy5wb2ludGVyb3ZlciB8fCBoYW5kbGVycz8ucG9pbnRlcmVudGVyIHx8IGhhbmRsZXJzPy5wb2ludGVyb3V0IHx8IGhhbmRsZXJzPy5wb2ludGVybGVhdmUpIHtcblx0XHRcdFx0XHRcdC8vIFdoZW4gZW50ZXIgb3Igb3V0IGlzIHByZXNlbnQgdGFrZSBjYXJlIG9mIGhvdmVyLXN0YXRlXG5cdFx0XHRcdFx0XHRjb25zdCBpZCA9IG1ha2VJZChkYXRhKTtcblx0XHRcdFx0XHRcdGNvbnN0IGhvdmVyZWRJdGVtID0gaW50ZXJuYWwuaG92ZXJlZC5nZXQoaWQpO1xuXHRcdFx0XHRcdFx0aWYgKCFob3ZlcmVkSXRlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgb2JqZWN0IHdhc24ndCBwcmV2aW91c2x5IGhvdmVyZWQsIGJvb2sgaXQgYW5kIGNhbGwgaXRzIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuaG92ZXJlZC5zZXQoaWQsIGRhdGEpO1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVycy5wb2ludGVyb3Zlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRcdFx0aGFuZGxlcnMucG9pbnRlcmVudGVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChob3ZlcmVkSXRlbS5zdG9wcGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3Qgd2FzIHByZXZpb3VzbHkgaG92ZXJlZCBhbmQgc3RvcHBlZCwgd2Ugc2hvdWxkbid0IGFsbG93IG90aGVyIGl0ZW1zIHRvIHByb2NlZWRcblx0XHRcdFx0XHRcdFx0ZGF0YS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2FsbCBtb3VzZSBtb3ZlXG5cdFx0XHRcdFx0aGFuZGxlcnM/LnBvaW50ZXJtb3ZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFsbCBvdGhlciBldmVudHMgLi4uXG5cdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGhhbmRsZXJzPy5bbmFtZSBhcyBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzXSBhcyAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikgPT4gdm9pZDtcblx0XHRcdFx0XHRpZiAoaGFuZGxlcikge1xuXHRcdFx0XHRcdFx0Ly8gRm9yd2FyZCBhbGwgZXZlbnRzIGJhY2sgdG8gdGhlaXIgcmVzcGVjdGl2ZSBoYW5kbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgY2xpY2sgZXZlbnRzLFxuXHRcdFx0XHRcdFx0Ly8gd2hpY2ggbXVzdCB1c2UgdGhlIGluaXRpYWwgdGFyZ2V0XG5cdFx0XHRcdFx0XHRpZiAoIWlzQ2xpY2tFdmVudCB8fCBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3Rcblx0XHRcdFx0XHRcdFx0cG9pbnRlck1pc3NlZChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHQvLyBOb3cgY2FsbCB0aGUgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRoYW5kbGVyKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVHJpZ2dlciBvblBvaW50ZXJNaXNzZWQgb24gYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBwb2ludGVyIG92ZXIvb3V0IGhhbmRsZXJzLCBidXQgbm90IGNsaWNrIGFuZCB3ZXJlbid0IGhpdFxuXHRcdFx0XHRcdFx0aWYgKGlzQ2xpY2tFdmVudCAmJiBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0cG9pbnRlck1pc3NlZChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVJbnRlcnNlY3RzKGhpdHMsIGV2ZW50LCBkZWx0YSwgb25JbnRlcnNlY3QpO1xuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4geyBoYW5kbGVQb2ludGVyIH07XG59XG4iXX0=