angular-three 0.0.7 → 1.0.0-beta.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/esm2020/angular-three.mjs +1 -1
- package/esm2020/index.mjs +2 -35
- package/esm2020/lib/canvas.mjs +141 -128
- package/esm2020/lib/di/catalogue.mjs +7 -0
- package/esm2020/lib/directives/args.mjs +37 -17
- package/esm2020/lib/directives/repeat.mjs +5 -8
- package/esm2020/lib/events.mjs +341 -52
- package/esm2020/lib/loader.mjs +55 -0
- package/esm2020/lib/loop.mjs +137 -0
- package/esm2020/lib/renderer/di.mjs +3 -0
- package/esm2020/lib/renderer/enums.mjs +2 -0
- package/esm2020/lib/renderer/provider.mjs +19 -0
- package/esm2020/lib/renderer/renderer.mjs +293 -0
- package/esm2020/lib/renderer/state.mjs +350 -0
- package/esm2020/lib/renderer/utils.mjs +177 -0
- package/esm2020/lib/stores/rx-store.mjs +99 -0
- package/esm2020/lib/stores/store.mjs +190 -239
- package/esm2020/lib/types.mjs +1 -1
- package/esm2020/lib/utils/apply-props.mjs +37 -80
- package/esm2020/lib/utils/attach.mjs +29 -0
- package/esm2020/lib/utils/instance.mjs +43 -28
- package/esm2020/lib/utils/is.mjs +7 -11
- package/esm2020/lib/utils/make.mjs +30 -10
- package/esm2020/lib/utils/update.mjs +37 -0
- package/esm2020/lib/web/events.mjs +68 -0
- package/fesm2015/angular-three.mjs +2053 -2046
- package/fesm2015/angular-three.mjs.map +1 -1
- package/fesm2020/angular-three.mjs +2003 -1990
- package/fesm2020/angular-three.mjs.map +1 -1
- package/index.d.ts +1 -34
- package/lib/canvas.d.ts +29 -28
- package/lib/di/catalogue.d.ts +3 -0
- package/lib/directives/args.d.ts +8 -12
- package/lib/events.d.ts +7 -2
- package/lib/loader.d.ts +15 -0
- package/lib/{utils/loop.d.ts → loop.d.ts} +7 -6
- package/lib/renderer/di.d.ts +2 -0
- package/lib/renderer/enums.d.ts +25 -0
- package/lib/renderer/provider.d.ts +25 -0
- package/lib/renderer/renderer.d.ts +49 -0
- package/lib/renderer/state.d.ts +59 -0
- package/lib/renderer/utils.d.ts +20 -0
- package/lib/stores/rx-store.d.ts +17 -0
- package/lib/stores/store.d.ts +6 -23
- package/lib/types.d.ts +182 -191
- package/lib/utils/apply-props.d.ts +2 -6
- package/lib/utils/attach.d.ts +3 -0
- package/lib/utils/instance.d.ts +3 -3
- package/lib/utils/is.d.ts +6 -10
- package/lib/utils/make.d.ts +5 -2
- package/lib/utils/update.d.ts +4 -0
- package/lib/web/events.d.ts +4 -0
- package/package.json +30 -99
- package/attributes/README.md +0 -3
- package/attributes/index.d.ts +0 -22
- package/attributes/lib/buffer-attribute/buffer-attribute.d.ts +0 -8
- package/attributes/lib/color-attribute/color-attribute.d.ts +0 -8
- package/attributes/lib/common.d.ts +0 -1
- package/attributes/lib/float16-buffer-attribute/float16-buffer-attribute.d.ts +0 -8
- package/attributes/lib/float32-buffer-attribute/float32-buffer-attribute.d.ts +0 -8
- package/attributes/lib/float64-buffer-attribute/float64-buffer-attribute.d.ts +0 -8
- package/attributes/lib/fog-attribute/fog-attribute.d.ts +0 -8
- package/attributes/lib/fog-exp2-attribute/fog-exp2-attribute.d.ts +0 -8
- package/attributes/lib/instanced-buffer-attribute/instanced-buffer-attribute.d.ts +0 -8
- package/attributes/lib/int16-buffer-attribute/int16-buffer-attribute.d.ts +0 -8
- package/attributes/lib/int32-buffer-attribute/int32-buffer-attribute.d.ts +0 -8
- package/attributes/lib/int8-buffer-attribute/int8-buffer-attribute.d.ts +0 -8
- package/attributes/lib/interleaved-buffer-attribute/interleaved-buffer-attribute.d.ts +0 -8
- package/attributes/lib/matrix3-attribute/matrix3-attribute.d.ts +0 -8
- package/attributes/lib/matrix4-attribute/matrix4-attribute.d.ts +0 -8
- package/attributes/lib/uint16-buffer-attribute/uint16-buffer-attribute.d.ts +0 -8
- package/attributes/lib/uint32-buffer-attribute/uint32-buffer-attribute.d.ts +0 -8
- package/attributes/lib/uint8-buffer-attribute/uint8-buffer-attribute.d.ts +0 -8
- package/attributes/lib/uint8-clamped-buffer-attribute/uint8-clamped-buffer-attribute.d.ts +0 -8
- package/attributes/lib/value-attribute/value-attribute.d.ts +0 -8
- package/attributes/lib/vector2-attribute/vector2-attribute.d.ts +0 -8
- package/attributes/lib/vector3-attribute/vector3-attribute.d.ts +0 -8
- package/attributes/lib/vector4-attribute/vector4-attribute.d.ts +0 -8
- package/audios/README.md +0 -3
- package/audios/index.d.ts +0 -3
- package/audios/lib/audio/audio.d.ts +0 -49
- package/audios/lib/audio-listener/audio-listener.d.ts +0 -35
- package/audios/lib/common.d.ts +0 -3
- package/audios/lib/positional-audio/positional-audio.d.ts +0 -49
- package/cameras/README.md +0 -3
- package/cameras/index.d.ts +0 -5
- package/cameras/lib/array-camera/array-camera.d.ts +0 -56
- package/cameras/lib/common.d.ts +0 -3
- package/cameras/lib/cube-camera/cube-camera.d.ts +0 -36
- package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +0 -54
- package/cameras/lib/perspective-camera/perspective-camera.d.ts +0 -55
- package/cameras/lib/stereo-camera/stereo-camera.d.ts +0 -42
- package/esm2020/attributes/angular-three-attributes.mjs +0 -5
- package/esm2020/attributes/index.mjs +0 -24
- package/esm2020/attributes/lib/buffer-attribute/buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/color-attribute/color-attribute.mjs +0 -26
- package/esm2020/attributes/lib/common.mjs +0 -13
- package/esm2020/attributes/lib/float16-buffer-attribute/float16-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/float32-buffer-attribute/float32-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/float64-buffer-attribute/float64-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/fog-attribute/fog-attribute.mjs +0 -26
- package/esm2020/attributes/lib/fog-exp2-attribute/fog-exp2-attribute.mjs +0 -26
- package/esm2020/attributes/lib/instanced-buffer-attribute/instanced-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/int16-buffer-attribute/int16-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/int32-buffer-attribute/int32-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/int8-buffer-attribute/int8-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/interleaved-buffer-attribute/interleaved-buffer-attribute.mjs +0 -30
- package/esm2020/attributes/lib/matrix3-attribute/matrix3-attribute.mjs +0 -26
- package/esm2020/attributes/lib/matrix4-attribute/matrix4-attribute.mjs +0 -26
- package/esm2020/attributes/lib/uint16-buffer-attribute/uint16-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/uint32-buffer-attribute/uint32-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/uint8-buffer-attribute/uint8-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/uint8-clamped-buffer-attribute/uint8-clamped-buffer-attribute.mjs +0 -26
- package/esm2020/attributes/lib/value-attribute/value-attribute.mjs +0 -28
- package/esm2020/attributes/lib/vector2-attribute/vector2-attribute.mjs +0 -26
- package/esm2020/attributes/lib/vector3-attribute/vector3-attribute.mjs +0 -26
- package/esm2020/attributes/lib/vector4-attribute/vector4-attribute.mjs +0 -26
- package/esm2020/audios/angular-three-audios.mjs +0 -5
- package/esm2020/audios/index.mjs +0 -5
- package/esm2020/audios/lib/audio/audio.mjs +0 -45
- package/esm2020/audios/lib/audio-listener/audio-listener.mjs +0 -38
- package/esm2020/audios/lib/common.mjs +0 -54
- package/esm2020/audios/lib/positional-audio/positional-audio.mjs +0 -45
- package/esm2020/cameras/angular-three-cameras.mjs +0 -5
- package/esm2020/cameras/index.mjs +0 -7
- package/esm2020/cameras/lib/array-camera/array-camera.mjs +0 -44
- package/esm2020/cameras/lib/common.mjs +0 -54
- package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +0 -30
- package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -42
- package/esm2020/cameras/lib/perspective-camera/perspective-camera.mjs +0 -43
- package/esm2020/cameras/lib/stereo-camera/stereo-camera.mjs +0 -38
- package/esm2020/geometries/angular-three-geometries.mjs +0 -5
- package/esm2020/geometries/index.mjs +0 -25
- package/esm2020/geometries/lib/box-geometry/box-geometry.mjs +0 -26
- package/esm2020/geometries/lib/buffer-geometry/buffer-geometry.mjs +0 -26
- package/esm2020/geometries/lib/capsule-geometry/capsule-geometry.mjs +0 -26
- package/esm2020/geometries/lib/circle-geometry/circle-geometry.mjs +0 -26
- package/esm2020/geometries/lib/common.mjs +0 -13
- package/esm2020/geometries/lib/cone-geometry/cone-geometry.mjs +0 -26
- package/esm2020/geometries/lib/cylinder-geometry/cylinder-geometry.mjs +0 -26
- package/esm2020/geometries/lib/dodecahedron-geometry/dodecahedron-geometry.mjs +0 -26
- package/esm2020/geometries/lib/edges-geometry/edges-geometry.mjs +0 -26
- package/esm2020/geometries/lib/extrude-geometry/extrude-geometry.mjs +0 -26
- package/esm2020/geometries/lib/icosahedron-geometry/icosahedron-geometry.mjs +0 -26
- package/esm2020/geometries/lib/instanced-buffer-geometry/instanced-buffer-geometry.mjs +0 -26
- package/esm2020/geometries/lib/lathe-geometry/lathe-geometry.mjs +0 -26
- package/esm2020/geometries/lib/octahedron-geometry/octahedron-geometry.mjs +0 -26
- package/esm2020/geometries/lib/plane-geometry/plane-geometry.mjs +0 -26
- package/esm2020/geometries/lib/polyhedron-geometry/polyhedron-geometry.mjs +0 -26
- package/esm2020/geometries/lib/ring-geometry/ring-geometry.mjs +0 -26
- package/esm2020/geometries/lib/shape-geometry/shape-geometry.mjs +0 -26
- package/esm2020/geometries/lib/sphere-geometry/sphere-geometry.mjs +0 -26
- package/esm2020/geometries/lib/tetrahedron-geometry/tetrahedron-geometry.mjs +0 -26
- package/esm2020/geometries/lib/torus-geometry/torus-geometry.mjs +0 -26
- package/esm2020/geometries/lib/torus-knot-geometry/torus-knot-geometry.mjs +0 -26
- package/esm2020/geometries/lib/tube-geometry/tube-geometry.mjs +0 -26
- package/esm2020/geometries/lib/wireframe-geometry/wireframe-geometry.mjs +0 -26
- package/esm2020/helpers/angular-three-helpers.mjs +0 -5
- package/esm2020/helpers/index.mjs +0 -15
- package/esm2020/helpers/lib/arrow-helper/arrow-helper.mjs +0 -26
- package/esm2020/helpers/lib/axes-helper/axes-helper.mjs +0 -26
- package/esm2020/helpers/lib/box-helper/box-helper.mjs +0 -36
- package/esm2020/helpers/lib/box3-helper/box3-helper.mjs +0 -36
- package/esm2020/helpers/lib/camera-helper/camera-helper.mjs +0 -36
- package/esm2020/helpers/lib/common.mjs +0 -13
- package/esm2020/helpers/lib/directional-light-helper/directional-light-helper.mjs +0 -36
- package/esm2020/helpers/lib/grid-helper/grid-helper.mjs +0 -26
- package/esm2020/helpers/lib/hemisphere-light-helper/hemisphere-light-helper.mjs +0 -36
- package/esm2020/helpers/lib/plane-helper/plane-helper.mjs +0 -36
- package/esm2020/helpers/lib/point-light-helper/point-light-helper.mjs +0 -36
- package/esm2020/helpers/lib/polar-grid-helper/polar-grid-helper.mjs +0 -26
- package/esm2020/helpers/lib/skeleton-helper/skeleton-helper.mjs +0 -36
- package/esm2020/helpers/lib/spot-light-helper/spot-light-helper.mjs +0 -36
- package/esm2020/lib/di/resize.mjs +0 -19
- package/esm2020/lib/di/window.mjs +0 -13
- package/esm2020/lib/directives/cursor.mjs +0 -35
- package/esm2020/lib/instance.mjs +0 -368
- package/esm2020/lib/pipes/math.mjs +0 -15
- package/esm2020/lib/pipes/pi.mjs +0 -14
- package/esm2020/lib/pipes/radian.mjs +0 -14
- package/esm2020/lib/pipes/side.mjs +0 -22
- package/esm2020/lib/ref.mjs +0 -15
- package/esm2020/lib/services/loader.mjs +0 -45
- package/esm2020/lib/services/resize.mjs +0 -127
- package/esm2020/lib/stores/component-store.mjs +0 -137
- package/esm2020/lib/utils/build-graph.mjs +0 -15
- package/esm2020/lib/utils/camera.mjs +0 -28
- package/esm2020/lib/utils/capitalize.mjs +0 -4
- package/esm2020/lib/utils/check-update.mjs +0 -22
- package/esm2020/lib/utils/events.mjs +0 -353
- package/esm2020/lib/utils/get-instance-local-state.mjs +0 -6
- package/esm2020/lib/utils/inject.mjs +0 -18
- package/esm2020/lib/utils/loop.mjs +0 -139
- package/esm2020/lib/utils/mutate.mjs +0 -24
- package/esm2020/lib/utils/proxy.mjs +0 -99
- package/esm2020/lib/utils/renderer.mjs +0 -15
- package/esm2020/lights/angular-three-lights.mjs +0 -5
- package/esm2020/lights/index.mjs +0 -11
- package/esm2020/lights/lib/ambient-light/ambient-light.mjs +0 -30
- package/esm2020/lights/lib/ambient-light-probe/ambient-light-probe.mjs +0 -30
- package/esm2020/lights/lib/common.mjs +0 -54
- package/esm2020/lights/lib/directional-light/directional-light.mjs +0 -30
- package/esm2020/lights/lib/hemisphere-light/hemisphere-light.mjs +0 -30
- package/esm2020/lights/lib/hemisphere-light-probe/hemisphere-light-probe.mjs +0 -30
- package/esm2020/lights/lib/light-probe/light-probe.mjs +0 -30
- package/esm2020/lights/lib/point-light/point-light.mjs +0 -30
- package/esm2020/lights/lib/rect-area-light/rect-area-light.mjs +0 -30
- package/esm2020/lights/lib/spot-light/spot-light.mjs +0 -42
- package/esm2020/materials/angular-three-materials.mjs +0 -5
- package/esm2020/materials/index.mjs +0 -19
- package/esm2020/materials/lib/common.mjs +0 -13
- package/esm2020/materials/lib/line-basic-material/line-basic-material.mjs +0 -77
- package/esm2020/materials/lib/line-dashed-material/line-dashed-material.mjs +0 -80
- package/esm2020/materials/lib/mesh-basic-material/mesh-basic-material.mjs +0 -89
- package/esm2020/materials/lib/mesh-depth-material/mesh-depth-material.mjs +0 -80
- package/esm2020/materials/lib/mesh-distance-material/mesh-distance-material.mjs +0 -80
- package/esm2020/materials/lib/mesh-lambert-material/mesh-lambert-material.mjs +0 -100
- package/esm2020/materials/lib/mesh-matcap-material/mesh-matcap-material.mjs +0 -86
- package/esm2020/materials/lib/mesh-normal-material/mesh-normal-material.mjs +0 -83
- package/esm2020/materials/lib/mesh-phong-material/mesh-phong-material.mjs +0 -103
- package/esm2020/materials/lib/mesh-physical-material/mesh-physical-material.mjs +0 -119
- package/esm2020/materials/lib/mesh-standard-material/mesh-standard-material.mjs +0 -100
- package/esm2020/materials/lib/mesh-toon-material/mesh-toon-material.mjs +0 -96
- package/esm2020/materials/lib/points-material/points-material.mjs +0 -78
- package/esm2020/materials/lib/raw-shader-material/raw-shader-material.mjs +0 -83
- package/esm2020/materials/lib/shader-material/shader-material.mjs +0 -83
- package/esm2020/materials/lib/shadow-material/shadow-material.mjs +0 -74
- package/esm2020/materials/lib/sprite-material/sprite-material.mjs +0 -78
- package/esm2020/objects/angular-three-objects.mjs +0 -5
- package/esm2020/objects/index.mjs +0 -14
- package/esm2020/objects/lib/bone/bone.mjs +0 -27
- package/esm2020/objects/lib/common.mjs +0 -54
- package/esm2020/objects/lib/group/group.mjs +0 -27
- package/esm2020/objects/lib/instanced-mesh/instanced-mesh.mjs +0 -40
- package/esm2020/objects/lib/line/line.mjs +0 -30
- package/esm2020/objects/lib/line-loop/line-loop.mjs +0 -30
- package/esm2020/objects/lib/line-segments/line-segments.mjs +0 -30
- package/esm2020/objects/lib/lod/lod.mjs +0 -30
- package/esm2020/objects/lib/mesh/mesh.mjs +0 -30
- package/esm2020/objects/lib/points/points.mjs +0 -30
- package/esm2020/objects/lib/skeleton/skeleton.mjs +0 -41
- package/esm2020/objects/lib/skinned-mesh/skinned-mesh.mjs +0 -39
- package/esm2020/objects/lib/sprite/sprite.mjs +0 -30
- package/esm2020/primitives/angular-three-primitives.mjs +0 -5
- package/esm2020/primitives/index.mjs +0 -3
- package/esm2020/primitives/lib/common.mjs +0 -54
- package/esm2020/primitives/lib/object-primitive/object-primitive.mjs +0 -27
- package/esm2020/primitives/lib/primitive/primitive.mjs +0 -38
- package/esm2020/stats/angular-three-stats.mjs +0 -5
- package/esm2020/stats/index.mjs +0 -2
- package/esm2020/stats/lib/stats/stats.mjs +0 -54
- package/esm2020/textures/angular-three-textures.mjs +0 -5
- package/esm2020/textures/index.mjs +0 -12
- package/esm2020/textures/lib/canvas-texture/canvas-texture.mjs +0 -26
- package/esm2020/textures/lib/common.mjs +0 -13
- package/esm2020/textures/lib/compressed-array-texture/compressed-array-texture.mjs +0 -26
- package/esm2020/textures/lib/compressed-texture/compressed-texture.mjs +0 -26
- package/esm2020/textures/lib/cube-texture/cube-texture.mjs +0 -26
- package/esm2020/textures/lib/data-array-texture/data-array-texture.mjs +0 -26
- package/esm2020/textures/lib/data-texture/data-texture.mjs +0 -26
- package/esm2020/textures/lib/data3-dtexture/data3-dtexture.mjs +0 -26
- package/esm2020/textures/lib/depth-texture/depth-texture.mjs +0 -26
- package/esm2020/textures/lib/framebuffer-texture/framebuffer-texture.mjs +0 -26
- package/esm2020/textures/lib/video-texture/video-texture.mjs +0 -26
- package/fesm2015/angular-three-attributes.mjs +0 -475
- package/fesm2015/angular-three-attributes.mjs.map +0 -1
- package/fesm2015/angular-three-audios.mjs +0 -179
- package/fesm2015/angular-three-audios.mjs.map +0 -1
- package/fesm2015/angular-three-cameras.mjs +0 -236
- package/fesm2015/angular-three-cameras.mjs.map +0 -1
- package/fesm2015/angular-three-geometries.mjs +0 -488
- package/fesm2015/angular-three-geometries.mjs.map +0 -1
- package/fesm2015/angular-three-helpers.mjs +0 -378
- package/fesm2015/angular-three-helpers.mjs.map +0 -1
- package/fesm2015/angular-three-lights.mjs +0 -297
- package/fesm2015/angular-three-lights.mjs.map +0 -1
- package/fesm2015/angular-three-materials.mjs +0 -1415
- package/fesm2015/angular-three-materials.mjs.map +0 -1
- package/fesm2015/angular-three-objects.mjs +0 -381
- package/fesm2015/angular-three-objects.mjs.map +0 -1
- package/fesm2015/angular-three-primitives.mjs +0 -120
- package/fesm2015/angular-three-primitives.mjs.map +0 -1
- package/fesm2015/angular-three-stats.mjs +0 -62
- package/fesm2015/angular-three-stats.mjs.map +0 -1
- package/fesm2015/angular-three-textures.mjs +0 -228
- package/fesm2015/angular-three-textures.mjs.map +0 -1
- package/fesm2020/angular-three-attributes.mjs +0 -475
- package/fesm2020/angular-three-attributes.mjs.map +0 -1
- package/fesm2020/angular-three-audios.mjs +0 -179
- package/fesm2020/angular-three-audios.mjs.map +0 -1
- package/fesm2020/angular-three-cameras.mjs +0 -236
- package/fesm2020/angular-three-cameras.mjs.map +0 -1
- package/fesm2020/angular-three-geometries.mjs +0 -488
- package/fesm2020/angular-three-geometries.mjs.map +0 -1
- package/fesm2020/angular-three-helpers.mjs +0 -378
- package/fesm2020/angular-three-helpers.mjs.map +0 -1
- package/fesm2020/angular-three-lights.mjs +0 -297
- package/fesm2020/angular-three-lights.mjs.map +0 -1
- package/fesm2020/angular-three-materials.mjs +0 -1415
- package/fesm2020/angular-three-materials.mjs.map +0 -1
- package/fesm2020/angular-three-objects.mjs +0 -381
- package/fesm2020/angular-three-objects.mjs.map +0 -1
- package/fesm2020/angular-three-primitives.mjs +0 -120
- package/fesm2020/angular-three-primitives.mjs.map +0 -1
- package/fesm2020/angular-three-stats.mjs +0 -62
- package/fesm2020/angular-three-stats.mjs.map +0 -1
- package/fesm2020/angular-three-textures.mjs +0 -228
- package/fesm2020/angular-three-textures.mjs.map +0 -1
- package/geometries/README.md +0 -3
- package/geometries/index.d.ts +0 -23
- package/geometries/lib/box-geometry/box-geometry.d.ts +0 -8
- package/geometries/lib/buffer-geometry/buffer-geometry.d.ts +0 -8
- package/geometries/lib/capsule-geometry/capsule-geometry.d.ts +0 -8
- package/geometries/lib/circle-geometry/circle-geometry.d.ts +0 -8
- package/geometries/lib/common.d.ts +0 -1
- package/geometries/lib/cone-geometry/cone-geometry.d.ts +0 -8
- package/geometries/lib/cylinder-geometry/cylinder-geometry.d.ts +0 -8
- package/geometries/lib/dodecahedron-geometry/dodecahedron-geometry.d.ts +0 -8
- package/geometries/lib/edges-geometry/edges-geometry.d.ts +0 -8
- package/geometries/lib/extrude-geometry/extrude-geometry.d.ts +0 -8
- package/geometries/lib/icosahedron-geometry/icosahedron-geometry.d.ts +0 -8
- package/geometries/lib/instanced-buffer-geometry/instanced-buffer-geometry.d.ts +0 -8
- package/geometries/lib/lathe-geometry/lathe-geometry.d.ts +0 -8
- package/geometries/lib/octahedron-geometry/octahedron-geometry.d.ts +0 -8
- package/geometries/lib/plane-geometry/plane-geometry.d.ts +0 -8
- package/geometries/lib/polyhedron-geometry/polyhedron-geometry.d.ts +0 -8
- package/geometries/lib/ring-geometry/ring-geometry.d.ts +0 -8
- package/geometries/lib/shape-geometry/shape-geometry.d.ts +0 -8
- package/geometries/lib/sphere-geometry/sphere-geometry.d.ts +0 -8
- package/geometries/lib/tetrahedron-geometry/tetrahedron-geometry.d.ts +0 -8
- package/geometries/lib/torus-geometry/torus-geometry.d.ts +0 -8
- package/geometries/lib/torus-knot-geometry/torus-knot-geometry.d.ts +0 -8
- package/geometries/lib/tube-geometry/tube-geometry.d.ts +0 -8
- package/geometries/lib/wireframe-geometry/wireframe-geometry.d.ts +0 -8
- package/helpers/README.md +0 -3
- package/helpers/index.d.ts +0 -13
- package/helpers/lib/arrow-helper/arrow-helper.d.ts +0 -8
- package/helpers/lib/axes-helper/axes-helper.d.ts +0 -8
- package/helpers/lib/box-helper/box-helper.d.ts +0 -8
- package/helpers/lib/box3-helper/box3-helper.d.ts +0 -8
- package/helpers/lib/camera-helper/camera-helper.d.ts +0 -8
- package/helpers/lib/common.d.ts +0 -1
- package/helpers/lib/directional-light-helper/directional-light-helper.d.ts +0 -8
- package/helpers/lib/grid-helper/grid-helper.d.ts +0 -8
- package/helpers/lib/hemisphere-light-helper/hemisphere-light-helper.d.ts +0 -8
- package/helpers/lib/plane-helper/plane-helper.d.ts +0 -8
- package/helpers/lib/point-light-helper/point-light-helper.d.ts +0 -8
- package/helpers/lib/polar-grid-helper/polar-grid-helper.d.ts +0 -8
- package/helpers/lib/skeleton-helper/skeleton-helper.d.ts +0 -8
- package/helpers/lib/spot-light-helper/spot-light-helper.d.ts +0 -8
- package/lib/di/resize.d.ts +0 -12
- package/lib/di/window.d.ts +0 -1
- package/lib/directives/cursor.d.ts +0 -7
- package/lib/instance.d.ts +0 -81
- package/lib/pipes/math.d.ts +0 -7
- package/lib/pipes/pi.d.ts +0 -7
- package/lib/pipes/radian.d.ts +0 -7
- package/lib/pipes/side.d.ts +0 -8
- package/lib/ref.d.ts +0 -5
- package/lib/services/loader.d.ts +0 -11
- package/lib/services/resize.d.ts +0 -19
- package/lib/stores/component-store.d.ts +0 -69
- package/lib/utils/build-graph.d.ts +0 -3
- package/lib/utils/camera.d.ts +0 -4
- package/lib/utils/capitalize.d.ts +0 -1
- package/lib/utils/check-update.d.ts +0 -2
- package/lib/utils/events.d.ts +0 -6
- package/lib/utils/get-instance-local-state.d.ts +0 -2
- package/lib/utils/inject.d.ts +0 -9
- package/lib/utils/mutate.d.ts +0 -2
- package/lib/utils/proxy.d.ts +0 -7
- package/lib/utils/renderer.d.ts +0 -3
- package/lights/README.md +0 -3
- package/lights/index.d.ts +0 -9
- package/lights/lib/ambient-light/ambient-light.d.ts +0 -39
- package/lights/lib/ambient-light-probe/ambient-light-probe.d.ts +0 -40
- package/lights/lib/common.d.ts +0 -3
- package/lights/lib/directional-light/directional-light.d.ts +0 -40
- package/lights/lib/hemisphere-light/hemisphere-light.d.ts +0 -41
- package/lights/lib/hemisphere-light-probe/hemisphere-light-probe.d.ts +0 -42
- package/lights/lib/light-probe/light-probe.d.ts +0 -40
- package/lights/lib/point-light/point-light.d.ts +0 -42
- package/lights/lib/rect-area-light/rect-area-light.d.ts +0 -42
- package/lights/lib/spot-light/spot-light.d.ts +0 -45
- package/materials/README.md +0 -3
- package/materials/index.d.ts +0 -17
- package/materials/lib/common.d.ts +0 -1
- package/materials/lib/line-basic-material/line-basic-material.d.ts +0 -55
- package/materials/lib/line-dashed-material/line-dashed-material.d.ts +0 -58
- package/materials/lib/mesh-basic-material/mesh-basic-material.d.ts +0 -67
- package/materials/lib/mesh-depth-material/mesh-depth-material.d.ts +0 -58
- package/materials/lib/mesh-distance-material/mesh-distance-material.d.ts +0 -58
- package/materials/lib/mesh-lambert-material/mesh-lambert-material.d.ts +0 -78
- package/materials/lib/mesh-matcap-material/mesh-matcap-material.d.ts +0 -64
- package/materials/lib/mesh-normal-material/mesh-normal-material.d.ts +0 -61
- package/materials/lib/mesh-phong-material/mesh-phong-material.d.ts +0 -81
- package/materials/lib/mesh-physical-material/mesh-physical-material.d.ts +0 -97
- package/materials/lib/mesh-standard-material/mesh-standard-material.d.ts +0 -78
- package/materials/lib/mesh-toon-material/mesh-toon-material.d.ts +0 -74
- package/materials/lib/points-material/points-material.d.ts +0 -56
- package/materials/lib/raw-shader-material/raw-shader-material.d.ts +0 -68
- package/materials/lib/shader-material/shader-material.d.ts +0 -68
- package/materials/lib/shadow-material/shadow-material.d.ts +0 -52
- package/materials/lib/sprite-material/sprite-material.d.ts +0 -56
- package/objects/README.md +0 -3
- package/objects/index.d.ts +0 -12
- package/objects/lib/bone/bone.d.ts +0 -35
- package/objects/lib/common.d.ts +0 -3
- package/objects/lib/group/group.d.ts +0 -35
- package/objects/lib/instanced-mesh/instanced-mesh.d.ts +0 -44
- package/objects/lib/line/line.d.ts +0 -41
- package/objects/lib/line-loop/line-loop.d.ts +0 -41
- package/objects/lib/line-segments/line-segments.d.ts +0 -41
- package/objects/lib/lod/lod.d.ts +0 -40
- package/objects/lib/mesh/mesh.d.ts +0 -41
- package/objects/lib/points/points.d.ts +0 -41
- package/objects/lib/skeleton/skeleton.d.ts +0 -16
- package/objects/lib/skinned-mesh/skinned-mesh.d.ts +0 -45
- package/objects/lib/sprite/sprite.d.ts +0 -38
- package/primitives/README.md +0 -3
- package/primitives/index.d.ts +0 -2
- package/primitives/lib/common.d.ts +0 -3
- package/primitives/lib/object-primitive/object-primitive.d.ts +0 -35
- package/primitives/lib/primitive/primitive.d.ts +0 -10
- package/schematics/README.md +0 -11
- package/stats/README.md +0 -3
- package/stats/index.d.ts +0 -1
- package/stats/lib/stats/stats.d.ts +0 -16
- package/textures/README.md +0 -3
- package/textures/index.d.ts +0 -10
- package/textures/lib/canvas-texture/canvas-texture.d.ts +0 -8
- package/textures/lib/common.d.ts +0 -1
- package/textures/lib/compressed-array-texture/compressed-array-texture.d.ts +0 -8
- package/textures/lib/compressed-texture/compressed-texture.d.ts +0 -8
- package/textures/lib/cube-texture/cube-texture.d.ts +0 -8
- package/textures/lib/data-array-texture/data-array-texture.d.ts +0 -8
- package/textures/lib/data-texture/data-texture.d.ts +0 -8
- package/textures/lib/data3-dtexture/data3-dtexture.d.ts +0 -8
- package/textures/lib/depth-texture/depth-texture.d.ts +0 -8
- package/textures/lib/framebuffer-texture/framebuffer-texture.d.ts +0 -8
- package/textures/lib/video-texture/video-texture.d.ts +0 -8
package/esm2020/lib/events.mjs
CHANGED
|
@@ -1,53 +1,342 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
export function createPointerEvents(stateFactory) {
|
|
15
|
-
const { handlePointer } = createEvents(stateFactory);
|
|
16
|
-
return {
|
|
17
|
-
priority: 1,
|
|
18
|
-
enabled: true,
|
|
19
|
-
compute: (event, rootFactory) => {
|
|
20
|
-
const state = rootFactory();
|
|
21
|
-
// https://github.com/pmndrs/react-three-fiber/pull/782
|
|
22
|
-
// Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
|
|
23
|
-
state.pointer.set((event.offsetX / state.size.width) * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
|
|
24
|
-
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
25
|
-
},
|
|
26
|
-
connected: undefined,
|
|
27
|
-
handlers: Object.keys(DOM_EVENTS).reduce((handlers, supportedEventName) => {
|
|
28
|
-
handlers[supportedEventName] = handlePointer(supportedEventName);
|
|
29
|
-
return handlers;
|
|
30
|
-
}, {}),
|
|
31
|
-
connect: (target) => {
|
|
32
|
-
const state = stateFactory();
|
|
33
|
-
state.events.disconnect?.();
|
|
34
|
-
state.setEvents({ connected: target });
|
|
35
|
-
Object.entries(state.events.handlers ?? {}).forEach(([eventName, eventHandler]) => {
|
|
36
|
-
const passive = DOM_EVENTS[eventName];
|
|
37
|
-
target.addEventListener(eventName, eventHandler, { passive });
|
|
38
|
-
});
|
|
39
|
-
},
|
|
40
|
-
disconnect: () => {
|
|
41
|
-
const { events, setEvents } = stateFactory();
|
|
42
|
-
if (events.connected) {
|
|
43
|
-
Object.entries(events.handlers ?? {}).forEach(([eventName, eventHandler]) => {
|
|
44
|
-
if (events.connected instanceof HTMLElement) {
|
|
45
|
-
events.connected.removeEventListener(eventName, eventHandler);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
setEvents({ connected: undefined });
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
};
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { getLocalState } from './utils/instance';
|
|
3
|
+
import { makeId } from './utils/make';
|
|
4
|
+
function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
|
|
5
|
+
const captureData = captures.get(obj);
|
|
6
|
+
if (captureData) {
|
|
7
|
+
captures.delete(obj);
|
|
8
|
+
// if this was the last captured object for this pointer
|
|
9
|
+
if (captures.size === 0) {
|
|
10
|
+
capturedMap.delete(pointerId);
|
|
11
|
+
captureData.target.releasePointerCapture(pointerId);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
52
14
|
}
|
|
53
|
-
|
|
15
|
+
export function removeInteractivity(store, object) {
|
|
16
|
+
const internal = store.get('internal');
|
|
17
|
+
// removes every trace of an object from data store
|
|
18
|
+
internal.interaction = internal.interaction.filter((o) => o !== object);
|
|
19
|
+
internal.initialHits = internal.initialHits.filter((o) => o !== object);
|
|
20
|
+
internal.hovered.forEach((value, key) => {
|
|
21
|
+
if (value.eventObject === object || value.object === object) {
|
|
22
|
+
// clear out intersects, they are outdated by now
|
|
23
|
+
internal.hovered.delete(key);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
internal.capturedMap.forEach((captures, pointerId) => {
|
|
27
|
+
releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
|
|
28
|
+
});
|
|
29
|
+
if (store.get('previousStore')) {
|
|
30
|
+
removeInteractivity(store.get('previousStore'), object);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function createEvents(store) {
|
|
34
|
+
/** calculates delta **/
|
|
35
|
+
function calculateDistance(event) {
|
|
36
|
+
const internal = store.get('internal');
|
|
37
|
+
const dx = event.offsetX - internal.initialClick[0];
|
|
38
|
+
const dy = event.offsetY - internal.initialClick[1];
|
|
39
|
+
return Math.round(Math.sqrt(dx * dx + dy * dy));
|
|
40
|
+
}
|
|
41
|
+
/** returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc... **/
|
|
42
|
+
function filterPointerEvents(objects) {
|
|
43
|
+
return objects.filter((obj) => ['move', 'over', 'enter', 'out', 'leave'].some((name) => {
|
|
44
|
+
const eventName = `pointer${name}`;
|
|
45
|
+
return getLocalState(obj).handlers?.[eventName];
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
function intersect(event, filter) {
|
|
49
|
+
const state = store.get();
|
|
50
|
+
const duplicates = new Set();
|
|
51
|
+
const intersections = [];
|
|
52
|
+
// allow callers to eliminate event objects
|
|
53
|
+
const eventObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
|
|
54
|
+
// reset all raycaster cameras to undefined
|
|
55
|
+
for (let i = 0; i < eventObjects.length; i++) {
|
|
56
|
+
const instanceState = getLocalState(eventObjects[i]).store?.get();
|
|
57
|
+
if (instanceState) {
|
|
58
|
+
instanceState.raycaster.camera = undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!state.previousStore) {
|
|
62
|
+
// make sure root-level pointer and ray are setup
|
|
63
|
+
state.events.compute?.(event, store);
|
|
64
|
+
}
|
|
65
|
+
function handleRaycast(obj) {
|
|
66
|
+
const objLocalState = getLocalState(obj);
|
|
67
|
+
const objStore = objLocalState.store;
|
|
68
|
+
const objState = objStore?.get();
|
|
69
|
+
// skip event handling when noEvents is set, or when raycaster 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 events layers to update function
|
|
73
|
+
if (objState.raycaster.camera === undefined) {
|
|
74
|
+
objState.events.compute?.(event, objStore, objState.previousStore);
|
|
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 = eventObjects
|
|
84
|
+
// intersect objects
|
|
85
|
+
.flatMap(handleRaycast)
|
|
86
|
+
// sort by event priority
|
|
87
|
+
.sort((a, b) => {
|
|
88
|
+
const aState = getLocalState(a.object).store.get();
|
|
89
|
+
const bState = getLocalState(b.object).store.get();
|
|
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
|
+
// allow custom userland intersect sort order, this likely only makes sense on the root
|
|
103
|
+
if (state.events.filter)
|
|
104
|
+
hits = state.events.filter(hits, store);
|
|
105
|
+
// bubble up the events, find the event source
|
|
106
|
+
for (const hit of hits) {
|
|
107
|
+
let eventObject = hit.object;
|
|
108
|
+
// bubble event up
|
|
109
|
+
while (eventObject) {
|
|
110
|
+
if (getLocalState(eventObject).eventCount) {
|
|
111
|
+
intersections.push({ ...hit, eventObject });
|
|
112
|
+
}
|
|
113
|
+
eventObject = eventObject.parent;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// if the interaction is captured, make all capturing targets part of the intersects
|
|
117
|
+
if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
|
|
118
|
+
for (const capturedData of state.internal.capturedMap.get(event.pointerId).values()) {
|
|
119
|
+
if (!duplicates.has(makeId(capturedData.intersection))) {
|
|
120
|
+
intersections.push(capturedData.intersection);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return intersections;
|
|
125
|
+
}
|
|
126
|
+
/** handle intersections by forwarding them to handlers */
|
|
127
|
+
function handleIntersects(intersections, event, delta, callback) {
|
|
128
|
+
const rootState = store.get();
|
|
129
|
+
// if anything has been found, forward it to the event listeners
|
|
130
|
+
if (intersections.length) {
|
|
131
|
+
const localState = { stopped: false };
|
|
132
|
+
for (const hit of intersections) {
|
|
133
|
+
const state = getLocalState(hit.object).store?.get() || rootState;
|
|
134
|
+
const { raycaster, pointer, camera, internal } = state;
|
|
135
|
+
const unprojectedPoint = new THREE.Vector3(pointer.x, pointer.y, 0).unproject(camera);
|
|
136
|
+
const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
|
|
137
|
+
const setPointerCapture = (id) => {
|
|
138
|
+
const captureData = { intersection: hit, target: event.target };
|
|
139
|
+
if (internal.capturedMap.has(id)) {
|
|
140
|
+
// if the pointerId was previously captured, we add the hit to the event capturedMap
|
|
141
|
+
internal.capturedMap.get(id).set(hit.eventObject, captureData);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// if the pointerId was not previously captured, we create a Map containing the hitObject, and the hit. hitObject is used for faster access
|
|
145
|
+
internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
|
|
146
|
+
}
|
|
147
|
+
// call the original event now
|
|
148
|
+
event.target.setPointerCapture(id);
|
|
149
|
+
};
|
|
150
|
+
const releasePointerCapture = (id) => {
|
|
151
|
+
const captures = internal.capturedMap.get(id);
|
|
152
|
+
if (captures) {
|
|
153
|
+
releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
// add native event props
|
|
157
|
+
const extractEventProps = {};
|
|
158
|
+
// 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.
|
|
159
|
+
for (const prop in event) {
|
|
160
|
+
const property = event[prop];
|
|
161
|
+
// only copy over atomics, leave functions alone as these should be called as event.nativeEvent.fn()
|
|
162
|
+
if (typeof property !== 'function') {
|
|
163
|
+
extractEventProps[prop] = property;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const raycastEvent = {
|
|
167
|
+
...hit,
|
|
168
|
+
...extractEventProps,
|
|
169
|
+
pointer,
|
|
170
|
+
intersections,
|
|
171
|
+
stopped: localState.stopped,
|
|
172
|
+
delta,
|
|
173
|
+
unprojectedPoint,
|
|
174
|
+
ray: raycaster.ray,
|
|
175
|
+
camera: camera,
|
|
176
|
+
// Hijack stopPropagation, which just sets a flag
|
|
177
|
+
stopPropagation() {
|
|
178
|
+
// https://github.com/pmndrs/react-three-fiber/issues/596
|
|
179
|
+
// Events are not allowed to stop propagation if the pointer has been captured
|
|
180
|
+
const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId);
|
|
181
|
+
// We only authorize stopPropagation...
|
|
182
|
+
if (
|
|
183
|
+
// ...if this pointer hasn't been captured
|
|
184
|
+
!capturesForPointer ||
|
|
185
|
+
// ... or if the hit object is capturing the pointer
|
|
186
|
+
capturesForPointer.has(hit.eventObject)) {
|
|
187
|
+
raycastEvent.stopped = localState.stopped = true;
|
|
188
|
+
// Propagation is stopped, remove all other hover records
|
|
189
|
+
// An event handler is only allowed to flush other handlers if it is hovered itself
|
|
190
|
+
if (internal.hovered.size &&
|
|
191
|
+
Array.from(internal.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
|
|
192
|
+
// Objects cannot flush out higher up objects that have already caught the event
|
|
193
|
+
const higher = intersections.slice(0, intersections.indexOf(hit));
|
|
194
|
+
cancelPointer([...higher, hit]);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
// there should be a distinction between target and currentTarget
|
|
199
|
+
target: { hasPointerCapture, setPointerCapture, releasePointerCapture },
|
|
200
|
+
currentTarget: { hasPointerCapture, setPointerCapture, releasePointerCapture },
|
|
201
|
+
nativeEvent: event,
|
|
202
|
+
};
|
|
203
|
+
// call subscribers
|
|
204
|
+
callback(raycastEvent);
|
|
205
|
+
// event bubbling may be interupted by stopPropagation
|
|
206
|
+
if (localState.stopped === true)
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return intersections;
|
|
211
|
+
}
|
|
212
|
+
function cancelPointer(intersections) {
|
|
213
|
+
const { internal } = store.get();
|
|
214
|
+
for (const hoveredObj of internal.hovered.values()) {
|
|
215
|
+
// When no objects were hit or the hovered object wasn't found underneath the cursor
|
|
216
|
+
// we call onPointerOut and delete the object from the hovered-elements map
|
|
217
|
+
if (!intersections.length ||
|
|
218
|
+
!intersections.find((hit) => hit.object === hoveredObj.object &&
|
|
219
|
+
hit.index === hoveredObj.index &&
|
|
220
|
+
hit.instanceId === hoveredObj.instanceId)) {
|
|
221
|
+
const eventObject = hoveredObj.eventObject;
|
|
222
|
+
const instance = getLocalState(eventObject);
|
|
223
|
+
const handlers = instance?.handlers;
|
|
224
|
+
internal.hovered.delete(makeId(hoveredObj));
|
|
225
|
+
if (instance?.eventCount) {
|
|
226
|
+
// Clear out intersects, they are outdated by now
|
|
227
|
+
const data = { ...hoveredObj, intersections };
|
|
228
|
+
handlers?.pointerout?.(data);
|
|
229
|
+
handlers?.pointerleave?.(data);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function pointerMissed(event, objects) {
|
|
235
|
+
for (let i = 0; i < objects.length; i++) {
|
|
236
|
+
const instance = getLocalState(objects[i]);
|
|
237
|
+
instance?.handlers.pointermissed?.(event);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function handlePointer(name) {
|
|
241
|
+
// Deal with cancelation
|
|
242
|
+
switch (name) {
|
|
243
|
+
case 'pointerleave':
|
|
244
|
+
case 'pointercancel':
|
|
245
|
+
return () => cancelPointer([]);
|
|
246
|
+
case 'lostpointercapture':
|
|
247
|
+
return (event) => {
|
|
248
|
+
const { internal } = store.get();
|
|
249
|
+
if ('pointerId' in event && !internal.capturedMap.has(event.pointerId)) {
|
|
250
|
+
// If the object event interface had onLostPointerCapture, we'd call it here on every
|
|
251
|
+
// object that's getting removed.
|
|
252
|
+
internal.capturedMap.delete(event.pointerId);
|
|
253
|
+
cancelPointer([]);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// Any other pointer goes here ...
|
|
258
|
+
return function handleEvent(event) {
|
|
259
|
+
const { onPointerMissed, internal } = store.get();
|
|
260
|
+
// prepareRay(event)
|
|
261
|
+
internal.lastEvent = event;
|
|
262
|
+
// Get fresh intersects
|
|
263
|
+
const isPointerMove = name === 'pointermove';
|
|
264
|
+
const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
|
|
265
|
+
const filter = isPointerMove ? filterPointerEvents : undefined;
|
|
266
|
+
// const hits = patchIntersects(intersect(filter), event)
|
|
267
|
+
const hits = intersect(event, filter);
|
|
268
|
+
const delta = isClickEvent ? calculateDistance(event) : 0;
|
|
269
|
+
// Save initial coordinates on pointer-down
|
|
270
|
+
if (name === 'pointerdown') {
|
|
271
|
+
internal.initialClick = [event.offsetX, event.offsetY];
|
|
272
|
+
internal.initialHits = hits.map((hit) => hit.eventObject);
|
|
273
|
+
}
|
|
274
|
+
// If a click yields no results, pass it back to the user as a miss
|
|
275
|
+
// Missed events have to come first in order to establish user-land side-effect clean up
|
|
276
|
+
if (isClickEvent && !hits.length) {
|
|
277
|
+
if (delta <= 2) {
|
|
278
|
+
pointerMissed(event, internal.interaction);
|
|
279
|
+
if (onPointerMissed)
|
|
280
|
+
onPointerMissed(event);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Take care of unhover
|
|
284
|
+
if (isPointerMove)
|
|
285
|
+
cancelPointer(hits);
|
|
286
|
+
function onIntersect(data) {
|
|
287
|
+
const eventObject = data.eventObject;
|
|
288
|
+
const instance = getLocalState(eventObject);
|
|
289
|
+
const handlers = instance?.handlers;
|
|
290
|
+
// Check presence of handlers
|
|
291
|
+
if (!instance?.eventCount)
|
|
292
|
+
return;
|
|
293
|
+
if (isPointerMove) {
|
|
294
|
+
// Move event ...
|
|
295
|
+
if (handlers?.pointerover ||
|
|
296
|
+
handlers?.pointerenter ||
|
|
297
|
+
handlers?.pointerout ||
|
|
298
|
+
handlers?.pointerleave) {
|
|
299
|
+
// When enter or out is present take care of hover-state
|
|
300
|
+
const id = makeId(data);
|
|
301
|
+
const hoveredItem = internal.hovered.get(id);
|
|
302
|
+
if (!hoveredItem) {
|
|
303
|
+
// If the object wasn't previously hovered, book it and call its handler
|
|
304
|
+
internal.hovered.set(id, data);
|
|
305
|
+
handlers.pointerover?.(data);
|
|
306
|
+
handlers.pointerenter?.(data);
|
|
307
|
+
}
|
|
308
|
+
else if (hoveredItem.stopped) {
|
|
309
|
+
// If the object was previously hovered and stopped, we shouldn't allow other items to proceed
|
|
310
|
+
data.stopPropagation();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Call mouse move
|
|
314
|
+
handlers?.pointermove?.(data);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
// All other events ...
|
|
318
|
+
const handler = handlers?.[name];
|
|
319
|
+
if (handler) {
|
|
320
|
+
// Forward all events back to their respective handlers with the exception of click events,
|
|
321
|
+
// which must use the initial target
|
|
322
|
+
if (!isClickEvent || internal.initialHits.includes(eventObject)) {
|
|
323
|
+
// Missed events have to come first
|
|
324
|
+
pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
|
|
325
|
+
// Now call the handler
|
|
326
|
+
handler(data);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
// Trigger onPointerMissed on all elements that have pointer over/out handlers, but not click and weren't hit
|
|
331
|
+
if (isClickEvent && internal.initialHits.includes(eventObject)) {
|
|
332
|
+
pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
handleIntersects(hits, event, delta, onIntersect);
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
return { handlePointer };
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBVS9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRDLFNBQVMsNkJBQTZCLENBQ2xDLFdBQXNFLEVBQ3RFLEdBQW1CLEVBQ25CLFFBQXNELEVBQ3RELFNBQWlCO0lBRWpCLE1BQU0sV0FBVyxHQUF3QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLElBQUksV0FBVyxFQUFFO1FBQ2IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQix3REFBd0Q7UUFDeEQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyQixXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkQ7S0FDSjtBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBMkIsRUFBRSxNQUFzQjtJQUNuRixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLG1EQUFtRDtJQUNuRCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDeEUsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxF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LENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNsRixDQUFDOzRCQUNGLHVCQUF1Qjs0QkFDdkIsT0FBTyxDQUFDLElBQW1DLENBQUMsQ0FBQzt5QkFDaEQ7cUJBQ0o7eUJBQU07d0JBQ0gsNkdBQTZHO3dCQUM3RyxJQUFJLFlBQVksSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTs0QkFDNUQsYUFBYSxDQUNULEtBQUssRUFDTCxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNsRixDQUFDO3lCQUNMO3FCQUNKO2lCQUNKO1lBQ0wsQ0FBQztZQUVELGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB0eXBlIHsgTmd0UnhTdG9yZSB9IGZyb20gJy4vc3RvcmVzL3J4LXN0b3JlJztcbmltcG9ydCB0eXBlIHtcbiAgICBOZ3REb21FdmVudCxcbiAgICBOZ3RFdmVudEhhbmRsZXJzLFxuICAgIE5ndEludGVyc2VjdGlvbixcbiAgICBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldCxcbiAgICBOZ3RTdGF0ZSxcbiAgICBOZ3RUaHJlZUV2ZW50LFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUgfSBmcm9tICcuL3V0aWxzL2luc3RhbmNlJztcbmltcG9ydCB7IG1ha2VJZCB9IGZyb20gJy4vdXRpbHMvbWFrZSc7XG5cbmZ1bmN0aW9uIHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKFxuICAgIGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj4sXG4gICAgb2JqOiBUSFJFRS5PYmplY3QzRCxcbiAgICBjYXB0dXJlczogTWFwPFRIUkVFLk9iamVjdDNELCBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldD4sXG4gICAgcG9pbnRlcklkOiBudW1iZXJcbik6IHZvaWQge1xuICAgIGNvbnN0IGNhcHR1cmVEYXRhOiBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldCB8IHVuZGVmaW5lZCA9IGNhcHR1cmVzLmdldChvYmopO1xuICAgIGlmIChjYXB0dXJlRGF0YSkge1xuICAgICAgICBjYXB0dXJlcy5kZWxldGUob2JqKTtcbiAgICAgICAgLy8gaWYgdGhpcyB3YXMgdGhlIGxhc3QgY2FwdHVyZWQgb2JqZWN0IGZvciB0aGlzIHBvaW50ZXJcbiAgICAgICAgaWYgKGNhcHR1cmVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGNhcHR1cmVkTWFwLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICAgICAgY2FwdHVyZURhdGEudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW50ZXJhY3Rpdml0eShzdG9yZTogTmd0UnhTdG9yZTxOZ3RTdGF0ZT4sIG9iamVjdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcbiAgICAvLyByZW1vdmVzIGV2ZXJ5IHRyYWNlIG9mIGFuIG9iamVjdCBmcm9tIGRhdGEgc3RvcmVcbiAgICBpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcbiAgICBpbnRlcm5hbC5pbml0aWFsSGl0cyA9IGludGVybmFsLmluaXRpYWxIaXRzLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcbiAgICBpbnRlcm5hbC5ob3ZlcmVkLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmV2ZW50T2JqZWN0ID09PSBvYmplY3QgfHwgdmFsdWUub2JqZWN0ID09PSBvYmplY3QpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBpbnRlcnNlY3RzLCB0aGV5IGFyZSBvdXRkYXRlZCBieSBub3dcbiAgICAgICAgICAgIGludGVybmFsLmhvdmVyZWQuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5mb3JFYWNoKChjYXB0dXJlcywgcG9pbnRlcklkKSA9PiB7XG4gICAgICAgIHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBvYmplY3QsIGNhcHR1cmVzLCBwb2ludGVySWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHN0b3JlLmdldCgncHJldmlvdXNTdG9yZScpKSB7XG4gICAgICAgIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmUuZ2V0KCdwcmV2aW91c1N0b3JlJykhLCBvYmplY3QpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50cyhzdG9yZTogTmd0UnhTdG9yZTxOZ3RTdGF0ZT4pIHtcbiAgICAvKiogY2FsY3VsYXRlcyBkZWx0YSAqKi9cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBzdG9yZS5nZXQoJ2ludGVybmFsJyk7XG4gICAgICAgIGNvbnN0IGR4ID0gZXZlbnQub2Zmc2V0WCAtIGludGVybmFsLmluaXRpYWxDbGlja1swXTtcbiAgICAgICAgY29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpKTtcbiAgICB9XG5cbiAgICAvKiogcmV0dXJucyB0cnVlIGlmIGFuIGluc3RhbmNlIGhhcyBhIHZhbGlkIHBvaW50ZXItZXZlbnQgcmVnaXN0ZXJlZCwgdGhpcyBleGNsdWRlcyBzY3JvbGwsIGNsaWNrcyBldGMuLi4gKiovXG4gICAgZnVuY3Rpb24gZmlsdGVyUG9pbnRlckV2ZW50cyhvYmplY3RzOiBUSFJFRS5PYmplY3QzRFtdKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RzLmZpbHRlcigob2JqKSA9PlxuICAgICAgICAgICAgWydtb3ZlJywgJ292ZXInLCAnZW50ZXInLCAnb3V0JywgJ2xlYXZlJ10uc29tZSgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGBwb2ludGVyJHtuYW1lfWAgYXMga2V5b2YgTmd0RXZlbnRIYW5kbGVycztcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYWxTdGF0ZShvYmopLmhhbmRsZXJzPy5bZXZlbnROYW1lXTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW50ZXJzZWN0KGV2ZW50OiBOZ3REb21FdmVudCwgZmlsdGVyPzogKG9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10pID0+IFRIUkVFLk9iamVjdDNEW10pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXQoKTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSA9IFtdO1xuICAgICAgICAvLyBhbGxvdyBjYWxsZXJzIHRvIGVsaW1pbmF0ZSBldmVudCBvYmplY3RzXG4gICAgICAgIGNvbnN0IGV2ZW50T2JqZWN0cyA9IGZpbHRlciA/IGZpbHRlcihzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbikgOiBzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbjtcbiAgICAgICAgLy8gcmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VTdGF0ZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3RzW2ldKS5zdG9yZT8uZ2V0KCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9IHVuZGVmaW5lZCE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRlLnByZXZpb3VzU3RvcmUpIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb290LWxldmVsIHBvaW50ZXIgYW5kIHJheSBhcmUgc2V0dXBcbiAgICAgICAgICAgIHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIHN0b3JlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJheWNhc3Qob2JqOiBUSFJFRS5PYmplY3QzRDxUSFJFRS5FdmVudD4pIHtcbiAgICAgICAgICAgIGNvbnN0IG9iakxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG9iaik7XG4gICAgICAgICAgICBjb25zdCBvYmpTdG9yZSA9IG9iakxvY2FsU3RhdGUuc3RvcmU7XG4gICAgICAgICAgICBjb25zdCBvYmpTdGF0ZSA9IG9ialN0b3JlPy5nZXQoKTtcbiAgICAgICAgICAgIC8vIHNraXAgZXZlbnQgaGFuZGxpbmcgd2hlbiBub0V2ZW50cyBpcyBzZXQsIG9yIHdoZW4gcmF5Y2FzdGVyIGNhbWVyYSBpcyBudWxsXG4gICAgICAgICAgICBpZiAoIW9ialN0YXRlIHx8ICFvYmpTdGF0ZS5ldmVudHMuZW5hYmxlZCB8fCBvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICAgICAgICAvLyB3aGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkLCB3ZSBoYXZlIHRvIGNhbGwgdGhlIGV2ZW50cyBsYXllcnMgdG8gdXBkYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAob2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb2JqU3RhdGUuZXZlbnRzLmNvbXB1dGU/LihldmVudCwgb2JqU3RvcmUsIG9ialN0YXRlLnByZXZpb3VzU3RvcmUpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjYW1lcmEgaXMgc3RpbGwgdW5kZWZpbmVkLCB3ZSBoYXZlIHRvIHNraXAgdGhpcyBsYXllciBlbnRpcmVseVxuICAgICAgICAgICAgICAgIGlmIChvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID09PSB1bmRlZmluZWQpIG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPSBudWxsITtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW50ZXJzZWN0IG9iamVjdCBieSBvYmplY3RcbiAgICAgICAgICAgIHJldHVybiBvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID8gb2JqU3RhdGUucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdChvYmosIHRydWUpIDogW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb2xsZWN0IGV2ZW50c1xuICAgICAgICBsZXQgaGl0czogVEhSRUUuSW50ZXJzZWN0aW9uPFRIUkVFLk9iamVjdDNEPFRIUkVFLkV2ZW50Pj5bXSA9IGV2ZW50T2JqZWN0c1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0IG9iamVjdHNcbiAgICAgICAgICAgIC5mbGF0TWFwKGhhbmRsZVJheWNhc3QpXG4gICAgICAgICAgICAvLyBzb3J0IGJ5IGV2ZW50IHByaW9yaXR5XG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFTdGF0ZSA9IGdldExvY2FsU3RhdGUoYS5vYmplY3QpLnN0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJTdGF0ZSA9IGdldExvY2FsU3RhdGUoYi5vYmplY3QpLnN0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGlmICghYVN0YXRlIHx8ICFiU3RhdGUpIHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYlN0YXRlLmV2ZW50cy5wcmlvcml0eSAtIGFTdGF0ZS5ldmVudHMucHJpb3JpdHkgfHwgYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBtYWtlSWQoaXRlbSBhcyBOZ3RJbnRlcnNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGVzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBhbGxvdyBjdXN0b20gdXNlcmxhbmQgaW50ZXJzZWN0IHNvcnQgb3JkZXIsIHRoaXMgbGlrZWx5IG9ubHkgbWFrZXMgc2Vuc2Ugb24gdGhlIHJvb3RcbiAgICAgICAgaWYgKHN0YXRlLmV2ZW50cy5maWx0ZXIpIGhpdHMgPSBzdGF0ZS5ldmVudHMuZmlsdGVyKGhpdHMsIHN0b3JlKTtcblxuICAgICAgICAvLyBidWJibGUgdXAgdGhlIGV2ZW50cywgZmluZCB0aGUgZXZlbnQgc291cmNlXG4gICAgICAgIGZvciAoY29uc3QgaGl0IG9mIGhpdHMpIHtcbiAgICAgICAgICAgIGxldCBldmVudE9iamVjdDogVEhSRUUuT2JqZWN0M0QgfCBudWxsID0gaGl0Lm9iamVjdDtcbiAgICAgICAgICAgIC8vIGJ1YmJsZSBldmVudCB1cFxuICAgICAgICAgICAgd2hpbGUgKGV2ZW50T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpLmV2ZW50Q291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKHsgLi4uaGl0LCBldmVudE9iamVjdCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnRPYmplY3QgPSBldmVudE9iamVjdC5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgaW50ZXJhY3Rpb24gaXMgY2FwdHVyZWQsIG1ha2UgYWxsIGNhcHR1cmluZyB0YXJnZXRzIHBhcnQgb2YgdGhlIGludGVyc2VjdHNcbiAgICAgICAgaWYgKCdwb2ludGVySWQnIGluIGV2ZW50ICYmIHN0YXRlLmludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcHR1cmVkRGF0YSBvZiBzdGF0ZS5pbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKSEudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZXMuaGFzKG1ha2VJZChjYXB0dXJlZERhdGEuaW50ZXJzZWN0aW9uKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGNhcHR1cmVkRGF0YS5pbnRlcnNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbiAgICB9XG5cbiAgICAvKiogaGFuZGxlIGludGVyc2VjdGlvbnMgYnkgZm9yd2FyZGluZyB0aGVtIHRvIGhhbmRsZXJzICovXG4gICAgZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcbiAgICAgICAgaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10sXG4gICAgICAgIGV2ZW50OiBOZ3REb21FdmVudCxcbiAgICAgICAgZGVsdGE6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChldmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm9vdFN0YXRlID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgIC8vIGlmIGFueXRoaW5nIGhhcyBiZWVuIGZvdW5kLCBmb3J3YXJkIGl0IHRvIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhpdCBvZiBpbnRlcnNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRMb2NhbFN0YXRlKGhpdC5vYmplY3QpLnN0b3JlPy5nZXQoKSB8fCByb290U3RhdGU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByYXljYXN0ZXIsIHBvaW50ZXIsIGNhbWVyYSwgaW50ZXJuYWwgfSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJvamVjdGVkUG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMyhwb2ludGVyLngsIHBvaW50ZXIueSwgMCkudW5wcm9qZWN0KGNhbWVyYSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKT8uaGFzKGhpdC5ldmVudE9iamVjdCkgPz8gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVEYXRhID0geyBpbnRlcnNlY3Rpb246IGhpdCwgdGFyZ2V0OiBldmVudC50YXJnZXQgYXMgRWxlbWVudCB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBvaW50ZXJJZCB3YXMgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgYWRkIHRoZSBoaXQgdG8gdGhlIGV2ZW50IGNhcHR1cmVkTWFwXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpIS5zZXQoaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcG9pbnRlcklkIHdhcyBub3QgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgY3JlYXRlIGEgTWFwIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvciBmYXN0ZXIgYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5zZXQoaWQsIG5ldyBNYXAoW1toaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVEYXRhXV0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBldmVudCBub3dcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5zZXRQb2ludGVyQ2FwdHVyZShpZCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVzID0gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShpbnRlcm5hbC5jYXB0dXJlZE1hcCwgaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlcywgaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vIGFkZCBuYXRpdmUgZXZlbnQgcHJvcHNcbiAgICAgICAgICAgICAgICBjb25zdCBleHRyYWN0RXZlbnRQcm9wczogYW55ID0ge307XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpdGVyYXRlcyBvdmVyIHRoZSBldmVudCdzIHByb3BlcnRpZXMgaW5jbHVkaW5nIHRoZSBpbmhlcml0ZWQgb25lcy4gTmF0aXZlIFBvaW50ZXJFdmVudHMgaGF2ZSBtb3N0IG9mIHRoZWlyIHByb3BzIGFzIGdldHRlcnMgd2hpY2ggYXJlIGluaGVyaXRlZCwgYnV0IHBvbHlmaWxsZWQgUG9pbnRlckV2ZW50cyBoYXZlIHRoZW0gYWxsIGFzIHRoZWlyIG93biBwcm9wZXJ0aWVzIChpLmUuIG5vdCBpbmhlcml0ZWQpLiBXZSBjYW4ndCB1c2UgT2JqZWN0LmtleXMoKSBvciBPYmplY3QuZW50cmllcygpIGFzIHRoZXkgb25seSByZXR1cm4gXCJvd25cIiBwcm9wZXJ0aWVzOyBub3IgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV2ZW50KSBhcyB0aGF0ICpkb2Vzbid0KiByZXR1cm4gXCJvd25cIiBwcm9wZXJ0aWVzLCBvbmx5IGluaGVyaXRlZCBvbmVzLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGV2ZW50W3Byb3AgYXMga2V5b2YgTmd0RG9tRXZlbnRdO1xuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNvcHkgb3ZlciBhdG9taWNzLCBsZWF2ZSBmdW5jdGlvbnMgYWxvbmUgYXMgdGhlc2Ugc2hvdWxkIGJlIGNhbGxlZCBhcyBldmVudC5uYXRpdmVFdmVudC5mbigpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RFdmVudFByb3BzW3Byb3BdID0gcHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYXljYXN0RXZlbnQ6IE5ndFRocmVlRXZlbnQ8Tmd0RG9tRXZlbnQ+ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5oaXQsXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4dHJhY3RFdmVudFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhLFxuICAgICAgICAgICAgICAgICAgICB1bnByb2plY3RlZFBvaW50LFxuICAgICAgICAgICAgICAgICAgICByYXk6IHJheWNhc3Rlci5yYXksXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogY2FtZXJhLFxuICAgICAgICAgICAgICAgICAgICAvLyBIaWphY2sgc3RvcFByb3BhZ2F0aW9uLCB3aGljaCBqdXN0IHNldHMgYSBmbGFnXG4gICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW5kcnMvcmVhY3QtdGhyZWUtZmliZXIvaXNzdWVzLzU5NlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnRzIGFyZSBub3QgYWxsb3dlZCB0byBzdG9wIHByb3BhZ2F0aW9uIGlmIHRoZSBwb2ludGVyIGhhcyBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlc0ZvclBvaW50ZXIgPSAncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhdXRob3JpemUgc3RvcFByb3BhZ2F0aW9uLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uaWYgdGhpcyBwb2ludGVyIGhhc24ndCBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBvciBpZiB0aGUgaGl0IG9iamVjdCBpcyBjYXB0dXJpbmcgdGhlIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlc0ZvclBvaW50ZXIuaGFzKGhpdC5ldmVudE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGlvbiBpcyBzdG9wcGVkLCByZW1vdmUgYWxsIG90aGVyIGhvdmVyIHJlY29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBldmVudCBoYW5kbGVyIGlzIG9ubHkgYWxsb3dlZCB0byBmbHVzaCBvdGhlciBoYW5kbGVycyBpZiBpdCBpcyBob3ZlcmVkIGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zaXplICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkuZmluZCgoaSkgPT4gaS5ldmVudE9iamVjdCA9PT0gaGl0LmV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3RzIGNhbm5vdCBmbHVzaCBvdXQgaGlnaGVyIHVwIG9iamVjdHMgdGhhdCBoYXZlIGFscmVhZHkgY2F1Z2h0IHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9pbnRlcihbLi4uaGlnaGVyLCBoaXRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGFyZ2V0IGFuZCBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogeyBoYXNQb2ludGVyQ2FwdHVyZSwgc2V0UG9pbnRlckNhcHR1cmUsIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSB9LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiB7IGhhc1BvaW50ZXJDYXB0dXJlLCBzZXRQb2ludGVyQ2FwdHVyZSwgcmVsZWFzZVBvaW50ZXJDYXB0dXJlIH0sXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy8gY2FsbCBzdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJheWNhc3RFdmVudCk7XG4gICAgICAgICAgICAgICAgLy8gZXZlbnQgYnViYmxpbmcgbWF5IGJlIGludGVydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUuc3RvcHBlZCA9PT0gdHJ1ZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsUG9pbnRlcihpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSkge1xuICAgICAgICBjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5nZXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBob3ZlcmVkT2JqIG9mIGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gbm8gb2JqZWN0cyB3ZXJlIGhpdCBvciB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuICAgICAgICAgICAgLy8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGhpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5vYmplY3QgPT09IGhvdmVyZWRPYmoub2JqZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuaW5kZXggPT09IGhvdmVyZWRPYmouaW5kZXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5pbnN0YW5jZUlkID09PSBob3ZlcmVkT2JqLmluc3RhbmNlSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE9iamVjdCA9IGhvdmVyZWRPYmouZXZlbnRPYmplY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRMb2NhbFN0YXRlKGV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcbiAgICAgICAgICAgICAgICBpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShtYWtlSWQoaG92ZXJlZE9iaikpO1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZT8uZXZlbnRDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IC4uLmhvdmVyZWRPYmosIGludGVyc2VjdGlvbnMgfTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJvdXQ/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVybGVhdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRlck1pc3NlZChldmVudDogTW91c2VFdmVudCwgb2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0TG9jYWxTdGF0ZShvYmplY3RzW2ldKTtcbiAgICAgICAgICAgIGluc3RhbmNlPy5oYW5kbGVycy5wb2ludGVybWlzc2VkPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRlcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gRGVhbCB3aXRoIGNhbmNlbGF0aW9uXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgICAgICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxQb2ludGVyKFtdKTtcbiAgICAgICAgICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChldmVudDogTmd0RG9tRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpbnRlcm5hbCB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgncG9pbnRlcklkJyBpbiBldmVudCAmJiAhaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3QgZXZlbnQgaW50ZXJmYWNlIGhhZCBvbkxvc3RQb2ludGVyQ2FwdHVyZSwgd2UnZCBjYWxsIGl0IGhlcmUgb24gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCB0aGF0J3MgZ2V0dGluZyByZW1vdmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuY2FwdHVyZWRNYXAuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxQb2ludGVyKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbnkgb3RoZXIgcG9pbnRlciBnb2VzIGhlcmUgLi4uXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudDogTmd0RG9tRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25Qb2ludGVyTWlzc2VkLCBpbnRlcm5hbCB9ID0gc3RvcmUuZ2V0KCk7XG5cbiAgICAgICAgICAgIC8vIHByZXBhcmVSYXkoZXZlbnQpXG4gICAgICAgICAgICBpbnRlcm5hbC5sYXN0RXZlbnQgPSBldmVudDtcblxuICAgICAgICAgICAgLy8gR2V0IGZyZXNoIGludGVyc2VjdHNcbiAgICAgICAgICAgIGNvbnN0IGlzUG9pbnRlck1vdmUgPSBuYW1lID09PSAncG9pbnRlcm1vdmUnO1xuICAgICAgICAgICAgY29uc3QgaXNDbGlja0V2ZW50ID0gbmFtZSA9PT0gJ2NsaWNrJyB8fCBuYW1lID09PSAnY29udGV4dG1lbnUnIHx8IG5hbWUgPT09ICdkYmxjbGljayc7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBpc1BvaW50ZXJNb3ZlID8gZmlsdGVyUG9pbnRlckV2ZW50cyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIGNvbnN0IGhpdHMgPSBwYXRjaEludGVyc2VjdHMoaW50ZXJzZWN0KGZpbHRlciksIGV2ZW50KVxuICAgICAgICAgICAgY29uc3QgaGl0cyA9IGludGVyc2VjdChldmVudCwgZmlsdGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gaXNDbGlja0V2ZW50ID8gY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpIDogMDtcblxuICAgICAgICAgICAgLy8gU2F2ZSBpbml0aWFsIGNvb3JkaW5hdGVzIG9uIHBvaW50ZXItZG93blxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdwb2ludGVyZG93bicpIHtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbC5pbml0aWFsQ2xpY2sgPSBbZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WV07XG4gICAgICAgICAgICAgICAgaW50ZXJuYWwuaW5pdGlhbEhpdHMgPSBoaXRzLm1hcCgoaGl0KSA9PiBoaXQuZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBhIGNsaWNrIHlpZWxkcyBubyByZXN1bHRzLCBwYXNzIGl0IGJhY2sgdG8gdGhlIHVzZXIgYXMgYSBtaXNzXG4gICAgICAgICAgICAvLyBNaXNzZWQgZXZlbnRzIGhhdmUgdG8gY29tZSBmaXJzdCBpbiBvcmRlciB0byBlc3RhYmxpc2ggdXNlci1sYW5kIHNpZGUtZWZmZWN0IGNsZWFuIHVwXG4gICAgICAgICAgICBpZiAoaXNDbGlja0V2ZW50ICYmICFoaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXJNaXNzZWQoZXZlbnQsIGludGVybmFsLmludGVyYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9uUG9pbnRlck1pc3NlZCkgb25Qb2ludGVyTWlzc2VkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUYWtlIGNhcmUgb2YgdW5ob3ZlclxuICAgICAgICAgICAgaWYgKGlzUG9pbnRlck1vdmUpIGNhbmNlbFBvaW50ZXIoaGl0cyk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uSW50ZXJzZWN0KGRhdGE6IE5ndFRocmVlRXZlbnQ8Tmd0RG9tRXZlbnQ+KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRPYmplY3QgPSBkYXRhLmV2ZW50T2JqZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0TG9jYWxTdGF0ZShldmVudE9iamVjdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpbnN0YW5jZT8uaGFuZGxlcnM7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgcHJlc2VuY2Ugb2YgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlPy5ldmVudENvdW50KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIGV2ZW50IC4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm92ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVyZW50ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVyb3V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcmxlYXZlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBlbnRlciBvciBvdXQgaXMgcHJlc2VudCB0YWtlIGNhcmUgb2YgaG92ZXItc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gbWFrZUlkKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG92ZXJlZEl0ZW0gPSBpbnRlcm5hbC5ob3ZlcmVkLmdldChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhvdmVyZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCB3YXNuJ3QgcHJldmlvdXNseSBob3ZlcmVkLCBib29rIGl0IGFuZCBjYWxsIGl0cyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zZXQoaWQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnBvaW50ZXJvdmVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnBvaW50ZXJlbnRlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG92ZXJlZEl0ZW0uc3RvcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3Qgd2FzIHByZXZpb3VzbHkgaG92ZXJlZCBhbmQgc3RvcHBlZCwgd2Ugc2hvdWxkbid0IGFsbG93IG90aGVyIGl0ZW1zIHRvIHByb2NlZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgbW91c2UgbW92ZVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm1vdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIGV2ZW50cyAuLi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzPy5bbmFtZSBhcyBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzXSBhcyAoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+XG4gICAgICAgICAgICAgICAgICAgICkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcndhcmQgYWxsIGV2ZW50cyBiYWNrIHRvIHRoZWlyIHJlc3BlY3RpdmUgaGFuZGxlcnMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGNsaWNrIGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG11c3QgdXNlIHRoZSBpbml0aWFsIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NsaWNrRXZlbnQgfHwgaW50ZXJuYWwuaW5pdGlhbEhpdHMuaW5jbHVkZXMoZXZlbnRPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyTWlzc2VkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaW50ZXJhY3Rpb24uZmlsdGVyKChvYmplY3QpID0+ICFpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhvYmplY3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IGNhbGwgdGhlIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgb25Qb2ludGVyTWlzc2VkIG9uIGFsbCBlbGVtZW50cyB0aGF0IGhhdmUgcG9pbnRlciBvdmVyL291dCBoYW5kbGVycywgYnV0IG5vdCBjbGljayBhbmQgd2VyZW4ndCBoaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NsaWNrRXZlbnQgJiYgaW50ZXJuYWwuaW5pdGlhbEhpdHMuaW5jbHVkZXMoZXZlbnRPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlck1pc3NlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigob2JqZWN0KSA9PiAhaW50ZXJuYWwuaW5pdGlhbEhpdHMuaW5jbHVkZXMob2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoYW5kbGVJbnRlcnNlY3RzKGhpdHMsIGV2ZW50LCBkZWx0YSwgb25JbnRlcnNlY3QpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGhhbmRsZVBvaW50ZXIgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isObservable, of, map, tap, from, retry, share, ReplaySubject, catchError, switchMap, forkJoin, take, } from 'rxjs';
|
|
2
|
+
import { makeObjectGraph } from './utils/make';
|
|
3
|
+
const cached = new Map();
|
|
4
|
+
function injectLoader(loaderConstructorFactory, input, extensions, onProgress) {
|
|
5
|
+
const urls$ = isObservable(input) ? input : of(input);
|
|
6
|
+
return urls$.pipe(map((inputs) => {
|
|
7
|
+
const loaderConstructor = loaderConstructorFactory(inputs);
|
|
8
|
+
const loader = new loaderConstructor();
|
|
9
|
+
if (extensions) {
|
|
10
|
+
extensions(loader);
|
|
11
|
+
}
|
|
12
|
+
const urls = Array.isArray(inputs) ? inputs : typeof inputs === 'string' ? [inputs] : Object.values(inputs);
|
|
13
|
+
return [
|
|
14
|
+
urls.map((url) => {
|
|
15
|
+
if (!cached.has(url)) {
|
|
16
|
+
cached.set(url, from(loader.loadAsync(url, onProgress)).pipe(tap((data) => {
|
|
17
|
+
if (data.scene) {
|
|
18
|
+
Object.assign(data, makeObjectGraph(data.scene));
|
|
19
|
+
}
|
|
20
|
+
}), retry(2), catchError((err) => {
|
|
21
|
+
console.error(`[NGT] Error loading ${url}: ${err.message}`);
|
|
22
|
+
return of([]);
|
|
23
|
+
}), share({
|
|
24
|
+
connector: () => new ReplaySubject(1),
|
|
25
|
+
resetOnComplete: true,
|
|
26
|
+
resetOnError: true,
|
|
27
|
+
resetOnRefCountZero: true,
|
|
28
|
+
})));
|
|
29
|
+
}
|
|
30
|
+
return cached.get(url);
|
|
31
|
+
}),
|
|
32
|
+
inputs,
|
|
33
|
+
];
|
|
34
|
+
}), switchMap(([observables$, inputs]) => {
|
|
35
|
+
return forkJoin(observables$).pipe(map((results) => {
|
|
36
|
+
if (Array.isArray(inputs))
|
|
37
|
+
return results;
|
|
38
|
+
if (typeof inputs === 'string')
|
|
39
|
+
return results[0];
|
|
40
|
+
const keys = Object.keys(inputs);
|
|
41
|
+
return keys.reduce((result, key) => {
|
|
42
|
+
result[key] = results[keys.indexOf(key)];
|
|
43
|
+
return result;
|
|
44
|
+
}, {});
|
|
45
|
+
}));
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
injectLoader.destroy = () => {
|
|
49
|
+
cached.clear();
|
|
50
|
+
};
|
|
51
|
+
injectLoader.preLoad = (loaderConstructorFactory, inputs, extensions) => {
|
|
52
|
+
injectLoader(loaderConstructorFactory, inputs, extensions).pipe(take(1)).subscribe();
|
|
53
|
+
};
|
|
54
|
+
export const injectNgtLoader = injectLoader;
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxZQUFZLEVBRVosRUFBRSxFQUNGLEdBQUcsRUFDSCxHQUFHLEVBQ0gsSUFBSSxFQUNKLEtBQUssRUFDTCxLQUFLLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixTQUFTLEVBQ1QsUUFBUSxFQUNSLElBQUksR0FDUCxNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUE0Qi9DLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO0FBRWxELFNBQVMsWUFBWSxDQUNqQix3QkFBZ0csRUFDaEcsS0FBOEIsRUFDOUIsVUFBZ0MsRUFDaEMsVUFBMkM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDWCxNQUFNLGlCQUFpQixHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFVBQVUsRUFBRTtZQUNaLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QjtRQUNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFN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ZSxcbiAgICBPYnNlcnZhYmxlLFxuICAgIG9mLFxuICAgIG1hcCxcbiAgICB0YXAsXG4gICAgZnJvbSxcbiAgICByZXRyeSxcbiAgICBzaGFyZSxcbiAgICBSZXBsYXlTdWJqZWN0LFxuICAgIGNhdGNoRXJyb3IsXG4gICAgc3dpdGNoTWFwLFxuICAgIGZvcmtKb2luLFxuICAgIHRha2UsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHR5cGUgeyBHTFRGIH0gZnJvbSAndGhyZWUtc3RkbGliJztcbmltcG9ydCB0eXBlIHsgTmd0QnJhbmNoaW5nUmV0dXJuLCBOZ3RMb2FkZXJFeHRlbnNpb25zLCBOZ3RMb2FkZXJSZXN1bHQsIE5ndE9iamVjdE1hcCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgbWFrZU9iamVjdEdyYXBoIH0gZnJvbSAnLi91dGlscy9tYWtlJztcblxuaW50ZXJmYWNlIE5ndExvYWRlciB7XG4gICAgPFRSZXR1cm5UeXBlLCBUVXJsIGV4dGVuZHMgc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihcbiAgICAgICAgbG9hZGVyQ29uc3RydWN0b3JGYWN0b3J5OiAoaW5wdXRzOiBUVXJsKSA9PiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBOZ3RMb2FkZXJSZXN1bHQ8VFJldHVyblR5cGU+LFxuICAgICAgICBpbnB1dDogVFVybCB8IE9ic2VydmFibGU8VFVybD4sXG4gICAgICAgIGV4dGVuc2lvbnM/OiBOZ3RMb2FkZXJFeHRlbnNpb25zLFxuICAgICAgICBvblByb2dyZXNzPzogKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkXG4gICAgKTogT2JzZXJ2YWJsZTxcbiAgICAgICAgVFVybCBleHRlbmRzIHN0cmluZ1tdXG4gICAgICAgICAgICA/IEFycmF5PE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuVHlwZSwgR0xURiwgR0xURiAmIE5ndE9iamVjdE1hcD4+XG4gICAgICAgICAgICA6IFRVcmwgZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgICAgID8geyBba2V5IGluIGtleW9mIFRVcmxdOiBOZ3RCcmFuY2hpbmdSZXR1cm48VFJldHVyblR5cGUsIEdMVEYsIEdMVEYgJiBOZ3RPYmplY3RNYXA+IH1cbiAgICAgICAgICAgIDogTmd0QnJhbmNoaW5nUmV0dXJuPFRSZXR1cm5UeXBlLCBHTFRGLCBHTFRGICYgTmd0T2JqZWN0TWFwPlxuICAgID47XG4gICAgZGVzdHJveTogKCkgPT4gdm9pZDtcbiAgICBwcmVMb2FkOiA8VFJldHVyblR5cGUsIFRVcmwgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFxuICAgICAgICBsb2FkZXJDb25zdHJ1Y3RvckZhY3Rvcnk6IChpbnB1dHM6IFRVcmwpID0+IG5ldyAoLi4uYXJnczogYW55W10pID0+IE5ndExvYWRlclJlc3VsdDxUUmV0dXJuVHlwZT4sXG4gICAgICAgIGlucHV0czogVFVybCB8IE9ic2VydmFibGU8VFVybD4sXG4gICAgICAgIGV4dGVuc2lvbnM/OiBOZ3RMb2FkZXJFeHRlbnNpb25zXG4gICAgKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBOZ3RMb2FkZXJSZXN1bHRzPFxuICAgIFRJbnB1dCBleHRlbmRzIHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBUUmV0dXJuXG4+ID0gVElucHV0IGV4dGVuZHMgc3RyaW5nW10gPyBUUmV0dXJuW10gOiBUSW5wdXQgZXh0ZW5kcyBvYmplY3QgPyB7IFtrZXkgaW4ga2V5b2YgVElucHV0XTogVFJldHVybiB9IDogVFJldHVybjtcblxuY29uc3QgY2FjaGVkID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8YW55Pj4oKTtcblxuZnVuY3Rpb24gaW5qZWN0TG9hZGVyPFRSZXR1cm5UeXBlLCBUVXJsIGV4dGVuZHMgc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihcbiAgICBsb2FkZXJDb25zdHJ1Y3RvckZhY3Rvcnk6IChpbnB1dHM6IFRVcmwpID0+IG5ldyAoLi4uYXJnczogYW55W10pID0+IE5ndExvYWRlclJlc3VsdDxUUmV0dXJuVHlwZT4sXG4gICAgaW5wdXQ6IFRVcmwgfCBPYnNlcnZhYmxlPFRVcmw+LFxuICAgIGV4dGVuc2lvbnM/OiBOZ3RMb2FkZXJFeHRlbnNpb25zLFxuICAgIG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWRcbik6IE9ic2VydmFibGU8Tmd0TG9hZGVyUmVzdWx0czxUVXJsLCBOZ3RCcmFuY2hpbmdSZXR1cm48VFJldHVyblR5cGUsIEdMVEYsIEdMVEYgJiBOZ3RPYmplY3RNYXA+Pj4ge1xuICAgIGNvbnN0IHVybHMkID0gaXNPYnNlcnZhYmxlKGlucHV0KSA/IGlucHV0IDogb2YoaW5wdXQpO1xuXG4gICAgcmV0dXJuIHVybHMkLnBpcGUoXG4gICAgICAgIG1hcCgoaW5wdXRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJDb25zdHJ1Y3RvciA9IGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeShpbnB1dHMpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbmV3IGxvYWRlckNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMobG9hZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVybHMgPSBBcnJheS5pc0FycmF5KGlucHV0cykgPyBpbnB1dHMgOiB0eXBlb2YgaW5wdXRzID09PSAnc3RyaW5nJyA/IFtpbnB1dHNdIDogT2JqZWN0LnZhbHVlcyhpbnB1dHMpO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB1cmxzLm1hcCgodXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWQuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tKGxvYWRlci5sb2FkQXN5bmModXJsLCBvblByb2dyZXNzKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgbWFrZU9iamVjdEdyYXBoKGRhdGEuc2NlbmUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtOR1RdIEVycm9yIGxvYWRpbmcgJHt1cmx9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE9uQ29tcGxldGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE9uRXJyb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE9uUmVmQ291bnRaZXJvOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZC5nZXQodXJsKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICBdIGFzIFtBcnJheTxPYnNlcnZhYmxlPGFueT4+LCBUVXJsIHwgVFVybFtdXTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoW29ic2VydmFibGVzJCwgaW5wdXRzXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzJCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXRzKSkgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRzID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5IGFzIGtleW9mIHR5cGVvZiByZXN1bHRdID0gcmVzdWx0c1trZXlzLmluZGV4T2Yoa2V5KV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9LCB7fSBhcyB7IFtrZXkgaW4ga2V5b2YgVFVybF06IE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuVHlwZSwgR0xURiwgR0xURiAmIE5ndE9iamVjdE1hcD4gfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuKGluamVjdExvYWRlciBhcyBOZ3RMb2FkZXIpLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgY2FjaGVkLmNsZWFyKCk7XG59O1xuXG4oaW5qZWN0TG9hZGVyIGFzIE5ndExvYWRlcikucHJlTG9hZCA9IChsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnksIGlucHV0cywgZXh0ZW5zaW9ucykgPT4ge1xuICAgIGluamVjdExvYWRlcihsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnksIGlucHV0cywgZXh0ZW5zaW9ucykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmplY3ROZ3RMb2FkZXIgPSBpbmplY3RMb2FkZXIgYXMgTmd0TG9hZGVyO1xuIl19
|