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
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
import * as THREE from 'three';
|
|
2
|
-
import { getInstanceLocalState } from './get-instance-local-state';
|
|
3
|
-
import { makeId } from './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(stateFactory, object) {
|
|
20
|
-
const { internal } = stateFactory();
|
|
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(stateFactory) {
|
|
35
|
-
/** Calculates delta */
|
|
36
|
-
function calculateDistance(event) {
|
|
37
|
-
const { internal } = stateFactory();
|
|
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 getInstanceLocalState(obj)?.handlers[eventName];
|
|
47
|
-
}));
|
|
48
|
-
}
|
|
49
|
-
function intersect(event, filter) {
|
|
50
|
-
const state = stateFactory();
|
|
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 instanceState = getInstanceLocalState(eventsObjects[i])?.stateFactory();
|
|
58
|
-
if (instanceState) {
|
|
59
|
-
instanceState.raycaster.camera = undefined;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (!state.previousStateFactory) {
|
|
63
|
-
// Make sure root-level pointer and ray are set up
|
|
64
|
-
state.events.compute?.(event, () => state);
|
|
65
|
-
}
|
|
66
|
-
function handleRaycast(obj) {
|
|
67
|
-
const state = getInstanceLocalState(obj)?.stateFactory();
|
|
68
|
-
// Skip event handling when noEvents is set, or when the raycasters camera is null
|
|
69
|
-
if (!state || !state.events.enabled || state.raycaster.camera === null)
|
|
70
|
-
return [];
|
|
71
|
-
// When the camera is undefined we have to call the event layers update function
|
|
72
|
-
if (state.raycaster.camera === undefined) {
|
|
73
|
-
state.events.compute?.(event, () => state, state.previousStateFactory);
|
|
74
|
-
// If the camera is still undefined we have to skip this layer entirely
|
|
75
|
-
if (state.raycaster.camera === undefined)
|
|
76
|
-
state.raycaster.camera = null;
|
|
77
|
-
}
|
|
78
|
-
// Intersect object by object
|
|
79
|
-
return state.raycaster.camera ? state.raycaster.intersectObject(obj, true) : [];
|
|
80
|
-
}
|
|
81
|
-
// Collect events
|
|
82
|
-
let hits = eventsObjects
|
|
83
|
-
// Intersect objects
|
|
84
|
-
.flatMap(handleRaycast)
|
|
85
|
-
// Sort by event priority and distance
|
|
86
|
-
.sort((a, b) => {
|
|
87
|
-
const aState = getInstanceLocalState(a.object)?.stateFactory();
|
|
88
|
-
const bState = getInstanceLocalState(b.object)?.stateFactory();
|
|
89
|
-
if (!aState || !bState)
|
|
90
|
-
return 0;
|
|
91
|
-
return bState.events.priority - aState.events.priority || a.distance - b.distance;
|
|
92
|
-
})
|
|
93
|
-
// Filter out duplicates
|
|
94
|
-
.filter((item) => {
|
|
95
|
-
const id = makeId(item);
|
|
96
|
-
if (duplicates.has(id))
|
|
97
|
-
return false;
|
|
98
|
-
duplicates.add(id);
|
|
99
|
-
return true;
|
|
100
|
-
});
|
|
101
|
-
// https://github.com/mrdoob/three.js/issues/16031
|
|
102
|
-
// Allow custom userland intersect sort order, this likely only makes sense on the root filter
|
|
103
|
-
if (state.events.filter)
|
|
104
|
-
hits = state.events.filter(hits, () => state);
|
|
105
|
-
// Bubble up the events, find the event source (eventObject)
|
|
106
|
-
for (const hit of hits) {
|
|
107
|
-
let eventObject = hit.object;
|
|
108
|
-
// Bubble event up
|
|
109
|
-
while (eventObject) {
|
|
110
|
-
if (getInstanceLocalState(eventObject)?.eventCount)
|
|
111
|
-
intersections.push({ ...hit, eventObject });
|
|
112
|
-
eventObject = eventObject.parent;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// If the interaction is captured, make all capturing targets part of the intersect.
|
|
116
|
-
if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
|
|
117
|
-
for (const captureData of state.internal.capturedMap.get(event.pointerId).values()) {
|
|
118
|
-
intersections.push(captureData.intersection);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return intersections;
|
|
122
|
-
}
|
|
123
|
-
/** Handles intersections by forwarding them to handlers */
|
|
124
|
-
function handleIntersects(intersections, event, delta, callback) {
|
|
125
|
-
const rootState = stateFactory();
|
|
126
|
-
// If anything has been found, forward it to the event listeners
|
|
127
|
-
if (intersections.length) {
|
|
128
|
-
const localState = { stopped: false };
|
|
129
|
-
for (const hit of intersections) {
|
|
130
|
-
const state = getInstanceLocalState(hit.object)?.stateFactory() || rootState;
|
|
131
|
-
const { raycaster, pointer, camera, internal } = state;
|
|
132
|
-
const unprojectedPoint = new THREE.Vector3(pointer.x, pointer.y, 0).unproject(camera);
|
|
133
|
-
const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
|
|
134
|
-
const setPointerCapture = (id) => {
|
|
135
|
-
const captureData = {
|
|
136
|
-
intersection: hit,
|
|
137
|
-
target: event.target,
|
|
138
|
-
};
|
|
139
|
-
if (internal.capturedMap.has(id)) {
|
|
140
|
-
// if the pointerId was previously captured, we add the hit to the
|
|
141
|
-
// event capturedMap.
|
|
142
|
-
internal.capturedMap.get(id).set(hit.eventObject, captureData);
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
// if the pointerId was not previously captured, we create a map
|
|
146
|
-
// containing the hitObject, and the hit. hitObject is used for
|
|
147
|
-
// faster access.
|
|
148
|
-
internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
|
|
149
|
-
}
|
|
150
|
-
// Call the original event now
|
|
151
|
-
event.target.setPointerCapture(id);
|
|
152
|
-
};
|
|
153
|
-
const releasePointerCapture = (id) => {
|
|
154
|
-
const captures = internal.capturedMap.get(id);
|
|
155
|
-
if (captures) {
|
|
156
|
-
releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
// Add native event props
|
|
160
|
-
const extractEventProps = {};
|
|
161
|
-
// 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.
|
|
162
|
-
for (const prop in event) {
|
|
163
|
-
const property = event[prop];
|
|
164
|
-
// Only copy over atomics, leave functions alone as these should be
|
|
165
|
-
// called as event.nativeEvent.fn()
|
|
166
|
-
if (typeof property !== 'function')
|
|
167
|
-
extractEventProps[prop] = property;
|
|
168
|
-
}
|
|
169
|
-
const raycastEvent = {
|
|
170
|
-
...hit,
|
|
171
|
-
...extractEventProps,
|
|
172
|
-
pointer,
|
|
173
|
-
intersections,
|
|
174
|
-
stopped: localState.stopped,
|
|
175
|
-
delta,
|
|
176
|
-
unprojectedPoint,
|
|
177
|
-
ray: raycaster.ray,
|
|
178
|
-
camera: camera,
|
|
179
|
-
// Hijack stopPropagation, which just sets a flag
|
|
180
|
-
stopPropagation() {
|
|
181
|
-
// https://github.com/pmndrs/react-three-fiber/issues/596
|
|
182
|
-
// Events are not allowed to stop propagation if the pointer has been captured
|
|
183
|
-
const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId);
|
|
184
|
-
// We only authorize stopPropagation...
|
|
185
|
-
if (
|
|
186
|
-
// ...if this pointer hasn't been captured
|
|
187
|
-
!capturesForPointer ||
|
|
188
|
-
// ... or if the hit object is capturing the pointer
|
|
189
|
-
capturesForPointer.has(hit.eventObject)) {
|
|
190
|
-
raycastEvent.stopped = localState.stopped = true;
|
|
191
|
-
// Propagation is stopped, remove all other hover records
|
|
192
|
-
// An event handler is only allowed to flush other handlers if it is hovered itself
|
|
193
|
-
if (internal.hovered.size &&
|
|
194
|
-
Array.from(internal.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
|
|
195
|
-
// Objects cannot flush out higher up objects that have already caught the event
|
|
196
|
-
const higher = intersections.slice(0, intersections.indexOf(hit));
|
|
197
|
-
cancelPointer([...higher, hit]);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
// there should be a distinction between target and currentTarget
|
|
202
|
-
target: {
|
|
203
|
-
hasPointerCapture,
|
|
204
|
-
setPointerCapture,
|
|
205
|
-
releasePointerCapture,
|
|
206
|
-
},
|
|
207
|
-
currentTarget: {
|
|
208
|
-
hasPointerCapture,
|
|
209
|
-
setPointerCapture,
|
|
210
|
-
releasePointerCapture,
|
|
211
|
-
},
|
|
212
|
-
nativeEvent: event,
|
|
213
|
-
};
|
|
214
|
-
// Call subscribers
|
|
215
|
-
callback(raycastEvent);
|
|
216
|
-
// Event bubbling may be interrupted by stopPropagation
|
|
217
|
-
if (localState.stopped === true)
|
|
218
|
-
break;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
return intersections;
|
|
222
|
-
}
|
|
223
|
-
function cancelPointer(intersections) {
|
|
224
|
-
const { internal } = stateFactory();
|
|
225
|
-
for (const hoveredObj of internal.hovered.values()) {
|
|
226
|
-
// When no objects were hit or the hovered object wasn't found underneath the cursor
|
|
227
|
-
// we call onPointerOut and delete the object from the hovered-elements map
|
|
228
|
-
if (!intersections.length ||
|
|
229
|
-
!intersections.find((hit) => hit.object === hoveredObj.object &&
|
|
230
|
-
hit.index === hoveredObj.index &&
|
|
231
|
-
hit.instanceId === hoveredObj.instanceId)) {
|
|
232
|
-
const eventObject = hoveredObj.eventObject;
|
|
233
|
-
const instance = getInstanceLocalState(eventObject);
|
|
234
|
-
const handlers = instance?.handlers;
|
|
235
|
-
internal.hovered.delete(makeId(hoveredObj));
|
|
236
|
-
if (instance?.eventCount) {
|
|
237
|
-
// Clear out intersects, they are outdated by now
|
|
238
|
-
const data = { ...hoveredObj, intersections };
|
|
239
|
-
handlers?.pointerout?.(data);
|
|
240
|
-
handlers?.pointerleave?.(data);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
function pointerMissed(event, objects) {
|
|
246
|
-
for (let i = 0; i < objects.length; i++) {
|
|
247
|
-
const instance = getInstanceLocalState(objects[i]);
|
|
248
|
-
instance?.handlers.pointermissed?.(event);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
function handlePointer(name) {
|
|
252
|
-
// Deal with cancelation
|
|
253
|
-
switch (name) {
|
|
254
|
-
case 'pointerleave':
|
|
255
|
-
case 'pointercancel':
|
|
256
|
-
return () => cancelPointer([]);
|
|
257
|
-
case 'lostpointercapture':
|
|
258
|
-
return (event) => {
|
|
259
|
-
const { internal } = stateFactory();
|
|
260
|
-
if ('pointerId' in event && !internal.capturedMap.has(event.pointerId)) {
|
|
261
|
-
// If the object event interface had onLostPointerCapture, we'd call it here on every
|
|
262
|
-
// object that's getting removed.
|
|
263
|
-
internal.capturedMap.delete(event.pointerId);
|
|
264
|
-
cancelPointer([]);
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
// Any other pointer goes here ...
|
|
269
|
-
return function handleEvent(event) {
|
|
270
|
-
const { onPointerMissed, internal } = stateFactory();
|
|
271
|
-
// prepareRay(event)
|
|
272
|
-
internal.lastEvent = event;
|
|
273
|
-
// Get fresh intersects
|
|
274
|
-
const isPointerMove = name === 'pointermove';
|
|
275
|
-
const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
|
|
276
|
-
const filter = isPointerMove ? filterPointerEvents : undefined;
|
|
277
|
-
// const hits = patchIntersects(intersect(filter), event)
|
|
278
|
-
const hits = intersect(event, filter);
|
|
279
|
-
const delta = isClickEvent ? calculateDistance(event) : 0;
|
|
280
|
-
// Save initial coordinates on pointer-down
|
|
281
|
-
if (name === 'pointerdown') {
|
|
282
|
-
internal.initialClick = [event.offsetX, event.offsetY];
|
|
283
|
-
internal.initialHits = hits.map((hit) => hit.eventObject);
|
|
284
|
-
}
|
|
285
|
-
// If a click yields no results, pass it back to the user as a miss
|
|
286
|
-
// Missed events have to come first in order to establish user-land side-effect clean up
|
|
287
|
-
if (isClickEvent && !hits.length) {
|
|
288
|
-
if (delta <= 2) {
|
|
289
|
-
pointerMissed(event, internal.interaction);
|
|
290
|
-
if (onPointerMissed)
|
|
291
|
-
onPointerMissed(event);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// Take care of unhover
|
|
295
|
-
if (isPointerMove)
|
|
296
|
-
cancelPointer(hits);
|
|
297
|
-
function onIntersect(data) {
|
|
298
|
-
const eventObject = data.eventObject;
|
|
299
|
-
const instance = getInstanceLocalState(eventObject);
|
|
300
|
-
const handlers = instance?.handlers;
|
|
301
|
-
// Check presence of handlers
|
|
302
|
-
if (!instance?.eventCount)
|
|
303
|
-
return;
|
|
304
|
-
if (isPointerMove) {
|
|
305
|
-
// Move event ...
|
|
306
|
-
if (handlers?.pointerover ||
|
|
307
|
-
handlers?.pointerenter ||
|
|
308
|
-
handlers?.pointerout ||
|
|
309
|
-
handlers?.pointerleave) {
|
|
310
|
-
// When enter or out is present take care of hover-state
|
|
311
|
-
const id = makeId(data);
|
|
312
|
-
const hoveredItem = internal.hovered.get(id);
|
|
313
|
-
if (!hoveredItem) {
|
|
314
|
-
// If the object wasn't previously hovered, book it and call its handler
|
|
315
|
-
internal.hovered.set(id, data);
|
|
316
|
-
handlers.pointerover?.(data);
|
|
317
|
-
handlers.pointerenter?.(data);
|
|
318
|
-
}
|
|
319
|
-
else if (hoveredItem.stopped) {
|
|
320
|
-
// If the object was previously hovered and stopped, we shouldn't allow other items to proceed
|
|
321
|
-
data.stopPropagation();
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// Call mouse move
|
|
325
|
-
handlers?.pointermove?.(data);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
// All other events ...
|
|
329
|
-
const handler = handlers[name];
|
|
330
|
-
if (handler) {
|
|
331
|
-
// Forward all events back to their respective handlers with the exception of click events,
|
|
332
|
-
// which must use the initial target
|
|
333
|
-
if (!isClickEvent || internal.initialHits.includes(eventObject)) {
|
|
334
|
-
// Missed events have to come first
|
|
335
|
-
pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
|
|
336
|
-
// Now call the handler
|
|
337
|
-
handler(data);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
// Trigger onPointerMissed on all elements that have pointer over/out handlers, but not click and weren't hit
|
|
342
|
-
if (isClickEvent && internal.initialHits.includes(eventObject)) {
|
|
343
|
-
pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
handleIntersects(hits, event, delta, onIntersect);
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
return { handlePointer };
|
|
352
|
-
}
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci10aHJlZS9zcmMvbGliL3V0aWxzL2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQVMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQ2xDLFdBQXNFLEVBQ3RFLEdBQW1CLEVBQ25CLFFBQXNELEVBQ3RELFNBQWlCO0lBRWpCLE1BQU0sV0FBVyxHQUF3QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLElBQUksV0FBVyxFQUFFO1FBQ2IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQix5REFBeUQ7UUFDekQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyQixXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkQ7S0FDSjtBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsWUFBNkIsRUFBRSxNQUFzQjtJQUNyRixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDcEMsdURBQXVEO0lBQ3ZELFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUN4RSxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFD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OzRCQUM1RCxhQUFhLENBQ1QsS0FBSyxFQUNMLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ2xGLENBQUM7eUJBQ0w7cUJBQ0o7aUJBQ0o7WUFDTCxDQUFDO1lBRUQsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUge1xuICAgIE5ndERvbUV2ZW50LFxuICAgIE5ndEV2ZW50SGFuZGxlcnMsXG4gICAgTmd0SW50ZXJzZWN0aW9uLFxuICAgIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0LFxuICAgIE5ndFN0YXRlRmFjdG9yeSxcbiAgICBOZ3RUaHJlZUV2ZW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRJbnN0YW5jZUxvY2FsU3RhdGUgfSBmcm9tICcuL2dldC1pbnN0YW5jZS1sb2NhbC1zdGF0ZSc7XG5pbXBvcnQgeyBtYWtlSWQgfSBmcm9tICcuL21ha2UnO1xuXG4vKipcbiAqIFJlbGVhc2UgcG9pbnRlciBjYXB0dXJlcy5cbiAqIFRoaXMgaXMgY2FsbGVkIGJ5IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpbiB0aGUgQVBJLCBhbmQgd2hlbiBhbiBvYmplY3QgaXMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoXG4gICAgY2FwdHVyZWRNYXA6IE1hcDxudW1iZXIsIE1hcDxUSFJFRS5PYmplY3QzRCwgTmd0UG9pbnRlckNhcHR1cmVUYXJnZXQ+PixcbiAgICBvYmo6IFRIUkVFLk9iamVjdDNELFxuICAgIGNhcHR1cmVzOiBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0PixcbiAgICBwb2ludGVySWQ6IG51bWJlclxuKTogdm9pZCB7XG4gICAgY29uc3QgY2FwdHVyZURhdGE6IE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0IHwgdW5kZWZpbmVkID0gY2FwdHVyZXMuZ2V0KG9iaik7XG4gICAgaWYgKGNhcHR1cmVEYXRhKSB7XG4gICAgICAgIGNhcHR1cmVzLmRlbGV0ZShvYmopO1xuICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjYXB0dXJpbmcgb2JqZWN0IGZvciB0aGlzIHBvaW50ZXJcbiAgICAgICAgaWYgKGNhcHR1cmVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGNhcHR1cmVkTWFwLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICAgICAgY2FwdHVyZURhdGEudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW50ZXJhY3Rpdml0eShzdGF0ZUZhY3Rvcnk6IE5ndFN0YXRlRmFjdG9yeSwgb2JqZWN0OiBUSFJFRS5PYmplY3QzRCkge1xuICAgIGNvbnN0IHsgaW50ZXJuYWwgfSA9IHN0YXRlRmFjdG9yeSgpO1xuICAgIC8vIFJlbW92ZXMgZXZlcnkgdHJhY2Ugb2YgYW4gb2JqZWN0IGZyb20gdGhlIGRhdGEgc3RvcmVcbiAgICBpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcbiAgICBpbnRlcm5hbC5pbml0aWFsSGl0cyA9IGludGVybmFsLmluaXRpYWxIaXRzLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcbiAgICBpbnRlcm5hbC5ob3ZlcmVkLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmV2ZW50T2JqZWN0ID09PSBvYmplY3QgfHwgdmFsdWUub2JqZWN0ID09PSBvYmplY3QpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCBpbnRlcnNlY3RzLCB0aGV5IGFyZSBvdXRkYXRlZCBieSBub3dcbiAgICAgICAgICAgIGludGVybmFsLmhvdmVyZWQuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5mb3JFYWNoKChjYXB0dXJlcywgcG9pbnRlcklkKSA9PiB7XG4gICAgICAgIHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBvYmplY3QsIGNhcHR1cmVzLCBwb2ludGVySWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzKHN0YXRlRmFjdG9yeTogTmd0U3RhdGVGYWN0b3J5KSB7XG4gICAgLyoqIENhbGN1bGF0ZXMgZGVsdGEgKi9cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbCB9ID0gc3RhdGVGYWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGR4ID0gZXZlbnQub2Zmc2V0WCAtIGludGVybmFsLmluaXRpYWxDbGlja1swXTtcbiAgICAgICAgY29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyB0cnVlIGlmIGFuIGluc3RhbmNlIGhhcyBhIHZhbGlkIHBvaW50ZXItZXZlbnQgcmVnaXN0ZXJlZCwgdGhpcyBleGNsdWRlcyBzY3JvbGwsIGNsaWNrcyBldGMgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXJQb2ludGVyRXZlbnRzKG9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKChvYmopID0+XG4gICAgICAgICAgICBbJ21vdmUnLCAnb3ZlcicsICdlbnRlcicsICdvdXQnLCAnbGVhdmUnXS5zb21lKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gKCdwb2ludGVyJyArIG5hbWUpIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlTG9jYWxTdGF0ZShvYmopPy5oYW5kbGVyc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoZXZlbnQ6IE5ndERvbUV2ZW50LCBmaWx0ZXI/OiAob2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSkgPT4gVEhSRUUuT2JqZWN0M0RbXSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0YXRlRmFjdG9yeSgpO1xuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdID0gW107XG4gICAgICAgIC8vIEFsbG93IGNhbGxlcnMgdG8gZWxpbWluYXRlIGV2ZW50IG9iamVjdHNcbiAgICAgICAgY29uc3QgZXZlbnRzT2JqZWN0cyA9IGZpbHRlciA/IGZpbHRlcihzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbikgOiBzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbjtcbiAgICAgICAgLy8gUmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50c09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlU3RhdGUgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUoZXZlbnRzT2JqZWN0c1tpXSk/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPSB1bmRlZmluZWQhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5wcmV2aW91c1N0YXRlRmFjdG9yeSkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJvb3QtbGV2ZWwgcG9pbnRlciBhbmQgcmF5IGFyZSBzZXQgdXBcbiAgICAgICAgICAgIHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsICgpID0+IHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJheWNhc3Qob2JqOiBUSFJFRS5PYmplY3QzRDxUSFJFRS5FdmVudD4pIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFuY2VMb2NhbFN0YXRlKG9iaik/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgLy8gU2tpcCBldmVudCBoYW5kbGluZyB3aGVuIG5vRXZlbnRzIGlzIHNldCwgb3Igd2hlbiB0aGUgcmF5Y2FzdGVycyBjYW1lcmEgaXMgbnVsbFxuICAgICAgICAgICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuZXZlbnRzLmVuYWJsZWQgfHwgc3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkIHdlIGhhdmUgdG8gY2FsbCB0aGUgZXZlbnQgbGF5ZXJzIHVwZGF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKHN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsICgpID0+IHN0YXRlLCBzdGF0ZS5wcmV2aW91c1N0YXRlRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbWVyYSBpcyBzdGlsbCB1bmRlZmluZWQgd2UgaGF2ZSB0byBza2lwIHRoaXMgbGF5ZXIgZW50aXJlbHlcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gdW5kZWZpbmVkKSBzdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gbnVsbCE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEludGVyc2VjdCBvYmplY3QgYnkgb2JqZWN0XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA/IHN0YXRlLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3Qob2JqLCB0cnVlKSA6IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sbGVjdCBldmVudHNcbiAgICAgICAgbGV0IGhpdHM6IFRIUkVFLkludGVyc2VjdGlvbjxUSFJFRS5PYmplY3QzRDxUSFJFRS5FdmVudD4+W10gPSBldmVudHNPYmplY3RzXG4gICAgICAgICAgICAvLyBJbnRlcnNlY3Qgb2JqZWN0c1xuICAgICAgICAgICAgLmZsYXRNYXAoaGFuZGxlUmF5Y2FzdClcbiAgICAgICAgICAgIC8vIFNvcnQgYnkgZXZlbnQgcHJpb3JpdHkgYW5kIGRpc3RhbmNlXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFTdGF0ZSA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShhLm9iamVjdCk/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJTdGF0ZSA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShiLm9iamVjdCk/LnN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIGlmICghYVN0YXRlIHx8ICFiU3RhdGUpIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBiU3RhdGUuZXZlbnRzLnByaW9yaXR5IC0gYVN0YXRlLmV2ZW50cy5wcmlvcml0eSB8fCBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG1ha2VJZChpdGVtIGFzIE5ndEludGVyc2VjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZXMuaGFzKGlkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvaXNzdWVzLzE2MDMxXG4gICAgICAgIC8vIEFsbG93IGN1c3RvbSB1c2VybGFuZCBpbnRlcnNlY3Qgc29ydCBvcmRlciwgdGhpcyBsaWtlbHkgb25seSBtYWtlcyBzZW5zZSBvbiB0aGUgcm9vdCBmaWx0ZXJcbiAgICAgICAgaWYgKHN0YXRlLmV2ZW50cy5maWx0ZXIpIGhpdHMgPSBzdGF0ZS5ldmVudHMuZmlsdGVyKGhpdHMsICgpID0+IHN0YXRlKTtcblxuICAgICAgICAvLyBCdWJibGUgdXAgdGhlIGV2ZW50cywgZmluZCB0aGUgZXZlbnQgc291cmNlIChldmVudE9iamVjdClcbiAgICAgICAgZm9yIChjb25zdCBoaXQgb2YgaGl0cykge1xuICAgICAgICAgICAgbGV0IGV2ZW50T2JqZWN0OiBUSFJFRS5PYmplY3QzRCB8IG51bGwgPSBoaXQub2JqZWN0O1xuICAgICAgICAgICAgLy8gQnViYmxlIGV2ZW50IHVwXG4gICAgICAgICAgICB3aGlsZSAoZXZlbnRPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0SW5zdGFuY2VMb2NhbFN0YXRlKGV2ZW50T2JqZWN0KT8uZXZlbnRDb3VudCkgaW50ZXJzZWN0aW9ucy5wdXNoKHsgLi4uaGl0LCBldmVudE9iamVjdCB9KTtcbiAgICAgICAgICAgICAgICBldmVudE9iamVjdCA9IGV2ZW50T2JqZWN0LnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBpbnRlcmFjdGlvbiBpcyBjYXB0dXJlZCwgbWFrZSBhbGwgY2FwdHVyaW5nIHRhcmdldHMgcGFydCBvZiB0aGUgaW50ZXJzZWN0LlxuICAgICAgICBpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2FwdHVyZURhdGEgb2Ygc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCkhLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGNhcHR1cmVEYXRhLmludGVyc2VjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqICBIYW5kbGVzIGludGVyc2VjdGlvbnMgYnkgZm9yd2FyZGluZyB0aGVtIHRvIGhhbmRsZXJzICovXG4gICAgZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcbiAgICAgICAgaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10sXG4gICAgICAgIGV2ZW50OiBOZ3REb21FdmVudCxcbiAgICAgICAgZGVsdGE6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChldmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm9vdFN0YXRlID0gc3RhdGVGYWN0b3J5KCk7XG4gICAgICAgIC8vIElmIGFueXRoaW5nIGhhcyBiZWVuIGZvdW5kLCBmb3J3YXJkIGl0IHRvIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBoaXQgb2YgaW50ZXJzZWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFuY2VMb2NhbFN0YXRlKGhpdC5vYmplY3QpPy5zdGF0ZUZhY3RvcnkoKSB8fCByb290U3RhdGU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByYXljYXN0ZXIsIHBvaW50ZXIsIGNhbWVyYSwgaW50ZXJuYWwgfSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJvamVjdGVkUG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMyhwb2ludGVyLngsIHBvaW50ZXIueSwgMCkudW5wcm9qZWN0KGNhbWVyYSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKT8uaGFzKGhpdC5ldmVudE9iamVjdCkgPz8gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVEYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uOiBoaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBvaW50ZXJJZCB3YXMgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgYWRkIHRoZSBoaXQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBjYXB0dXJlZE1hcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmNhcHR1cmVkTWFwLmdldChpZCkhLnNldChoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIG5vdCBwcmV2aW91c2x5IGNhcHR1cmVkLCB3ZSBjcmVhdGUgYSBtYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFzdGVyIGFjY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmNhcHR1cmVkTWFwLnNldChpZCwgbmV3IE1hcChbW2hpdC5ldmVudE9iamVjdCwgY2FwdHVyZURhdGFdXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGV2ZW50IG5vd1xuICAgICAgICAgICAgICAgICAgICAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGlkKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsZWFzZVBvaW50ZXJDYXB0dXJlID0gKGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZXMgPSBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVzLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIG5hdGl2ZSBldmVudCBwcm9wc1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RFdmVudFByb3BzOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGV2ZW50J3MgcHJvcGVydGllcyBpbmNsdWRpbmcgdGhlIGluaGVyaXRlZCBvbmVzLiBOYXRpdmUgUG9pbnRlckV2ZW50cyBoYXZlIG1vc3Qgb2YgdGhlaXIgcHJvcHMgYXMgZ2V0dGVycyB3aGljaCBhcmUgaW5oZXJpdGVkLCBidXQgcG9seWZpbGxlZCBQb2ludGVyRXZlbnRzIGhhdmUgdGhlbSBhbGwgYXMgdGhlaXIgb3duIHByb3BlcnRpZXMgKGkuZS4gbm90IGluaGVyaXRlZCkuIFdlIGNhbid0IHVzZSBPYmplY3Qua2V5cygpIG9yIE9iamVjdC5lbnRyaWVzKCkgYXMgdGhleSBvbmx5IHJldHVybiBcIm93blwiIHByb3BlcnRpZXM7IG5vciBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpIGFzIHRoYXQgKmRvZXNuJ3QqIHJldHVybiBcIm93blwiIHByb3BlcnRpZXMsIG9ubHkgaW5oZXJpdGVkIG9uZXMuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZXZlbnRbcHJvcCBhcyBrZXlvZiBOZ3REb21FdmVudF07XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29weSBvdmVyIGF0b21pY3MsIGxlYXZlIGZ1bmN0aW9ucyBhbG9uZSBhcyB0aGVzZSBzaG91bGQgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGFzIGV2ZW50Lm5hdGl2ZUV2ZW50LmZuKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ2Z1bmN0aW9uJykgZXh0cmFjdEV2ZW50UHJvcHNbcHJvcF0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYXljYXN0RXZlbnQ6IE5ndFRocmVlRXZlbnQ8Tmd0RG9tRXZlbnQ+ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5oaXQsXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4dHJhY3RFdmVudFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhLFxuICAgICAgICAgICAgICAgICAgICB1bnByb2plY3RlZFBvaW50LFxuICAgICAgICAgICAgICAgICAgICByYXk6IHJheWNhc3Rlci5yYXksXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogY2FtZXJhLFxuICAgICAgICAgICAgICAgICAgICAvLyBIaWphY2sgc3RvcFByb3BhZ2F0aW9uLCB3aGljaCBqdXN0IHNldHMgYSBmbGFnXG4gICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW5kcnMvcmVhY3QtdGhyZWUtZmliZXIvaXNzdWVzLzU5NlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnRzIGFyZSBub3QgYWxsb3dlZCB0byBzdG9wIHByb3BhZ2F0aW9uIGlmIHRoZSBwb2ludGVyIGhhcyBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlc0ZvclBvaW50ZXIgPSAncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhdXRob3JpemUgc3RvcFByb3BhZ2F0aW9uLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uaWYgdGhpcyBwb2ludGVyIGhhc24ndCBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBvciBpZiB0aGUgaGl0IG9iamVjdCBpcyBjYXB0dXJpbmcgdGhlIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlc0ZvclBvaW50ZXIuaGFzKGhpdC5ldmVudE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGlvbiBpcyBzdG9wcGVkLCByZW1vdmUgYWxsIG90aGVyIGhvdmVyIHJlY29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBldmVudCBoYW5kbGVyIGlzIG9ubHkgYWxsb3dlZCB0byBmbHVzaCBvdGhlciBoYW5kbGVycyBpZiBpdCBpcyBob3ZlcmVkIGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zaXplICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkuZmluZCgoaSkgPT4gaS5ldmVudE9iamVjdCA9PT0gaGl0LmV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3RzIGNhbm5vdCBmbHVzaCBvdXQgaGlnaGVyIHVwIG9iamVjdHMgdGhhdCBoYXZlIGFscmVhZHkgY2F1Z2h0IHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9pbnRlcihbLi4uaGlnaGVyLCBoaXRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGFyZ2V0IGFuZCBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUG9pbnRlckNhcHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUG9pbnRlckNhcHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxsIHN1YnNjcmliZXJzXG4gICAgICAgICAgICAgICAgY2FsbGJhY2socmF5Y2FzdEV2ZW50KTtcbiAgICAgICAgICAgICAgICAvLyBFdmVudCBidWJibGluZyBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUuc3RvcHBlZCA9PT0gdHJ1ZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsUG9pbnRlcihpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSkge1xuICAgICAgICBjb25zdCB7IGludGVybmFsIH0gPSBzdGF0ZUZhY3RvcnkoKTtcbiAgICAgICAgZm9yIChjb25zdCBob3ZlcmVkT2JqIG9mIGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gbm8gb2JqZWN0cyB3ZXJlIGhpdCBvciB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuICAgICAgICAgICAgLy8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGhpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5vYmplY3QgPT09IGhvdmVyZWRPYmoub2JqZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuaW5kZXggPT09IGhvdmVyZWRPYmouaW5kZXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5pbnN0YW5jZUlkID09PSBob3ZlcmVkT2JqLmluc3RhbmNlSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE9iamVjdCA9IGhvdmVyZWRPYmouZXZlbnRPYmplY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gaW5zdGFuY2U/LmhhbmRsZXJzO1xuICAgICAgICAgICAgICAgIGludGVybmFsLmhvdmVyZWQuZGVsZXRlKG1ha2VJZChob3ZlcmVkT2JqKSk7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlPy5ldmVudENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCBpbnRlcnNlY3RzLCB0aGV5IGFyZSBvdXRkYXRlZCBieSBub3dcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgLi4uaG92ZXJlZE9iaiwgaW50ZXJzZWN0aW9ucyB9O1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm91dD8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJsZWF2ZT8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2ludGVyTWlzc2VkKGV2ZW50OiBNb3VzZUV2ZW50LCBvYmplY3RzOiBUSFJFRS5PYmplY3QzRFtdKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZUxvY2FsU3RhdGUob2JqZWN0c1tpXSk7XG4gICAgICAgICAgICBpbnN0YW5jZT8uaGFuZGxlcnMucG9pbnRlcm1pc3NlZD8uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVBvaW50ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIERlYWwgd2l0aCBjYW5jZWxhdGlvblxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICAgICAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUG9pbnRlcihbXSk7XG4gICAgICAgICAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQ6IE5ndERvbUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaW50ZXJuYWwgfSA9IHN0YXRlRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgIWludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGV2ZW50IGludGVyZmFjZSBoYWQgb25Mb3N0UG9pbnRlckNhcHR1cmUsIHdlJ2QgY2FsbCBpdCBoZXJlIG9uIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgdGhhdCdzIGdldHRpbmcgcmVtb3ZlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmNhcHR1cmVkTWFwLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9pbnRlcihbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW55IG90aGVyIHBvaW50ZXIgZ29lcyBoZXJlIC4uLlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQ6IE5ndERvbUV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9uUG9pbnRlck1pc3NlZCwgaW50ZXJuYWwgfSA9IHN0YXRlRmFjdG9yeSgpO1xuXG4gICAgICAgICAgICAvLyBwcmVwYXJlUmF5KGV2ZW50KVxuICAgICAgICAgICAgaW50ZXJuYWwubGFzdEV2ZW50ID0gZXZlbnQ7XG5cbiAgICAgICAgICAgIC8vIEdldCBmcmVzaCBpbnRlcnNlY3RzXG4gICAgICAgICAgICBjb25zdCBpc1BvaW50ZXJNb3ZlID0gbmFtZSA9PT0gJ3BvaW50ZXJtb3ZlJztcbiAgICAgICAgICAgIGNvbnN0IGlzQ2xpY2tFdmVudCA9IG5hbWUgPT09ICdjbGljaycgfHwgbmFtZSA9PT0gJ2NvbnRleHRtZW51JyB8fCBuYW1lID09PSAnZGJsY2xpY2snO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gaXNQb2ludGVyTW92ZSA/IGZpbHRlclBvaW50ZXJFdmVudHMgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBjb25zdCBoaXRzID0gcGF0Y2hJbnRlcnNlY3RzKGludGVyc2VjdChmaWx0ZXIpLCBldmVudClcbiAgICAgICAgICAgIGNvbnN0IGhpdHMgPSBpbnRlcnNlY3QoZXZlbnQsIGZpbHRlcik7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGlzQ2xpY2tFdmVudCA/IGNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSA6IDA7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgaW5pdGlhbCBjb29yZGluYXRlcyBvbiBwb2ludGVyLWRvd25cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAncG9pbnRlcmRvd24nKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWwuaW5pdGlhbENsaWNrID0gW2V2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFldO1xuICAgICAgICAgICAgICAgIGludGVybmFsLmluaXRpYWxIaXRzID0gaGl0cy5tYXAoKGhpdCkgPT4gaGl0LmV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgYSBjbGljayB5aWVsZHMgbm8gcmVzdWx0cywgcGFzcyBpdCBiYWNrIHRvIHRoZSB1c2VyIGFzIGEgbWlzc1xuICAgICAgICAgICAgLy8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3QgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHVzZXItbGFuZCBzaWRlLWVmZmVjdCBjbGVhbiB1cFxuICAgICAgICAgICAgaWYgKGlzQ2xpY2tFdmVudCAmJiAhaGl0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPD0gMikge1xuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTWlzc2VkKGV2ZW50LCBpbnRlcm5hbC5pbnRlcmFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvblBvaW50ZXJNaXNzZWQpIG9uUG9pbnRlck1pc3NlZChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGFrZSBjYXJlIG9mIHVuaG92ZXJcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZlKSBjYW5jZWxQb2ludGVyKGhpdHMpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBvbkludGVyc2VjdChkYXRhOiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50Pikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50T2JqZWN0ID0gZGF0YS5ldmVudE9iamVjdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlTG9jYWxTdGF0ZShldmVudE9iamVjdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpbnN0YW5jZT8uaGFuZGxlcnM7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgcHJlc2VuY2Ugb2YgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlPy5ldmVudENvdW50KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIGV2ZW50IC4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm92ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVyZW50ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVyb3V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcmxlYXZlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBlbnRlciBvciBvdXQgaXMgcHJlc2VudCB0YWtlIGNhcmUgb2YgaG92ZXItc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gbWFrZUlkKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG92ZXJlZEl0ZW0gPSBpbnRlcm5hbC5ob3ZlcmVkLmdldChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhvdmVyZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCB3YXNuJ3QgcHJldmlvdXNseSBob3ZlcmVkLCBib29rIGl0IGFuZCBjYWxsIGl0cyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zZXQoaWQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnBvaW50ZXJvdmVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnBvaW50ZXJlbnRlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG92ZXJlZEl0ZW0uc3RvcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3Qgd2FzIHByZXZpb3VzbHkgaG92ZXJlZCBhbmQgc3RvcHBlZCwgd2Ugc2hvdWxkbid0IGFsbG93IG90aGVyIGl0ZW1zIHRvIHByb2NlZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgbW91c2UgbW92ZVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm1vdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIGV2ZW50cyAuLi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzIVtuYW1lIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnNdIGFzIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yd2FyZCBhbGwgZXZlbnRzIGJhY2sgdG8gdGhlaXIgcmVzcGVjdGl2ZSBoYW5kbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgY2xpY2sgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbXVzdCB1c2UgdGhlIGluaXRpYWwgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2xpY2tFdmVudCB8fCBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXNzZWQgZXZlbnRzIGhhdmUgdG8gY29tZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJNaXNzZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgY2FsbCB0aGUgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBvblBvaW50ZXJNaXNzZWQgb24gYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBwb2ludGVyIG92ZXIvb3V0IGhhbmRsZXJzLCBidXQgbm90IGNsaWNrIGFuZCB3ZXJlbid0IGhpdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2xpY2tFdmVudCAmJiBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyTWlzc2VkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaW50ZXJhY3Rpb24uZmlsdGVyKChvYmplY3QpID0+ICFpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhvYmplY3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhbmRsZUludGVyc2VjdHMoaGl0cywgZXZlbnQsIGRlbHRhLCBvbkludGVyc2VjdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaGFuZGxlUG9pbnRlciB9O1xufVxuIl19
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export function getInstanceLocalState(obj) {
|
|
2
|
-
if (!obj)
|
|
3
|
-
return undefined;
|
|
4
|
-
return obj['__ngt__'];
|
|
5
|
-
}
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWluc3RhbmNlLWxvY2FsLXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci10aHJlZS9zcmMvbGliL3V0aWxzL2dldC1pbnN0YW5jZS1sb2NhbC1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLEdBQTBCO0lBRTFCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsT0FBUSxHQUFvQixDQUFDLFNBQVMsQ0FBMEIsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEluc3RhbmNlTG9jYWxTdGF0ZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlTG9jYWxTdGF0ZTxUSW5zdGFuY2UgZXh0ZW5kcyBvYmplY3QgPSBOZ3RBbnlSZWNvcmQ+KFxuICAgIG9iajogVEluc3RhbmNlIHwgdW5kZWZpbmVkXG4pOiBOZ3RJbnN0YW5jZUxvY2FsU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiAob2JqIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXSBhcyBOZ3RJbnN0YW5jZUxvY2FsU3RhdGU7XG59XG4iXX0=
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { inject, InjectionToken } from '@angular/core';
|
|
2
|
-
export function createInjection(description, { defaultValueOrFactory, provideValueFactory, } = {}) {
|
|
3
|
-
const factory = (defaultValueOrFactory && typeof defaultValueOrFactory === 'function'
|
|
4
|
-
? defaultValueOrFactory
|
|
5
|
-
: () => defaultValueOrFactory);
|
|
6
|
-
const injectionToken = new InjectionToken(description, { factory });
|
|
7
|
-
function injectFn(options = {}) {
|
|
8
|
-
return inject(injectionToken, options);
|
|
9
|
-
}
|
|
10
|
-
function provideFn(value) {
|
|
11
|
-
return {
|
|
12
|
-
provide: injectionToken,
|
|
13
|
-
useValue: provideValueFactory ? provideValueFactory(value) : value,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
return [injectFn, provideFn, injectionToken];
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci10aHJlZS9zcmMvbGliL3V0aWxzL2luamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBMkIsTUFBTSxlQUFlLENBQUM7QUFFaEYsTUFBTSxVQUFVLGVBQWUsQ0FJM0IsV0FBbUIsRUFDbkIsRUFDSSxxQkFBcUIsRUFDckIsbUJBQW1CLE1BSW5CLEVBQUU7SUFNTixNQUFNLE9BQU8sR0FBRyxDQUNaLHFCQUFxQixJQUFJLE9BQU8scUJBQXFCLEtBQUssVUFBVTtRQUNoRSxDQUFDLENBQUMscUJBQXFCO1FBQ3ZCLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FDZixDQUFDO0lBQ3ZCLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFcEUsU0FBUyxRQUFRLENBQUMsVUFBeUIsRUFBRTtRQUN6QyxPQUFPLE1BQU0sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFnQixDQUFDO0lBQzFELENBQUM7SUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFvQjtRQUNuQyxPQUFPO1lBQ0gsT0FBTyxFQUFFLGNBQWM7WUFDdkIsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNyRSxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGlvblRva2VuLCBJbmplY3RPcHRpb25zLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5qZWN0aW9uPFxuICAgIFRUb2tlblZhbHVlLFxuICAgIFRQcm92aWRlVmFsdWUgPSBUVG9rZW5WYWx1ZSBleHRlbmRzIG9iamVjdCA/IFBhcnRpYWw8VFRva2VuVmFsdWU+IDogVFRva2VuVmFsdWVcbj4oXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZU9yRmFjdG9yeSxcbiAgICAgICAgcHJvdmlkZVZhbHVlRmFjdG9yeSxcbiAgICB9OiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZU9yRmFjdG9yeT86IFRUb2tlblZhbHVlIHwgKCgpID0+IFRUb2tlblZhbHVlKTtcbiAgICAgICAgcHJvdmlkZVZhbHVlRmFjdG9yeT86ICh2YWx1ZTogVFByb3ZpZGVWYWx1ZSkgPT4gVFRva2VuVmFsdWU7XG4gICAgfSA9IHt9XG4pOiBbXG4gICAgaW5qZWN0Rm46IChvcHRpb25zPzogSW5qZWN0T3B0aW9ucykgPT4gVFRva2VuVmFsdWUsXG4gICAgcHJvdmlkZUZuOiAodmFsdWU6IFRQcm92aWRlVmFsdWUpID0+IFByb3ZpZGVyLFxuICAgIHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUVG9rZW5WYWx1ZT5cbl0ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSAoXG4gICAgICAgIGRlZmF1bHRWYWx1ZU9yRmFjdG9yeSAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlT3JGYWN0b3J5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZU9yRmFjdG9yeVxuICAgICAgICAgICAgOiAoKSA9PiBkZWZhdWx0VmFsdWVPckZhY3RvcnlcbiAgICApIGFzICgpID0+IFRUb2tlblZhbHVlO1xuICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gbmV3IEluamVjdGlvblRva2VuKGRlc2NyaXB0aW9uLCB7IGZhY3RvcnkgfSk7XG5cbiAgICBmdW5jdGlvbiBpbmplY3RGbihvcHRpb25zOiBJbmplY3RPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGluamVjdChpbmplY3Rpb25Ub2tlbiwgb3B0aW9ucykgYXMgVFRva2VuVmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvdmlkZUZuKHZhbHVlOiBUUHJvdmlkZVZhbHVlKTogUHJvdmlkZXIge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvdmlkZTogaW5qZWN0aW9uVG9rZW4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogcHJvdmlkZVZhbHVlRmFjdG9yeSA/IHByb3ZpZGVWYWx1ZUZhY3RvcnkodmFsdWUpIDogdmFsdWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtpbmplY3RGbiwgcHJvdmlkZUZuLCBpbmplY3Rpb25Ub2tlbl07XG59XG4iXX0=
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { is } from './is';
|
|
2
|
-
function createSubs(callback, subs) {
|
|
3
|
-
const sub = { callback };
|
|
4
|
-
subs.add(sub);
|
|
5
|
-
return () => void subs.delete(sub);
|
|
6
|
-
}
|
|
7
|
-
const globalEffects = new Set();
|
|
8
|
-
const globalAfterEffects = new Set();
|
|
9
|
-
const globalTailEffects = new Set();
|
|
10
|
-
/**
|
|
11
|
-
* Adds a global render callback which is called each frame.
|
|
12
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addEffect
|
|
13
|
-
*/
|
|
14
|
-
export const addEffect = (callback) => createSubs(callback, globalEffects);
|
|
15
|
-
/**
|
|
16
|
-
* Adds a global after-render callback which is called each frame.
|
|
17
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addAfterEffect
|
|
18
|
-
*/
|
|
19
|
-
export const addAfterEffect = (callback) => createSubs(callback, globalAfterEffects);
|
|
20
|
-
/**
|
|
21
|
-
* Adds a global callback which is called when rendering stops.
|
|
22
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addTail
|
|
23
|
-
*/
|
|
24
|
-
export const addTail = (callback) => createSubs(callback, globalTailEffects);
|
|
25
|
-
function run(effects, timestamp) {
|
|
26
|
-
if (!effects.size)
|
|
27
|
-
return;
|
|
28
|
-
for (const { callback } of effects.values()) {
|
|
29
|
-
callback(timestamp);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function flushGlobalEffects(type, timestamp) {
|
|
33
|
-
switch (type) {
|
|
34
|
-
case 'before':
|
|
35
|
-
return run(globalEffects, timestamp);
|
|
36
|
-
case 'after':
|
|
37
|
-
return run(globalAfterEffects, timestamp);
|
|
38
|
-
case 'tail':
|
|
39
|
-
return run(globalTailEffects, timestamp);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function render(timestamp, stateFactory, frame) {
|
|
43
|
-
const state = stateFactory();
|
|
44
|
-
// Run local effects
|
|
45
|
-
let delta = state.clock.getDelta();
|
|
46
|
-
// In frameloop='never' mode, clock times are updated using the provided timestamp
|
|
47
|
-
if (state.frameloop === 'never' && typeof timestamp === 'number') {
|
|
48
|
-
delta = timestamp - state.clock.elapsedTime;
|
|
49
|
-
state.clock.oldTime = state.clock.elapsedTime;
|
|
50
|
-
state.clock.elapsedTime = timestamp;
|
|
51
|
-
}
|
|
52
|
-
// Call subscribers (useFrame)
|
|
53
|
-
// subscribers = state.internal.subscribers;
|
|
54
|
-
for (let i = 0; i < state.internal.subscribers.length; i++) {
|
|
55
|
-
const subscriber = state.internal.subscribers[i];
|
|
56
|
-
const object = is.ref(subscriber.obj) ? subscriber.obj.value : subscriber.obj;
|
|
57
|
-
subscriber.callback({ ...state, delta, frame }, object);
|
|
58
|
-
}
|
|
59
|
-
// Render content
|
|
60
|
-
if (!state.internal.priority && state.gl.render)
|
|
61
|
-
state.gl.render(state.scene, state.camera);
|
|
62
|
-
// Decrease frame count
|
|
63
|
-
state.internal.frames = Math.max(0, state.internal.frames - 1);
|
|
64
|
-
return state.frameloop === 'always' ? 1 : state.internal.frames;
|
|
65
|
-
}
|
|
66
|
-
export function createLoop(roots) {
|
|
67
|
-
let running = false;
|
|
68
|
-
let repeat;
|
|
69
|
-
let frame;
|
|
70
|
-
let state;
|
|
71
|
-
function loop(timestamp) {
|
|
72
|
-
frame = requestAnimationFrame(loop);
|
|
73
|
-
running = true;
|
|
74
|
-
repeat = 0;
|
|
75
|
-
// Run effects
|
|
76
|
-
flushGlobalEffects('before', timestamp);
|
|
77
|
-
// Render all roots
|
|
78
|
-
for (const root of roots.values()) {
|
|
79
|
-
state = root();
|
|
80
|
-
// If the frameloop is invalidated, do not run another frame
|
|
81
|
-
if (state.internal.active &&
|
|
82
|
-
(state.frameloop === 'always' || state.internal.frames > 0) &&
|
|
83
|
-
!state.gl.xr?.isPresenting) {
|
|
84
|
-
repeat += render(timestamp, root);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Run after-effects
|
|
88
|
-
flushGlobalEffects('after', timestamp);
|
|
89
|
-
// Stop the loop if nothing invalidates it
|
|
90
|
-
if (repeat === 0) {
|
|
91
|
-
// Tail call effects, they are called when rendering stops
|
|
92
|
-
flushGlobalEffects('tail', timestamp);
|
|
93
|
-
// Flag end of operation
|
|
94
|
-
running = false;
|
|
95
|
-
return cancelAnimationFrame(frame);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
function invalidate(stateFactory, frames = 1) {
|
|
99
|
-
const stateToInvalidate = stateFactory?.();
|
|
100
|
-
if (!stateToInvalidate)
|
|
101
|
-
return roots.forEach((root) => invalidate(root, frames));
|
|
102
|
-
if (stateToInvalidate.gl.xr?.isPresenting ||
|
|
103
|
-
!stateToInvalidate.internal.active ||
|
|
104
|
-
stateToInvalidate.frameloop === 'never')
|
|
105
|
-
return;
|
|
106
|
-
// Increase frames, do not go higher than 60
|
|
107
|
-
stateToInvalidate.internal.frames = Math.min(60, stateToInvalidate.internal.frames + frames);
|
|
108
|
-
// If the render-loop isn't active, start it
|
|
109
|
-
if (!running) {
|
|
110
|
-
running = true;
|
|
111
|
-
requestAnimationFrame(loop);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
function advance(timestamp, runGlobalEffects = true, stateFactory, frame) {
|
|
115
|
-
if (runGlobalEffects)
|
|
116
|
-
flushGlobalEffects('before', timestamp);
|
|
117
|
-
if (!stateFactory)
|
|
118
|
-
for (const root of roots.values())
|
|
119
|
-
render(timestamp, root);
|
|
120
|
-
else
|
|
121
|
-
render(timestamp, stateFactory, frame);
|
|
122
|
-
if (runGlobalEffects)
|
|
123
|
-
flushGlobalEffects('after', timestamp);
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
loop,
|
|
127
|
-
/**
|
|
128
|
-
* Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
|
|
129
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
|
|
130
|
-
*/
|
|
131
|
-
invalidate,
|
|
132
|
-
/**
|
|
133
|
-
* Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
|
|
134
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
|
|
135
|
-
*/
|
|
136
|
-
advance,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi91dGlscy9sb29wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUIsU0FBUyxVQUFVLENBQUMsUUFBaUMsRUFBRSxJQUFxQjtJQUN4RSxNQUFNLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQW9CLElBQUksR0FBRyxFQUFFLENBQUM7QUFDakQsTUFBTSxrQkFBa0IsR0FBb0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN0RCxNQUFNLGlCQUFpQixHQUFvQixJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXJEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFFcEc7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBaUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlHOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQWlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUV0RyxTQUFTLEdBQUcsQ0FBQyxPQUF3QixFQUFFLFNBQWlCO0lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtRQUFF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akYsSUFDSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVk7WUFDckMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUNsQyxpQkFBaUIsQ0FBQyxTQUFTLEtBQUssT0FBTztZQUV2QyxPQUFPO1FBQ1gsNENBQTRDO1FBQzVDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUM3Riw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCxTQUFTLE9BQU8sQ0FDWixTQUFpQixFQUNqQixtQkFBNEIsSUFBSSxFQUNoQyxZQUE4QixFQUM5QixLQUFlO1FBRWYsSUFBSSxnQkFBZ0I7WUFBRSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFlBQVk7WUFBRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFDekUsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0I7WUFBRSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJO1FBQ0o7OztXQUdHO1FBQ0gsVUFBVTtRQUNWOzs7V0FHRztRQUNILE9BQU87S0FDVixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTmd0U3RhdGUsIE5ndFN0YXRlRmFjdG9yeSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi9pcyc7XG5cbmV4cG9ydCB0eXBlIE5ndEdsb2JhbFJlbmRlckNhbGxiYWNrID0gKHRpbWVTdGFtcDogbnVtYmVyKSA9PiB2b2lkO1xudHlwZSBOZ3RTdWJJdGVtID0geyBjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2sgfTtcblxuZnVuY3Rpb24gY3JlYXRlU3VicyhjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2ssIHN1YnM6IFNldDxOZ3RTdWJJdGVtPik6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IHN1YiA9IHsgY2FsbGJhY2sgfTtcbiAgICBzdWJzLmFkZChzdWIpO1xuICAgIHJldHVybiAoKSA9PiB2b2lkIHN1YnMuZGVsZXRlKHN1Yik7XG59XG5cbmNvbnN0IGdsb2JhbEVmZmVjdHM6IFNldDxOZ3RTdWJJdGVtPiA9IG5ldyBTZXQoKTtcbmNvbnN0IGdsb2JhbEFmdGVyRWZmZWN0czogU2V0PE5ndFN1Ykl0ZW0+ID0gbmV3IFNldCgpO1xuY29uc3QgZ2xvYmFsVGFpbEVmZmVjdHM6IFNldDxOZ3RTdWJJdGVtPiA9IG5ldyBTZXQoKTtcblxuLyoqXG4gKiBBZGRzIGEgZ2xvYmFsIHJlbmRlciBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgZWFjaCBmcmFtZS5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLnBtbmQucnMvcmVhY3QtdGhyZWUtZmliZXIvYXBpL2FkZGl0aW9uYWwtZXhwb3J0cyNhZGRFZmZlY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEVmZmVjdCA9IChjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2spID0+IGNyZWF0ZVN1YnMoY2FsbGJhY2ssIGdsb2JhbEVmZmVjdHMpO1xuXG4vKipcbiAqIEFkZHMgYSBnbG9iYWwgYWZ0ZXItcmVuZGVyIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBlYWNoIGZyYW1lLlxuICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkZEFmdGVyRWZmZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBhZGRBZnRlckVmZmVjdCA9IChjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2spID0+IGNyZWF0ZVN1YnMoY2FsbGJhY2ssIGdsb2JhbEFmdGVyRWZmZWN0cyk7XG5cbi8qKlxuICogQWRkcyBhIGdsb2JhbCBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiByZW5kZXJpbmcgc3RvcHMuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FwaS9hZGRpdGlvbmFsLWV4cG9ydHMjYWRkVGFpbFxuICovXG5leHBvcnQgY29uc3QgYWRkVGFpbCA9IChjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2spID0+IGNyZWF0ZVN1YnMoY2FsbGJhY2ssIGdsb2JhbFRhaWxFZmZlY3RzKTtcblxuZnVuY3Rpb24gcnVuKGVmZmVjdHM6IFNldDxOZ3RTdWJJdGVtPiwgdGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICBpZiAoIWVmZmVjdHMuc2l6ZSkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgeyBjYWxsYmFjayB9IG9mIGVmZmVjdHMudmFsdWVzKCkpIHtcbiAgICAgICAgY2FsbGJhY2sodGltZXN0YW1wKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEdsb2JhbEVmZmVjdFR5cGUgPSAnYmVmb3JlJyB8ICdhZnRlcicgfCAndGFpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaEdsb2JhbEVmZmVjdHModHlwZTogR2xvYmFsRWZmZWN0VHlwZSwgdGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnYmVmb3JlJzpcbiAgICAgICAgICAgIHJldHVybiBydW4oZ2xvYmFsRWZmZWN0cywgdGltZXN0YW1wKTtcbiAgICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICAgICAgcmV0dXJuIHJ1bihnbG9iYWxBZnRlckVmZmVjdHMsIHRpbWVzdGFtcCk7XG4gICAgICAgIGNhc2UgJ3RhaWwnOlxuICAgICAgICAgICAgcmV0dXJuIHJ1bihnbG9iYWxUYWlsRWZmZWN0cywgdGltZXN0YW1wKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlcih0aW1lc3RhbXA6IG51bWJlciwgc3RhdGVGYWN0b3J5OiBOZ3RTdGF0ZUZhY3RvcnksIGZyYW1lPzogWFJGcmFtZSkge1xuICAgIGNvbnN0IHN0YXRlID0gc3RhdGVGYWN0b3J5KCk7XG4gICAgLy8gUnVuIGxvY2FsIGVmZmVjdHNcbiAgICBsZXQgZGVsdGEgPSBzdGF0ZS5jbG9jay5nZXREZWx0YSgpO1xuICAgIC8vIEluIGZyYW1lbG9vcD0nbmV2ZXInIG1vZGUsIGNsb2NrIHRpbWVzIGFyZSB1cGRhdGVkIHVzaW5nIHRoZSBwcm92aWRlZCB0aW1lc3RhbXBcbiAgICBpZiAoc3RhdGUuZnJhbWVsb29wID09PSAnbmV2ZXInICYmIHR5cGVvZiB0aW1lc3RhbXAgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRlbHRhID0gdGltZXN0YW1wIC0gc3RhdGUuY2xvY2suZWxhcHNlZFRpbWU7XG4gICAgICAgIHN0YXRlLmNsb2NrLm9sZFRpbWUgPSBzdGF0ZS5jbG9jay5lbGFwc2VkVGltZTtcbiAgICAgICAgc3RhdGUuY2xvY2suZWxhcHNlZFRpbWUgPSB0aW1lc3RhbXA7XG4gICAgfVxuICAgIC8vIENhbGwgc3Vic2NyaWJlcnMgKHVzZUZyYW1lKVxuICAgIC8vIHN1YnNjcmliZXJzID0gc3RhdGUuaW50ZXJuYWwuc3Vic2NyaWJlcnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS5pbnRlcm5hbC5zdWJzY3JpYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gc3RhdGUuaW50ZXJuYWwuc3Vic2NyaWJlcnNbaV07XG4gICAgICAgIGNvbnN0IG9iamVjdCA9IGlzLnJlZihzdWJzY3JpYmVyLm9iaikgPyBzdWJzY3JpYmVyLm9iai52YWx1ZSA6IHN1YnNjcmliZXIub2JqO1xuICAgICAgICBzdWJzY3JpYmVyLmNhbGxiYWNrKHsgLi4uc3RhdGUsIGRlbHRhLCBmcmFtZSB9LCBvYmplY3QpO1xuICAgIH1cbiAgICAvLyBSZW5kZXIgY29udGVudFxuICAgIGlmICghc3RhdGUuaW50ZXJuYWwucHJpb3JpdHkgJiYgc3RhdGUuZ2wucmVuZGVyKSBzdGF0ZS5nbC5yZW5kZXIoc3RhdGUuc2NlbmUsIHN0YXRlLmNhbWVyYSk7XG4gICAgLy8gRGVjcmVhc2UgZnJhbWUgY291bnRcbiAgICBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPSBNYXRoLm1heCgwLCBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgLSAxKTtcbiAgICByZXR1cm4gc3RhdGUuZnJhbWVsb29wID09PSAnYWx3YXlzJyA/IDEgOiBzdGF0ZS5pbnRlcm5hbC5mcmFtZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb29wPFRDYW52YXM+KHJvb3RzOiBNYXA8VENhbnZhcywgTmd0U3RhdGVGYWN0b3J5Pikge1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IHJlcGVhdDogbnVtYmVyO1xuICAgIGxldCBmcmFtZTogbnVtYmVyO1xuICAgIGxldCBzdGF0ZTogTmd0U3RhdGU7XG5cbiAgICBmdW5jdGlvbiBsb29wKHRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVwZWF0ID0gMDtcblxuICAgICAgICAvLyBSdW4gZWZmZWN0c1xuICAgICAgICBmbHVzaEdsb2JhbEVmZmVjdHMoJ2JlZm9yZScsIHRpbWVzdGFtcCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIGFsbCByb290c1xuICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gcm9vdCgpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGZyYW1lbG9vcCBpcyBpbnZhbGlkYXRlZCwgZG8gbm90IHJ1biBhbm90aGVyIGZyYW1lXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RhdGUuaW50ZXJuYWwuYWN0aXZlICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmZyYW1lbG9vcCA9PT0gJ2Fsd2F5cycgfHwgc3RhdGUuaW50ZXJuYWwuZnJhbWVzID4gMCkgJiZcbiAgICAgICAgICAgICAgICAhc3RhdGUuZ2wueHI/LmlzUHJlc2VudGluZ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmVwZWF0ICs9IHJlbmRlcih0aW1lc3RhbXAsIHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIGFmdGVyLWVmZmVjdHNcbiAgICAgICAgZmx1c2hHbG9iYWxFZmZlY3RzKCdhZnRlcicsIHRpbWVzdGFtcCk7XG5cbiAgICAgICAgLy8gU3RvcCB0aGUgbG9vcCBpZiBub3RoaW5nIGludmFsaWRhdGVzIGl0XG4gICAgICAgIGlmIChyZXBlYXQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRhaWwgY2FsbCBlZmZlY3RzLCB0aGV5IGFyZSBjYWxsZWQgd2hlbiByZW5kZXJpbmcgc3RvcHNcbiAgICAgICAgICAgIGZsdXNoR2xvYmFsRWZmZWN0cygndGFpbCcsIHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgIC8vIEZsYWcgZW5kIG9mIG9wZXJhdGlvblxuICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRhdGUoc3RhdGVGYWN0b3J5PzogTmd0U3RhdGVGYWN0b3J5LCBmcmFtZXMgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXRlVG9JbnZhbGlkYXRlID0gc3RhdGVGYWN0b3J5Py4oKTtcbiAgICAgICAgaWYgKCFzdGF0ZVRvSW52YWxpZGF0ZSkgcmV0dXJuIHJvb3RzLmZvckVhY2goKHJvb3QpID0+IGludmFsaWRhdGUocm9vdCwgZnJhbWVzKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXRlVG9JbnZhbGlkYXRlLmdsLnhyPy5pc1ByZXNlbnRpbmcgfHxcbiAgICAgICAgICAgICFzdGF0ZVRvSW52YWxpZGF0ZS5pbnRlcm5hbC5hY3RpdmUgfHxcbiAgICAgICAgICAgIHN0YXRlVG9JbnZhbGlkYXRlLmZyYW1lbG9vcCA9PT0gJ25ldmVyJ1xuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIEluY3JlYXNlIGZyYW1lcywgZG8gbm90IGdvIGhpZ2hlciB0aGFuIDYwXG4gICAgICAgIHN0YXRlVG9JbnZhbGlkYXRlLmludGVybmFsLmZyYW1lcyA9IE1hdGgubWluKDYwLCBzdGF0ZVRvSW52YWxpZGF0ZS5pbnRlcm5hbC5mcmFtZXMgKyBmcmFtZXMpO1xuICAgICAgICAvLyBJZiB0aGUgcmVuZGVyLWxvb3AgaXNuJ3QgYWN0aXZlLCBzdGFydCBpdFxuICAgICAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWR2YW5jZShcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXIsXG4gICAgICAgIHJ1bkdsb2JhbEVmZmVjdHM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBzdGF0ZUZhY3Rvcnk/OiBOZ3RTdGF0ZUZhY3RvcnksXG4gICAgICAgIGZyYW1lPzogWFJGcmFtZVxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAocnVuR2xvYmFsRWZmZWN0cykgZmx1c2hHbG9iYWxFZmZlY3RzKCdiZWZvcmUnLCB0aW1lc3RhbXApO1xuICAgICAgICBpZiAoIXN0YXRlRmFjdG9yeSkgZm9yIChjb25zdCByb290IG9mIHJvb3RzLnZhbHVlcygpKSByZW5kZXIodGltZXN0YW1wLCByb290KTtcbiAgICAgICAgZWxzZSByZW5kZXIodGltZXN0YW1wLCBzdGF0ZUZhY3RvcnksIGZyYW1lKTtcbiAgICAgICAgaWYgKHJ1bkdsb2JhbEVmZmVjdHMpIGZsdXNoR2xvYmFsRWZmZWN0cygnYWZ0ZXInLCB0aW1lc3RhbXApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGxvb3AsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnZhbGlkYXRlcyB0aGUgdmlldywgcmVxdWVzdGluZyBhIGZyYW1lIHRvIGJlIHJlbmRlcmVkLiBXaWxsIGdsb2JhbGx5IGludmFsaWRhdGUgdW5sZXNzIHBhc3NlZCBhIHJvb3QncyBzdGF0ZS5cbiAgICAgICAgICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2ludmFsaWRhdGVcbiAgICAgICAgICovXG4gICAgICAgIGludmFsaWRhdGUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZHZhbmNlcyB0aGUgZnJhbWVsb29wIGFuZCBydW5zIHJlbmRlciBlZmZlY3RzLCB1c2VmdWwgZm9yIHdoZW4gbWFudWFsbHkgcmVuZGVyaW5nIHZpYSBgZnJhbWVsb29wPVwibmV2ZXJcImAuXG4gICAgICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLnBtbmQucnMvcmVhY3QtdGhyZWUtZmliZXIvYXBpL2FkZGl0aW9uYWwtZXhwb3J0cyNhZHZhbmNlXG4gICAgICAgICAqL1xuICAgICAgICBhZHZhbmNlLFxuICAgIH07XG59XG4iXX0=
|