ohzi-core 12.7.0 → 12.8.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/build/index.mjs +1 -1
- package/build/index.mjs.map +1 -1
- package/package.json +2 -3
- package/src/Time.js +0 -2
- package/src/action_sequencer/ActionSequencer.js +20 -0
- package/src/view_components/transition/ViewStateTransitionHandler.js +4 -3
- package/build/index.module.js +0 -2
- package/build/index.module.js.map +0 -1
package/build/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/PerspectiveCamera.js","../src/CameraManager.js","../src/Capabilities.js","../src/OrthographicCamera.js","../src/render_mode/BaseRender.js","../src/materials/BlitMaterial.js","../src/render_utilities/Blitter.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/Graphics.js","../src/materials/BaseShaderMaterial.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/Debug.js","../src/Time.js","../src/utilities/OMath.js","../src/action_sequencer/ActionEvent.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/ActionSequencer.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/view_components/transition/TransitionTable.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/TransitionManager.js","../src/view_components/ViewComponentManager.js","../src/view_components/ViewManager.js","../src/RenderLoop.js","../src/BaseApplication.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.js","../src/resource_loader/AbstractLoader.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/ResourceContainer.js","../src/loaders/AsyncAbstractLoader.js","../src/loaders/AsyncAudiosLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/GLTFLoader.js","../src/loaders/AsyncObjectsLoader.js","../src/Browser.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/loaders/AsyncTexturesLoader.js","../src/scenes/loading_states/CompilatorManager.js","../src/scenes/loading_states/LoadingState.js","../src/scenes/loading_states/HighQualityLoadingState.js","../src/scenes/loading_states/RegularLoadingState.js","../src/scenes/AbstractScene.js","../src/view_components/ApplicationView.js","../src/canvas_drawer/CanvasDrawer.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/UI.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/KeyboardInput.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/SSAOMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/render_mode/VRRender.js","../src/Screen.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/HTMLUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/Validation.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/gpu_particles/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["// @ts-check\r\nimport { Object3D } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { Line } from 'three';\r\n\r\nclass AxisHelper extends Object3D\r\n{\r\n constructor(scale = 1.0)\r\n {\r\n super();\r\n\r\n const blue_points = [];\r\n blue_points.push(new Vector3(0, 0, 0));\r\n blue_points.push(new Vector3(0, 0, 1000));\r\n\r\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\r\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\r\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\r\n blue_axis_line.renderOrder = 50000;\r\n\r\n const green_points = [];\r\n green_points.push(new Vector3(0, 0, 0));\r\n green_points.push(new Vector3(0, 1000, 0));\r\n\r\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\r\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\r\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\r\n green_axis_line.renderOrder = 50000;\r\n\r\n const red_points = [];\r\n red_points.push(new Vector3(0, 0, 0));\r\n red_points.push(new Vector3(1000, 0, 0));\r\n\r\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\r\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\r\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\r\n red_axis_line.renderOrder = 50000;\r\n\r\n this.renderOrder = 100000;\r\n\r\n this.add(blue_axis_line);\r\n this.add(green_axis_line);\r\n this.add(red_axis_line);\r\n\r\n this.scale.set(scale, scale, scale);\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n dispose()\r\n {\r\n }\r\n}\r\n\r\nexport { AxisHelper };\r\n","// @ts-check\r\nimport { Scene, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\n\r\nclass SceneManager\r\n{\r\n init()\r\n {\r\n this._current = new Scene();\r\n this._current.name = 'default_scene';\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n add_scene(name) // eslint-disable-line no-unused-vars\r\n {\r\n\r\n }\r\n\r\n /** @type {Scene} */\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n\r\n set current(scene)\r\n {\r\n this._current = scene;\r\n }\r\n\r\n dispose()\r\n {\r\n this.current.traverse((/** @type {Mesh} */ child) =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.dispose();\r\n const mat = child.material;\r\n if ('disppose' in mat && typeof (mat.disppose) === 'function')\r\n {\r\n // @ts-ignore\r\n mat.dispose();\r\n }\r\n }\r\n });\r\n\r\n while (this.current.children.length > 0)\r\n {\r\n this.current.remove(this.current.children[0]);\r\n }\r\n }\r\n}\r\n\r\nconst scene_manager = new SceneManager();\r\nexport { scene_manager as SceneManager };\r\n","// @ts-check\r\nimport { Vector3, Mesh } from 'three';\r\nimport { BoxGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nclass Cube extends Mesh\r\n{\r\n /**\r\n * @param {Vector3} [size]\r\n * @param {Vector3} [segments]\r\n * @param {number | string} [color]\r\n */\r\n constructor(size, segments, color)\r\n {\r\n size = size || new Vector3(1, 1, 1);\r\n segments = segments || new Vector3(1, 1, 1);\r\n color = color || 0xff0000;\r\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n\r\nexport { Cube };\r\n","import { Mesh, MeshBasicMaterial, SphereGeometry } from 'three';\r\n\r\nclass Sphere extends Mesh\r\n{\r\n /**\r\n * @param {number} radius\r\n * @param {number | string} color\r\n */\r\n constructor(radius, color)\r\n {\r\n color = color || '#FF0000';\r\n radius = radius || 1;\r\n const geometry = new SphereGeometry(radius, 64, 64);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n this.radius = radius;\r\n this.color = color;\r\n this.center = this.position;\r\n }\r\n}\r\n\r\nexport { Sphere };\r\n","// @ts-check\r\nimport { ConeGeometry, CylinderGeometry, Mesh, MeshBasicMaterial, Vector3 } from 'three';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nclass Arrow extends Mesh\r\n{\r\n /**\r\n * @param {string | number} [color]\r\n * @param {number} [length]\r\n * @param {Vector3} [dir]\r\n */\r\n constructor(color, length, dir)\r\n {\r\n color = color || '#FF0000';\r\n length = length || 1;\r\n\r\n const cone_height = 0.4;\r\n const cylinder_height = length - cone_height;\r\n const cylinder_geo = new CylinderGeometry(0.01, 0.01, cylinder_height, 32);\r\n cylinder_geo.translate(0, cylinder_height / 2, 0);\r\n\r\n const cone_geometry = new ConeGeometry(0.1, cone_height, 32);\r\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\r\n\r\n const buffer_geometry = BufferGeometryUtils.mergeGeometries([cylinder_geo, cone_geometry]);\r\n buffer_geometry.rotateX(3.14 / 2);\r\n\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(buffer_geometry, material);\r\n\r\n if (dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n }\r\n\r\n this._dir = dir;\r\n }\r\n\r\n set dir(dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n this._dir = dir;\r\n }\r\n\r\n get dir()\r\n {\r\n return this._dir;\r\n }\r\n\r\n set length(value)\r\n {\r\n this.scale.z = value;\r\n }\r\n\r\n get length()\r\n {\r\n return this.scale.z;\r\n }\r\n}\r\n\r\nexport { Arrow };\r\n","// @ts-check\r\nimport { Vector2 } from 'three';\r\n\r\nclass OScreen\r\n{\r\n init()\r\n {\r\n this.width = 1;\r\n this.height = 1;\r\n\r\n this.position = new Vector2();\r\n\r\n this.render_width = 1;\r\n this.render_height = 1;\r\n this.width_height = new Vector2(this.width, this.height);\r\n\r\n this.dpr = 1;\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n }\r\n\r\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n update_position(x, y)\r\n {\r\n this.position.set(x, y);\r\n }\r\n\r\n update()\r\n {\r\n this.size_changed = false;\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n update_size(width, height)\r\n {\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n\r\n this.width_height.x = width;\r\n this.width_height.y = height;\r\n\r\n this.render_width = width * this.dpr;\r\n this.render_height = height * this.dpr;\r\n\r\n this.size_changed = true;\r\n }\r\n\r\n /**\r\n * @param {Vector2} vector2\r\n */\r\n apply_pixel_density_v2(vector2)\r\n {\r\n vector2.multiplyScalar(1 / this.dpr);\r\n\r\n return vector2;\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n apply_pixel_density(value)\r\n {\r\n return value * (1 / this.dpr);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n return this.pixel_size;\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n return this.width / this.height;\r\n }\r\n\r\n get portrait()\r\n {\r\n return this.width < this.height;\r\n }\r\n}\r\n\r\nconst oscreen = new OScreen();\r\nexport { oscreen as OScreen };\r\n","// @ts-check\r\nimport { Color } from 'three';\r\nimport { PerspectiveCamera as TPerspectiveCamera } from 'three';\r\n\r\nclass PerspectiveCamera extends TPerspectiveCamera\r\n{\r\n /**\r\n * @param {number} fov\r\n * @param {number} aspect\r\n * @param {number} near\r\n * @param {number} far\r\n */\r\n constructor(fov, aspect, near, far)\r\n {\r\n super(fov, aspect, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n\r\n /**\r\n * @param {PerspectiveCamera} camera\r\n * @returns {this}\r\n */\r\n copy(camera)\r\n {\r\n super.copy(camera);\r\n this.clear_color.copy(camera.clear_color);\r\n this.clear_alpha = camera.clear_alpha;\r\n return this;\r\n }\r\n}\r\n\r\nexport { PerspectiveCamera };\r\n","// @ts-check\r\nimport { PerspectiveCamera } from './PerspectiveCamera'; // eslint-disable-line no-unused-vars\r\n\r\nclass CameraManager\r\n{\r\n init()\r\n {\r\n this._current = undefined;\r\n // VR Spectator\r\n this._spectator = undefined;\r\n }\r\n\r\n set current(camera)\r\n {\r\n this._current = camera;\r\n }\r\n\r\n /** @type {PerspectiveCamera} */\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n\r\n set spectator(camera)\r\n {\r\n this._spectator = camera;\r\n }\r\n\r\n /** @type {PerspectiveCamera} */\r\n get spectator()\r\n {\r\n return this._spectator;\r\n }\r\n}\r\n\r\nconst camera_manager = new CameraManager();\r\nexport { camera_manager as CameraManager };\r\n","// @ts-check\r\nclass Capabilities\r\n{\r\n init()\r\n {\r\n this.max_anisotropy = 0;\r\n this.vertex_texture_sampler_available = false;\r\n this.fp_textures_available = false;\r\n }\r\n}\r\n\r\nconst capabilities = new Capabilities();\r\nexport { capabilities as Capabilities };\r\n","// @ts-check\r\nimport { Color } from 'three';\r\nimport { OrthographicCamera as TOrthographicCamera } from 'three';\r\n\r\nclass OrthographicCamera extends TOrthographicCamera\r\n{\r\n /**\r\n * @param {number} left\r\n * @param {number} right\r\n * @param {number} top\r\n * @param {number} bottom\r\n * @param {number} near\r\n * @param {number} far\r\n */\r\n constructor(left, right, top, bottom, near, far)\r\n {\r\n super(left, right, top, bottom, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n\r\n /**\r\n * @param {OrthographicCamera} camera\r\n * @returns {this}\r\n */\r\n copy(camera)\r\n {\r\n super.copy(camera);\r\n this.clear_color.copy(camera.clear_color);\r\n this.clear_alpha = camera.clear_alpha;\r\n return this;\r\n }\r\n}\r\n\r\nexport { OrthographicCamera };\r\n","class BaseRender\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n render()\r\n {\r\n\r\n }\r\n\r\n on_enter(context, renderer)\r\n {\r\n\r\n }\r\n\r\n on_exit(context, renderer)\r\n {\r\n\r\n }\r\n\r\n resize()\r\n {\r\n\r\n }\r\n\r\n dispose()\r\n {\r\n\r\n }\r\n}\r\n\r\nexport { BaseRender };\r\n","import vert from '../shaders/copy/copy.vert';\r\nimport frag from '../shaders/copy/copy.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { NoBlending } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\n\r\nclass BlitMaterial extends ShaderMaterial\r\n{\r\n constructor(frag_shader, vert_shader, defines)\r\n {\r\n super({\r\n uniforms: {\r\n _MainTex: { value: null },\r\n _Resolution: { value: new Vector2(0, 0) },\r\n _TargetResolution: { value: new Vector2(0, 0) }\r\n },\r\n defines: defines || {},\r\n vertexShader: vert_shader || vert,\r\n fragmentShader: frag_shader || frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n }\r\n}\r\n\r\nexport { BlitMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport { Scene } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nclass Blitter\r\n{\r\n constructor(renderer)\r\n {\r\n this.renderer = renderer;\r\n this._blit_scene = new Scene();\r\n this._blit_material = new BlitMaterial();\r\n this._blit_quad = new Mesh(\r\n new PlaneGeometry(1, 1), this._blit_material);\r\n this._blit_scene.add(this._blit_quad);\r\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\r\n }\r\n\r\n blit(src, dst)\r\n {\r\n this._blit_quad.material = this._blit_material;\r\n\r\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n material_pass(mat, dst)\r\n {\r\n this._blit_quad.material = mat;\r\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\r\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_with_material(src, dst, mat)\r\n {\r\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material = mat;\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this._blit_quad.material = mat;\r\n\r\n this.__render(dst_RT);\r\n }\r\n\r\n dispose()\r\n {\r\n this._blit_quad.geometry.dispose();\r\n this._blit_quad.material.dispose();\r\n }\r\n\r\n __render(dst_RT)\r\n {\r\n const RT = dst_RT === undefined ? null : dst_RT;\r\n\r\n const current_rt = this.renderer.getRenderTarget();\r\n\r\n this.renderer.setRenderTarget(RT);\r\n this.renderer.render(this._blit_scene, this._blit_camera);\r\n\r\n this.renderer.setRenderTarget(current_rt);\r\n }\r\n}\r\n\r\nexport { Blitter };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/clear/clear_depth_normal.frag';\r\n\r\nimport { Vector4 } from 'three';\r\n\r\nclass ClearDepthNormalMaterial extends BlitMaterial\r\n{\r\n constructor(clear_depth, clear_normal)\r\n {\r\n super(frag);\r\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\r\n }\r\n}\r\n\r\nexport { ClearDepthNormalMaterial };\r\n","import vert from '../shaders/depth_normals/depth_normals.vert';\r\nimport frag from '../shaders/depth_normals/depth_normals.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nclass DepthNormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n _FarPlane: { value: 1 }\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n\r\n set far_plane(value)\r\n {\r\n this.uniforms._FarPlane.value = value;\r\n }\r\n\r\n get far_plane()\r\n {\r\n return this.uniforms._FarPlane.value;\r\n }\r\n}\r\n\r\nexport { DepthNormalMaterial };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { OScreen } from '../OScreen';\r\n\r\nimport { ClearDepthNormalMaterial } from '../materials/ClearDepthNormalMaterial';\r\nimport { DepthNormalMaterial } from '../materials/DepthNormalMaterial';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nclass DepthAndNormalsRenderer\r\n{\r\n constructor()\r\n {\r\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\r\n\r\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\r\n this.depth_normal_material = new DepthNormalMaterial();\r\n }\r\n\r\n render(graphics)\r\n {\r\n this.__resize_RT_if_necessary();\r\n\r\n graphics.clear(this.RT, undefined, true, true);\r\n\r\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\r\n\r\n this.depth_normal_material.far_plane = CameraManager.current.far;\r\n\r\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\r\n }\r\n\r\n __resize_RT_if_necessary()\r\n {\r\n if (this.RT.width !== OScreen.width || this.RT.height !== OScreen.height)\r\n {\r\n this.RT.setSize(OScreen.width, OScreen.height);\r\n }\r\n }\r\n\r\n get render_target()\r\n {\r\n return this.RT;\r\n }\r\n}\r\n\r\nexport { DepthAndNormalsRenderer };\r\n","// @ts-check\r\nimport { BaseApplication } from './BaseApplication'; // eslint-disable-line no-unused-vars\r\nimport { CameraManager } from './CameraManager';\r\nimport { Capabilities } from './Capabilities';\r\nimport { OScreen } from './OScreen';\r\nimport { OrthographicCamera } from './OrthographicCamera'; // eslint-disable-line no-unused-vars\r\nimport { PerspectiveCamera } from './PerspectiveCamera'; // eslint-disable-line no-unused-vars\r\nimport { SceneManager } from './SceneManager';\r\n\r\nimport { BaseRender } from './render_mode/BaseRender';\r\nimport { Blitter } from './render_utilities/Blitter';\r\nimport { DepthAndNormalsRenderer } from './render_utilities/DepthAndNormalsRenderer';\r\n\r\nimport {\r\n AlwaysDepth,\r\n FloatType,\r\n LinearSRGBColorSpace,\r\n NearestFilter,\r\n NoBlending,\r\n RGBAFormat,\r\n ShaderMaterial,\r\n WebGLRenderTarget,\r\n Material, Object3D, Scene // eslint-disable-line no-unused-vars\r\n} from 'three';\r\n\r\nimport { WebGLRenderer } from 'three';\r\n\r\nclass Graphics\r\n{\r\n /**\r\n * @param {Object} options\r\n * @param {HTMLCanvasElement} options.canvas\r\n * @param {Record<string, any>} options.core_attributes\r\n * @param {Record<string, any>} options.context_attributes\r\n * @param {Record<string, any>} options.threejs_attributes\r\n * @param {number} options.dpr\r\n */\r\n init({ canvas, core_attributes, context_attributes, threejs_attributes, dpr })\r\n {\r\n this._renderer = undefined;\r\n this.blitter = undefined;\r\n this.canvas = undefined;\r\n this.no_render = undefined;\r\n this.current_render_mode = undefined;\r\n this.generateDepthNormalTexture = false;\r\n this.depth_and_normals_renderer = undefined;\r\n\r\n this.is_webgl2 = false;\r\n this.canvas_context = undefined;\r\n this.context_attributes = undefined;\r\n\r\n this.core_attributes = {\r\n force_webgl2: true,\r\n xr_enabled: false\r\n };\r\n\r\n this.context_attributes = {\r\n alpha: true,\r\n antialias: false,\r\n depth: true,\r\n desynchronized: false,\r\n failIfMajorPerformanceCaveat: false,\r\n powerPreference: 'high-performance',\r\n premultipliedAlpha: true,\r\n preserveDrawingBuffer: true,\r\n stencil: false\r\n };\r\n\r\n /** @type {Record<string, any>} */\r\n this.threejs_attributes = {\r\n logarithmicDepthBuffer: false\r\n };\r\n\r\n Object.assign(this.core_attributes, core_attributes);\r\n Object.assign(this.context_attributes, context_attributes);\r\n\r\n Object.assign(this.threejs_attributes, this.context_attributes);\r\n Object.assign(this.threejs_attributes, threejs_attributes);\r\n\r\n if (this.core_attributes.force_webgl2)\r\n {\r\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\r\n canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n else\r\n {\r\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n\r\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\r\n\r\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\r\n\r\n this.threejs_attributes.canvas = canvas;\r\n this.threejs_attributes.context = this.canvas_context;\r\n\r\n this._renderer = new WebGLRenderer(this.threejs_attributes);\r\n\r\n if (this.core_attributes.xr_enabled)\r\n {\r\n this._renderer.xr.enabled = true;\r\n }\r\n else\r\n {\r\n this._renderer.autoClear = false;\r\n }\r\n\r\n OScreen.dpr = dpr;\r\n this._renderer.setPixelRatio(1);\r\n\r\n if (!this.is_webgl2)\r\n {\r\n this._renderer.extensions.get('ANGLE_instanced_arrays');\r\n }\r\n\r\n this.blitter = new Blitter(this._renderer);\r\n\r\n this.canvas = this._renderer.domElement;\r\n\r\n this.no_render = new BaseRender();\r\n\r\n this.current_render_mode = this.no_render;\r\n\r\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\r\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\r\n Capabilities.fp_textures_available = this.is_floating_point_texture_available();\r\n\r\n this.generateDepthNormalTexture = false;\r\n\r\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\r\n }\r\n\r\n get dom_element()\r\n {\r\n return this._renderer.domElement;\r\n }\r\n\r\n get depth_normals_RT()\r\n {\r\n return this.depth_and_normals_renderer.render_target;\r\n }\r\n\r\n /**\r\n * @param {BaseRender} new_state\r\n */\r\n set_state(new_state)\r\n {\r\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\r\n\r\n this.current_render_mode.on_exit(this, this._renderer);\r\n this.current_render_mode = new_state;\r\n this.current_render_mode.on_enter(this, this._renderer);\r\n }\r\n\r\n update()\r\n {\r\n if (this.generateDepthNormalTexture)\r\n {\r\n this.depth_and_normals_renderer.render(this);\r\n }\r\n\r\n this.__update_current_camera();\r\n\r\n if (CameraManager.current)\r\n {\r\n this.current_render_mode.render();\r\n }\r\n\r\n OScreen.update();\r\n }\r\n\r\n __update_current_camera()\r\n {\r\n if (CameraManager.current)\r\n {\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateProjectionMatrix();\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Scene} [scene]\r\n * @param {PerspectiveCamera | OrthographicCamera} [camera]\r\n * @param {WebGLRenderTarget} [RT]\r\n * @param {Material} [override_mat]\r\n */\r\n render(scene, camera, RT, override_mat)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this._renderer.render(scene || SceneManager.current,\r\n camera || CameraManager.current);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n }\r\n\r\n /**\r\n * @param {Scene} scene\r\n * @param {PerspectiveCamera} camera\r\n * @param {WebGLRenderTarget} RT\r\n * @param {Material} override_mat\r\n */\r\n compile(scene, camera, RT, override_mat)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this._renderer.compile(scene || SceneManager.current,\r\n camera || CameraManager.current);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n }\r\n\r\n /**\r\n * @param {Scene} scene\r\n * @param {PerspectiveCamera} camera\r\n * @param {WebGLRenderTarget} RT\r\n * @param {Material} override_mat\r\n * @param {Scene} target_scene\r\n * @returns {Promise<Object3D>}\r\n */\r\n async compile_async(scene, camera, RT, override_mat, target_scene)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n const promise = this._renderer.compileAsync(scene || SceneManager.current,\r\n camera || CameraManager.current, target_scene);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * @param {BaseApplication | Scene | {render:()=>void}} scene\r\n */\r\n render_scene(scene)\r\n {\r\n if ('on_pre_render' in scene)\r\n {\r\n scene.on_pre_render();\r\n }\r\n\r\n if ('render' in scene)\r\n {\r\n scene.render();\r\n }\r\n else\r\n {\r\n // @ts-ignore\r\n this.render(scene, undefined);\r\n }\r\n\r\n if ('on_post_render' in scene)\r\n {\r\n scene.on_post_render();\r\n }\r\n }\r\n\r\n /**\r\n * @param {Scene} scene\r\n * @param {Material} mat\r\n */\r\n __apply_override_material(scene, mat)\r\n {\r\n mat = mat === undefined ? null : mat;\r\n if (scene)\r\n {\r\n scene.overrideMaterial = mat;\r\n }\r\n else\r\n {\r\n SceneManager.current.overrideMaterial = mat;\r\n }\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} RT\r\n * @param {import('three').TypedArray} buffer\r\n */\r\n readback_RT(RT, buffer)\r\n {\r\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} RT\r\n * @param {PerspectiveCamera} camera\r\n * @param {boolean} clear_depth\r\n * @param {boolean} clear_stencil\r\n */\r\n clear(RT, camera, clear_depth, clear_stencil)\r\n {\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n\r\n if (camera)\r\n {\r\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\r\n }\r\n\r\n this._renderer.clear(!!camera, // clear color\r\n !!clear_depth,\r\n !!clear_stencil);\r\n }\r\n\r\n /**\r\n * @param {ResizeObserverEntry[]} entries\r\n * @param {number} dpr\r\n */\r\n on_resize(entries, dpr)\r\n {\r\n for (const entry of entries)\r\n {\r\n OScreen.dpr = dpr;\r\n // this._renderer.setPixelRatio(dpr);\r\n\r\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\r\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\r\n\r\n this.canvas.width = OScreen.render_width;\r\n this.canvas.height = OScreen.render_height;\r\n\r\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\r\n\r\n this.__update_current_camera();\r\n }\r\n }\r\n\r\n /**\r\n * @param {Material} mat\r\n * @param {WebGLRenderTarget} dst\r\n */\r\n material_pass(mat, dst)\r\n {\r\n this.blitter.material_pass(mat, dst);\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} src_RT\r\n * @param {WebGLRenderTarget} dst_RT\r\n * @param {Material} mat\r\n */\r\n blit(src_RT, dst_RT, mat)\r\n {\r\n if (mat)\r\n {\r\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\r\n }\r\n else\r\n {\r\n this.blitter.blit(src_RT, dst_RT);\r\n }\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} dst_RT\r\n * @param {Material} mat\r\n */\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this.blitter.blit_clear_with_material(dst_RT, mat);\r\n }\r\n\r\n /**\r\n * @param {BlobCallback} blob_callback\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\r\n {\r\n // const ctx = this;\r\n\r\n const old_width = OScreen.width;\r\n const old_height = OScreen.height;\r\n\r\n const new_width = width;\r\n const new_height = height;\r\n\r\n const tile_width = 1024;\r\n const tile_height = 1024;\r\n\r\n const divisions_x = Math.ceil(new_width / tile_width);\r\n const divisions_y = Math.ceil(new_height / tile_height);\r\n\r\n OScreen.update_size(tile_width, tile_height);\r\n const old_dpr = this._renderer.getPixelRatio();\r\n this._renderer.setPixelRatio(1);\r\n\r\n this._renderer.setSize(tile_width, tile_height, false);\r\n\r\n const canvas_2d = document.createElement('canvas');\r\n const ctx_2D = canvas_2d.getContext('2d');\r\n\r\n ctx_2D.canvas.width = new_width;\r\n ctx_2D.canvas.height = new_height;\r\n\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n\r\n for (let x = 0; x < divisions_x; x++)\r\n {\r\n for (let y = 0; y < divisions_y; y++)\r\n {\r\n CameraManager.current.setViewOffset(new_width, new_height,\r\n OScreen.width * x, OScreen.height * y,\r\n OScreen.width, OScreen.height);\r\n this.current_render_mode.render();\r\n\r\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.height * y);\r\n }\r\n }\r\n\r\n // transform the result canvas into a blob\r\n // } from them the callback turns into a ULR and download it\r\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\r\n\r\n CameraManager.current.clearViewOffset();\r\n\r\n OScreen.update_size(old_width, old_height);\r\n this._renderer.setPixelRatio(old_dpr);\r\n this._renderer.setSize(old_width, old_height, false);\r\n\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n\r\n /**\r\n * @param {Blob} blob\r\n */\r\n download_screenshot(blob)\r\n {\r\n const link = document.createElement('a');\r\n link.download = 'Snapshot.png';\r\n\r\n link.href = URL.createObjectURL(blob);\r\n link.click();\r\n\r\n link.onclick = function()\r\n {\r\n requestAnimationFrame(function()\r\n {\r\n URL.revokeObjectURL(link.href);\r\n });\r\n link.removeAttribute('href');\r\n };\r\n }\r\n\r\n dispose()\r\n {\r\n this._renderer.dispose();\r\n this.current_render_mode.dispose();\r\n this.blitter.dispose();\r\n }\r\n\r\n is_floating_point_texture_available()\r\n {\r\n const RT = new WebGLRenderTarget(1, 1, {\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter,\r\n format: RGBAFormat,\r\n colorSpace: LinearSRGBColorSpace,\r\n type: FloatType,\r\n stencilBuffer: false,\r\n depthBuffer: false\r\n });\r\n\r\n const vert = `\r\n void main()\r\n {\r\n gl_Position = vec4(uv * 2.0 - 1.0, 1.0, 1.0);\r\n }\r\n `;\r\n const frag = `\r\n void main()\r\n {\r\n gl_FragColor = vec4(0.0, 4865.35, 0.0, 1.0);\r\n }\r\n `;\r\n\r\n const mat = new ShaderMaterial({\r\n vertexShader: vert,\r\n fragmentShader: frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n\r\n this.material_pass(mat, RT);\r\n\r\n const output = new Float32Array(4);\r\n this._renderer.readRenderTargetPixels(RT, 0, 0, 1, 1, output);\r\n\r\n return Math.abs(output[1] - 4865.35) < 0.001;\r\n }\r\n}\r\n\r\nconst graphics = new Graphics();\r\nexport { graphics as Graphics };\r\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\r\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nclass BaseShaderMaterial extends ShaderMaterial\r\n{\r\n constructor(vert, frag, uniforms)\r\n {\r\n super({\r\n vertexShader: vert || basic_vert,\r\n fragmentShader: frag || basic_frag,\r\n uniforms: uniforms || {\r\n _Color: { value: new Color('#FF0000') }\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { BaseShaderMaterial };\r\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\r\nimport { Vector2 } from 'three';\r\nclass ScreenSpaceTextureMaterial extends BaseShaderMaterial\r\n{\r\n constructor(x, y, w, h)\r\n {\r\n const vert = `\r\n uniform vec2 _ScreenSpacePosition;\r\n uniform vec2 _ScreenSize;\r\n uniform vec2 _TextureSize;\r\n varying vec2 vUv;\r\n void main()\r\n {\r\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\r\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\r\n\r\n pos.x = pos.x * 2.0 - 1.0;\r\n pos.y = pos.y * 2.0 - 1.0;\r\n\r\n gl_Position = vec4(pos, 0.0, 1.0);\r\n vUv = uv;\r\n }\r\n `;\r\n const frag = `\r\n uniform sampler2D _MainTex;\r\n varying vec2 vUv;\r\n\r\n void main()\r\n {\r\n gl_FragColor = texture2D(_MainTex, vUv);\r\n }\r\n `;\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSpacePosition: { value: new Vector2() },\r\n _ScreenSize: { value: new Vector2() },\r\n _TextureSize: { value: new Vector2() }\r\n });\r\n }\r\n\r\n set_position(x, y)\r\n {\r\n this.uniforms._ScreenSpacePosition.value.set(x, y);\r\n }\r\n\r\n set_texture(tex, w, h)\r\n {\r\n this.uniforms._MainTex.value = tex;\r\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\r\n\r\n if (w !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.x = w;\r\n }\r\n if (h !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.y = h;\r\n }\r\n }\r\n\r\n set_screen_size(w, h)\r\n {\r\n this.uniforms._ScreenSize.value.set(w, h);\r\n }\r\n}\r\n\r\nexport { ScreenSpaceTextureMaterial };\r\n","// @ts-check\r\nimport { AxisHelper } from './components/AxisHelper';\r\n\r\nimport { SceneManager } from './SceneManager';\r\nimport { Cube } from './primitives/Cube';\r\nimport { Sphere } from './primitives/Sphere';\r\nimport { Arrow } from './primitives/Arrow';\r\nimport { OScreen } from './OScreen';\r\nimport { Graphics } from './Graphics'; // eslint-disable-line no-unused-vars\r\nimport { ScreenSpaceTextureMaterial } from './materials/ScreenSpaceTextureMaterial';\r\nimport { PerspectiveCamera } from './PerspectiveCamera';\r\n\r\nimport { RenderTarget, Texture, Vector2, Vector3, WebGLRenderer } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { LineBasicMaterial } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Line } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector4 } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { Box3 } from 'three';\r\nimport { Box3Helper } from 'three';\r\nimport { Scene } from 'three';\r\nimport { CatmullRomCurve3 } from 'three';\r\nimport { SphereGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n// @ts-ignore\r\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\r\n// @ts-ignore\r\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\r\nimport { CameraManager } from './CameraManager';\r\n\r\nclass Debug\r\n{\r\n init()\r\n {\r\n this.Vector3_one = new Vector3(1, 1, 1);\r\n this.Vector3_zero = new Vector3(0, 0, 0);\r\n this.canvas_renderer = undefined;\r\n\r\n /** @type { Mesh<PlaneGeometry, ScreenSpaceTextureMaterial>[] } */\r\n this.display_texture_meshes = [];\r\n\r\n this.ctx = undefined;\r\n this.scene = new Scene();\r\n this.camera = new PerspectiveCamera(60, OScreen.aspect_ratio, 0.1, 1000);\r\n this.camera.clear_alpha = 0;\r\n }\r\n\r\n /**\r\n * @param {Vector3} origin\r\n * @param {Vector3} dir\r\n * @param {number | string} color\r\n * @returns {Arrow}\r\n */\r\n draw_arrow(origin, dir, color = 0xff0000)\r\n {\r\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\r\n arrow.position.copy(origin);\r\n this.scene.add(arrow);\r\n return arrow;\r\n }\r\n\r\n draw_axis()\r\n {\r\n const axis = new AxisHelper();\r\n this.scene.add(axis);\r\n return axis;\r\n }\r\n\r\n /**\r\n * @param {RenderTarget} RT\r\n */\r\n set_debug_RT(RT)\r\n {\r\n this.rt_debug = RT;\r\n }\r\n\r\n /**\r\n * @param {Vector2 | Vector3} position_2d\r\n * @param {number} width\r\n * @param {number} height\r\n * @param {number | string} color\r\n */\r\n draw_rectangle(position_2d, width, height, color)\r\n {\r\n width = width || 100;\r\n height = height || 100;\r\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.fillRect(position_2d.x - width / 2,\r\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\r\n }\r\n\r\n clear()\r\n {\r\n if (this.ctx)\r\n {\r\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Vector3 | Vector2} from\r\n * @param {Vector3 | Vector2} to\r\n * @param {number | string} color\r\n */\r\n draw_line_2D(from, to, color)\r\n {\r\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(from.x, from.y);\r\n this.ctx.lineTo(to.x, to.y);\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n * @param {number | string} color\r\n * @returns {Line}\r\n */\r\n draw_line(points, color = 0xff0000)\r\n {\r\n const material = new LineBasicMaterial({\r\n color: color\r\n });\r\n\r\n const geometry = new BufferGeometry().setFromPoints(points);\r\n\r\n const line = new Line(geometry, material);\r\n line.frustumCulled = false;\r\n this.scene.add(line);\r\n return line;\r\n }\r\n\r\n /**\r\n * @param {Vector3} pos\r\n * @param {number} size\r\n * @param {number | string} color\r\n * @returns {Cube}\r\n */\r\n draw_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\r\n cube.position.copy(pos);\r\n this.scene.add(cube);\r\n return cube;\r\n }\r\n\r\n /**\r\n * @param {Vector3} from\r\n * @param {Vector3} to\r\n * @param {number} height\r\n * @param {number | string} color\r\n * @param {number} depth\r\n * @returns {Cube}\r\n */\r\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\r\n {\r\n const size = from.distanceTo(to);\r\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\r\n\r\n const center = to.clone().sub(from).multiplyScalar(0.5);\r\n const forward_dir = center.clone().normalize();\r\n center.add(from);\r\n\r\n cube.position.copy(center);\r\n\r\n // let up = new Vector3(0, 1, 0);\r\n // let forward = forward_dir.clone();\r\n // let right = forward.clone().cross(up);\r\n\r\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\r\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\r\n\r\n this.scene.add(cube);\r\n return cube;\r\n }\r\n\r\n /**\r\n *\r\n * @param {number} [width]\r\n * @param {number} [height]\r\n * @param {number | string} [color]\r\n * @returns\r\n */\r\n draw_plane(width, height, color) // eslint-disable-line no-unused-vars\r\n {\r\n const geometry = new PlaneGeometry(width, height);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane = new Mesh(geometry, material);\r\n plane.renderOrder = -10000;\r\n this.scene.add(plane);\r\n return plane;\r\n }\r\n\r\n /**\r\n * @param {Vector3} pos\r\n * @param {number} size\r\n * @param {number | string} color\r\n * @returns {Box3Helper}\r\n */\r\n draw_empty_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n\r\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\r\n const helper = new Box3Helper(box, color);\r\n helper.position.copy(pos || new Vector3());\r\n return helper;\r\n }\r\n\r\n /**\r\n * @param {Vector3} pos\r\n * @param {number} size\r\n * @param {number | string} color\r\n * @returns {Sphere}\r\n */\r\n draw_sphere(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n const sphere = new Sphere(size, color);\r\n sphere.position.copy(pos);\r\n this.scene.add(sphere);\r\n return sphere;\r\n }\r\n\r\n /**\r\n *\r\n * @param {Vector3[]} input_points\r\n * @param {boolean} open\r\n * @param {number | string} color\r\n * @returns {Line}\r\n */\r\n draw_point_array(input_points, open = false, color = 0xff0000) // eslint-disable-line no-unused-vars\r\n {\r\n const catmull = new CatmullRomCurve3(input_points, open);\r\n catmull.updateArcLengths();\r\n const points = catmull.getSpacedPoints(200);\r\n const line_helper = this.draw_line(points, 0x00ff00);\r\n // line_helper.position.y = 1.5;\r\n return line_helper;\r\n }\r\n\r\n /**\r\n * @param {Sphere} sphere\r\n * @param {number | string} color\r\n * @returns {Mesh}\r\n */\r\n draw_sphere_helper(sphere, color)\r\n {\r\n color = color || 0xff0000;\r\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n const material = new MeshBasicMaterial({ color: color });\r\n const sphere_mesh = new Mesh(geometry, material);\r\n sphere_mesh.position.copy(sphere.center);\r\n SceneManager.current.add(sphere_mesh);\r\n return sphere_mesh;\r\n }\r\n\r\n /**\r\n * @param {Sphere} sphere\r\n */\r\n draw_math_sphere(sphere)\r\n {\r\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true\r\n });\r\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\r\n const sphere1 = new Mesh(geometry, material);\r\n sphere1.position.copy(sphere.center);\r\n SceneManager.current.add(sphere1);\r\n }\r\n\r\n /**\r\n * @param {Box3} bb\r\n */\r\n draw_bounding_box(bb)\r\n {\r\n const helper = new Box3Helper(bb, 0xffff00);\r\n SceneManager.current.add(helper);\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} curve\r\n * @param {object} options\r\n * @param {number} options.offset\r\n */\r\n draw_curve(curve, options)\r\n {\r\n const offset = new Vector3(0, 0, 0);\r\n if (options)\r\n {\r\n offset.y = options.offset || 0;\r\n }\r\n\r\n for (let i = 0; i < curve.length - 1; i++)\r\n {\r\n this.draw_line([curve[i].clone().add(offset), curve[i + 1].clone().add(offset)]);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Texture} tex\r\n * @param {number} w\r\n * @param {number} h\r\n * @returns {Mesh}\r\n */\r\n draw_texture(tex, w, h)\r\n {\r\n const mesh = new Mesh(new PlaneGeometry(1, 1), new ScreenSpaceTextureMaterial());\r\n this.display_texture_meshes.push(mesh);\r\n this.scene.add(mesh);\r\n\r\n mesh.material.set_texture(tex, w, h);\r\n return mesh;\r\n }\r\n\r\n /**\r\n * @param {Graphics} graphics\r\n */\r\n render(graphics)\r\n {\r\n for (let i = 0; i < this.display_texture_meshes.length; i++)\r\n {\r\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\r\n }\r\n if (this.scene.children.length > 0)\r\n {\r\n graphics.render(this.scene, CameraManager.current);\r\n }\r\n }\r\n}\r\n\r\nconst debug = new Debug();\r\nexport { debug as Debug };\r\n","// @ts-check\r\nimport { Vector2 } from 'three';\r\nimport { Clock } from 'three';\r\n\r\nclass Time\r\n{\r\n constructor()\r\n {\r\n this.__delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\r\n }\r\n\r\n init()\r\n {\r\n this.__previous_elapsed_time = -1;\r\n this.__delta_time = 0;\r\n this.__smooth_delta_time = 0;\r\n this.__elapsed_time = 0;\r\n this.__frame_interpolation_t = 0;\r\n this.fixed_delta_time = 1 / 30;\r\n }\r\n\r\n get elapsed_time()\r\n {\r\n return this.__elapsed_time;\r\n }\r\n\r\n get delta_time()\r\n {\r\n return this.__delta_time;\r\n }\r\n\r\n get smooth_delta_time()\r\n {\r\n return this.__smooth_delta_time;\r\n }\r\n\r\n get frame_interpolation()\r\n {\r\n return this.__frame_interpolation_t;\r\n }\r\n\r\n get fdt()\r\n {\r\n return this.fixed_delta_time;\r\n }\r\n\r\n get dt()\r\n {\r\n return this.delta_time;\r\n }\r\n\r\n get sdt()\r\n {\r\n return this.smooth_delta_time;\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n __set_frame_interpolation(value)\r\n {\r\n this.__frame_interpolation_t = value;\r\n }\r\n\r\n /**\r\n * @param {number} elapsed_time\r\n */\r\n __update(elapsed_time)\r\n {\r\n if (this.__previous_elapsed_time < 0)\r\n {\r\n this.__previous_elapsed_time = elapsed_time;\r\n }\r\n this.__delta_time = (elapsed_time - this.__previous_elapsed_time) / 1000;\r\n this.__elapsed_time = elapsed_time / 1000;\r\n\r\n this.__delta_buffer.shift();\r\n this.__delta_buffer.push(this.delta_time < 0.32 ? this.delta_time : 0.032);\r\n\r\n this.__calculate_smooth_delta_time();\r\n\r\n this.__previous_elapsed_time = elapsed_time;\r\n }\r\n\r\n __calculate_smooth_delta_time()\r\n {\r\n this.__smooth_delta_time = 0;\r\n\r\n for (let i = 0; i < this.__delta_buffer.length; i++)\r\n {\r\n this.__smooth_delta_time += this.__delta_buffer[i];\r\n }\r\n\r\n this.__smooth_delta_time = this.__smooth_delta_time / this.__delta_buffer.length;\r\n }\r\n}\r\n\r\nconst time = new Time();\r\nexport { time as Time };\r\n","\r\nclass OMath\r\n{\r\n constructor()\r\n {}\r\n\r\n static linear_map(value,\r\n from_range_start_value,\r\n from_range_end_value,\r\n to_range_start_value,\r\n to_range_end_value)\r\n {\r\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\r\n }\r\n\r\n static between(value, min, max)\r\n {\r\n return (value >= min && value <= max);\r\n }\r\n\r\n static mod(number, divisor)\r\n {\r\n return ((number % divisor) + divisor) % divisor;\r\n }\r\n\r\n static rgb_to_hex(rgb)\r\n {\r\n rgb.r = Math.round(rgb.r * 255).toString(16);\r\n rgb.g = Math.round(rgb.g * 255).toString(16);\r\n rgb.b = Math.round(rgb.b * 255).toString(16);\r\n\r\n if (rgb.r.length === 1)\r\n {\r\n rgb.r = '0' + rgb.r;\r\n }\r\n if (rgb.g.length === 1)\r\n {\r\n rgb.g = '0' + rgb.g;\r\n }\r\n if (rgb.b.length === 1)\r\n {\r\n rgb.b = '0' + rgb.b;\r\n }\r\n\r\n return '#' + rgb.r + rgb.g + rgb.b;\r\n }\r\n\r\n static project_points_on_plane(points, plane)\r\n {\r\n const projected_point = points[0].clone();\r\n projected_point.set(0, 0, 0);\r\n\r\n const points_on_plane = [];\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n plane.projectPoint(points[i], projected_point);\r\n points_on_plane.push(projected_point.clone());\r\n }\r\n\r\n return points_on_plane;\r\n }\r\n\r\n static matrix4_lerp(from, to, target, t)\r\n {\r\n for (let i = 0; i < 16; i++)\r\n {\r\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\r\n }\r\n }\r\n\r\n static equals(x1, x2)\r\n {\r\n return Math.abs(x1 - x2) < 0.000001;\r\n }\r\n\r\n static lerp(x, y, t)\r\n {\r\n return (1 - t) * x + t * y;\r\n }\r\n\r\n static clamp(value, min, max)\r\n {\r\n return Math.max(min, Math.min(max, value));\r\n }\r\n\r\n static euclideanModulo(n, m)\r\n {\r\n return ((n % m) + m) % m;\r\n }\r\n\r\n static pingpong(x, length = 1)\r\n {\r\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\r\n }\r\n\r\n static degToRad(degrees)\r\n {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static radToDeg(radians)\r\n {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n static deg_to_rad(degrees)\r\n {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static rad_to_deg(radians)\r\n {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n static perspective_divide(v)\r\n {\r\n v.x /= v.w;\r\n v.y /= v.w;\r\n v.z /= v.w;\r\n return v;\r\n }\r\n\r\n static points_average(points)\r\n {\r\n const center = points[0].clone();\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n center.add(points[i]);\r\n }\r\n center.multiplyScalar(1 / points.length);\r\n return center;\r\n }\r\n\r\n static get_random_color()\r\n {\r\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\r\n\r\n let col = '#';\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n return col;\r\n }\r\n\r\n static saturate(x)\r\n {\r\n return OMath.clamp(x, 0, 1);\r\n }\r\n}\r\n\r\nexport { OMath };\r\n","// @ts-check\r\nclass ActionEvent\r\n{\r\n /**\r\n * @param {string} name\r\n * @param {string} method\r\n * @param {string} args\r\n */\r\n constructor(name, method, args)\r\n {\r\n this.name = name;\r\n this.method = method;\r\n this.args = args;\r\n }\r\n\r\n trigger()\r\n {\r\n ViewApi.application[this.name][this.method](...this.args.split(','));\r\n }\r\n}\r\n\r\nexport { ActionEvent };\r\n","\r\nclass EasingFunctions\r\n{\r\n constructor()\r\n {}\r\n\r\n static linear(x)\r\n {\r\n return x;\r\n }\r\n\r\n static triangular(x)\r\n {\r\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\r\n }\r\n\r\n static ease_in_sine(x)\r\n {\r\n return 1 - Math.cos(x * 3.1415926 / 2);\r\n }\r\n\r\n static ease_out_sine(x)\r\n {\r\n return Math.sin(x * 3.1415926 / 2);\r\n }\r\n\r\n static ease_in_out_sine(x)\r\n {\r\n return -(Math.cos(3.1415926 * x) - 1) / 2;\r\n }\r\n\r\n static ease_in_cubic(x)\r\n {\r\n return x * x * x;\r\n }\r\n\r\n static ease_out_cubic(x)\r\n {\r\n return 1 - Math.pow(1 - x, 3);\r\n }\r\n\r\n static ease_in_out_cubic(x)\r\n {\r\n return x < 0.5\r\n ? 4 * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\r\n }\r\n\r\n static ease_in_quad(x)\r\n {\r\n return x * x;\r\n }\r\n\r\n static ease_out_quad(x)\r\n {\r\n return 1 - (1 - x) * (1 - x);\r\n }\r\n\r\n static ease_in_out_quad(x)\r\n {\r\n return x < 0.5\r\n ? 2 * x * x\r\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\r\n }\r\n\r\n static ease_in_quart(x)\r\n {\r\n return x * x * x * x;\r\n }\r\n\r\n static ease_out_quart(x)\r\n {\r\n return 1 - Math.pow(1 - x, 4);\r\n }\r\n\r\n static ease_in_out_quart(x)\r\n {\r\n return x < 0.5\r\n ? 8 * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\r\n }\r\n\r\n static ease_in_quint(x)\r\n {\r\n return x * x * x * x * x;\r\n }\r\n\r\n static ease_out_quint(x)\r\n {\r\n return 1 - Math.pow(1 - x, 5);\r\n }\r\n\r\n static ease_in_out_quint(x)\r\n {\r\n return x < 0.5\r\n ? 16 * x * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\r\n }\r\n\r\n static ease_in_expo(x)\r\n {\r\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\r\n }\r\n\r\n static ease_out_expo(x)\r\n {\r\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\r\n }\r\n\r\n static ease_in_out_expo(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : x < 0.5\r\n ? Math.pow(2, 20 * x - 10) / 2\r\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\r\n }\r\n\r\n static ease_in_circ(x)\r\n {\r\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\r\n }\r\n\r\n static ease_out_circ(x)\r\n {\r\n return Math.sqrt(1 - Math.pow(x - 1, 2));\r\n }\r\n\r\n static ease_in_out_circ(x)\r\n {\r\n return x < 0.5\r\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\r\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\r\n }\r\n\r\n static ease_in_back(x)\r\n {\r\n return 2.7015 * x * x * x - 1.7015 * x * x;\r\n }\r\n\r\n static ease_out_back(x)\r\n {\r\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\r\n }\r\n\r\n static ease_in_out_back(x)\r\n {\r\n return x < 0.5\r\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\r\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\r\n }\r\n\r\n static ease_in_elastic(x)\r\n {\r\n const c4 = (2 * Math.PI) / 3;\r\n\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\r\n }\r\n\r\n static ease_out_elastic(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\r\n }\r\n\r\n static ease_in_out_elastic(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : x < 0.5\r\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\r\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\r\n }\r\n\r\n static ease_in_bounce(x)\r\n {\r\n return 1 - this.ease_out_bounce(1 - x);\r\n }\r\n\r\n static ease_out_bounce(x)\r\n {\r\n const n1 = 7.5625;\r\n const d1 = 2.75;\r\n\r\n if (x < 1 / d1)\r\n {\r\n return n1 * x * x;\r\n }\r\n else if (x < 2 / d1)\r\n {\r\n return n1 * (x -= 1.5 / d1) * x + 0.75;\r\n }\r\n else if (x < 2.5 / d1)\r\n {\r\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\r\n }\r\n else\r\n {\r\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\r\n }\r\n }\r\n\r\n static ease_in_out_bounce(x)\r\n {\r\n return x < 0.5\r\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\r\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\r\n }\r\n\r\n static heartbeat(t)\r\n {\r\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {'linear'|'triangular'|'ease_in_sine'|'ease_out_sine'|'ease_in_out_sine'|'ease_in_cubic'|'ease_out_cubic'|'ease_in_out_cubic'|'ease_in_quad'|'ease_out_quad'|'ease_in_out_quad'|'ease_in_quart'|'ease_out_quart'|'ease_in_out_quart'|'ease_in_quint'|'ease_out_quint'|'ease_in_out_quint'|'ease_in_expo'|'ease_out_expo'|'ease_in_out_expo'|'ease_in_circ'|'ease_out_circ'|'ease_in_out_circ'|'ease_in_back'|'ease_out_back'|'ease_in_out_back'|'ease_in_elastic'|'ease_out_elastic'|'ease_in_out_elastic'|'ease_in_bounce'|'ease_out_bounce'|'ease_in_out_bounce'|'heartbeat'} EasingFunctionType\r\n */\r\n\r\nexport { EasingFunctions };\r\n","// @ts-check\r\nimport { Vector3 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { EasingFunctions } from '../utilities/EasingFunctions';\r\n\r\nclass ActionInterpolator\r\n{\r\n /**\r\n * @param {import('../utilities/EasingFunctions').EasingFunctionType | function} easing_function\r\n */\r\n constructor(easing_function = 'linear')\r\n {\r\n this.easing_function = undefined;\r\n\r\n if (typeof easing_function === 'string')\r\n {\r\n this.easing_function = EasingFunctions[easing_function];\r\n }\r\n else\r\n {\r\n this.easing_function = easing_function;\r\n }\r\n\r\n this.attribute_name = '';\r\n /** @type {number | Vector3} */\r\n this.from = 0;\r\n /** @type {number | Vector3} */\r\n this.to = 1;\r\n }\r\n\r\n /**\r\n * @param {any} context\r\n * @param {number} t\r\n */\r\n update(context, t) // eslint-disable-line no-unused-vars\r\n {\r\n }\r\n}\r\n\r\nexport { ActionInterpolator };\r\n","// @ts-check\r\nimport { OMath } from '../utilities/OMath';\r\nimport { ActionEvent } from './ActionEvent'; // eslint-disable-line no-unused-vars\r\nimport { ActionInterpolator } from './ActionInterpolator'; // eslint-disable-line no-unused-vars\r\n\r\nclass ActionSequencer\r\n{\r\n /**\r\n * @param {any} [context]\r\n */\r\n constructor(context = {})\r\n {\r\n this.previous_elapsed_time = -0.00001;\r\n this.elapsed_time = -0.00001;\r\n this.playback_speed = this.__get_playback_speed();\r\n this.playing = true;\r\n\r\n /** @type {{action:ActionEvent, trigger_time:number }[]} */\r\n this.action_events = [];\r\n this.context = context;\r\n\r\n this.initial_context = JSON.parse(JSON.stringify(context));\r\n\r\n this.tmp_t = 0;\r\n\r\n /** @type {{[key:string]:any[]}} */\r\n this.channels = {};\r\n\r\n const channel_names = Object.keys(context);\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n this.channels[channel_names[i]] = [];\r\n }\r\n\r\n this.duration = 0;\r\n }\r\n\r\n play()\r\n {\r\n this.playing = true;\r\n }\r\n\r\n stop()\r\n {\r\n this.playing = false;\r\n }\r\n\r\n reset()\r\n {\r\n this.elapsed_time = -0.00001;\r\n }\r\n\r\n skip()\r\n {\r\n const duration = this.get_duration();\r\n this.__play_clips(this.elapsed_time, duration + 0.0001);\r\n this.elapsed_time = duration;\r\n }\r\n\r\n /**\r\n * @param {number} delta_time\r\n */\r\n update(delta_time)\r\n {\r\n if (this.playing)\r\n {\r\n this.previous_elapsed_time = this.elapsed_time;\r\n this.elapsed_time += delta_time * this.playback_speed;\r\n this.__play_clips(this.previous_elapsed_time, this.elapsed_time);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} time\r\n */\r\n set_progress(time)\r\n {\r\n this.previous_elapsed_time = this.elapsed_time;\r\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n /**\r\n * @param {number} t\r\n */\r\n set_normalized_progress(t)\r\n {\r\n this.previous_elapsed_time = this.elapsed_time;\r\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n get_progress()\r\n {\r\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\r\n }\r\n\r\n is_finished()\r\n {\r\n return this.elapsed_time > this.get_duration();\r\n }\r\n\r\n /**\r\n * @param {number} trigger_time\r\n * @param {ActionEvent} action\r\n */\r\n add_action_event(trigger_time, action)\r\n {\r\n this.action_events.push({\r\n trigger_time: trigger_time,\r\n action: action\r\n });\r\n\r\n this.duration = Math.max(this.duration, trigger_time);\r\n }\r\n\r\n /**\r\n * @param {number} from\r\n * @param {number} to\r\n * @param {ActionInterpolator} interpolator\r\n * @param {boolean} [use_dynamic_from_value]\r\n */\r\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\r\n {\r\n if (use_dynamic_from_value)\r\n {\r\n const keyframes = this.channels[interpolator.attribute_name];\r\n\r\n if (keyframes === undefined)\r\n {\r\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\r\n }\r\n\r\n if (keyframes.length === 0)\r\n {\r\n interpolator.from = this.initial_context[interpolator.attribute_name];\r\n }\r\n else\r\n {\r\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\r\n }\r\n }\r\n\r\n const keyframe = {\r\n from: from,\r\n to: to,\r\n interpolator: interpolator\r\n };\r\n\r\n this.duration = Math.max(this.duration, to);\r\n this.channels[interpolator.attribute_name].push(keyframe);\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_current_target_value(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n\r\n if (this.elapsed_time < keyframe.from)\r\n {\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n return keyframe.interpolator.evaluate(1);\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_current_starting_value(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_current_progress(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\r\n\r\n return keyframe.interpolator.easing_function(t);\r\n }\r\n\r\n get_duration()\r\n {\r\n return this.duration;\r\n }\r\n\r\n /**\r\n * @param {number} from\r\n * @param {number} to\r\n */\r\n __play_clips(from, to) // eslint-disable-line no-unused-vars\r\n {\r\n if (this.elapsed_time > this.previous_elapsed_time)\r\n {\r\n this.__play_events(this.previous_elapsed_time, this.elapsed_time);\r\n }\r\n const channel_names = Object.keys(this.initial_context);\r\n\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n const name = channel_names[i];\r\n const keyframe = this.__get_current_keyframe(name, from);\r\n\r\n this.context[name] = this.evaluate_keyframe(keyframe, from);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} from\r\n * @param {number} to\r\n */\r\n __play_events(from, to)\r\n {\r\n for (let i = 0; i < this.action_events.length; i++)\r\n {\r\n const trigger_time = this.action_events[i].trigger_time;\r\n if (OMath.between(trigger_time, from, to))\r\n {\r\n console.log('Play event: ' + this.action_events[i].action.constructor.name + ' at ' + this.action_events[i].trigger_time);\r\n this.action_events[i].action.trigger();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {any} keyframe\r\n * @param {number} time\r\n */\r\n evaluate_keyframe(keyframe, time)\r\n {\r\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\r\n\r\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\r\n }\r\n\r\n /**\r\n * @param {string} channel_name\r\n */\r\n get_keyframes(channel_name)\r\n {\r\n return this.channels[channel_name];\r\n }\r\n\r\n /**\r\n * @param {string} channel_name\r\n */\r\n is_channel_redefined(channel_name)\r\n {\r\n for (let i = 0; i < this.channels[channel_name].length; i++)\r\n {\r\n const keyframe = this.channels[channel_name][i];\r\n\r\n if (keyframe.interpolator.initial)\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n * @param {number} from_range_start_value\r\n * @param {number} from_range_end_value\r\n * @returns {number}\r\n */\r\n __linear_map_01(value,\r\n from_range_start_value,\r\n from_range_end_value)\r\n {\r\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\r\n }\r\n\r\n /**\r\n * @param {string} channel_name\r\n * @param {number} time\r\n */\r\n __get_current_keyframe(channel_name, time)\r\n {\r\n let current = undefined;\r\n\r\n const keyframes = this.channels[channel_name];\r\n\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n const keyframe = keyframes[i];\r\n\r\n if (time >= keyframe.from && time <= keyframe.to)\r\n {\r\n current = keyframe;\r\n return current;\r\n }\r\n }\r\n\r\n let min = Infinity;\r\n\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n const keyframe = keyframes[i];\r\n const distance = Math.abs(keyframe.to - time);\r\n\r\n if (distance < min)\r\n {\r\n current = keyframe;\r\n min = distance;\r\n }\r\n }\r\n\r\n return current;\r\n }\r\n\r\n __get_playback_speed()\r\n {\r\n const url_params = new URLSearchParams(window.location.search);\r\n\r\n const transitions_velocity = url_params.get('transitions_velocity');\r\n\r\n if (transitions_velocity)\r\n {\r\n return Number(transitions_velocity);\r\n }\r\n else\r\n {\r\n return 1;\r\n }\r\n }\r\n}\r\n\r\nexport { ActionSequencer };\r\n","// @ts-check\r\nimport { ActionInterpolator } from './ActionInterpolator';\r\nimport { OMath } from '../utilities/OMath';\r\n\r\nclass NumberInterpolator extends ActionInterpolator\r\n{\r\n /**\r\n * @param {string} attribute_name\r\n * @param {number} [from]\r\n * @param {number} [to]\r\n * @param {boolean} [initial]\r\n * @param {import('../utilities/EasingFunctions').EasingFunctionType | function} [easing_function]\r\n */\r\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n this.initial = initial;\r\n }\r\n\r\n /**\r\n * @param {any} context\r\n * @param {number} t\r\n */\r\n update(context, t)\r\n {\r\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n\r\n /**\r\n * @param {number} t\r\n */\r\n evaluate(t)\r\n {\r\n return OMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n}\r\n\r\nexport { NumberInterpolator };\r\n","class DrawIOAnimationSheet\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n parse(xml_document)\r\n {\r\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\r\n\r\n const animation_nodes = doc.querySelectorAll('mxGeometry');\r\n\r\n const animation_tracks = [];\r\n const triggers = [];\r\n\r\n for (let i = 0; i < animation_nodes.length; i++)\r\n {\r\n const node = animation_nodes[i];\r\n const parent_node = node.parentElement;\r\n const data = parent_node.getAttribute('value');\r\n\r\n const x_pos = this.get_node_x_position(node);\r\n\r\n const from = x_pos / 100;\r\n const duration = parseFloat(node.getAttribute('width')) / 100;\r\n\r\n // is trigger\r\n if (parent_node.getAttribute('style').includes('rhombus;'))\r\n {\r\n const split_data = data.split('.');\r\n const trigger_name = split_data[0];\r\n const trigger_method = split_data[1];\r\n\r\n triggers.push({\r\n name: trigger_name,\r\n method: trigger_method,\r\n at_time: from + duration * 0.5\r\n });\r\n }\r\n\r\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\r\n !parent_node.getAttribute('style').includes('text;');\r\n\r\n if (valid_element && data !== '' && !data.includes(' '))\r\n {\r\n const split_data = data.split('=');\r\n\r\n const attribute_name = split_data[0];\r\n\r\n const value_data = split_data[1].split('--');\r\n const to_value = parseFloat(value_data[0]);\r\n const easing_function = value_data[1];\r\n\r\n if (split_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n if (value_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n animation_tracks.push({\r\n attribute_name: attribute_name,\r\n from_time: from,\r\n to_time: from + duration,\r\n to_value: to_value,\r\n easing_function: easing_function\r\n });\r\n }\r\n }\r\n\r\n animation_tracks.sort((a, b) =>\r\n {\r\n return a.from_time - b.from_time;\r\n });\r\n return {\r\n animation_tracks: animation_tracks,\r\n triggers: triggers\r\n };\r\n }\r\n\r\n get_node_x_position(node)\r\n {\r\n const x_pos = node.getAttribute('x');\r\n return x_pos === null ? 0 : parseFloat(x_pos);\r\n }\r\n}\r\n\r\nexport { DrawIOAnimationSheet };\r\n","import { ActionSequencer } from '../../action_sequencer/ActionSequencer';\r\nimport { NumberInterpolator } from '../../action_sequencer/NumberInterpolator';\r\nimport { ActionEvent } from '../../action_sequencer/ActionEvent';\r\nimport { DrawIOAnimationSheet } from './DrawIOAnimationSheet';\r\n\r\nclass ActionSequencerBuilder\r\n{\r\n constructor(default_state_data)\r\n {\r\n this.default_state_data = default_state_data;\r\n }\r\n\r\n from_animation_sheet(animation_data, current_context, initial_context)\r\n {\r\n initial_context = initial_context || this.default_state_data;\r\n const tracks = animation_data.animation_tracks;\r\n const triggers = animation_data.triggers;\r\n\r\n const initial_tracks = this.state_to_tracks(this.default_state_data, this.get_longest_time(animation_data.animation_tracks));\r\n\r\n for (let i = 0; i < initial_tracks.length; i++)\r\n {\r\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\r\n {\r\n tracks.push(initial_tracks[i]);\r\n }\r\n }\r\n\r\n const sequencer = new ActionSequencer(current_context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const t = tracks[i];\r\n const interpolator = new NumberInterpolator(\r\n t.attribute_name,\r\n current_context[t.attribute_name],\r\n t.to_value,\r\n t.initial,\r\n t.easing_function\r\n );\r\n\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n for (let i = 0; i < triggers.length; i++)\r\n {\r\n const t = triggers[i];\r\n const action_event = new ActionEvent(t.name, t.method, t.args);\r\n sequencer.add_action_event(t.at_time, action_event);\r\n }\r\n\r\n return sequencer;\r\n }\r\n\r\n state_to_tracks(state, longest_time)\r\n {\r\n const tracks = [];\r\n\r\n const keys = Object.keys(state);\r\n\r\n for (let i = 0; i < keys.length; i++)\r\n {\r\n tracks.push({\r\n attribute_name: keys[i],\r\n from_time: 0,\r\n to_time: longest_time < 1 ? longest_time : 1,\r\n to_value: state[keys[i]],\r\n initial: true,\r\n easing_function: 'ease_in_out_cubic'\r\n });\r\n }\r\n\r\n return tracks;\r\n }\r\n\r\n from_draw_io(xml, context)\r\n {\r\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\r\n const tracks = transition_data.animation_tracks;\r\n const triggers = transition_data.triggers;\r\n const sequencer = new ActionSequencer(context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const t = tracks[i];\r\n const interpolator = new NumberInterpolator(\r\n t.attribute_name,\r\n context[t.attribute_name],\r\n t.to_value,\r\n t.initial,\r\n t.easing_function\r\n );\r\n\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n for (let i = 0; i < triggers.length; i++)\r\n {\r\n const t = triggers[i];\r\n const action_event = new ActionEvent(t.name, t.method);\r\n sequencer.add_action_event(t.at_time, action_event);\r\n }\r\n\r\n return sequencer;\r\n }\r\n\r\n get_longest_time(tracks)\r\n {\r\n let longest_time = -1;\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const track = tracks[i];\r\n\r\n const track_time = track.to_time;\r\n\r\n longest_time = track_time > longest_time ? track_time : longest_time;\r\n }\r\n\r\n return longest_time;\r\n }\r\n}\r\n\r\nexport { ActionSequencerBuilder };\r\n","import { ActionSequencerBuilder } from './ActionSequencerBuilder';\r\n\r\nclass TransitionTable\r\n{\r\n constructor()\r\n {\r\n this.transitions = [];\r\n this.default_state_data = {};\r\n }\r\n\r\n get(from_state_name, to_state_name, current_context)\r\n {\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].to === to_state_name && this.transitions[i].from === undefined)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\r\n return undefined;\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n for (let i = 0; i < transitions.length; i++)\r\n {\r\n this.transitions.push(transitions[i]);\r\n }\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transitions = transitions;\r\n }\r\n\r\n set_default_state_data(default_state_data)\r\n {\r\n this.default_state_data = default_state_data;\r\n }\r\n}\r\n\r\nexport { TransitionTable };\r\n","class ViewState\r\n{\r\n constructor(name)\r\n {\r\n this.name = name;\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n before_enter()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n }\r\n\r\n before_exit()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n }\r\n\r\n before_update()\r\n {\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n fixed_update()\r\n {\r\n }\r\n\r\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n}\r\n\r\nexport { ViewState };\r\n","import { Time } from '../../Time';\r\nimport { ViewState } from '../ViewState';\r\n\r\nclass ViewStateTransitionHandler\r\n{\r\n constructor(transition_table)\r\n {\r\n this.last_state = new ViewState();\r\n this.current_state = new ViewState();\r\n\r\n this.default_state_data = {};\r\n this.current_state_data = {};\r\n\r\n this.transition_table = transition_table;\r\n\r\n this.transitioning = false;\r\n }\r\n\r\n go_to_state(state, skip = false)\r\n {\r\n if (this.transitioning)\r\n {\r\n this.__exit_last_state();\r\n }\r\n\r\n this.last_state = this.current_state;\r\n this.current_state = state;\r\n\r\n this.last_state.before_exit();\r\n this.current_state.before_enter();\r\n\r\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\r\n this.action_sequencer.play();\r\n\r\n this.transitioning = true;\r\n\r\n if (skip)\r\n {\r\n this.action_sequencer.skip();\r\n this.update();\r\n }\r\n }\r\n\r\n update()\r\n {\r\n if (this.transitioning)\r\n {\r\n this.__update_transitions();\r\n\r\n if (this.action_sequencer.is_finished())\r\n {\r\n this.transitioning = false;\r\n\r\n this.__update_transitions();\r\n\r\n this.__exit_last_state();\r\n\r\n this.current_state.on_enter();\r\n }\r\n }\r\n else\r\n {\r\n this.current_state.update();\r\n }\r\n }\r\n\r\n before_update()\r\n {\r\n this.current_state.before_update();\r\n }\r\n\r\n fixed_update()\r\n {\r\n this.current_state.fixed_update();\r\n }\r\n\r\n set_state(state)\r\n {\r\n this.current_state = state;\r\n }\r\n\r\n set_default_state_data(default_state_data)\r\n {\r\n Object.assign(this.default_state_data, default_state_data);\r\n Object.assign(this.current_state_data, default_state_data);\r\n }\r\n\r\n __update_transitions()\r\n {\r\n this.action_sequencer.update(Time.delta_time);\r\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n }\r\n\r\n __exit_last_state()\r\n {\r\n // if (this.last_state.name !== this.current_state.name)\r\n // {\r\n // this.last_state.hide();\r\n // }\r\n\r\n this.last_state.on_exit();\r\n }\r\n}\r\n\r\nexport { ViewStateTransitionHandler };\r\n","import { TransitionTable } from './transition/TransitionTable';\r\nimport { ViewStateTransitionHandler } from './transition/ViewStateTransitionHandler';\r\n\r\nclass TransitionManager\r\n{\r\n constructor()\r\n {\r\n this.transition_table = new TransitionTable();\r\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\r\n }\r\n\r\n get action_sequencer()\r\n {\r\n return this.transition_handler.action_sequencer;\r\n }\r\n\r\n get current_state_data()\r\n {\r\n return this.transition_handler.current_state_data;\r\n }\r\n\r\n get_current_state()\r\n {\r\n return this.transition_handler.current_state;\r\n }\r\n\r\n go_to_state(state, skip = false)\r\n {\r\n this.transition_handler.go_to_state(state, skip);\r\n }\r\n\r\n before_update()\r\n {\r\n this.transition_handler.before_update();\r\n }\r\n\r\n update()\r\n {\r\n this.transition_handler.update();\r\n }\r\n\r\n fixed_update()\r\n {\r\n this.transition_handler.fixed_update();\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n this.transition_table.add_transitions(transitions);\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transition_table.set_transitions(transitions);\r\n }\r\n\r\n set_state(state)\r\n {\r\n this.transition_handler.set_state(state);\r\n }\r\n\r\n set_default_state_data(default_state_data)\r\n {\r\n this.transition_table.set_default_state_data(default_state_data);\r\n this.transition_handler.set_default_state_data(default_state_data);\r\n }\r\n\r\n set_transitions_velocity(transitions_velocity)\r\n {\r\n this.transition_table.set_transitions_velocity(transitions_velocity);\r\n }\r\n}\r\n\r\nconst transition_manager = new TransitionManager();\r\nexport { transition_manager as TransitionManager };\r\n","import { TransitionManager } from './TransitionManager';\r\n\r\nclass ViewComponentManager\r\n{\r\n constructor()\r\n {\r\n this.components = [];\r\n this.enabled_components = new Set();\r\n }\r\n\r\n update()\r\n {\r\n this.__set_components_opacities();\r\n\r\n for (const component of this.enabled_components)\r\n {\r\n component.update(TransitionManager.current_state_data);\r\n }\r\n }\r\n\r\n register_component(component)\r\n {\r\n this.components.push(component);\r\n }\r\n\r\n enable_component(component)\r\n {\r\n // const component_to_enable = this.get_component_by_name(component_name);\r\n\r\n this.enabled_components.add(component);\r\n }\r\n\r\n disable_component(component)\r\n {\r\n // const component_to_disable = this.get_component_by_name(component_name);\r\n\r\n this.enabled_components.delete(component);\r\n }\r\n\r\n get_component_by_name(component_name)\r\n {\r\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\r\n this.get(component_name);\r\n }\r\n\r\n get(component_name)\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n if (this.components[i].name === component_name)\r\n {\r\n return this.components[i];\r\n }\r\n }\r\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\r\n return undefined;\r\n }\r\n\r\n __set_components_opacities()\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n this.components[i].set_opacity(TransitionManager.current_state_data);\r\n }\r\n }\r\n}\r\n\r\nconst view_component_manager = new ViewComponentManager();\r\nexport { view_component_manager as ViewComponentManager };\r\n","import { TransitionManager } from './TransitionManager';\r\n\r\nclass ViewManager\r\n{\r\n constructor()\r\n {\r\n this.views = [];\r\n\r\n this.browser_title_suffix = '';\r\n }\r\n\r\n update()\r\n {\r\n this.__set_views_opacities();\r\n }\r\n\r\n go_to_view(view_name, change_url = true, skip = false)\r\n {\r\n const v = this.get(view_name);\r\n\r\n if (change_url)\r\n {\r\n this.__change_browser_url(v.url);\r\n this.__change_browser_title(v.url);\r\n }\r\n\r\n TransitionManager.go_to_state(v, skip);\r\n }\r\n\r\n go_to_scene(scene_name, change_url = false, skip = false)\r\n {\r\n const next_view = this.get(scene_name);\r\n const transition_view = this.get('transition');\r\n\r\n transition_view.set_next_view(next_view);\r\n this.go_to_view(transition_view.name, change_url, skip);\r\n }\r\n\r\n register_view(view)\r\n {\r\n this.views.push(view);\r\n }\r\n\r\n has_view(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n set_view(view_name)\r\n {\r\n const view = this.get(view_name);\r\n\r\n TransitionManager.set_state(view);\r\n }\r\n\r\n set_browser_title_suffix(title_suffix)\r\n {\r\n this.browser_title_suffix = title_suffix;\r\n }\r\n\r\n get_current_view()\r\n {\r\n return TransitionManager.get_current_state();\r\n }\r\n\r\n get_view_by_name(view_name)\r\n {\r\n console.warn('DEPRECATED. Use ViewManager.get instead');\r\n this.get(view_name);\r\n }\r\n\r\n get(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('[ViewManager.get] no view found for: ', view_name);\r\n return undefined;\r\n }\r\n\r\n get_by_url(url)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].url === url)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('[ViewManager.get_by_url] no view found for: ', url);\r\n return undefined;\r\n }\r\n\r\n __change_browser_url(url)\r\n {\r\n window.history.pushState('', '', url);\r\n }\r\n\r\n __change_browser_title(name)\r\n {\r\n const title = this.__capitalize(name);\r\n\r\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\r\n }\r\n\r\n __set_views_opacities()\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n this.views[i].set_opacity(TransitionManager.current_state_data);\r\n }\r\n }\r\n\r\n __capitalize(string)\r\n {\r\n let aux_string = string.toUpperCase().replace('/', '');\r\n aux_string = this.__snake_to_whitespace(aux_string);\r\n\r\n return aux_string;\r\n }\r\n\r\n __snake_to_whitespace(string)\r\n {\r\n return string.replace(\r\n /([-_][A-Z])/g,\r\n (group) => group\r\n .replace('-', ' ')\r\n .replace('_', ' ')\r\n );\r\n }\r\n}\r\n\r\nconst view_manager = new ViewManager();\r\nexport { view_manager as ViewManager };\r\n","// @ts-check\r\nimport { BaseApplication } from './BaseApplication';\r\nimport { Debug } from './Debug';\r\nimport { Time } from './Time';\r\nimport { TransitionManager } from './view_components/TransitionManager';\r\nimport { ViewComponentManager } from './view_components/ViewComponentManager';\r\nimport { ViewManager } from './view_components/ViewManager';\r\nimport { Graphics, KeyboardInput } from './index'; // eslint-disable-line no-unused-vars\r\n\r\nclass RenderLoop\r\n{\r\n /**\r\n * @param {BaseApplication} target_application\r\n * @param {Graphics} graphics\r\n */\r\n constructor(target_application, graphics, input)\r\n {\r\n target_application = target_application || new BaseApplication();\r\n\r\n this.target_application = target_application;\r\n this.graphics = graphics;\r\n this.input = input;\r\n\r\n this.is_running = false;\r\n this.frames_passed = 0;\r\n\r\n this.time_accumulator = 0;\r\n }\r\n\r\n /**\r\n * @param {number} elapsed_time\r\n */\r\n update(elapsed_time)\r\n {\r\n if (!this.is_running)\r\n {\r\n return;\r\n }\r\n Time.__update(elapsed_time);\r\n\r\n // ###### START CYCLE ######\r\n if (this.frames_passed === 1)\r\n {\r\n this.target_application.on_post_start();\r\n }\r\n\r\n this.input.update();\r\n\r\n this.time_accumulator += Time.delta_time;\r\n\r\n this.target_application.before_update();\r\n TransitionManager.before_update();\r\n\r\n while (this.time_accumulator > Time.fixed_delta_time)\r\n {\r\n this.target_application.fixed_update();\r\n TransitionManager.fixed_update();\r\n\r\n this.time_accumulator -= Time.fixed_delta_time;\r\n }\r\n Time.__set_frame_interpolation(this.time_accumulator / Time.fixed_delta_time);\r\n\r\n this.target_application.update();\r\n\r\n TransitionManager.update();\r\n ViewManager.update();\r\n ViewComponentManager.update();\r\n\r\n this.target_application.on_pre_render();\r\n\r\n this.graphics.update(); // render scene\r\n this.target_application.on_post_render();\r\n\r\n Debug.render(this.graphics); // render debug layer\r\n\r\n // ###### END CYCLE #######\r\n this.target_application.on_frame_end();\r\n this.frames_passed++;\r\n\r\n this.input.clear();\r\n Debug.clear();\r\n }\r\n\r\n start()\r\n {\r\n if (this.is_running) return; // sanity check\r\n\r\n if (this.frames_passed === 0)\r\n {\r\n this.target_application.on_enter();\r\n }\r\n\r\n this.is_running = true;\r\n\r\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\r\n }\r\n\r\n stop()\r\n {\r\n if (this.is_running === false) return; // sanity check\r\n\r\n this.is_running = false;\r\n this.target_application.on_exit();\r\n\r\n this.graphics._renderer.setAnimationLoop(null);\r\n }\r\n\r\n /**\r\n * @param {BaseApplication} new_state\r\n */\r\n set_state(new_state)\r\n {\r\n this.target_application.on_exit(this);\r\n this.target_application = new_state;\r\n this.target_application.on_enter(this);\r\n }\r\n\r\n dispose()\r\n {\r\n this.stop();\r\n this.frames_passed = 0;\r\n }\r\n}\r\n\r\nexport { RenderLoop };\r\n","import { RenderLoop } from './RenderLoop'; // eslint-disable-line no-unused-vars\r\n\r\n// @ts-check\r\nclass BaseApplication\r\n{\r\n on_post_start()\r\n {}\r\n\r\n /**\r\n * @param {RenderLoop} [loop]\r\n */\r\n on_enter(loop) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n /**\r\n * @param {RenderLoop} [loop]\r\n */\r\n on_exit(loop) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n before_update()\r\n {}\r\n\r\n update()\r\n {}\r\n\r\n fixed_update()\r\n {}\r\n\r\n on_post_render()\r\n {}\r\n\r\n on_pre_render()\r\n {}\r\n\r\n on_frame_end()\r\n {}\r\n}\r\n\r\nexport { BaseApplication };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/add/add.frag';\r\n\r\nclass AddMaterial extends BlitMaterial\r\n{\r\n constructor(use_half_float = false)\r\n {\r\n super(frag);\r\n this.defines.USE_LINEAR_COLOR_SPACE = use_half_float;\r\n this.uniforms._SecondTex = { value: undefined };\r\n }\r\n\r\n set_add_texture(tex)\r\n {\r\n this.uniforms._SecondTex.value = tex;\r\n }\r\n}\r\n\r\nexport { AddMaterial };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\r\n\r\nimport { Color } from 'three';\r\nclass UnrealBloomComposeMaterial extends BlitMaterial\r\n{\r\n constructor(nMips, use_linear_color_space = false)\r\n {\r\n super(frag, undefined, {\r\n NUM_MIPS: nMips\r\n });\r\n this.uniforms._MainTex = { value: undefined };\r\n this.uniforms._BlurredTex = { value: undefined };\r\n this.uniforms._BloomStrength = { value: 1 };\r\n\r\n this.uniforms.blurTexture1 = { value: null };\r\n this.uniforms.blurTexture2 = { value: null };\r\n this.uniforms.blurTexture3 = { value: null };\r\n this.uniforms.blurTexture4 = { value: null };\r\n this.uniforms.blurTexture5 = { value: null };\r\n\r\n this.uniforms.bloomStrength = { value: 1.0 };\r\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\r\n this.uniforms.bloomRadius = { value: 1.0 };\r\n\r\n this.defines.USE_LINEAR_COLOR_SPACE = use_linear_color_space;\r\n const bloomTintColors = [\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF')\r\n ];\r\n\r\n this.uniforms.bloomTintColors = { value: bloomTintColors };\r\n }\r\n\r\n set_RT_0(rt)\r\n {\r\n this.uniforms.blurTexture1.value = rt;\r\n }\r\n\r\n set_RT_1(rt)\r\n {\r\n this.uniforms.blurTexture2.value = rt;\r\n }\r\n\r\n set_RT_2(rt)\r\n {\r\n this.uniforms.blurTexture3.value = rt;\r\n }\r\n\r\n set_RT_3(rt)\r\n {\r\n this.uniforms.blurTexture4.value = rt;\r\n }\r\n\r\n set_RT_4(rt)\r\n {\r\n this.uniforms.blurTexture5.value = rt;\r\n }\r\n\r\n set_bloom_strength(value)\r\n {\r\n this.uniforms.bloomStrength.value = value;\r\n }\r\n\r\n set_bloom_radius(value)\r\n {\r\n this.uniforms.bloomRadius.value = value;\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[0].set(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[1].set(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[2].set(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[3].set(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[4].set(col_string);\r\n }\r\n}\r\n\r\nexport { UnrealBloomComposeMaterial };\r\n","\r\nexport class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = this.is_number(loaded) ? loaded : 1;\r\n total = this.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n if (response.ok)\r\n {\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n else\r\n {\r\n this.__set_error(`${response.status}: ${response.statusText}`);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n\r\n is_int(n)\r\n {\r\n return Number(n) === n && n % 1 === 0;\r\n }\r\n\r\n is_float(n)\r\n {\r\n return Number(n) === n && n % 1 !== 0;\r\n }\r\n\r\n is_number(n)\r\n {\r\n return this.is_int(n) || this.is_float(n);\r\n }\r\n}\r\n","// @ts-check\r\nimport { AudioListener, Audio as TAudio } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { PositionalAudio as TPositionalAudio } from 'three';\r\n\r\nclass AudioClip\r\n{\r\n /**\r\n * @param {AudioBuffer} buffer\r\n * @param {boolean} [loop]\r\n * @param {number} [volume]\r\n * @param {boolean} [positional]\r\n */\r\n constructor(buffer, loop = true, volume = 1, positional = false)\r\n {\r\n this.buffer = buffer;\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n\r\n this.audio = undefined;\r\n }\r\n\r\n /**\r\n * @param {AudioListener} audio_listener\r\n */\r\n init(audio_listener)\r\n {\r\n if (this.positional)\r\n {\r\n this.audio = new TPositionalAudio(audio_listener);\r\n }\r\n else\r\n {\r\n this.audio = new TAudio(audio_listener);\r\n }\r\n\r\n this.audio.setBuffer(this.buffer);\r\n this.audio.setLoop(this.loop);\r\n\r\n // This prevents undesired volume at the beginning of playing\r\n this.audio.gain.gain.value = 0;\r\n\r\n this.audio.setVolume(this.loop ? 0 : this.volume);\r\n }\r\n\r\n play()\r\n {\r\n this.audio.play();\r\n }\r\n\r\n pause()\r\n {\r\n this.audio.pause();\r\n }\r\n\r\n stop()\r\n {\r\n this.audio.stop();\r\n }\r\n\r\n get is_playing()\r\n {\r\n return this.audio.isPlaying;\r\n }\r\n}\r\n\r\nexport { AudioClip };\r\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","// @ts-check\r\nimport { Object3D, Texture, } from 'three'; // eslint-disable-line\r\n\r\n/**\r\n * @typedef {Object3D | Texture} Resource\r\n */\r\n\r\nclass ResourceContainer\r\n{\r\n init()\r\n {\r\n /** @type {Record<string, Resource>} */\r\n this.resources = {};\r\n\r\n /** @type {Record<string, any>} */\r\n this.resources_by_url = {};\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n * @param {string} url\r\n * @param {Resource} resource\r\n */\r\n set_resource(name, url, resource)\r\n {\r\n const urls = Object.keys(this.resources_by_url);\r\n\r\n if (urls.includes(url))\r\n {\r\n this.resources[name] = this.resources_by_url[url];\r\n }\r\n else\r\n {\r\n this.resources[name] = resource;\r\n this.resources_by_url[url] = resource;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_resource(name)\r\n {\r\n return this.resources[name];\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get(name)\r\n {\r\n return this.resources[name];\r\n }\r\n}\r\n\r\nconst resource_container = new ResourceContainer();\r\nexport { resource_container as ResourceContainer };\r\n","// @ts-check\r\nimport { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass AsyncAbstractLoader\r\n{\r\n /**\r\n * @param {string} name\r\n * @param {any[]} assets\r\n * @param {Worker} worker\r\n */\r\n constructor(name, assets, worker)\r\n {\r\n this.resource_container = ResourceContainer;\r\n this.assets = assets;\r\n this.name = name;\r\n\r\n this.worker = worker;\r\n\r\n this.bound_on_message = this.on_message.bind(this);\r\n\r\n this.__setup_worker();\r\n\r\n this.assets_loaders = this.__setup_loaders();\r\n }\r\n\r\n load()\r\n {\r\n this.worker.postMessage({ type: 'load', loader_name: this.name });\r\n }\r\n\r\n is_loaded()\r\n {\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n const asset_loader = this.assets_loaders[i];\r\n\r\n if (!asset_loader.has_finished)\r\n {\r\n return false;\r\n }\r\n else\r\n {\r\n if (asset_loader.has_error)\r\n {\r\n // Restore original url so the error message make more sense\r\n asset_loader.url = asset_loader.original_url;\r\n\r\n asset_loader.print_error();\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.__get_loaded_bytes() / this.__get_total_bytes();\r\n }\r\n\r\n __get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n loaded_bytes += this.assets_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n __get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n total_bytes += this.assets_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n\r\n get_assets_names()\r\n {\r\n const names = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset = this.assets[i];\r\n\r\n names.push(asset.name);\r\n }\r\n\r\n return names;\r\n }\r\n\r\n static create_worker()\r\n {\r\n const worker = new Worker(\r\n new URL('./assets_loader/AsyncAssetsLoaderWorker.js', import.meta.url),\r\n { name: 'OHZI - AssetLoader', type: 'module' });\r\n\r\n return worker;\r\n }\r\n\r\n __setup_worker()\r\n {\r\n this.worker.addEventListener('message', this.bound_on_message);\r\n\r\n this.worker.postMessage({ type: 'assets', loader_name: this.name, data: this.assets });\r\n }\r\n\r\n /**\r\n * @param {MessageEvent} e\r\n */\r\n on_message(e)\r\n {\r\n const message = e.data;\r\n\r\n switch (message.type)\r\n {\r\n case `asset_loaded_${this.name}`:\r\n this.__on_assets_loaded(message.data);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * @param {any} resources\r\n */\r\n __on_assets_loaded(resources)\r\n {\r\n this.worker.removeEventListener('message', this.bound_on_message);\r\n\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n const asset_loader = this.assets_loaders[i];\r\n\r\n // Save original url to show in a possible error\r\n asset_loader.original_url = asset_loader.url;\r\n\r\n asset_loader.url = resources[asset_loader.resource_id];\r\n\r\n asset_loader.on_preloaded_finished(this.resource_container);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {any[]}\r\n */\r\n __setup_loaders()\r\n {\r\n console.warn('Not implemented');\r\n return [];\r\n }\r\n}\r\n\r\nexport { AsyncAbstractLoader };\r\n","import { AudioLoader } from '../resource_loader/AudioLoader';\r\nimport { AsyncAbstractLoader } from './AsyncAbstractLoader';\r\n\r\nclass AsyncAudiosLoader extends AsyncAbstractLoader\r\n{\r\n constructor(scene_name, assets, worker)\r\n {\r\n super(scene_name, assets, worker);\r\n }\r\n\r\n // Called from parent\r\n __setup_loaders()\r\n {\r\n const loaders = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset_data = this.assets[i];\r\n\r\n loaders.push(new AudioLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.loop,\r\n asset_data.volume,\r\n asset_data.size,\r\n asset_data.positional\r\n ));\r\n }\r\n\r\n return loaders;\r\n }\r\n}\r\n\r\nexport { AsyncAudiosLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","// @ts-check\r\nimport { GLTFDRACOLoader } from '../resource_loader/GLTFDRACOLoader';\r\nimport { GLTFLoader } from '../resource_loader/GLTFLoader';\r\nimport { ResourceContainer } from '../ResourceContainer';\r\nimport { AsyncAbstractLoader } from './AsyncAbstractLoader';\r\n\r\nclass AsyncObjectsLoader extends AsyncAbstractLoader\r\n{\r\n /**\r\n * @param {string} scene_name\r\n * @param {any[]} assets\r\n * @param {Worker} worker\r\n */\r\n constructor(scene_name, assets, worker)\r\n {\r\n super(scene_name, assets, worker);\r\n }\r\n\r\n // Called from parent\r\n __setup_loaders()\r\n {\r\n const loaders = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset_data = this.assets[i];\r\n\r\n if (asset_data.draco)\r\n {\r\n const draco_loader = ResourceContainer.get('draco_loader');\r\n\r\n loaders.push(new GLTFDRACOLoader(asset_data.name, asset_data.url, draco_loader, asset_data.size));\r\n }\r\n else\r\n {\r\n loaders.push(new GLTFLoader(asset_data.name, asset_data.url, asset_data.size));\r\n }\r\n }\r\n\r\n return loaders;\r\n }\r\n}\r\n\r\nexport { AsyncObjectsLoader };\r\n","// @ts-check\r\nclass Browser\r\n{\r\n async init()\r\n {\r\n this.browser_name = '';\r\n this.agent = window.navigator.userAgent.toLowerCase();\r\n\r\n this.has_web_xr_support = 'xr' in navigator;\r\n this.is_vr = this.has_web_xr_support && await navigator.xr.isSessionSupported('immersive-vr');\r\n\r\n switch (true)\r\n {\r\n case this.agent.indexOf('edge') > -1:\r\n this.browser_name = 'edge_ie';\r\n break;\r\n case this.agent.indexOf('edg') > -1:\r\n this.browser_name = 'edge_chromium';\r\n break;\r\n // @ts-ignore\r\n case this.agent.indexOf('opr') > -1 && !!window.opr:\r\n this.browser_name = 'opera';\r\n break;\r\n // @ts-ignore\r\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\r\n this.browser_name = 'chrome';\r\n break;\r\n case this.agent.indexOf('trident') > -1:\r\n this.browser_name = 'iexplorer';\r\n break;\r\n case this.agent.indexOf('firefox') > -1:\r\n this.browser_name = 'firefox';\r\n break;\r\n case this.agent.indexOf('safari') > -1:\r\n this.browser_name = 'safari';\r\n break;\r\n default:\r\n this.browser_name = 'other';\r\n break;\r\n }\r\n\r\n this.version = this.get_version();\r\n }\r\n\r\n get name()\r\n {\r\n return this.browser_name;\r\n }\r\n\r\n get is_safari()\r\n {\r\n return this.browser_name === 'safari';\r\n }\r\n\r\n get is_chrome()\r\n {\r\n return this.browser_name === 'chrome';\r\n }\r\n\r\n get is_firefox()\r\n {\r\n return this.browser_name === 'firefox';\r\n }\r\n\r\n get is_edge()\r\n {\r\n return this.browser_name === 'edge_ie';\r\n }\r\n\r\n get is_edge_chromium()\r\n {\r\n return this.browser_name === 'edge_chromium';\r\n }\r\n\r\n get has_webm()\r\n {\r\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\r\n }\r\n\r\n get has_hvec()\r\n {\r\n return this.is_safari;\r\n }\r\n\r\n get preferred_video_extension()\r\n {\r\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\r\n }\r\n\r\n get_version()\r\n {\r\n const ua = navigator.userAgent;\r\n let tem = [];\r\n let version = '0';\r\n\r\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\r\n\r\n if (/trident/i.test(M[1]))\r\n {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n version = 'IE ' + (tem[1] || '');\r\n }\r\n if (M[1] === 'Chrome')\r\n {\r\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\r\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\r\n }\r\n\r\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\r\n if ((tem = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null) M.splice(1, 1, tem[1]);\r\n\r\n version = M.join(' ');\r\n\r\n return Number(version.split(' ')[1]);\r\n }\r\n}\r\n\r\nconst browser = new Browser();\r\nexport { browser as Browser };\r\n","import { Browser } from '../Browser';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { NoColorSpace, SRGBColorSpace, Texture } from 'three';\r\n\r\nexport class AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size, flipY = true, premultiplyAlpha = false, colorSpaceConversion = true)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.original_url = '';\r\n\r\n this.colorSpaceConversion = colorSpaceConversion;\r\n this.premultiplyAlpha = premultiplyAlpha;\r\n this.flipY = flipY;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari) // && Browser.version < 15\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('The source image could not be decoded.', this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, {\r\n colorSpaceConversion: this.colorSpaceConversion ? 'default' : 'none',\r\n imageOrientation: this.flipY ? 'flipY' : 'from-image',\r\n premultiplyAlpha: this.premultiplyAlpha ? 'premultiply' : 'none'\r\n });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch((e) =>\r\n {\r\n console.error(e, this.original_url);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\n// import { sRGBEncoding } from 'three';\r\n\r\nclass BasisLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.loader = loader;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (basis) =>\r\n {\r\n // basis.encoding = sRGBEncoding;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, basis);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { BasisLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\n\r\nclass HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THDRCubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n // this.loader.setDataType(UnsignedByteType);\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\r\n\r\nclass RGBETextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new RGBELoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { RGBETextureLoader };\r\n","import { AsyncTextureLoader } from '../resource_loader/AsyncTextureLoader';\r\nimport { BasisLoader } from '../resource_loader/BasisLoader';\r\nimport { CubemapLoader } from '../resource_loader/CubemapLoader';\r\nimport { HDRCubeTextureLoader } from '../resource_loader/HDRCubeTextureLoader';\r\nimport { RGBETextureLoader } from '../resource_loader/RGBETextureLoader';\r\nimport { ResourceContainer } from '../ResourceContainer';\r\nimport { AsyncAbstractLoader } from './AsyncAbstractLoader';\r\n\r\nclass AsyncTexturesLoader extends AsyncAbstractLoader\r\n{\r\n constructor(scene_name, assets, worker)\r\n {\r\n super(scene_name, assets, worker);\r\n }\r\n\r\n // Called from parent\r\n __setup_loaders()\r\n {\r\n const loaders = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset_data = this.assets[i];\r\n\r\n switch (asset_data.kind)\r\n {\r\n case 'regular':\r\n loaders.push(new AsyncTextureLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.size,\r\n asset_data.flipY,\r\n asset_data.premultiplyAlpha,\r\n asset_data.colorSpaceConversion\r\n ));\r\n\r\n break;\r\n case 'basis':\r\n loaders.push(new BasisLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n ResourceContainer.get('basis_loader'),\r\n asset_data.size\r\n ));\r\n\r\n break;\r\n case 'hdr':\r\n loaders.push(new RGBETextureLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.size\r\n ));\r\n\r\n break;\r\n case 'cubemap':\r\n loaders.push(new CubemapLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.extension,\r\n asset_data.size\r\n ));\r\n break;\r\n case 'cubemap_hdr':\r\n loaders.push(new HDRCubeTextureLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.extension,\r\n asset_data.size\r\n ));\r\n\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return loaders;\r\n }\r\n}\r\n\r\nexport { AsyncTexturesLoader };\r\n","class CompilatorManager\r\n{\r\n constructor(compilators)\r\n {\r\n this.compilators = compilators;\r\n this.first_update = true;\r\n\r\n this.index = 0;\r\n }\r\n\r\n update()\r\n {\r\n if (!this.is_finished())\r\n {\r\n if (this.compilators[this.index].finished)\r\n {\r\n this.index++;\r\n this.first_update = true;\r\n }\r\n else\r\n {\r\n if (this.first_update)\r\n {\r\n this.compilators[this.index].start();\r\n this.first_update = false;\r\n }\r\n else\r\n {\r\n this.compilators[this.index].update();\r\n }\r\n }\r\n }\r\n }\r\n\r\n is_finished()\r\n {\r\n return this.index === this.compilators.length;\r\n }\r\n}\r\n\r\nexport { CompilatorManager };\r\n","import { ResourceContainer } from 'ohzi-core';\r\n\r\nimport { AsyncAudiosLoader } from '../../loaders/AsyncAudiosLoader';\r\nimport { AsyncObjectsLoader } from '../../loaders/AsyncObjectsLoader';\r\nimport { AsyncTexturesLoader } from '../../loaders/AsyncTexturesLoader';\r\nimport { CompilatorManager } from './CompilatorManager';\r\n\r\nexport class LoadingState\r\n{\r\n constructor(scene, { SceneCompilator, TexturesCompilator, AudiosCompilator })\r\n {\r\n this.scene = scene;\r\n\r\n this.SceneCompilator = SceneCompilator;\r\n this.TexturesCompilator = TexturesCompilator;\r\n this.AudiosCompilator = AudiosCompilator;\r\n\r\n this.loaders = [];\r\n this.compilators = [];\r\n\r\n this.callback_called = false;\r\n }\r\n\r\n set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders = [], custom_compilators = [], custom_data = [])\r\n {\r\n this.scene_objects = scene_objects;\r\n this.scene_textures = scene_textures;\r\n this.scene_sounds = scene_sounds;\r\n\r\n this.custom_loaders = custom_loaders;\r\n this.custom_compilators = custom_compilators;\r\n this.custom_data = custom_data;\r\n }\r\n\r\n get loading_progress()\r\n {\r\n let progress = 0;\r\n\r\n for (let i = 0; i < this.loaders.length; i++)\r\n {\r\n const loader = this.loaders[i];\r\n progress += loader.get_progress();\r\n }\r\n return progress / this.loaders.length;\r\n }\r\n\r\n load()\r\n {\r\n this.setup_loader();\r\n\r\n // TODO: improve this.\r\n // We call load method to one of the 3 loaders because they share the same worker.\r\n this.loaders[0].load();\r\n }\r\n\r\n on_enter()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n }\r\n\r\n update()\r\n {\r\n\r\n }\r\n\r\n setup_loader()\r\n {\r\n const compilators = [];\r\n\r\n const assets_worker = ResourceContainer.get('assets_worker');\r\n assets_worker.postMessage({ type: 'reset', loader_name: this.scene.name });\r\n\r\n const object_loader = new AsyncObjectsLoader(this.scene.name, this.scene_objects, assets_worker);\r\n this.loaders.push(object_loader);\r\n compilators.push(new this.SceneCompilator(this.scene));\r\n\r\n const textures_loader = new AsyncTexturesLoader(this.scene.name, this.scene_textures, assets_worker);\r\n this.loaders.push(textures_loader);\r\n compilators.push(new this.TexturesCompilator(textures_loader.get_assets_names()));\r\n\r\n const audios_loader = new AsyncAudiosLoader(this.scene.name, this.scene_sounds, assets_worker);\r\n this.loaders.push(audios_loader);\r\n compilators.push(new this.AudiosCompilator(audios_loader.get_assets_names()));\r\n\r\n for (let i = 0; i < this.custom_loaders.length; i++)\r\n {\r\n const loader = new this.custom_loaders[i](this.scene.name, this.custom_data[i], assets_worker);\r\n this.loaders.push(loader);\r\n compilators.push(new this.custom_compilators[i](loader.get_assets_names()));\r\n }\r\n\r\n this.compilator_manager = new CompilatorManager(compilators);\r\n }\r\n\r\n is_loaded()\r\n {\r\n let loaded = true;\r\n\r\n for (let i = 0; i < this.loaders.length; i++)\r\n {\r\n const loader = this.loaders[i];\r\n\r\n loaded = loaded && loader.is_loaded();\r\n }\r\n\r\n return loaded;\r\n }\r\n\r\n is_compiled()\r\n {\r\n this.compilator_manager.update();\r\n return this.compilator_manager.is_finished();\r\n }\r\n}\r\n","import { LoadingState } from './LoadingState';\r\n\r\nexport class HighQualityLoadingState extends LoadingState\r\n{\r\n on_enter()\r\n {\r\n super.on_enter();\r\n // this.setup_loader();\r\n }\r\n\r\n on_exit()\r\n {\r\n super.on_exit();\r\n }\r\n\r\n update()\r\n {\r\n super.update();\r\n\r\n if (this.is_loaded())\r\n {\r\n // if (this.is_compiled())\r\n // {\r\n this.scene.on_high_quality_assets_ready();\r\n // }\r\n }\r\n }\r\n}\r\n","import { LoadingState } from './LoadingState';\r\n\r\nexport class RegularLoadingState extends LoadingState\r\n{\r\n constructor(scene, compilators)\r\n {\r\n super(scene, compilators);\r\n\r\n this.on_assets_ready_called = false;\r\n }\r\n\r\n on_enter()\r\n {\r\n super.on_enter();\r\n // this.setup_loader();\r\n }\r\n\r\n on_exit()\r\n {\r\n super.on_exit();\r\n }\r\n\r\n update()\r\n {\r\n super.update();\r\n\r\n if (this.is_loaded())\r\n {\r\n if (!this.on_assets_ready_called)\r\n {\r\n this.scene.on_assets_ready();\r\n this.on_assets_ready_called = true;\r\n }\r\n\r\n if (this.is_compiled())\r\n {\r\n this.scene.on_assets_compiled();\r\n }\r\n }\r\n }\r\n}\r\n","import { Scene } from 'three';\r\n// import { AvatarSystem } from '../../components/avatar/AvatarSystem';\r\n\r\nimport { HighQualityLoadingState } from './loading_states/HighQualityLoadingState';\r\nimport { LoadingState } from './loading_states/LoadingState';\r\nimport { RegularLoadingState } from './loading_states/RegularLoadingState';\r\n\r\nclass AbstractScene extends Scene\r\n{\r\n constructor({ name, compilators })\r\n {\r\n super();\r\n\r\n this.name = name;\r\n\r\n this.initialized = false;\r\n this.is_loaded = false;\r\n this.is_high_loaded = false;\r\n\r\n this.loading_states = {\r\n regular: new RegularLoadingState(this, compilators),\r\n high: new HighQualityLoadingState(this, compilators)\r\n };\r\n\r\n this.current_loading_state = new LoadingState(this, compilators);\r\n // this.set_loading_state(this.loading_states.regular);\r\n }\r\n\r\n get loading_progress()\r\n {\r\n return this.current_loading_state.loading_progress;\r\n }\r\n\r\n init()\r\n {\r\n this.initialized = true;\r\n }\r\n\r\n load()\r\n {\r\n if (!this.initialized)\r\n {\r\n this.init();\r\n }\r\n\r\n this.set_loading_state(this.loading_states.regular);\r\n this.current_loading_state.load();\r\n }\r\n\r\n get_objects()\r\n {\r\n const objects = [];\r\n\r\n this.traverse(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n objects.push(child);\r\n\r\n // if (child.name === 'pitch_floor')\r\n // {\r\n // objects.push(child);\r\n // }\r\n // else\r\n // {\r\n // child.visible = false;\r\n // }\r\n }\r\n });\r\n\r\n return objects;\r\n }\r\n\r\n dispose_cpu()\r\n {\r\n this.traverse(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.attributes.position.array = new Float32Array(3);\r\n if (child.geometry.attributes.normal)\r\n {\r\n child.geometry.attributes.normal.array = new Float32Array(3);\r\n }\r\n if (child.geometry.attributes.uv)\r\n {\r\n child.geometry.attributes.uv.array = new Float32Array(2);\r\n }\r\n if (child.material.map)\r\n {\r\n for (let i = 0; i < child.material.map.mipmaps.length; i++)\r\n {\r\n child.material.map.mipmaps[i] = new Uint8Array(4);\r\n }\r\n }\r\n }\r\n });\r\n\r\n // AvatarSystem.component_container.component_instancer.data_texture.data = new Float32Array(4);\r\n\r\n this.initialized = false;\r\n }\r\n\r\n dispose()\r\n {\r\n this.traverse(child =>\r\n {\r\n if (child.material)\r\n {\r\n if (child.material.map)\r\n {\r\n child.material.map.dispose();\r\n }\r\n\r\n child.material.dispose();\r\n child.geometry.dispose();\r\n }\r\n });\r\n // AvatarSystem.component_container.component_instancer.data_texture.data = new Float32Array(4);\r\n\r\n this.initialized = false;\r\n }\r\n\r\n set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data)\r\n {\r\n this.loading_states.regular.set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data);\r\n }\r\n\r\n set_high_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data)\r\n {\r\n this.loading_states.high.set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data);\r\n }\r\n\r\n set_loading_state(state)\r\n {\r\n this.current_loading_state.on_exit();\r\n this.current_loading_state = state;\r\n this.current_loading_state.on_enter();\r\n }\r\n\r\n // Called from transition\r\n update_loading_state()\r\n {\r\n if (!this.is_high_loaded)\r\n {\r\n this.current_loading_state.update();\r\n }\r\n }\r\n\r\n update()\r\n {\r\n this.update_loading_state();\r\n }\r\n\r\n on_assets_ready()\r\n {\r\n\r\n }\r\n\r\n on_assets_compiled()\r\n {\r\n this.is_loaded = true;\r\n\r\n // Load high quality assets\r\n this.set_loading_state(this.loading_states.high);\r\n this.current_loading_state.load();\r\n }\r\n\r\n on_high_quality_assets_ready()\r\n {\r\n this.is_high_loaded = true;\r\n }\r\n}\r\n\r\nexport { AbstractScene };\r\n","import { TransitionManager } from './TransitionManager';\r\nimport { ViewManager } from './ViewManager';\r\nimport { ViewState } from './ViewState';\r\n\r\nclass ApplicationView extends ViewState\r\n{\r\n constructor({ name, url, container, transition_data })\r\n {\r\n super(name);\r\n\r\n this.container = container;\r\n this.url = url;\r\n\r\n this.current_opacity = 0;\r\n\r\n transition_data = transition_data || {\r\n animation_tracks: [],\r\n triggers: []\r\n };\r\n\r\n const transitions = [\r\n {\r\n to: name,\r\n data: transition_data\r\n }\r\n ];\r\n\r\n ViewManager.register_view(this);\r\n TransitionManager.add_transitions(transitions);\r\n }\r\n\r\n before_enter()\r\n {\r\n this.container.classList.add('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n before_exit()\r\n {\r\n this.container.classList.add('before_exit');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n on_exit()\r\n {\r\n this.container.classList.add('hidden');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n }\r\n\r\n set_opacity(current_state_data)\r\n {\r\n const opacity = current_state_data[`${this.name}_opacity`];\r\n\r\n if (this.current_opacity > opacity || this.current_opacity < opacity)\r\n {\r\n this.current_opacity = opacity;\r\n\r\n this.container.style.opacity = this.current_opacity;\r\n }\r\n }\r\n}\r\n\r\nexport { ApplicationView };\r\n","// @ts-check\r\nimport { CanvasTexture } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { UVMapping } from 'three';\r\nimport { ClampToEdgeWrapping } from 'three';\r\nimport { NearestFilter } from 'three';\r\n\r\nclass CanvasDrawer\r\n{\r\n /**\r\n * @param {boolean} [uses_dynamic_font]\r\n */\r\n constructor(uses_dynamic_font)\r\n {\r\n this.uses_dynamic_font = !!uses_dynamic_font;\r\n this.__textHeight = null;\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.ctx = this.canvas.getContext('2d');\r\n }\r\n\r\n getFontHeight(fontStyle = 'Arial')\r\n {\r\n if (this.__textHeight == null || this.uses_dynamic_font)\r\n {\r\n const body = document.getElementsByTagName('body')[0];\r\n const dummy = document.createElement('div');\r\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\r\n dummy.appendChild(dummyText);\r\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\r\n body.appendChild(dummy);\r\n this.__textHeight = dummy.offsetHeight;\r\n body.removeChild(dummy);\r\n }\r\n return this.__textHeight;\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\n get_text_size(text, font = '24px Arial')\r\n {\r\n const size = new Vector2();\r\n this.ctx.font = font;\r\n size.x = Math.ceil(this.ctx.measureText(text).width);\r\n size.y = Math.ceil(this.getFontHeight(font));\r\n return size;\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {any} [ctxOptions]\r\n */\r\n draw_canvas(text, ctxOptions = {})\r\n {\r\n ctxOptions.font = ctxOptions.font || '24px Arial';\r\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\r\n\r\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\r\n return this.canvas;\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {any} [ctxOptions]\r\n */\r\n draw_on_texture(text, ctxOptions)\r\n {\r\n const canvas = this.draw_canvas(text, ctxOptions);\r\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\r\n ClampToEdgeWrapping,\r\n ClampToEdgeWrapping,\r\n NearestFilter,\r\n NearestFilter);\r\n canvas_texture.generateMipmaps = false;\r\n canvas_texture.needsUpdate = true;\r\n\r\n return canvas_texture;\r\n }\r\n\r\n /**\r\n * @param {string[] | string} text\r\n * @param {any} [ctxOptions]\r\n * @param {HTMLCanvasElement} [canvas]\r\n * @param {CanvasRenderingContext2D} [ctx]\r\n */\r\n __draw(text, ctxOptions, canvas, ctx) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n /**\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {number} x\r\n * @param {number} y\r\n * @param {number} width\r\n * @param {number} height\r\n * @param {number | {tl:number, tr:number, br:number, bl:number}} radius\r\n * @param {boolean} fill\r\n * @param {boolean} stroke\r\n */\r\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\r\n {\r\n if (typeof stroke === 'undefined')\r\n {\r\n stroke = true;\r\n }\r\n if (typeof radius === 'undefined')\r\n {\r\n radius = 5;\r\n }\r\n if (typeof radius === 'number')\r\n {\r\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\r\n }\r\n else\r\n {\r\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\r\n for (const side in defaultRadius)\r\n {\r\n const _side = /** @type {keyof typeof defaultRadius} */ (side);\r\n radius[_side] = radius[_side] || defaultRadius[_side];\r\n }\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius.tl, y);\r\n ctx.lineTo(x + width - radius.tr, y);\r\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\r\n ctx.lineTo(x + width, y + height - radius.br);\r\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\r\n ctx.lineTo(x + radius.bl, y + height);\r\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\r\n ctx.lineTo(x, y + radius.tl);\r\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\r\n ctx.closePath();\r\n if (fill)\r\n {\r\n ctx.fill();\r\n }\r\n if (stroke)\r\n {\r\n ctx.stroke();\r\n }\r\n }\r\n}\r\n\r\nexport { CanvasDrawer };\r\n","// @ts-check\r\nimport { CanvasDrawer } from './CanvasDrawer';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass SimpleTextDrawer extends CanvasDrawer\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.text_margin = new Vector2(2, 0);\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {any} [ctxOptions]\r\n * @param {HTMLCanvasElement} [canvas]\r\n * @param {CanvasRenderingContext2D} [ctx]\r\n */\r\n __draw(text, ctxOptions, canvas, ctx)\r\n {\r\n ctx.font = ctxOptions.font;\r\n\r\n const text_size = this.get_text_size(text, ctxOptions.font);\r\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\r\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\r\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\r\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // turn this on for debugging\r\n ctx.globalAlpha = 0.0;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.font = ctxOptions.font;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.textBaseline = 'middle';\r\n\r\n ctx.textAlign = ctxOptions.textAlign || 'center';\r\n if (ctx.textAlign === 'center')\r\n {\r\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\r\n }\r\n else\r\n {\r\n ctx.fillText(text, 0, canvas.height / 2);\r\n }\r\n }\r\n}\r\n\r\nexport { SimpleTextDrawer };\r\n","class Idle\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n get is_animating()\r\n {\r\n return false;\r\n }\r\n\r\n on_enter(view)\r\n {\r\n\r\n }\r\n\r\n update(view)\r\n {\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport { Idle };\r\n","import { Time } from '../../Time';\r\nimport { Idle } from './Idle';\r\n\r\nimport { OMath } from '../../utilities/OMath';\r\nclass Animating\r\n{\r\n constructor()\r\n {\r\n this.t = 0;\r\n this.easing_function_t = 0;\r\n }\r\n\r\n get is_animating()\r\n {\r\n return true;\r\n }\r\n\r\n on_enter(animator)\r\n {\r\n }\r\n\r\n update(animator)\r\n {\r\n this.t += Time.delta_time / animator.duration;\r\n\r\n this.easing_function_t = animator.easing_function(this.t);\r\n this.easing_function_t = OMath.clamp(this.easing_function_t, 0, 1);\r\n\r\n animator.set_property_value(OMath.lerp(animator.from, animator.to, this.easing_function_t));\r\n\r\n if (this.easing_function_t >= 0.9999)\r\n {\r\n animator.set_property_value(animator.to);\r\n\r\n animator.set_current_state(new Idle());\r\n animator.finished_callback(animator);\r\n }\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport { Animating };\r\n","import { Animating } from './css_animator_states/Animating';\r\nimport { Idle } from './css_animator_states/Idle';\r\nimport { EasingFunctions } from '../utilities/EasingFunctions';\r\n\r\nclass CSSAnimator\r\n{\r\n constructor({\r\n element,\r\n css_property,\r\n from = 0,\r\n to = 1,\r\n duration = 1,\r\n value_prefix = '',\r\n value_suffix = '',\r\n easing_function = EasingFunctions.ease_in_out_cubic,\r\n finished_callback = () =>\r\n {}\r\n })\r\n {\r\n this.element = element;\r\n this.css_property = css_property;\r\n this.from = from;\r\n this.to = to;\r\n this.value_prefix = value_prefix;\r\n this.value_suffix = value_suffix;\r\n this.duration = duration;\r\n this.easing_function = easing_function;\r\n this.finished_callback = finished_callback;\r\n\r\n this.current_state = new Idle();\r\n }\r\n\r\n animate()\r\n {\r\n this.set_current_state(new Animating());\r\n }\r\n\r\n stop()\r\n {\r\n this.set_current_state(new Idle());\r\n }\r\n\r\n set_property_value(value)\r\n {\r\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\r\n }\r\n\r\n update()\r\n {\r\n this.current_state.update(this);\r\n }\r\n\r\n get is_animating()\r\n {\r\n return this.current_state.is_animating;\r\n }\r\n\r\n set_current_state(state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = state;\r\n this.current_state.on_enter(this);\r\n }\r\n}\r\n\r\nexport { CSSAnimator };\r\n","// @ts-check\r\nclass OS\r\n{\r\n init()\r\n {\r\n this.operating_systems = {\r\n ANDROID: 'android',\r\n IOS: 'ios',\r\n LINUX: 'linux',\r\n MAC: 'mac',\r\n WINDOWS: 'windows'\r\n };\r\n\r\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\r\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\r\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\r\n\r\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\r\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\r\n this.is_mac = this.get_os() === this.operating_systems.MAC;\r\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\r\n }\r\n\r\n get_os()\r\n {\r\n const userAgent = window.navigator.userAgent;\r\n const platform = window.navigator.platform;\r\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\r\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\r\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\r\n let os = null;\r\n\r\n if (macosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.MAC;\r\n }\r\n else if (iosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.IOS;\r\n }\r\n else if (windowsPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.WINDOWS;\r\n }\r\n else if (/Android/.test(userAgent))\r\n {\r\n os = this.operating_systems.ANDROID;\r\n }\r\n else if (!os && /Linux/.test(platform))\r\n {\r\n os = this.operating_systems.LINUX;\r\n }\r\n\r\n return os;\r\n }\r\n}\r\n\r\nconst os = new OS();\r\nexport { os as OS };\r\n","// @ts-check\r\nimport { BufferGeometry, Vector3 } from 'three'; // eslint-disable-line\r\n\r\nclass ReflectionPlaneContext\r\n{\r\n init()\r\n {\r\n this.target_geometry = undefined;\r\n this.target_position = new Vector3();\r\n }\r\n\r\n /**\r\n * @param {BufferGeometry} geometry\r\n */\r\n set_target_geometry(geometry)\r\n {\r\n this.target_geometry = geometry;\r\n }\r\n}\r\n\r\nconst reflection_plane_context = new ReflectionPlaneContext();\r\nexport { reflection_plane_context as ReflectionPlaneContext };\r\n","import { DataTexture, FloatType, Mesh, RGBAFormat, ShaderMaterial, Vector2 } from 'three';\r\n\r\nclass GeometryBatch\r\n{\r\n constructor(geometry, batch_width)\r\n {\r\n this.geometry = geometry;\r\n\r\n this.material = undefined;\r\n this.uniforms = {};\r\n this.batch_width = batch_width;\r\n\r\n this.data_textures = [];\r\n\r\n this.object_names = undefined;\r\n\r\n this.zero_offset = new Vector2();\r\n this.write_offset = new Vector2();\r\n\r\n this.uniform_dirty_count = 0;\r\n\r\n this.tmp_uploaded_data_count = 0;\r\n }\r\n\r\n init(object_names, vert_shader, frag_shader)\r\n {\r\n this.material = new ShaderMaterial({\r\n uniforms: this.uniforms,\r\n vertexShader: vert_shader,\r\n fragmentShader: frag_shader\r\n });\r\n this.object_names = object_names;\r\n }\r\n\r\n add_global_uniform(name, data)\r\n {\r\n this.uniforms[name] = { value: data };\r\n this.material.needsUpdate = true;\r\n }\r\n\r\n set_global_uniform(name, data)\r\n {\r\n this.uniforms[name].value = data;\r\n }\r\n\r\n add_object_uniform_v3(uniform_name, default_value_v3)\r\n {\r\n const src_tex = this.__create_rgb_texture(this.batch_width);\r\n const dst_tex = this.__create_rgb_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgb_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v3)\r\n {\r\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\r\n }\r\n }\r\n\r\n add_object_uniform_v4(uniform_name, default_value_v4)\r\n {\r\n const src_tex = this.__create_rgba_texture(this.batch_width);\r\n const dst_tex = this.__create_rgba_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgba_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n add_object_uniform_v4_float(uniform_name, default_value_v4)\r\n {\r\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\r\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgba_float_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\r\n {\r\n const obj_index = this.__get_object_index(object_name);\r\n const data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\r\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\r\n\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n const obj_index = this.__get_object_index(object_name);\r\n const data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\r\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n upload_texture_data(renderer, upload_budget)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\r\n {\r\n if (this.data_textures[i].dirty_count === 1)\r\n {\r\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n if (this.data_textures[i].dirty_count > 1)\r\n {\r\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n\r\n this.data_textures[i].dirty_count = 0;\r\n\r\n upload_budget--;\r\n }\r\n }\r\n }\r\n\r\n get_uniform_dirty_count()\r\n {\r\n this.uniform_dirty_count = 0;\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].dirty_count > 0)\r\n {\r\n this.uniform_dirty_count++;\r\n }\r\n }\r\n return this.uniform_dirty_count;\r\n }\r\n\r\n __full_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"full texture update of\"+ texture_data.name);\r\n texture_data.dst.needsUpdate = true;\r\n renderer.copyTextureToTexture(\r\n this.zero_offset,\r\n texture_data.src,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n __partial_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"partial texture update\"+ texture_data.name);\r\n const index = texture_data.last_accessed_index;\r\n if (index === -1)\r\n {\r\n return;\r\n }\r\n\r\n this.write_offset.y = Math.floor(index / this.batch_width);\r\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\r\n renderer.copyTextureToTexture(\r\n this.write_offset,\r\n texture_data.one_pixel,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n get_mesh()\r\n {\r\n return new Mesh(this.geometry, this.material);\r\n }\r\n\r\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 3 + 0] = vector3.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 3 + 1] = vector3.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 3 + 2] = vector3.z;\r\n }\r\n }\r\n\r\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 4 + 0] = vector4.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 4 + 1] = vector4.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 4 + 2] = vector4.z;\r\n }\r\n if (use_a)\r\n {\r\n data_texture.image.data[index * 4 + 3] = vector4.w;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgb(data_texture, v3)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgba(data_texture, v4)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __create_rgb_texture(width)\r\n {\r\n const data = new Uint8Array(3 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat);\r\n }\r\n\r\n __create_rgba_texture(width)\r\n {\r\n const data = new Uint8Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat);\r\n }\r\n\r\n __create_rgba_float_texture(width)\r\n {\r\n const data = new Float32Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\r\n }\r\n\r\n __get_data_texture(uniform_name)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].name === uniform_name)\r\n {\r\n return this.data_textures[i];\r\n }\r\n }\r\n console.error('Data texture ' + uniform_name + ' does not exist');\r\n return undefined;\r\n }\r\n\r\n __get_object_index(name)\r\n {\r\n for (let i = 0; i < this.object_names.length; i++)\r\n {\r\n if (this.object_names[i] === name)\r\n {\r\n return i;\r\n }\r\n }\r\n console.error('the name ' + name + ' is not contained in this batch');\r\n return undefined;\r\n }\r\n\r\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\r\n {\r\n dst_texture.needsUpdate = true;\r\n\r\n this.data_textures.push({\r\n name: uniform_name,\r\n src: src_texture,\r\n dst: dst_texture,\r\n one_pixel: one_pixel_text,\r\n last_accessed_index: -1,\r\n dirty_count: 0\r\n });\r\n\r\n this.uniforms[uniform_name] = { value: dst_texture };\r\n return this.data_textures[this.data_textures.length - 1];\r\n }\r\n\r\n dispose()\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n this.data_textures[i].src.dispose();\r\n this.data_textures[i].dst.dispose();\r\n this.data_textures[i].one_pixel.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport { GeometryBatch };\r\n","import { GeometryBatch } from './GeometryBatch';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { BufferAttribute } from 'three';\r\nimport { OMath } from '../utilities/OMath';\r\n\r\nclass GeometryBatcher\r\n{\r\n init()\r\n {\r\n this.batches = [];\r\n }\r\n\r\n batch(buffer_geometries)\r\n {\r\n const attr_accessor_uvs = [];\r\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n this.__init_uv_array(attr_accessor_uvs, texture_width);\r\n\r\n let uv_index = 0;\r\n\r\n for (let i = 0; i < buffer_geometries.length; i++)\r\n {\r\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\r\n const y = Math.floor(i / texture_width);\r\n const x = i - texture_width * y;\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\r\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\r\n uv_index += 2;\r\n }\r\n }\r\n\r\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\r\n const buffer_geometry = BufferGeometryUtils.mergeGeometries(buffer_geometries);\r\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\r\n\r\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\r\n return this.batches[this.batches.length - 1];\r\n }\r\n\r\n upload_texture_data(renderer)\r\n {\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n this.batches[i].upload_texture_data(renderer, 1);\r\n }\r\n }\r\n\r\n __init_uv_array(uvs, texture_width)\r\n {\r\n for (let i = 0; i < texture_width * texture_width * 2; i++)\r\n {\r\n uvs.push(0);\r\n }\r\n }\r\n}\r\n\r\nconst geometry_batcher = new GeometryBatcher();\r\nexport { geometry_batcher as GeometryBatcher };\r\n","import vert from '../shaders/ui_element/ui_element.vert';\r\nimport frag from '../shaders/ui_element/ui_element.frag';\r\n\r\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nimport { OScreen } from '../OScreen';\r\n\r\nclass UIElementMaterial extends BaseShaderMaterial\r\n{\r\n constructor(intensity = 1)\r\n {\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\r\n _TextureSize: { value: new Vector2() },\r\n _PixelOffset: { value: new Vector2(0, 0) },\r\n _NDC: { value: new Vector3() },\r\n _PivotPoint: { value: new Vector2() },\r\n _DepthOffset: { value: 0 }\r\n });\r\n this.transparent = true;\r\n this.depthWrite = false;\r\n this.depthTest = false;\r\n }\r\n}\r\n\r\nexport { UIElementMaterial };\r\n","import { Vector2 } from 'three';\r\n\r\nclass ScreenSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n return this.tmp_vec.set(position.x, position.y);\r\n }\r\n}\r\n\r\nexport { ScreenSpacePosition };\r\n","import { CameraManager } from '../../CameraManager';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nclass WorldSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec3 = new Vector3();\r\n this.tmp_vec2 = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n this.tmp_vec3.copy(position);\r\n this.tmp_vec3.project(CameraManager.current);\r\n\r\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\r\n }\r\n}\r\n\r\nexport { WorldSpacePosition };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\n\r\nclass UIElementState\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position) // eslint-disable-line no-unused-vars\r\n {\r\n\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_exit(ui_element) // eslint-disable-line no-unused-vars\r\n {}\r\n}\r\n\r\nexport { UIElementState };\r\n","import { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnIdle extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_enter_state);\r\n }\r\n }\r\n}\r\n\r\nexport { OnIdle };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnMouseEnter extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n *\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_enter();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_hover_state);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n}\r\n\r\nexport { OnMouseEnter };\r\n","// @ts-check\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnMouseExit extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_exit();\r\n ui_element.set_state(ui_element._on_idle_state);\r\n }\r\n}\r\n\r\nexport { OnMouseExit };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnMouseHover extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element)\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n __trigger_on_hover(ui_element)\r\n {\r\n ui_element.on_mouse_hover();\r\n }\r\n}\r\n\r\nexport { OnMouseHover };\r\n","// @ts-check\r\nimport { OScreen } from '../OScreen';\r\n\r\nimport { UIElementMaterial } from '../materials/UIElementMaterial';\r\n\r\nimport { ScreenSpacePosition } from '../ui/ui_element_position/ScreenSpacePosition';\r\nimport { WorldSpacePosition } from '../ui/ui_element_position/WorldSpacePosition';\r\n\r\nimport { OnIdle } from '../ui/ui_element_state/OnIdle';\r\nimport { OnMouseEnter } from '../ui/ui_element_state/OnMouseEnter';\r\nimport { OnMouseExit } from '../ui/ui_element_state/OnMouseExit';\r\nimport { OnMouseHover } from '../ui/ui_element_state/OnMouseHover';\r\n\r\nimport { Mesh, Texture } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { NearestFilter } from 'three';\r\nimport { Box2 } from 'three';\r\nimport { UIElementState } from '../ui/ui_element_state/UIElementState'; // eslint-disable-line no-unused-vars\r\n\r\nclass UIElement extends Mesh\r\n{\r\n /**\r\n * @param {string} [vert]\r\n * @param {string} [frag]\r\n */\r\n constructor(vert, frag) // eslint-disable-line no-unused-vars\r\n {\r\n const material = new UIElementMaterial();\r\n super(new PlaneGeometry(1, 1), material);\r\n this.material = material;\r\n\r\n this.is_clickable = false;\r\n\r\n /** @type {WorldSpacePosition | ScreenSpacePosition} */\r\n this.position_strategy = new WorldSpacePosition();\r\n this.current_state = new OnIdle();\r\n\r\n this._position = new Vector3();\r\n\r\n this._on_idle_state = new OnIdle();\r\n this._on_enter_state = new OnMouseEnter();\r\n this._on_exit_state = new OnMouseExit();\r\n this._on_hover_state = new OnMouseHover();\r\n\r\n this.on_enter = undefined;\r\n this.on_exit = undefined;\r\n this.on_hover = undefined;\r\n\r\n this.mouse_pos_tmp = new Vector2();\r\n this.cached_NDC_position = new Vector2();\r\n this.screen_pos_tmp = new Vector2();\r\n\r\n this.texture_size = new Vector2(1, 1);\r\n\r\n this.frustumCulled = false;\r\n this.matrixAutoUpdate = false;\r\n this.renderOrder = 0;\r\n\r\n this.size = 1;\r\n this.pixel_offset = new Vector2();\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n set_render_order(value)\r\n {\r\n this.renderOrder = value;\r\n }\r\n\r\n get pivot_point()\r\n {\r\n return this.material.uniforms._PivotPoint.value;\r\n }\r\n\r\n /**\r\n * @param {Vector2} offset\r\n */\r\n set_pixel_offset(offset)\r\n {\r\n this.pixel_offset.copy(offset);\r\n this.material.uniforms._PixelOffset.value.copy(offset);\r\n }\r\n\r\n /**\r\n *@param {UIElementState} new_state\r\n */\r\n set_state(new_state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = new_state;\r\n this.current_state.on_enter(this);\r\n }\r\n\r\n // @ts-ignore\r\n get position()\r\n {\r\n return this._position;\r\n }\r\n\r\n set use_depth(boolean)\r\n {\r\n this.material.depthTest = boolean;\r\n }\r\n\r\n get use_depth()\r\n {\r\n return this.material.depthTest;\r\n }\r\n\r\n set depth_offset(value)\r\n {\r\n this.material.uniforms._DepthOffset.value = value;\r\n }\r\n\r\n get depth_offset()\r\n {\r\n return this.material.uniforms._DepthOffset.value;\r\n }\r\n\r\n clear_state()\r\n {\r\n this.visible = false;\r\n }\r\n\r\n set_world_space_coordinate_system()\r\n {\r\n this.position_strategy = new WorldSpacePosition();\r\n }\r\n\r\n set_screen_space_coordinate_system()\r\n {\r\n this.position_strategy = new ScreenSpacePosition();\r\n }\r\n\r\n /**\r\n * @param {Texture} texture\r\n */\r\n set_texture(texture)\r\n {\r\n texture.minFilter = NearestFilter;\r\n texture.magFilter = NearestFilter;\r\n texture.needsUpdate = true;\r\n\r\n this.texture_size.set(texture.image.width, texture.image.height);\r\n\r\n this.material.uniforms._MainTex.value = texture;\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n this.visible = true;\r\n }\r\n\r\n /**\r\n * @param {Vector2} normalized_mouse_pos\r\n */\r\n update_state(normalized_mouse_pos)\r\n {\r\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n\r\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\r\n this.material.uniforms._NDC.value.copy(this.position);\r\n this.current_state.update(this, normalized_mouse_pos);\r\n }\r\n\r\n /**\r\n * @param {Vector2} normalized_mouse_pos\r\n */\r\n is_mouse_over(normalized_mouse_pos)\r\n {\r\n this.screen_pos_tmp.copy(this.cached_NDC_position);\r\n this.to_screen_position(this.screen_pos_tmp);\r\n this.screen_pos_tmp.x += this.pixel_offset.x;\r\n this.screen_pos_tmp.y += this.pixel_offset.y;\r\n\r\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\r\n\r\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\r\n this.to_screen_position(this.mouse_pos_tmp);\r\n\r\n return rect.containsPoint(this.mouse_pos_tmp);\r\n }\r\n\r\n /**\r\n * @param {Vector2} projected_pos\r\n */\r\n to_screen_position(projected_pos)\r\n {\r\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\r\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\r\n }\r\n\r\n get_screen_space_position()\r\n {\r\n const pos = this.cached_NDC_position.clone();\r\n this.to_screen_position(pos);\r\n return pos;\r\n }\r\n\r\n /**\r\n * @param {Vector2} screen_pos\r\n */\r\n set_screen_space_position(screen_pos)\r\n {\r\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\r\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\r\n }\r\n\r\n dispose()\r\n {\r\n if (this.material.uniforms._MainTex.value)\r\n {\r\n this.material.uniforms._MainTex.value.dispose();\r\n }\r\n // OScreen.remove_screen_material(this.material);\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n /**\r\n * @param {Vector2} [vector2]\r\n */\r\n get_size(vector2)\r\n {\r\n if (vector2)\r\n {\r\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\r\n }\r\n else\r\n {\r\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\r\n }\r\n }\r\n\r\n on_mouse_enter()\r\n {}\r\n\r\n on_mouse_exit()\r\n {}\r\n\r\n on_mouse_hover()\r\n {}\r\n}\r\n\r\nexport { UIElement };\r\n","// @ts-check\r\nimport { CameraManager } from './CameraManager';\r\nimport { Graphics } from './Graphics';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Scene } from 'three';\r\nimport { OrthographicCamera } from './OrthographicCamera';\r\nimport { UIElement } from './components/UIElement'; // eslint-disable-line\r\n\r\nclass UI\r\n{\r\n init(input)\r\n {\r\n this.input = input;\r\n /** @type {UIElement[]} */\r\n this.ui_elements = [];\r\n this._tmp_normalized_pos = new Vector2();\r\n this.ss_scene = new Scene();\r\n this.ss_scene.matrixWorldAutoUpdate = false;\r\n this.ss_scene.frustumCulled = false;\r\n\r\n this.ws_scene = new Scene();\r\n this.ws_scene.matrixWorldAutoUpdate = false;\r\n this.ws_scene.frustumCulled = false;\r\n\r\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\r\n }\r\n\r\n /**\r\n * @param {UIElement} elem\r\n */\r\n delete_element(elem)\r\n {\r\n const index = this.ui_elements.indexOf(elem);\r\n if (index > -1)\r\n {\r\n this.ui_elements.splice(index, 1);\r\n }\r\n\r\n this.ss_scene.remove(elem);\r\n this.ws_scene.remove(elem);\r\n\r\n elem.dispose();\r\n }\r\n\r\n /**\r\n * @param {UIElement} elem\r\n */\r\n add_screen_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ss_scene.add(elem);\r\n\r\n elem.set_screen_space_coordinate_system();\r\n }\r\n\r\n /**\r\n * @param {UIElement} elem\r\n */\r\n add_world_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ws_scene.add(elem);\r\n\r\n elem.set_world_space_coordinate_system();\r\n }\r\n\r\n update()\r\n {\r\n // this.ss_camera.left = -OScreen.width / 2;\r\n // this.ss_camera.right = OScreen.width / 2;\r\n // this.ss_camera.top = OScreen.top / 2;\r\n // this.ss_camera.right = -OScreen.bottom / 2;\r\n this.ss_camera.updateProjectionMatrix();\r\n\r\n this._tmp_normalized_pos.copy(this.input.NDC);\r\n for (let i = 0; i < this.ui_elements.length; i++)\r\n {\r\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Graphics} renderer\r\n */\r\n render(renderer)\r\n {\r\n // renderer.render_ui(this.scene);\r\n if (this.ss_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ss_scene, this.ss_camera);\r\n }\r\n if (this.ws_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ws_scene, CameraManager.current);\r\n }\r\n }\r\n\r\n clear()\r\n {\r\n this.current_clicked_element = undefined;\r\n }\r\n}\r\n\r\nconst ui = new UI();\r\nexport { ui as UI };\r\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\r\nimport { OMath } from './OMath';\r\n\r\nclass PerspectiveFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n const v_fov = OMath.degToRad(vertical_fov / 2);\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n const sphere_center = this.sphere.center.clone();\r\n\r\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n const up_line_intersection = new Vector3();\r\n const down_line_intersection = new Vector3();\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n const vertical_min = Math.min(new_up_distance, new_down_distance);\r\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n const min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n const closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n // let closest_up_point = undefined;\r\n // let closest_down_point = undefined;\r\n\r\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n const down_line_intersection = new Vector3();\r\n const up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n const down_dist = down_line_intersection.distanceTo(points[i]);\r\n const up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n // closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n // closest_up_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n // let closest_right_point = undefined;\r\n // let closest_left_point = undefined;\r\n\r\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n const left_dist = left_line_intersection.distanceTo(points[i]);\r\n const right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n // closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n // closest_right_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n\r\nexport { PerspectiveFrustumPointFitter };\r\n","import { Vector3, Box3 } from 'three';\r\n\r\nclass OrthographicFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n const inverse_camera_quat = camera_quaternion.clone().inverse();\r\n\r\n const inverted_points = [];\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\r\n }\r\n\r\n const box = new Box3().setFromPoints(inverted_points);\r\n const size = new Vector3();\r\n box.getSize(size);\r\n\r\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\r\n\r\n const center = new Vector3();\r\n box.getCenter(center);\r\n\r\n center.applyQuaternion(camera_quaternion);\r\n\r\n return {\r\n center: center,\r\n distance_to_center: distance\r\n };\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n\r\nexport { OrthographicFrustumPointFitter };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { OMath } from '../utilities/OMath';\r\nimport { OScreen } from '../OScreen';\r\n\r\nimport { Vector3 } from 'three';\r\nimport { Matrix4 } from 'three';\r\nimport { Plane } from 'three';\r\nimport { Ray } from 'three';\r\nimport { Sphere } from 'three';\r\nimport { Box3 } from 'three';\r\nimport { PerspectiveFrustumPointFitter } from './PerspectiveFrustumPointFitter';\r\nimport { OrthographicFrustumPointFitter } from './OrthographicFrustumPointFitter';\r\n\r\nclass CameraUtilities\r\n{\r\n init(input)\r\n {\r\n this.tmp_mat = new Matrix4();\r\n this.plane = new Plane();\r\n this.ray = new Ray();\r\n\r\n this.tmp_size = new Vector3();\r\n this.tmp_unproj = new Vector3();\r\n\r\n this.input = input;\r\n }\r\n\r\n get_up_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(0, 1, 0);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n get_forward_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(0, 0, -1);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n get_right_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(1, 0, 0);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n return tmp_vec;\r\n }\r\n\r\n unproject_mouse_position(NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n const v_fov = (camera.fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\r\n\r\n const distV = Math.tan(v_fov) * camera.far;\r\n const distH = Math.tan(h_fov) * camera.far;\r\n\r\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\r\n\r\n return tmp_vec.applyQuaternion(camera.quaternion);\r\n }\r\n\r\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n NDC = NDC || this.input.NDC;\r\n\r\n const tmp_vec = new Vector3();\r\n\r\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\r\n if (camera.isPerspectiveCamera)\r\n {\r\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\r\n }\r\n else\r\n {\r\n const pos = new Vector3(NDC.x * camera.right, NDC.y * camera.top, 0);\r\n pos.applyQuaternion(camera.quaternion);\r\n pos.add(camera.position);\r\n const dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\r\n this.ray.set(pos, dir);\r\n }\r\n this.ray.intersectPlane(this.plane, tmp_vec);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n fit_points_on_camera(points, zoom_scale = 1)\r\n {\r\n const points_sphere = new Sphere().setFromPoints(points);\r\n const world_space_center = points_sphere.center;\r\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\r\n\r\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\r\n\r\n const points_on_plane = OMath.project_points_on_plane(points, plane);\r\n\r\n const projected_points_center = new Vector3();\r\n let box = new Box3().setFromPoints(points_on_plane);\r\n box.getCenter(projected_points_center);\r\n\r\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\r\n const right = up.clone().cross(camera_forward).normalize();\r\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\r\n right.y, up.y, camera_forward.y, world_space_center.y,\r\n right.z, up.z, camera_forward.z, world_space_center.z,\r\n 0, 0, 0, 1);\r\n\r\n const inverse_mat = new Matrix4().getInverse(mat);\r\n for (let i = 0; i < points_on_plane.length; i++)\r\n {\r\n points_on_plane[i].applyMatrix4(inverse_mat);\r\n }\r\n\r\n const size = new Vector3();\r\n box = new Box3().setFromPoints(points_on_plane);\r\n box.getSize(size);\r\n size.multiplyScalar(zoom_scale);\r\n const projected_center = new Vector3();\r\n box.getCenter(projected_center);\r\n\r\n return {\r\n position: projected_points_center,\r\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\r\n };\r\n }\r\n\r\n get_zoom_to_fit_rect(width, height)\r\n {\r\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n\r\n get_zoom_to_fit_box(bb, camera)\r\n {\r\n if (camera.isOrthographicCamera)\r\n {\r\n bb.getSize(this.tmp_size);\r\n\r\n const obj_x = this.tmp_size.x;\r\n const obj_y = this.tmp_size.y;\r\n const object_aspect = obj_x / obj_y;\r\n if (OScreen.aspect_ratio / object_aspect > 1)\r\n {\r\n return OScreen.height / obj_y;\r\n }\r\n else\r\n {\r\n return OScreen.width / obj_x;\r\n }\r\n }\r\n else\r\n {\r\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\r\n const size = new Vector3();\r\n bb.getSize(size);\r\n return this.get_zoom_to_fit_rect(size.x, size.y);\r\n }\r\n }\r\n\r\n get_html_screen_pos(object, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n object.getWorldPosition(tmp_vec);\r\n tmp_vec.project(camera);\r\n\r\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\r\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\r\n return tmp_vec;\r\n }\r\n\r\n world_pos_to_screen(pos, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.copy(pos);\r\n tmp_vec.project(camera);\r\n\r\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\r\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\r\n return tmp_vec;\r\n }\r\n\r\n update_projection(camera)\r\n {\r\n camera.left = -OScreen.width / 2;\r\n camera.right = OScreen.width / 2;\r\n camera.top = OScreen.height / 2;\r\n camera.bottom = -OScreen.height / 2;\r\n camera.aspect = OScreen.aspect_ratio;\r\n camera.updateProjectionMatrix(true);\r\n }\r\n\r\n fit_bounding_box_points(camera, bb, scale = 1)\r\n {\r\n const dir = new Vector3();\r\n dir.copy(bb.max).sub(bb.min);\r\n\r\n const p1 = bb.min.clone();\r\n\r\n const p2 = p1.clone().add(new Vector3(dir.x, 0, 0));\r\n const p3 = p1.clone().add(new Vector3(0, dir.y, 0));\r\n const p4 = p1.clone().add(new Vector3(0, 0, dir.z));\r\n\r\n const p5 = p1.clone().add(new Vector3(dir.x, 0, dir.z));\r\n const p6 = p1.clone().add(new Vector3(0, dir.y, dir.z));\r\n const p7 = bb.max.clone();\r\n const p8 = p1.clone().add(new Vector3(dir.x, dir.y, 0));\r\n return this.fit_points(camera, [p1, p2, p3, p4, p5, p6, p7, p8], scale);\r\n }\r\n\r\n fit_points(camera, points, zoom_scale = 1)\r\n {\r\n if (camera.isPerspectiveCamera)\r\n {\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\r\n const camera_backward_dir = camera_forward_dir.clone().multiplyScalar(-1);\r\n\r\n const fitter = new PerspectiveFrustumPointFitter();\r\n\r\n const aspect_ratio = OScreen.aspect_ratio;\r\n\r\n const camera_pos = fitter.fit_points(points, camera.quaternion, camera.fov * zoom_scale, aspect_ratio);\r\n const box = new Box3().setFromPoints(points);\r\n const center = new Vector3();\r\n box.getCenter(center);\r\n\r\n const reference_position_plane = new Plane().setFromNormalAndCoplanarPoint(camera_backward_dir, center);\r\n\r\n const camera_ray = new Ray(camera_pos, camera_forward_dir);\r\n\r\n const reference_position = new Vector3();\r\n camera_ray.intersectPlane(reference_position_plane, reference_position);\r\n\r\n const zoom = camera_pos.distanceTo(reference_position);\r\n\r\n return {\r\n zoom: zoom,\r\n reference_position: reference_position,\r\n camera_position: camera_pos\r\n };\r\n }\r\n else\r\n {\r\n const fitter = new OrthographicFrustumPointFitter();\r\n const result = fitter.fit_points(points, this.reference_rotation, camera.fov * zoom_scale, OScreen.aspect_ratio);\r\n\r\n this.reference_position.copy(result.center);\r\n this.reference_zoom = result.distance_to_center;\r\n\r\n const forward = new Vector3(0, 0, 1).applyQuaternion(camera.quaternion);\r\n return {\r\n zoom: result.distance_to_center,\r\n reference_position: result.center,\r\n camera_position: forward.multiplyScalar(result.distance_to_center)\r\n };\r\n }\r\n }\r\n}\r\n\r\nconst camera_utilities = new CameraUtilities();\r\nexport { camera_utilities as CameraUtilities };\r\n","// @ts-check\r\nimport { Browser } from './Browser';\r\nimport { CameraManager } from './CameraManager';\r\nimport { Capabilities } from './Capabilities';\r\nimport { Debug } from './Debug';\r\nimport { Graphics } from './Graphics';\r\nimport { OS } from './OS';\r\nimport { OScreen } from './OScreen';\r\nimport { ReflectionPlaneContext } from './ReflectionPlaneContext';\r\nimport { ResourceContainer } from './ResourceContainer';\r\nimport { SceneManager } from './SceneManager';\r\nimport { GeometryBatcher } from './static_batcher/GeometryBatcher';\r\nimport { Time } from './Time';\r\nimport { UI } from './UI';\r\nimport { CameraUtilities } from './utilities/CameraUtilities';\r\nimport { RenderLoop } from './index'; // eslint-disable-line no-unused-vars\r\n\r\nclass Initializer\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n init(input)\r\n {\r\n CameraManager.init();\r\n CameraUtilities.init(input);\r\n Capabilities.init();\r\n GeometryBatcher.init();\r\n\r\n OS.init();\r\n Browser.init();\r\n ReflectionPlaneContext.init();\r\n ResourceContainer.init();\r\n SceneManager.init();\r\n OScreen.init();\r\n Time.init();\r\n UI.init(input);\r\n\r\n Debug.init();\r\n }\r\n\r\n /**\r\n * @param {RenderLoop} render_loop\r\n */\r\n dispose(render_loop)\r\n {\r\n Graphics.dispose();\r\n SceneManager.dispose();\r\n\r\n render_loop.dispose();\r\n }\r\n}\r\n\r\nconst initializer = new Initializer();\r\nexport { initializer as Initializer };\r\n","// @ts-check\r\nclass KeyboardInput\r\n{\r\n /**\r\n * @param {HTMLElement} container\r\n */\r\n init(container)\r\n {\r\n this.ctrlz_pressed = false;\r\n this.ctrlz_fired = false;\r\n\r\n /**\r\n * @type {{[key:string]:{key_name: string, pressed: boolean, down: boolean, fired: boolean, released: boolean}}}\r\n */\r\n this.keys = {};\r\n /** @type {string[]} */\r\n this.keys_keys = [];\r\n this.container = container;\r\n\r\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\r\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} e\r\n */\r\n on_key_down(e)\r\n {\r\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\r\n {\r\n this.ctrlz_pressed = true;\r\n this.ctrlz_fired = true;\r\n }\r\n\r\n if (e.code)\r\n {\r\n this.press_key(e.code);\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} e\r\n */\r\n on_key_up(e)\r\n {\r\n this.release_key(e.code);\r\n }\r\n\r\n clear()\r\n {\r\n this.ctrlz_pressed = false;\r\n\r\n for (let i = 0; i < this.keys_keys.length; i++)\r\n {\r\n this.keys[this.keys_keys[i]].pressed = false;\r\n this.keys[this.keys_keys[i]].released = false;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n */\r\n release_key(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n key.fired = false;\r\n key.down = false;\r\n key.released = true;\r\n }\r\n }\r\n\r\n release_keys()\r\n {\r\n this.ctrlz_fired = false;\r\n\r\n for (let i = 0; i < this.keys_keys.length; i++)\r\n {\r\n this.keys[this.keys_keys[i]].fired = false;\r\n this.keys[this.keys_keys[i]].down = false;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n */\r\n press_key(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n if (key.down === false)\r\n {\r\n key.pressed = true;\r\n }\r\n key.down = true;\r\n key.fired = true;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n * @returns {boolean}\r\n */\r\n is_key_pressed(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.pressed;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n * @returns {boolean}\r\n */\r\n is_key_down(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.down;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n * @returns {boolean}\r\n */\r\n is_key_released(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.released;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n register_key(key)\r\n {\r\n this.keys[key] =\r\n {\r\n key_name: key,\r\n pressed: false,\r\n down: false,\r\n fired: false,\r\n released: false\r\n };\r\n\r\n this.keys_keys = Object.keys(this.keys);\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n */\r\n unregister_key(key_name)\r\n {\r\n delete this.keys[key_name];\r\n }\r\n\r\n dispose()\r\n {\r\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\r\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\r\n }\r\n}\r\n\r\nexport { KeyboardInput };\r\n","import frag from '../shaders/normal/normal.frag';\r\nimport vert from '../shaders/normal/normal.vert';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nclass NormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n}\r\n\r\nexport { NormalMaterial };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Graphics } from '../Graphics';\r\nimport { NormalMaterial } from '../materials/NormalMaterial';\r\n\r\nclass DebugNormalsRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\r\n }\r\n}\r\n\r\nexport { DebugNormalsRender };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/depth_normals/debug_normals.frag';\r\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\n\r\nclass DisplayNormalTextureMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, depth_normals_vert);\r\n this.uniforms._FarPlane = { value: 1 };\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n }\r\n}\r\n\r\nexport { DisplayNormalTextureMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/ssao/ssao_compose.frag';\r\n\r\nclass SSAOComposeMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._AO = { value: undefined };\r\n }\r\n}\r\n\r\nexport { SSAOComposeMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/ssao/ssao.frag';\r\nimport vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { DataTexture, Matrix4, RGBAFormat, RepeatWrapping, Vector3 } from 'three';\r\n\r\nimport { OMath } from '../utilities/OMath';\r\nclass SSAOMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, vert);\r\n\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\r\n\r\n this.uniforms._Bias = { value: 0.0125 };\r\n this.uniforms._Radius = { value: 0.3 };\r\n this.uniforms._FarPlane = { value: 100 };\r\n\r\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\r\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\r\n }\r\n\r\n __get_sample_kernel()\r\n {\r\n const sample_kernel = [];\r\n const kernel_size = 64;\r\n\r\n for (let i = 0; i < kernel_size; i++)\r\n {\r\n const dir = new Vector3(Math.random() * 2 - 1,\r\n Math.random() * 2 - 1,\r\n Math.random());\r\n dir.normalize();\r\n let scale = i / kernel_size;\r\n scale = OMath.lerp(0.1, 1.0, scale * scale);\r\n dir.multiplyScalar(scale);\r\n\r\n sample_kernel.push(dir);\r\n }\r\n return sample_kernel;\r\n }\r\n\r\n __get_rotation_kernel()\r\n {\r\n const rotation_kernel = new Uint8Array(3 * 16);\r\n for (let i = 0; i < 16; i++)\r\n {\r\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 3] = 0;\r\n }\r\n\r\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBAFormat);\r\n rotation_texture.wrapS = RepeatWrapping;\r\n rotation_texture.wrapT = RepeatWrapping;\r\n\r\n rotation_texture.needsUpdate = true;\r\n return rotation_texture;\r\n }\r\n}\r\n\r\nexport { SSAOMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/box_blur/box_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass BoxBlurMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._SampleDir = { value: new Vector2() };\r\n }\r\n}\r\n\r\nexport { BoxBlurMaterial };\r\n","import { BoxBlurMaterial } from '../materials/BoxBlurMaterial';\r\nimport { Graphics } from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nclass Blurrer\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.box_blur_mat = new BoxBlurMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\r\n {\r\n this.RT1.setSize(RT.width, RT.height);\r\n this.RT2.setSize(RT.width, RT.height);\r\n }\r\n\r\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\r\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\r\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\r\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\r\n // return this.RT2;\r\n }\r\n}\r\n\r\nexport { Blurrer };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { Graphics } from '../Graphics';\r\nimport { DisplayNormalTextureMaterial } from '../materials/DisplayNormalTextureMaterial';\r\nimport { SSAOComposeMaterial } from '../materials/SSAOComposeMaterial';\r\nimport { SSAOMaterial } from '../materials/SSAOMaterial';\r\nimport { OScreen } from '../OScreen';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Blurrer } from '../render_utilities/Blurrer';\r\nimport { SceneManager } from '../SceneManager';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nclass NormalAORender extends BaseRender\r\n{\r\n constructor(use_ssaa = false)\r\n {\r\n super();\r\n\r\n this.ssao_mat = new SSAOMaterial();\r\n this.ssao_compose_mat = new SSAOComposeMaterial();\r\n this.debug_normals = new DisplayNormalTextureMaterial();\r\n\r\n this.ssaa = use_ssaa ? 2 : 1;\r\n\r\n this.main_RT = new WebGLRenderTarget(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\r\n\r\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\r\n\r\n this.blurrer = new Blurrer();\r\n Graphics.generateDepthNormalTexture = true;\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n this.__update_uniforms();\r\n\r\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\r\n\r\n // // BLUR\r\n this.blurrer.blur(this.SSAO_RT);\r\n Graphics.blit(this.SSAO_RT, undefined);\r\n\r\n // // COMPOSE\r\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\r\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\r\n\r\n // Graphics.blit(this.SSAO_RT, undefined);\r\n }\r\n\r\n __update_uniforms()\r\n {\r\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\r\n {\r\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\r\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\r\n }\r\n }\r\n}\r\n\r\nexport { NormalAORender };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Graphics } from '../Graphics';\r\n\r\nclass NormalRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n if (SceneManager.current.on_pre_render)\r\n {\r\n SceneManager.current.on_pre_render();\r\n }\r\n\r\n if (SceneManager.current.render)\r\n {\r\n SceneManager.current.render();\r\n }\r\n else\r\n {\r\n Graphics.render(SceneManager.current, CameraManager.current);\r\n }\r\n\r\n if (SceneManager.current.on_post_render)\r\n {\r\n SceneManager.current.on_post_render();\r\n }\r\n }\r\n}\r\n\r\nexport { NormalRender };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass GaussianBlurMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius, use_half_float)\r\n {\r\n super(frag, undefined, {\r\n KERNEL_RADIUS: kernel_radius,\r\n SIGMA: kernel_radius\r\n });\r\n\r\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\r\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\r\n this.uniforms.radius = { value: 1 };\r\n\r\n this.defines.USE_LINEAR_COLOR_SPACE = true;\r\n }\r\n\r\n set_size(w, h)\r\n {\r\n this.uniforms.texSize.value.x = w;\r\n this.uniforms.texSize.value.y = h;\r\n }\r\n\r\n set_direction(x, y)\r\n {\r\n this.uniforms.direction.value.set(x, y);\r\n }\r\n\r\n set_radius(value = 1)\r\n {\r\n this.uniforms.radius.value = value;\r\n }\r\n}\r\n\r\nexport { GaussianBlurMaterial };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\r\n\r\nimport { Color } from 'three';\r\nclass LuminosityHighPassMaterial extends BlitMaterial\r\n{\r\n constructor(use_half_float)\r\n {\r\n super(frag);\r\n\r\n this.uniforms.luminosityThreshold = { value: 0.23 };\r\n this.uniforms.smoothWidth = { value: 0.01 };\r\n this.uniforms.defaultColor = { value: new Color('#000000') };\r\n this.uniforms.defaultOpacity = { value: 0.0 };\r\n\r\n this.defines.USE_LINEAR_COLOR_SPACE = true;\r\n }\r\n\r\n set_threshold(value_01)\r\n {\r\n this.uniforms.luminosityThreshold.value = value_01;\r\n }\r\n}\r\n\r\nexport { LuminosityHighPassMaterial };\r\n","import { GaussianBlurMaterial } from '../materials/GaussianBlurMaterial';\r\nimport { LuminosityHighPassMaterial } from '../materials/LuminosityHighPassMaterial';\r\nimport { Graphics } from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat, HalfFloatType, UnsignedByteType, SRGBColorSpace, LinearSRGBColorSpace } from 'three';\r\n\r\nclass GaussianBlurrer\r\n{\r\n constructor(use_half_float = false)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n\r\n this.separableBlurMaterials = [];\r\n this.renderTargetsHorizontal = [];\r\n this.renderTargetsVertical = [];\r\n this.use_half_float = use_half_float;\r\n this.nMips = 5;\r\n this.kernelSizeArray = [3, 5, 7, 9, 11];\r\n this.rt_pars = {\r\n minFilter: LinearFilter,\r\n magFilter: LinearFilter,\r\n format: RGBAFormat,\r\n type: use_half_float ? HalfFloatType : UnsignedByteType,\r\n colorSpace: use_half_float ? LinearSRGBColorSpace : SRGBColorSpace\r\n };\r\n\r\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n this.renderTargetBright.texture.generateMipmaps = false;\r\n\r\n this.init_materials();\r\n this.init_RT();\r\n\r\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial(use_half_float);\r\n }\r\n\r\n blur(RT, use_luminosity_high_pass)\r\n {\r\n this.resize_RT(RT.width, RT.height);\r\n\r\n let inputRenderTarget = RT;\r\n\r\n if (use_luminosity_high_pass)\r\n {\r\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\r\n inputRenderTarget = this.renderTargetBright;\r\n }\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n const mat = this.separableBlurMaterials[i];\r\n\r\n mat.set_direction(1, 0);\r\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\r\n\r\n mat.set_direction(0, 1);\r\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\r\n\r\n inputRenderTarget = this.renderTargetsVertical[i];\r\n }\r\n }\r\n\r\n get_blurred_texture()\r\n {\r\n return this.renderTargetsHorizontal[0].texture;\r\n }\r\n\r\n get_blurred_RT()\r\n {\r\n return this.renderTargetsHorizontal[0];\r\n }\r\n\r\n init_RT()\r\n {\r\n this.dispose_RT();\r\n\r\n this.renderTargetBright.setSize(1, 1);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n\r\n hor.texture.generateMipmaps = false;\r\n ver.texture.generateMipmaps = false;\r\n\r\n hor.texture.colorSpace = this.rt_pars.colorSpace;\r\n ver.texture.colorSpace = this.rt_pars.colorSpace;\r\n\r\n this.renderTargetsHorizontal.push(hor);\r\n this.renderTargetsVertical.push(ver);\r\n }\r\n }\r\n\r\n resize_RT(texture_width, texture_height)\r\n {\r\n if (this.current_width === texture_width && this.current_height === texture_height)\r\n {\r\n return;\r\n }\r\n\r\n this.current_width = texture_width;\r\n this.current_height = texture_height;\r\n\r\n let width = Math.round(texture_width / 2);\r\n let height = Math.round(texture_height / 2);\r\n\r\n this.renderTargetBright.setSize(width, height);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.renderTargetsVertical[i].setSize(width, height);\r\n this.renderTargetsHorizontal[i].setSize(width, height);\r\n this.separableBlurMaterials[i].set_size(width, height);\r\n\r\n width = Math.round(width / 2);\r\n height = Math.round(height / 2);\r\n }\r\n }\r\n\r\n init_materials()\r\n {\r\n this.dispose_materials();\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i], this.use_half_float));\r\n }\r\n }\r\n\r\n set_radius(value)\r\n {\r\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\r\n {\r\n this.separableBlurMaterials[i].set_radius(value);\r\n }\r\n }\r\n\r\n set_luminosity_threshold(value)\r\n {\r\n this.luminosity_high_pass_mat.set_threshold(value);\r\n }\r\n\r\n dispose_materials()\r\n {\r\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\r\n {\r\n this.separableBlurMaterials[i].dispose();\r\n }\r\n this.separableBlurMaterials.length = 0;\r\n }\r\n\r\n dispose_RT()\r\n {\r\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\r\n {\r\n this.renderTargetsHorizontal[i].dispose();\r\n this.renderTargetsVertical[i].dispose();\r\n }\r\n this.renderTargetBright.dispose();\r\n\r\n this.renderTargetsHorizontal.length = 0;\r\n this.renderTargetsVertical.length = 0;\r\n }\r\n}\r\n\r\nexport { GaussianBlurrer };\r\n","import { OScreen } from '../OScreen';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { UnrealBloomComposeMaterial } from '../materials/UnrealBloomComposeMaterial';\r\nimport { AddMaterial } from '../materials/AddMaterial';\r\n\r\nimport { HalfFloatType, LinearSRGBColorSpace, NearestFilter, RGBAFormat, UnsignedByteType, WebGLRenderTarget } from 'three';\r\n\r\nimport { GaussianBlurrer } from '../render_utilities/GaussianBlurrer';\r\nimport { Graphics } from '../Graphics';\r\nimport { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\n\r\nclass UnrealBloomRender extends BaseRender\r\n{\r\n constructor(use_antialiasing, use_half_float, use_hight_luminosity_pass, use_rendering_size = false)\r\n {\r\n super();\r\n\r\n this.add_mat = new AddMaterial(use_half_float);\r\n\r\n const rt_settings = {\r\n samples: use_antialiasing ? 8 : 1,\r\n type: use_half_float ? HalfFloatType : UnsignedByteType,\r\n format: RGBAFormat,\r\n colorSpace: LinearSRGBColorSpace,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n };\r\n this.use_rendering_size = use_rendering_size;\r\n this.main_RT = new WebGLRenderTarget(1, 1, rt_settings);\r\n this.main_RT.texture.colorSpace = LinearSRGBColorSpace;\r\n this.main_RT.texture.minFilter = NearestFilter;\r\n this.main_RT.texture.magFilter = NearestFilter;\r\n\r\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5, use_half_float);\r\n this.blurrer = new GaussianBlurrer(use_half_float);\r\n this.use_hight_luminosity_pass = use_hight_luminosity_pass;\r\n this.luminosity_threshold = 0.5;\r\n }\r\n\r\n on_enter()\r\n {\r\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\r\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\r\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\r\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\r\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\r\n\r\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n // // // BLUR\r\n this.blurrer.blur(this.main_RT, this.use_hight_luminosity_pass);\r\n\r\n // // Blur compose\r\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\r\n\r\n // // Additive blend\r\n // Graphics.clear(undefined, CameraManager.current, true, false);\r\n // Graphics.render(SceneManager.current, CameraManager.current);\r\n Graphics.blit(this.main_RT, undefined, this.add_mat);\r\n }\r\n\r\n set_bloom_strength(val)\r\n {\r\n this.bloom_compose_mat.set_bloom_strength(val);\r\n }\r\n\r\n set_bloom_radius(val)\r\n {\r\n // this.bloom_compose_mat.set_bloom_radius(val);\r\n this.blurrer.set_radius(val);\r\n }\r\n\r\n set_luminosity_threshold(value)\r\n {\r\n this.blurrer.set_luminosity_threshold(value);\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_0(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_1(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_2(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_3(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_4(col_string);\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n const width = this.use_rendering_size ? OScreen.render_width : OScreen.width;\r\n const height = this.use_rendering_size ? OScreen.render_height : OScreen.height;\r\n if (this.main_RT.width !== width || this.main_RT.height !== height)\r\n {\r\n this.main_RT.setSize(width, height);\r\n }\r\n }\r\n}\r\n\r\nexport { UnrealBloomRender };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Graphics } from '../Graphics';\r\n\r\nclass VRRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n // Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n if (SceneManager.current.on_pre_render)\r\n {\r\n SceneManager.current.on_pre_render();\r\n }\r\n\r\n if (SceneManager.current.render)\r\n {\r\n SceneManager.current.render();\r\n }\r\n else\r\n {\r\n Graphics.render(SceneManager.current, CameraManager.current, Graphics._renderer.getRenderTarget());\r\n }\r\n\r\n this.render_spectator_camera();\r\n\r\n if (SceneManager.current.on_post_render)\r\n {\r\n SceneManager.current.on_post_render();\r\n }\r\n }\r\n\r\n render_spectator_camera()\r\n {\r\n const spectator_camera = CameraManager.spectator;\r\n\r\n if (spectator_camera && Graphics._renderer.xr.isPresenting)\r\n {\r\n // Copy the XR Camera's position and rotation, but use your\r\n // main camera's projection matrix\r\n const xrCam = Graphics._renderer.xr.getCamera(CameraManager.current);\r\n\r\n spectator_camera.projectionMatrix.copy(CameraManager.current.projectionMatrix);\r\n\r\n spectator_camera.position.copy(xrCam.position);\r\n spectator_camera.quaternion.copy(xrCam.quaternion);\r\n\r\n // we'll restore this later\r\n const currentRenderTarget = Graphics._renderer.getRenderTarget();\r\n\r\n // turn off the WebXR rendering\r\n Graphics._renderer.xr.isPresenting = false;\r\n\r\n // render to the canvas on our main display\r\n Graphics._renderer.setRenderTarget(null);\r\n Graphics._renderer.render(SceneManager.current, spectator_camera);\r\n\r\n // reset back to enable WebXR\r\n Graphics._renderer.setRenderTarget(currentRenderTarget);\r\n Graphics._renderer.xr.isPresenting = true;\r\n }\r\n }\r\n}\r\n\r\nexport { VRRender };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line\r\nimport { OScreen } from './OScreen';\r\n\r\nclass Screen\r\n{\r\n init()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.init();\r\n }\r\n\r\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n update_position(x, y)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update_position(x, y);\r\n }\r\n\r\n update()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update();\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n update_size(width, height)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update_size(width, height);\r\n }\r\n\r\n /**\r\n * @param {Vector2} vector2\r\n */\r\n apply_pixel_density_v2(vector2)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.apply_pixel_density_v2(vector2);\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n apply_pixel_density(value)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.apply_pixel_density(value);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.get_pixel_size();\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.aspect_ratio;\r\n }\r\n}\r\n\r\nconst screen = new Screen();\r\nexport { screen as Screen };\r\n","import { ViewComponentManager } from './ViewComponentManager';\r\n\r\nexport class ViewComponent\r\n{\r\n constructor({ name, container })\r\n {\r\n this.name = name;\r\n this.container = container;\r\n this.hidden = true;\r\n\r\n ViewComponentManager.register_component(this);\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('hidden');\r\n ViewComponentManager.enable_component(this);\r\n\r\n this.hidden = false;\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n this.container.classList.add('hidden');\r\n ViewComponentManager.disable_component(this);\r\n\r\n this.hidden = true;\r\n }\r\n\r\n set_opacity(current_state_data)\r\n {\r\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\r\n this.toggle_hidden();\r\n }\r\n\r\n toggle_hidden()\r\n {\r\n if (this.container.style.opacity > 0.001)\r\n {\r\n if (this.hidden)\r\n {\r\n this.on_enter();\r\n }\r\n }\r\n else\r\n {\r\n if (!this.hidden)\r\n {\r\n this.on_exit();\r\n }\r\n }\r\n }\r\n}\r\n","// @ts-check\r\nimport { Material, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\n\r\nclass HorizontalPlane extends Mesh\r\n{\r\n /**\r\n * @param {number} [width]\r\n * @param {number} [height]\r\n * @param {number | string} [color]\r\n * @param {Material} [material]\r\n */\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n const geometry = new PlaneGeometry(width, height);\r\n geometry.rotateX(-3.14 / 2);\r\n super(geometry, material);\r\n }\r\n}\r\n\r\nexport { HorizontalPlane };\r\n","// @ts-check\r\nimport { Material, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { PlaneGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nclass VerticalPlane extends Mesh\r\n{\r\n /**\r\n * @param {number} [width]\r\n * @param {number} [height]\r\n * @param {number | string} [color]\r\n * @param {Material} [material]\r\n */\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n const geometry = new PlaneGeometry(width, height);\r\n super(geometry, material);\r\n }\r\n}\r\n\r\nexport { VerticalPlane };\r\n","class ArrayUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static merge_from_to(source, target)\r\n {\r\n target.push.apply(target, source);\r\n }\r\n\r\n static expand_vec3_array(array, size)\r\n {\r\n const items_left_count = size - array.length;\r\n\r\n for (let i = 0; i < items_left_count; i++)\r\n {\r\n array.push(array[i].clone());\r\n }\r\n }\r\n\r\n static remove_elem(array, elem)\r\n {\r\n const index = array.indexOf(elem);\r\n if (index > -1)\r\n {\r\n array.splice(index, 1);\r\n }\r\n }\r\n\r\n static get_closest_point(points, target)\r\n {\r\n let closest_point = points[0];\r\n let closest_distance = closest_point.distanceTo(target);\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n if (points[i].distanceTo(target) < closest_distance)\r\n {\r\n closest_point = points[i];\r\n closest_distance = points[i].distanceTo(target);\r\n }\r\n }\r\n return closest_point;\r\n }\r\n\r\n static object_values_to_array(obj)\r\n {\r\n const ids = Object.keys(obj);\r\n const arr = [];\r\n for (let i = 0; i < ids.length; i++)\r\n {\r\n arr.push(obj[ids[i]]);\r\n }\r\n return arr;\r\n }\r\n}\r\n\r\nexport { ArrayUtilities };\r\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\r\n\r\nclass FrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n const v_fov = Math.degToRad(vertical_fov / 2);\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n const sphere_center = this.sphere.center.clone();\r\n\r\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n const up_line_intersection = new Vector3();\r\n const down_line_intersection = new Vector3();\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n const vertical_min = Math.min(new_up_distance, new_down_distance);\r\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n const min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n const closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n let closest_up_point = undefined;\r\n let closest_down_point = undefined;\r\n\r\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n const down_line_intersection = new Vector3();\r\n const up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n const down_dist = down_line_intersection.distanceTo(points[i]);\r\n const up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n closest_up_point = points[i];\r\n }\r\n }\r\n\r\n console.log(closest_up_point, closest_down_point);\r\n\r\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n let closest_right_point = undefined;\r\n let closest_left_point = undefined;\r\n\r\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n const left_dist = left_line_intersection.distanceTo(points[i]);\r\n const right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n closest_right_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n console.log(closest_right_point, closest_left_point);\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n\r\nexport { FrustumPointFitter };\r\n","import { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\n\r\nclass GeometryUtilities\r\n{\r\n static convert_to_non_indexed_geometry(geometry_buffer)\r\n {\r\n const indices = geometry_buffer.index;\r\n const positions = geometry_buffer.getAttribute('position');\r\n\r\n const bar_coordinates = [];\r\n const vertices = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n // VERTEX 1\r\n vertices.push(positions.getX(indices.array[i + 0]));\r\n vertices.push(positions.getY(indices.array[i + 0]));\r\n vertices.push(positions.getZ(indices.array[i + 0]));\r\n\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 2\r\n\r\n vertices.push(positions.getX(indices.array[i + 1]));\r\n vertices.push(positions.getY(indices.array[i + 1]));\r\n vertices.push(positions.getZ(indices.array[i + 1]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 3\r\n\r\n vertices.push(positions.getX(indices.array[i + 2]));\r\n vertices.push(positions.getY(indices.array[i + 2]));\r\n vertices.push(positions.getZ(indices.array[i + 2]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n\r\n const geometry = new BufferGeometry();\r\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\r\n GeometryUtilities.add_barycentric_attribute(geometry);\r\n return geometry;\r\n }\r\n\r\n static add_barycentric_attribute(non_indexed_geometry_buffer)\r\n {\r\n const bar_coordinates = [];\r\n const positions = non_indexed_geometry_buffer.getAttribute('position');\r\n\r\n for (let i = 0; i < positions.count; i += 3)\r\n {\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\r\n }\r\n}\r\n\r\nexport { GeometryUtilities };\r\n","class HTMLUtilities\r\n{\r\n static load_images(container)\r\n {\r\n const images = container.querySelectorAll('img');\r\n\r\n for (let i = 0; i < images.length; i++)\r\n {\r\n const image = images[i];\r\n\r\n if (image.dataset.src)\r\n {\r\n image.src = image.dataset.src;\r\n }\r\n }\r\n\r\n const image_objects = container.querySelectorAll('object');\r\n\r\n for (let i = 0; i < image_objects.length; i++)\r\n {\r\n const image_object = image_objects[i];\r\n\r\n if (image_object.dataset.src)\r\n {\r\n image_object.data = image_object.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_videos(container)\r\n {\r\n const videos = container.querySelectorAll('video');\r\n\r\n for (let i = 0; i < videos.length; i++)\r\n {\r\n const video = videos[i];\r\n\r\n if (video.dataset.src)\r\n {\r\n video.src = video.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_iframes(container)\r\n {\r\n const iframes = container.querySelectorAll('iframe');\r\n\r\n for (let i = 0; i < iframes.length; i++)\r\n {\r\n const iframe = iframes[i];\r\n\r\n if (iframe.dataset.src)\r\n {\r\n iframe.src = iframe.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_elements(container, selector)\r\n {\r\n const elements = container.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < elements.length; i++)\r\n {\r\n const element = elements[i];\r\n\r\n if (element.dataset.src)\r\n {\r\n element.src = element.dataset.src;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { HTMLUtilities };\r\n","import { Vector4 } from 'three';\r\n\r\nclass ImageUtilities\r\n{\r\n constructor()\r\n { }\r\n\r\n static get_image_data(image)\r\n {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n\r\n const context = canvas.getContext('2d');\r\n context.drawImage(image, 0, 0);\r\n\r\n return context.getImageData(0, 0, image.width, image.height);\r\n }\r\n\r\n static get_pixel(imagedata, x, y)\r\n {\r\n const position = (x + imagedata.width * y) * 4;\r\n const data = imagedata.data;\r\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\r\n }\r\n}\r\n\r\nexport { ImageUtilities };\r\n","import { Vector3 } from 'three';\r\nimport { Vector2 } from 'three';\r\nclass MeshSampler\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n sample(buffer_geometry, sample_count)\r\n {\r\n const face_areas = [];\r\n\r\n let min_area = 99999999;\r\n\r\n const vertices = buffer_geometry.getAttribute('position');\r\n const normals = buffer_geometry.getAttribute('normal');\r\n const tangents = buffer_geometry.getAttribute('tangent');\r\n const uvs = buffer_geometry.getAttribute('uv');\r\n const indices = buffer_geometry.index;\r\n\r\n const faces = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n const index_0 = indices.array[i + 0];\r\n const index_1 = indices.array[i + 1];\r\n const index_2 = indices.array[i + 2];\r\n\r\n const v1 = new Vector3();\r\n v1.x = vertices.getX(index_0);\r\n v1.y = vertices.getY(index_0);\r\n v1.z = vertices.getZ(index_0);\r\n\r\n const v2 = new Vector3();\r\n v2.x = vertices.getX(index_1);\r\n v2.y = vertices.getY(index_1);\r\n v2.z = vertices.getZ(index_1);\r\n\r\n const v3 = new Vector3();\r\n v3.x = vertices.getX(index_2);\r\n v3.y = vertices.getY(index_2);\r\n v3.z = vertices.getZ(index_2);\r\n\r\n const face = {\r\n a: v1,\r\n b: v2,\r\n c: v3\r\n };\r\n\r\n if (normals)\r\n {\r\n const n1 = new Vector3();\r\n n1.x = normals.getX(index_0);\r\n n1.y = normals.getY(index_0);\r\n n1.z = normals.getZ(index_0);\r\n\r\n const n2 = new Vector3();\r\n n2.x = normals.getX(index_1);\r\n n2.y = normals.getY(index_1);\r\n n2.z = normals.getZ(index_1);\r\n\r\n const n3 = new Vector3();\r\n n3.x = normals.getX(index_2);\r\n n3.y = normals.getY(index_2);\r\n n3.z = normals.getZ(index_2);\r\n\r\n const normal = n1.clone().add(n2).add(n3).normalize();\r\n face.normal = normal;\r\n }\r\n\r\n if (tangents)\r\n {\r\n const n1 = new Vector3();\r\n n1.x = tangents.getX(index_0);\r\n n1.y = tangents.getY(index_0);\r\n n1.z = tangents.getZ(index_0);\r\n\r\n const n2 = new Vector3();\r\n n2.x = tangents.getX(index_1);\r\n n2.y = tangents.getY(index_1);\r\n n2.z = tangents.getZ(index_1);\r\n\r\n const n3 = new Vector3();\r\n n3.x = tangents.getX(index_2);\r\n n3.y = tangents.getY(index_2);\r\n n3.z = tangents.getZ(index_2);\r\n\r\n const tangent = n1.clone().add(n2).add(n3).normalize();\r\n face.tangent = tangent;\r\n }\r\n if (uvs)\r\n {\r\n const uv_a = new Vector2();\r\n uv_a.x = uvs.getX(index_0);\r\n uv_a.y = uvs.getY(index_0);\r\n\r\n const uv_b = new Vector2();\r\n uv_b.x = uvs.getX(index_1);\r\n uv_b.y = uvs.getY(index_1);\r\n\r\n const uv_c = new Vector2();\r\n uv_c.x = uvs.getX(index_2);\r\n uv_c.y = uvs.getY(index_2);\r\n\r\n face.uv_a = uv_a;\r\n face.uv_b = uv_b;\r\n face.uv_c = uv_c;\r\n }\r\n\r\n faces.push(face);\r\n\r\n const area = this.get_face_area(face);\r\n min_area = Math.min(area, min_area);\r\n face_areas.push(area);\r\n }\r\n\r\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\r\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\r\n const sampled_data = this.sample_data_from_faces(selected_faces);\r\n return sampled_data;\r\n }\r\n\r\n sample_data_from_faces(faces)\r\n {\r\n const sampled_points = [];\r\n const sampled_normals = [];\r\n const sampled_tangents = [];\r\n const sampled_uvs = [];\r\n\r\n for (let i = 0; i < faces.length; i++)\r\n {\r\n const face = faces[i];\r\n\r\n const w1 = Math.random();\r\n const w2 = Math.random();\r\n\r\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\r\n if (face.normal)\r\n {\r\n sampled_normals.push(face.normal.clone());\r\n }\r\n if (face.tangent)\r\n {\r\n sampled_tangents.push(face.tangent.clone());\r\n }\r\n if (face.uv_a)\r\n {\r\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\r\n }\r\n }\r\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\r\n }\r\n\r\n select_random_faces(faces, amount)\r\n {\r\n const selected_faces = [];\r\n for (let i = 0; i < amount; i++)\r\n {\r\n const random = Math.floor(Math.random() * faces.length);\r\n const selected_face = faces[random];\r\n\r\n selected_faces.push(selected_face);\r\n }\r\n\r\n return selected_faces;\r\n }\r\n\r\n get_uniform_face_distribution(face_areas, minimum_area, faces)\r\n {\r\n const extended_triangle_indices = [];\r\n for (let i = 0; i < face_areas.length; i++)\r\n {\r\n face_areas[i] /= minimum_area;\r\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\r\n for (let j = 0; j < repetitions_needed; j++)\r\n {\r\n extended_triangle_indices.push(faces[i]);\r\n }\r\n }\r\n return extended_triangle_indices;\r\n }\r\n\r\n get_face_area(face)\r\n {\r\n const vec1 = face.b.clone().sub(face.a);\r\n const vec2 = face.c.clone().sub(face.a);\r\n return vec1.cross(vec2).length() / 2;\r\n }\r\n\r\n sample_point_in_face(w1, w2, v1, v2, v3)\r\n {\r\n if (w1 + w2 > 1)\r\n {\r\n w1 = 1.0 - w1;\r\n w2 = 1.0 - w2;\r\n }\r\n\r\n const w3 = 1.0 - (w1 + w2);\r\n\r\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\r\n }\r\n}\r\n\r\nconst mesh_sampler = new MeshSampler();\r\nexport { mesh_sampler as MeshSampler };\r\n","import { Mesh } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Skeleton } from 'three';\r\n\r\nclass ModelUtilities\r\n{\r\n get_mesh(scene, result_callback)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\r\n }\r\n result_callback(child);\r\n }\r\n });\r\n }\r\n\r\n get_geometries(scene)\r\n {\r\n const geometries = [];\r\n\r\n this.get_mesh(scene, (child) =>\r\n {\r\n geometries.push(child.geometry);\r\n });\r\n return geometries;\r\n }\r\n\r\n assign_material(scene, material, name)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n // assign to all if no name is given\r\n if (name === undefined)\r\n {\r\n child.material = material;\r\n }\r\n else\r\n {\r\n // if name is given, assign only to that\r\n if (child.name === name)\r\n {\r\n child.material = material;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n clone_animated_gltf(gltf)\r\n {\r\n const clone = {\r\n animations: gltf.animations,\r\n scene: gltf.scene.clone(true)\r\n };\r\n\r\n const skinnedMeshes = {};\r\n\r\n gltf.scene.traverse(node =>\r\n {\r\n if (node.isSkinnedMesh)\r\n {\r\n skinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n const cloneBones = {};\r\n const cloneSkinnedMeshes = {};\r\n\r\n clone.scene.traverse(node =>\r\n {\r\n if (node.isBone)\r\n {\r\n cloneBones[node.name] = node;\r\n }\r\n\r\n if (node.isSkinnedMesh)\r\n {\r\n cloneSkinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n for (const name in skinnedMeshes)\r\n {\r\n const skinnedMesh = skinnedMeshes[name];\r\n const skeleton = skinnedMesh.skeleton;\r\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\r\n\r\n const orderedCloneBones = [];\r\n\r\n for (let i = 0; i < skeleton.bones.length; ++i)\r\n {\r\n const cloneBone = cloneBones[skeleton.bones[i].name];\r\n orderedCloneBones.push(cloneBone);\r\n }\r\n\r\n cloneSkinnedMesh.bind(\r\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\r\n cloneSkinnedMesh.matrixWorld);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n set_shadow_config(scene, cast, receive)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n child.castShadow = cast;\r\n child.receiveShadow = receive;\r\n }\r\n });\r\n }\r\n\r\n __find_object(scene, object_name, result_callback)\r\n {\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n result_callback(obj);\r\n }\r\n });\r\n }\r\n\r\n get_object(scene, object_name)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n\r\n get_object_by_type(scene, object_type)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.constructor.name === object_type)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n}\r\n\r\nconst model_utilities = new ModelUtilities();\r\nexport { model_utilities as ModelUtilities };\r\n","class ObjectUtilities\r\n{\r\n static is_object(item)\r\n {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n }\r\n\r\n static merge_deep(target, ...sources)\r\n {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (ObjectUtilities.is_object(target) && ObjectUtilities.is_object(source))\r\n {\r\n for (const key in source)\r\n {\r\n if (ObjectUtilities.is_object(source[key]))\r\n {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n ObjectUtilities.merge_deep(target[key], source[key]);\r\n }\r\n else\r\n {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return ObjectUtilities.merge_deep(target, ...sources);\r\n }\r\n\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport { ObjectUtilities };\r\n","class StringUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static get_random_color()\r\n {\r\n const hexValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];\r\n let hex = '#';\r\n\r\n for (let i = 0; i < 6; i++)\r\n {\r\n const index = Math.floor(Math.random() * hexValues.length);\r\n hex += hexValues[index];\r\n }\r\n\r\n return hex;\r\n }\r\n\r\n static capitalize(string)\r\n {\r\n const words = string.split(' ');\r\n\r\n for (let i = 0; i < words.length; i++)\r\n {\r\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\r\n }\r\n\r\n return words.join(' ');\r\n }\r\n\r\n static capitalize_first_letter(string)\r\n {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n\r\n static snake_to_camelcase(string)\r\n {\r\n return string.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\r\n }\r\n}\r\n\r\nexport { StringUtilities };\r\n","class TimeUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Converts a time string (00:00:00.45) into miliseconds\r\n time_str_to_ms(time_str)\r\n {\r\n time_str = time_str.split(':');\r\n\r\n let hours = Number(time_str[0]);\r\n hours = hours * 60 * 60 * 1000;\r\n\r\n let minutes = Number(time_str[1]);\r\n minutes = minutes * 60 * 1000;\r\n\r\n let seconds = Number(time_str[2]);\r\n seconds = seconds * 1000;\r\n\r\n return hours + minutes + seconds;\r\n }\r\n}\r\n\r\nexport { TimeUtilities };\r\n","class Validation\r\n{\r\n constructor()\r\n {}\r\n\r\n static is_int(n)\r\n {\r\n return Number(n) === n && n % 1 === 0;\r\n }\r\n\r\n static is_float(n)\r\n {\r\n return Number(n) === n && n % 1 !== 0;\r\n }\r\n\r\n static is_number(n)\r\n {\r\n return this.is_int(n) || this.is_float(n);\r\n }\r\n\r\n static is_json(str)\r\n {\r\n try\r\n {\r\n JSON.parse(str);\r\n }\r\n catch (e)\r\n {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\nexport { Validation };\r\n","// @ts-check\r\n// @ts-ignore\r\nimport grid_frag from '../shaders/grid/grid.frag';\r\n// @ts-ignore\r\nimport grid_vert from '../shaders/grid/grid.vert';\r\n\r\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\r\n\r\nimport { Mesh } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\n\r\nclass Grid extends Mesh\r\n{\r\n constructor()\r\n {\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Color('#919191') }\r\n },\r\n vertexShader: grid_vert,\r\n fragmentShader: grid_frag,\r\n // @ts-ignore\r\n extensions: { derivatives: true },\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\r\n\r\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\r\n\r\n super(non_indexed_geometry, material);\r\n\r\n this.rotation.x = -3.14 / 2;\r\n }\r\n}\r\n\r\nexport { Grid };\r\n","// @ts-check\r\n// @ts-ignore\r\nimport line_vs from '../shaders/basic_line/basic_line.vert';\r\n// @ts-ignore\r\nimport line_fs from '../shaders/basic_line/basic_line.frag';\r\n\r\nimport { Mesh, Vector3 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nclass Line extends Mesh\r\n{\r\n /**\r\n * @param {Vector3[]} [points]\r\n */\r\n constructor(points)\r\n {\r\n const geometry = new BufferGeometry();\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\r\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\r\n\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Thickness: { value: 0.2 },\r\n _Length: { value: 0 },\r\n _ElapsedTime: { value: 0 },\r\n _Color: { value: new Color('#FF0000') }\r\n },\r\n vertexShader: line_vs,\r\n fragmentShader: line_fs,\r\n transparent: true,\r\n depthWrite: false,\r\n // @ts-ignore\r\n extensions: { derivatives: true }\r\n\r\n });\r\n\r\n super(geometry, material);\r\n this.material = material;\r\n if (points)\r\n {\r\n this.setup(points);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n */\r\n setup(points)\r\n {\r\n const vertices = [];\r\n const next_position = [];\r\n const previous_position = [];\r\n const orientation = [];\r\n const coverage = [];\r\n let accumulated_length = 0;\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(1);\r\n\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(-1);\r\n\r\n const next_point = this.__get_next_position(points, i);\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n const previous_point = this.__get_previous_position(points, i);\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n coverage.push(accumulated_length);\r\n coverage.push(accumulated_length);\r\n\r\n if (i < points.length - 1)\r\n {\r\n accumulated_length += points[i].distanceTo(next_point);\r\n }\r\n }\r\n const vertexList = new Float32Array(vertices);\r\n const nextPositionList = new Float32Array(next_position);\r\n const previousPositionList = new Float32Array(previous_position);\r\n const orientationList = new Float32Array(orientation);\r\n const coverageList = new Float32Array(coverage);\r\n\r\n const indices = [];\r\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\r\n {\r\n const index = (i * 2) + 1;\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index - 1);\r\n\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 1);\r\n }\r\n\r\n this.geometry.setIndex(indices);\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('position')).copy(new BufferAttribute(vertexList, 3));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('next_position')).copy(new BufferAttribute(nextPositionList, 3));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('previous_position')).copy(new BufferAttribute(previousPositionList, 3));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('orientation')).copy(new BufferAttribute(orientationList, 1));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('coverage')).copy(new BufferAttribute(coverageList, 1));\r\n\r\n this.geometry.getAttribute('position').needsUpdate = true;\r\n this.geometry.getAttribute('next_position').needsUpdate = true;\r\n this.geometry.getAttribute('previous_position').needsUpdate = true;\r\n this.geometry.getAttribute('orientation').needsUpdate = true;\r\n this.geometry.getAttribute('coverage').needsUpdate = true;\r\n\r\n this.material.uniforms._Length.value = accumulated_length;\r\n this._length = accumulated_length;\r\n this.accumulated_length = accumulated_length;\r\n }\r\n\r\n set thickness(value)\r\n {\r\n this.material.uniforms._Thickness.value = value;\r\n }\r\n\r\n get thickness()\r\n {\r\n return this.material.uniforms._Thickness.value;\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n * @param {number} i\r\n * @returns {Vector3}\r\n */\r\n __get_previous_position(points, i)\r\n {\r\n if (i === 0)\r\n {\r\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\r\n }\r\n else\r\n {\r\n return points[i - 1];\r\n }\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n * @param {number} i\r\n * @returns {Vector3}\r\n */\r\n __get_next_position(points, i)\r\n {\r\n if (i === points.length - 1)\r\n {\r\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\r\n }\r\n else\r\n {\r\n return points[i + 1];\r\n }\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n distance()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n total_length()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n if (this.parent)\r\n {\r\n this.parent.remove(this);\r\n }\r\n }\r\n\r\n set color(col)\r\n {\r\n this.material.uniforms._Color.value.set(col);\r\n }\r\n\r\n get color()\r\n {\r\n return this.material.uniforms._Color.value;\r\n }\r\n\r\n /**\r\n * @param {Color} col\r\n */\r\n copy_color(col)\r\n {\r\n this.material.uniforms._Color.value.copy(col);\r\n }\r\n}\r\n\r\nexport { Line };\r\n","// @ts-check\r\n// @ts-ignore\r\nimport basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\r\n// @ts-ignore\r\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\r\n\r\nimport { Mesh, Texture } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { DoubleSide } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nclass WorldImage extends Mesh\r\n{\r\n /**\r\n * @param {Texture} texture\r\n * @param {Vector2} [pivot]\r\n */\r\n constructor(texture, pivot)\r\n {\r\n pivot = pivot || new Vector2(0, 0);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _MainTex: { value: texture },\r\n _ScreenAligned: { value: 0 },\r\n _Scale: { value: 1 },\r\n _Opacity: { value: 1 }\r\n },\r\n vertexShader: basic_texture_vert,\r\n fragmentShader: basic_texture_frag,\r\n transparent: true,\r\n depthWrite: false,\r\n side: DoubleSide\r\n });\r\n const geometry = new PlaneGeometry(1, 1, 1);\r\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\r\n const current_scale = texture.image.width / texture.image.height;\r\n geometry.scale(current_scale, 1, 1);\r\n super(geometry, material);\r\n this.current_scale = current_scale;\r\n this.geometry.computeBoundingBox();\r\n\r\n this.tmp_bb_size = new Vector3();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n this.material = material;\r\n }\r\n\r\n update_texture()\r\n {\r\n this.material.uniforms._MainTex.value.needsUpdate = true;\r\n const img = this.material.uniforms._MainTex.value.image;\r\n\r\n this.geometry.scale(1 / this.current_scale, 1, 1);\r\n this.current_scale = img.width / img.height;\r\n this.geometry.scale(this.current_scale, 1, 1);\r\n this.geometry.computeBoundingBox();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n }\r\n\r\n get size()\r\n {\r\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\r\n }\r\n\r\n set size(value)\r\n {\r\n this.scale.copy(value);\r\n this.material.uniforms._Scale.value = value;\r\n }\r\n\r\n set screen_aligned(boolean)\r\n {\r\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\r\n }\r\n\r\n get screen_aligned()\r\n {\r\n return this.material.uniforms._ScreenAligned.value === 1;\r\n }\r\n\r\n set opacity(opacity)\r\n {\r\n this.material.uniforms._Opacity.value = opacity;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.material.uniforms._Opacity.value;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.parent.remove(this);\r\n this.material.uniforms._MainTex.value.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n\r\nexport { WorldImage };\r\n","// @ts-check\r\nimport { WorldImage } from './WorldImage';\r\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\r\n\r\nimport { LinearMipMapLinearFilter, Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { LinearFilter } from 'three';\r\n\r\nclass Text2D extends WorldImage\r\n{\r\n /**\r\n * @param {string} text\r\n * @param {string} font\r\n * @param {string | Number} color\r\n * @param {Vector2} pivot\r\n * @param {boolean} [is_static]\r\n */\r\n constructor(text, font, color, pivot, is_static) // eslint-disable-line no-unused-vars\r\n {\r\n const simple_text_drawer = new SimpleTextDrawer();\r\n\r\n const draw_settings = {\r\n font: font,\r\n font_color: color || '#000000'\r\n };\r\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\r\n\r\n canvas_texture.minFilter = LinearMipMapLinearFilter;\r\n canvas_texture.minFilter = LinearFilter;\r\n canvas_texture.needsUpdate = true;\r\n super(canvas_texture, pivot);\r\n\r\n this.simple_text_drawer = simple_text_drawer;\r\n this.canvas_texture = canvas_texture;\r\n this.draw_settings = draw_settings;\r\n }\r\n\r\n set text(value)\r\n {\r\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\r\n this.update_texture();\r\n }\r\n\r\n get text()\r\n {\r\n return 'not implemented';\r\n }\r\n}\r\n\r\nexport { Text2D };\r\n","// @ts-check\r\nimport { BufferGeometry, Material, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\n\r\nclass UpdatableMaterialMesh extends Mesh\r\n{\r\n /**\r\n * @param {BufferGeometry} geometry\r\n * @param {Material} material\r\n */\r\n constructor(geometry, material)\r\n {\r\n super(geometry, material);\r\n this.material = material;\r\n const self = this;\r\n\r\n this.onBeforeRender = () =>\r\n {\r\n if ('update' in self.material && typeof self.material.update === 'function')\r\n {\r\n self.material.update();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport { UpdatableMaterialMesh };\r\n","import { Vector2, Vector4 } from 'three';\r\n\r\nclass TextGlyph\r\n{\r\n constructor(offset, plane_bounds, atlas_bounds)\r\n {\r\n const width = plane_bounds.right - plane_bounds.left;\r\n const height = plane_bounds.top - plane_bounds.bottom;\r\n\r\n this.scale = new Vector2(width, height);\r\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\r\n\r\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\r\n }\r\n}\r\n\r\nexport { TextGlyph };\r\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\r\nimport { TextGlyph } from './TextGlyph';\r\n\r\nclass SDFText\r\n{\r\n constructor(glyph_layout, text = '')\r\n {\r\n this.glyph_layout = glyph_layout;\r\n\r\n this.glyphs = [];\r\n\r\n this.glyph_is_dirty = true;\r\n this.matrix_is_dirty = true;\r\n this.color_is_dirty = true;\r\n\r\n this.position = new Vector3();\r\n this.quaternion = new Quaternion();\r\n this.scale = new Vector3(1, 1, 1);\r\n this.matrix = new Matrix4();\r\n\r\n this.color = new Color('#FFFFFF');\r\n\r\n this.pivot_point = new Vector2();\r\n this.__opacity = 1;\r\n\r\n this.__text = text;\r\n\r\n this.__generate_glyphs(text);\r\n }\r\n\r\n set text(value)\r\n {\r\n this.__text = value;\r\n this.__generate_glyphs(value);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n get text()\r\n {\r\n return this.__text;\r\n }\r\n\r\n update_matrix()\r\n {\r\n this.matrix.compose(this.position, this.quaternion, this.scale);\r\n this.matrix_is_dirty = false;\r\n this.glyph_is_dirty = true;\r\n }\r\n\r\n clear_glyph_dirty()\r\n {\r\n this.glyph_is_dirty = false;\r\n }\r\n\r\n clear_color_dirty()\r\n {\r\n this.color_is_dirty = false;\r\n }\r\n\r\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\r\n {\r\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\r\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\r\n\r\n this.quaternion.copy(new_orientation.multiply(new_tilt));\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_position(pos)\r\n {\r\n this.position.copy(pos);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_size(size)\r\n {\r\n this.scale.set(size, size, size);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_color(col)\r\n {\r\n this.color.set(col);\r\n this.color_is_dirty = true;\r\n }\r\n\r\n set_pivot(pivot)\r\n {\r\n this.pivot_point.copy(pivot);\r\n this.update_glyphs();\r\n }\r\n\r\n set opacity(op)\r\n {\r\n this.__opacity = op;\r\n this.color_is_dirty = true;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.__opacity;\r\n }\r\n\r\n update_glyphs()\r\n {\r\n this.__generate_glyphs(this.text);\r\n }\r\n\r\n __generate_glyphs(text)\r\n {\r\n let cursor = 0;\r\n\r\n this.glyphs.length = 0;\r\n\r\n for (let i = 0; i < text.length; i++)\r\n {\r\n const unicode = text.charCodeAt(i);\r\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\r\n if (glyph)\r\n {\r\n if (glyph.planeBounds)\r\n {\r\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\r\n this.glyphs.push(text_glyph);\r\n }\r\n cursor += glyph.advance;\r\n }\r\n }\r\n\r\n const box2 = new Box2();\r\n const first_glyph = this.glyphs[0];\r\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\r\n\r\n for (let i = 1; i < this.glyphs.length; i++)\r\n {\r\n const g = this.glyphs[i];\r\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\r\n box2.union(box);\r\n }\r\n\r\n const box2_size = new Vector2();\r\n box2.getSize(box2_size);\r\n for (let i = 0; i < this.glyphs.length; i++)\r\n {\r\n this.glyphs[i].position.x -= box2_size.x / 2;\r\n this.glyphs[i].position.y -= box2_size.y / 2;\r\n\r\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\r\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\r\n }\r\n\r\n this.glyph_is_dirty = true;\r\n }\r\n}\r\n\r\nexport { SDFText };\r\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\r\n\r\nimport frag from '../shaders/sdf_text/sdf_text.frag';\r\nimport vert from '../shaders/sdf_text/sdf_text.vert';\r\n\r\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\r\nimport { OMath } from '../utilities/OMath';\r\n\r\nclass SDFTextMaterial extends BaseShaderMaterial\r\n{\r\n constructor(texture)\r\n {\r\n super(vert, frag, {\r\n _Texture: { value: texture },\r\n _Boldness: { value: 0.5 },\r\n _AtlasSize: { value: new Vector2(1, 1) }\r\n });\r\n\r\n this.transparent = true;\r\n this.extensions = {\r\n derivatives: true\r\n };\r\n this.depthWrite = false;\r\n this.side = DoubleSide;\r\n texture.minFilter = LinearFilter;\r\n texture.magFilter = LinearFilter;\r\n texture.generateMipMaps = false;\r\n }\r\n\r\n set_atlas_size(size)\r\n {\r\n this.uniforms._AtlasSize.value.copy(size);\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\r\n }\r\n}\r\n\r\nexport { SDFTextMaterial };\r\n","import { SDFText } from './SDFText';\r\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\r\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\r\n\r\nimport {\r\n PlaneGeometry,\r\n Mesh,\r\n Vector2,\r\n InstancedBufferGeometry,\r\n InstancedBufferAttribute,\r\n Float32BufferAttribute,\r\n DynamicDrawUsage\r\n} from 'three';\r\n\r\nclass SDFTextBatch extends Mesh\r\n{\r\n constructor(font_layout, atlas_texture)\r\n {\r\n const max_allocations = 2000;\r\n\r\n const instanced_geometry = new InstancedBufferGeometry();\r\n instanced_geometry.instanceCount = 0;\r\n\r\n const geometry = new PlaneGeometry(1, 1);\r\n geometry.translate(0.5, 0.5, 0);\r\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\r\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\r\n instanced_geometry.index = geometry.index;\r\n\r\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n transformsCol0.usage = DynamicDrawUsage;\r\n transformsCol1.usage = DynamicDrawUsage;\r\n transformsCol2.usage = DynamicDrawUsage;\r\n transformsCol3.usage = DynamicDrawUsage;\r\n glyph_bounds.usage = DynamicDrawUsage;\r\n plane_bounds.usage = DynamicDrawUsage;\r\n color.usage = DynamicDrawUsage;\r\n\r\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\r\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\r\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\r\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\r\n\r\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\r\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\r\n instanced_geometry.setAttribute('color', color);\r\n\r\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\r\n\r\n this.text_elements = [];\r\n this.font_layout = font_layout;\r\n\r\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\r\n\r\n this.frustumCulled = false;\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.material.set_boldness(value);\r\n }\r\n\r\n add_text(text_str)\r\n {\r\n const elem = new SDFText(this.font_layout.glyphs, text_str);\r\n this.text_elements.push(elem);\r\n return elem;\r\n }\r\n\r\n remove_text(text_elem)\r\n {\r\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\r\n this.update(true);\r\n }\r\n\r\n update(force_update)\r\n {\r\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\r\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\r\n\r\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\r\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\r\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\r\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\r\n\r\n const color_atr = this.geometry.getAttribute('color');\r\n\r\n let matrix_needs_update = force_update === true;\r\n let glyph_needs_update = force_update === true;\r\n let color_needs_update = force_update === true;\r\n\r\n let glyph_count = 0;\r\n for (let i = 0; i < this.text_elements.length; i++)\r\n {\r\n const text = this.text_elements[i];\r\n\r\n if (text.matrix_is_dirty)\r\n {\r\n matrix_needs_update = true;\r\n text.update_matrix();\r\n }\r\n\r\n if (text.glyph_is_dirty)\r\n {\r\n glyph_needs_update = true;\r\n text.clear_glyph_dirty();\r\n }\r\n\r\n if (text.color_is_dirty)\r\n {\r\n color_needs_update = true;\r\n text.clear_color_dirty();\r\n }\r\n\r\n const matrix = text.matrix;\r\n const color = text.color;\r\n const opacity = text.opacity;\r\n\r\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\r\n {\r\n const glyph = text.glyphs[glyph_i];\r\n\r\n const buffer_i = glyph_count;\r\n\r\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\r\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\r\n\r\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\r\n matrix.elements[1],\r\n matrix.elements[2],\r\n matrix.elements[3]);\r\n\r\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\r\n matrix.elements[5],\r\n matrix.elements[6],\r\n matrix.elements[7]);\r\n\r\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\r\n matrix.elements[9],\r\n matrix.elements[10],\r\n matrix.elements[11]);\r\n\r\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\r\n matrix.elements[13],\r\n matrix.elements[14],\r\n matrix.elements[15]);\r\n\r\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\r\n\r\n glyph_count++;\r\n }\r\n }\r\n\r\n this.geometry.instanceCount = glyph_count;\r\n\r\n if (glyph_count > this.max_allocations)\r\n {\r\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\r\n }\r\n\r\n if (matrix_needs_update)\r\n {\r\n transformsCol0.needsUpdate = true;\r\n transformsCol1.needsUpdate = true;\r\n transformsCol2.needsUpdate = true;\r\n transformsCol3.needsUpdate = true;\r\n }\r\n if (glyph_needs_update)\r\n {\r\n glyph_bounds_atr.needsUpdate = true;\r\n plane_bounds_atr.needsUpdate = true;\r\n }\r\n if (color_needs_update)\r\n {\r\n color_atr.needsUpdate = true;\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n\r\nexport { SDFTextBatch };\r\n","// @ts-check\r\nimport { Vector3 } from 'three';\r\nimport { ActionInterpolator } from './ActionInterpolator';\r\n\r\nclass VectorInterpolator extends ActionInterpolator\r\n{\r\n /**\r\n * @param {string} attribute_name\r\n * @param {Vector3} [from]\r\n * @param {Vector3} [to]\r\n * @param {import('../utilities/EasingFunctions').EasingFunctionType | function} [easing_function]\r\n */\r\n constructor(attribute_name, from = new Vector3(), to = new Vector3(1, 1, 1), easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n }\r\n\r\n /**\r\n * @param {any} context\r\n * @param {number} t\r\n */\r\n update(context, t)\r\n {\r\n const tmp = this.from.clone();\r\n tmp.lerp(this.to, this.easing_function(t));\r\n context[this.attribute_name].copy(tmp);\r\n }\r\n}\r\n\r\nexport { VectorInterpolator };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\r\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\r\n\r\nclass DualFilteringBlurMaterial extends BlitMaterial\r\n{\r\n constructor(upsample)\r\n {\r\n super(upsample ? upsample_frag : downsample_frag);\r\n }\r\n}\r\n\r\nexport { DualFilteringBlurMaterial };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\r\n\r\nclass AlphaFilterMaterial extends BlitMaterial\r\n{\r\n constructor(use_alpha_mask, upsample)\r\n {\r\n super(frag);\r\n }\r\n\r\n set offset(value)\r\n {\r\n this.uniforms._Offset.value = value;\r\n }\r\n\r\n get offset()\r\n {\r\n return this.uniforms._Offset.value;\r\n }\r\n}\r\n\r\nexport { AlphaFilterMaterial };\r\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\r\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\r\nimport { Graphics } from '../Graphics';\r\nimport { WebGLRenderTarget } from 'three';\r\nclass DualFilteringBlurrer\r\n{\r\n constructor(use_alpha_mask)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n this.RT0 = new WebGLRenderTarget(1, 1);\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.RT3 = new WebGLRenderTarget(1, 1);\r\n this.RT4 = new WebGLRenderTarget(1, 1);\r\n\r\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\r\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\r\n\r\n this.alpha_filter_mat = new AlphaFilterMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n this.check_RT_resize(RT.width, RT.height);\r\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\r\n\r\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\r\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\r\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\r\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\r\n\r\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\r\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\r\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\r\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\r\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\r\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\r\n\r\n // return this.RT2;\r\n }\r\n\r\n check_RT_resize(width, height)\r\n {\r\n if (this.current_width !== width || this.current_height !== height)\r\n {\r\n this.current_width = width;\r\n this.current_height = height;\r\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\r\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\r\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\r\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\r\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\r\n }\r\n }\r\n}\r\n\r\nexport { DualFilteringBlurrer };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/median_filter/median_filter.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass MedianFilterMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, undefined, {\r\n kernel3x3: true\r\n });\r\n\r\n this.uniforms._SourceTex = { value: undefined };\r\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\r\n }\r\n\r\n set_texture(tex)\r\n {\r\n this.uniforms._SourceTex.value = tex;\r\n\r\n const size = this.get_size(tex);\r\n this.uniforms._SourceTexSize.value.copy(size);\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n\r\nexport { MedianFilterMaterial };\r\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\r\nimport { Graphics } from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\r\n\r\nclass MedianFilter\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n this.RT1 = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n\r\n this.median_filter_mat = new MedianFilterMaterial();\r\n }\r\n\r\n filter(texture)\r\n {\r\n const tex_size = this.get_size(texture);\r\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\r\n {\r\n this.RT.setSize(tex_size.x, tex_size.y);\r\n this.RT1.setSize(tex_size.x, tex_size.y);\r\n }\r\n\r\n this.median_filter_mat.set_texture(texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n\r\n for (let i = 0; i < 0; i++)\r\n {\r\n this.median_filter_mat.set_texture(this.RT.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT1);\r\n\r\n this.median_filter_mat.set_texture(this.RT1.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n }\r\n\r\n return this.RT;\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n\r\nexport { MedianFilter };\r\n","import { Graphics } from '../Graphics';\r\n\r\nimport { FloatType, HalfFloatType, NearestFilter, NoColorSpace, RGBAFormat, WebGLRenderTarget } from 'three';\r\nimport { Capabilities } from '../Capabilities';\r\n\r\nclass ParticleAttribute\r\n{\r\n constructor(attr_name, update_material)\r\n {\r\n this.read = undefined;\r\n this.write = undefined;\r\n\r\n this.name = attr_name;\r\n\r\n this.update_material = update_material;\r\n }\r\n\r\n init_from_geometry(geometry)\r\n {\r\n // overrided by inheritance\r\n }\r\n\r\n init_from_attribute(particle_attribute)\r\n {\r\n\r\n }\r\n\r\n build_RT(particle_count)\r\n {\r\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\r\n const options = {\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter,\r\n format: RGBAFormat,\r\n colorScape: NoColorSpace,\r\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\r\n stencilBuffer: false,\r\n depthBuffer: false\r\n };\r\n\r\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\r\n }\r\n\r\n static calculate_resolution(particle_count)\r\n {\r\n const width = Math.min(particle_count, 512);\r\n const height = Math.max(1, Math.ceil(particle_count / width));\r\n return { width, height };\r\n }\r\n\r\n swap_RT()\r\n {\r\n const tmp = this.read;\r\n this.read = this.write;\r\n this.write = tmp;\r\n }\r\n\r\n update(attribute_writter_scene)\r\n {\r\n if (this.update_material)\r\n {\r\n this.update_material.update();\r\n attribute_writter_scene.children[0].material = this.update_material;\r\n this.update_material.uniforms._MainTex.value = this.read.texture;\r\n Graphics.render(attribute_writter_scene, undefined, this.write);\r\n attribute_writter_scene.children[0].material = undefined;\r\n\r\n this.swap_RT();\r\n }\r\n }\r\n\r\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\r\n {\r\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\r\n attribute_writter_scene.children[0].material = storage_material;\r\n\r\n Graphics.render(attribute_writter_scene, undefined, RT);\r\n\r\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\r\n attribute_writter_scene.children[0].material = undefined;\r\n }\r\n\r\n get_texture()\r\n {\r\n return this.read.texture;\r\n }\r\n}\r\n\r\nexport { ParticleAttribute };\r\n","import { Object3D } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Scene } from 'three';\r\nimport { Points } from 'three';\r\nimport { InstancedBufferGeometry } from 'three';\r\nimport { InstancedBufferAttribute } from 'three';\r\nimport { ParticleAttribute } from './ParticleAttribute';\r\n\r\nclass GPUParticleSystem extends Object3D\r\n{\r\n constructor(particle_count, material)\r\n {\r\n super();\r\n this.attributes = [];\r\n\r\n this.mesh = this.build_point_mesh(particle_count, material);\r\n this.add(this.mesh);\r\n\r\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\r\n this.attribute_writter_scene = new Scene();\r\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\r\n }\r\n\r\n add_texture_attribute(buffer_attribute)\r\n {\r\n this.attributes.push(buffer_attribute);\r\n }\r\n\r\n add_update_attribute_array(name, array, item_size)\r\n {\r\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\r\n }\r\n\r\n add_attribute_array(name, array, item_size)\r\n {\r\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\r\n }\r\n\r\n update()\r\n {\r\n this.mesh.material.update();\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n this.attributes[i].update(this.attribute_writter_scene);\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.mesh.geometry.dispose();\r\n this.mesh.material.dispose();\r\n }\r\n\r\n build_point_mesh(instance_count = 1, material)\r\n {\r\n const geo = new PlaneGeometry();\r\n\r\n const instanced_geo = new InstancedBufferGeometry();\r\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\r\n instanced_geo.index = geo.index;\r\n\r\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\r\n instanced_geo.instanceCount = instance_count;\r\n const mesh = new Mesh(instanced_geo, material);\r\n mesh.frustumCulled = false;\r\n return mesh;\r\n }\r\n\r\n build_attribute_writter_mesh(particle_count)\r\n {\r\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\r\n\r\n const uvs = new Float32Array(particle_count * 3);\r\n\r\n for (let i = 0; i < particle_count; i++)\r\n {\r\n const x = i % width;\r\n const y = Math.floor(i / width);\r\n uvs[i * 3 + 0] = (x + 0.5) / width;\r\n uvs[i * 3 + 1] = (y + 0.5) / height;\r\n uvs[i * 3 + 2] = i;\r\n }\r\n const geo = new BufferGeometry();\r\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\r\n\r\n const points = new Points(geo);\r\n points.frustumCulled = false;\r\n return points;\r\n }\r\n\r\n build_uv_storage_attribute(particle_count)\r\n {\r\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\r\n\r\n const uvs = new Float32Array(particle_count * 2);\r\n\r\n for (let i = 0; i < particle_count; i++)\r\n {\r\n const x = i % width;\r\n const y = Math.floor(i / width);\r\n uvs[i * 2 + 0] = (x + 0.5) / width;\r\n uvs[i * 2 + 1] = (y + 0.5) / height;\r\n }\r\n return new InstancedBufferAttribute(uvs, 2, false);\r\n }\r\n}\r\n\r\nexport { GPUParticleSystem };\r\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { NoBlending } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\n\r\nclass ParticleStorageMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n const vert = `\r\n varying vec4 value;\r\n attribute vec4 data;\r\n\r\n void main()\r\n {\r\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\r\n gl_PointSize = 1.0;\r\n\r\n value = data;\r\n }\r\n `;\r\n super({\r\n uniforms: {\r\n\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n }\r\n}\r\n\r\nexport { ParticleStorageMaterial };\r\n","import { BufferAttribute } from 'three';\r\n\r\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\r\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\r\n\r\nclass ParticlePositionAttribute extends ParticleAttribute\r\n{\r\n constructor(update_material)\r\n {\r\n super('_Position', update_material);\r\n }\r\n\r\n store_geometry(geometry, attribute_writter_scene)\r\n {\r\n const pos_attr = geometry.getAttribute('position');\r\n this.read = this.build_RT(pos_attr.count);\r\n this.write = this.build_RT(pos_attr.count);\r\n\r\n const mat = new ParticleStorageMaterial();\r\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\r\n }\r\n\r\n store_positions(positions, attribute_writter_scene)\r\n {\r\n this.read = this.build_RT(positions.length);\r\n this.write = this.build_RT(positions.length);\r\n\r\n const arr = new Float32Array(positions.length * 4);\r\n\r\n for (let i = 0; i < positions.length; i++)\r\n {\r\n arr[i * 4 + 0] = positions[i].x;\r\n arr[i * 4 + 1] = positions[i].y;\r\n arr[i * 4 + 2] = positions[i].z;\r\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\r\n }\r\n const mat = new ParticleStorageMaterial();\r\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\r\n }\r\n}\r\n\r\nexport { ParticlePositionAttribute };\r\n","import { DataTexture } from 'three';\r\n\r\nclass CustomDataTexture extends DataTexture\r\n{\r\n constructor(data, width, height, format, type)\r\n {\r\n super(data, width, height, format, type);\r\n this.multiplier = 1;\r\n }\r\n\r\n set_rgba(index, r, g, b, a)\r\n {\r\n this.data[index * 3 + 0] = r * this.multiplier;\r\n this.data[index * 3 + 1] = g * this.multiplier;\r\n this.data[index * 3 + 2] = b * this.multiplier;\r\n this.data[index * 3 + 3] = a * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_rgb(index, r, g, b)\r\n {\r\n this.data[index * 3 + 0] = r * this.multiplier;\r\n this.data[index * 3 + 1] = g * this.multiplier;\r\n this.data[index * 3 + 2] = b * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_r(index, value)\r\n {\r\n this.data[index * 3 + 0] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_g(index, value)\r\n {\r\n this.data[index * 3 + 1] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_b(index, value)\r\n {\r\n this.data[index * 3 + 2] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_a(index, value)\r\n {\r\n this.data[index * 3 + 2] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n}\r\n\r\nexport { CustomDataTexture };\r\n","import { RGBAFormat } from 'three';\r\nimport { CustomDataTexture } from './CustomDataTexture';\r\n\r\nclass RGBDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Uint8Array(width * height * 3);\r\n super(data, width, height, RGBAFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n\r\nexport { RGBDataTexture };\r\n","import { CustomDataTexture } from './CustomDataTexture';\r\nimport { RGBAFormat } from 'three';\r\n\r\nclass RGBADataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Uint8Array(width * height * 4);\r\n super(data, width, height, RGBAFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n\r\nexport { RGBADataTexture };\r\n","import { FloatType, RGBAFormat } from 'three';\r\nimport { CustomDataTexture } from './CustomDataTexture';\r\n\r\nclass RGBFloatDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Float32Array(width * height * 3);\r\n super(data, width, height, RGBAFormat, FloatType);\r\n }\r\n}\r\n\r\nexport { RGBFloatDataTexture };\r\n","import { CustomDataTexture } from './CustomDataTexture';\r\nimport { FloatType } from 'three';\r\nimport { RGBAFormat } from 'three';\r\n\r\nclass RGBAFloatDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Float32Array(width * height * 4);\r\n super(data, width, height, RGBAFormat, FloatType);\r\n }\r\n}\r\n\r\nexport { RGBAFloatDataTexture };\r\n","import { Mesh } from 'three';\r\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\r\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\r\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\r\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\r\n\r\nclass BatchedMesh extends Mesh\r\n{\r\n constructor(id_table, geometry, material, max_texture_width)\r\n {\r\n super(geometry, material);\r\n\r\n this.id_table = id_table;\r\n this.batched_count = Object.keys(id_table).length;\r\n this.max_texture_width = max_texture_width;\r\n this.batch_width = this.batched_count % max_texture_width;\r\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\r\n }\r\n\r\n attach_rgb_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgba_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgb_float_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgba_float_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n get_mesh_index(name)\r\n {\r\n return this.id_table[name];\r\n }\r\n\r\n set_rgb_value(uniform_name, mesh_name, r, g, b)\r\n {\r\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\r\n }\r\n\r\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\r\n {\r\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\r\n }\r\n}\r\n\r\nexport { BatchedMesh };\r\n","import { BatchedMesh } from './BatchedMesh';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { BufferAttribute } from 'three';\r\n\r\nclass MeshBatcher\r\n{\r\n batch(meshes, material)\r\n {\r\n const max_texture_width = 2048;\r\n // let texture_width = meshes.length % max_texture_width;\r\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\r\n\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n const geometries = [];\r\n const id_table = {};\r\n\r\n const attr_mesh_id = [];\r\n\r\n for (let i = 0; i < meshes.length; i++)\r\n {\r\n const mesh = meshes[i];\r\n const vertex_count = mesh.geometry.getAttribute('position').count;\r\n\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_mesh_id.push(i);\r\n }\r\n\r\n geometries.push(mesh.geometry);\r\n\r\n if (id_table[mesh.name] === undefined)\r\n {\r\n id_table[mesh.name] = i;\r\n }\r\n else\r\n {\r\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\r\n }\r\n }\r\n\r\n const buffer_geometry = BufferGeometryUtils.mergeGeometries(geometries);\r\n\r\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\r\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\r\n\r\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\r\n }\r\n\r\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\r\n {\r\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\r\n }\r\n}\r\n\r\nexport { MeshBatcher };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\r\n\r\nclass FontLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFontLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (font) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, font);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FontLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nclass JSONLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n fetch(this.url).then((response) =>\r\n {\r\n response.json().then((json) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, json);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { JSONLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\r\n\r\nclass OBJLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TOBJLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (obj) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, obj);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { OBJLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Vector3 } from 'three';\r\nimport { FileLoader } from 'three';\r\n\r\nclass PointArrayLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new FileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (text) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n parse_path(raw_data)\r\n {\r\n const string_array = raw_data.split('\\n');\r\n\r\n if (string_array[string_array.length - 1] === '')\r\n {\r\n string_array.pop();\r\n }\r\n\r\n const positions = [];\r\n\r\n for (let i = 0; i < string_array.length; i += 3)\r\n {\r\n const x = parseFloat(string_array[i + 0]);\r\n const y = parseFloat(string_array[i + 1]);\r\n const z = parseFloat(string_array[i + 2]);\r\n positions.push(new Vector3(x, y, z));\r\n }\r\n return positions;\r\n // let curve = new THREE.CatmullRomCurve3(positions);\r\n // return curve.getPoints(100);\r\n }\r\n}\r\n\r\nexport { PointArrayLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nclass VideoLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { VideoLoader };\r\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["AxisHelper","Object3D","[object Object]","scale","super","blue_points","push","Vector3","blue_axis_mat","LineBasicMaterial","color","depthFunc","AlwaysDepth","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","this","add","set","scene_manager","_current","Scene","name","current","scene","traverse","child","geometry","dispose","mat","material","children","length","remove","Cube","Mesh","size","segments","BoxGeometry","x","y","z","MeshBasicMaterial","Sphere","radius","SphereGeometry","center","position","Arrow","dir","cylinder_height","cylinder_geo","CylinderGeometry","translate","cone_geometry","ConeGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeGeometries","rotateX","quaternion","setFromUnitVectors","_dir","value","oscreen","width","height","Vector2","render_width","render_height","width_height","dpr","pixel_size","size_changed","vector2","multiplyScalar","aspect_ratio","portrait","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","Color","clear_alpha","camera","copy","camera_manager","undefined","_spectator","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","OrthographicCamera","TOrthographicCamera","left","right","top","bottom","BaseRender","context","renderer","BlitMaterial","ShaderMaterial","frag_shader","vert_shader","defines","uniforms","_MainTex","_Resolution","_TargetResolution","vertexShader","fragmentShader","depthWrite","blending","NoBlending","depthTest","Blitter","_blit_scene","_blit_material","_blit_quad","PlaneGeometry","_blit_camera","src","dst","src_texture","isWebGLRenderTarget","texture","src_width","image","src_height","getSize","__render","dst_RT","RT","current_rt","getRenderTarget","setRenderTarget","render","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","Vector4","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","OScreen","clear_depth_normal_mat","depth_normal_material","graphics","__resize_RT_if_necessary","clear","blit_clear_with_material","CameraManager","setSize","render_target","canvas","core_attributes","context_attributes","threejs_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","force_webgl2","xr_enabled","alpha","antialias","depth","desynchronized","failIfMajorPerformanceCaveat","powerPreference","premultipliedAlpha","preserveDrawingBuffer","stencil","logarithmicDepthBuffer","Object","assign","getContext","constructor","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","extensions","get","domElement","Capabilities","getMaxAnisotropy","maxVertexTextures","is_floating_point_texture_available","dom_element","depth_normals_RT","new_state","on_exit","on_enter","__update_current_camera","update","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","SceneManager","compile","target_scene","promise","compileAsync","on_pre_render","on_post_render","overrideMaterial","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","update_position","contentRect","update_size","setViewport","material_pass","src_RT","blit_with_material","blit","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","Math","ceil","divisions_y","old_dpr","getPixelRatio","ctx_2D","document","createElement","setViewOffset","drawImage","toBlob","clearViewOffset","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","minFilter","NearestFilter","magFilter","format","RGBAFormat","colorSpace","LinearSRGBColorSpace","type","FloatType","stencilBuffer","depthBuffer","output","Float32Array","abs","BaseShaderMaterial","vert","frag","basic_vert","basic_frag","_Color","ScreenSpaceTextureMaterial","w","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","tex","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","ctx","origin","arrow","clone","normalize","axis","rt_debug","position_2d","fillStyle","fillRect","clearRect","from","to","strokeStyle","beginPath","moveTo","lineTo","closePath","stroke","points","line","frustumCulled","pos","cube","distanceTo","sub","forward_dir","basic_color_vert","basic_color_frag","transparent","plane","box","Box3","setFromCenterAndSize","helper","Box3Helper","sphere","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_line","sphere_mesh","sphere1","bb","curve","options","offset","i","mesh","set_texture","set_screen_size","time","__delta_buffer","__previous_elapsed_time","__delta_time","__smooth_delta_time","__elapsed_time","__frame_interpolation_t","fixed_delta_time","elapsed_time","delta_time","smooth_delta_time","frame_interpolation","fdt","dt","sdt","shift","__calculate_smooth_delta_time","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","round","toString","g","b","projected_point","points_on_plane","projectPoint","target","t","elements","lerp","x1","x2","n","m","euclideanModulo","degrees","PI","radians","v","arr","col","floor","random","clamp","ActionEvent","method","args","ViewApi","application","split","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","easing_function","attribute_name","ActionSequencer","previous_elapsed_time","playback_speed","__get_playback_speed","playing","action_events","initial_context","JSON","parse","stringify","tmp_t","channels","channel_names","keys","duration","get_duration","__play_clips","trigger_time","action","interpolator","use_dynamic_from_value","keyframes","console","error","keyframe","__get_current_keyframe","evaluate","__linear_map_01","__play_events","evaluate_keyframe","between","log","trigger","channel_name","initial","saturate","Infinity","distance","transitions_velocity","URLSearchParams","window","location","search","Number","NumberInterpolator","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","data","getAttribute","get_node_x_position","parseFloat","includes","split_data","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","add_action_interpolator","action_event","add_action_event","state","longest_time","xml","transition_data","track_time","TransitionTable","transitions","from_state_name","to_state_name","from_animation_sheet","ViewState","global_view_data","transition_progress","action_sequencer","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","skip","__exit_last_state","before_exit","before_enter","play","__update_transitions","is_finished","before_update","fixed_update","Time","update_exit_transition","get_progress","update_enter_transition","transition_manager","transition_handler","go_to_state","add_transitions","set_transitions","set_state","set_default_state_data","set_transitions_velocity","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","TransitionManager","delete","component_name","warn","set_opacity","view_manager","views","browser_title_suffix","__set_views_opacities","view_name","change_url","__change_browser_url","url","__change_browser_title","scene_name","next_view","transition_view","set_next_view","go_to_view","view","title_suffix","get_current_state","history","pushState","title","__capitalize","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","RenderLoop","target_application","input","BaseApplication","is_running","frames_passed","time_accumulator","__update","on_post_start","__set_frame_interpolation","ViewManager","ViewComponentManager","Debug","on_frame_end","setAnimationLoop","bind","stop","loop","AddMaterial","use_half_float","USE_LINEAR_COLOR_SPACE","_SecondTex","UnrealBloomComposeMaterial","nMips","use_linear_color_space","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","AbstractLoader","resource_id","loaded_bytes","total_bytes","has_finished","has_error","error_message","loaded","total","is_number","message","resource_container","resources_by_url","cache","fetch","mode","credentials","redirect","then","on_progress","catch","__on_error","set_resource","__update_downloaded_bytes","__loading_ended","response","response_clone","reader","body","getReader","contentLength","headers","receivedLength","done","read","ok","on_preloaded_finished","__set_error","status","statusText","is_int","is_float","AudioClip","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","resources","resource","AsyncAbstractLoader","assets","worker","ResourceContainer","bound_on_message","on_message","__setup_worker","assets_loaders","__setup_loaders","postMessage","loader_name","asset_loader","original_url","print_error","__get_loaded_bytes","__get_total_bytes","names","asset","Worker","import","meta","addEventListener","e","__on_assets_loaded","removeEventListener","AsyncAudiosLoader","loaders","asset_data","GLTFDRACOLoader","loader","GLTFLoader","setDRACOLoader","load","gltf","xhr","msg","TGLTFLoader","AsyncObjectsLoader","draco","draco_loader","browser","browser_name","agent","navigator","userAgent","toLowerCase","has_web_xr_support","is_vr","isSessionSupported","indexOf","opr","chrome","version","get_version","is_safari","is_chrome","is_firefox","is_edge","is_edge_chromium","has_webm","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","appName","appVersion","splice","AsyncTextureLoader","flipY","premultiplyAlpha","colorSpaceConversion","Browser","load_with_old_method","load_with_new_method","Texture","Image","onload","SRGBColorSpace","NoColorSpace","needsUpdate","onerror","fetchOptions","res","createImageBitmap","imageOrientation","imageBitmap","BasisLoader","basis","CubemapLoader","extension","CubeTextureLoader","setPath","urls","HDRCubeTextureLoader","THDRCubeTextureLoader","hdr","RGBETextureLoader","RGBELoader","AsyncTexturesLoader","kind","CompilatorManager","compilators","first_update","index","finished","start","LoadingState","SceneCompilator","TexturesCompilator","AudiosCompilator","callback_called","scene_objects","scene_textures","scene_sounds","custom_loaders","custom_compilators","custom_data","loading_progress","progress","setup_loader","assets_worker","object_loader","textures_loader","get_assets_names","audios_loader","compilator_manager","is_loaded","HighQualityLoadingState","on_high_quality_assets_ready","RegularLoadingState","on_assets_ready_called","on_assets_ready","is_compiled","on_assets_compiled","AbstractScene","initialized","is_high_loaded","loading_states","regular","high","current_loading_state","init","set_loading_state","objects","attributes","array","normal","uv","map","mipmaps","Uint8Array","set_assets","update_loading_state","ApplicationView","container","current_opacity","register_view","classList","opacity","style","CanvasDrawer","uses_dynamic_font","__textHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","text","font","measureText","getFontHeight","ctxOptions","font_color","__draw","draw_canvas","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","generateMipmaps","fill","tl","tr","br","bl","defaultRadius","side","_side","quadraticCurveTo","SimpleTextDrawer","text_margin","text_size","get_text_size","globalAlpha","textBaseline","textAlign","fillText","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","target_geometry","target_position","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","__create_rgba_float_texture","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","vector4","use_a","__set_pixel_rgba","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","texture_data","copyTextureToTexture","v3","v4","DataTexture","dst_texture","one_pixel_text","geometry_batcher","batches","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","upload_texture_data","uvs","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","tmp_vec","WorldSpacePosition","tmp_vec3","tmp_vec2","project","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","pivot_point","use_depth","boolean","depth_offset","visible","get_size","normalized_mouse_pos","get_pos_NDC","to_screen_position","rect","Box2","containsPoint","projected_pos","screen_pos","ui","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","elem","set_screen_space_coordinate_system","set_world_space_coordinate_system","NDC","update_state","Graphics","current_clicked_element","PerspectiveFrustumPointFitter","camera_quaternion","vertical_fov","v_fov","degToRad","h_fov","atan","tan","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","applyQuaternion","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","Plane","setFromNormalAndCoplanarPoint","down_plane","left_plane","right_plane","apply_center_correction_to_pos","closest_distance","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_horizontal_correction","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","distV","distH","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","getCenter","distance_to_center","camera_utilities","tmp_mat","Matrix4","ray","Ray","tmp_size","tmp_unproj","plane_position","plane_normal","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","up","cross","inverse_mat","getInverse","applyMatrix4","projected_center","zoom","get_zoom_to_fit_rect","isOrthographicCamera","obj_x","obj_y","object_aspect","object","getWorldPosition","p1","p2","p3","p4","p5","p6","p7","p8","fit_points","camera_backward_dir","fitter","camera_pos","reference_position_plane","camera_ray","reference_position","camera_position","result","reference_rotation","reference_zoom","forward","initializer","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","render_loop","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","on_key_down","on_key_up","keyCode","ctrlKey","code","press_key","release_key","pressed","released","key_name","key","fired","down","NormalMaterial","DebugNormalsRender","DisplayNormalTextureMaterial","depth_normals_vert","_InverseProjMatrix","SSAOComposeMaterial","_AO","SSAOMaterial","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","NormalAORender","use_ssaa","ssao_mat","ssao_compose_mat","debug_normals","ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","value_01","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","HalfFloatType","UnsignedByteType","renderTargetBright","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","set_direction","dispose_RT","hor","ver","texture_height","set_size","dispose_materials","set_radius","set_threshold","UnrealBloomRender","use_antialiasing","use_hight_luminosity_pass","use_rendering_size","add_mat","rt_settings","samples","bloom_compose_mat","luminosity_threshold","set_RT_0","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_add_texture","val","set_bloom_strength","set_luminosity_threshold","set_tint_color_0","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","screen","apply_pixel_density_v2","apply_pixel_density","get_pixel_size","ViewComponent","hidden","register_component","enable_component","disable_component","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","items_left_count","closest_point","obj","ids","FrustumPointFitter","get_hozirontal_correction","closest_up_point","closest_down_point","closest_right_point","closest_left_point","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","HTMLUtilities","images","dataset","image_objects","image_object","videos","video","iframes","iframe","selector","ImageUtilities","getImageData","imagedata","mesh_sampler","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","geometries","get_mesh","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","cast","receive","castShadow","receiveShadow","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","hexValues","hex","words","substr","charAt","TimeUtilities","time_str","hours","minutes","seconds","Validation","str","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","parent","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","img","screen_aligned","Text2D","is_static","simple_text_drawer","draw_settings","draw_on_texture","LinearMipMapLinearFilter","update_texture","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","compose","tilt","new_orientation","new_tilt","multiply","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","generateMipMaps","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","set_atlas_size","atlas","set_boldness","text_str","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","update_matrix","clear_glyph_dirty","clear_color_dirty","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","tex_size","ParticleAttribute","attr_name","update_material","write","particle_attribute","particle_count","resolution","calculate_resolution","colorScape","attribute_writter_scene","swap_RT","storage_material","deleteAttribute","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","item_size","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","pos_attr","build_RT","store_geometry_attribute_in_RT","CustomDataTexture","multiplier","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","mesh_name","set_rgb","get_mesh_index","set_rgba","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","JSONLoader","json","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","TextLoader","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","has_errors","get_loaded_bytes","get_total_bytes"],"mappings":"+rDAQA,MAAMA,WAAmBC,EAEvBC,YAAYC,EAAQ,GAElBC,QAEA,MAAMC,EAAc,GACpBA,EAAYC,KAAK,IAAIC,EAAQ,EAAG,EAAG,IACnCF,EAAYC,KAAK,IAAIC,EAAQ,EAAG,EAAG,MAEnC,MAAMC,EAAgB,IAAIC,EAAkB,CAAEC,MAAO,QAAUC,UAAWC,IACpEC,GAAgB,IAAIC,GAAiBC,cAAcV,GACnDW,EAAiB,IAAIC,EAAKJ,EAAeL,GAC/CQ,EAAeE,YAAc,IAE7B,MAAMC,EAAe,GACrBA,EAAab,KAAK,IAAIC,EAAQ,EAAG,EAAG,IACpCY,EAAab,KAAK,IAAIC,EAAQ,EAAG,IAAM,IAEvC,MAAMa,EAAiB,IAAIX,EAAkB,CAAEC,MAAO,QAAUC,UAAWC,IACrES,GAAiB,IAAIP,GAAiBC,cAAcI,GACpDG,EAAkB,IAAIL,EAAKI,EAAgBD,GACjDE,EAAgBJ,YAAc,IAE9B,MAAMK,EAAa,GACnBA,EAAWjB,KAAK,IAAIC,EAAQ,EAAG,EAAG,IAClCgB,EAAWjB,KAAK,IAAIC,EAAQ,IAAM,EAAG,IAErC,MAAMiB,EAAe,IAAIf,EAAkB,CAAEC,MAAO,SAAUC,UAAWC,IACnEa,GAAe,IAAIX,GAAiBC,cAAcQ,GAClDG,EAAgB,IAAIT,EAAKQ,EAAcD,GAC7CE,EAAcR,YAAc,IAE5BS,KAAKT,YAAc,IAEnBS,KAAKC,IAAIZ,GACTW,KAAKC,IAAIN,GACTK,KAAKC,IAAIF,GAETC,KAAKxB,MAAM0B,IAAI1B,EAAOA,EAAOA,GAG/BD,UAIAA,YCDG,MAAC4B,GAAgB,IAlDtB,MAEE5B,OAEEyB,KAAKI,SAAW,IAAIC,EACpBL,KAAKI,SAASE,KAAO,gBAMvB/B,UAAU+B,IAMVC,cAEE,OAAOP,KAAKI,SAGdG,YAAYC,GAEVR,KAAKI,SAAWI,EAGlBjC,UAgBE,IAdAyB,KAAKO,QAAQE,UAA8BC,IAEzC,GAAIA,EAAMC,SACV,CACED,EAAMC,SAASC,UACf,MAAMC,EAAMH,EAAMI,SACd,aAAcD,GAAiC,mBAAlBA,EAAY,UAG3CA,EAAID,cAKHZ,KAAKO,QAAQQ,SAASC,OAAS,GAEpChB,KAAKO,QAAQU,OAAOjB,KAAKO,QAAQQ,SAAS,MC3ChD,MAAMG,WAAaC,EAOjB5C,YAAY6C,EAAMC,EAAUtC,GAE1BqC,EAAWA,GAAQ,IAAIxC,EAAQ,EAAG,EAAG,GACrCyC,EAAWA,GAAY,IAAIzC,EAAQ,EAAG,EAAG,GACzCG,EAAWA,GAAS,SAGpBN,MAFiB,IAAI6C,EAAYF,EAAKG,EAAGH,EAAKI,EAAGJ,EAAKK,EAAGJ,EAASE,EAAGF,EAASG,EAAGH,EAASI,GACzE,IAAIC,EAAkB,CAAE3C,MAAOA,MChBpD,MAAM4C,WAAeR,EAMnB5C,YAAYqD,EAAQ7C,GAElBA,EAAQA,GAAS,UAIjBN,MAFiB,IAAIoD,EADrBD,EAASA,GAAU,EACyB,GAAI,IAC/B,IAAIF,EAAkB,CAAE3C,MAAOA,KAEhDiB,KAAK4B,OAASA,EACd5B,KAAKjB,MAAQA,EACbiB,KAAK8B,OAAS9B,KAAK+B,UCZvB,MAAMC,WAAcb,EAOlB5C,YAAYQ,EAAOiC,EAAQiB,GAEzBlD,EAAQA,GAAS,UAGjB,MACMmD,GAHNlB,EAASA,GAAU,GAEC,GAEdmB,EAAe,IAAIC,EAAiB,IAAM,IAAMF,EAAiB,IACvEC,EAAaE,UAAU,EAAGH,EAAkB,EAAG,GAE/C,MAAMI,EAAgB,IAAIC,EAAa,GALnB,GAKqC,IACzDD,EAAcD,UAAU,EAAGH,EAAkBM,GAAiB,GAE9D,MAAMC,EAAkBC,GAAoBC,gBAAgB,CAACR,EAAcG,IAC3EG,EAAgBG,QAAQ,MAGxBnE,MAAMgE,EADW,IAAIf,EAAkB,CAAE3C,MAAOA,KAG5CkD,GAEFjC,KAAK6C,WAAWC,mBAAmB,IAAIlE,EAAQ,EAAG,EAAG,GAAIqD,GAG3DjC,KAAK+C,KAAOd,EAGdA,QAAQA,GAENjC,KAAK6C,WAAWC,mBAAmB,IAAIlE,EAAQ,EAAG,EAAG,GAAIqD,GACzDjC,KAAK+C,KAAOd,EAGdA,UAEE,OAAOjC,KAAK+C,KAGd/B,WAAWgC,GAEThD,KAAKxB,MAAMiD,EAAIuB,EAGjBhC,aAEE,OAAOhB,KAAKxB,MAAMiD,GC+BjB,MAACwB,GAAU,IArFhB,MAEE1E,OAEEyB,KAAKkD,MAAQ,EACblD,KAAKmD,OAAS,EAEdnD,KAAK+B,SAAW,IAAIqB,EAEpBpD,KAAKqD,aAAe,EACpBrD,KAAKsD,cAAgB,EACrBtD,KAAKuD,aAAe,IAAIH,EAAQpD,KAAKkD,MAAOlD,KAAKmD,QAEjDnD,KAAKwD,IAAM,EACXxD,KAAKyD,WAAa,IAAIL,EAAQ,EAAIpD,KAAKkD,MAAO,EAAIlD,KAAKmD,QAOzD5E,gBAAgBgD,EAAGC,GAEjBxB,KAAK+B,SAAS7B,IAAIqB,EAAGC,GAGvBjD,SAEEyB,KAAK0D,cAAe,EAOtBnF,YAAY2E,EAAOC,GAEjBnD,KAAKkD,MAAQA,EACblD,KAAKmD,OAASA,EAEdnD,KAAKyD,WAAa,IAAIL,EAAQ,EAAIpD,KAAKkD,MAAO,EAAIlD,KAAKmD,QAEvDnD,KAAKuD,aAAahC,EAAI2B,EACtBlD,KAAKuD,aAAa/B,EAAI2B,EAEtBnD,KAAKqD,aAAeH,EAAQlD,KAAKwD,IACjCxD,KAAKsD,cAAgBH,EAASnD,KAAKwD,IAEnCxD,KAAK0D,cAAe,EAMtBnF,uBAAuBoF,GAIrB,OAFAA,EAAQC,eAAe,EAAI5D,KAAKwD,KAEzBG,EAMTpF,oBAAoByE,GAElB,OAAOA,GAAS,EAAIhD,KAAKwD,KAG3BjF,iBAEE,OAAOyB,KAAKyD,WAGdI,mBAEE,OAAO7D,KAAKkD,MAAQlD,KAAKmD,OAG3BW,eAEE,OAAO9D,KAAKkD,MAAQlD,KAAKmD,SChF7B,MAAMY,WAA0BC,EAQ9BzF,YAAY0F,EAAKC,EAAQC,EAAMC,GAE7B3F,MAAMwF,EAAKC,EAAQC,EAAMC,GAEzBpE,KAAKqE,YAAc,IAAIC,EAAM,WAC7BtE,KAAKuE,YAAc,EAOrBhG,KAAKiG,GAKH,OAHA/F,MAAMgG,KAAKD,GACXxE,KAAKqE,YAAYI,KAAKD,EAAOH,aAC7BrE,KAAKuE,YAAcC,EAAOD,YACnBvE,MCMN,MAAC0E,GAAiB,IAhCvB,MAEEnG,OAEEyB,KAAKI,cAAWuE,EAEhB3E,KAAK4E,gBAAaD,EAGpBpE,YAAYiE,GAEVxE,KAAKI,SAAWoE,EAIlBjE,cAEE,OAAOP,KAAKI,SAGdyE,cAAcL,GAEZxE,KAAK4E,WAAaJ,EAIpBK,gBAEE,OAAO7E,KAAK4E,aCpBX,MAACE,GAAe,IAVrB,MAEEvG,OAEEyB,KAAK+E,eAAiB,EACtB/E,KAAKgF,kCAAmC,EACxChF,KAAKiF,uBAAwB,ICHjC,MAAMC,WAA2BC,EAU/B5G,YAAY6G,EAAMC,EAAOC,EAAKC,EAAQpB,EAAMC,GAE1C3F,MAAM2G,EAAMC,EAAOC,EAAKC,EAAQpB,EAAMC,GAEtCpE,KAAKqE,YAAc,IAAIC,EAAM,WAC7BtE,KAAKuE,YAAc,EAOrBhG,KAAKiG,GAKH,OAHA/F,MAAMgG,KAAKD,GACXxE,KAAKqE,YAAYI,KAAKD,EAAOH,aAC7BrE,KAAKuE,YAAcC,EAAOD,YACnBvE,MC/BX,MAAMwF,GAEJjH,eAKAA,UAKAA,SAASkH,EAASC,IAKlBnH,QAAQkH,EAASC,IAKjBnH,UAKAA,YCnBF,MAAMoH,WAAqBC,EAEzBrH,YAAYsH,EAAaC,EAAaC,GAEpCtH,MAAM,CACJuH,SAAU,CACRC,SAAU,CAAEjD,MAAO,MACnBkD,YAAa,CAAElD,MAAO,IAAII,EAAQ,EAAG,IACrC+C,kBAAmB,CAAEnD,MAAO,IAAII,EAAQ,EAAG,KAE7C2C,QAASA,GAAW,GACpBK,aAAcN,mGACdO,eAAgBR,uHAChBS,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXzH,UAAWC,KCjBjB,MAAMyH,GAEJnI,YAAYmH,GAEV1F,KAAK0F,SAAWA,EAChB1F,KAAK2G,YAAc,IAAItG,EACvBL,KAAK4G,eAAiB,IAAIjB,GAC1B3F,KAAK6G,WAAa,IAAI1F,EACpB,IAAI2F,EAAc,EAAG,GAAI9G,KAAK4G,gBAChC5G,KAAK2G,YAAY1G,IAAID,KAAK6G,YAC1B7G,KAAK+G,aAAe,IAAI7B,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAO,KAGnE3G,KAAKyI,EAAKC,GAERjH,KAAK6G,WAAW/F,SAAWd,KAAK4G,eAEhC,MAAMM,GAA0C,IAA5BF,EAAIG,oBAA+BH,EAAII,QAAUJ,EAC/DK,GAA0C,IAA5BL,EAAIG,oBAA+BH,EAAI9D,MAAU8D,EAAIM,MAAMpE,MACzEqE,GAA0C,IAA5BP,EAAIG,oBAA+BH,EAAI7D,OAAU6D,EAAIM,MAAMnE,OAE/EnD,KAAK6G,WAAW/F,SAASkF,SAASC,SAASjD,MAAQkE,EACnDlH,KAAK6G,WAAW/F,SAASkF,SAASE,YAAYlD,MAAM9C,IAAImH,EAAWE,GAE/DN,EAEFjH,KAAK6G,WAAW/F,SAASkF,SAASG,kBAAkBnD,MAAM9C,IAAI+G,EAAI/D,MAAO+D,EAAI9D,QAI7EnD,KAAK0F,SAAS8B,QAAQxH,KAAK6G,WAAW/F,SAASkF,SAASG,kBAAkBnD,OAG5EhD,KAAKyH,SAASR,GAGhB1I,cAAcsC,EAAKoG,GAEjBjH,KAAK6G,WAAW/F,SAAWD,EAI3Bb,KAAKyH,SAASR,GAGhB1I,mBAAmByI,EAAKC,EAAKpG,GAE3B,MAAMqG,GAA0C,IAA5BF,EAAIG,oBAA+BH,EAAII,QAAUJ,EAC/DK,GAA0C,IAA5BL,EAAIG,oBAA+BH,EAAI9D,MAAU8D,EAAIM,MAAMpE,MACzEqE,GAA0C,IAA5BP,EAAIG,oBAA+BH,EAAI7D,OAAU6D,EAAIM,MAAMnE,OAE/EnD,KAAK6G,WAAW/F,SAAWD,EAC3Bb,KAAK6G,WAAW/F,SAASkF,SAASC,SAASjD,MAAQkE,EACnDlH,KAAK6G,WAAW/F,SAASkF,SAASE,YAAYlD,MAAM9C,IAAImH,EAAWE,GAE/DN,EAEFjH,KAAK6G,WAAW/F,SAASkF,SAASG,kBAAkBnD,MAAM9C,IAAI+G,EAAI/D,MAAO+D,EAAI9D,QAI7EnD,KAAK0F,SAAS8B,QAAQxH,KAAK6G,WAAW/F,SAASkF,SAASG,kBAAkBnD,OAG5EhD,KAAKyH,SAASR,GAGhB1I,yBAAyBmJ,EAAQ7G,GAE/Bb,KAAK6G,WAAW/F,SAAWD,EAE3Bb,KAAKyH,SAASC,GAGhBnJ,UAEEyB,KAAK6G,WAAWlG,SAASC,UACzBZ,KAAK6G,WAAW/F,SAASF,UAG3BrC,SAASmJ,GAEP,MAAMC,OAAgBhD,IAAX+C,EAAuB,KAAOA,EAEnCE,EAAa5H,KAAK0F,SAASmC,kBAEjC7H,KAAK0F,SAASoC,gBAAgBH,GAC9B3H,KAAK0F,SAASqC,OAAO/H,KAAK2G,YAAa3G,KAAK+G,cAE5C/G,KAAK0F,SAASoC,gBAAgBF,IC1FlC,MAAMI,WAAiCrC,GAErCpH,YAAY0J,EAAaC,GAEvBzJ,2aACAuB,KAAKgG,SAASmC,aAAe,CAAEnF,MAAO,IAAIoF,EAAQH,EAAaC,EAAa3G,EAAG2G,EAAa1G,EAAG0G,EAAazG,KCNhH,MAAM4G,WAA4BzC,EAEhCrH,cAEEE,MAAM,CACJuH,SAAU,CACRsC,UAAW,CAAEtF,MAAO,IAEtBoD,6QACAC,+dAIJkC,cAAcvF,GAEZhD,KAAKgG,SAASsC,UAAUtF,MAAQA,EAGlCuF,gBAEE,OAAOvI,KAAKgG,SAASsC,UAAUtF,OChBnC,MAAMwF,GAEJjK,cAEEyB,KAAK2H,GAAK,IAAIc,EAAkBC,GAAQxF,MAAOwF,GAAQvF,QAEvDnD,KAAK2I,uBAAyB,IAAIX,GAAyB,EAAG,IAAIpJ,EAAQ,EAAG,EAAG,IAChFoB,KAAK4I,sBAAwB,IAAIP,GAGnC9J,OAAOsK,GAEL7I,KAAK8I,2BAELD,EAASE,MAAM/I,KAAK2H,QAAIhD,GAAW,GAAM,GAEzCkE,EAASG,yBAAyBhJ,KAAK2H,GAAI3H,KAAK2I,wBAEhD3I,KAAK4I,sBAAsBL,UAAYU,GAAc1I,QAAQ6D,IAE7DyE,EAASd,YAAOpD,OAAWA,EAAW3E,KAAK2H,GAAI3H,KAAK4I,uBAGtDrK,2BAEMyB,KAAK2H,GAAGzE,QAAUwF,GAAQxF,OAASlD,KAAK2H,GAAGxE,SAAWuF,GAAQvF,QAEhEnD,KAAK2H,GAAGuB,QAAQR,GAAQxF,MAAOwF,GAAQvF,QAI3CgG,oBAEE,OAAOnJ,KAAK2H,IC+cX,MAACkB,GAAW,IA9djB,MAUEtK,MAAK6K,OAAEA,EAAMC,gBAAEA,EAAeC,mBAAEA,EAAkBC,mBAAEA,EAAkB/F,IAAEA,IAEtExD,KAAKwJ,eAAY7E,EACjB3E,KAAKyJ,aAAU9E,EACf3E,KAAKoJ,YAASzE,EACd3E,KAAK0J,eAAY/E,EACjB3E,KAAK2J,yBAAsBhF,EAC3B3E,KAAK4J,4BAA6B,EAClC5J,KAAK6J,gCAA6BlF,EAElC3E,KAAK8J,WAAY,EACjB9J,KAAK+J,oBAAiBpF,EACtB3E,KAAKsJ,wBAAqB3E,EAE1B3E,KAAKqJ,gBAAkB,CACrBW,cAAc,EACdC,YAAY,GAGdjK,KAAKsJ,mBAAqB,CACxBY,OAAO,EACPC,WAAW,EACXC,OAAO,EACPC,gBAAgB,EAChBC,8BAA8B,EAC9BC,gBAAiB,mBACjBC,oBAAoB,EACpBC,uBAAuB,EACvBC,SAAS,GAIX1K,KAAKuJ,mBAAqB,CACxBoB,wBAAwB,GAG1BC,OAAOC,OAAO7K,KAAKqJ,gBAAiBA,GACpCuB,OAAOC,OAAO7K,KAAKsJ,mBAAoBA,GAEvCsB,OAAOC,OAAO7K,KAAKuJ,mBAAoBvJ,KAAKsJ,oBAC5CsB,OAAOC,OAAO7K,KAAKuJ,mBAAoBA,GAEnCvJ,KAAKqJ,gBAAgBW,aAEvBhK,KAAK+J,eAAiBX,EAAO0B,WAAW,SAAU9K,KAAKsJ,qBACjCF,EAAO0B,WAAW,QAAS9K,KAAKsJ,qBAChCF,EAAO0B,WAAW,qBAAsB9K,KAAKsJ,oBAInEtJ,KAAK+J,eAAiBX,EAAO0B,WAAW,QAAS9K,KAAKsJ,qBAChCF,EAAO0B,WAAW,qBAAsB9K,KAAKsJ,oBAGrEtJ,KAAK8J,UAAqD,2BAAzC9J,KAAK+J,eAAegB,YAAYzK,KAIjDN,KAAKuJ,mBAAmBH,OAASA,EACjCpJ,KAAKuJ,mBAAmB9D,QAAUzF,KAAK+J,eAEvC/J,KAAKwJ,UAAY,IAAIwB,EAAchL,KAAKuJ,oBAEpCvJ,KAAKqJ,gBAAgBY,WAEvBjK,KAAKwJ,UAAUyB,GAAGC,SAAU,EAI5BlL,KAAKwJ,UAAU2B,WAAY,EAG7BzC,GAAQlF,IAAMA,EACdxD,KAAKwJ,UAAU4B,cAAc,GAExBpL,KAAK8J,WAER9J,KAAKwJ,UAAU6B,WAAWC,IAAI,0BAGhCtL,KAAKyJ,QAAU,IAAI/C,GAAQ1G,KAAKwJ,WAEhCxJ,KAAKoJ,OAASpJ,KAAKwJ,UAAU+B,WAE7BvL,KAAK0J,UAAY,IAAIlE,GAErBxF,KAAK2J,oBAAsB3J,KAAK0J,UAEhC8B,GAAazG,eAAiB/E,KAAKwJ,UAAU1E,aAAa2G,mBAC1DD,GAAaxG,iCAAmChF,KAAKwJ,UAAU1E,aAAa4G,kBAAoB,EAChGF,GAAavG,sBAAwBjF,KAAK2L,sCAE1C3L,KAAK4J,4BAA6B,EAElC5J,KAAK6J,2BAA6B,IAAIrB,GAGxCoD,kBAEE,OAAO5L,KAAKwJ,UAAU+B,WAGxBM,uBAEE,OAAO7L,KAAK6J,2BAA2BV,cAMzC5K,UAAUuN,GAIR9L,KAAK2J,oBAAoBoC,QAAQ/L,KAAMA,KAAKwJ,WAC5CxJ,KAAK2J,oBAAsBmC,EAC3B9L,KAAK2J,oBAAoBqC,SAAShM,KAAMA,KAAKwJ,WAG/CjL,SAEMyB,KAAK4J,4BAEP5J,KAAK6J,2BAA2B9B,OAAO/H,MAGzCA,KAAKiM,0BAEDhD,GAAc1I,SAEhBP,KAAK2J,oBAAoB5B,SAG3BW,GAAQwD,SAGV3N,0BAEM0K,GAAc1I,UAEhB0I,GAAc1I,QAAQ2D,OAASwE,GAAQ7E,aACvCoF,GAAc1I,QAAQ4L,yBACtBlD,GAAc1I,QAAQ6L,eACtBnD,GAAc1I,QAAQ8L,mBAAkB,IAU5C9N,OAAOiC,EAAOgE,EAAQmD,EAAI2E,GAExBtM,KAAKuM,0BAA0B/L,EAAO8L,GAEtCtM,KAAKwJ,UAAU1B,qBAAuBnD,IAAPgD,EAAmB,KAAOA,GACzD3H,KAAKwJ,UAAUzB,OAAOvH,GAAUgM,GAAajM,QAC3CiE,GAAUyE,GAAc1I,SAE1BP,KAAKuM,0BAA0B/L,OAAOmE,GASxCpG,QAAQiC,EAAOgE,EAAQmD,EAAI2E,GAEzBtM,KAAKuM,0BAA0B/L,EAAO8L,GAEtCtM,KAAKwJ,UAAU1B,qBAAuBnD,IAAPgD,EAAmB,KAAOA,GACzD3H,KAAKwJ,UAAUiD,QAAQjM,GAAUgM,GAAajM,QAC5CiE,GAAUyE,GAAc1I,SAE1BP,KAAKuM,0BAA0B/L,OAAOmE,GAWxCpG,oBAAoBiC,EAAOgE,EAAQmD,EAAI2E,EAAcI,GAEnD1M,KAAKuM,0BAA0B/L,EAAO8L,GAEtCtM,KAAKwJ,UAAU1B,qBAAuBnD,IAAPgD,EAAmB,KAAOA,GACzD,MAAMgF,EAAU3M,KAAKwJ,UAAUoD,aAAapM,GAAUgM,GAAajM,QACjEiE,GAAUyE,GAAc1I,QAASmM,GAInC,OAFA1M,KAAKuM,0BAA0B/L,OAAOmE,GAE/BgI,EAMTpO,aAAaiC,GAEP,kBAAmBA,GAErBA,EAAMqM,gBAGJ,WAAYrM,EAEdA,EAAMuH,SAKN/H,KAAK+H,OAAOvH,OAAOmE,GAGjB,mBAAoBnE,GAEtBA,EAAMsM,iBAQVvO,0BAA0BiC,EAAOK,GAE/BA,OAAc8D,IAAR9D,EAAoB,KAAOA,EAC7BL,EAEFA,EAAMuM,iBAAmBlM,EAIzB2L,GAAajM,QAAQwM,iBAAmBlM,EAQ5CtC,YAAYoJ,EAAIqF,GAEdhN,KAAKwJ,UAAUyD,uBAAuBtF,EAAI,EAAG,EAAGA,EAAGzE,MAAOyE,EAAGxE,OAAQ6J,GASvEzO,MAAMoJ,EAAInD,EAAQyD,EAAaiF,GAE7BlN,KAAKwJ,UAAU1B,qBAAuBnD,IAAPgD,EAAmB,KAAOA,GAErDnD,GAEFxE,KAAKwJ,UAAU2D,cAAc3I,EAAOH,YAAaG,EAAOD,aAG1DvE,KAAKwJ,UAAUT,QAAQvE,IACnByD,IACAiF,GAON3O,UAAU6O,EAAS5J,GAEjB,IAAK,MAAM6J,KAASD,EAElB1E,GAAQlF,IAAMA,EAGdkF,GAAQ4E,gBAAgBD,EAAME,YAAYhM,EAAG8L,EAAME,YAAY/L,GAC/DkH,GAAQ8E,YAAYH,EAAME,YAAYrK,MAAOmK,EAAME,YAAYpK,QAE/DnD,KAAKoJ,OAAOlG,MAASwF,GAAQrF,aAC7BrD,KAAKoJ,OAAOjG,OAASuF,GAAQpF,cAE7BtD,KAAKwJ,UAAUiE,YAAY,EAAG,EAAG/E,GAAQrF,aAAcqF,GAAQpF,eAE/DtD,KAAKiM,0BAQT1N,cAAcsC,EAAKoG,GAEjBjH,KAAKyJ,QAAQiE,cAAc7M,EAAKoG,GAQlC1I,KAAKoP,EAAQjG,EAAQ7G,GAEfA,EAEFb,KAAKyJ,QAAQmE,mBAAmBD,EAAQjG,EAAQ7G,GAIhDb,KAAKyJ,QAAQoE,KAAKF,EAAQjG,GAQ9BnJ,yBAAyBmJ,EAAQ7G,GAE/Bb,KAAKyJ,QAAQT,yBAAyBtB,EAAQ7G,GAQhDtC,gBAAgBuP,EAAe5K,EAAQwF,GAAQxF,MAAOC,EAASuF,GAAQvF,QAIrE,MAAM4K,EAAYrF,GAAQxF,MACpB8K,EAAatF,GAAQvF,OAErB8K,EAAY/K,EACZgL,EAAa/K,EAEbgL,EAAa,KACbC,EAAc,KAEdC,EAAcC,KAAKC,KAAKN,EAAYE,GACpCK,EAAcF,KAAKC,KAAKL,EAAaE,GAE3C1F,GAAQ8E,YAAYW,EAAYC,GAChC,MAAMK,EAAUzO,KAAKwJ,UAAUkF,gBAC/B1O,KAAKwJ,UAAU4B,cAAc,GAE7BpL,KAAKwJ,UAAUN,QAAQiF,EAAYC,GAAa,GAEhD,MACMO,EADYC,SAASC,cAAc,UAChB/D,WAAW,MAEpC6D,EAAOvF,OAAOlG,MAAS+K,EACvBU,EAAOvF,OAAOjG,OAAS+K,EAEvBjF,GAAc1I,QAAQ2D,OAASwE,GAAQ7E,aACvCoF,GAAc1I,QAAQ6L,eACtBnD,GAAc1I,QAAQ8L,mBAAkB,GAExC,IAAK,IAAI9K,EAAI,EAAGA,EAAI8M,EAAa9M,IAE/B,IAAK,IAAIC,EAAI,EAAGA,EAAIgN,EAAahN,IAE/ByH,GAAc1I,QAAQuO,cAAcb,EAAuBC,EACzDxF,GAAQxF,MAAQ3B,EAAWmH,GAAQvF,OAAS3B,EAC5CkH,GAAQxF,MAAkBwF,GAAQvF,QACpCnD,KAAK2J,oBAAoB5B,SAEzB4G,EAAOI,UAAU/O,KAAKwJ,UAAU+B,WAAY7C,GAAQxF,MAAQ3B,EAAGmH,GAAQvF,OAAS3B,GAMpFmN,EAAOvF,OAAO4F,OAAOlB,EAAe,qBAEpC7E,GAAc1I,QAAQ0O,kBAEtBvG,GAAQ8E,YAAYO,EAAWC,GAC/BhO,KAAKwJ,UAAU4B,cAAcqD,GAC7BzO,KAAKwJ,UAAUN,QAAQ6E,EAAWC,GAAY,GAE9C/E,GAAc1I,QAAQ2D,OAASwE,GAAQ7E,aACvCoF,GAAc1I,QAAQ6L,eACtBnD,GAAc1I,QAAQ8L,mBAAkB,GAM1C9N,oBAAoB2Q,GAElB,MAAMC,EAAOP,SAASC,cAAc,KACpCM,EAAKC,SAAW,eAEhBD,EAAKE,KAAOC,IAAIC,gBAAgBL,GAChCC,EAAKK,QAELL,EAAKM,QAAU,WAEbC,uBAAsB,WAEpBJ,IAAIK,gBAAgBR,EAAKE,SAE3BF,EAAKS,gBAAgB,SAIzBrR,UAEEyB,KAAKwJ,UAAU5I,UACfZ,KAAK2J,oBAAoB/I,UACzBZ,KAAKyJ,QAAQ7I,UAGfrC,sCAEE,MAAMoJ,EAAK,IAAIc,EAAkB,EAAG,EAAG,CACrCoH,UAAWC,EACXC,UAAWD,EACXE,OAAQC,EACRC,WAAYC,EACZC,KAAMC,EACNC,eAAe,EACfC,aAAa,IAgBT1P,EAAM,IAAI+E,EAAe,CAC7BQ,aAdW,qGAeXC,eATW,oGAUXC,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXzH,UAAWC,IAGbe,KAAK0N,cAAc7M,EAAK8G,GAExB,MAAM6I,EAAS,IAAIC,aAAa,GAGhC,OAFAzQ,KAAKwJ,UAAUyD,uBAAuBtF,EAAI,EAAG,EAAG,EAAG,EAAG6I,GAE/ClC,KAAKoC,IAAIF,EAAO,GAAK,SAAW,2PC/e3C,MAAMG,WAA2B/K,EAE/BrH,YAAYqS,EAAMC,EAAM7K,GAEtBvH,MAAM,CACJ2H,aAAcwK,GAAUE,GACxBzK,eAAgBwK,GAAQE,GACxB/K,SAAUA,GAAc,CACtBgL,OAAQ,CAAEhO,MAAO,IAAIsB,EAAM,gBCZnC,MAAM2M,WAAmCN,GAEvCpS,YAAYgD,EAAGC,EAAG0P,EAAGC,GA4BnB1S,MA1Ba,ogBAiBA,8JASK,CAChBwH,SAAU,CAAEjD,WAAO2B,GACnByM,qBAAsB,CAAEpO,MAAO,IAAII,GACnCiO,YAAa,CAAErO,MAAO,IAAII,GAC1BkO,aAAc,CAAEtO,MAAO,IAAII,KAI/B7E,aAAagD,EAAGC,GAEdxB,KAAKgG,SAASoL,qBAAqBpO,MAAM9C,IAAIqB,EAAGC,GAGlDjD,YAAYgT,EAAKL,EAAGC,GAElBnR,KAAKgG,SAASC,SAASjD,MAAQuO,EAC/BvR,KAAKgG,SAASsL,aAAatO,MAAM9C,IAAIqR,EAAIjK,MAAMpE,MAAOqO,EAAIjK,MAAMnE,aAEtDwB,IAANuM,IAEFlR,KAAKgG,SAASsL,aAAatO,MAAMzB,EAAI2P,QAE7BvM,IAANwM,IAEFnR,KAAKgG,SAASsL,aAAatO,MAAMxB,EAAI2P,GAIzC5S,gBAAgB2S,EAAGC,GAEjBnR,KAAKgG,SAASqL,YAAYrO,MAAM9C,IAAIgR,EAAGC,ICuStC,MAACK,GAAQ,IArUd,MAEEjT,OAEEyB,KAAKyR,YAAc,IAAI7S,EAAQ,EAAG,EAAG,GACrCoB,KAAK0R,aAAe,IAAI9S,EAAQ,EAAG,EAAG,GACtCoB,KAAK2R,qBAAkBhN,EAGvB3E,KAAK4R,uBAAyB,GAE9B5R,KAAK6R,SAAMlN,EACX3E,KAAKQ,MAAQ,IAAIH,EACjBL,KAAKwE,OAAS,IAAIT,GAAkB,GAAI2E,GAAQ7E,aAAc,GAAK,KACnE7D,KAAKwE,OAAOD,YAAc,EAS5BhG,WAAWuT,EAAQ7P,EAAKlD,EAAQ,UAE9B,MAAMgT,EAAQ,IAAI/P,GAAMjD,EAAOkD,EAAIjB,SAAUiB,EAAI+P,QAAQC,aAGzD,OAFAF,EAAMhQ,SAAS0C,KAAKqN,GACpB9R,KAAKQ,MAAMP,IAAI8R,GACRA,EAGTxT,YAEE,MAAM2T,EAAO,IAAI7T,GAEjB,OADA2B,KAAKQ,MAAMP,IAAIiS,GACRA,EAMT3T,aAAaoJ,GAEX3H,KAAKmS,SAAWxK,EASlBpJ,eAAe6T,EAAalP,EAAOC,EAAQpE,GAEzCmE,EAASA,GAAS,IAClBC,EAASA,GAAU,IACnBnD,KAAK6R,IAAIQ,UAAatT,GAAS,qBAC/BiB,KAAK6R,IAAIS,SAASF,EAAY7Q,EAAI2B,EAAQ,EACvClD,KAAK6R,IAAIzI,OAAOjG,OAASiP,EAAY5Q,EAAK2B,EAAS,EAAGD,EAAOC,GAGlE5E,QAEMyB,KAAK6R,KAEP7R,KAAK6R,IAAIU,UAAU,EAAG,EAAGvS,KAAK6R,IAAIzI,OAAOlG,MAAOlD,KAAK6R,IAAIzI,OAAOjG,QASpE5E,aAAaiU,EAAMC,EAAI1T,GAErBiB,KAAK6R,IAAIa,YAAe3T,GAAS,qBACjCiB,KAAK6R,IAAIc,YACT3S,KAAK6R,IAAIe,OAAOJ,EAAKjR,EAAGiR,EAAKhR,GAC7BxB,KAAK6R,IAAIgB,OAAOJ,EAAGlR,EAAGkR,EAAGjR,GACzBxB,KAAK6R,IAAIiB,YACT9S,KAAK6R,IAAIkB,SAQXxU,UAAUyU,EAAQjU,EAAQ,UAExB,MAAM+B,EAAW,IAAIhC,EAAkB,CACrCC,MAAOA,IAGH4B,GAAW,IAAIxB,GAAiBC,cAAc4T,GAE9CC,EAAO,IAAI3T,EAAKqB,EAAUG,GAGhC,OAFAmS,EAAKC,eAAgB,EACrBlT,KAAKQ,MAAMP,IAAIgT,GACRA,EAST1U,UAAU4U,EAAK/R,EAAMrC,GAEnBqC,EAAOA,GAAQ,EACfrC,EAAQA,GAAS,SACjBoU,EAAMA,GAAO,IAAIvU,EAEjB,MAAMwU,EAAO,IAAIlS,GAAK,IAAItC,EAAQwC,EAAMA,EAAMA,QAAOuD,EAAW5F,GAGhE,OAFAqU,EAAKrR,SAAS0C,KAAK0O,GACnBnT,KAAKQ,MAAMP,IAAImT,GACRA,EAWT7U,mBAAmBiU,EAAMC,EAAItP,EAAS,EAAGpE,EAAQ,UAAWqL,EAAQ,IAElE,MAAMhJ,EAAOoR,EAAKa,WAAWZ,GACvBW,EAAO,IAAIlS,GAAK,IAAItC,EAAQwL,EAAOjH,EAAQ/B,QAAOuD,EAAW5F,GAE7D+C,EAAS2Q,EAAGT,QAAQsB,IAAId,GAAM5O,eAAe,IAC7C2P,EAAczR,EAAOkQ,QAAQC,YAanC,OAZAnQ,EAAO7B,IAAIuS,GAEXY,EAAKrR,SAAS0C,KAAK3C,GAOnBsR,EAAKvQ,WAAWC,mBAAmB,IAAIlE,EAAQ,EAAG,GAAI,GAAI2U,GAE1DvT,KAAKQ,MAAMP,IAAImT,GACRA,EAUT7U,WAAW2E,EAAOC,EAAQpE,GAExB,MAAM4B,EAAW,IAAImG,EAAc5D,EAAOC,GACpCrC,EAAW,IAAI8E,EAAe,CAClCI,SAAU,CACRgL,OAAQ,CAAEhO,MAAO,IAAIoF,EAAQ,EAAG,EAAG,EAAG,MAExChC,aAAcoN,GACdnN,eAAgBoN,GAChBC,aAAa,EACbpN,YAAY,IAGRqN,EAAQ,IAAIxS,EAAKR,EAAUG,GAGjC,OAFA6S,EAAMpU,aAAe,IACrBS,KAAKQ,MAAMP,IAAI0T,GACRA,EASTpV,gBAAgB4U,EAAK/R,EAAMrC,GAEzBqC,EAAOA,GAAQ,EACfrC,EAAQA,GAAS,SAEjB,MAAM6U,GAAM,IAAIC,GAAOC,qBAAqB,IAAIlV,EAAW,IAAIA,EAAQwC,EAAMA,EAAMA,IAC7E2S,EAAS,IAAIC,EAAWJ,EAAK7U,GAEnC,OADAgV,EAAOhS,SAAS0C,KAAK0O,GAAO,IAAIvU,GACzBmV,EASTxV,YAAY4U,EAAK/R,EAAMrC,GAErBqC,EAAOA,GAAQ,EACfrC,EAAQA,GAAS,SACjBoU,EAAMA,GAAO,IAAIvU,EAEjB,MAAMqV,EAAS,IAAItS,GAAOP,EAAMrC,GAGhC,OAFAkV,EAAOlS,SAAS0C,KAAK0O,GACrBnT,KAAKQ,MAAMP,IAAIgU,GACRA,EAUT1V,iBAAiB2V,EAAcC,GAAO,EAAOpV,EAAQ,UAEnD,MAAMqV,EAAU,IAAIC,EAAiBH,EAAcC,GACnDC,EAAQE,mBACR,MAAMtB,EAASoB,EAAQG,gBAAgB,KAGvC,OAFoBvU,KAAKwU,UAAUxB,EAAQ,OAU7CzU,mBAAmB0V,EAAQlV,GAEzBA,EAAQA,GAAS,SACjB,MAAM4B,EAAW,IAAIkB,EAAeoS,EAAOrS,OAAQ,GAAI,IACjDd,EAAW,IAAIY,EAAkB,CAAE3C,MAAOA,IAC1C0V,EAAc,IAAItT,EAAKR,EAAUG,GAGvC,OAFA2T,EAAY1S,SAAS0C,KAAKwP,EAAOnS,QACjC0K,GAAajM,QAAQN,IAAIwU,GAClBA,EAMTlW,iBAAiB0V,GAEf,MAAMtT,EAAW,IAAIkB,EAAeoS,EAAOrS,OAAQ,GAAI,IACjDd,EAAW,IAAI8E,EAAe,CAClCI,SAAU,CACRgL,OAAQ,CAAEhO,MAAO,IAAIoF,EAAQ,EAAG,EAAG,EAAG,MAExChC,aAAcoN,GACdnN,eAAgBoN,GAChBC,aAAa,IAGTgB,EAAU,IAAIvT,EAAKR,EAAUG,GACnC4T,EAAQ3S,SAAS0C,KAAKwP,EAAOnS,QAC7B0K,GAAajM,QAAQN,IAAIyU,GAM3BnW,kBAAkBoW,GAEhB,MAAMZ,EAAS,IAAIC,EAAWW,EAAI,UAClCnI,GAAajM,QAAQN,IAAI8T,GAQ3BxV,WAAWqW,EAAOC,GAEhB,MAAMC,EAAS,IAAIlW,EAAQ,EAAG,EAAG,GAC7BiW,IAEFC,EAAOtT,EAAIqT,EAAQC,QAAU,GAG/B,IAAK,IAAIC,EAAI,EAAGA,EAAIH,EAAM5T,OAAS,EAAG+T,IAEpC/U,KAAKwU,UAAU,CAACI,EAAMG,GAAG/C,QAAQ/R,IAAI6U,GAASF,EAAMG,EAAI,GAAG/C,QAAQ/R,IAAI6U,KAU3EvW,aAAagT,EAAKL,EAAGC,GAEnB,MAAM6D,EAAO,IAAI7T,EAAK,IAAI2F,EAAc,EAAG,GAAI,IAAImK,IAKnD,OAJAjR,KAAK4R,uBAAuBjT,KAAKqW,GACjChV,KAAKQ,MAAMP,IAAI+U,GAEfA,EAAKlU,SAASmU,YAAY1D,EAAKL,EAAGC,GAC3B6D,EAMTzW,OAAOsK,GAEL,IAAK,IAAIkM,EAAI,EAAGA,EAAI/U,KAAK4R,uBAAuB5Q,OAAQ+T,IAEtD/U,KAAK4R,uBAAuBmD,GAAGjU,SAASoU,gBAAgBxM,GAAQxF,MAAOwF,GAAQvF,QAE7EnD,KAAKQ,MAAMO,SAASC,OAAS,GAE/B6H,EAASd,OAAO/H,KAAKQ,MAAOyI,GAAc1I,WC/P3C,MAAC4U,GAAO,IA7Fb,MAEE5W,cAEEyB,KAAKoV,eAAiB,CAAC,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,MAGxF7W,OAEEyB,KAAKqV,yBAA2B,EAChCrV,KAAKsV,aAAe,EACpBtV,KAAKuV,oBAAsB,EAC3BvV,KAAKwV,eAAiB,EACtBxV,KAAKyV,wBAA0B,EAC/BzV,KAAK0V,iBAAmB,EAAI,GAG9BC,mBAEE,OAAO3V,KAAKwV,eAGdI,iBAEE,OAAO5V,KAAKsV,aAGdO,wBAEE,OAAO7V,KAAKuV,oBAGdO,0BAEE,OAAO9V,KAAKyV,wBAGdM,UAEE,OAAO/V,KAAK0V,iBAGdM,SAEE,OAAOhW,KAAK4V,WAGdK,UAEE,OAAOjW,KAAK6V,kBAMdtX,0BAA0ByE,GAExBhD,KAAKyV,wBAA0BzS,EAMjCzE,SAASoX,GAEH3V,KAAKqV,wBAA0B,IAEjCrV,KAAKqV,wBAA0BM,GAEjC3V,KAAKsV,cAAgBK,EAAe3V,KAAKqV,yBAA2B,IACpErV,KAAKwV,eAAiBG,EAAe,IAErC3V,KAAKoV,eAAec,QACpBlW,KAAKoV,eAAezW,KAAKqB,KAAK4V,WAAa,IAAO5V,KAAK4V,WAAa,MAEpE5V,KAAKmW,gCAELnW,KAAKqV,wBAA0BM,EAGjCpX,gCAEEyB,KAAKuV,oBAAsB,EAE3B,IAAK,IAAIR,EAAI,EAAGA,EAAI/U,KAAKoV,eAAepU,OAAQ+T,IAE9C/U,KAAKuV,qBAAuBvV,KAAKoV,eAAeL,GAGlD/U,KAAKuV,oBAAsBvV,KAAKuV,oBAAsBvV,KAAKoV,eAAepU,SC5F9E,MAAMoV,GAEJ7X,eAGAA,kBAAkByE,EAChBqT,EACAC,EACAC,EACAC,GAEA,OAASxT,EAAQqT,IAA2BC,EAAuBD,IAA4BG,EAAqBD,GAAwBA,EAG9IhY,eAAeyE,EAAOyT,EAAKC,GAEzB,OAAQ1T,GAASyT,GAAOzT,GAAS0T,EAGnCnY,WAAWoY,EAAQC,GAEjB,OAASD,EAASC,EAAWA,GAAWA,EAG1CrY,kBAAkBsY,GAmBhB,OAjBAA,EAAIC,EAAIxI,KAAKyI,MAAc,IAARF,EAAIC,GAASE,SAAS,IACzCH,EAAII,EAAI3I,KAAKyI,MAAc,IAARF,EAAII,GAASD,SAAS,IACzCH,EAAIK,EAAI5I,KAAKyI,MAAc,IAARF,EAAIK,GAASF,SAAS,IAEpB,IAAjBH,EAAIC,EAAE9V,SAER6V,EAAIC,EAAI,IAAMD,EAAIC,GAEC,IAAjBD,EAAII,EAAEjW,SAER6V,EAAII,EAAI,IAAMJ,EAAII,GAEC,IAAjBJ,EAAIK,EAAElW,SAER6V,EAAIK,EAAI,IAAML,EAAIK,GAGb,IAAML,EAAIC,EAAID,EAAII,EAAIJ,EAAIK,EAGnC3Y,+BAA+ByU,EAAQW,GAErC,MAAMwD,EAAkBnE,EAAO,GAAGhB,QAClCmF,EAAgBjX,IAAI,EAAG,EAAG,GAE1B,MAAMkX,EAAkB,GAExB,IAAK,IAAIrC,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IAEjCpB,EAAM0D,aAAarE,EAAO+B,GAAIoC,GAC9BC,EAAgBzY,KAAKwY,EAAgBnF,SAGvC,OAAOoF,EAGT7Y,oBAAoBiU,EAAMC,EAAI6E,EAAQC,GAEpC,IAAK,IAAIxC,EAAI,EAAGA,EAAI,GAAIA,IAEtBuC,EAAOE,SAASzC,GAAK/U,KAAKyX,KAAKjF,EAAKgF,SAASzC,GAAItC,EAAG+E,SAASzC,GAAIwC,GAIrEhZ,cAAcmZ,EAAIC,GAEhB,OAAOrJ,KAAKoC,IAAIgH,EAAKC,GAAM,KAG7BpZ,YAAYgD,EAAGC,EAAG+V,GAEhB,OAAQ,EAAIA,GAAKhW,EAAIgW,EAAI/V,EAG3BjD,aAAayE,EAAOyT,EAAKC,GAEvB,OAAOpI,KAAKoI,IAAID,EAAKnI,KAAKmI,IAAIC,EAAK1T,IAGrCzE,uBAAuBqZ,EAAGC,GAExB,OAASD,EAAIC,EAAKA,GAAKA,EAGzBtZ,gBAAgBgD,EAAGP,EAAS,GAE1B,OAAOA,EAASsN,KAAKoC,IAAI0F,GAAM0B,gBAAgBvW,EAAY,EAATP,GAAcA,GAGlEzC,gBAAgBwZ,GAEd,OAAOA,GAAWzJ,KAAK0J,GAAK,KAG9BzZ,gBAAgB0Z,GAEd,OAAOA,GAAW,IAAM3J,KAAK0J,IAG/BzZ,kBAAkBwZ,GAEhB,OAAOA,GAAWzJ,KAAK0J,GAAK,KAG9BzZ,kBAAkB0Z,GAEhB,OAAOA,GAAW,IAAM3J,KAAK0J,IAG/BzZ,0BAA0B2Z,GAKxB,OAHAA,EAAE3W,GAAK2W,EAAEhH,EACTgH,EAAE1W,GAAK0W,EAAEhH,EACTgH,EAAEzW,GAAKyW,EAAEhH,EACFgH,EAGT3Z,sBAAsByU,GAEpB,MAAMlR,EAASkR,EAAO,GAAGhB,QACzB,IAAK,IAAI+C,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IAEjCjT,EAAO7B,IAAI+S,EAAO+B,IAGpB,OADAjT,EAAO8B,eAAe,EAAIoP,EAAOhS,QAC1Bc,EAGTvD,0BAEE,MAAM4Z,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAEpE,IAAIC,EAAM,IASV,OARAA,GAAOD,EAAI7J,KAAK+J,MAAsB,GAAhB/J,KAAKgK,WAC3BF,GAAOD,EAAI7J,KAAK+J,MAAsB,GAAhB/J,KAAKgK,WAE3BF,GAAOD,EAAI7J,KAAK+J,MAAsB,GAAhB/J,KAAKgK,WAC3BF,GAAOD,EAAI7J,KAAK+J,MAAsB,GAAhB/J,KAAKgK,WAE3BF,GAAOD,EAAI7J,KAAK+J,MAAsB,GAAhB/J,KAAKgK,WAC3BF,GAAOD,EAAI7J,KAAK+J,MAAsB,GAAhB/J,KAAKgK,WACpBF,EAGT7Z,gBAAgBgD,GAEd,OAAO6U,GAAMmC,MAAMhX,EAAG,EAAG,ICxJ7B,MAAMiX,GAOJja,YAAY+B,EAAMmY,EAAQC,GAExB1Y,KAAKM,KAAOA,EACZN,KAAKyY,OAASA,EACdzY,KAAK0Y,KAAOA,EAGdna,UAEEoa,QAAQC,YAAY5Y,KAAKM,MAAMN,KAAKyY,WAAWzY,KAAK0Y,KAAKG,MAAM,OChBnE,MAAMC,GAEJva,eAGAA,cAAcgD,GAEZ,OAAOA,EAGThD,kBAAkBgD,GAEhB,OAAO,EAAI+M,KAAKoC,IAAS,EAAJnP,IAAmB,GAG1ChD,oBAAoBgD,GAElB,OAAO,EAAI+M,KAAKyK,IAAQ,UAAJxX,EAAgB,GAGtChD,qBAAqBgD,GAEnB,OAAO+M,KAAK0K,IAAQ,UAAJzX,EAAgB,GAGlChD,wBAAwBgD,GAEtB,QAAS+M,KAAKyK,IAAI,UAAYxX,GAAK,GAAK,EAG1ChD,qBAAqBgD,GAEnB,OAAOA,EAAIA,EAAIA,EAGjBhD,sBAAsBgD,GAEpB,OAAO,EAAI+M,KAAK2K,IAAI,EAAI1X,EAAG,GAG7BhD,yBAAyBgD,GAEvB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EACZ,EAAI+M,KAAK2K,KAAK,EAAI1X,EAAI,EAAG,GAAK,EAGpChD,oBAAoBgD,GAElB,OAAOA,EAAIA,EAGbhD,qBAAqBgD,GAEnB,OAAO,GAAK,EAAIA,IAAM,EAAIA,GAG5BhD,wBAAwBgD,GAEtB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EACR,EAAI+M,KAAK2K,KAAK,EAAI1X,EAAI,EAAG,GAAK,EAGpChD,qBAAqBgD,GAEnB,OAAOA,EAAIA,EAAIA,EAAIA,EAGrBhD,sBAAsBgD,GAEpB,OAAO,EAAI+M,KAAK2K,IAAI,EAAI1X,EAAG,GAG7BhD,yBAAyBgD,GAEvB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EAAIA,EAChB,EAAI+M,KAAK2K,KAAK,EAAI1X,EAAI,EAAG,GAAK,EAGpChD,qBAAqBgD,GAEnB,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,EAGzBhD,sBAAsBgD,GAEpB,OAAO,EAAI+M,KAAK2K,IAAI,EAAI1X,EAAG,GAG7BhD,yBAAyBgD,GAEvB,OAAOA,EAAI,GACP,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EACrB,EAAI+M,KAAK2K,KAAK,EAAI1X,EAAI,EAAG,GAAK,EAGpChD,oBAAoBgD,GAElB,OAAa,IAANA,EAAU,EAAI+M,KAAK2K,IAAI,EAAG,GAAK1X,EAAI,IAG5ChD,qBAAqBgD,GAEnB,OAAa,IAANA,EAAU,EAAI,EAAI+M,KAAK2K,IAAI,GAAI,GAAK1X,GAG7ChD,wBAAwBgD,GAEtB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,GACF+M,KAAK2K,IAAI,EAAG,GAAK1X,EAAI,IAAM,GAC1B,EAAI+M,KAAK2K,IAAI,GAAI,GAAK1X,EAAI,KAAO,EAG5ChD,oBAAoBgD,GAElB,OAAO,EAAI+M,KAAK4K,KAAK,EAAI5K,KAAK2K,IAAI1X,EAAG,IAGvChD,qBAAqBgD,GAEnB,OAAO+M,KAAK4K,KAAK,EAAI5K,KAAK2K,IAAI1X,EAAI,EAAG,IAGvChD,wBAAwBgD,GAEtB,OAAOA,EAAI,IACN,EAAI+M,KAAK4K,KAAK,EAAI5K,KAAK2K,IAAI,EAAI1X,EAAG,KAAO,GACzC+M,KAAK4K,KAAK,EAAI5K,KAAK2K,KAAK,EAAI1X,EAAI,EAAG,IAAM,GAAK,EAGrDhD,oBAAoBgD,GAElB,OAAO,OAASA,EAAIA,EAAIA,EAAI,OAASA,EAAIA,EAG3ChD,qBAAqBgD,GAEnB,OAAO,EAAI,OAAS+M,KAAK2K,IAAI1X,EAAI,EAAG,GAAK,OAAS+M,KAAK2K,IAAI1X,EAAI,EAAG,GAGpEhD,wBAAwBgD,GAEtB,OAAOA,EAAI,GACN+M,KAAK2K,IAAI,EAAI1X,EAAG,IAAM,SAAsBA,EAAI,WAAc,GAC9D+M,KAAK2K,IAAI,EAAI1X,EAAI,EAAG,IAAM,WAAuB,EAAJA,EAAQ,GAAK,WAAa,GAAK,EAGnFhD,uBAAuBgD,GAErB,MAAM4X,EAAM,EAAI7K,KAAK0J,GAAM,EAE3B,OAAa,IAANzW,EACH,EACM,IAANA,EACE,GACC+M,KAAK2K,IAAI,EAAG,GAAK1X,EAAI,IAAM+M,KAAK0K,KAAS,GAAJzX,EAAS,OAAS4X,GAGhE5a,wBAAwBgD,GAEtB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACA+M,KAAK2K,IAAI,GAAI,GAAK1X,GAAK+M,KAAK0K,IAAsB,UAAb,GAAJzX,EAAS,MAAqB,EAGvEhD,2BAA2BgD,GAEzB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,IACA+M,KAAK2K,IAAI,EAAG,GAAK1X,EAAI,IAAM+M,KAAK0K,IAAwB,WAAnB,GAAKzX,EAAI,SAAwB,EACxE+M,KAAK2K,IAAI,GAAI,GAAK1X,EAAI,IAAM+M,KAAK0K,IAAwB,WAAnB,GAAKzX,EAAI,SAAuB,EAAI,EAGpFhD,sBAAsBgD,GAEpB,OAAO,EAAIvB,KAAKoZ,gBAAgB,EAAI7X,GAGtChD,uBAAuBgD,GAErB,MAAM8X,EAAK,OACLC,EAAK,KAEX,OAAI/X,EAAI,EAAI+X,EAEHD,EAAK9X,EAAIA,EAETA,EAAI,EAAI+X,EAERD,GAAM9X,GAAK,IAAM+X,GAAM/X,EAAI,IAE3BA,EAAI,IAAM+X,EAEVD,GAAM9X,GAAK,KAAO+X,GAAM/X,EAAI,MAI5B8X,GAAM9X,GAAK,MAAQ+X,GAAM/X,EAAI,QAIxChD,0BAA0BgD,GAExB,OAAOA,EAAI,IACN,EAAIvB,KAAKoZ,gBAAgB,EAAI,EAAI7X,IAAM,GACvC,EAAIvB,KAAKoZ,gBAAgB,EAAI7X,EAAI,IAAM,EAG9ChD,iBAAiBgZ,GAEf,OAAO,EAAMjJ,KAAK2K,IAAI3K,KAAKoC,IAAIpC,KAAK0K,IAAIzB,EAAI,IAAO,IAAQjJ,KAAKiL,KAAKjL,KAAK0K,IAAIzB,IAAMjJ,KAAK0K,IAAIzB,EAAI,IAAM,GAAO,IC1NlH,MAAMiC,GAKJjb,YAAYkb,EAAkB,UAE5BzZ,KAAKyZ,qBAAkB9U,EAIrB3E,KAAKyZ,gBAFwB,iBAApBA,EAEcX,GAAgBW,GAIhBA,EAGzBzZ,KAAK0Z,eAAiB,GAEtB1Z,KAAKwS,KAAO,EAEZxS,KAAKyS,GAAK,EAOZlU,OAAOkH,EAAS8R,KC5BlB,MAAMoC,GAKJpb,YAAYkH,EAAU,IAEpBzF,KAAK4Z,uBAAyB,KAC9B5Z,KAAK2V,cAAgB,KACrB3V,KAAK6Z,eAAiB7Z,KAAK8Z,uBAC3B9Z,KAAK+Z,SAAU,EAGf/Z,KAAKga,cAAgB,GACrBha,KAAKyF,QAAUA,EAEfzF,KAAKia,gBAAkBC,KAAKC,MAAMD,KAAKE,UAAU3U,IAEjDzF,KAAKqa,MAAQ,EAGbra,KAAKsa,SAAW,GAEhB,MAAMC,EAAgB3P,OAAO4P,KAAK/U,GAClC,IAAK,IAAIsP,EAAI,EAAGA,EAAIwF,EAAcvZ,OAAQ+T,IAExC/U,KAAKsa,SAASC,EAAcxF,IAAM,GAGpC/U,KAAKya,SAAW,EAGlBlc,OAEEyB,KAAK+Z,SAAU,EAGjBxb,OAEEyB,KAAK+Z,SAAU,EAGjBxb,QAEEyB,KAAK2V,cAAgB,KAGvBpX,OAEE,MAAMkc,EAAWza,KAAK0a,eACtB1a,KAAK2a,aAAa3a,KAAK2V,aAAc8E,EAAW,MAChDza,KAAK2V,aAAe8E,EAMtBlc,OAAOqX,GAED5V,KAAK+Z,UAEP/Z,KAAK4Z,sBAAwB5Z,KAAK2V,aAClC3V,KAAK2V,cAAgBC,EAAa5V,KAAK6Z,eACvC7Z,KAAK2a,aAAa3a,KAAK4Z,sBAAuB5Z,KAAK2V,eAOvDpX,aAAa4W,GAEXnV,KAAK4Z,sBAAwB5Z,KAAK2V,aAClC3V,KAAK2V,aAAeS,GAAMmC,MAAMpD,EAAM,EAAGnV,KAAKya,UAC9Cza,KAAK2a,aAAa3a,KAAK2V,aAAc3V,KAAK2V,cAM5CpX,wBAAwBgZ,GAEtBvX,KAAK4Z,sBAAwB5Z,KAAK2V,aAClC3V,KAAK2V,aAAeS,GAAMmC,MAAMhB,EAAG,EAAG,GAAKvX,KAAKya,SAChDza,KAAK2a,aAAa3a,KAAK2V,aAAc3V,KAAK2V,cAG5CpX,eAEE,OAAO6X,GAAMmC,MAAMvY,KAAK2V,aAAe3V,KAAK0a,eAAgB,EAAG,GAGjEnc,cAEE,OAAOyB,KAAK2V,aAAe3V,KAAK0a,eAOlCnc,iBAAiBqc,EAAcC,GAE7B7a,KAAKga,cAAcrb,KAAK,CACtBic,aAAcA,EACdC,OAAQA,IAGV7a,KAAKya,SAAWnM,KAAKoI,IAAI1W,KAAKya,SAAUG,GAS1Crc,wBAAwBiU,EAAMC,EAAIqI,EAAcC,GAAyB,GAEvE,GAAIA,EACJ,CACE,MAAMC,EAAYhb,KAAKsa,SAASQ,EAAapB,qBAE3B/U,IAAdqW,GAEFC,QAAQC,MAAM,GAAGJ,EAAapB,iDAGP,IAArBsB,EAAUha,OAEZ8Z,EAAatI,KAAOxS,KAAKia,gBAAgBa,EAAapB,gBAItDoB,EAAatI,KAAOwI,EAAUA,EAAUha,OAAS,GAAG8Z,aAAarI,GAIrE,MAAM0I,EAAW,CACf3I,KAAMA,EACNC,GAAIA,EACJqI,aAAcA,GAGhB9a,KAAKya,SAAWnM,KAAKoI,IAAI1W,KAAKya,SAAUhI,GACxCzS,KAAKsa,SAASQ,EAAapB,gBAAgB/a,KAAKwc,GAMlD5c,yBAAyB+B,GAEvB,MAAM6a,EAAWnb,KAAKob,uBAAuB9a,EAAMN,KAAK2V,cAExD,OAAI3V,KAAK2V,aAAewF,EAAS3I,KAExB2I,EAASL,aAAaO,SAAS,GAGjCF,EAASL,aAAaO,SAAS,GAMxC9c,2BAA2B+B,GAIzB,OAFiBN,KAAKob,uBAAuB9a,EAAMN,KAAK2V,cAExCmF,aAAaO,SAAS,GAMxC9c,qBAAqB+B,GAEnB,MAAM6a,EAAWnb,KAAKob,uBAAuB9a,EAAMN,KAAK2V,cAClD4B,EAAIvX,KAAKsb,gBAAgBtb,KAAK2V,aAAcwF,EAAS3I,KAAM2I,EAAS1I,IAE1E,OAAO0I,EAASL,aAAarB,gBAAgBlC,GAG/ChZ,eAEE,OAAOyB,KAAKya,SAOdlc,aAAaiU,EAAMC,GAEbzS,KAAK2V,aAAe3V,KAAK4Z,uBAE3B5Z,KAAKub,cAAcvb,KAAK4Z,sBAAuB5Z,KAAK2V,cAEtD,MAAM4E,EAAgB3P,OAAO4P,KAAKxa,KAAKia,iBAEvC,IAAK,IAAIlF,EAAI,EAAGA,EAAIwF,EAAcvZ,OAAQ+T,IAC1C,CACE,MAAMzU,EAAOia,EAAcxF,GACrBoG,EAAWnb,KAAKob,uBAAuB9a,EAAMkS,GAEnDxS,KAAKyF,QAAQnF,GAAQN,KAAKwb,kBAAkBL,EAAU3I,IAQ1DjU,cAAciU,EAAMC,GAElB,IAAK,IAAIsC,EAAI,EAAGA,EAAI/U,KAAKga,cAAchZ,OAAQ+T,IAC/C,CACE,MAAM6F,EAAe5a,KAAKga,cAAcjF,GAAG6F,aACvCxE,GAAMqF,QAAQb,EAAcpI,EAAMC,KAEpCwI,QAAQS,IAAI,eAAiB1b,KAAKga,cAAcjF,GAAG8F,OAAO9P,YAAYzK,KAAO,OAAUN,KAAKga,cAAcjF,GAAG6F,cAC7G5a,KAAKga,cAAcjF,GAAG8F,OAAOc,YASnCpd,kBAAkB4c,EAAUhG,GAI1B,OAFAnV,KAAKqa,MAAQra,KAAKsb,gBAAgBnG,EAAMgG,EAAS3I,KAAM2I,EAAS1I,IAEzD0I,EAASL,aAAaO,SAASjF,GAAMmC,MAAMvY,KAAKqa,MAAO,EAAG,IAMnE9b,cAAcqd,GAEZ,OAAO5b,KAAKsa,SAASsB,GAMvBrd,qBAAqBqd,GAEnB,IAAK,IAAI7G,EAAI,EAAGA,EAAI/U,KAAKsa,SAASsB,GAAc5a,OAAQ+T,IACxD,CAGE,GAFiB/U,KAAKsa,SAASsB,GAAc7G,GAEhC+F,aAAae,QAExB,OAAO,EAIX,OAAO,EASTtd,gBAAgByE,EACdqT,EACAC,GAEA,OAAOF,GAAM0F,UAAW9Y,EAAQqT,IAA2BC,EAAuBD,KAAqC,GAOzH9X,uBAAuBqd,EAAczG,GAEnC,IAAI5U,EAEJ,MAAMya,EAAYhb,KAAKsa,SAASsB,GAEhC,IAAK,IAAI7G,EAAI,EAAGA,EAAIiG,EAAUha,OAAQ+T,IACtC,CACE,MAAMoG,EAAWH,EAAUjG,GAE3B,GAAII,GAAQgG,EAAS3I,MAAQ2C,GAAQgG,EAAS1I,GAG5C,OADAlS,EAAU4a,EACH5a,EAIX,IAAIkW,EAAMsF,EAAAA,EAEV,IAAK,IAAIhH,EAAI,EAAGA,EAAIiG,EAAUha,OAAQ+T,IACtC,CACE,MAAMoG,EAAWH,EAAUjG,GACrBiH,EAAW1N,KAAKoC,IAAIyK,EAAS1I,GAAK0C,GAEpC6G,EAAWvF,IAEblW,EAAU4a,EACV1E,EAAMuF,GAIV,OAAOzb,EAGThC,uBAEE,MAEM0d,EAFa,IAAIC,gBAAgBC,OAAOC,SAASC,QAEf/Q,IAAI,wBAE5C,OAAI2Q,EAEKK,OAAOL,GAIP,GCxUb,MAAMM,WAA2B/C,GAS/Bjb,YAAYmb,EAAgBlH,EAAO,EAAGC,EAAK,EAAGoJ,GAAU,EAAOpC,EAAkB,UAE/Ehb,MAAMgb,GAENzZ,KAAK0Z,eAAiBA,EACtB1Z,KAAKwS,KAAOA,EACZxS,KAAKyS,GAAKA,EACVzS,KAAK6b,QAAUA,EAOjBtd,OAAOkH,EAAS8R,GAEd9R,EAAQzF,KAAK0Z,gBAAkBtD,GAAMqB,KAAKzX,KAAKwS,KAAMxS,KAAKyS,GAAIzS,KAAKyZ,gBAAgBlC,IAMrFhZ,SAASgZ,GAEP,OAAOnB,GAAMqB,KAAKzX,KAAKwS,KAAMxS,KAAKyS,GAAIzS,KAAKyZ,gBAAgBlC,KCrC/D,MAAMiF,GAEJje,eAKAA,MAAMke,GAEJ,MAEMC,GAFM,IAAIC,WAAYC,gBAAgBH,EAAc,YAE9BI,iBAAiB,cAEvCC,EAAmB,GACnBC,EAAW,GAEjB,IAAK,IAAIhI,EAAI,EAAGA,EAAI2H,EAAgB1b,OAAQ+T,IAC5C,CACE,MAAMiI,EAAON,EAAgB3H,GACvBkI,EAAcD,EAAKE,cACnBC,EAAOF,EAAYG,aAAa,SAIhC5K,EAFQxS,KAAKqd,oBAAoBL,GAElB,IACfvC,EAAW6C,WAAWN,EAAKI,aAAa,UAAY,IAG1D,GAAIH,EAAYG,aAAa,SAASG,SAAS,YAC/C,CACE,MAAMC,EAAaL,EAAKtE,MAAM,KACxB4E,EAAeD,EAAW,GAC1BE,EAAiBF,EAAW,GAElCT,EAASpe,KAAK,CACZ2B,KAAMmd,EACNhF,OAAQiF,EACRC,QAASnL,EAAkB,GAAXiI,IAOpB,GAHsBwC,EAAYG,aAAa,SAASG,SAAS,gBAC3CN,EAAYG,aAAa,SAASG,SAAS,UAEnC,KAATJ,IAAgBA,EAAKI,SAAS,KACnD,CACE,MAAMC,EAAaL,EAAKtE,MAAM,KAExBa,EAAiB8D,EAAW,GAE5BI,EAAaJ,EAAW,GAAG3E,MAAM,MACjCgF,EAAWP,WAAWM,EAAW,IACjCnE,EAAkBmE,EAAW,GAET,IAAtBJ,EAAWxc,QAEbia,QAAQC,MAAM,4BAA6BiC,GAGnB,IAAtBS,EAAW5c,QAEbia,QAAQC,MAAM,4BAA6BiC,GAG7CL,EAAiBne,KAAK,CACpB+a,eAAgBA,EAChBoE,UAAWtL,EACXuL,QAASvL,EAAOiI,EAChBoD,SAAUA,EACVpE,gBAAiBA,KASvB,OAJAqD,EAAiBkB,MAAK,CAACC,EAAG/G,IAEjB+G,EAAEH,UAAY5G,EAAE4G,YAElB,CACLhB,iBAAkBA,EAClBC,SAAUA,GAIdxe,oBAAoBye,GAElB,MAAMkB,EAAQlB,EAAKI,aAAa,KAChC,OAAiB,OAAVc,EAAiB,EAAIZ,WAAWY,IClF3C,MAAMC,GAEJ5f,YAAY6f,GAEVpe,KAAKoe,mBAAqBA,EAG5B7f,qBAAqB8f,EAAgBC,EAAiBrE,GAEpDA,EAAkBA,GAAmBja,KAAKoe,mBAC1C,MAAMG,EAASF,EAAevB,iBACxBC,EAAWsB,EAAetB,SAE1ByB,EAAiBxe,KAAKye,gBAAgBze,KAAKoe,mBAAoBpe,KAAK0e,iBAAiBL,EAAevB,mBAE1G,IAAK,IAAI/H,EAAI,EAAGA,EAAIyJ,EAAexd,OAAQ+T,SAEmDpQ,IAAxF4Z,EAAOI,MAAKC,GAAWA,EAAQlF,iBAAmB8E,EAAezJ,GAAG2E,kBAEtE6E,EAAO5f,KAAK6f,EAAezJ,IAI/B,MAAM8J,EAAY,IAAIlF,GAAgB2E,GAEtC,IAAK,IAAIvJ,EAAI,EAAGA,EAAIwJ,EAAOvd,OAAQ+T,IACnC,CACE,MAAMwC,EAAIgH,EAAOxJ,GACX+F,EAAe,IAAIyB,GACvBhF,EAAEmC,eACF4E,EAAgB/G,EAAEmC,gBAClBnC,EAAEsG,SACFtG,EAAEsE,QACFtE,EAAEkC,iBAGJoF,EAAUC,wBAAwBvH,EAAEuG,UAAWvG,EAAEwG,QAASjD,GAAc,GAG1E,IAAK,IAAI/F,EAAI,EAAGA,EAAIgI,EAAS/b,OAAQ+T,IACrC,CACE,MAAMwC,EAAIwF,EAAShI,GACbgK,EAAe,IAAIvG,GAAYjB,EAAEjX,KAAMiX,EAAEkB,OAAQlB,EAAEmB,MACzDmG,EAAUG,iBAAiBzH,EAAEoG,QAASoB,GAGxC,OAAOF,EAGTtgB,gBAAgB0gB,EAAOC,GAErB,MAAMX,EAAS,GAET/D,EAAO5P,OAAO4P,KAAKyE,GAEzB,IAAK,IAAIlK,EAAI,EAAGA,EAAIyF,EAAKxZ,OAAQ+T,IAE/BwJ,EAAO5f,KAAK,CACV+a,eAAgBc,EAAKzF,GACrB+I,UAAW,EACXC,QAASmB,EAAe,EAAIA,EAAe,EAC3CrB,SAAUoB,EAAMzE,EAAKzF,IACrB8G,SAAS,EACTpC,gBAAiB,sBAIrB,OAAO8E,EAGThgB,aAAa4gB,EAAK1Z,GAEhB,MAAM2Z,GAAkB,IAAK5C,IAAwBrC,MAAMgF,GACrDZ,EAASa,EAAgBtC,iBACzBC,EAAWqC,EAAgBrC,SAC3B8B,EAAY,IAAIlF,GAAgBlU,GAEtC,IAAK,IAAIsP,EAAI,EAAGA,EAAIwJ,EAAOvd,OAAQ+T,IACnC,CACE,MAAMwC,EAAIgH,EAAOxJ,GACX+F,EAAe,IAAIyB,GACvBhF,EAAEmC,eACFjU,EAAQ8R,EAAEmC,gBACVnC,EAAEsG,SACFtG,EAAEsE,QACFtE,EAAEkC,iBAGJoF,EAAUC,wBAAwBvH,EAAEuG,UAAWvG,EAAEwG,QAASjD,GAAc,GAG1E,IAAK,IAAI/F,EAAI,EAAGA,EAAIgI,EAAS/b,OAAQ+T,IACrC,CACE,MAAMwC,EAAIwF,EAAShI,GACbgK,EAAe,IAAIvG,GAAYjB,EAAEjX,KAAMiX,EAAEkB,QAC/CoG,EAAUG,iBAAiBzH,EAAEoG,QAASoB,GAGxC,OAAOF,EAGTtgB,iBAAiBggB,GAEf,IAAIW,GAAgB,EAEpB,IAAK,IAAInK,EAAI,EAAGA,EAAIwJ,EAAOvd,OAAQ+T,IACnC,CACE,MAEMsK,EAFQd,EAAOxJ,GAEIgJ,QAEzBmB,EAAeG,EAAaH,EAAeG,EAAaH,EAG1D,OAAOA,GCrHX,MAAMI,GAEJ/gB,cAEEyB,KAAKuf,YAAc,GACnBvf,KAAKoe,mBAAqB,GAG5B7f,IAAIihB,EAAiBC,EAAenB,GAElC,IAAK,IAAIvJ,EAAI,EAAGA,EAAI/U,KAAKuf,YAAYve,OAAQ+T,IAE3C,GAAI/U,KAAKuf,YAAYxK,GAAGvC,OAASgN,GAAmBxf,KAAKuf,YAAYxK,GAAGtC,KAAOgN,EAC/E,CAEE,OADyB,IAAItB,GAAuBne,KAAKoe,oBAAoBsB,qBAAqB1f,KAAKuf,YAAYxK,GAAGoI,KAAMmB,GAKhI,IAAK,IAAIvJ,EAAI,EAAGA,EAAI/U,KAAKuf,YAAYve,OAAQ+T,IAE3C,GAAI/U,KAAKuf,YAAYxK,GAAGtC,KAAOgN,QAA8C9a,IAA7B3E,KAAKuf,YAAYxK,GAAGvC,KACpE,CAEE,OADyB,IAAI2L,GAAuBne,KAAKoe,oBAAoBsB,qBAAqB1f,KAAKuf,YAAYxK,GAAGoI,KAAMmB,GAKhIrD,QAAQC,MAAM,0CAA2CsE,EAAiBC,GAI5ElhB,gBAAgBghB,GAEd,IAAK,IAAIxK,EAAI,EAAGA,EAAIwK,EAAYve,OAAQ+T,IAEtC/U,KAAKuf,YAAY5gB,KAAK4gB,EAAYxK,IAItCxW,gBAAgBghB,GAEdvf,KAAKuf,YAAcA,EAGrBhhB,uBAAuB6f,GAErBpe,KAAKoe,mBAAqBA,GCjD9B,MAAMuB,GAEJphB,YAAY+B,GAEVN,KAAKM,KAAOA,EAGd/B,SAIAA,gBAIAA,YAIAA,eAIAA,WAIAA,iBAIAA,UAIAA,gBAIAA,wBAAwBqhB,EAAkBC,EAAqBC,IAI/DvhB,uBAAuBqhB,EAAkBC,EAAqBC,KCxChE,MAAMC,GAEJxhB,YAAYyhB,GAEVhgB,KAAKigB,WAAa,IAAIN,GACtB3f,KAAKkgB,cAAgB,IAAIP,GAEzB3f,KAAKoe,mBAAqB,GAC1Bpe,KAAKmgB,mBAAqB,GAE1BngB,KAAKggB,iBAAmBA,EAExBhgB,KAAKogB,eAAgB,EAGvB7hB,YAAY0gB,EAAOoB,GAAO,GAEpBrgB,KAAKogB,eAEPpgB,KAAKsgB,oBAGPtgB,KAAKigB,WAAajgB,KAAKkgB,cACvBlgB,KAAKkgB,cAAgBjB,EAErBjf,KAAKigB,WAAWM,cAChBvgB,KAAKkgB,cAAcM,eAEnBxgB,KAAK8f,iBAAmB9f,KAAKggB,iBAAiB1U,IAAItL,KAAKigB,WAAW3f,KAAMN,KAAKkgB,cAAc5f,KAAMN,KAAKmgB,oBACtGngB,KAAK8f,iBAAiBW,OAEtBzgB,KAAKogB,eAAgB,EAEjBC,IAEFrgB,KAAK8f,iBAAiBO,OACtBrgB,KAAKkM,UAIT3N,SAEMyB,KAAKogB,eAEPpgB,KAAK0gB,uBAED1gB,KAAK8f,iBAAiBa,gBAExB3gB,KAAKogB,eAAgB,EAErBpgB,KAAK0gB,uBAEL1gB,KAAKsgB,oBAELtgB,KAAKkgB,cAAclU,aAKrBhM,KAAKkgB,cAAchU,SAIvB3N,gBAEEyB,KAAKkgB,cAAcU,gBAGrBriB,eAEEyB,KAAKkgB,cAAcW,eAGrBtiB,UAAU0gB,GAERjf,KAAKkgB,cAAgBjB,EAGvB1gB,uBAAuB6f,GAErBxT,OAAOC,OAAO7K,KAAKoe,mBAAoBA,GACvCxT,OAAOC,OAAO7K,KAAKmgB,mBAAoB/B,GAGzC7f,uBAEEyB,KAAK8f,iBAAiB5T,OAAO4U,GAAKlL,YAClC5V,KAAKigB,WAAWc,uBAAuB/gB,KAAKmgB,mBAAoBngB,KAAK8f,iBAAiBkB,eAAgBhhB,KAAK8f,kBAC3G9f,KAAKkgB,cAAce,wBAAwBjhB,KAAKmgB,mBAAoBngB,KAAK8f,iBAAiBkB,eAAgBhhB,KAAK8f,kBAGjHvhB,oBAOEyB,KAAKigB,WAAWlU,WC5Bf,MAACmV,GAAqB,IAtE3B,MAEE3iB,cAEEyB,KAAKggB,iBAAmB,IAAIV,GAC5Btf,KAAKmhB,mBAAqB,IAAIpB,GAA2B/f,KAAKggB,kBAGhEF,uBAEE,OAAO9f,KAAKmhB,mBAAmBrB,iBAGjCK,yBAEE,OAAOngB,KAAKmhB,mBAAmBhB,mBAGjC5hB,oBAEE,OAAOyB,KAAKmhB,mBAAmBjB,cAGjC3hB,YAAY0gB,EAAOoB,GAAO,GAExBrgB,KAAKmhB,mBAAmBC,YAAYnC,EAAOoB,GAG7C9hB,gBAEEyB,KAAKmhB,mBAAmBP,gBAG1BriB,SAEEyB,KAAKmhB,mBAAmBjV,SAG1B3N,eAEEyB,KAAKmhB,mBAAmBN,eAG1BtiB,gBAAgBghB,GAEdvf,KAAKggB,iBAAiBqB,gBAAgB9B,GAGxChhB,gBAAgBghB,GAEdvf,KAAKggB,iBAAiBsB,gBAAgB/B,GAGxChhB,UAAU0gB,GAERjf,KAAKmhB,mBAAmBI,UAAUtC,GAGpC1gB,uBAAuB6f,GAErBpe,KAAKggB,iBAAiBwB,uBAAuBpD,GAC7Cpe,KAAKmhB,mBAAmBK,uBAAuBpD,GAGjD7f,yBAAyB0d,GAEvBjc,KAAKggB,iBAAiByB,yBAAyBxF,KCF9C,MAACyF,GAAyB,IAjE/B,MAEEnjB,cAEEyB,KAAK2hB,WAAa,GAClB3hB,KAAK4hB,mBAAqB,IAAIC,IAGhCtjB,SAEEyB,KAAK8hB,6BAEL,IAAK,MAAMC,KAAa/hB,KAAK4hB,mBAE3BG,EAAU7V,OAAO8V,GAAkB7B,oBAIvC5hB,mBAAmBwjB,GAEjB/hB,KAAK2hB,WAAWhjB,KAAKojB,GAGvBxjB,iBAAiBwjB,GAIf/hB,KAAK4hB,mBAAmB3hB,IAAI8hB,GAG9BxjB,kBAAkBwjB,GAIhB/hB,KAAK4hB,mBAAmBK,OAAOF,GAGjCxjB,sBAAsB2jB,GAEpBjH,QAAQkH,KAAK,oDACbniB,KAAKsL,IAAI4W,GAGX3jB,IAAI2jB,GAEF,IAAK,IAAInN,EAAI,EAAGA,EAAI/U,KAAK2hB,WAAW3gB,OAAQ+T,IAE1C,GAAI/U,KAAK2hB,WAAW5M,GAAGzU,OAAS4hB,EAE9B,OAAOliB,KAAK2hB,WAAW5M,GAG3BkG,QAAQC,MAAM,sDAAuDgH,GAIvE3jB,6BAEE,IAAK,IAAIwW,EAAI,EAAGA,EAAI/U,KAAK2hB,WAAW3gB,OAAQ+T,IAE1C/U,KAAK2hB,WAAW5M,GAAGqN,YAAYJ,GAAkB7B,sBCiFlD,MAACkC,GAAe,IA7IrB,MAEE9jB,cAEEyB,KAAKsiB,MAAQ,GAEbtiB,KAAKuiB,qBAAuB,GAG9BhkB,SAEEyB,KAAKwiB,wBAGPjkB,WAAWkkB,EAAWC,GAAa,EAAMrC,GAAO,GAE9C,MAAMnI,EAAIlY,KAAKsL,IAAImX,GAEfC,IAEF1iB,KAAK2iB,qBAAqBzK,EAAE0K,KAC5B5iB,KAAK6iB,uBAAuB3K,EAAE0K,MAGhCZ,GAAkBZ,YAAYlJ,EAAGmI,GAGnC9hB,YAAYukB,EAAYJ,GAAa,EAAOrC,GAAO,GAEjD,MAAM0C,EAAY/iB,KAAKsL,IAAIwX,GACrBE,EAAkBhjB,KAAKsL,IAAI,cAEjC0X,EAAgBC,cAAcF,GAC9B/iB,KAAKkjB,WAAWF,EAAgB1iB,KAAMoiB,EAAYrC,GAGpD9hB,cAAc4kB,GAEZnjB,KAAKsiB,MAAM3jB,KAAKwkB,GAGlB5kB,SAASkkB,GAEP,IAAK,IAAI1N,EAAI,EAAGA,EAAI/U,KAAKsiB,MAAMthB,OAAQ+T,IAErC,GAAI/U,KAAKsiB,MAAMvN,GAAGzU,OAASmiB,EAEzB,OAAO,EAGX,OAAO,EAGTlkB,SAASkkB,GAEP,MAAMU,EAAOnjB,KAAKsL,IAAImX,GAEtBT,GAAkBT,UAAU4B,GAG9B5kB,yBAAyB6kB,GAEvBpjB,KAAKuiB,qBAAuBa,EAG9B7kB,mBAEE,OAAOyjB,GAAkBqB,oBAG3B9kB,iBAAiBkkB,GAEfxH,QAAQkH,KAAK,2CACbniB,KAAKsL,IAAImX,GAGXlkB,IAAIkkB,GAEF,IAAK,IAAI1N,EAAI,EAAGA,EAAI/U,KAAKsiB,MAAMthB,OAAQ+T,IAErC,GAAI/U,KAAKsiB,MAAMvN,GAAGzU,OAASmiB,EAEzB,OAAOziB,KAAKsiB,MAAMvN,GAGtBkG,QAAQC,MAAM,wCAAyCuH,GAIzDlkB,WAAWqkB,GAET,IAAK,IAAI7N,EAAI,EAAGA,EAAI/U,KAAKsiB,MAAMthB,OAAQ+T,IAErC,GAAI/U,KAAKsiB,MAAMvN,GAAG6N,MAAQA,EAExB,OAAO5iB,KAAKsiB,MAAMvN,GAGtBkG,QAAQC,MAAM,+CAAgD0H,GAIhErkB,qBAAqBqkB,GAEnBzG,OAAOmH,QAAQC,UAAU,GAAI,GAAIX,GAGnCrkB,uBAAuB+B,GAErB,MAAMkjB,EAAQxjB,KAAKyjB,aAAanjB,GAEhCsO,SAAS4U,MAAQA,EAAQ,GAAGA,OAAWxjB,KAAKuiB,uBAAyBviB,KAAKuiB,qBAG5EhkB,wBAEE,IAAK,IAAIwW,EAAI,EAAGA,EAAI/U,KAAKsiB,MAAMthB,OAAQ+T,IAErC/U,KAAKsiB,MAAMvN,GAAGqN,YAAYJ,GAAkB7B,oBAIhD5hB,aAAamlB,GAEX,IAAIC,EAAaD,EAAOE,cAAcC,QAAQ,IAAK,IAGnD,OAFAF,EAAa3jB,KAAK8jB,sBAAsBH,GAEjCA,EAGTplB,sBAAsBmlB,GAEpB,OAAOA,EAAOG,QACZ,gBACCE,GAAUA,EACRF,QAAQ,IAAK,KACbA,QAAQ,IAAK,SCjItB,MAAMG,GAMJzlB,YAAY0lB,EAAoBpb,EAAUqb,GAExCD,EAAqBA,GAAsB,IAAIE,GAE/CnkB,KAAKikB,mBAAqBA,EAC1BjkB,KAAK6I,SAAWA,EAChB7I,KAAKkkB,MAAQA,EAEblkB,KAAKokB,YAAa,EAClBpkB,KAAKqkB,cAAgB,EAErBrkB,KAAKskB,iBAAmB,EAM1B/lB,OAAOoX,GAEL,GAAK3V,KAAKokB,WAAV,CAmBA,IAfAtD,GAAKyD,SAAS5O,GAGa,IAAvB3V,KAAKqkB,eAEPrkB,KAAKikB,mBAAmBO,gBAG1BxkB,KAAKkkB,MAAMhY,SAEXlM,KAAKskB,kBAAoBxD,GAAKlL,WAE9B5V,KAAKikB,mBAAmBrD,gBACxBoB,GAAkBpB,gBAEX5gB,KAAKskB,iBAAmBxD,GAAKpL,kBAElC1V,KAAKikB,mBAAmBpD,eACxBmB,GAAkBnB,eAElB7gB,KAAKskB,kBAAoBxD,GAAKpL,iBAEhCoL,GAAK2D,0BAA0BzkB,KAAKskB,iBAAmBxD,GAAKpL,kBAE5D1V,KAAKikB,mBAAmB/X,SAExB8V,GAAkB9V,SAClBwY,GAAYxY,SACZyY,GAAqBzY,SAErBlM,KAAKikB,mBAAmBpX,gBAExB7M,KAAK6I,SAASqD,SACdlM,KAAKikB,mBAAmBnX,iBAExB8X,GAAM7c,OAAO/H,KAAK6I,UAGlB7I,KAAKikB,mBAAmBY,eACxB7kB,KAAKqkB,gBAELrkB,KAAKkkB,MAAMnb,QACX6b,GAAM7b,SAGRxK,QAEMyB,KAAKokB,aAEkB,IAAvBpkB,KAAKqkB,eAEPrkB,KAAKikB,mBAAmBjY,WAG1BhM,KAAKokB,YAAa,EAElBpkB,KAAK6I,SAASW,UAAUsb,iBAAiB9kB,KAAKkM,OAAO6Y,KAAK/kB,QAG5DzB,QAE0B,IAApByB,KAAKokB,aAETpkB,KAAKokB,YAAa,EAClBpkB,KAAKikB,mBAAmBlY,UAExB/L,KAAK6I,SAASW,UAAUsb,iBAAiB,OAM3CvmB,UAAUuN,GAER9L,KAAKikB,mBAAmBlY,QAAQ/L,MAChCA,KAAKikB,mBAAqBnY,EAC1B9L,KAAKikB,mBAAmBjY,SAAShM,MAGnCzB,UAEEyB,KAAKglB,OACLhlB,KAAKqkB,cAAgB,GCrHzB,MAAMF,GAEJ5lB,iBAMAA,SAAS0mB,IAMT1mB,QAAQ0mB,IAGR1mB,iBAGAA,UAGAA,gBAGAA,kBAGAA,iBAGAA,iBC/BF,MAAM2mB,WAAoBvf,GAExBpH,YAAY4mB,GAAiB,GAE3B1mB,4ZACAuB,KAAK+F,QAAQqf,uBAAyBD,EACtCnlB,KAAKgG,SAASqf,WAAa,CAAEriB,WAAO2B,GAGtCpG,gBAAgBgT,GAEdvR,KAAKgG,SAASqf,WAAWriB,MAAQuO,GCVrC,MAAM+T,WAAmC3f,GAEvCpH,YAAYgnB,EAAOC,GAAyB,GAE1C/mB,2qCAAYkG,EAAW,CACrB8gB,SAAUF,IAEZvlB,KAAKgG,SAASC,SAAkB,CAAEjD,WAAO2B,GACzC3E,KAAKgG,SAAS0f,YAAkB,CAAE1iB,WAAO2B,GACzC3E,KAAKgG,SAAS2f,eAAkB,CAAE3iB,MAAO,GAEzChD,KAAKgG,SAAS4f,aAAgB,CAAE5iB,MAAO,MACvChD,KAAKgG,SAAS6f,aAAgB,CAAE7iB,MAAO,MACvChD,KAAKgG,SAAS8f,aAAgB,CAAE9iB,MAAO,MACvChD,KAAKgG,SAAS+f,aAAgB,CAAE/iB,MAAO,MACvChD,KAAKgG,SAASggB,aAAgB,CAAEhjB,MAAO,MAEvChD,KAAKgG,SAASigB,cAAgB,CAAEjjB,MAAO,GACvChD,KAAKgG,SAASkgB,aAAgB,CAAEljB,MAAO,CAAC,EAAK,GAAK,GAAK,GAAK,KAC5DhD,KAAKgG,SAASmgB,YAAgB,CAAEnjB,MAAO,GAEvChD,KAAK+F,QAAQqf,uBAAyBI,EACtC,MAAMY,EAAkB,CACtB,IAAI9hB,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,YAGZtE,KAAKgG,SAASogB,gBAAkB,CAAEpjB,MAAOojB,GAG3C7nB,SAAS8nB,GAEPrmB,KAAKgG,SAAS4f,aAAa5iB,MAAQqjB,EAGrC9nB,SAAS8nB,GAEPrmB,KAAKgG,SAAS6f,aAAa7iB,MAAQqjB,EAGrC9nB,SAAS8nB,GAEPrmB,KAAKgG,SAAS8f,aAAa9iB,MAAQqjB,EAGrC9nB,SAAS8nB,GAEPrmB,KAAKgG,SAAS+f,aAAa/iB,MAAQqjB,EAGrC9nB,SAAS8nB,GAEPrmB,KAAKgG,SAASggB,aAAahjB,MAAQqjB,EAGrC9nB,mBAAmByE,GAEjBhD,KAAKgG,SAASigB,cAAcjjB,MAAQA,EAGtCzE,iBAAiByE,GAEfhD,KAAKgG,SAASmgB,YAAYnjB,MAAQA,EAGpCzE,iBAAiB+nB,GAEftmB,KAAKgG,SAASogB,gBAAgBpjB,MAAM,GAAG9C,IAAIomB,GAG7C/nB,iBAAiB+nB,GAEftmB,KAAKgG,SAASogB,gBAAgBpjB,MAAM,GAAG9C,IAAIomB,GAG7C/nB,iBAAiB+nB,GAEftmB,KAAKgG,SAASogB,gBAAgBpjB,MAAM,GAAG9C,IAAIomB,GAG7C/nB,iBAAiB+nB,GAEftmB,KAAKgG,SAASogB,gBAAgBpjB,MAAM,GAAG9C,IAAIomB,GAG7C/nB,iBAAiB+nB,GAEftmB,KAAKgG,SAASogB,gBAAgBpjB,MAAM,GAAG9C,IAAIomB,IC9FxC,MAAMC,GAEXhoB,YAAYioB,EAAa5D,EAAKxhB,EAAO,GAEnCpB,KAAKwmB,YAAcA,EACnBxmB,KAAK4iB,IAAMA,EACX5iB,KAAKymB,aAAe,EACpBzmB,KAAK0mB,YAActlB,EAEnBpB,KAAK2mB,cAAe,EACpB3mB,KAAK4mB,WAAY,EACjB5mB,KAAK6mB,cAAgB,OAGvBtoB,0BAA0BuoB,EAAQC,GAEhCD,EAAS9mB,KAAKgnB,UAAUF,GAAUA,EAAS,EAC3CC,EAAS/mB,KAAKgnB,UAAUD,GAAUA,EAAS,EAE3C/mB,KAAKymB,aAAeK,EAEhBC,EAAQ,IAEV/mB,KAAK0mB,YAAcK,GAGjB/mB,KAAKymB,aAAezmB,KAAK0mB,aAE3BzL,QAAQkH,KAAK,8EAA+EniB,KAAK4iB,KAIrGrkB,kBAEEyB,KAAK2mB,cAAe,EAGtBpoB,YAAY0oB,GAEVjnB,KAAK4mB,WAAY,EACjB5mB,KAAK6mB,cAAgBI,EAGvB1oB,cAEE0c,QAAQC,MAAM,uBAAyBlb,KAAKwmB,YAAc,cAAgBxmB,KAAK4iB,IAAM,SAAW5iB,KAAK6mB,eAGvGtoB,KAAK2oB,GAEH,QAAsDviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAC7C,CACE,MAAMwE,EAAQ,UAEdC,MAAMrnB,KAAK4iB,IAAK,CACdnK,OAAQ,MACR6O,KAAM,OACNF,MAAOA,EACPG,YAAa,cACbC,SAAU,WAETC,KAAKznB,KAAK0nB,YAAY3C,KAAK/kB,KAAMknB,IACjCS,MAAM3nB,KAAK4nB,WAAW7C,KAAK/kB,YAI9BknB,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,kBAITxpB,kBAAkB2oB,EAAoBc,GAEpC,MAAMC,EAAiBD,EAAShW,QAC1BkW,EAASF,EAASG,KAAKC,YAGvBC,GAAiBL,EAASM,QAAQhd,IAAI,kBAG5C,IAAIid,EAAiB,EAErB,OACA,CACE,MAAMC,KAAEA,EAAIxlB,MAAEA,SAAgBklB,EAAOO,OAErC,GAAID,EAEF,MAGFD,GAAkBvlB,EAAMhC,OAExBhB,KAAK8nB,0BAA0BS,EAAgBF,GAI7CL,EAASU,GAEX1oB,KAAK2oB,sBAAsBzB,EAAoBe,IAI/CjoB,KAAK4oB,YAAY,GAAGZ,EAASa,WAAWb,EAASc,cACjD9oB,KAAK+nB,mBAITxpB,sBAAsB2oB,EAAoBc,IAI1CzpB,WAAW4e,GAETlC,QAAQC,MAAMiC,GAGhB5e,OAAOqZ,GAEL,OAAO0E,OAAO1E,KAAOA,GAAKA,EAAI,GAAM,EAGtCrZ,SAASqZ,GAEP,OAAO0E,OAAO1E,KAAOA,GAAKA,EAAI,GAAM,EAGtCrZ,UAAUqZ,GAER,OAAO5X,KAAK+oB,OAAOnR,IAAM5X,KAAKgpB,SAASpR,IChI3C,MAAMqR,GAQJ1qB,YAAYyO,EAAQiY,GAAO,EAAMiE,EAAS,EAAGC,GAAa,GAExDnpB,KAAKgN,OAASA,EACdhN,KAAKilB,KAAOA,EACZjlB,KAAKkpB,OAASA,EACdlpB,KAAKmpB,WAAaA,EAElBnpB,KAAKopB,WAAQzkB,EAMfpG,KAAK8qB,GAECrpB,KAAKmpB,WAEPnpB,KAAKopB,MAAQ,IAAIE,EAAiBD,GAIlCrpB,KAAKopB,MAAQ,IAAIG,EAAOF,GAG1BrpB,KAAKopB,MAAMI,UAAUxpB,KAAKgN,QAC1BhN,KAAKopB,MAAMK,QAAQzpB,KAAKilB,MAGxBjlB,KAAKopB,MAAMM,KAAKA,KAAK1mB,MAAQ,EAE7BhD,KAAKopB,MAAMO,UAAU3pB,KAAKilB,KAAO,EAAIjlB,KAAKkpB,QAG5C3qB,OAEEyB,KAAKopB,MAAM3I,OAGbliB,QAEEyB,KAAKopB,MAAMQ,QAGbrrB,OAEEyB,KAAKopB,MAAMpE,OAGb6E,iBAEE,OAAO7pB,KAAKopB,MAAMU,WCzDtB,MAAMC,WAAoBxD,GAExBhoB,YAAYioB,EAAa5D,EAAKqC,GAAO,EAAMiE,EAAS,EAAG9nB,EAAM+nB,GAAa,GAExE1qB,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKilB,KAAOA,EACZjlB,KAAKkpB,OAASA,EACdlpB,KAAKmpB,WAAaA,EAGpB5qB,sBAAsB2oB,QAQkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKgqB,kBAAkB9C,IAIvBA,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,mBAKTxpB,kBAAkB2oB,GAEhB,MAAMzhB,EAAUwkB,EAAanf,aAEvBkC,EAASvH,EAAQykB,aAAa,EAAG,MAAO,OAE9C7C,MAAMrnB,KAAK4iB,KAAK6E,MAAK3Q,GAAKA,EAAE5H,SAAQuY,MAAMO,IAEpCA,EAASmC,YAEXnC,EAASmC,cAAc1C,MAAM2C,IAE3B3kB,EAAQ4kB,gBAAgBD,GAAeE,IAErCpD,EAAmBW,aACjB7nB,KAAKwmB,YACLxmB,KAAK4iB,IACL,IAAIqG,GAAUqB,EAActqB,KAAKilB,KAAMjlB,KAAKkpB,OAAQlpB,KAAKmpB,aAG3DnpB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,yBAMTb,EAAmBW,aACjB7nB,KAAKwmB,YACLxmB,KAAK4iB,IACL,IAAIqG,GAAUjc,EAAQhN,KAAKilB,KAAMjlB,KAAKkpB,OAAQlpB,KAAKmpB,aAGrDnpB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,uBChBR,MAACb,GAAqB,IAhD3B,MAEE3oB,OAGEyB,KAAKuqB,UAAY,GAGjBvqB,KAAKmnB,iBAAmB,GAQ1B5oB,aAAa+B,EAAMsiB,EAAK4H,GAET5f,OAAO4P,KAAKxa,KAAKmnB,kBAErB5J,SAASqF,GAEhB5iB,KAAKuqB,UAAUjqB,GAAQN,KAAKmnB,iBAAiBvE,IAI7C5iB,KAAKuqB,UAAUjqB,GAAQkqB,EACvBxqB,KAAKmnB,iBAAiBvE,GAAO4H,GAOjCjsB,aAAa+B,GAEX,OAAON,KAAKuqB,UAAUjqB,GAMxB/B,IAAI+B,GAEF,OAAON,KAAKuqB,UAAUjqB,KChD1B,MAAMmqB,GAOJlsB,YAAY+B,EAAMoqB,EAAQC,GAExB3qB,KAAKknB,mBAAqB0D,GAC1B5qB,KAAK0qB,OAASA,EACd1qB,KAAKM,KAAOA,EAEZN,KAAK2qB,OAASA,EAEd3qB,KAAK6qB,iBAAmB7qB,KAAK8qB,WAAW/F,KAAK/kB,MAE7CA,KAAK+qB,iBAEL/qB,KAAKgrB,eAAiBhrB,KAAKirB,kBAG7B1sB,OAEEyB,KAAK2qB,OAAOO,YAAY,CAAE9a,KAAM,OAAQ+a,YAAanrB,KAAKM,OAG5D/B,YAEE,IAAK,IAAIwW,EAAI,EAAGA,EAAI/U,KAAKgrB,eAAehqB,OAAQ+T,IAChD,CACE,MAAMqW,EAAeprB,KAAKgrB,eAAejW,GAEzC,IAAKqW,EAAazE,aAEhB,OAAO,EAIHyE,EAAaxE,YAGfwE,EAAaxI,IAAMwI,EAAaC,aAEhCD,EAAaE,eAKnB,OAAO,EAGT/sB,eAEE,OAAOyB,KAAKurB,qBAAuBvrB,KAAKwrB,oBAG1CjtB,qBAEE,IAAIkoB,EAAe,EAEnB,IAAK,IAAI1R,EAAI,EAAGA,EAAI/U,KAAKgrB,eAAehqB,OAAQ+T,IAE9C0R,GAAgBzmB,KAAKgrB,eAAejW,GAAG0R,aAGzC,OAAOA,EAGTloB,oBAEE,IAAImoB,EAAc,EAElB,IAAK,IAAI3R,EAAI,EAAGA,EAAI/U,KAAKgrB,eAAehqB,OAAQ+T,IAE9C2R,GAAe1mB,KAAKgrB,eAAejW,GAAG2R,YAGxC,OAAOA,EAGTnoB,mBAEE,MAAMktB,EAAQ,GAEd,IAAK,IAAI1W,EAAI,EAAGA,EAAI/U,KAAK0qB,OAAO1pB,OAAQ+T,IACxC,CACE,MAAM2W,EAAQ1rB,KAAK0qB,OAAO3V,GAE1B0W,EAAM9sB,KAAK+sB,EAAMprB,MAGnB,OAAOmrB,EAGTltB,uBAME,OAJe,IAAIotB,OACjB,IAAIrc,IAAI,6CAA8Csc,OAAOC,KAAKjJ,KAClE,CAAEtiB,KAAM,qBAAsB8P,KAAM,WAKxC7R,iBAEEyB,KAAK2qB,OAAOmB,iBAAiB,UAAW9rB,KAAK6qB,kBAE7C7qB,KAAK2qB,OAAOO,YAAY,CAAE9a,KAAM,SAAU+a,YAAanrB,KAAKM,KAAM6c,KAAMnd,KAAK0qB,SAM/EnsB,WAAWwtB,GAET,MAAM9E,EAAU8E,EAAE5O,KAElB,OAAQ8J,EAAQ7W,MAEhB,IAAK,gBAAgBpQ,KAAKM,OACxBN,KAAKgsB,mBAAmB/E,EAAQ9J,OAQpC5e,mBAAmBgsB,GAEjBvqB,KAAK2qB,OAAOsB,oBAAoB,UAAWjsB,KAAK6qB,kBAEhD,IAAK,IAAI9V,EAAI,EAAGA,EAAI/U,KAAKgrB,eAAehqB,OAAQ+T,IAChD,CACE,MAAMqW,EAAeprB,KAAKgrB,eAAejW,GAGzCqW,EAAaC,aAAeD,EAAaxI,IAEzCwI,EAAaxI,IAAM2H,EAAUa,EAAa5E,aAE1C4E,EAAazC,sBAAsB3oB,KAAKknB,qBAO5C3oB,kBAGE,OADA0c,QAAQkH,KAAK,mBACN,ICxJX,MAAM+J,WAA0BzB,GAE9BlsB,YAAYukB,EAAY4H,EAAQC,GAE9BlsB,MAAMqkB,EAAY4H,EAAQC,GAI5BpsB,kBAEE,MAAM4tB,EAAU,GAEhB,IAAK,IAAIpX,EAAI,EAAGA,EAAI/U,KAAK0qB,OAAO1pB,OAAQ+T,IACxC,CACE,MAAMqX,EAAapsB,KAAK0qB,OAAO3V,GAE/BoX,EAAQxtB,KAAK,IAAIorB,GACfqC,EAAW9rB,KACX8rB,EAAWxJ,IACXwJ,EAAWnH,KACXmH,EAAWlD,OACXkD,EAAWhrB,KACXgrB,EAAWjD,aAIf,OAAOgD,GCzBX,MAAME,WAAwB9F,GAE5BhoB,YAAYioB,EAAa5D,EAAK0J,EAAQlrB,GAEpC3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAIC,GAElBvsB,KAAKssB,OAAOE,eAAeF,GAG7B/tB,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM8J,IAE1BxF,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK8J,GAE5D1sB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,qLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCxCX,MAAMwE,WAAmBhG,GAEvBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAIO,GAGpBtuB,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM8J,IAE1BxF,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK8J,GAE5D1sB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QASAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,qLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCrCX,MAAM+E,WAA2BrC,GAO/BlsB,YAAYukB,EAAY4H,EAAQC,GAE9BlsB,MAAMqkB,EAAY4H,EAAQC,GAI5BpsB,kBAEE,MAAM4tB,EAAU,GAEhB,IAAK,IAAIpX,EAAI,EAAGA,EAAI/U,KAAK0qB,OAAO1pB,OAAQ+T,IACxC,CACE,MAAMqX,EAAapsB,KAAK0qB,OAAO3V,GAE/B,GAAIqX,EAAWW,MACf,CACE,MAAMC,EAAepC,GAAkBtf,IAAI,gBAE3C6gB,EAAQxtB,KAAK,IAAI0tB,GAAgBD,EAAW9rB,KAAM8rB,EAAWxJ,IAAKoK,EAAcZ,EAAWhrB,YAI3F+qB,EAAQxtB,KAAK,IAAI4tB,GAAWH,EAAW9rB,KAAM8rB,EAAWxJ,IAAKwJ,EAAWhrB,OAI5E,OAAO+qB,GC8EN,MAACc,GAAU,IApHhB,MAEE1uB,aAQE,OANAyB,KAAKktB,aAAe,GACpBltB,KAAKmtB,MAAQhR,OAAOiR,UAAUC,UAAUC,cAExCttB,KAAKutB,mBAAqB,OAAQH,UAClCptB,KAAKwtB,MAAQxtB,KAAKutB,0BAA4BH,UAAUniB,GAAGwiB,mBAAmB,iBAEtE,GAER,KAAKztB,KAAKmtB,MAAMO,QAAQ,SAAW,EACjC1tB,KAAKktB,aAAe,UACpB,MACF,KAAKltB,KAAKmtB,MAAMO,QAAQ,QAAU,EAChC1tB,KAAKktB,aAAe,gBACpB,MAEF,KAAKltB,KAAKmtB,MAAMO,QAAQ,QAAU,KAAOvR,OAAOwR,IAC9C3tB,KAAKktB,aAAe,QACpB,MAEF,KAAKltB,KAAKmtB,MAAMO,QAAQ,WAAa,KAAOvR,OAAOyR,OACjD5tB,KAAKktB,aAAe,SACpB,MACF,KAAKltB,KAAKmtB,MAAMO,QAAQ,YAAc,EACpC1tB,KAAKktB,aAAe,YACpB,MACF,KAAKltB,KAAKmtB,MAAMO,QAAQ,YAAc,EACpC1tB,KAAKktB,aAAe,UACpB,MACF,KAAKltB,KAAKmtB,MAAMO,QAAQ,WAAa,EACnC1tB,KAAKktB,aAAe,SACpB,MACF,QACEltB,KAAKktB,aAAe,QAItBltB,KAAK6tB,QAAU7tB,KAAK8tB,cAGtBxtB,WAEE,OAAON,KAAKktB,aAGda,gBAEE,MAA6B,WAAtB/tB,KAAKktB,aAGdc,gBAEE,MAA6B,WAAtBhuB,KAAKktB,aAGde,iBAEE,MAA6B,YAAtBjuB,KAAKktB,aAGdgB,cAEE,MAA6B,YAAtBluB,KAAKktB,aAGdiB,uBAEE,MAA6B,kBAAtBnuB,KAAKktB,aAGdkB,eAEE,SAAUpuB,KAAKguB,WAAahuB,KAAKiuB,YAAcjuB,KAAKmuB,kBAGtDE,eAEE,OAAOruB,KAAK+tB,UAGdO,gCAEE,OAAOtuB,KAAKouB,SAAW,OAASpuB,KAAKquB,SAAW,WAAa,MAG/D9vB,cAEE,MAAMgwB,EAAKnB,UAAUC,UACrB,IAAImB,EAAM,GACNX,EAAU,IAEVY,EAAIF,EAAGG,MAAM,iEAAmE,GAkBpF,MAhBI,WAAWC,KAAKF,EAAE,MAEpBD,EAAO,kBAAkBI,KAAKL,IAAO,GACrCV,EAAW,OAASW,EAAI,IAAM,KAEnB,WAATC,EAAE,KAEJD,EAAMD,EAAGG,MAAM,uBACJ,MAAPF,IAAaX,EAAUW,EAAIK,MAAM,GAAGC,KAAK,KAAKjL,QAAQ,MAAO,WAGnE4K,EAAIA,EAAE,GAAK,CAACA,EAAE,GAAIA,EAAE,IAAM,CAACrB,UAAU2B,QAAS3B,UAAU4B,WAAY,MACjB,OAA9CR,EAAMD,EAAGG,MAAM,6BAAqCD,EAAEQ,OAAO,EAAG,EAAGT,EAAI,IAE5EX,EAAUY,EAAEK,KAAK,KAEVxS,OAAOuR,EAAQhV,MAAM,KAAK,MC5G9B,MAAMqW,WAA2B3I,GAEtChoB,YAAYioB,EAAa5D,EAAKxhB,EAAM+tB,GAAQ,EAAMC,GAAmB,EAAOC,GAAuB,GAEjG5wB,MAAM+nB,EAAa5D,EAAKxhB,GAExBpB,KAAKqrB,aAAe,GAEpBrrB,KAAKqvB,qBAAuBA,EAC5BrvB,KAAKovB,iBAAmBA,EACxBpvB,KAAKmvB,MAAQA,EAGf5wB,sBAAsB2oB,GAEhBoI,GAAQvB,UAEV/tB,KAAKuvB,qBAAqBrI,GAI1BlnB,KAAKwvB,qBAAqBtI,GAI9B3oB,qBAAqB2oB,GAEnB,QAAsDviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAC7C,CACE,MAAMxb,EAAU,IAAIqoB,EACdnoB,EAAQ,IAAIooB,MAElBpoB,EAAMN,IAAMhH,KAAK4iB,IAEjBtb,EAAMqoB,OAAS,KAEbvoB,EAAQE,MAAQA,EAChBF,EAAQ+nB,MAAQnvB,KAAKmvB,MACrB/nB,EAAQgoB,iBAAmBpvB,KAAKovB,iBAChChoB,EAAQ8I,WAAalQ,KAAKqvB,qBAAuBO,EAAiBC,EAClEzoB,EAAQ0oB,aAAc,EAEtB5I,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKxb,GAE5DpH,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,mBAGPzgB,EAAMyoB,QAAU,KAEd9U,QAAQC,MAAM,yCAA0Clb,KAAKqrB,oBAK/DnE,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,kBAITxpB,qBAAqB2oB,GAEnB,QAAsDviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAC7C,CACE,MAAMoN,EAAe,CACrBzI,YAA2B,eAG3BF,MAAMrnB,KAAK4iB,IAAKoN,GAAcvI,MAAMwI,GAE3BA,EAAI/gB,SACVuY,MAAMvY,GAEAghB,kBAAkBhhB,EAAM,CAC7BmgB,qBAAsBrvB,KAAKqvB,qBAAuB,UAAY,OAC9Dc,iBAAkBnwB,KAAKmvB,MAAQ,QAAU,aACzCC,iBAAkBpvB,KAAKovB,iBAAmB,cAAgB,WAE3D3H,MAAM2I,IAEP,MAAMhpB,EAAU,IAAIqoB,EAAQW,GAC5BhpB,EAAQ+nB,MAAQnvB,KAAKmvB,MACrB/nB,EAAQgoB,iBAAmBpvB,KAAKovB,iBAChChoB,EAAQ8I,WAAalQ,KAAKqvB,qBAAuBO,EAAiBC,EAClEzoB,EAAQ0oB,aAAc,EAEtB5I,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKxb,GAE5DpH,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBACJJ,OAAOoE,IAER9Q,QAAQC,MAAM6Q,EAAG/rB,KAAKqrB,sBAKxBnE,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,mBCvGX,MAAMsI,WAAoB9J,GAExBhoB,YAAYioB,EAAa5D,EAAK0J,EAAQlrB,GAEpC3C,MAAM+nB,EAAa5D,EAAKxhB,GAExBpB,KAAKssB,OAASA,EAGhB/tB,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM0N,IAI1BpJ,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK0N,GAE5DtwB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,qLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCzCX,MAAMwI,WAAsBhK,GAE1BhoB,YAAYioB,EAAa5D,EAAK4N,EAAWpvB,GAEvC3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAImE,EAClBzwB,KAAKssB,OAAOoE,QAAQ9N,EAAM,KAC1B5iB,KAAK2wB,KAAO,CACV,MAAMH,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,KAIVjyB,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK2wB,MAAOrpB,IAE3B4f,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKtb,GAE5DtH,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAzR,IAEClb,KAAK4oB,YAAY,+EAAsF1N,GACvGlb,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBC/CX,MAAM6I,WAA6BrK,GAEjChoB,YAAYioB,EAAa5D,EAAK4N,EAAWpvB,GAEvC3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAIuE,GAClB7wB,KAAKssB,OAAOoE,QAAQ9N,EAAM,KAE1B5iB,KAAK2wB,KAAO,CACV,MAAMH,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,KAIVjyB,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK2wB,MAAOG,IAE3B5J,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKkO,GAE5D9wB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,qLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBChDX,MAAMgJ,WAA0BxK,GAE9BhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAI0E,GAGpBzyB,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAMkO,IAE1B5J,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKkO,GAE5D9wB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,qLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBClCX,MAAMkJ,WAA4BxG,GAEhClsB,YAAYukB,EAAY4H,EAAQC,GAE9BlsB,MAAMqkB,EAAY4H,EAAQC,GAI5BpsB,kBAEE,MAAM4tB,EAAU,GAEhB,IAAK,IAAIpX,EAAI,EAAGA,EAAI/U,KAAK0qB,OAAO1pB,OAAQ+T,IACxC,CACE,MAAMqX,EAAapsB,KAAK0qB,OAAO3V,GAE/B,OAAQqX,EAAW8E,MAEnB,IAAK,UACH/E,EAAQxtB,KAAK,IAAIuwB,GACf9C,EAAW9rB,KACX8rB,EAAWxJ,IACXwJ,EAAWhrB,KACXgrB,EAAW+C,MACX/C,EAAWgD,iBACXhD,EAAWiD,uBAGb,MACF,IAAK,QACHlD,EAAQxtB,KAAK,IAAI0xB,GACfjE,EAAW9rB,KACX8rB,EAAWxJ,IACXgI,GAAkBtf,IAAI,gBACtB8gB,EAAWhrB,OAGb,MACF,IAAK,MACH+qB,EAAQxtB,KAAK,IAAIoyB,GACf3E,EAAW9rB,KACX8rB,EAAWxJ,IACXwJ,EAAWhrB,OAGb,MACF,IAAK,UACH+qB,EAAQxtB,KAAK,IAAI4xB,GACfnE,EAAW9rB,KACX8rB,EAAWxJ,IACXwJ,EAAWoE,UACXpE,EAAWhrB,OAEb,MACF,IAAK,cACH+qB,EAAQxtB,KAAK,IAAIiyB,GACfxE,EAAW9rB,KACX8rB,EAAWxJ,IACXwJ,EAAWoE,UACXpE,EAAWhrB,QASjB,OAAO+qB,GC5EX,MAAMgF,GAEJ5yB,YAAY6yB,GAEVpxB,KAAKoxB,YAAcA,EACnBpxB,KAAKqxB,cAAe,EAEpBrxB,KAAKsxB,MAAQ,EAGf/yB,SAEOyB,KAAK2gB,gBAEJ3gB,KAAKoxB,YAAYpxB,KAAKsxB,OAAOC,UAE/BvxB,KAAKsxB,QACLtxB,KAAKqxB,cAAe,GAIhBrxB,KAAKqxB,cAEPrxB,KAAKoxB,YAAYpxB,KAAKsxB,OAAOE,QAC7BxxB,KAAKqxB,cAAe,GAIpBrxB,KAAKoxB,YAAYpxB,KAAKsxB,OAAOplB,UAMrC3N,cAEE,OAAOyB,KAAKsxB,QAAUtxB,KAAKoxB,YAAYpwB,QC7BpC,MAAMywB,GAEXlzB,YAAYiC,GAAOkxB,gBAAEA,EAAeC,mBAAEA,EAAkBC,iBAAEA,IAExD5xB,KAAKQ,MAAQA,EAEbR,KAAK0xB,gBAAkBA,EACvB1xB,KAAK2xB,mBAAqBA,EAC1B3xB,KAAK4xB,iBAAmBA,EAExB5xB,KAAKmsB,QAAU,GACfnsB,KAAKoxB,YAAc,GAEnBpxB,KAAK6xB,iBAAkB,EAGzBtzB,WAAWuzB,EAAeC,EAAgBC,EAAcC,EAAiB,GAAIC,EAAqB,GAAIC,EAAc,IAElHnyB,KAAK8xB,cAAgBA,EACrB9xB,KAAK+xB,eAAiBA,EACtB/xB,KAAKgyB,aAAeA,EAEpBhyB,KAAKiyB,eAAiBA,EACtBjyB,KAAKkyB,mBAAqBA,EAC1BlyB,KAAKmyB,YAAcA,EAGrBC,uBAEE,IAAIC,EAAW,EAEf,IAAK,IAAItd,EAAI,EAAGA,EAAI/U,KAAKmsB,QAAQnrB,OAAQ+T,IACzC,CAEEsd,GADeryB,KAAKmsB,QAAQpX,GACTiM,eAErB,OAAOqR,EAAWryB,KAAKmsB,QAAQnrB,OAGjCzC,OAEEyB,KAAKsyB,eAILtyB,KAAKmsB,QAAQ,GAAGM,OAGlBluB,YAIAA,WAIAA,UAKAA,eAEE,MAAM6yB,EAAc,GAEdmB,EAAgB3H,GAAkBtf,IAAI,iBAC5CinB,EAAcrH,YAAY,CAAE9a,KAAM,QAAS+a,YAAanrB,KAAKQ,MAAMF,OAEnE,MAAMkyB,EAAgB,IAAI1F,GAAmB9sB,KAAKQ,MAAMF,KAAMN,KAAK8xB,cAAeS,GAClFvyB,KAAKmsB,QAAQxtB,KAAK6zB,GAClBpB,EAAYzyB,KAAK,IAAIqB,KAAK0xB,gBAAgB1xB,KAAKQ,QAE/C,MAAMiyB,EAAkB,IAAIxB,GAAoBjxB,KAAKQ,MAAMF,KAAMN,KAAK+xB,eAAgBQ,GACtFvyB,KAAKmsB,QAAQxtB,KAAK8zB,GAClBrB,EAAYzyB,KAAK,IAAIqB,KAAK2xB,mBAAmBc,EAAgBC,qBAE7D,MAAMC,EAAgB,IAAIzG,GAAkBlsB,KAAKQ,MAAMF,KAAMN,KAAKgyB,aAAcO,GAChFvyB,KAAKmsB,QAAQxtB,KAAKg0B,GAClBvB,EAAYzyB,KAAK,IAAIqB,KAAK4xB,iBAAiBe,EAAcD,qBAEzD,IAAK,IAAI3d,EAAI,EAAGA,EAAI/U,KAAKiyB,eAAejxB,OAAQ+T,IAChD,CACE,MAAMuX,EAAS,IAAItsB,KAAKiyB,eAAeld,GAAG/U,KAAKQ,MAAMF,KAAMN,KAAKmyB,YAAYpd,GAAIwd,GAChFvyB,KAAKmsB,QAAQxtB,KAAK2tB,GAClB8E,EAAYzyB,KAAK,IAAIqB,KAAKkyB,mBAAmBnd,GAAGuX,EAAOoG,qBAGzD1yB,KAAK4yB,mBAAqB,IAAIzB,GAAkBC,GAGlD7yB,YAEE,IAAIuoB,GAAS,EAEb,IAAK,IAAI/R,EAAI,EAAGA,EAAI/U,KAAKmsB,QAAQnrB,OAAQ+T,IACzC,CACE,MAAMuX,EAAStsB,KAAKmsB,QAAQpX,GAE5B+R,EAASA,GAAUwF,EAAOuG,YAG5B,OAAO/L,EAGTvoB,cAGE,OADAyB,KAAK4yB,mBAAmB1mB,SACjBlM,KAAK4yB,mBAAmBjS,eChH5B,MAAMmS,WAAgCrB,GAE3ClzB,WAEEE,MAAMuN,WAIRzN,UAEEE,MAAMsN,UAGRxN,SAEEE,MAAMyN,SAEFlM,KAAK6yB,aAIP7yB,KAAKQ,MAAMuyB,gCCrBV,MAAMC,WAA4BvB,GAEvClzB,YAAYiC,EAAO4wB,GAEjB3yB,MAAM+B,EAAO4wB,GAEbpxB,KAAKizB,wBAAyB,EAGhC10B,WAEEE,MAAMuN,WAIRzN,UAEEE,MAAMsN,UAGRxN,SAEEE,MAAMyN,SAEFlM,KAAK6yB,cAEF7yB,KAAKizB,yBAERjzB,KAAKQ,MAAM0yB,kBACXlzB,KAAKizB,wBAAyB,GAG5BjzB,KAAKmzB,eAEPnzB,KAAKQ,MAAM4yB,uBC7BnB,MAAMC,WAAsBhzB,EAE1B9B,aAAY+B,KAAEA,EAAI8wB,YAAEA,IAElB3yB,QAEAuB,KAAKM,KAAOA,EAEZN,KAAKszB,aAAc,EACnBtzB,KAAK6yB,WAAY,EACjB7yB,KAAKuzB,gBAAiB,EAEtBvzB,KAAKwzB,eAAiB,CACpBC,QAAS,IAAIT,GAAoBhzB,KAAMoxB,GACvCsC,KAAM,IAAIZ,GAAwB9yB,KAAMoxB,IAG1CpxB,KAAK2zB,sBAAwB,IAAIlC,GAAazxB,KAAMoxB,GAItDgB,uBAEE,OAAOpyB,KAAK2zB,sBAAsBvB,iBAGpC7zB,OAEEyB,KAAKszB,aAAc,EAGrB/0B,OAEOyB,KAAKszB,aAERtzB,KAAK4zB,OAGP5zB,KAAK6zB,kBAAkB7zB,KAAKwzB,eAAeC,SAC3CzzB,KAAK2zB,sBAAsBlH,OAG7BluB,cAEE,MAAMu1B,EAAU,GAmBhB,OAjBA9zB,KAAKS,UAASC,IAERA,EAAMC,UAERmzB,EAAQn1B,KAAK+B,MAaVozB,EAGTv1B,cAEEyB,KAAKS,UAASC,IAEZ,GAAIA,EAAMC,WAERD,EAAMC,SAASozB,WAAWhyB,SAASiyB,MAAQ,IAAIvjB,aAAa,GACxD/P,EAAMC,SAASozB,WAAWE,SAE5BvzB,EAAMC,SAASozB,WAAWE,OAAOD,MAAQ,IAAIvjB,aAAa,IAExD/P,EAAMC,SAASozB,WAAWG,KAE5BxzB,EAAMC,SAASozB,WAAWG,GAAGF,MAAQ,IAAIvjB,aAAa,IAEpD/P,EAAMI,SAASqzB,KAEjB,IAAK,IAAIpf,EAAI,EAAGA,EAAIrU,EAAMI,SAASqzB,IAAIC,QAAQpzB,OAAQ+T,IAErDrU,EAAMI,SAASqzB,IAAIC,QAAQrf,GAAK,IAAIsf,WAAW,MAQvDr0B,KAAKszB,aAAc,EAGrB/0B,UAEEyB,KAAKS,UAASC,IAERA,EAAMI,WAEJJ,EAAMI,SAASqzB,KAEjBzzB,EAAMI,SAASqzB,IAAIvzB,UAGrBF,EAAMI,SAASF,UACfF,EAAMC,SAASC,cAKnBZ,KAAKszB,aAAc,EAGrB/0B,WAAWuzB,EAAeC,EAAgBC,EAAcC,EAAgBC,EAAoBC,GAE1FnyB,KAAKwzB,eAAeC,QAAQa,WAAWxC,EAAeC,EAAgBC,EAAcC,EAAgBC,EAAoBC,GAG1H5zB,gBAAgBuzB,EAAeC,EAAgBC,EAAcC,EAAgBC,EAAoBC,GAE/FnyB,KAAKwzB,eAAeE,KAAKY,WAAWxC,EAAeC,EAAgBC,EAAcC,EAAgBC,EAAoBC,GAGvH5zB,kBAAkB0gB,GAEhBjf,KAAK2zB,sBAAsB5nB,UAC3B/L,KAAK2zB,sBAAwB1U,EAC7Bjf,KAAK2zB,sBAAsB3nB,WAI7BzN,uBAEOyB,KAAKuzB,gBAERvzB,KAAK2zB,sBAAsBznB,SAI/B3N,SAEEyB,KAAKu0B,uBAGPh2B,mBAKAA,qBAEEyB,KAAK6yB,WAAY,EAGjB7yB,KAAK6zB,kBAAkB7zB,KAAKwzB,eAAeE,MAC3C1zB,KAAK2zB,sBAAsBlH,OAG7BluB,+BAEEyB,KAAKuzB,gBAAiB,GCtK1B,MAAMiB,WAAwB7U,GAE5BphB,aAAY+B,KAAEA,EAAIsiB,IAAEA,EAAG6R,UAAEA,EAASrV,gBAAEA,IAElC3gB,MAAM6B,GAENN,KAAKy0B,UAAYA,EACjBz0B,KAAK4iB,IAAMA,EAEX5iB,KAAK00B,gBAAkB,EAOvB,MAAMnV,EAAc,CAClB,CACE9M,GAAInS,EACJ6c,KARJiC,EAAkBA,GAAmB,CACnCtC,iBAAkB,GAClBC,SAAU,MAUZ2H,GAAYiQ,cAAc30B,MAC1BgiB,GAAkBX,gBAAgB9B,GAGpChhB,eAEEyB,KAAKy0B,UAAUG,UAAU30B,IAAI,gBAC7BD,KAAKy0B,UAAUG,UAAU3zB,OAAO,eAChCjB,KAAKy0B,UAAUG,UAAU3zB,OAAO,UAGlC1C,WAEEyB,KAAKy0B,UAAUG,UAAU3zB,OAAO,gBAChCjB,KAAKy0B,UAAUG,UAAU3zB,OAAO,eAChCjB,KAAKy0B,UAAUG,UAAU3zB,OAAO,UAGlC1C,cAEEyB,KAAKy0B,UAAUG,UAAU30B,IAAI,eAC7BD,KAAKy0B,UAAUG,UAAU3zB,OAAO,gBAChCjB,KAAKy0B,UAAUG,UAAU3zB,OAAO,UAGlC1C,UAEEyB,KAAKy0B,UAAUG,UAAU30B,IAAI,UAC7BD,KAAKy0B,UAAUG,UAAU3zB,OAAO,gBAChCjB,KAAKy0B,UAAUG,UAAU3zB,OAAO,eAGlC1C,YAAY4hB,GAEV,MAAM0U,EAAU1U,EAAmB,GAAGngB,KAAKM,iBAEvCN,KAAK00B,gBAAkBG,GAAW70B,KAAK00B,gBAAkBG,KAE3D70B,KAAK00B,gBAAkBG,EAEvB70B,KAAKy0B,UAAUK,MAAMD,QAAU70B,KAAK00B,kBC5D1C,MAAMK,GAKJx2B,YAAYy2B,GAEVh1B,KAAKg1B,oBAAsBA,EAC3Bh1B,KAAKi1B,aAAe,KAEpBj1B,KAAKoJ,OAASwF,SAASC,cAAc,UACrC7O,KAAK6R,IAAM7R,KAAKoJ,OAAO0B,WAAW,MAGpCvM,cAAc22B,EAAY,SAExB,GAAyB,MAArBl1B,KAAKi1B,cAAwBj1B,KAAKg1B,kBACtC,CACE,MAAM7M,EAAOvZ,SAASumB,qBAAqB,QAAQ,GAC7CC,EAAQxmB,SAASC,cAAc,OAC/BwmB,EAAYzmB,SAAS0mB,eAAe,eAC1CF,EAAMG,YAAYF,GAClBD,EAAMI,aAAa,QAAS,QAAQN,oCACpC/M,EAAKoN,YAAYH,GACjBp1B,KAAKi1B,aAAeG,EAAMK,aAC1BtN,EAAKuN,YAAYN,GAEnB,OAAOp1B,KAAKi1B,aAOd12B,cAAco3B,EAAMC,EAAO,cAEzB,MAAMx0B,EAAO,IAAIgC,EAIjB,OAHApD,KAAK6R,IAAI+jB,KAAOA,EAChBx0B,EAAKG,EAAI+M,KAAKC,KAAKvO,KAAK6R,IAAIgkB,YAAYF,GAAMzyB,OAC9C9B,EAAKI,EAAI8M,KAAKC,KAAKvO,KAAK81B,cAAcF,IAC/Bx0B,EAOT7C,YAAYo3B,EAAMI,EAAa,IAM7B,OAJAA,EAAWH,KAAOG,EAAWH,MAAQ,aACrCG,EAAWC,WAAaD,EAAWC,YAAc,UAEjDh2B,KAAKi2B,OAAON,EAAMI,EAAY/1B,KAAKoJ,OAAQpJ,KAAK6R,KACzC7R,KAAKoJ,OAOd7K,gBAAgBo3B,EAAMI,GAEpB,MAAM3sB,EAASpJ,KAAKk2B,YAAYP,EAAMI,GAChCI,EAAiB,IAAIC,EAAchtB,EAAQitB,EAC/CC,EACAA,EACAxmB,EACAA,GAIF,OAHAqmB,EAAeI,iBAAkB,EACjCJ,EAAerG,aAAc,EAEtBqG,EAST53B,OAAOo3B,EAAMI,EAAY3sB,EAAQyI,IAajCtT,UAAUsT,EAAKtQ,EAAGC,EAAG0B,EAAOC,EAAQvB,EAAQ40B,EAAMzjB,GAUhD,QARsB,IAAXA,IAETA,GAAS,QAEW,IAAXnR,IAETA,EAAS,GAEW,iBAAXA,EAETA,EAAS,CAAE60B,GAAI70B,EAAQ80B,GAAI90B,EAAQ+0B,GAAI/0B,EAAQg1B,GAAIh1B,OAGrD,CACE,MAAMi1B,EAAgB,CAAEJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACjD,IAAK,MAAME,KAAQD,EACnB,CACE,MAAME,IACNn1B,EAAOm1B,GAASn1B,EAAOm1B,IAAUF,EAAcE,IAGnDllB,EAAIc,YACJd,EAAIe,OAAOrR,EAAIK,EAAO60B,GAAIj1B,GAC1BqQ,EAAIgB,OAAOtR,EAAI2B,EAAQtB,EAAO80B,GAAIl1B,GAClCqQ,EAAImlB,iBAAiBz1B,EAAI2B,EAAO1B,EAAGD,EAAI2B,EAAO1B,EAAII,EAAO80B,IACzD7kB,EAAIgB,OAAOtR,EAAI2B,EAAO1B,EAAI2B,EAASvB,EAAO+0B,IAC1C9kB,EAAImlB,iBAAiBz1B,EAAI2B,EAAO1B,EAAI2B,EAAQ5B,EAAI2B,EAAQtB,EAAO+0B,GAAIn1B,EAAI2B,GACvE0O,EAAIgB,OAAOtR,EAAIK,EAAOg1B,GAAIp1B,EAAI2B,GAC9B0O,EAAImlB,iBAAiBz1B,EAAGC,EAAI2B,EAAQ5B,EAAGC,EAAI2B,EAASvB,EAAOg1B,IAC3D/kB,EAAIgB,OAAOtR,EAAGC,EAAII,EAAO60B,IACzB5kB,EAAImlB,iBAAiBz1B,EAAGC,EAAGD,EAAIK,EAAO60B,GAAIj1B,GAC1CqQ,EAAIiB,YACA0jB,GAEF3kB,EAAI2kB,OAEFzjB,GAEFlB,EAAIkB,UCvIV,MAAMkkB,WAAyBlC,GAE7Bx2B,cAEEE,QACAuB,KAAKk3B,YAAc,IAAI9zB,EAAQ,EAAG,GASpC7E,OAAOo3B,EAAMI,EAAY3sB,EAAQyI,GAE/BA,EAAI+jB,KAAOG,EAAWH,KAEtB,MAAMuB,EAAYn3B,KAAKo3B,cAAczB,EAAMI,EAAWH,MAGtDxsB,EAAOlG,MAAQoL,KAAKC,KAAK4oB,EAAU51B,EAAyB,EAArBvB,KAAKk3B,YAAY31B,GACxD6H,EAAOjG,OAASmL,KAAKC,KAAK4oB,EAAU31B,EAAyB,EAArBxB,KAAKk3B,YAAY11B,GACzDqQ,EAAIU,UAAU,EAAG,EAAGnJ,EAAOlG,MAAOkG,EAAOjG,QAGzC0O,EAAIwlB,YAAc,EAClBxlB,EAAIQ,UAAY0jB,EAAWC,YAAc,UACzCnkB,EAAIS,SAAS,EAAG,EAAGlJ,EAAOlG,MAAOkG,EAAOjG,QACxC0O,EAAIwlB,YAAc,EAElBxlB,EAAIwlB,YAAc,EAElBxlB,EAAI+jB,KAAOG,EAAWH,KACtB/jB,EAAIQ,UAAY0jB,EAAWC,YAAc,UACzCnkB,EAAIylB,aAAe,SAEnBzlB,EAAI0lB,UAAYxB,EAAWwB,WAAa,SAClB,WAAlB1lB,EAAI0lB,UAEN1lB,EAAI2lB,SAAS7B,EAAMvsB,EAAOlG,MAAQ,EAAGkG,EAAOjG,OAAS,GAIrD0O,EAAI2lB,SAAS7B,EAAM,EAAGvsB,EAAOjG,OAAS,ICjD5C,MAAMs0B,GAEJl5B,eAIAm5B,mBAEE,OAAO,EAGTn5B,SAAS4kB,IAKT5kB,OAAO4kB,IAIP5kB,QAAQ4kB,KChBV,MAAMwU,GAEJp5B,cAEEyB,KAAKuX,EAAI,EACTvX,KAAK43B,kBAAoB,EAG3BF,mBAEE,OAAO,EAGTn5B,SAASs5B,IAITt5B,OAAOs5B,GAEL73B,KAAKuX,GAAKuJ,GAAKlL,WAAaiiB,EAASpd,SAErCza,KAAK43B,kBAAoBC,EAASpe,gBAAgBzZ,KAAKuX,GACvDvX,KAAK43B,kBAAoBxhB,GAAMmC,MAAMvY,KAAK43B,kBAAmB,EAAG,GAEhEC,EAASC,mBAAmB1hB,GAAMqB,KAAKogB,EAASrlB,KAAMqlB,EAASplB,GAAIzS,KAAK43B,oBAEpE53B,KAAK43B,mBAAqB,QAE5BC,EAASC,mBAAmBD,EAASplB,IAErColB,EAASE,kBAAkB,IAAIN,IAC/BI,EAASG,kBAAkBH,IAI/Bt5B,QAAQ4kB,KCnCV,MAAM8U,GAEJ15B,aAAYqgB,QACVA,EAAOsZ,aACPA,EAAY1lB,KACZA,EAAO,EAACC,GACRA,EAAK,EAACgI,SACNA,EAAW,EAAC0d,aACZA,EAAe,GAAEC,aACjBA,EAAgB,GAAE3e,gBAClBA,EAAkBX,GAAgBuf,kBAAiBL,kBACnDA,EAAoB,WAIpBh4B,KAAK4e,QAAUA,EACf5e,KAAKk4B,aAAeA,EACpBl4B,KAAKwS,KAAOA,EACZxS,KAAKyS,GAAKA,EACVzS,KAAKm4B,aAAeA,EACpBn4B,KAAKo4B,aAAeA,EACpBp4B,KAAKya,SAAWA,EAChBza,KAAKyZ,gBAAkBA,EACvBzZ,KAAKg4B,kBAAoBA,EAEzBh4B,KAAKkgB,cAAgB,IAAIuX,GAG3Bl5B,UAEEyB,KAAK+3B,kBAAkB,IAAIJ,IAG7Bp5B,OAEEyB,KAAK+3B,kBAAkB,IAAIN,IAG7Bl5B,mBAAmByE,GAEjBhD,KAAK4e,QAAQkW,MAAM90B,KAAKk4B,cAAgB,GAAGl4B,KAAKm4B,eAAen1B,IAAQhD,KAAKo4B,eAG9E75B,SAEEyB,KAAKkgB,cAAchU,OAAOlM,MAG5B03B,mBAEE,OAAO13B,KAAKkgB,cAAcwX,aAG5Bn5B,kBAAkB0gB,GAEhBjf,KAAKkgB,cAAcnU,QAAQ/L,MAC3BA,KAAKkgB,cAAgBjB,EACrBjf,KAAKkgB,cAAclU,SAAShM,OCJ3B,MAACs4B,GAAK,IAxDX,MAEE/5B,OAEEyB,KAAKu4B,kBAAoB,CACvBC,QAAS,UACTC,IAAK,MACLC,MAAO,QACPC,IAAK,MACLC,QAAS,WAGX54B,KAAK64B,YAAezL,UAAUC,UAAUqB,MAAM,+GAC9C1uB,KAAK84B,WAAa1L,UAAUC,UAAUqB,MAAM,QAAUtB,UAAU2L,gBAAkB3L,UAAU2L,eAAiB,GAC7G/4B,KAAKg5B,SAAW5L,UAAUC,UAAUqB,MAAM,uBAAyB1uB,KAAK84B,QAExE94B,KAAKi5B,WAAaj5B,KAAKk5B,WAAal5B,KAAKu4B,kBAAkBC,QAC3Dx4B,KAAKm5B,SAAWn5B,KAAKk5B,WAAal5B,KAAKu4B,kBAAkBG,MACzD14B,KAAKo5B,OAASp5B,KAAKk5B,WAAal5B,KAAKu4B,kBAAkBI,IACvD34B,KAAKq5B,WAAar5B,KAAKk5B,WAAal5B,KAAKu4B,kBAAkBK,QAG7Dr6B,SAEE,MAAM8uB,EAAYlR,OAAOiR,UAAUC,UAC7BiM,EAAWnd,OAAOiR,UAAUkM,SAIlC,IAAIhB,EAAK,KAuBT,OArB0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxC5K,QAAQ4L,GAEzBhB,EAAKt4B,KAAKu4B,kBAAkBI,KAEe,IAPxB,CAAC,SAAU,OAAQ,QAOlBjL,QAAQ4L,GAE5BhB,EAAKt4B,KAAKu4B,kBAAkBE,KAEmB,IAZxB,CAAC,QAAS,QAAS,UAAW,SAY7B/K,QAAQ4L,GAEhChB,EAAKt4B,KAAKu4B,kBAAkBK,QAErB,UAAUjK,KAAKtB,GAEtBiL,EAAKt4B,KAAKu4B,kBAAkBC,SAEpBF,GAAM,QAAQ3J,KAAK2K,KAE3BhB,EAAKt4B,KAAKu4B,kBAAkBG,OAGvBJ,ICjCX,MAAMiB,GAA2B,IAjBjC,MAEEh7B,OAEEyB,KAAKw5B,qBAAkB70B,EACvB3E,KAAKy5B,gBAAkB,IAAI76B,EAM7BL,oBAAoBoC,GAElBX,KAAKw5B,gBAAkB74B,ICd3B,MAAM+4B,GAEJn7B,YAAYoC,EAAUg5B,GAEpB35B,KAAKW,SAAWA,EAEhBX,KAAKc,cAAW6D,EAChB3E,KAAKgG,SAAW,GAChBhG,KAAK25B,YAAcA,EAEnB35B,KAAK45B,cAAgB,GAErB55B,KAAK65B,kBAAel1B,EAEpB3E,KAAK85B,YAAc,IAAI12B,EACvBpD,KAAK+5B,aAAe,IAAI32B,EAExBpD,KAAKg6B,oBAAsB,EAE3Bh6B,KAAKi6B,wBAA0B,EAGjC17B,KAAKs7B,EAAc/zB,EAAaD,GAE9B7F,KAAKc,SAAW,IAAI8E,EAAe,CACjCI,SAAUhG,KAAKgG,SACfI,aAAcN,EACdO,eAAgBR,IAElB7F,KAAK65B,aAAeA,EAGtBt7B,mBAAmB+B,EAAM6c,GAEvBnd,KAAKgG,SAAS1F,GAAQ,CAAE0C,MAAOma,GAC/Bnd,KAAKc,SAASgvB,aAAc,EAG9BvxB,mBAAmB+B,EAAM6c,GAEvBnd,KAAKgG,SAAS1F,GAAM0C,MAAQma,EAG9B5e,sBAAsB27B,EAAcC,GAElC,MAAMC,EAAgBp6B,KAAKq6B,qBAAqBr6B,KAAK25B,aAC/CW,EAAgBt6B,KAAKq6B,qBAAqBr6B,KAAK25B,aAC/CY,EAAgBv6B,KAAKq6B,qBAAqB,GAE1CG,EAAex6B,KAAKy6B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEJ,GAEFn6B,KAAK06B,yBAAyBF,EAAcL,GAIhD57B,sBAAsB27B,EAAcS,GAElC,MAAMP,EAAgBp6B,KAAK46B,sBAAsB56B,KAAK25B,aAChDW,EAAgBt6B,KAAK46B,sBAAsB56B,KAAK25B,aAChDY,EAAgBv6B,KAAK46B,sBAAsB,GAE3CJ,EAAex6B,KAAKy6B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEI,GAEF36B,KAAK66B,0BAA0BL,EAAcG,GAIjDp8B,4BAA4B27B,EAAcS,GAExC,MAAMP,EAAgBp6B,KAAK86B,4BAA4B96B,KAAK25B,aACtDW,EAAgBt6B,KAAK86B,4BAA4B96B,KAAK25B,aACtDY,EAAgBv6B,KAAK86B,4BAA4B,GAEjDN,EAAex6B,KAAKy6B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEI,GAEF36B,KAAK66B,0BAA0BL,EAAcG,GAIjDp8B,sBAAsBw8B,EAAab,EAAcc,EAASC,EAAOC,EAAOC,GAEtE,MAAMC,EAAYp7B,KAAKq7B,mBAAmBN,GACpCO,EAAet7B,KAAKu7B,mBAAmBrB,GAE7Cl6B,KAAKw7B,gBAAgBF,EAAat0B,IAAKo0B,EAAWJ,EAASC,EAAOC,EAAOC,GACzEn7B,KAAKw7B,gBAAgBF,EAAaG,UAAW,EAAGT,EAASC,EAAOC,EAAOC,GAEvEG,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfp9B,sBAAsBw8B,EAAab,EAAc0B,EAASX,EAAOC,EAAOC,EAAOU,GAE7E,MAAMT,EAAYp7B,KAAKq7B,mBAAmBN,GACpCO,EAAet7B,KAAKu7B,mBAAmBrB,GAE7Cl6B,KAAK87B,iBAAiBR,EAAat0B,IAAKo0B,EAAWQ,EAASX,EAAOC,EAAOC,EAAOU,GACjF77B,KAAK87B,iBAAiBR,EAAaG,UAAW,EAAGG,EAASX,EAAOC,EAAOC,EAAOU,GAC/EP,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfp9B,oBAAoBmH,EAAUq2B,GAE5B,IAAK,IAAIhnB,EAAI,EAAGA,EAAI/U,KAAK45B,cAAc54B,OAAQ+T,IAEzCgnB,EAAgB,GAAK/7B,KAAK45B,cAAc7kB,GAAG4mB,YAAc,IAEjB,IAAtC37B,KAAK45B,cAAc7kB,GAAG4mB,aAExB37B,KAAKg8B,8BAA8Bt2B,EAAU1F,KAAK45B,cAAc7kB,IAE9D/U,KAAK45B,cAAc7kB,GAAG4mB,YAAc,GAEtC37B,KAAKi8B,2BAA2Bv2B,EAAU1F,KAAK45B,cAAc7kB,IAG/D/U,KAAK45B,cAAc7kB,GAAG4mB,YAAc,EAEpCI,KAKNx9B,0BAEEyB,KAAKg6B,oBAAsB,EAC3B,IAAK,IAAIjlB,EAAI,EAAGA,EAAI/U,KAAK45B,cAAc54B,OAAQ+T,IAEzC/U,KAAK45B,cAAc7kB,GAAG4mB,YAAc,GAEtC37B,KAAKg6B,sBAGT,OAAOh6B,KAAKg6B,oBAGdz7B,2BAA2BmH,EAAUw2B,GAGnCA,EAAaj1B,IAAI6oB,aAAc,EAC/BpqB,EAASy2B,qBACPn8B,KAAK85B,YACLoC,EAAal1B,IACbk1B,EAAaj1B,KAIjB1I,8BAA8BmH,EAAUw2B,GAGtC,MAAM5K,EAAQ4K,EAAaR,qBACZ,IAAXpK,IAKJtxB,KAAK+5B,aAAav4B,EAAI8M,KAAK+J,MAAMiZ,EAAQtxB,KAAK25B,aAC9C35B,KAAK+5B,aAAax4B,EAAI+vB,EAAQtxB,KAAK25B,YAAc35B,KAAK+5B,aAAav4B,EACnEkE,EAASy2B,qBACPn8B,KAAK+5B,aACLmC,EAAaT,UACbS,EAAaj1B,MAIjB1I,WAEE,OAAO,IAAI4C,EAAKnB,KAAKW,SAAUX,KAAKc,UAGtCvC,gBAAgB+8B,EAAchK,EAAO0J,EAASC,EAAOC,EAAOC,GAEtDF,IAEFK,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAK0J,EAAQz5B,GAE/C25B,IAEFI,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAK0J,EAAQx5B,GAE/C25B,IAEFG,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAK0J,EAAQv5B,GAIrDlD,iBAAiB+8B,EAAchK,EAAOsK,EAASX,EAAOC,EAAOC,EAAOU,GAE9DZ,IAEFK,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAKsK,EAAQr6B,GAE/C25B,IAEFI,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAKsK,EAAQp6B,GAE/C25B,IAEFG,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAKsK,EAAQn6B,GAE/Co6B,IAEFP,EAAah0B,MAAM6V,KAAa,EAARmU,EAAY,GAAKsK,EAAQ1qB,GAIrD3S,yBAAyB+8B,EAAcc,GAErC,IAAK,IAAIrnB,EAAI,EAAGA,EAAI/U,KAAK25B,YAAc35B,KAAK25B,YAAa5kB,IAEvD/U,KAAKw7B,gBAAgBF,EAAat0B,IAAK+N,EAAGqnB,GAAI,GAAM,GAAM,GAC1Dd,EAAaK,cAIjBp9B,0BAA0B+8B,EAAce,GAEtC,IAAK,IAAItnB,EAAI,EAAGA,EAAI/U,KAAK25B,YAAc35B,KAAK25B,YAAa5kB,IAEvD/U,KAAK87B,iBAAiBR,EAAat0B,IAAK+N,EAAGsnB,GAAI,GAAM,GAAM,GAAM,GACjEf,EAAaK,cAIjBp9B,qBAAqB2E,GAEnB,MAAMia,EAAO,IAAIkX,WAAW,EAAInxB,EAAQA,GACxC,OAAO,IAAIo5B,EAAYnf,EAAMja,EAAOA,EAAO+M,GAG7C1R,sBAAsB2E,GAEpB,MAAMia,EAAO,IAAIkX,WAAW,EAAInxB,EAAQA,GACxC,OAAO,IAAIo5B,EAAYnf,EAAMja,EAAOA,EAAO+M,GAG7C1R,4BAA4B2E,GAE1B,MAAMia,EAAO,IAAI1M,aAAa,EAAIvN,EAAQA,GAC1C,OAAO,IAAIo5B,EAAYnf,EAAMja,EAAOA,EAAO+M,EAAYI,GAGzD9R,mBAAmB27B,GAEjB,IAAK,IAAInlB,EAAI,EAAGA,EAAI/U,KAAK45B,cAAc54B,OAAQ+T,IAE7C,GAAI/U,KAAK45B,cAAc7kB,GAAGzU,OAAS45B,EAEjC,OAAOl6B,KAAK45B,cAAc7kB,GAG9BkG,QAAQC,MAAM,gBAAkBgf,EAAe,mBAIjD37B,mBAAmB+B,GAEjB,IAAK,IAAIyU,EAAI,EAAGA,EAAI/U,KAAK65B,aAAa74B,OAAQ+T,IAE5C,GAAI/U,KAAK65B,aAAa9kB,KAAOzU,EAE3B,OAAOyU,EAGXkG,QAAQC,MAAM,YAAc5a,EAAO,mCAIrC/B,mBAAmB27B,EAAchzB,EAAaq1B,EAAaC,GAczD,OAZAD,EAAYzM,aAAc,EAE1B9vB,KAAK45B,cAAcj7B,KAAK,CACtB2B,KAAM45B,EACNlzB,IAAKE,EACLD,IAAKs1B,EACLd,UAAWe,EACXd,qBAAsB,EACtBC,YAAa,IAGf37B,KAAKgG,SAASk0B,GAAgB,CAAEl3B,MAAOu5B,GAChCv8B,KAAK45B,cAAc55B,KAAK45B,cAAc54B,OAAS,GAGxDzC,UAEE,IAAK,IAAIwW,EAAI,EAAGA,EAAI/U,KAAK45B,cAAc54B,OAAQ+T,IAE7C/U,KAAK45B,cAAc7kB,GAAG/N,IAAIpG,UAC1BZ,KAAK45B,cAAc7kB,GAAG9N,IAAIrG,UAC1BZ,KAAK45B,cAAc7kB,GAAG0mB,UAAU76B,WChPtC,MAAM67B,GAAmB,IAvDzB,MAEEl+B,OAEEyB,KAAK08B,QAAU,GAGjBn+B,MAAMo+B,GAEJ,MAAMC,EAAoB,GACpBC,EAAgBzmB,GAAM0mB,eAAexuB,KAAK4K,KAAKyjB,EAAkB37B,SAGvEhB,KAAK+8B,gBAAgBH,EAAmBC,GAExC,IAAIG,EAAW,EAEf,IAAK,IAAIjoB,EAAI,EAAGA,EAAI4nB,EAAkB37B,OAAQ+T,IAC9C,CACE,MAAMkoB,EAAeN,EAAkB5nB,GAAGqI,aAAa,YAAY8f,MAC7D17B,EAAI8M,KAAK+J,MAAMtD,EAAI8nB,GACnBt7B,EAAIwT,EAAI8nB,EAAgBr7B,EAC9B,IAAK,IAAI07B,EAAQ,EAAGA,EAAQD,EAAcC,IAExCN,EAAkBI,GAAaz7B,EAAIs7B,EAAiB,GAAMA,EAC1DD,EAAkBI,EAAW,GAAMx7B,EAAIq7B,EAAiB,GAAMA,EAC9DG,GAAY,EAIhB,MAAMG,EAAmB,IAAIC,EAAgB,IAAI3sB,aAAamsB,GAAoB,GAC5En6B,EAAkBC,GAAoBC,gBAAgBg6B,GAI5D,OAHAl6B,EAAgB+yB,aAAa,mBAAoB2H,GAEjDn9B,KAAK08B,QAAQ/9B,KAAK,IAAI+6B,GAAcj3B,EAAiBo6B,IAC9C78B,KAAK08B,QAAQ18B,KAAK08B,QAAQ17B,OAAS,GAG5CzC,oBAAoBmH,GAElB,IAAK,IAAIqP,EAAI,EAAGA,EAAI/U,KAAK08B,QAAQ17B,OAAQ+T,IAEvC/U,KAAK08B,QAAQ3nB,GAAGsoB,oBAAoB33B,EAAU,GAIlDnH,gBAAgB++B,EAAKT,GAEnB,IAAK,IAAI9nB,EAAI,EAAGA,EAAI8nB,EAAgBA,EAAgB,EAAG9nB,IAErDuoB,EAAI3+B,KAAK,KC/Cf,MAAM4+B,WAA0B5sB,GAE9BpS,YAAYi/B,EAAY,GAEtB/+B,w1BAAkB,CAChBwH,SAAU,CAAEjD,WAAO2B,GACnB0M,YAAa,CAAErO,MAAO,IAAII,EAAQsF,GAAQxF,MAAOwF,GAAQvF,SACzDmO,aAAc,CAAEtO,MAAO,IAAII,GAC3Bq6B,aAAc,CAAEz6B,MAAO,IAAII,EAAQ,EAAG,IACtCs6B,KAAM,CAAE16B,MAAO,IAAIpE,GACnB++B,YAAa,CAAE36B,MAAO,IAAII,GAC1Bw6B,aAAc,CAAE56B,MAAO,KAEzBhD,KAAK0T,aAAc,EACnB1T,KAAKsG,YAAa,EAClBtG,KAAKyG,WAAY,GCvBrB,MAAMo3B,GAEJt/B,cAEEyB,KAAK89B,QAAU,IAAI16B,EAGrB7E,YAAYwD,GAEV,OAAO/B,KAAK89B,QAAQ59B,IAAI6B,EAASR,EAAGQ,EAASP,ICNjD,MAAMu8B,GAEJx/B,cAEEyB,KAAKg+B,SAAW,IAAIp/B,EACpBoB,KAAKi+B,SAAW,IAAI76B,EAGtB7E,YAAYwD,GAKV,OAHA/B,KAAKg+B,SAASv5B,KAAK1C,GACnB/B,KAAKg+B,SAASE,QAAQj1B,GAAc1I,SAE7BP,KAAKi+B,SAAS/9B,IAAIF,KAAKg+B,SAASz8B,EAAGvB,KAAKg+B,SAASx8B,ICd5D,MAAM28B,GAEJ5/B,eASAA,OAAO6/B,EAAYC,IAQnB9/B,SAAS6/B,IAMT7/B,QAAQ6/B,KC1BV,MAAME,WAAeH,GAEnB5/B,cAEEE,QAOFF,OAAO6/B,EAAYC,GAEbD,EAAWG,cAAcF,IAE3BD,EAAW7c,UAAU6c,EAAWI,kBCbtC,MAAMC,WAAqBN,GAEzB5/B,cAEEE,QAOFF,SAAS6/B,GAEPA,EAAWM,iBAObngC,OAAO6/B,EAAYC,GAEbD,EAAWG,cAAcF,GAE3BD,EAAW7c,UAAU6c,EAAWO,iBAIhCP,EAAW7c,UAAU6c,EAAWQ,iBC7BtC,MAAMC,WAAoBV,GAExB5/B,cAEEE,QAMFF,SAAS6/B,GAEPA,EAAWU,gBACXV,EAAW7c,UAAU6c,EAAWW,iBCZpC,MAAMC,WAAqBb,GAEzB5/B,cAEEE,QAMFF,SAAS6/B,GAEPp+B,KAAKi/B,mBAAmBb,GAO1B7/B,OAAO6/B,EAAYC,GAEbD,EAAWG,cAAcF,GAE3Br+B,KAAKi/B,mBAAmBb,GAIxBA,EAAW7c,UAAU6c,EAAWQ,gBAOpCrgC,mBAAmB6/B,GAEjBA,EAAWc,kBCpBf,MAAMC,WAAkBh+B,EAMtB5C,YAAYqS,EAAMC,GAEhB,MAAM/P,EAAW,IAAIy8B,GACrB9+B,MAAM,IAAIqI,EAAc,EAAG,GAAIhG,GAC/Bd,KAAKc,SAAWA,EAEhBd,KAAKo/B,cAAe,EAGpBp/B,KAAKq/B,kBAAoB,IAAItB,GAC7B/9B,KAAKkgB,cAAgB,IAAIoe,GAEzBt+B,KAAKs/B,UAAY,IAAI1gC,EAErBoB,KAAK++B,eAAiB,IAAIT,GAC1Bt+B,KAAKw+B,gBAAkB,IAAIC,GAC3Bz+B,KAAK4+B,eAAiB,IAAIC,GAC1B7+B,KAAK2+B,gBAAkB,IAAIK,GAE3Bh/B,KAAKgM,cAAWrH,EAChB3E,KAAK+L,aAAUpH,EACf3E,KAAKu/B,cAAW56B,EAEhB3E,KAAKw/B,cAAgB,IAAIp8B,EACzBpD,KAAKy/B,oBAAsB,IAAIr8B,EAC/BpD,KAAK0/B,eAAiB,IAAIt8B,EAE1BpD,KAAK2/B,aAAe,IAAIv8B,EAAQ,EAAG,GAEnCpD,KAAKkT,eAAgB,EACrBlT,KAAK4/B,kBAAmB,EACxB5/B,KAAKT,YAAc,EAEnBS,KAAKoB,KAAO,EACZpB,KAAK6/B,aAAe,IAAIz8B,EAM1B7E,iBAAiByE,GAEfhD,KAAKT,YAAcyD,EAGrB88B,kBAEE,OAAO9/B,KAAKc,SAASkF,SAAS23B,YAAY36B,MAM5CzE,iBAAiBuW,GAEf9U,KAAK6/B,aAAap7B,KAAKqQ,GACvB9U,KAAKc,SAASkF,SAASy3B,aAAaz6B,MAAMyB,KAAKqQ,GAMjDvW,UAAUuN,GAER9L,KAAKkgB,cAAcnU,QAAQ/L,MAC3BA,KAAKkgB,cAAgBpU,EACrB9L,KAAKkgB,cAAclU,SAAShM,MAI9B+B,eAEE,OAAO/B,KAAKs/B,UAGdS,cAAcC,GAEZhgC,KAAKc,SAAS2F,UAAYu5B,EAG5BD,gBAEE,OAAO//B,KAAKc,SAAS2F,UAGvBw5B,iBAAiBj9B,GAEfhD,KAAKc,SAASkF,SAAS43B,aAAa56B,MAAQA,EAG9Ci9B,mBAEE,OAAOjgC,KAAKc,SAASkF,SAAS43B,aAAa56B,MAG7CzE,cAEEyB,KAAKkgC,SAAU,EAGjB3hC,oCAEEyB,KAAKq/B,kBAAoB,IAAItB,GAG/Bx/B,qCAEEyB,KAAKq/B,kBAAoB,IAAIxB,GAM/Bt/B,YAAY6I,GAEVA,EAAQyI,UAAYC,EACpB1I,EAAQ2I,UAAYD,EACpB1I,EAAQ0oB,aAAc,EAEtB9vB,KAAK2/B,aAAaz/B,IAAIkH,EAAQE,MAAMpE,MAAOkE,EAAQE,MAAMnE,QAEzDnD,KAAKc,SAASkF,SAASC,SAASjD,MAAQoE,EACxCpH,KAAKmgC,SAASngC,KAAKc,SAASkF,SAASsL,aAAatO,OAClDhD,KAAKkgC,SAAU,EAMjB3hC,aAAa6hC,GAEXpgC,KAAKc,SAASkF,SAASqL,YAAYrO,MAAM9C,IAAIwI,GAAQxF,MAAOwF,GAAQvF,QACpEnD,KAAKmgC,SAASngC,KAAKc,SAASkF,SAASsL,aAAatO,OAElDhD,KAAKy/B,oBAAoBh7B,KAAKzE,KAAKq/B,kBAAkBgB,YAAYrgC,KAAK+B,WACtE/B,KAAKc,SAASkF,SAAS03B,KAAK16B,MAAMyB,KAAKzE,KAAK+B,UAC5C/B,KAAKkgB,cAAchU,OAAOlM,KAAMogC,GAMlC7hC,cAAc6hC,GAEZpgC,KAAK0/B,eAAej7B,KAAKzE,KAAKy/B,qBAC9Bz/B,KAAKsgC,mBAAmBtgC,KAAK0/B,gBAC7B1/B,KAAK0/B,eAAen+B,GAAKvB,KAAK6/B,aAAat+B,EAC3CvB,KAAK0/B,eAAel+B,GAAKxB,KAAK6/B,aAAar+B,EAE3C,MAAM++B,GAAO,IAAIC,GAAO1sB,qBAAqB9T,KAAK0/B,eAAgB1/B,KAAKmgC,YAKvE,OAHAngC,KAAKw/B,cAAc/6B,KAAK27B,GACxBpgC,KAAKsgC,mBAAmBtgC,KAAKw/B,eAEtBe,EAAKE,cAAczgC,KAAKw/B,eAMjCjhC,mBAAmBmiC,GAEjBA,EAAcn/B,GAAuB,GAAlBm/B,EAAcn/B,EAAU,IAAOmH,GAAQxF,MAASlD,KAAK6/B,aAAat+B,EACrFm/B,EAAcl/B,GAAuB,GAAlBk/B,EAAcl/B,EAAU,IAAOkH,GAAQvF,OAASnD,KAAK6/B,aAAar+B,EAGvFjD,4BAEE,MAAM4U,EAAMnT,KAAKy/B,oBAAoBztB,QAErC,OADAhS,KAAKsgC,mBAAmBntB,GACjBA,EAMT5U,0BAA0BoiC,GAExB3gC,KAAK+B,SAASR,EAAKo/B,EAAWp/B,EAAImH,GAAQxF,MAAS,EAAI,EACvDlD,KAAK+B,SAASP,EAAKm/B,EAAWn/B,EAAIkH,GAAQvF,OAAU,EAAI,EAG1D5E,UAEMyB,KAAKc,SAASkF,SAASC,SAASjD,OAElChD,KAAKc,SAASkF,SAASC,SAASjD,MAAMpC,UAGxCZ,KAAKW,SAASC,UACdZ,KAAKc,SAASF,UAMhBrC,SAASoF,GAEP,OAAIA,EAEKA,EAAQc,KAAKzE,KAAK2/B,cAAc/7B,eAAe5D,KAAKoB,KAAOsH,GAAQlF,MAInE,IAAIJ,GAAUqB,KAAKzE,KAAK2/B,cAAc/7B,eAAe5D,KAAKoB,KAAOsH,GAAQlF,KAIpFjF,kBAGAA,iBAGAA,mBCzIG,MAACqiC,GAAK,IA/FX,MAEEriC,KAAK2lB,GAEHlkB,KAAKkkB,MAAQA,EAEblkB,KAAK6gC,YAAc,GACnB7gC,KAAK8gC,oBAAsB,IAAI19B,EAC/BpD,KAAK+gC,SAAW,IAAI1gC,EACpBL,KAAK+gC,SAASC,uBAAwB,EACtChhC,KAAK+gC,SAAS7tB,eAAgB,EAE9BlT,KAAKihC,SAAW,IAAI5gC,EACpBL,KAAKihC,SAASD,uBAAwB,EACtChhC,KAAKihC,SAAS/tB,eAAgB,EAE9BlT,KAAKkhC,UAAY,IAAIh8B,IAAoB,EAAG,EAAG,GAAI,GAAI,IAAK,KAM9D3G,eAAe4iC,GAEb,MAAM7P,EAAQtxB,KAAK6gC,YAAYnT,QAAQyT,GACnC7P,GAAS,GAEXtxB,KAAK6gC,YAAY5R,OAAOqC,EAAO,GAGjCtxB,KAAK+gC,SAAS9/B,OAAOkgC,GACrBnhC,KAAKihC,SAAShgC,OAAOkgC,GAErBA,EAAKvgC,UAMPrC,yBAAyB4iC,GAEvBnhC,KAAK6gC,YAAYliC,KAAKwiC,GACtBnhC,KAAK+gC,SAAS9gC,IAAIkhC,GAElBA,EAAKC,qCAMP7iC,wBAAwB4iC,GAEtBnhC,KAAK6gC,YAAYliC,KAAKwiC,GACtBnhC,KAAKihC,SAAShhC,IAAIkhC,GAElBA,EAAKE,oCAGP9iC,SAMEyB,KAAKkhC,UAAU/0B,yBAEfnM,KAAK8gC,oBAAoBr8B,KAAKzE,KAAKkkB,MAAMod,KACzC,IAAK,IAAIvsB,EAAI,EAAGA,EAAI/U,KAAK6gC,YAAY7/B,OAAQ+T,IAE3C/U,KAAK6gC,YAAY9rB,GAAGwsB,aAAavhC,KAAK8gC,qBAO1CviC,OAAOmH,GAGD1F,KAAK+gC,SAAShgC,SAASC,OAAS,GAElCwgC,GAASz5B,OAAO/H,KAAK+gC,SAAU/gC,KAAKkhC,WAElClhC,KAAKihC,SAASlgC,SAASC,OAAS,GAElCwgC,GAASz5B,OAAO/H,KAAKihC,SAAUh4B,GAAc1I,SAIjDhC,QAEEyB,KAAKyhC,6BAA0B98B,ICjGnC,MAAM+8B,GAEJnjC,cAEEyB,KAAKiU,OAAS,IAAItS,EAGpBpD,WAAWyU,EAAQ2uB,EAAmBC,EAAc19B,GAElDlE,KAAKiU,OAAO7U,cAAc4T,GAE1B,MAAM6uB,EAAQzrB,GAAM0rB,SAASF,EAAe,GACtCG,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAAS39B,GAAW,EAEpDg+B,EAAkBliC,KAAKmiC,oBAAoBR,EAAmBE,GAC9DO,EAAoBpiC,KAAKqiC,sBAAsBV,EAAmBE,GAClES,EAAoBtiC,KAAKuiC,sBAAsBZ,EAAmBI,GAClES,EAAqBxiC,KAAKyiC,uBAAuBd,EAAmBI,GAEpEW,EAAqB,IAAI9jC,EAAQ,EAAG,GAAI,GAAG+jC,gBAAgBhB,GAE3DiB,EAAgB5iC,KAAKiU,OAAOnS,OAAOkQ,QAEnC6wB,EAAqB7iC,KAAK8iC,yBAA8C,EAArB9iC,KAAKiU,OAAOrS,OAAiC,EAArB5B,KAAKiU,OAAOrS,OAAYggC,EAAc19B,GACjH6+B,EAAUH,EAAc5wB,QAAQ/R,IAAIyiC,EAAmB1wB,QAAQpO,gBAAqC,EAAtBi/B,IAE9EG,GAAc,IAAIC,GAAQC,8BAA8BhB,EAAiBa,GACzEI,GAAc,IAAIF,GAAQC,8BAA8Bd,EAAmBW,GAE3EK,GAAe,IAAIH,GAAQC,8BAA8BZ,EAAmBS,GAC5EM,GAAe,IAAIJ,GAAQC,8BAA8BV,EAAoBO,GAEnF/iC,KAAKsjC,+BAA+BP,EAAS/vB,EAAQ2uB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAE1GL,EAASE,8BAA8BhB,EAAiBa,GACxDI,EAAWD,8BAA8Bd,EAAmBW,GAE5DK,EAAWF,8BAA8BZ,EAAmBS,GAC5DM,EAAYH,8BAA8BV,EAAoBO,GAE9D,IAAIQ,EAAmBxnB,EAAAA,EAEvB,MAAMynB,EAAcd,EAAmB1wB,QAAQpO,gBAAqC,EAAtBi/B,GAC9D,IAAK,IAAI9tB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE,MAAM9B,EAAO,IAAIwwB,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAIujC,IAE1DE,EAAwB,IAAI9kC,EAC5B+kC,EAAyB,IAAI/kC,EAE7BglC,EAA0B,IAAIhlC,EAC9BilC,EAA0B,IAAIjlC,EAEpCokC,EAASc,cAAc7wB,EAAOywB,GAC9BP,EAAWW,cAAc7wB,EAAM0wB,GAE/BP,EAAWU,cAAc7wB,EAAO2wB,GAChCP,EAAYS,cAAc7wB,EAAM4wB,GAE5BH,EAAqB1iC,SAAW,MAElCia,QAAQS,IAAI,4BAA6B3G,GAEvC4uB,EAAuB3iC,SAAW,MAEpCia,QAAQS,IAAI,8BAA+B3G,GAEzC6uB,EAAuB5iC,SAAW,MAEpCia,QAAQS,IAAI,8BAA+B3G,GAEzC8uB,EAAwB7iC,SAAW,MAErCia,QAAQS,IAAI,+BAAgC3G,GAG9C,MAAMgvB,EAAoB/wB,EAAO+B,GAAG/C,QAAQsB,IAAIowB,GAAsB1iC,SAChEgjC,EAAoBhxB,EAAO+B,GAAG/C,QAAQsB,IAAIqwB,GAAwB3iC,SAElEijC,EAAsBjxB,EAAO+B,GAAG/C,QAAQsB,IAAIswB,GAAwB5iC,SACpEkjC,EAAsBlxB,EAAO+B,GAAG/C,QAAQsB,IAAIuwB,GAAyB7iC,SAErEmjC,EAAkB71B,KAAKmI,IAAIstB,EAAiBC,GAC5CI,EAAkB91B,KAAKmI,IAAIwtB,EAAmBC,GAE9CztB,EAAMnI,KAAKmI,IAAI0tB,EAAcC,GAE/B3tB,EAAM8sB,IAERA,EAAmB9sB,GAIvB,MAAM4tB,EAAqB3B,EAAmB1wB,QAAQpO,eAAe2/B,GAGrE,OAFyBR,EAAQ/wB,QAAQ/R,IAAIokC,GAK/C9lC,+BAA+B+lC,EAAYtxB,EAAQ2uB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBvkC,KAAKwkC,wBAAwBxxB,EAAQmwB,EAAYH,EAAUrB,GAC7E8C,EAAoBzkC,KAAK0kC,0BAA0B1xB,EAAQowB,EAAYC,EAAa1B,GAE1F2C,EAAWrkC,IAAIskC,GACfD,EAAWrkC,IAAIwkC,GAGjBlmC,wBAAwByU,EAAQmwB,EAAYH,EAAUrB,GAEpD,IAAIgD,EAA+B5oB,EAAAA,EAC/B6oB,EAAkC7oB,EAAAA,EAItC,MAAM8oB,EAAS,IAAIjmC,EAAQ,EAAG,EAAG,GAAG+jC,gBAAgBhB,GACpD,IAAK,IAAI5sB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE,MAAM+vB,EAAc,IAAIrB,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAI4kC,EAAO7yB,QAAQpO,gBAAgB,OAChGmhC,EAAc,IAAItB,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAI4kC,EAAO7yB,QAAQpO,eAAe,OAE/F+/B,EAA0B,IAAI/kC,EAC9B8kC,EAAuB,IAAI9kC,EAEjCukC,EAAWW,cAAcgB,EAAYnB,GACrCX,EAASc,cAAciB,EAASrB,GAEhC,MAAMsB,EAAcrB,EAAuBtwB,WAAWL,EAAO+B,IACvDkwB,EAAcvB,EAAqBrwB,WAAWL,EAAO+B,IAEvD2uB,EAAqB1iC,SAAW,MAElCia,QAAQS,IAAI,qCAAsC3G,GAEhD4uB,EAAuB3iC,SAAW,MAEpCia,QAAQS,IAAI,uCAAwC3G,GAGlDiwB,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAUN,IAEZA,EAA+BM,GAKnC,MAAMC,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAO7yB,QAAQpO,gBAAgBshC,GAGxC3mC,0BAA0ByU,EAAQowB,EAAYC,EAAa1B,GAEzD,IAAIwD,EAAkCppB,EAAAA,EAClCqpB,EAAkCrpB,EAAAA,EAItC,MAAMspB,EAAY,IAAIzmC,EAAQ,EAAG,EAAG,GAAG+jC,gBAAgBhB,GAEvD,IAAK,IAAI5sB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE,MAAMuwB,EAAa,IAAI7B,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAIolC,EAAUrzB,QAAQpO,gBAAgB,OAClG2hC,EAAa,IAAI9B,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAIolC,EAAUrzB,QAAQpO,eAAe,OAEjGggC,EAA0B,IAAIhlC,EAC9BilC,EAA0B,IAAIjlC,EAEpCwkC,EAAWU,cAAcwB,EAAY1B,GACrCP,EAAYS,cAAcyB,EAAY1B,GAEtC,MAAM2B,EAAa5B,EAAuBvwB,WAAWL,EAAO+B,IACtD0wB,EAAa5B,EAAwBxwB,WAAWL,EAAO+B,IAEzD6uB,EAAuB5iC,SAAW,MAEpCia,QAAQS,IAAI,8BAA+B3G,GAEzC8uB,EAAwB7iC,SAAW,MAErCia,QAAQS,IAAI,+BAAgC3G,GAG1CywB,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAaN,IAEfA,EAAkCM,GAKtC,MAAMP,GAAcC,EAAkCC,GAAkC,EAGxF,OAAOC,EAAUrzB,QAAQpO,gBAAgBshC,GAG3C3mC,oBAAoBojC,EAAmBE,GAErC,MAAMK,EAAkB,IAAItjC,EAAQ,GAAI,EAAG,GAG3C,OAFAsjC,EAAgBS,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,GAAIijC,IACxFK,EAAgBS,gBAAgBhB,GACzBO,EAGT3jC,sBAAsBojC,EAAmBE,GAEvC,MAAMO,EAAoB,IAAIxjC,EAAQ,EAAG,EAAG,GAG5C,OAFAwjC,EAAkBO,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,IAAKijC,IAC3FO,EAAkBO,gBAAgBhB,GAC3BS,EAGT7jC,sBAAsBojC,EAAmBI,GAEvC,MAAMO,EAAoB,IAAI1jC,EAAQ,EAAG,EAAG,GAG5C,OAFA0jC,EAAkBK,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,GAAImjC,IAC1FO,EAAkBK,gBAAgBhB,GAC3BW,EAGT/jC,uBAAuBojC,EAAmBI,GAExC,MAAMS,EAAqB,IAAI5jC,GAAS,EAAG,EAAG,GAG9C,OAFA4jC,EAAmBG,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,IAAKmjC,IAC5FS,EAAmBG,gBAAgBhB,GAC5Ba,EAGTjkC,yBAAyB2E,EAAOC,EAAQy+B,EAAc19B,GAEpD,MAAM29B,EAASD,EAAe,EAAKtzB,KAAK0J,GAAK,IACvC+pB,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAAS39B,GAAW,EAEpD0hC,EAAQziC,EAASmL,KAAK2zB,IAAIJ,GAC1BgE,EAAQ3iC,EAAQoL,KAAK2zB,IAAIF,GAC/B,OAAOzzB,KAAKoI,IAAIpI,KAAKoC,IAAIm1B,GAAQv3B,KAAKoC,IAAIk1B,KCvP9C,MAAME,GAEJvnC,eAKAA,WAAWyU,EAAQ2uB,EAAmBC,EAAc19B,GAElD,MAAM6hC,EAAsBpE,EAAkB3vB,QAAQg0B,UAEhDC,EAAkB,GAExB,IAAK,IAAIlxB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IAEjCkxB,EAAgBtnC,KAAKqU,EAAO+B,GAAG/C,QAAQ2wB,gBAAgBoD,IAGzD,MAAMnyB,GAAM,IAAIC,GAAOzU,cAAc6mC,GAC/B7kC,EAAO,IAAIxC,EACjBgV,EAAIpM,QAAQpG,GAEZ,MAAM4a,EAAWhc,KAAK8iC,yBAAyB1hC,EAAKG,EAAI,EAAGH,EAAKI,EAAI,EAAGogC,EAAc19B,GAE/EpC,EAAS,IAAIlD,EAKnB,OAJAgV,EAAIsyB,UAAUpkC,GAEdA,EAAO6gC,gBAAgBhB,GAEhB,CACL7/B,OAAQA,EACRqkC,mBAAoBnqB,GAIxBzd,yBAAyB2E,EAAOC,EAAQy+B,EAAc19B,GAEpD,MAAM29B,EAASD,EAAe,EAAKtzB,KAAK0J,GAAK,IACvC+pB,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAAS39B,GAAW,EAEpD0hC,EAAQziC,EAASmL,KAAK2zB,IAAIJ,GAC1BgE,EAAQ3iC,EAAQoL,KAAK2zB,IAAIF,GAC/B,OAAOzzB,KAAKoI,IAAIpI,KAAKoC,IAAIm1B,GAAQv3B,KAAKoC,IAAIk1B,KC6OzC,MAACQ,GAAmB,IA5QzB,MAEE7nC,KAAK2lB,GAEHlkB,KAAKqmC,QAAU,IAAIC,EACnBtmC,KAAK2T,MAAQ,IAAIsvB,EACjBjjC,KAAKumC,IAAM,IAAIC,EAEfxmC,KAAKymC,SAAW,IAAI7nC,EACpBoB,KAAK0mC,WAAa,IAAI9nC,EAEtBoB,KAAKkkB,MAAQA,EAGf3lB,WAAWiG,GAETA,EAASA,GAAUyE,GAAc1I,QACjC,MAAMu9B,EAAU,IAAIl/B,EAKpB,OAHAk/B,EAAQ59B,IAAI,EAAG,EAAG,GAClB49B,EAAQ6E,gBAAgBn+B,EAAO3B,YAExBi7B,EAGTv/B,gBAAgBiG,GAEdA,EAASA,GAAUyE,GAAc1I,QACjC,MAAMu9B,EAAU,IAAIl/B,EAKpB,OAHAk/B,EAAQ59B,IAAI,EAAG,GAAI,GACnB49B,EAAQ6E,gBAAgBn+B,EAAO3B,YAExBi7B,EAGTv/B,cAAciG,GAEZA,EAASA,GAAUyE,GAAc1I,QACjC,MAAMu9B,EAAU,IAAIl/B,EAIpB,OAFAk/B,EAAQ59B,IAAI,EAAG,EAAG,GAClB49B,EAAQ6E,gBAAgBn+B,EAAO3B,YACxBi7B,EAGTv/B,yBAAyB+iC,EAAK98B,GAE5BA,EAASA,GAAUyE,GAAc1I,QACjC,MAAMu9B,EAAU,IAAIl/B,EAEdijC,EAASr9B,EAAOP,IAAM,EAAKqK,KAAK0J,GAAK,IACrC+pB,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAASr9B,EAAON,QAAW,EAE3D0hC,EAAQt3B,KAAK2zB,IAAIJ,GAASr9B,EAAOJ,IACjCyhC,EAAQv3B,KAAK2zB,IAAIF,GAASv9B,EAAOJ,IAIvC,OAFA05B,EAAQ59B,IAAI2lC,EAAQvE,EAAI//B,EAAGqkC,EAAQtE,EAAI9/B,GAAIgD,EAAOJ,KAAK6N,YAEhD6rB,EAAQ6E,gBAAgBn+B,EAAO3B,YAGxCtE,uBAAuBooC,EAAgBC,EAActF,EAAK98B,GAExDA,EAASA,GAAUyE,GAAc1I,QACjC+gC,EAAMA,GAAOthC,KAAKkkB,MAAMod,IAExB,MAAMxD,EAAU,IAAIl/B,EAGpB,GADAoB,KAAK2T,MAAMuvB,8BAA8B0D,GAAgB5mC,KAAK6mC,gBAAgBriC,GAASmiC,GACnFniC,EAAOsiC,oBAET9mC,KAAKumC,IAAIrmC,IAAIsE,EAAOzC,SAAU/B,KAAK+mC,yBAAyBzF,EAAK98B,QAGnE,CACE,MAAM2O,EAAM,IAAIvU,EAAQ0iC,EAAI//B,EAAIiD,EAAOa,MAAOi8B,EAAI9/B,EAAIgD,EAAOc,IAAK,GAClE6N,EAAIwvB,gBAAgBn+B,EAAO3B,YAC3BsQ,EAAIlT,IAAIuE,EAAOzC,UACf,MAAME,EAAM,IAAIrD,EAAQ,EAAG,GAAI,GAAG+jC,gBAAgBn+B,EAAO3B,YACzD7C,KAAKumC,IAAIrmC,IAAIiT,EAAKlR,GAIpB,OAFAjC,KAAKumC,IAAIS,eAAehnC,KAAK2T,MAAOmqB,GAE7BA,EAGTv/B,qBAAqByU,EAAQi0B,EAAa,GAExC,MACMC,GADgB,IAAIvlC,GAASvC,cAAc4T,GACRlR,OACnCqlC,EAAiBnnC,KAAK6mC,gBAAgB59B,GAAc1I,SAASyR,QAE7D2B,GAAQ,IAAIsvB,GAAQC,8BAA8BiE,EAAgBD,GAElE9vB,EAAkBhB,GAAMgxB,wBAAwBp0B,EAAQW,GAExD0zB,EAA0B,IAAIzoC,EACpC,IAAIgV,GAAO,IAAIC,GAAOzU,cAAcgY,GACpCxD,EAAIsyB,UAAUmB,GAEd,MAAMC,EAAK,IAAI1oC,EAAQ,EAAG,EAAG,GAAG+jC,gBAAgB15B,GAAc1I,QAAQsC,YAChEwC,EAAQiiC,EAAGt1B,QAAQu1B,MAAMJ,GAAgBl1B,YACzCpR,GAAM,IAAIylC,GAAUpmC,IAAImF,EAAM9D,EAAG+lC,EAAG/lC,EAAG4lC,EAAe5lC,EAAG2lC,EAAmB3lC,EAChF8D,EAAM7D,EAAG8lC,EAAG9lC,EAAG2lC,EAAe3lC,EAAG0lC,EAAmB1lC,EACpD6D,EAAM5D,EAAG6lC,EAAG7lC,EAAG0lC,EAAe1lC,EAAGylC,EAAmBzlC,EACpD,EAAM,EAAkB,EAAU,GAE9B+lC,GAAc,IAAIlB,GAAUmB,WAAW5mC,GAC7C,IAAK,IAAIkU,EAAI,EAAGA,EAAIqC,EAAgBpW,OAAQ+T,IAE1CqC,EAAgBrC,GAAG2yB,aAAaF,GAGlC,MAAMpmC,EAAO,IAAIxC,EACjBgV,GAAO,IAAIC,GAAOzU,cAAcgY,GAChCxD,EAAIpM,QAAQpG,GACZA,EAAKwC,eAAeqjC,GACpB,MAAMU,EAAmB,IAAI/oC,EAG7B,OAFAgV,EAAIsyB,UAAUyB,GAEP,CACL5lC,SAAUslC,EACVO,KAAM5nC,KAAK6nC,qBAAqBzmC,EAAKG,EAAI,EAAGH,EAAKI,EAAI,IAIzDjD,qBAAqB2E,EAAOC,GAE1B,MAAM0+B,EAAS54B,GAAc1I,QAAQ0D,IAAM,EAAKqK,KAAK0J,GAAK,IACpD+pB,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAAS54B,GAAc1I,QAAQ2D,QAAW,EAE1E0hC,EAAQziC,EAASmL,KAAK2zB,IAAIJ,GAC1BgE,EAAQ3iC,EAAQoL,KAAK2zB,IAAIF,GAE/B,OAAOzzB,KAAKoI,IAAIpI,KAAKoC,IAAIm1B,GAAQv3B,KAAKoC,IAAIk1B,IAG5CrnC,oBAAoBoW,EAAInQ,GAEtB,GAAIA,EAAOsjC,qBACX,CACEnzB,EAAGnN,QAAQxH,KAAKymC,UAEhB,MAAMsB,EAAQ/nC,KAAKymC,SAASllC,EACtBymC,EAAQhoC,KAAKymC,SAASjlC,EACtBymC,EAAgBF,EAAQC,EAC9B,OAAIt/B,GAAQ7E,aAAeokC,EAAgB,EAElCv/B,GAAQvF,OAAS6kC,EAIjBt/B,GAAQxF,MAAQ6kC,EAI3B,CAEE,MAAM3mC,EAAO,IAAIxC,EAEjB,OADA+V,EAAGnN,QAAQpG,GACJpB,KAAK6nC,qBAAqBzmC,EAAKG,EAAGH,EAAKI,IAIlDjD,oBAAoB2pC,EAAQ1jC,GAE1BA,EAASA,GAAUyE,GAAc1I,QACjC,MAAMu9B,EAAU,IAAIl/B,EAOpB,OALAspC,EAAOC,iBAAiBrK,GACxBA,EAAQI,QAAQ15B,GAEhBs5B,EAAQv8B,GAAiB,GAAZu8B,EAAQv8B,EAAU,IAAQmH,GAAa,MACpDo1B,EAAQt8B,GAAK,GAAiB,GAAZs8B,EAAQt8B,EAAU,KAAQkH,GAAQvF,OAC7C26B,EAGTv/B,oBAAoB4U,EAAK3O,GAEvBA,EAASA,GAAUyE,GAAc1I,QACjC,MAAMu9B,EAAU,IAAIl/B,EAOpB,OALAk/B,EAAQr5B,KAAK0O,GACb2qB,EAAQI,QAAQ15B,GAEhBs5B,EAAQv8B,GAAiB,GAAZu8B,EAAQv8B,EAAU,IAAQmH,GAAa,MACpDo1B,EAAQt8B,GAAK,GAAiB,GAAZs8B,EAAQt8B,EAAU,KAAQkH,GAAQvF,OAC7C26B,EAGTv/B,kBAAkBiG,GAEhBA,EAAOY,MAAUsD,GAAQxF,MAAQ,EACjCsB,EAAOa,MAASqD,GAAQxF,MAAQ,EAChCsB,EAAOc,IAASoD,GAAQvF,OAAS,EACjCqB,EAAOe,QAAUmD,GAAQvF,OAAS,EAClCqB,EAAON,OAASwE,GAAQ7E,aACxBW,EAAO2H,wBAAuB,GAGhC5N,wBAAwBiG,EAAQmQ,EAAInW,EAAQ,GAE1C,MAAMyD,EAAM,IAAIrD,EAChBqD,EAAIwC,KAAKkQ,EAAG+B,KAAKpD,IAAIqB,EAAG8B,KAExB,MAAM2xB,EAAKzzB,EAAG8B,IAAIzE,QAEZq2B,EAAKD,EAAGp2B,QAAQ/R,IAAI,IAAIrB,EAAQqD,EAAIV,EAAG,EAAG,IAC1C+mC,EAAKF,EAAGp2B,QAAQ/R,IAAI,IAAIrB,EAAQ,EAAGqD,EAAIT,EAAG,IAC1C+mC,EAAKH,EAAGp2B,QAAQ/R,IAAI,IAAIrB,EAAQ,EAAG,EAAGqD,EAAIR,IAE1C+mC,EAAKJ,EAAGp2B,QAAQ/R,IAAI,IAAIrB,EAAQqD,EAAIV,EAAG,EAAGU,EAAIR,IAC9CgnC,EAAKL,EAAGp2B,QAAQ/R,IAAI,IAAIrB,EAAQ,EAAGqD,EAAIT,EAAGS,EAAIR,IAC9CinC,EAAK/zB,EAAG+B,IAAI1E,QACZ22B,EAAKP,EAAGp2B,QAAQ/R,IAAI,IAAIrB,EAAQqD,EAAIV,EAAGU,EAAIT,EAAG,IACpD,OAAOxB,KAAK4oC,WAAWpkC,EAAQ,CAAC4jC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,GAAKnqC,GAGnED,WAAWiG,EAAQwO,EAAQi0B,EAAa,GAEtC,GAAIziC,EAAOsiC,oBACX,CACE,MAAMpE,EAAqB,IAAI9jC,EAAQ,EAAG,GAAI,GAAG+jC,gBAAgBn+B,EAAO3B,YAClEgmC,EAAsBnG,EAAmB1wB,QAAQpO,gBAAgB,GAEjEklC,EAAS,IAAIpH,GAEb79B,EAAe6E,GAAQ7E,aAEvBklC,EAAaD,EAAOF,WAAW51B,EAAQxO,EAAO3B,WAAY2B,EAAOP,IAAMgjC,EAAYpjC,GACnF+P,GAAM,IAAIC,GAAOzU,cAAc4T,GAC/BlR,EAAS,IAAIlD,EACnBgV,EAAIsyB,UAAUpkC,GAEd,MAAMknC,GAA2B,IAAI/F,GAAQC,8BAA8B2F,EAAqB/mC,GAE1FmnC,EAAa,IAAIzC,EAAIuC,EAAYrG,GAEjCwG,EAAqB,IAAItqC,EAC/BqqC,EAAWjC,eAAegC,EAA0BE,GAIpD,MAAO,CACLtB,KAHWmB,EAAW11B,WAAW61B,GAIjCA,mBAAoBA,EACpBC,gBAAiBJ,GAIrB,CACE,MACMK,GADS,IAAItD,IACG8C,WAAW51B,EAAQhT,KAAKqpC,mBAAoB7kC,EAAOP,IAAMgjC,EAAYv+B,GAAQ7E,cAEnG7D,KAAKkpC,mBAAmBzkC,KAAK2kC,EAAOtnC,QACpC9B,KAAKspC,eAAiBF,EAAOjD,mBAE7B,MAAMoD,EAAU,IAAI3qC,EAAQ,EAAG,EAAG,GAAG+jC,gBAAgBn+B,EAAO3B,YAC5D,MAAO,CACL+kC,KAAMwB,EAAOjD,mBACb+C,mBAAoBE,EAAOtnC,OAC3BqnC,gBAAiBI,EAAQ3lC,eAAewlC,EAAOjD,wBC7NlD,MAACqD,GAAc,IArCpB,MAEEjrC,eAIAA,KAAK2lB,GAEHjb,GAAc2qB,OACd6V,GAAgB7V,KAAK1P,GACrB1Y,GAAaooB,OACb8V,GAAgB9V,OAEhB+V,GAAG/V,OACHtE,GAAQsE,OACRgW,GAAuBhW,OACvBhJ,GAAkBgJ,OAClBpnB,GAAaonB,OACblrB,GAAQkrB,OACR9S,GAAK8S,OACLiW,GAAGjW,KAAK1P,GAERU,GAAMgP,OAMRr1B,QAAQurC,GAENtI,GAAS5gC,UACT4L,GAAa5L,UAEbkpC,EAAYlpC,YCjDhB,MAAMmpC,GAKJxrC,KAAKk2B,GAEHz0B,KAAKgqC,eAAgB,EACrBhqC,KAAKiqC,aAAc,EAKnBjqC,KAAKwa,KAAO,GAEZxa,KAAKkqC,UAAY,GACjBlqC,KAAKy0B,UAAYA,EAEjBz0B,KAAKy0B,UAAU3I,iBAAiB,UAAW9rB,KAAKmqC,YAAYplB,KAAK/kB,OAAO,GACxEA,KAAKy0B,UAAU3I,iBAAiB,QAAS9rB,KAAKoqC,UAAUrlB,KAAK/kB,OAAO,GAMtEzB,YAAYwtB,GAEQ,KAAdA,EAAEse,SAAkBte,EAAEue,UAAYtqC,KAAKiqC,cAEzCjqC,KAAKgqC,eAAgB,EACrBhqC,KAAKiqC,aAAc,GAGjBle,EAAEwe,MAEJvqC,KAAKwqC,UAAUze,EAAEwe,MAOrBhsC,UAAUwtB,GAER/rB,KAAKyqC,YAAY1e,EAAEwe,MAGrBhsC,QAEEyB,KAAKgqC,eAAgB,EAErB,IAAK,IAAIj1B,EAAI,EAAGA,EAAI/U,KAAKkqC,UAAUlpC,OAAQ+T,IAEzC/U,KAAKwa,KAAKxa,KAAKkqC,UAAUn1B,IAAI21B,SAAU,EACvC1qC,KAAKwa,KAAKxa,KAAKkqC,UAAUn1B,IAAI41B,UAAW,EAO5CpsC,YAAYqsC,GAEV,MAAMC,EAAM7qC,KAAKwa,KAAKowB,GAClBC,IAEFA,EAAIC,OAAQ,EACZD,EAAIE,MAAO,EACXF,EAAIF,UAAW,GAInBpsC,eAEEyB,KAAKiqC,aAAc,EAEnB,IAAK,IAAIl1B,EAAI,EAAGA,EAAI/U,KAAKkqC,UAAUlpC,OAAQ+T,IAEzC/U,KAAKwa,KAAKxa,KAAKkqC,UAAUn1B,IAAI+1B,OAAQ,EACrC9qC,KAAKwa,KAAKxa,KAAKkqC,UAAUn1B,IAAIg2B,MAAO,EAOxCxsC,UAAUqsC,GAER,MAAMC,EAAM7qC,KAAKwa,KAAKowB,GAClBC,KAEe,IAAbA,EAAIE,OAENF,EAAIH,SAAU,GAEhBG,EAAIE,MAAO,EACXF,EAAIC,OAAQ,GAQhBvsC,eAAeqsC,GAEb,MAAMC,EAAM7qC,KAAKwa,KAAKowB,GACtB,QAAIC,GAEKA,EAAIH,QASfnsC,YAAYqsC,GAEV,MAAMC,EAAM7qC,KAAKwa,KAAKowB,GACtB,QAAIC,GAEKA,EAAIE,KASfxsC,gBAAgBqsC,GAEd,MAAMC,EAAM7qC,KAAKwa,KAAKowB,GACtB,QAAIC,GAEKA,EAAIF,SASfpsC,aAAassC,GAEX7qC,KAAKwa,KAAKqwB,GACR,CACED,SAAUC,EACVH,SAAS,EACTK,MAAM,EACND,OAAO,EACPH,UAAU,GAGd3qC,KAAKkqC,UAAYt/B,OAAO4P,KAAKxa,KAAKwa,MAMpCjc,eAAeqsC,UAEN5qC,KAAKwa,KAAKowB,GAGnBrsC,UAEEyB,KAAKy0B,UAAUxI,oBAAoB,UAAWjsB,KAAKmqC,YAAYplB,KAAK/kB,OAAO,GAC3EA,KAAKy0B,UAAUxI,oBAAoB,QAASjsB,KAAKoqC,UAAUrlB,KAAK/kB,OAAO,ICvK3E,MAAMgrC,WAAuBplC,EAE3BrH,cAEEE,MAAM,CACJuH,SAAU,GAEVI,kLACAC,yHCPN,MAAM4kC,WAA2BzlC,GAE/BjH,cAEEE,QAGFF,SAEEijC,GAASz4B,WAAMpE,EAAWsE,GAAc1I,SAAS,GAAM,GAEvDihC,GAASz5B,OAAOyE,GAAajM,QAAS0I,GAAc1I,aAASoE,EAAW,IAAIqmC,+MCVhF,MAAME,WAAqCvlC,GAEzCpH,cAEEE,i5BAAY0sC,IACZnrC,KAAKgG,SAASsC,UAAqB,CAAEtF,MAAO,GAC5ChD,KAAKgG,SAASolC,mBAAqB,CAAEpoC,MAAO,IAAIsjC,ICTpD,MAAM+E,WAA4B1lC,GAEhCpH,cAEEE,wPACAuB,KAAKgG,SAASslC,IAAM,CAAEtoC,WAAO2B,ICDjC,MAAM4mC,WAAqB5lC,GAEzBpH,cAEEE,o2DAAYmS,IAEZ5Q,KAAKgG,SAASolC,mBAAqB,CAAEpoC,MAAO,IAAIsjC,GAChDtmC,KAAKgG,SAASwlC,kBAAqB,CAAExoC,MAAO,IAAIsjC,GAEhDtmC,KAAKgG,SAASylC,MAAY,CAAEzoC,MAAO,OACnChD,KAAKgG,SAAS0lC,QAAY,CAAE1oC,MAAO,IACnChD,KAAKgG,SAASsC,UAAY,CAAEtF,MAAO,KAEnChD,KAAKgG,SAAS2lC,cAAgB,CAAE3oC,MAAOhD,KAAK4rC,uBAC5C5rC,KAAKgG,SAAS6lC,gBAAkB,CAAE7oC,MAAOhD,KAAK8rC,yBAGhDvtC,sBAEE,MAAMwtC,EAAgB,GAGtB,IAAK,IAAIh3B,EAAI,EAAGA,EAFI,GAEaA,IACjC,CACE,MAAM9S,EAAM,IAAIrD,EAAwB,EAAhB0P,KAAKgK,SAAe,EAC1B,EAAhBhK,KAAKgK,SAAe,EACpBhK,KAAKgK,UACPrW,EAAIgQ,YACJ,IAAIzT,EAAQuW,EARM,GASlBvW,EAAU4X,GAAMqB,KAAK,GAAK,EAAKjZ,EAAQA,GACvCyD,EAAI2B,eAAepF,GAEnButC,EAAcptC,KAAKsD,GAErB,OAAO8pC,EAGTxtC,wBAEE,MAAMytC,EAAkB,IAAI3X,WAAW,IACvC,IAAK,IAAItf,EAAI,EAAGA,EAAI,GAAIA,IAEtBi3B,EAAoB,EAAJj3B,EAAQ,GAAKzG,KAAK+J,MAAsB,IAAhB/J,KAAKgK,UAC7C0zB,EAAoB,EAAJj3B,EAAQ,GAAKzG,KAAK+J,MAAsB,IAAhB/J,KAAKgK,UAC7C0zB,EAAoB,EAAJj3B,EAAQ,GAAK,EAG/B,MAAMk3B,EAAmB,IAAI3P,EAAY0P,EAAiB,EAAG,EAAG/7B,GAKhE,OAJAg8B,EAAiBC,MAAQC,EACzBF,EAAiBG,MAAQD,EAEzBF,EAAiBnc,aAAc,EACxBmc,GCtDX,MAAMI,WAAwB1mC,GAE5BpH,cAEEE,6sBACAuB,KAAKgG,SAASsmC,WAAa,CAAEtpC,MAAO,IAAII,ICN5C,MAAMmpC,GAEJhuC,YAAYmH,GAEV1F,KAAKwsC,IAAM,IAAI/jC,EAAkB,EAAG,GACpCzI,KAAKysC,IAAM,IAAIhkC,EAAkB,EAAG,GACpCzI,KAAK0sC,aAAe,IAAIL,GAG1B9tC,KAAKoJ,GAECA,EAAGzE,QAAUlD,KAAKwsC,IAAItpC,OAASyE,EAAGxE,SAAWnD,KAAKwsC,IAAIrpC,SAExDnD,KAAKwsC,IAAItjC,QAAQvB,EAAGzE,MAAOyE,EAAGxE,QAC9BnD,KAAKysC,IAAIvjC,QAAQvB,EAAGzE,MAAOyE,EAAGxE,SAGhCnD,KAAK0sC,aAAa1mC,SAASsmC,WAAWtpC,MAAM9C,IAAI,EAAG,GACnDshC,GAAS3zB,KAAKlG,EAAI3H,KAAKwsC,IAAKxsC,KAAK0sC,cACjC1sC,KAAK0sC,aAAa1mC,SAASsmC,WAAWtpC,MAAM9C,IAAI,EAAG,GACnDshC,GAAS3zB,KAAK7N,KAAKwsC,IAAK7kC,EAAI3H,KAAK0sC,eCbrC,MAAMC,WAAuBnnC,GAE3BjH,YAAYquC,GAAW,GAErBnuC,QAEAuB,KAAK6sC,SAAW,IAAItB,GACpBvrC,KAAK8sC,iBAAmB,IAAIzB,GAC5BrrC,KAAK+sC,cAAgB,IAAI7B,GAEzBlrC,KAAKgtC,KAAOJ,EAAW,EAAI,EAE3B5sC,KAAKitC,QAAU,IAAIxkC,EAAkBC,GAAQxF,MAAQlD,KAAKgtC,KAAMtkC,GAAQvF,OAASnD,KAAKgtC,MAEtFhtC,KAAKktC,QAAU,IAAIzkC,EAAkBC,GAAQxF,MAAOwF,GAAQvF,QAE5DnD,KAAKmtC,QAAU,IAAIZ,GACnB/K,GAAS53B,4BAA6B,EAGxCrL,SAEEyB,KAAKotC,kBAEL5L,GAASz4B,MAAM/I,KAAKitC,QAAShkC,GAAc1I,SAAS,GAAM,GAC1DihC,GAASz5B,OAAOyE,GAAajM,QAAS0I,GAAc1I,QAASP,KAAKitC,SAElEjtC,KAAKqtC,oBAEL7L,GAAS3zB,KAAK2zB,GAAS31B,iBAAkB7L,KAAKktC,QAASltC,KAAK6sC,UAG5D7sC,KAAKmtC,QAAQG,KAAKttC,KAAKktC,SACvB1L,GAAS3zB,KAAK7N,KAAKktC,aAASvoC,GAG5B3E,KAAK8sC,iBAAiB9mC,SAASslC,IAAItoC,MAAQhD,KAAKktC,QAAQ9lC,QACxDo6B,GAAS3zB,KAAK7N,KAAKitC,aAAStoC,EAAW3E,KAAK8sC,kBAK9CvuC,oBAEEyB,KAAK6sC,SAAS7mC,SAASolC,mBAAmBpoC,MAAMykC,WAAWx+B,GAAc1I,QAAQgtC,kBACjFvtC,KAAK6sC,SAAS7mC,SAASwlC,kBAAkBxoC,MAAMyB,KAAKwE,GAAc1I,QAAQgtC,kBAC1EvtC,KAAK6sC,SAAS7mC,SAASsC,UAAUtF,MAAQiG,GAAc1I,QAAQ6D,IAGjE7F,kBAEMyB,KAAKitC,QAAQ/pC,QAAUwF,GAAQxF,MAAQlD,KAAKgtC,MAAQhtC,KAAKitC,QAAQ9pC,SAAWuF,GAAQvF,OAASnD,KAAKgtC,OAEpGhtC,KAAKitC,QAAQ/jC,QAAQR,GAAQxF,MAAQlD,KAAKgtC,KAAMtkC,GAAQvF,OAASnD,KAAKgtC,MACtEhtC,KAAKktC,QAAQhkC,QAAQR,GAAQxF,MAAOwF,GAAQvF,UC7DlD,MAAMqqC,WAAqBhoC,GAEzBjH,cAEEE,QAGFF,SAEEijC,GAASz4B,WAAMpE,EAAWsE,GAAc1I,SAAS,GAAM,GAEnDiM,GAAajM,QAAQsM,eAEvBL,GAAajM,QAAQsM,gBAGnBL,GAAajM,QAAQwH,OAEvByE,GAAajM,QAAQwH,SAIrBy5B,GAASz5B,OAAOyE,GAAajM,QAAS0I,GAAc1I,SAGlDiM,GAAajM,QAAQuM,gBAEvBN,GAAajM,QAAQuM,kBC1B3B,MAAM2gC,WAA6B9nC,GAEjCpH,YAAYmvC,EAAevoB,GAEzB1mB,i8BAAYkG,EAAW,CACrBgpC,cAAeD,EACfE,MAAOF,IAGT1tC,KAAKgG,SAAS6nC,QAAU,CAAE7qC,MAAO,IAAII,EAAQ,GAAK,KAClDpD,KAAKgG,SAAS8nC,UAAY,CAAE9qC,MAAO,IAAII,EAAQ,GAAK,KACpDpD,KAAKgG,SAASpE,OAAS,CAAEoB,MAAO,GAEhChD,KAAK+F,QAAQqf,wBAAyB,EAGxC7mB,SAAS2S,EAAGC,GAEVnR,KAAKgG,SAAS6nC,QAAQ7qC,MAAMzB,EAAI2P,EAChClR,KAAKgG,SAAS6nC,QAAQ7qC,MAAMxB,EAAI2P,EAGlC5S,cAAcgD,EAAGC,GAEfxB,KAAKgG,SAAS8nC,UAAU9qC,MAAM9C,IAAIqB,EAAGC,GAGvCjD,WAAWyE,EAAQ,GAEjBhD,KAAKgG,SAASpE,OAAOoB,MAAQA,GC9BjC,MAAM+qC,WAAmCpoC,GAEvCpH,YAAY4mB,GAEV1mB,itBAEAuB,KAAKgG,SAASgoC,oBAAsB,CAAEhrC,MAAO,KAC7ChD,KAAKgG,SAASioC,YAAsB,CAAEjrC,MAAO,KAC7ChD,KAAKgG,SAASkoC,aAAsB,CAAElrC,MAAO,IAAIsB,EAAM,YACvDtE,KAAKgG,SAASmoC,eAAsB,CAAEnrC,MAAO,GAE7ChD,KAAK+F,QAAQqf,wBAAyB,EAGxC7mB,cAAc6vC,GAEZpuC,KAAKgG,SAASgoC,oBAAoBhrC,MAAQorC,GCf9C,MAAMC,GAEJ9vC,YAAY4mB,GAAiB,GAE3BnlB,KAAKsuC,cAAgB,EACrBtuC,KAAKuuC,eAAiB,EAEtBvuC,KAAKwuC,uBAAyB,GAC9BxuC,KAAKyuC,wBAA0B,GAC/BzuC,KAAK0uC,sBAAwB,GAC7B1uC,KAAKmlB,eAAiBA,EACtBnlB,KAAKulB,MAAQ,EACbvlB,KAAK2uC,gBAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,IACpC3uC,KAAK4uC,QAAU,CACb/+B,UAAWg/B,EACX9+B,UAAW8+B,EACX7+B,OAAQC,EACRG,KAAM+U,EAAiB2pB,EAAgBC,EACvC7+B,WAAYiV,EAAiBhV,EAAuByf,GAGtD5vB,KAAKgvC,mBAAqB,IAAIvmC,EAAkB,EAAG,EAAGzI,KAAK4uC,SAC3D5uC,KAAKgvC,mBAAmB5nC,QAAQmvB,iBAAkB,EAElDv2B,KAAKivC,iBACLjvC,KAAKkvC,UAELlvC,KAAKmvC,yBAA2B,IAAIpB,GAA2B5oB,GAGjE5mB,KAAKoJ,EAAIynC,GAEPpvC,KAAKqvC,UAAU1nC,EAAGzE,MAAOyE,EAAGxE,QAE5B,IAAImsC,EAAoB3nC,EAEpBynC,IAEF5N,GAAS3zB,KAAKlG,EAAI3H,KAAKgvC,mBAAoBhvC,KAAKmvC,0BAChDG,EAAoBtvC,KAAKgvC,oBAG3B,IAAK,IAAIj6B,EAAI,EAAGA,EAAI/U,KAAKulB,MAAOxQ,IAChC,CACE,MAAMlU,EAAMb,KAAKwuC,uBAAuBz5B,GAExClU,EAAI0uC,cAAc,EAAG,GACrB/N,GAAS3zB,KAAKyhC,EAAmBtvC,KAAKyuC,wBAAwB15B,GAAIlU,GAElEA,EAAI0uC,cAAc,EAAG,GACrB/N,GAAS3zB,KAAK7N,KAAKyuC,wBAAwB15B,GAAI/U,KAAK0uC,sBAAsB35B,GAAIlU,GAE9EyuC,EAAoBtvC,KAAK0uC,sBAAsB35B,IAInDxW,sBAEE,OAAOyB,KAAKyuC,wBAAwB,GAAGrnC,QAGzC7I,iBAEE,OAAOyB,KAAKyuC,wBAAwB,GAGtClwC,UAEEyB,KAAKwvC,aAELxvC,KAAKgvC,mBAAmB9lC,QAAQ,EAAG,GAEnC,IAAK,IAAI6L,EAAI,EAAGA,EAAI/U,KAAKulB,MAAOxQ,IAChC,CACE,MAAM06B,EAAM,IAAIhnC,EAAkB,EAAG,EAAGzI,KAAK4uC,SACvCc,EAAM,IAAIjnC,EAAkB,EAAG,EAAGzI,KAAK4uC,SAE7Ca,EAAIroC,QAAQmvB,iBAAkB,EAC9BmZ,EAAItoC,QAAQmvB,iBAAkB,EAE9BkZ,EAAIroC,QAAQ8I,WAAalQ,KAAK4uC,QAAQ1+B,WACtCw/B,EAAItoC,QAAQ8I,WAAalQ,KAAK4uC,QAAQ1+B,WAEtClQ,KAAKyuC,wBAAwB9vC,KAAK8wC,GAClCzvC,KAAK0uC,sBAAsB/vC,KAAK+wC,IAIpCnxC,UAAUs+B,EAAe8S,GAEvB,GAAI3vC,KAAKsuC,gBAAkBzR,GAAiB78B,KAAKuuC,iBAAmBoB,EAElE,OAGF3vC,KAAKsuC,cAAgBzR,EACrB78B,KAAKuuC,eAAiBoB,EAEtB,IAAIzsC,EAAQoL,KAAKyI,MAAM8lB,EAAgB,GACnC15B,EAASmL,KAAKyI,MAAM44B,EAAiB,GAEzC3vC,KAAKgvC,mBAAmB9lC,QAAQhG,EAAOC,GAEvC,IAAK,IAAI4R,EAAI,EAAGA,EAAI/U,KAAKulB,MAAOxQ,IAE9B/U,KAAK0uC,sBAAsB35B,GAAG7L,QAAQhG,EAAOC,GAC7CnD,KAAKyuC,wBAAwB15B,GAAG7L,QAAQhG,EAAOC,GAC/CnD,KAAKwuC,uBAAuBz5B,GAAG66B,SAAS1sC,EAAOC,GAE/CD,EAAUoL,KAAKyI,MAAM7T,EAAQ,GAC7BC,EAAUmL,KAAKyI,MAAM5T,EAAS,GAIlC5E,iBAEEyB,KAAK6vC,oBAEL,IAAK,IAAI96B,EAAI,EAAGA,EAAI/U,KAAKulB,MAAOxQ,IAE9B/U,KAAKwuC,uBAAuB7vC,KAAK,IAAI8uC,GAAqBztC,KAAK2uC,gBAAgB55B,GAAI/U,KAAKmlB,iBAI5F5mB,WAAWyE,GAET,IAAK,IAAI+R,EAAI,EAAGA,EAAI/U,KAAKwuC,uBAAuBxtC,OAAQ+T,IAEtD/U,KAAKwuC,uBAAuBz5B,GAAG+6B,WAAW9sC,GAI9CzE,yBAAyByE,GAEvBhD,KAAKmvC,yBAAyBY,cAAc/sC,GAG9CzE,oBAEE,IAAK,IAAIwW,EAAI,EAAGA,EAAI/U,KAAKwuC,uBAAuBxtC,OAAQ+T,IAEtD/U,KAAKwuC,uBAAuBz5B,GAAGnU,UAEjCZ,KAAKwuC,uBAAuBxtC,OAAS,EAGvCzC,aAEE,IAAK,IAAIwW,EAAI,EAAGA,EAAI/U,KAAK0uC,sBAAsB1tC,OAAQ+T,IAErD/U,KAAKyuC,wBAAwB15B,GAAGnU,UAChCZ,KAAK0uC,sBAAsB35B,GAAGnU,UAEhCZ,KAAKgvC,mBAAmBpuC,UAExBZ,KAAKyuC,wBAAwBztC,OAAS,EACtChB,KAAK0uC,sBAAsB1tC,OAAS,GCtJxC,MAAMgvC,WAA0BxqC,GAE9BjH,YAAY0xC,EAAkB9qB,EAAgB+qB,EAA2BC,GAAqB,GAE5F1xC,QAEAuB,KAAKowC,QAAU,IAAIlrB,GAAYC,GAE/B,MAAMkrB,EAAc,CAClBC,QAASL,EAAmB,EAAI,EAChC7/B,KAAM+U,EAAiB2pB,EAAgBC,EACvC/+B,OAAQC,EACRC,WAAYC,EACZN,UAAWC,EACXC,UAAWD,GAEb9P,KAAKmwC,mBAAqBA,EAC1BnwC,KAAKitC,QAAU,IAAIxkC,EAAkB,EAAG,EAAG4nC,GAC3CrwC,KAAKitC,QAAQ7lC,QAAQ8I,WAAaC,EAClCnQ,KAAKitC,QAAQ7lC,QAAQyI,UAAYC,EACjC9P,KAAKitC,QAAQ7lC,QAAQ2I,UAAYD,EAEjC9P,KAAKuwC,kBAAoB,IAAIjrB,GAA2B,EAAGH,GAC3DnlB,KAAKmtC,QAAU,IAAIkB,GAAgBlpB,GACnCnlB,KAAKkwC,0BAA4BA,EACjClwC,KAAKwwC,qBAAuB,GAG9BjyC,WAEEyB,KAAKuwC,kBAAkBE,SAASzwC,KAAKmtC,QAAQuB,sBAAsB,GAAGtnC,SACtEpH,KAAKuwC,kBAAkBG,SAAS1wC,KAAKmtC,QAAQuB,sBAAsB,GAAGtnC,SACtEpH,KAAKuwC,kBAAkBI,SAAS3wC,KAAKmtC,QAAQuB,sBAAsB,GAAGtnC,SACtEpH,KAAKuwC,kBAAkBK,SAAS5wC,KAAKmtC,QAAQuB,sBAAsB,GAAGtnC,SACtEpH,KAAKuwC,kBAAkBM,SAAS7wC,KAAKmtC,QAAQuB,sBAAsB,GAAGtnC,SAEtEpH,KAAKowC,QAAQU,gBAAgB9wC,KAAKmtC,QAAQsB,wBAAwB,GAAGrnC,SAGvE7I,SAEEyB,KAAKotC,kBAEL5L,GAASz4B,MAAM/I,KAAKitC,QAAShkC,GAAc1I,SAAS,GAAM,GAC1DihC,GAASz5B,OAAOyE,GAAajM,QAAS0I,GAAc1I,QAASP,KAAKitC,SAGlEjtC,KAAKmtC,QAAQG,KAAKttC,KAAKitC,QAASjtC,KAAKkwC,2BAGrC1O,GAAS9zB,cAAc1N,KAAKuwC,kBAAmBvwC,KAAKmtC,QAAQsB,wBAAwB,IAKpFjN,GAAS3zB,KAAK7N,KAAKitC,aAAStoC,EAAW3E,KAAKowC,SAG9C7xC,mBAAmBwyC,GAEjB/wC,KAAKuwC,kBAAkBS,mBAAmBD,GAG5CxyC,iBAAiBwyC,GAGf/wC,KAAKmtC,QAAQ2C,WAAWiB,GAG1BxyC,yBAAyByE,GAEvBhD,KAAKmtC,QAAQ8D,yBAAyBjuC,GAGxCzE,iBAAiB+nB,GAEftmB,KAAKuwC,kBAAkBW,iBAAiB5qB,GAG1C/nB,iBAAiB+nB,GAEftmB,KAAKuwC,kBAAkBY,iBAAiB7qB,GAG1C/nB,iBAAiB+nB,GAEftmB,KAAKuwC,kBAAkBa,iBAAiB9qB,GAG1C/nB,iBAAiB+nB,GAEftmB,KAAKuwC,kBAAkBc,iBAAiB/qB,GAG1C/nB,iBAAiB+nB,GAEftmB,KAAKuwC,kBAAkBe,iBAAiBhrB,GAG1C/nB,kBAEE,MAAM2E,EAAQlD,KAAKmwC,mBAAqBznC,GAAQrF,aAAeqF,GAAQxF,MACjEC,EAASnD,KAAKmwC,mBAAqBznC,GAAQpF,cAAgBoF,GAAQvF,OACrEnD,KAAKitC,QAAQ/pC,QAAUA,GAASlD,KAAKitC,QAAQ9pC,SAAWA,GAE1DnD,KAAKitC,QAAQ/jC,QAAQhG,EAAOC,IChHlC,MAAMouC,WAAiB/rC,GAErBjH,cAEEE,QAGFF,SAIMiO,GAAajM,QAAQsM,eAEvBL,GAAajM,QAAQsM,gBAGnBL,GAAajM,QAAQwH,OAEvByE,GAAajM,QAAQwH,SAIrBy5B,GAASz5B,OAAOyE,GAAajM,QAAS0I,GAAc1I,QAASihC,GAASh4B,UAAU3B,mBAGlF7H,KAAKwxC,0BAEDhlC,GAAajM,QAAQuM,gBAEvBN,GAAajM,QAAQuM,iBAIzBvO,0BAEE,MAAMkzC,EAAmBxoC,GAAcpE,UAEvC,GAAI4sC,GAAoBjQ,GAASh4B,UAAUyB,GAAGymC,aAC9C,CAGE,MAAMC,EAAQnQ,GAASh4B,UAAUyB,GAAG2mC,UAAU3oC,GAAc1I,SAE5DkxC,EAAiBlE,iBAAiB9oC,KAAKwE,GAAc1I,QAAQgtC,kBAE7DkE,EAAiB1vC,SAAS0C,KAAKktC,EAAM5vC,UACrC0vC,EAAiB5uC,WAAW4B,KAAKktC,EAAM9uC,YAGvC,MAAMgvC,EAAsBrQ,GAASh4B,UAAU3B,kBAG/C25B,GAASh4B,UAAUyB,GAAGymC,cAAe,EAGrClQ,GAASh4B,UAAU1B,gBAAgB,MACnC05B,GAASh4B,UAAUzB,OAAOyE,GAAajM,QAASkxC,GAGhDjQ,GAASh4B,UAAU1B,gBAAgB+pC,GACnCrQ,GAASh4B,UAAUyB,GAAGymC,cAAe,ICItC,MAACI,GAAS,IAjEf,MAEEvzC,OAEE0c,QAAQkH,KAAK,uDACbzZ,GAAQkrB,OAOVr1B,gBAAgBgD,EAAGC,GAEjByZ,QAAQkH,KAAK,uDACbzZ,GAAQ4E,gBAAgB/L,EAAGC,GAG7BjD,SAEE0c,QAAQkH,KAAK,uDACbzZ,GAAQwD,SAOV3N,YAAY2E,EAAOC,GAEjB8X,QAAQkH,KAAK,uDACbzZ,GAAQ8E,YAAYtK,EAAOC,GAM7B5E,uBAAuBoF,GAGrB,OADAsX,QAAQkH,KAAK,uDACNzZ,GAAQqpC,uBAAuBpuC,GAMxCpF,oBAAoByE,GAGlB,OADAiY,QAAQkH,KAAK,uDACNzZ,GAAQspC,oBAAoBhvC,GAGrCzE,iBAGE,OADA0c,QAAQkH,KAAK,uDACNzZ,GAAQupC,iBAGjBpuC,mBAGE,OADAoX,QAAQkH,KAAK,uDACNzZ,GAAQ7E,eC/DZ,MAAMquC,GAEX3zC,aAAY+B,KAAEA,EAAIm0B,UAAEA,IAElBz0B,KAAKM,KAAOA,EACZN,KAAKy0B,UAAYA,EACjBz0B,KAAKmyC,QAAS,EAEdxtB,GAAqBytB,mBAAmBpyC,MAG1CzB,SAIAA,WAEEyB,KAAKy0B,UAAUG,UAAU3zB,OAAO,UAChC0jB,GAAqB0tB,iBAAiBryC,MAEtCA,KAAKmyC,QAAS,EAGhB5zC,UAIAA,UAEEyB,KAAKy0B,UAAUG,UAAU30B,IAAI,UAC7B0kB,GAAqB2tB,kBAAkBtyC,MAEvCA,KAAKmyC,QAAS,EAGhB5zC,YAAY4hB,GAEVngB,KAAKy0B,UAAUK,MAAMD,QAAU1U,EAAmB,GAAGngB,KAAKM,gBAC1DN,KAAKuyC,gBAGPh0C,gBAEMyB,KAAKy0B,UAAUK,MAAMD,QAAU,KAE7B70B,KAAKmyC,QAEPnyC,KAAKgM,WAKFhM,KAAKmyC,QAERnyC,KAAK+L,WCnDb,MAAMymC,WAAwBrxC,EAQ5B5C,YAAY2E,EAAOC,EAAQpE,EAAO+B,GAEhCoC,EAAQA,GAAS,EACjBC,EAASA,GAAU,EACnBpE,EAAQA,GAAS,UACjB+B,EAAWA,GAAY,IAAIY,EAAkB,CAAE3C,MAAOA,IAEtD,MAAM4B,EAAW,IAAImG,EAAc5D,EAAOC,GAC1CxC,EAASiC,SAAQ,MACjBnE,MAAMkC,EAAUG,ICjBpB,MAAM2xC,WAAsBtxC,EAQ1B5C,YAAY2E,EAAOC,EAAQpE,EAAO+B,GAEhCoC,EAAQA,GAAS,EACjBC,EAASA,GAAU,EACnBpE,EAAQA,GAAS,UACjB+B,EAAWA,GAAY,IAAIY,EAAkB,CAAE3C,MAAOA,IAGtDN,MADiB,IAAIqI,EAAc5D,EAAOC,GAC1BrC,ICrBpB,MAAM4xC,GAEJn0C,eAGAA,qBAAqBo0C,EAAQr7B,GAE3BA,EAAO3Y,KAAKi0C,MAAMt7B,EAAQq7B,GAG5Bp0C,yBAAyBy1B,EAAO5yB,GAE9B,MAAMyxC,EAAmBzxC,EAAO4yB,EAAMhzB,OAEtC,IAAK,IAAI+T,EAAI,EAAGA,EAAI89B,EAAkB99B,IAEpCif,EAAMr1B,KAAKq1B,EAAMjf,GAAG/C,SAIxBzT,mBAAmBy1B,EAAOmN,GAExB,MAAM7P,EAAQ0C,EAAMtG,QAAQyT,GACxB7P,GAAS,GAEX0C,EAAM/E,OAAOqC,EAAO,GAIxB/yB,yBAAyByU,EAAQsE,GAE/B,IAAIw7B,EAAgB9/B,EAAO,GACvBuwB,EAAmBuP,EAAcz/B,WAAWiE,GAChD,IAAK,IAAIvC,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IAE7B/B,EAAO+B,GAAG1B,WAAWiE,GAAUisB,IAEjCuP,EAAgB9/B,EAAO+B,GACvBwuB,EAAmBvwB,EAAO+B,GAAG1B,WAAWiE,IAG5C,OAAOw7B,EAGTv0C,8BAA8Bw0C,GAE5B,MAAMC,EAAMpoC,OAAO4P,KAAKu4B,GAClB56B,EAAM,GACZ,IAAK,IAAIpD,EAAI,EAAGA,EAAIi+B,EAAIhyC,OAAQ+T,IAE9BoD,EAAIxZ,KAAKo0C,EAAIC,EAAIj+B,KAEnB,OAAOoD,GClDX,MAAM86B,GAEJ10C,cAEEyB,KAAKiU,OAAS,IAAItS,EAGpBpD,WAAWyU,EAAQ2uB,EAAmBC,EAAc19B,GAElDlE,KAAKiU,OAAO7U,cAAc4T,GAE1B,MAAM6uB,EAAQvzB,KAAKwzB,SAASF,EAAe,GACrCG,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAAS39B,GAAW,EAEpDg+B,EAAkBliC,KAAKmiC,oBAAoBR,EAAmBE,GAC9DO,EAAoBpiC,KAAKqiC,sBAAsBV,EAAmBE,GAClES,EAAoBtiC,KAAKuiC,sBAAsBZ,EAAmBI,GAClES,EAAqBxiC,KAAKyiC,uBAAuBd,EAAmBI,GAEpEW,EAAqB,IAAI9jC,EAAQ,EAAG,GAAI,GAAG+jC,gBAAgBhB,GAE3DiB,EAAgB5iC,KAAKiU,OAAOnS,OAAOkQ,QAEnC6wB,EAAqB7iC,KAAK8iC,yBAA8C,EAArB9iC,KAAKiU,OAAOrS,OAAiC,EAArB5B,KAAKiU,OAAOrS,OAAYggC,EAAc19B,GACjH6+B,EAAUH,EAAc5wB,QAAQ/R,IAAIyiC,EAAmB1wB,QAAQpO,gBAAqC,EAAtBi/B,IAE9EG,GAAc,IAAIC,GAAQC,8BAA8BhB,EAAiBa,GACzEI,GAAc,IAAIF,GAAQC,8BAA8Bd,EAAmBW,GAE3EK,GAAe,IAAIH,GAAQC,8BAA8BZ,EAAmBS,GAC5EM,GAAe,IAAIJ,GAAQC,8BAA8BV,EAAoBO,GAEnF/iC,KAAKsjC,+BAA+BP,EAAS/vB,EAAQ2uB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAE1GL,EAASE,8BAA8BhB,EAAiBa,GACxDI,EAAWD,8BAA8Bd,EAAmBW,GAE5DK,EAAWF,8BAA8BZ,EAAmBS,GAC5DM,EAAYH,8BAA8BV,EAAoBO,GAE9D,IAAIQ,EAAmBxnB,EAAAA,EAEvB,MAAMynB,EAAcd,EAAmB1wB,QAAQpO,gBAAqC,EAAtBi/B,GAC9D,IAAK,IAAI9tB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE,MAAM9B,EAAO,IAAIwwB,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAIujC,IAE1DE,EAAwB,IAAI9kC,EAC5B+kC,EAAyB,IAAI/kC,EAE7BglC,EAA0B,IAAIhlC,EAC9BilC,EAA0B,IAAIjlC,EAEpCokC,EAASc,cAAc7wB,EAAOywB,GAC9BP,EAAWW,cAAc7wB,EAAM0wB,GAE/BP,EAAWU,cAAc7wB,EAAO2wB,GAChCP,EAAYS,cAAc7wB,EAAM4wB,GAE5BH,EAAqB1iC,SAAW,MAElCia,QAAQS,IAAI,4BAA6B3G,GAEvC4uB,EAAuB3iC,SAAW,MAEpCia,QAAQS,IAAI,8BAA+B3G,GAEzC6uB,EAAuB5iC,SAAW,MAEpCia,QAAQS,IAAI,8BAA+B3G,GAEzC8uB,EAAwB7iC,SAAW,MAErCia,QAAQS,IAAI,+BAAgC3G,GAG9C,MAAMgvB,EAAoB/wB,EAAO+B,GAAG/C,QAAQsB,IAAIowB,GAAsB1iC,SAChEgjC,EAAoBhxB,EAAO+B,GAAG/C,QAAQsB,IAAIqwB,GAAwB3iC,SAElEijC,EAAsBjxB,EAAO+B,GAAG/C,QAAQsB,IAAIswB,GAAwB5iC,SACpEkjC,EAAsBlxB,EAAO+B,GAAG/C,QAAQsB,IAAIuwB,GAAyB7iC,SAErEmjC,EAAkB71B,KAAKmI,IAAIstB,EAAiBC,GAC5CI,EAAkB91B,KAAKmI,IAAIwtB,EAAmBC,GAE9CztB,EAAMnI,KAAKmI,IAAI0tB,EAAcC,GAE/B3tB,EAAM8sB,IAERA,EAAmB9sB,GAIvB,MAAM4tB,EAAqB3B,EAAmB1wB,QAAQpO,eAAe2/B,GAGrE,OAFyBR,EAAQ/wB,QAAQ/R,IAAIokC,GAK/C9lC,+BAA+B+lC,EAAYtxB,EAAQ2uB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBvkC,KAAKwkC,wBAAwBxxB,EAAQmwB,EAAYH,EAAUrB,GAC7E8C,EAAoBzkC,KAAKkzC,0BAA0BlgC,EAAQowB,EAAYC,EAAa1B,GAE1F2C,EAAWrkC,IAAIskC,GACfD,EAAWrkC,IAAIwkC,GAGjBlmC,wBAAwByU,EAAQmwB,EAAYH,EAAUrB,GAEpD,IAEIwR,EACAC,EAHAzO,EAA+B5oB,EAAAA,EAC/B6oB,EAAkC7oB,EAAAA,EAItC,MAAM8oB,EAAS,IAAIjmC,EAAQ,EAAG,EAAG,GAAG+jC,gBAAgBhB,GACpD,IAAK,IAAI5sB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE,MAAM+vB,EAAc,IAAIrB,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAI4kC,EAAO7yB,QAAQpO,gBAAgB,OAChGmhC,EAAc,IAAItB,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAI4kC,EAAO7yB,QAAQpO,eAAe,OAE/F+/B,EAA0B,IAAI/kC,EAC9B8kC,EAAuB,IAAI9kC,EAEjCukC,EAAWW,cAAcgB,EAAYnB,GACrCX,EAASc,cAAciB,EAASrB,GAEhC,MAAMsB,EAAcrB,EAAuBtwB,WAAWL,EAAO+B,IACvDkwB,EAAcvB,EAAqBrwB,WAAWL,EAAO+B,IAEvD2uB,EAAqB1iC,SAAW,MAElCia,QAAQS,IAAI,qCAAsC3G,GAEhD4uB,EAAuB3iC,SAAW,MAEpCia,QAAQS,IAAI,uCAAwC3G,GAGlDiwB,EAAYJ,IAEdA,EAAiCI,EACjCoO,EAAqBpgC,EAAO+B,IAE1BkwB,EAAUN,IAEZA,EAA+BM,EAC/BkO,EAAmBngC,EAAO+B,IAI9BkG,QAAQS,IAAIy3B,EAAkBC,GAE9B,MAAMlO,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAO7yB,QAAQpO,gBAAgBshC,GAGxC3mC,0BAA0ByU,EAAQowB,EAAYC,EAAa1B,GAEzD,IAEI0R,EACAC,EAHAnO,EAAkCppB,EAAAA,EAClCqpB,EAAkCrpB,EAAAA,EAItC,MAAMspB,EAAY,IAAIzmC,EAAQ,EAAG,EAAG,GAAG+jC,gBAAgBhB,GAEvD,IAAK,IAAI5sB,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE,MAAMuwB,EAAa,IAAI7B,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAIolC,EAAUrzB,QAAQpO,gBAAgB,OAClG2hC,EAAa,IAAI9B,EAAMzwB,EAAO+B,GAAG/C,QAASgB,EAAO+B,GAAG/C,QAAQ/R,IAAIolC,EAAUrzB,QAAQpO,eAAe,OAEjGggC,EAA0B,IAAIhlC,EAC9BilC,EAA0B,IAAIjlC,EAEpCwkC,EAAWU,cAAcwB,EAAY1B,GACrCP,EAAYS,cAAcyB,EAAY1B,GAEtC,MAAM2B,EAAa5B,EAAuBvwB,WAAWL,EAAO+B,IACtD0wB,EAAa5B,EAAwBxwB,WAAWL,EAAO+B,IAEzD6uB,EAAuB5iC,SAAW,MAEpCia,QAAQS,IAAI,8BAA+B3G,GAEzC8uB,EAAwB7iC,SAAW,MAErCia,QAAQS,IAAI,+BAAgC3G,GAG1CywB,EAAYJ,IAEdA,EAAiCI,EACjC8N,EAAqBtgC,EAAO+B,IAE1B0wB,EAAaN,IAEfA,EAAkCM,EAClC4N,EAAsBrgC,EAAO+B,IAIjC,MAAMmwB,GAAcC,EAAkCC,GAAkC,EAKxF,OAFAnqB,QAAQS,IAAI23B,EAAqBC,GAE1BjO,EAAUrzB,QAAQpO,gBAAgBshC,GAG3C3mC,oBAAoBojC,EAAmBE,GAErC,MAAMK,EAAkB,IAAItjC,EAAQ,GAAI,EAAG,GAG3C,OAFAsjC,EAAgBS,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,GAAIijC,IACxFK,EAAgBS,gBAAgBhB,GACzBO,EAGT3jC,sBAAsBojC,EAAmBE,GAEvC,MAAMO,EAAoB,IAAIxjC,EAAQ,EAAG,EAAG,GAG5C,OAFAwjC,EAAkBO,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,IAAKijC,IAC3FO,EAAkBO,gBAAgBhB,GAC3BS,EAGT7jC,sBAAsBojC,EAAmBI,GAEvC,MAAMO,EAAoB,IAAI1jC,EAAQ,EAAG,EAAG,GAG5C,OAFA0jC,EAAkBK,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,GAAImjC,IAC1FO,EAAkBK,gBAAgBhB,GAC3BW,EAGT/jC,uBAAuBojC,EAAmBI,GAExC,MAAMS,EAAqB,IAAI5jC,GAAS,EAAG,EAAG,GAG9C,OAFA4jC,EAAmBG,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,IAAKmjC,IAC5FS,EAAmBG,gBAAgBhB,GAC5Ba,EAGTjkC,yBAAyB2E,EAAOC,EAAQy+B,EAAc19B,GAEpD,MAAM29B,EAASD,EAAe,EAAKtzB,KAAK0J,GAAK,IACvC+pB,EAAS,EAAIzzB,KAAK0zB,KAAK1zB,KAAK2zB,IAAIJ,GAAS39B,GAAW,EAEpD0hC,EAAQziC,EAASmL,KAAK2zB,IAAIJ,GAC1BgE,EAAQ3iC,EAAQoL,KAAK2zB,IAAIF,GAC/B,OAAOzzB,KAAKoI,IAAIpI,KAAKoC,IAAIm1B,GAAQv3B,KAAKoC,IAAIk1B,KCzP9C,MAAM2N,GAEJh1C,uCAAuCi1C,GAErC,MAAMC,EAAUD,EAAgBliB,MAC1BoiB,EAAYF,EAAgBp2B,aAAa,YAGzCu2B,EAAW,GAEjB,IAAK,IAAI5+B,EAAI,EAAGA,EAAI0+B,EAAQvW,MAAOnoB,GAAK,EAGtC4+B,EAASh1C,KAAK+0C,EAAUE,KAAKH,EAAQzf,MAAMjf,EAAI,KAC/C4+B,EAASh1C,KAAK+0C,EAAUG,KAAKJ,EAAQzf,MAAMjf,EAAI,KAC/C4+B,EAASh1C,KAAK+0C,EAAUI,KAAKL,EAAQzf,MAAMjf,EAAI,KAQ/C4+B,EAASh1C,KAAK+0C,EAAUE,KAAKH,EAAQzf,MAAMjf,EAAI,KAC/C4+B,EAASh1C,KAAK+0C,EAAUG,KAAKJ,EAAQzf,MAAMjf,EAAI,KAC/C4+B,EAASh1C,KAAK+0C,EAAUI,KAAKL,EAAQzf,MAAMjf,EAAI,KAQ/C4+B,EAASh1C,KAAK+0C,EAAUE,KAAKH,EAAQzf,MAAMjf,EAAI,KAC/C4+B,EAASh1C,KAAK+0C,EAAUG,KAAKJ,EAAQzf,MAAMjf,EAAI,KAC/C4+B,EAASh1C,KAAK+0C,EAAUI,KAAKL,EAAQzf,MAAMjf,EAAI,KAOjD,MAAMpU,EAAW,IAAIxB,EAIrB,OAFAwB,EAAS60B,aAAa,WAAY,IAAI4H,EAAgB,IAAI3sB,aAAakjC,GAAW,IAClFJ,GAAkBQ,0BAA0BpzC,GACrCA,EAGTpC,iCAAiCy1C,GAE/B,MAAMC,EAAkB,GAClBP,EAAYM,EAA4B52B,aAAa,YAE3D,IAAK,IAAIrI,EAAI,EAAGA,EAAI2+B,EAAUxW,MAAOnoB,GAAK,EAExCk/B,EAAgBt1C,KAAK,GACrBs1C,EAAgBt1C,KAAK,GACrBs1C,EAAgBt1C,KAAK,GAErBs1C,EAAgBt1C,KAAK,GACrBs1C,EAAgBt1C,KAAK,GACrBs1C,EAAgBt1C,KAAK,GAErBs1C,EAAgBt1C,KAAK,GACrBs1C,EAAgBt1C,KAAK,GACrBs1C,EAAgBt1C,KAAK,GAEvBq1C,EAA4Bxe,aAAa,cAAe,IAAI4H,EAAgB,IAAI3sB,aAAawjC,GAAkB,KCvEnH,MAAMC,GAEJ31C,mBAAmBk2B,GAEjB,MAAM0f,EAAS1f,EAAU5X,iBAAiB,OAE1C,IAAK,IAAI9H,EAAI,EAAGA,EAAIo/B,EAAOnzC,OAAQ+T,IACnC,CACE,MAAMzN,EAAQ6sC,EAAOp/B,GAEjBzN,EAAM8sC,QAAQptC,MAEhBM,EAAMN,IAAMM,EAAM8sC,QAAQptC,KAI9B,MAAMqtC,EAAgB5f,EAAU5X,iBAAiB,UAEjD,IAAK,IAAI9H,EAAI,EAAGA,EAAIs/B,EAAcrzC,OAAQ+T,IAC1C,CACE,MAAMu/B,EAAeD,EAAct/B,GAE/Bu/B,EAAaF,QAAQptC,MAEvBstC,EAAan3B,KAAOm3B,EAAaF,QAAQptC,MAK/CzI,mBAAmBk2B,GAEjB,MAAM8f,EAAS9f,EAAU5X,iBAAiB,SAE1C,IAAK,IAAI9H,EAAI,EAAGA,EAAIw/B,EAAOvzC,OAAQ+T,IACnC,CACE,MAAMy/B,EAAQD,EAAOx/B,GAEjBy/B,EAAMJ,QAAQptC,MAEhBwtC,EAAMxtC,IAAMwtC,EAAMJ,QAAQptC,MAKhCzI,oBAAoBk2B,GAElB,MAAMggB,EAAUhgB,EAAU5X,iBAAiB,UAE3C,IAAK,IAAI9H,EAAI,EAAGA,EAAI0/B,EAAQzzC,OAAQ+T,IACpC,CACE,MAAM2/B,EAASD,EAAQ1/B,GAEnB2/B,EAAON,QAAQptC,MAEjB0tC,EAAO1tC,IAAM0tC,EAAON,QAAQptC,MAKlCzI,qBAAqBk2B,EAAWkgB,GAE9B,MAAMn9B,EAAWid,EAAU5X,iBAAiB83B,GAE5C,IAAK,IAAI5/B,EAAI,EAAGA,EAAIyC,EAASxW,OAAQ+T,IACrC,CACE,MAAM6J,EAAUpH,EAASzC,GAErB6J,EAAQw1B,QAAQptC,MAElB4X,EAAQ5X,IAAM4X,EAAQw1B,QAAQptC,OCnEtC,MAAM4tC,GAEJr2C,eAGAA,sBAAsB+I,GAEpB,MAAM8B,EAASwF,SAASC,cAAc,UACtCzF,EAAOlG,MAAQoE,EAAMpE,MACrBkG,EAAOjG,OAASmE,EAAMnE,OAEtB,MAAMsC,EAAU2D,EAAO0B,WAAW,MAGlC,OAFArF,EAAQsJ,UAAUzH,EAAO,EAAG,GAErB7B,EAAQovC,aAAa,EAAG,EAAGvtC,EAAMpE,MAAOoE,EAAMnE,QAGvD5E,iBAAiBu2C,EAAWvzC,EAAGC,GAE7B,MAAMO,EAAuC,GAA3BR,EAAIuzC,EAAU5xC,MAAQ1B,GAClC2b,EAAO23B,EAAU33B,KACvB,OAAO,IAAI/U,EAAQ+U,EAAKpb,EAAW,GAAIob,EAAKpb,EAAW,GAAIob,EAAKpb,EAAW,GAAIob,EAAKpb,EAAW,KCqL9F,MAACgzC,GAAe,IA1MrB,MAEEx2C,eAKAA,OAAOkE,EAAiBuyC,GAEtB,MAAMC,EAAa,GAEnB,IAAIC,EAAW,SAEf,MAAMvB,EAAWlxC,EAAgB2a,aAAa,YACxC+3B,EAAU1yC,EAAgB2a,aAAa,UACvCg4B,EAAW3yC,EAAgB2a,aAAa,WACxCkgB,EAAM76B,EAAgB2a,aAAa,MACnCq2B,EAAWhxC,EAAgB6uB,MAE3B+jB,EAAQ,GAEd,IAAK,IAAItgC,EAAI,EAAGA,EAAI0+B,EAAQvW,MAAOnoB,GAAK,EACxC,CACE,MAAMugC,EAAU7B,EAAQzf,MAAMjf,EAAI,GAC5BwgC,EAAU9B,EAAQzf,MAAMjf,EAAI,GAC5BygC,EAAU/B,EAAQzf,MAAMjf,EAAI,GAE5B0gC,EAAK,IAAI72C,EACf62C,EAAGl0C,EAAIoyC,EAASC,KAAK0B,GACrBG,EAAGj0C,EAAImyC,EAASE,KAAKyB,GACrBG,EAAGh0C,EAAIkyC,EAASG,KAAKwB,GAErB,MAAMI,EAAK,IAAI92C,EACf82C,EAAGn0C,EAAIoyC,EAASC,KAAK2B,GACrBG,EAAGl0C,EAAImyC,EAASE,KAAK0B,GACrBG,EAAGj0C,EAAIkyC,EAASG,KAAKyB,GAErB,MAAMnZ,EAAK,IAAIx9B,EACfw9B,EAAG76B,EAAIoyC,EAASC,KAAK4B,GACrBpZ,EAAG56B,EAAImyC,EAASE,KAAK2B,GACrBpZ,EAAG36B,EAAIkyC,EAASG,KAAK0B,GAErB,MAAMG,EAAO,CACX13B,EAAGw3B,EACHv+B,EAAGw+B,EACHE,EAAGxZ,GAGL,GAAI+Y,EACJ,CACE,MAAM97B,EAAK,IAAIza,EACfya,EAAG9X,EAAI4zC,EAAQvB,KAAK0B,GACpBj8B,EAAG7X,EAAI2zC,EAAQtB,KAAKyB,GACpBj8B,EAAG5X,EAAI0zC,EAAQrB,KAAKwB,GAEpB,MAAMO,EAAK,IAAIj3C,EACfi3C,EAAGt0C,EAAI4zC,EAAQvB,KAAK2B,GACpBM,EAAGr0C,EAAI2zC,EAAQtB,KAAK0B,GACpBM,EAAGp0C,EAAI0zC,EAAQrB,KAAKyB,GAEpB,MAAMO,EAAK,IAAIl3C,EACfk3C,EAAGv0C,EAAI4zC,EAAQvB,KAAK4B,GACpBM,EAAGt0C,EAAI2zC,EAAQtB,KAAK2B,GACpBM,EAAGr0C,EAAI0zC,EAAQrB,KAAK0B,GAEpB,MAAMvhB,EAAS5a,EAAGrH,QAAQ/R,IAAI41C,GAAI51C,IAAI61C,GAAI7jC,YAC1C0jC,EAAK1hB,OAASA,EAGhB,GAAImhB,EACJ,CACE,MAAM/7B,EAAK,IAAIza,EACfya,EAAG9X,EAAI6zC,EAASxB,KAAK0B,GACrBj8B,EAAG7X,EAAI4zC,EAASvB,KAAKyB,GACrBj8B,EAAG5X,EAAI2zC,EAAStB,KAAKwB,GAErB,MAAMO,EAAK,IAAIj3C,EACfi3C,EAAGt0C,EAAI6zC,EAASxB,KAAK2B,GACrBM,EAAGr0C,EAAI4zC,EAASvB,KAAK0B,GACrBM,EAAGp0C,EAAI2zC,EAAStB,KAAKyB,GAErB,MAAMO,EAAK,IAAIl3C,EACfk3C,EAAGv0C,EAAI6zC,EAASxB,KAAK4B,GACrBM,EAAGt0C,EAAI4zC,EAASvB,KAAK2B,GACrBM,EAAGr0C,EAAI2zC,EAAStB,KAAK0B,GAErB,MAAMO,EAAU18B,EAAGrH,QAAQ/R,IAAI41C,GAAI51C,IAAI61C,GAAI7jC,YAC3C0jC,EAAKI,QAAUA,EAEjB,GAAIzY,EACJ,CACE,MAAM0Y,EAAO,IAAI5yC,EACjB4yC,EAAKz0C,EAAI+7B,EAAIsW,KAAK0B,GAClBU,EAAKx0C,EAAI87B,EAAIuW,KAAKyB,GAElB,MAAMW,EAAO,IAAI7yC,EACjB6yC,EAAK10C,EAAI+7B,EAAIsW,KAAK2B,GAClBU,EAAKz0C,EAAI87B,EAAIuW,KAAK0B,GAElB,MAAMW,EAAO,IAAI9yC,EACjB8yC,EAAK30C,EAAI+7B,EAAIsW,KAAK4B,GAClBU,EAAK10C,EAAI87B,EAAIuW,KAAK2B,GAElBG,EAAKK,KAAOA,EACZL,EAAKM,KAAOA,EACZN,EAAKO,KAAOA,EAGdb,EAAM12C,KAAKg3C,GAEX,MAAMQ,EAAOn2C,KAAKo2C,cAAcT,GAChCT,EAAW5mC,KAAKmI,IAAI0/B,EAAMjB,GAC1BD,EAAWt2C,KAAKw3C,GAGlB,MAAME,EAAyBr2C,KAAKs2C,8BAA8BrB,EAAYC,EAAUG,GAClFkB,EAAiBv2C,KAAKw2C,oBAAoBH,EAAwBrB,GAExE,OADqBh1C,KAAKy2C,uBAAuBF,GAInDh4C,uBAAuB82C,GAErB,MAAMqB,EAAiB,GACjBC,EAAkB,GAClBC,EAAmB,GACnBC,EAAc,GAEpB,IAAK,IAAI9hC,EAAI,EAAGA,EAAIsgC,EAAMr0C,OAAQ+T,IAClC,CACE,MAAM4gC,EAAON,EAAMtgC,GAEb+hC,EAAKxoC,KAAKgK,SACVy+B,EAAKzoC,KAAKgK,SAEhBo+B,EAAe/3C,KAAKqB,KAAKg3C,qBAAqBF,EAAIC,EAAIpB,EAAK13B,EAAG03B,EAAKz+B,EAAGy+B,EAAKC,GAAG5jC,SAC1E2jC,EAAK1hB,QAEP0iB,EAAgBh4C,KAAKg3C,EAAK1hB,OAAOjiB,SAE/B2jC,EAAKI,SAEPa,EAAiBj4C,KAAKg3C,EAAKI,QAAQ/jC,SAEjC2jC,EAAKK,MAEPa,EAAYl4C,KAAKqB,KAAKg3C,qBAAqBF,EAAIC,EAAIpB,EAAKK,KAAML,EAAKM,KAAMN,EAAKO,MAAMlkC,SAGxF,MAAO,CAAEgB,OAAQ0jC,EAAgBvB,QAASwB,EAAiBvB,SAAUwB,EAAkBtZ,IAAKuZ,GAG9Ft4C,oBAAoB82C,EAAO4B,GAEzB,MAAMV,EAAiB,GACvB,IAAK,IAAIxhC,EAAI,EAAGA,EAAIkiC,EAAQliC,IAC5B,CACE,MACMmiC,EAAgB7B,EADP/mC,KAAK+J,MAAM/J,KAAKgK,SAAW+8B,EAAMr0C,SAGhDu1C,EAAe53C,KAAKu4C,GAGtB,OAAOX,EAGTh4C,8BAA8B02C,EAAYkC,EAAc9B,GAEtD,MAAM+B,EAA4B,GAClC,IAAK,IAAIriC,EAAI,EAAGA,EAAIkgC,EAAWj0C,OAAQ+T,IACvC,CACEkgC,EAAWlgC,IAAMoiC,EACjB,MAAME,EAAqB/oC,KAAK+J,MAAM/J,KAAKyI,MAAMk+B,EAAWlgC,KAC5D,IAAK,IAAIuiC,EAAI,EAAGA,EAAID,EAAoBC,IAEtCF,EAA0Bz4C,KAAK02C,EAAMtgC,IAGzC,OAAOqiC,EAGT74C,cAAco3C,GAEZ,MAAM4B,EAAO5B,EAAKz+B,EAAElF,QAAQsB,IAAIqiC,EAAK13B,GAC/Bu5B,EAAO7B,EAAKC,EAAE5jC,QAAQsB,IAAIqiC,EAAK13B,GACrC,OAAOs5B,EAAKhQ,MAAMiQ,GAAMx2C,SAAW,EAGrCzC,qBAAqBu4C,EAAIC,EAAItB,EAAIC,EAAItZ,GAE/B0a,EAAKC,EAAK,IAEZD,EAAK,EAAMA,EACXC,EAAK,EAAMA,GAGb,MAAMU,EAAK,GAAOX,EAAKC,GAEvB,OAAOtB,EAAGzjC,QAAQpO,eAAekzC,GAAI72C,IAAIy1C,EAAG1jC,QAAQpO,eAAemzC,IAAK92C,IAAIm8B,EAAGpqB,QAAQpO,eAAe6zC,MCxCrG,MAACC,GAAkB,IA5JxB,MAEEn5C,SAASiC,EAAOm3C,GAEdn3C,EAAMC,UAAUC,IAEVA,aAAiBS,IAEfT,EAAMC,WAERD,EAAMC,UAAW,IAAIxB,GAAiBy4C,aAAal3C,EAAMC,WAE3Dg3C,EAAgBj3C,OAKtBnC,eAAeiC,GAEb,MAAMq3C,EAAa,GAMnB,OAJA73C,KAAK83C,SAASt3C,GAAQE,IAEpBm3C,EAAWl5C,KAAK+B,EAAMC,aAEjBk3C,EAGTt5C,gBAAgBiC,EAAOM,EAAUR,GAE/BE,EAAMC,UAAUC,IAEVA,aAAiBS,SAGNwD,IAATrE,GAOEI,EAAMJ,OAASA,KALnBI,EAAMI,SAAWA,MAczBvC,oBAAoBmuB,GAElB,MAAM1a,EAAQ,CACZ+lC,WAAYrrB,EAAKqrB,WACjBv3C,MAAOksB,EAAKlsB,MAAMwR,OAAM,IAGpBgmC,EAAgB,GAEtBtrB,EAAKlsB,MAAMC,UAASuc,IAEdA,EAAKi7B,gBAEPD,EAAch7B,EAAK1c,MAAQ0c,MAI/B,MAAMk7B,EAAa,GACbC,EAAqB,GAE3BnmC,EAAMxR,MAAMC,UAASuc,IAEfA,EAAKo7B,SAEPF,EAAWl7B,EAAK1c,MAAQ0c,GAGtBA,EAAKi7B,gBAEPE,EAAmBn7B,EAAK1c,MAAQ0c,MAIpC,IAAK,MAAM1c,KAAQ03C,EACnB,CACE,MACMK,EADcL,EAAc13C,GACL+3C,SACvBC,EAAmBH,EAAmB73C,GAEtCi4C,EAAoB,GAE1B,IAAK,IAAIxjC,EAAI,EAAGA,EAAIsjC,EAASG,MAAMx3C,SAAU+T,EAC7C,CACE,MAAM0jC,EAAYP,EAAWG,EAASG,MAAMzjC,GAAGzU,MAC/Ci4C,EAAkB55C,KAAK85C,GAGzBH,EAAiBvzB,KACf,IAAI2zB,EAASH,EAAmBF,EAASM,cACzCL,EAAiBM,aAGrB,OAAO5mC,EAGTzT,kBAAkBiC,EAAOq4C,EAAMC,GAE7Bt4C,EAAMC,UAAUC,IAEVA,aAAiBS,IAEnBT,EAAMq4C,WAAaF,EACnBn4C,EAAMs4C,cAAgBF,MAK5Bv6C,cAAciC,EAAOu6B,EAAa4c,GAEhCn3C,EAAMC,UAAUsyC,IAEVA,EAAIzyC,OAASy6B,GAEf4c,EAAgB5E,MAKtBx0C,WAAWiC,EAAOu6B,GAEhB,IAAImN,EAQJ,OAPA1nC,EAAMC,UAAUsyC,IAEVA,EAAIzyC,OAASy6B,IAEfmN,EAAS6K,MAGN7K,EAGT3pC,mBAAmBiC,EAAOy4C,GAExB,IAAI/Q,EAQJ,OAPA1nC,EAAMC,UAAUsyC,IAEVA,EAAIhoC,YAAYzK,OAAS24C,IAE3B/Q,EAAS6K,MAGN7K,IC5JX,MAAMgR,GAEJ36C,iBAAiB46C,GAEf,OAAQA,GAAwB,iBAATA,IAAsBC,MAAMC,QAAQF,GAG7D56C,kBAAkB+Y,KAAWgiC,GAE3B,IAAKA,EAAQt4C,OAAQ,OAAOsW,EAC5B,MAAMq7B,EAAS2G,EAAQpjC,QAEvB,GAAIgjC,GAAgBK,UAAUjiC,IAAW4hC,GAAgBK,UAAU5G,GAEjE,IAAK,MAAM9H,KAAO8H,EAEZuG,GAAgBK,UAAU5G,EAAO9H,KAE9BvzB,EAAOuzB,IAAMjgC,OAAOC,OAAOyM,EAAQ,CAAE/Y,CAACssC,GAAM,KACjDqO,GAAgBM,WAAWliC,EAAOuzB,GAAM8H,EAAO9H,KAI/CjgC,OAAOC,OAAOyM,EAAQ,CAAE/Y,CAACssC,GAAM8H,EAAO9H,KAK5C,OAAOqO,GAAgBM,WAAWliC,KAAWgiC,GAG/C/6C,mBAAmB4gB,GAGjB,IAAI4zB,EAAM,GAEV,GAAqB,IAAjB5zB,EAAIs6B,UAGN,GAAIt6B,EAAI4U,WAAW/yB,OAAS,EAC5B,CACE+xC,EAAI,eAAiB,GACrB,IAAK,IAAIuE,EAAI,EAAGA,EAAIn4B,EAAI4U,WAAW/yB,OAAQs2C,IAC3C,CACE,MAAMoC,EAAYv6B,EAAI4U,WAAWolB,KAAK7B,GACtCvE,EAAI,eAAe2G,EAAUC,UAAYD,EAAUE,iBAI/B,IAAjBz6B,EAAIs6B,WAEX1G,EAAM5zB,EAAIy6B,WAIZ,GAAIz6B,EAAI06B,gBAEN,IAAK,IAAI9kC,EAAI,EAAGA,EAAIoK,EAAI26B,WAAW94C,OAAQ+T,IAC3C,CACE,MAAMokC,EAAOh6B,EAAI26B,WAAWX,KAAKpkC,GAC3B4kC,EAAWR,EAAKQ,SACtB,QAA+B,IAAnB5G,EAAI4G,GAEd5G,EAAI4G,GAAY35C,KAAK+5C,YAAYZ,OAGnC,CACE,QAAoC,IAAxBpG,EAAI4G,GAAc,KAC9B,CACE,MAAMK,EAAMjH,EAAI4G,GAChB5G,EAAI4G,GAAY,GAChB5G,EAAI4G,GAAUh7C,KAAKq7C,GAErBjH,EAAI4G,GAAUh7C,KAAKqB,KAAK+5C,YAAYZ,KAI1C,OAAOpG,GC7EX,MAAMkH,GAEJ17C,eAGAA,0BAEE,MAAM27C,EAAY,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAC1E,IAAIC,EAAM,IAEV,IAAK,IAAIplC,EAAI,EAAGA,EAAI,EAAGA,IACvB,CAEEolC,GAAOD,EADO5rC,KAAK+J,MAAM/J,KAAKgK,SAAW4hC,EAAUl5C,SAIrD,OAAOm5C,EAGT57C,kBAAkBmlB,GAEhB,MAAM02B,EAAQ12B,EAAO7K,MAAM,KAE3B,IAAK,IAAI9D,EAAI,EAAGA,EAAIqlC,EAAMp5C,OAAQ+T,IAEhCqlC,EAAMrlC,GAAKqlC,EAAMrlC,GAAG,GAAG6O,cAAgBw2B,EAAMrlC,GAAGslC,OAAO,GAGzD,OAAOD,EAAMtrB,KAAK,KAGpBvwB,+BAA+BmlB,GAE7B,OAAOA,EAAO42B,OAAO,GAAG12B,cAAgBF,EAAOmL,MAAM,GAGvDtwB,0BAA0BmlB,GAExB,OAAOA,EAAO4J,cAAczJ,QAAQ,iBAAkBE,GAAUA,EAAM8K,OAAO,GAAGjL,iBCtCpF,MAAM22B,GAEJh8C,eAIAA,eAAei8C,GAEbA,EAAWA,EAAS3hC,MAAM,KAE1B,IAAI4hC,EAAQn+B,OAAOk+B,EAAS,IAC5BC,EAAgB,GAARA,EAAa,GAAK,IAE1B,IAAIC,EAAUp+B,OAAOk+B,EAAS,IAC9BE,EAAoB,GAAVA,EAAe,IAEzB,IAAIC,EAAUr+B,OAAOk+B,EAAS,IAG9B,OAFAG,GAAoB,IAEbF,EAAQC,EAAUC,GCnB7B,MAAMC,GAEJr8C,eAGAA,cAAcqZ,GAEZ,OAAO0E,OAAO1E,KAAOA,GAAKA,EAAI,GAAM,EAGtCrZ,gBAAgBqZ,GAEd,OAAO0E,OAAO1E,KAAOA,GAAKA,EAAI,GAAM,EAGtCrZ,iBAAiBqZ,GAEf,OAAO5X,KAAK+oB,OAAOnR,IAAM5X,KAAKgpB,SAASpR,GAGzCrZ,eAAes8C,GAEb,IAEE3gC,KAAKC,MAAM0gC,GAEb,MAAO9uB,GAEL,OAAO,EAGT,OAAO,GClBX,MAAM+uB,WAAa35C,EAEjB5C,cAEE,MAAMuC,EAAW,IAAI8E,EAAe,CAClCI,SAAU,CACRgL,OAAQ,CAAEhO,MAAO,IAAIsB,EAAM,aAE7B8B,6OACAC,0WAEAgF,WAAY,CAAE0vC,aAAa,GAC3BrnC,aAAa,EACbpN,YAAY,IAGR00C,EAAiB,IAAIl0C,EAAc,IAAK,IAAK,IAAK,KAIxDrI,MAF6B80C,GAAkB0H,gCAAgCD,GAEnDl6C,GAE5Bd,KAAKk7C,SAAS35C,GAAI,MCvBtB,MAAMjC,WAAa6B,EAKjB5C,YAAYyU,GAEV,MAAMrS,EAAW,IAAIxB,EACrBwB,EAAS60B,aAAa,WAAsB,IAAI4H,EAAgB,IAAI3sB,aAAa,IAAK,IACtF9P,EAAS60B,aAAa,gBAAsB,IAAI4H,EAAgB,IAAI3sB,aAAa,IAAK,IACtF9P,EAAS60B,aAAa,oBAAsB,IAAI4H,EAAgB,IAAI3sB,aAAa,IAAK,IACtF9P,EAAS60B,aAAa,cAAsB,IAAI4H,EAAgB,IAAI3sB,aAAa,IAAK,IACtF9P,EAAS60B,aAAa,WAAsB,IAAI4H,EAAgB,IAAI3sB,aAAa,IAAK,IAEtF,MAAM3P,EAAW,IAAI8E,EAAe,CAClCI,SAAU,CACRm1C,WAAY,CAAEn4C,MAAO,IACrBo4C,QAAS,CAAEp4C,MAAO,GAClBq4C,aAAc,CAAEr4C,MAAO,GACvBgO,OAAQ,CAAEhO,MAAO,IAAIsB,EAAM,aAE7B8B,+sBACAC,8jBACAqN,aAAa,EACbpN,YAAY,EAEZ+E,WAAY,CAAE0vC,aAAa,KAI7Bt8C,MAAMkC,EAAUG,GAChBd,KAAKc,SAAWA,EACZkS,GAEFhT,KAAKs7C,MAAMtoC,GAOfzU,MAAMyU,GAEJ,MAAM2gC,EAAW,GACX4H,EAAgB,GAChBC,EAAoB,GACpBC,EAAc,GACdC,EAAW,GACjB,IAAIC,EAAqB,EAEzB,IAAK,IAAI5mC,EAAI,EAAGA,EAAI/B,EAAOhS,OAAQ+T,IACnC,CACE4+B,EAASh1C,KAAKqU,EAAO+B,GAAGxT,GACxBoyC,EAASh1C,KAAKqU,EAAO+B,GAAGvT,GACxBmyC,EAASh1C,KAAKqU,EAAO+B,GAAGtT,GACxBg6C,EAAY98C,KAAK,GAEjBg1C,EAASh1C,KAAKqU,EAAO+B,GAAGxT,GACxBoyC,EAASh1C,KAAKqU,EAAO+B,GAAGvT,GACxBmyC,EAASh1C,KAAKqU,EAAO+B,GAAGtT,GACxBg6C,EAAY98C,MAAM,GAElB,MAAMi9C,EAAa57C,KAAK67C,oBAAoB7oC,EAAQ+B,GACpDwmC,EAAc58C,KAAKi9C,EAAWr6C,GAC9Bg6C,EAAc58C,KAAKi9C,EAAWp6C,GAC9B+5C,EAAc58C,KAAKi9C,EAAWn6C,GAE9B85C,EAAc58C,KAAKi9C,EAAWr6C,GAC9Bg6C,EAAc58C,KAAKi9C,EAAWp6C,GAC9B+5C,EAAc58C,KAAKi9C,EAAWn6C,GAE9B,MAAMq6C,EAAiB97C,KAAK+7C,wBAAwB/oC,EAAQ+B,GAC5DymC,EAAkB78C,KAAKm9C,EAAev6C,GACtCi6C,EAAkB78C,KAAKm9C,EAAet6C,GACtCg6C,EAAkB78C,KAAKm9C,EAAer6C,GAEtC+5C,EAAkB78C,KAAKm9C,EAAev6C,GACtCi6C,EAAkB78C,KAAKm9C,EAAet6C,GACtCg6C,EAAkB78C,KAAKm9C,EAAer6C,GAEtCi6C,EAAS/8C,KAAKg9C,GACdD,EAAS/8C,KAAKg9C,GAEV5mC,EAAI/B,EAAOhS,OAAS,IAEtB26C,GAAsB3oC,EAAO+B,GAAG1B,WAAWuoC,IAG/C,MAAMI,EAAwB,IAAIvrC,aAAakjC,GACzCsI,EAAwB,IAAIxrC,aAAa8qC,GACzCW,EAAwB,IAAIzrC,aAAa+qC,GACzCW,EAAwB,IAAI1rC,aAAagrC,GACzCW,EAAwB,IAAI3rC,aAAairC,GAEzCjI,EAAU,GAChB,IAAK,IAAI1+B,EAAI,EAAGA,GAAMinC,EAAWh7C,OAAS,EAAK,GAAK,EAAG+T,IACvD,CACE,MAAMuc,EAAa,EAAJvc,EAAS,EACxB0+B,EAAQ90C,KAAK2yB,GACbmiB,EAAQ90C,KAAK2yB,EAAQ,GACrBmiB,EAAQ90C,KAAK2yB,EAAQ,GAErBmiB,EAAQ90C,KAAK2yB,GACbmiB,EAAQ90C,KAAK2yB,EAAQ,GACrBmiB,EAAQ90C,KAAK2yB,EAAQ,GAGvBtxB,KAAKW,SAAS07C,SAAS5I,GACQzzC,KAAKW,SAASyc,aAAa,YAAa3Y,KAAK,IAAI24B,EAAgB4e,EAAY,IAC7Eh8C,KAAKW,SAASyc,aAAa,iBAAkB3Y,KAAK,IAAI24B,EAAgB6e,EAAkB,IACxFj8C,KAAKW,SAASyc,aAAa,qBAAsB3Y,KAAK,IAAI24B,EAAgB8e,EAAsB,IAChGl8C,KAAKW,SAASyc,aAAa,eAAgB3Y,KAAK,IAAI24B,EAAgB+e,EAAiB,IACrFn8C,KAAKW,SAASyc,aAAa,YAAa3Y,KAAK,IAAI24B,EAAgBgf,EAAc,IAE9Gp8C,KAAKW,SAASyc,aAAa,YAAY0S,aAAc,EACrD9vB,KAAKW,SAASyc,aAAa,iBAAiB0S,aAAc,EAC1D9vB,KAAKW,SAASyc,aAAa,qBAAqB0S,aAAc,EAC9D9vB,KAAKW,SAASyc,aAAa,eAAe0S,aAAc,EACxD9vB,KAAKW,SAASyc,aAAa,YAAY0S,aAAc,EAErD9vB,KAAKc,SAASkF,SAASo1C,QAAQp4C,MAAQ24C,EACvC37C,KAAKs8C,QAAUX,EACf37C,KAAK27C,mBAAqBA,EAG5BY,cAAcv5C,GAEZhD,KAAKc,SAASkF,SAASm1C,WAAWn4C,MAAQA,EAG5Cu5C,gBAEE,OAAOv8C,KAAKc,SAASkF,SAASm1C,WAAWn4C,MAQ3CzE,wBAAwByU,EAAQ+B,GAE9B,OAAU,IAANA,EAEK/B,EAAO,GAAGhB,QAAQsB,IAAIN,EAAO,IAAIpP,gBAAgB,GAAG3D,IAAI+S,EAAO,IAI/DA,EAAO+B,EAAI,GAStBxW,oBAAoByU,EAAQ+B,GAE1B,OAAIA,IAAM/B,EAAOhS,OAAS,EAEjBgS,EAAOA,EAAOhS,OAAS,GAAGgR,QAAQsB,IAAIN,EAAOA,EAAOhS,OAAS,IAAI4C,gBAAgB,GAAG3D,IAAI+S,EAAOA,EAAOhS,OAAS,IAI/GgS,EAAO+B,EAAI,GAItBxW,UAIAA,WAEE,OAAOyB,KAAK27C,mBAGdp9C,eAEE,OAAOyB,KAAK27C,mBAGdp9C,UAEEyB,KAAKW,SAASC,UACdZ,KAAKc,SAASF,UACVZ,KAAKw8C,QAEPx8C,KAAKw8C,OAAOv7C,OAAOjB,MAIvBjB,UAAUqZ,GAERpY,KAAKc,SAASkF,SAASgL,OAAOhO,MAAM9C,IAAIkY,GAG1CrZ,YAEE,OAAOiB,KAAKc,SAASkF,SAASgL,OAAOhO,MAMvCzE,WAAW6Z,GAETpY,KAAKc,SAASkF,SAASgL,OAAOhO,MAAMyB,KAAK2T,IC/M7C,MAAMqkC,WAAmBt7C,EAMvB5C,YAAY6I,EAASs1C,GAEnBA,EAAQA,GAAS,IAAIt5C,EAAQ,EAAG,GAChC,MAAMtC,EAAW,IAAI8E,EAAe,CAClCI,SAAU,CACRC,SAAU,CAAEjD,MAAOoE,GACnBu1C,eAAgB,CAAE35C,MAAO,GACzB45C,OAAQ,CAAE55C,MAAO,GACjB65C,SAAU,CAAE75C,MAAO,IAErBoD,igBACAC,mLACAqN,aAAa,EACbpN,YAAY,EACZwwB,KAAMgmB,KAEFn8C,EAAW,IAAImG,EAAc,EAAG,EAAG,GACzCnG,EAAS0B,WAAWq6C,EAAMn7C,EAAI,GAAIm7C,EAAMl7C,EAAI,EAAG,GAC/C,MAAMu7C,EAAgB31C,EAAQE,MAAMpE,MAAQkE,EAAQE,MAAMnE,OAC1DxC,EAASnC,MAAMu+C,EAAe,EAAG,GACjCt+C,MAAMkC,EAAUG,GAChBd,KAAK+8C,cAAgBA,EACrB/8C,KAAKW,SAASq8C,qBAEdh9C,KAAKi9C,YAAc,IAAIr+C,EACvBoB,KAAKW,SAASu8C,YAAY11C,QAAQxH,KAAKi9C,aACvCj9C,KAAKc,SAAWA,EAGlBvC,iBAEEyB,KAAKc,SAASkF,SAASC,SAASjD,MAAM8sB,aAAc,EACpD,MAAMqtB,EAAMn9C,KAAKc,SAASkF,SAASC,SAASjD,MAAMsE,MAElDtH,KAAKW,SAASnC,MAAM,EAAIwB,KAAK+8C,cAAe,EAAG,GAC/C/8C,KAAK+8C,cAAgBI,EAAIj6C,MAAQi6C,EAAIh6C,OACrCnD,KAAKW,SAASnC,MAAMwB,KAAK+8C,cAAe,EAAG,GAC3C/8C,KAAKW,SAASq8C,qBACdh9C,KAAKW,SAASu8C,YAAY11C,QAAQxH,KAAKi9C,aAGzC77C,WAEE,OAAOpB,KAAKi9C,YAAYjrC,QAAQpO,eAAe5D,KAAKxB,MAAM+C,GAG5DH,SAAS4B,GAEPhD,KAAKxB,MAAMiG,KAAKzB,GAChBhD,KAAKc,SAASkF,SAAS42C,OAAO55C,MAAQA,EAGxCo6C,mBAAmBpd,GAEjBhgC,KAAKc,SAASkF,SAAS22C,eAAe35C,OAAoB,IAAZg9B,EAAmB,EAAI,EAGvEod,qBAEE,OAAuD,IAAhDp9C,KAAKc,SAASkF,SAAS22C,eAAe35C,MAG/C6xB,YAAYA,GAEV70B,KAAKc,SAASkF,SAAS62C,SAAS75C,MAAQ6xB,EAG1CA,cAEE,OAAO70B,KAAKc,SAASkF,SAAS62C,SAAS75C,MAGzCzE,UAEEyB,KAAKW,SAASC,UACdZ,KAAKw8C,OAAOv7C,OAAOjB,MACnBA,KAAKc,SAASkF,SAASC,SAASjD,MAAMpC,UACtCZ,KAAKc,SAASF,WCzFlB,MAAMy8C,WAAeZ,GASnBl+C,YAAYo3B,EAAMC,EAAM72B,EAAO29C,EAAOY,GAEpC,MAAMC,EAAqB,IAAItmB,GAEzBumB,EAAgB,CACpB5nB,KAAMA,EACNI,WAAYj3B,GAAS,WAEjBo3B,EAAiBonB,EAAmBE,gBAAgB9nB,EAAM6nB,GAEhErnB,EAAetmB,UAAY6tC,GAC3BvnB,EAAetmB,UAAYg/B,EAC3B1Y,EAAerG,aAAc,EAC7BrxB,MAAM03B,EAAgBumB,GAEtB18C,KAAKu9C,mBAAqBA,EAC1Bv9C,KAAKm2B,eAAiBA,EACtBn2B,KAAKw9C,cAAgBA,EAGvB7nB,SAAS3yB,GAEPhD,KAAKu9C,mBAAmBrnB,YAAYlzB,EAAOhD,KAAKw9C,eAChDx9C,KAAK29C,iBAGPhoB,WAEE,MAAO,mBCzCX,MAAMioB,WAA8Bz8C,EAMlC5C,YAAYoC,EAAUG,GAEpBrC,MAAMkC,EAAUG,GAChBd,KAAKc,SAAWA,EAChB,MAAM+8C,EAAO79C,KAEbA,KAAK89C,eAAiB,KAEhB,WAAYD,EAAK/8C,UAA4C,mBAAzB+8C,EAAK/8C,SAASoL,QAEpD2xC,EAAK/8C,SAASoL,WCjBtB,MAAM6xC,GAEJx/C,YAAYuW,EAAQkpC,EAAcC,GAEhC,MAAM/6C,EAAU86C,EAAa34C,MAAQ24C,EAAa54C,KAC5CjC,EAAU66C,EAAa14C,IAAQ04C,EAAaz4C,OAElDvF,KAAKxB,MAAW,IAAI4E,EAAQF,EAAOC,GACnCnD,KAAK+B,SAAW,IAAIqB,EAAQ0R,EAASkpC,EAAa54C,KAAM44C,EAAaz4C,QAErEvF,KAAKi+C,aAAe,IAAI71C,EAAQ61C,EAAa74C,KAAM64C,EAAa54C,MAAO44C,EAAa34C,IAAK24C,EAAa14C,SCT1G,MAAM24C,GAEJ3/C,YAAY4/C,EAAcxoB,EAAO,IAE/B31B,KAAKm+C,aAAeA,EAEpBn+C,KAAKo+C,OAAS,GAEdp+C,KAAKq+C,gBAAkB,EACvBr+C,KAAKs+C,iBAAkB,EACvBt+C,KAAKu+C,gBAAkB,EAEvBv+C,KAAK+B,SAAW,IAAInD,EACpBoB,KAAK6C,WAAa,IAAI6iC,EACtB1lC,KAAKxB,MAAQ,IAAII,EAAQ,EAAG,EAAG,GAC/BoB,KAAKw+C,OAAS,IAAIlY,EAElBtmC,KAAKjB,MAAQ,IAAIuF,EAAM,WAEvBtE,KAAK8/B,YAAc,IAAI18B,EACvBpD,KAAKy+C,UAAY,EAEjBz+C,KAAK0+C,OAAW/oB,EAEhB31B,KAAK2+C,kBAAkBhpB,GAGzBA,SAAS3yB,GAEPhD,KAAK0+C,OAAS17C,EACdhD,KAAK2+C,kBAAkB37C,GACvBhD,KAAKs+C,iBAAkB,EAGzB3oB,WAEE,OAAO31B,KAAK0+C,OAGdngD,gBAEEyB,KAAKw+C,OAAOI,QAAQ5+C,KAAK+B,SAAU/B,KAAK6C,WAAY7C,KAAKxB,OACzDwB,KAAKs+C,iBAAkB,EACvBt+C,KAAKq+C,gBAAiB,EAGxB9/C,oBAEEyB,KAAKq+C,gBAAiB,EAGxB9/C,oBAEEyB,KAAKu+C,gBAAiB,EAGxBhgD,aAAak9C,EAAc,EAAGoD,EAAO,GAEnC,MAAMC,GAAkB,IAAIpZ,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,GAAK68C,EAAc,IAAOntC,KAAK0J,GAAK,GAC1G+mC,GAAW,IAAIrZ,GAAaC,iBAAiB,IAAI/mC,EAAQ,EAAG,EAAG,IAAMigD,EAAO,IAAOvwC,KAAK0J,GAAK,GAEnGhY,KAAK6C,WAAW4B,KAAKq6C,EAAgBE,SAASD,IAC9C/+C,KAAKs+C,iBAAkB,EAGzB//C,aAAa4U,GAEXnT,KAAK+B,SAAS0C,KAAK0O,GACnBnT,KAAKs+C,iBAAkB,EAGzB//C,SAAS6C,GAEPpB,KAAKxB,MAAM0B,IAAIkB,EAAMA,EAAMA,GAC3BpB,KAAKs+C,iBAAkB,EAGzB//C,UAAU6Z,GAERpY,KAAKjB,MAAMmB,IAAIkY,GACfpY,KAAKu+C,gBAAiB,EAGxBhgD,UAAUm+C,GAER18C,KAAK8/B,YAAYr7B,KAAKi4C,GACtB18C,KAAKi/C,gBAGPpqB,YAAYqqB,GAEVl/C,KAAKy+C,UAAYS,EACjBl/C,KAAKu+C,gBAAiB,EAGxB1pB,cAEE,OAAO70B,KAAKy+C,UAGdlgD,gBAEEyB,KAAK2+C,kBAAkB3+C,KAAK21B,MAG9Bp3B,kBAAkBo3B,GAEhB,IAAIwpB,EAAS,EAEbn/C,KAAKo+C,OAAOp9C,OAAS,EAErB,IAAK,IAAI+T,EAAI,EAAGA,EAAI4gB,EAAK30B,OAAQ+T,IACjC,CACE,MAAMqqC,EAAUzpB,EAAK0pB,WAAWtqC,GAC1BuqC,EAAQt/C,KAAKm+C,aAAax/B,MAAKC,GAAWA,EAAQwgC,UAAYA,IACpE,GAAIE,EACJ,CACE,GAAIA,EAAMC,YACV,CACE,MAAMC,EAAa,IAAIzB,GAAUoB,EAAQG,EAAMC,YAAaD,EAAMG,aAClEz/C,KAAKo+C,OAAOz/C,KAAK6gD,GAEnBL,GAAUG,EAAMI,SAIpB,MAAMC,EAAO,IAAInf,EACXof,EAAc5/C,KAAKo+C,OAAO,GAChCuB,EAAK7rC,qBAAqB8rC,EAAY79C,SAASiQ,QAAQ/R,IAAI,IAAImD,EAAQw8C,EAAYphD,MAAM+C,EAAI,EAAGq+C,EAAYphD,MAAMgD,EAAI,IAAKo+C,EAAYphD,OAEvI,IAAK,IAAIuW,EAAI,EAAGA,EAAI/U,KAAKo+C,OAAOp9C,OAAQ+T,IACxC,CACE,MAAMkC,EAAIjX,KAAKo+C,OAAOrpC,GAChBnB,GAAM,IAAI4sB,GAAO1sB,qBAAqBmD,EAAElV,SAASiQ,QAAQ/R,IAAI,IAAImD,EAAQ6T,EAAEzY,MAAM+C,EAAI,EAAG0V,EAAEzY,MAAMgD,EAAI,IAAKyV,EAAEzY,OACjHmhD,EAAKE,MAAMjsC,GAGb,MAAMksC,EAAY,IAAI18C,EACtBu8C,EAAKn4C,QAAQs4C,GACb,IAAK,IAAI/qC,EAAI,EAAGA,EAAI/U,KAAKo+C,OAAOp9C,OAAQ+T,IAEtC/U,KAAKo+C,OAAOrpC,GAAGhT,SAASR,GAAKu+C,EAAUv+C,EAAI,EAC3CvB,KAAKo+C,OAAOrpC,GAAGhT,SAASP,GAAKs+C,EAAUt+C,EAAI,EAE3CxB,KAAKo+C,OAAOrpC,GAAGhT,SAASR,GAAMu+C,EAAUv+C,EAAI,EAAKvB,KAAK8/B,YAAYv+B,EAClEvB,KAAKo+C,OAAOrpC,GAAGhT,SAASP,GAAMs+C,EAAUt+C,EAAI,EAAKxB,KAAK8/B,YAAYt+B,EAGpExB,KAAKq+C,gBAAiB,GC/I1B,MAAM0B,WAAwBpvC,GAE5BpS,YAAY6I,GAEV3I,i6CAAkB,CAChBuhD,SAAU,CAAEh9C,MAAOoE,GACnB64C,UAAW,CAAEj9C,MAAO,IACpBk9C,WAAY,CAAEl9C,MAAO,IAAII,EAAQ,EAAG,MAGtCpD,KAAK0T,aAAc,EACnB1T,KAAKqL,WAAa,CAChB0vC,aAAa,GAEf/6C,KAAKsG,YAAa,EAClBtG,KAAK82B,KAAOgmB,GACZ11C,EAAQyI,UAAYg/B,EACpBznC,EAAQ2I,UAAY8+B,EACpBznC,EAAQ+4C,iBAAkB,EAG5B5hD,eAAe6C,GAEbpB,KAAKgG,SAASk6C,WAAWl9C,MAAMyB,KAAKrD,GAGtC7C,aAAayE,GAEXhD,KAAKgG,SAASi6C,UAAUj9C,MAAQoT,GAAMqB,KAAK,GAAK,GAAKzU,ICtBzD,MAAMo9C,WAAqBj/C,EAEzB5C,YAAY8hD,EAAaC,GAEvB,MAEMC,EAAqB,IAAIC,GAC/BD,EAAmBE,cAAgB,EAEnC,MAAM9/C,EAAW,IAAImG,EAAc,EAAG,GACtCnG,EAAS0B,UAAU,GAAK,GAAK,GAC7Bk+C,EAAmB/qB,aAAa,WAAa,IAAIkrB,GAAuB//C,EAASyc,aAAa,YAAY4W,MAAO,IACjHusB,EAAmB/qB,aAAa,KAAa,IAAIkrB,GAAuB//C,EAASyc,aAAa,MAAM4W,MAAO,IAC3GusB,EAAmBjvB,MAAQ3wB,EAAS2wB,MAEpC,MAAMqvB,EAAiB,IAAIC,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GACxFC,EAAiB,IAAIF,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GACxFE,EAAiB,IAAIH,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GACxFG,EAAiB,IAAIJ,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GAExFI,EAAe,IAAIL,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GACtF7C,EAAe,IAAI4C,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GAEtF9hD,EAAQ,IAAI6hD,GAAyB,IAAInwC,aAAaowC,KAAsB,GAAG,GAErFF,EAAeO,MAASC,GACxBL,EAAeI,MAASC,GACxBJ,EAAeG,MAASC,GACxBH,EAAeE,MAASC,GACxBF,EAAaC,MAAWC,GACxBnD,EAAakD,MAAWC,GACxBpiD,EAAMmiD,MAAkBC,GAExBZ,EAAmB/qB,aAAa,iBAAkBmrB,GAClDJ,EAAmB/qB,aAAa,iBAAkBsrB,GAClDP,EAAmB/qB,aAAa,iBAAkBurB,GAClDR,EAAmB/qB,aAAa,iBAAkBwrB,GAElDT,EAAmB/qB,aAAa,eAAgByrB,GAChDV,EAAmB/qB,aAAa,eAAgBwoB,GAChDuC,EAAmB/qB,aAAa,QAAgBz2B,GAEhDN,MAAM8hD,EAAoB,IAAIR,GAAgBO,IAE9CtgD,KAAKohD,cAAgB,GACrBphD,KAAKqgD,YAAcA,EAEnBrgD,KAAKc,SAASugD,eAAe,IAAIj+C,EAAQi9C,EAAYiB,MAAMp+C,MAAOm9C,EAAYiB,MAAMn+C,SAEpFnD,KAAKkT,eAAgB,EAGvB3U,aAAayE,GAEXhD,KAAKc,SAASygD,aAAav+C,GAG7BzE,SAASijD,GAEP,MAAMrgB,EAAO,IAAI+c,GAAQl+C,KAAKqgD,YAAYjC,OAAQoD,GAElD,OADAxhD,KAAKohD,cAAcziD,KAAKwiC,GACjBA,EAGT5iC,YAAYkjD,GAEV/O,GAAegP,YAAY1hD,KAAKohD,cAAeK,GAC/CzhD,KAAKkM,QAAO,GAGd3N,OAAOojD,GAEL,MAAMC,EAAmB5hD,KAAKW,SAASyc,aAAa,gBAC9CykC,EAAmB7hD,KAAKW,SAASyc,aAAa,gBAE9CujC,EAAiB3gD,KAAKW,SAASyc,aAAa,kBAC5C0jC,EAAiB9gD,KAAKW,SAASyc,aAAa,kBAC5C2jC,EAAiB/gD,KAAKW,SAASyc,aAAa,kBAC5C4jC,EAAiBhhD,KAAKW,SAASyc,aAAa,kBAE5C0kC,EAAY9hD,KAAKW,SAASyc,aAAa,SAE7C,IAAI2kC,GAAuC,IAAjBJ,EACtBK,GAAuC,IAAjBL,EACtBM,GAAuC,IAAjBN,EAEtBO,EAAc,EAClB,IAAK,IAAIntC,EAAI,EAAGA,EAAI/U,KAAKohD,cAAcpgD,OAAQ+T,IAC/C,CACE,MAAM4gB,EAAO31B,KAAKohD,cAAcrsC,GAE5B4gB,EAAK2oB,kBAEPyD,GAAsB,EACtBpsB,EAAKwsB,iBAGHxsB,EAAK0oB,iBAEP2D,GAAqB,EACrBrsB,EAAKysB,qBAGHzsB,EAAK4oB,iBAEP0D,GAAqB,EACrBtsB,EAAK0sB,qBAGP,MAAM7D,EAAS7oB,EAAK6oB,OACdz/C,EAAQ42B,EAAK52B,MACb81B,EAAUc,EAAKd,QAErB,IAAK,IAAIytB,EAAU,EAAGA,EAAU3sB,EAAKyoB,OAAOp9C,OAAQshD,IACpD,CACE,MAAMhD,EAAQ3pB,EAAKyoB,OAAOkE,GAEpBC,EAAWL,EAEjBN,EAAiBY,QAAQD,EAAUjD,EAAMrB,aAAa18C,EAAG+9C,EAAMrB,aAAaz8C,EAAG89C,EAAMrB,aAAax8C,EAAG69C,EAAMrB,aAAa/sC,GACxH2wC,EAAiBW,QAAQD,EAAUjD,EAAMv9C,SAASR,EAAG+9C,EAAMv9C,SAASP,EAAG89C,EAAM9gD,MAAM+C,EAAG+9C,EAAM9gD,MAAMgD,GAElGm/C,EAAe6B,QAAQD,EAAU/D,EAAOhnC,SAAS,GAC/CgnC,EAAOhnC,SAAS,GAChBgnC,EAAOhnC,SAAS,GAChBgnC,EAAOhnC,SAAS,IAElBspC,EAAe0B,QAAQD,EAAU/D,EAAOhnC,SAAS,GAC/CgnC,EAAOhnC,SAAS,GAChBgnC,EAAOhnC,SAAS,GAChBgnC,EAAOhnC,SAAS,IAElBupC,EAAeyB,QAAQD,EAAU/D,EAAOhnC,SAAS,GAC/CgnC,EAAOhnC,SAAS,GAChBgnC,EAAOhnC,SAAS,IAChBgnC,EAAOhnC,SAAS,KAElBwpC,EAAewB,QAAQD,EAAU/D,EAAOhnC,SAAS,IAC/CgnC,EAAOhnC,SAAS,IAChBgnC,EAAOhnC,SAAS,IAChBgnC,EAAOhnC,SAAS,KAElBsqC,EAAUU,QAAQD,EAAUxjD,EAAM+X,EAAG/X,EAAMkY,EAAGlY,EAAMmY,EAAG2d,GAEvDqtB,KAIJliD,KAAKW,SAAS8/C,cAAgByB,EAE1BA,EAAcliD,KAAK6gD,iBAErB5lC,QAAQC,MAAM,iEAAkElb,KAAK6gD,gBAAiBqB,EAAaliD,MAGjH+hD,IAEFpB,EAAe7wB,aAAc,EAC7BgxB,EAAehxB,aAAc,EAC7BixB,EAAejxB,aAAc,EAC7BkxB,EAAelxB,aAAc,GAE3BkyB,IAEFJ,EAAiB9xB,aAAc,EAC/B+xB,EAAiB/xB,aAAc,GAE7BmyB,IAEFH,EAAUhyB,aAAc,GAI5BvxB,UAEEyB,KAAKW,SAASC,UACdZ,KAAKc,SAASF,WC1LlB,MAAM6hD,WAA2BjpC,GAQ/Bjb,YAAYmb,EAAgBlH,EAAO,IAAI5T,EAAW6T,EAAK,IAAI7T,EAAQ,EAAG,EAAG,GAAI6a,EAAkB,UAE7Fhb,MAAMgb,GAENzZ,KAAK0Z,eAAiBA,EACtB1Z,KAAKwS,KAAOA,EACZxS,KAAKyS,GAAKA,EAOZlU,OAAOkH,EAAS8R,GAEd,MAAMmrC,EAAM1iD,KAAKwS,KAAKR,QACtB0wC,EAAIjrC,KAAKzX,KAAKyS,GAAIzS,KAAKyZ,gBAAgBlC,IACvC9R,EAAQzF,KAAK0Z,gBAAgBjV,KAAKi+C,ICxBtC,MAAMC,WAAkCh9C,GAEtCpH,YAAYqkD,GAEVnkD,MAAMmkD,ytCCLV,MAAMC,WAA4Bl9C,GAEhCpH,YAAYukD,EAAgBF,GAE1BnkD,sLAGFqW,WAAW9R,GAEThD,KAAKgG,SAAS+8C,QAAQ//C,MAAQA,EAGhC8R,aAEE,OAAO9U,KAAKgG,SAAS+8C,QAAQ//C,OCdjC,MAAMggD,GAEJzkD,YAAYukD,GAEV9iD,KAAKsuC,cAAiB,EACtBtuC,KAAKuuC,eAAiB,EACtBvuC,KAAKijD,IAAM,IAAIx6C,EAAkB,EAAG,GACpCzI,KAAKwsC,IAAM,IAAI/jC,EAAkB,EAAG,GACpCzI,KAAKysC,IAAM,IAAIhkC,EAAkB,EAAG,GACpCzI,KAAKkjD,IAAM,IAAIz6C,EAAkB,EAAG,GACpCzI,KAAKmjD,IAAM,IAAI16C,EAAkB,EAAG,GAEpCzI,KAAKojD,iBAAqB,IAAIT,IAA0B,GACxD3iD,KAAKqjD,mBAAqB,IAAIV,IAA0B,GAExD3iD,KAAKsjD,iBAAmB,IAAIT,GAG9BtkD,KAAKoJ,GAEH3H,KAAKujD,gBAAgB57C,EAAGzE,MAAOyE,EAAGxE,QAClCq+B,GAAS3zB,KAAKlG,EAAU3H,KAAKwsC,IAAKxsC,KAAKsjD,kBAGvC9hB,GAAS3zB,KAAK7N,KAAKwsC,IAAKxsC,KAAKysC,IAAKzsC,KAAKqjD,oBACvC7hB,GAAS3zB,KAAK7N,KAAKysC,IAAKzsC,KAAKkjD,IAAKljD,KAAKqjD,oBACvC7hB,GAAS3zB,KAAK7N,KAAKkjD,IAAKljD,KAAKmjD,IAAKnjD,KAAKqjD,oBAIvC7hB,GAAS3zB,KAAK7N,KAAKmjD,IAAKnjD,KAAKkjD,IAAKljD,KAAKojD,kBACvC5hB,GAAS3zB,KAAK7N,KAAKkjD,IAAKljD,KAAKysC,IAAKzsC,KAAKojD,kBACvC5hB,GAAS3zB,KAAK7N,KAAKysC,IAAK9kC,EAAI3H,KAAKojD,kBAMnC7kD,gBAAgB2E,EAAOC,GAEjBnD,KAAKsuC,gBAAkBprC,GAASlD,KAAKuuC,iBAAmBprC,IAE1DnD,KAAKsuC,cAAgBprC,EACrBlD,KAAKuuC,eAAiBprC,EACtBnD,KAAKijD,IAAI/5C,QAAQlJ,KAAKsuC,cAAgB,EAAGtuC,KAAKuuC,eAAiB,GAC/DvuC,KAAKwsC,IAAItjC,QAAQlJ,KAAKsuC,cAAgB,EAAGtuC,KAAKuuC,eAAiB,GAC/DvuC,KAAKysC,IAAIvjC,QAAQlJ,KAAKsuC,cAAgB,EAAGtuC,KAAKuuC,eAAiB,GAC/DvuC,KAAKkjD,IAAIh6C,QAAQlJ,KAAKsuC,cAAgB,EAAGtuC,KAAKuuC,eAAiB,GAC/DvuC,KAAKmjD,IAAIj6C,QAAQlJ,KAAKsuC,cAAgB,GAAItuC,KAAKuuC,eAAiB,MC9CtE,MAAMiV,WAA6B79C,GAEjCpH,cAEEE,i1GAAYkG,EAAW,CACrB8+C,WAAW,IAGbzjD,KAAKgG,SAAS09C,WAAa,CAAE1gD,WAAO2B,GACpC3E,KAAKgG,SAAS29C,eAAiB,CAAE3gD,MAAO,IAAII,EAAQ,EAAG,IAGzD7E,YAAYgT,GAEVvR,KAAKgG,SAAS09C,WAAW1gD,MAAQuO,EAEjC,MAAMnQ,EAAOpB,KAAKmgC,SAAS5uB,GAC3BvR,KAAKgG,SAAS29C,eAAe3gD,MAAMyB,KAAKrD,GAG1C7C,SAASgT,GAEP,OAAIA,EAAIqyC,eAEC,IAAIxgD,EAAQkL,KAAKoI,IAAI,EAAGnF,EAAIjK,MAAMu8C,YAAav1C,KAAKoI,IAAI,EAAGnF,EAAIjK,MAAMw8C,cAE1EvyC,EAAIpK,oBAEC,IAAI/D,EAAQmO,EAAIrO,MAAOqO,EAAIpO,QAEhCoO,EAAIwyC,UAEC,IAAI3gD,EAAQmO,EAAIjK,MAAMpE,MAAOqO,EAAIjK,MAAMnE,QAEzC,IAAIC,EAAQ,EAAG,ICnC1B,MAAM4gD,GAEJzlD,YAAYmH,GAEV1F,KAAK2H,GAAK,IAAIc,EAAkB,EAAG,EAAG,CACpC2H,KAAMC,EACNL,OAAQC,EACRJ,UAAWC,EACXC,UAAWD,IAEb9P,KAAKwsC,IAAM,IAAI/jC,EAAkB,EAAG,EAAG,CACrC2H,KAAMC,EACNL,OAAQC,EACRJ,UAAWC,EACXC,UAAWD,IAGb9P,KAAKikD,kBAAoB,IAAIT,GAG/BjlD,OAAO6I,GAEL,MAAM88C,EAAWlkD,KAAKmgC,SAAS/4B,GAC3B88C,EAAS3iD,IAAMvB,KAAK2H,GAAGzE,OAASghD,EAAS1iD,IAAMxB,KAAK2H,GAAGxE,SAEzDnD,KAAK2H,GAAGuB,QAAQg7C,EAAS3iD,EAAG2iD,EAAS1iD,GACrCxB,KAAKwsC,IAAItjC,QAAQg7C,EAAS3iD,EAAG2iD,EAAS1iD,IAGxCxB,KAAKikD,kBAAkBhvC,YAAY7N,GACnCo6B,GAAS9zB,cAAc1N,KAAKikD,kBAAmBjkD,KAAK2H,IAEpD,IAAK,IAAIoN,EAAI,EAAGA,EAAI,EAAGA,IAErB/U,KAAKikD,kBAAkBhvC,YAAYjV,KAAK2H,GAAGP,SAC3Co6B,GAAS9zB,cAAc1N,KAAKikD,kBAAmBjkD,KAAKwsC,KAEpDxsC,KAAKikD,kBAAkBhvC,YAAYjV,KAAKwsC,IAAIplC,SAC5Co6B,GAAS9zB,cAAc1N,KAAKikD,kBAAmBjkD,KAAK2H,IAGtD,OAAO3H,KAAK2H,GAGdpJ,SAASgT,GAEP,OAAIA,EAAIqyC,eAEC,IAAIxgD,EAAQkL,KAAKoI,IAAI,EAAGnF,EAAIjK,MAAMu8C,YAAav1C,KAAKoI,IAAI,EAAGnF,EAAIjK,MAAMw8C,cAE1EvyC,EAAIpK,oBAEC,IAAI/D,EAAQmO,EAAIrO,MAAOqO,EAAIpO,QAEhCoO,EAAIwyC,UAEC,IAAI3gD,EAAQmO,EAAIjK,MAAMpE,MAAOqO,EAAIjK,MAAMnE,QAEzC,IAAIC,EAAQ,EAAG,IC1D1B,MAAM+gD,GAEJ5lD,YAAY6lD,EAAWC,GAErBrkD,KAAKyoB,UAAO9jB,EACZ3E,KAAKskD,WAAQ3/C,EAEb3E,KAAKM,KAAO8jD,EAEZpkD,KAAKqkD,gBAAkBA,EAGzB9lD,mBAAmBoC,IAKnBpC,oBAAoBgmD,IAKpBhmD,SAASimD,GAEP,MAAMC,EAAaN,GAAkBO,qBAAqBF,GACpD3vC,EAAU,CACdhF,UAAWC,EACXC,UAAWD,EACXE,OAAQC,EACR00C,WAAY90B,EACZzf,KAAM5E,GAAavG,sBAAwBoL,EAAYy+B,EACvDx+B,eAAe,EACfC,aAAa,GAGf,OAAO,IAAI9H,EAAkBg8C,EAAWvhD,MAAOuhD,EAAWthD,OAAQ0R,GAGpEtW,4BAA4BimD,GAE1B,MAAMthD,EAAQoL,KAAKmI,IAAI+tC,EAAgB,KAEvC,MAAO,CAAEthD,MAAAA,EAAOC,OADDmL,KAAKoI,IAAI,EAAGpI,KAAKC,KAAKi2C,EAAiBthD,KAIxD3E,UAEE,MAAMmkD,EAAM1iD,KAAKyoB,KACjBzoB,KAAKyoB,KAAOzoB,KAAKskD,MACjBtkD,KAAKskD,MAAQ5B,EAGfnkD,OAAOqmD,GAED5kD,KAAKqkD,kBAEPrkD,KAAKqkD,gBAAgBn4C,SACrB04C,EAAwB7jD,SAAS,GAAGD,SAAWd,KAAKqkD,gBACpDrkD,KAAKqkD,gBAAgBr+C,SAASC,SAASjD,MAAQhD,KAAKyoB,KAAKrhB,QACzDo6B,GAASz5B,OAAO68C,OAAyBjgD,EAAW3E,KAAKskD,OACzDM,EAAwB7jD,SAAS,GAAGD,cAAW6D,EAE/C3E,KAAK6kD,WAITtmD,+BAA+Bm7C,EAAW/xC,EAAIm9C,EAAkBF,GAE9DA,EAAwB7jD,SAAS,GAAGJ,SAAS60B,aAAa,OAAQkkB,GAClEkL,EAAwB7jD,SAAS,GAAGD,SAAWgkD,EAE/CtjB,GAASz5B,OAAO68C,OAAyBjgD,EAAWgD,GAEpDi9C,EAAwB7jD,SAAS,GAAGJ,SAASokD,gBAAgB,QAC7DH,EAAwB7jD,SAAS,GAAGD,cAAW6D,EAGjDpG,cAEE,OAAOyB,KAAKyoB,KAAKrhB,SCzErB,MAAM49C,WAA0B1mD,EAE9BC,YAAYimD,EAAgB1jD,GAE1BrC,QACAuB,KAAK+zB,WAAa,GAElB/zB,KAAKgV,KAAOhV,KAAKilD,iBAAiBT,EAAgB1jD,GAClDd,KAAKC,IAAID,KAAKgV,MAEdhV,KAAKklD,uBAAyBllD,KAAKmlD,6BAA6BX,GAChExkD,KAAK4kD,wBAA0B,IAAIvkD,EACnCL,KAAK4kD,wBAAwB3kD,IAAID,KAAKklD,wBAGxC3mD,sBAAsB4+B,GAEpBn9B,KAAK+zB,WAAWp1B,KAAKw+B,GAGvB5+B,2BAA2B+B,EAAM0zB,EAAOoxB,GAEtCplD,KAAKklD,uBAAuBvkD,SAAS60B,aAAal1B,EAAM,IAAI88B,EAAgBpJ,EAAOoxB,GAAW,IAGhG7mD,oBAAoB+B,EAAM0zB,EAAOoxB,GAE/BplD,KAAKgV,KAAKrU,SAAS60B,aAAal1B,EAAM,IAAIsgD,GAAyB5sB,EAAOoxB,GAAW,IAGvF7mD,SAEEyB,KAAKgV,KAAKlU,SAASoL,SACnB,IAAK,IAAI6I,EAAI,EAAGA,EAAI/U,KAAK+zB,WAAW/yB,OAAQ+T,IAE1C/U,KAAK+zB,WAAWhf,GAAG7I,OAAOlM,KAAK4kD,yBAInCrmD,UAEEyB,KAAKgV,KAAKrU,SAASC,UACnBZ,KAAKgV,KAAKlU,SAASF,UAGrBrC,iBAAiB8mD,EAAiB,EAAGvkD,GAEnC,MAAMwkD,EAAM,IAAIx+C,EAEVy+C,EAAgB,IAAI/E,GAC1B+E,EAAc/vB,aAAa,WAAY8vB,EAAIloC,aAAa,aACxDmoC,EAAcj0B,MAAQg0B,EAAIh0B,MAE1Bi0B,EAAc/vB,aAAa,aAAcx1B,KAAKwlD,2BAA2BH,IACzEE,EAAc9E,cAAgB4E,EAC9B,MAAMrwC,EAAO,IAAI7T,EAAKokD,EAAezkD,GAErC,OADAkU,EAAK9B,eAAgB,EACd8B,EAGTzW,6BAA6BimD,GAE3B,MAAMthD,MAAEA,EAAKC,OAAEA,GAAWghD,GAAkBO,qBAAqBF,GAE3DlnB,EAAM,IAAI7sB,aAA8B,EAAjB+zC,GAE7B,IAAK,IAAIzvC,EAAI,EAAGA,EAAIyvC,EAAgBzvC,IACpC,CACE,MAAMxT,EAAIwT,EAAI7R,EACR1B,EAAI8M,KAAK+J,MAAMtD,EAAI7R,GACzBo6B,EAAQ,EAAJvoB,EAAQ,IAAMxT,EAAI,IAAO2B,EAC7Bo6B,EAAQ,EAAJvoB,EAAQ,IAAMvT,EAAI,IAAO2B,EAC7Bm6B,EAAQ,EAAJvoB,EAAQ,GAAKA,EAEnB,MAAMuwC,EAAM,IAAInmD,EAChBmmD,EAAI9vB,aAAa,WAAY,IAAI4H,EAAgBE,EAAK,GAAG,IAEzD,MAAMtqB,EAAS,IAAIyyC,GAAOH,GAE1B,OADAtyC,EAAOE,eAAgB,EAChBF,EAGTzU,2BAA2BimD,GAEzB,MAAMthD,MAAEA,EAAKC,OAAEA,GAAWghD,GAAkBO,qBAAqBF,GAE3DlnB,EAAM,IAAI7sB,aAA8B,EAAjB+zC,GAE7B,IAAK,IAAIzvC,EAAI,EAAGA,EAAIyvC,EAAgBzvC,IACpC,CACE,MAAMxT,EAAIwT,EAAI7R,EACR1B,EAAI8M,KAAK+J,MAAMtD,EAAI7R,GACzBo6B,EAAQ,EAAJvoB,EAAQ,IAAMxT,EAAI,IAAO2B,EAC7Bo6B,EAAQ,EAAJvoB,EAAQ,IAAMvT,EAAI,IAAO2B,EAE/B,OAAO,IAAIy9C,GAAyBtjB,EAAK,GAAG,ICpGhD,MAAMooB,WAAgC9/C,EAEpCrH,cAcEE,MAAM,CACJuH,SAAU,GAGVI,aAhBW,kOAiBXC,wFACAC,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXzH,UAAWC,KC1BjB,MAAM0mD,WAAkCxB,GAEtC5lD,YAAY8lD,GAEV5lD,MAAM,YAAa4lD,GAGrB9lD,eAAeoC,EAAUikD,GAEvB,MAAMgB,EAAWjlD,EAASyc,aAAa,YACvCpd,KAAKyoB,KAAUzoB,KAAK6lD,SAASD,EAAS1oB,OACtCl9B,KAAKskD,MAAUtkD,KAAK6lD,SAASD,EAAS1oB,OAEtC,MAAMr8B,EAAM,IAAI6kD,GAChB1lD,KAAK8lD,+BAA+BnlD,EAASyc,aAAa,YAAapd,KAAKyoB,KAAM5nB,EAAK+jD,GAGzFrmD,gBAAgBm1C,EAAWkR,GAEzB5kD,KAAKyoB,KAAUzoB,KAAK6lD,SAASnS,EAAU1yC,QACvChB,KAAKskD,MAAUtkD,KAAK6lD,SAASnS,EAAU1yC,QAEvC,MAAMmX,EAAM,IAAI1H,aAAgC,EAAnBijC,EAAU1yC,QAEvC,IAAK,IAAI+T,EAAI,EAAGA,EAAI2+B,EAAU1yC,OAAQ+T,IAEpCoD,EAAQ,EAAJpD,EAAQ,GAAK2+B,EAAU3+B,GAAGxT,EAC9B4W,EAAQ,EAAJpD,EAAQ,GAAK2+B,EAAU3+B,GAAGvT,EAC9B2W,EAAQ,EAAJpD,EAAQ,GAAK2+B,EAAU3+B,GAAGtT,EAC9B0W,EAAQ,EAAJpD,EAAQ,GAA+B,IAAT,EAAhBzG,KAAKgK,SAAe,GAExC,MAAMzX,EAAM,IAAI6kD,GAChB1lD,KAAK8lD,+BAA+B,IAAI1oB,EAAgBjlB,EAAK,GAAInY,KAAKyoB,KAAM5nB,EAAK+jD,ICnCrF,MAAMmB,WAA0BzpB,EAE9B/9B,YAAY4e,EAAMja,EAAOC,EAAQ6M,EAAQI,GAEvC3R,MAAM0e,EAAMja,EAAOC,EAAQ6M,EAAQI,GACnCpQ,KAAKgmD,WAAa,EAGpBznD,SAAS+yB,EAAOxa,EAAGG,EAAGC,EAAG+G,GAEvBje,KAAKmd,KAAa,EAARmU,EAAY,GAAKxa,EAAI9W,KAAKgmD,WACpChmD,KAAKmd,KAAa,EAARmU,EAAY,GAAKra,EAAIjX,KAAKgmD,WACpChmD,KAAKmd,KAAa,EAARmU,EAAY,GAAKpa,EAAIlX,KAAKgmD,WACpChmD,KAAKmd,KAAa,EAARmU,EAAY,GAAKrT,EAAIje,KAAKgmD,WACpChmD,KAAK8vB,aAAc,EAGrBvxB,QAAQ+yB,EAAOxa,EAAGG,EAAGC,GAEnBlX,KAAKmd,KAAa,EAARmU,EAAY,GAAKxa,EAAI9W,KAAKgmD,WACpChmD,KAAKmd,KAAa,EAARmU,EAAY,GAAKra,EAAIjX,KAAKgmD,WACpChmD,KAAKmd,KAAa,EAARmU,EAAY,GAAKpa,EAAIlX,KAAKgmD,WACpChmD,KAAK8vB,aAAc,EAGrBvxB,MAAM+yB,EAAOtuB,GAEXhD,KAAKmd,KAAa,EAARmU,EAAY,GAAKtuB,EAAQhD,KAAKgmD,WACxChmD,KAAK8vB,aAAc,EAGrBvxB,MAAM+yB,EAAOtuB,GAEXhD,KAAKmd,KAAa,EAARmU,EAAY,GAAKtuB,EAAQhD,KAAKgmD,WACxChmD,KAAK8vB,aAAc,EAGrBvxB,MAAM+yB,EAAOtuB,GAEXhD,KAAKmd,KAAa,EAARmU,EAAY,GAAKtuB,EAAQhD,KAAKgmD,WACxChmD,KAAK8vB,aAAc,EAGrBvxB,MAAM+yB,EAAOtuB,GAEXhD,KAAKmd,KAAa,EAARmU,EAAY,GAAKtuB,EAAQhD,KAAKgmD,WACxChmD,KAAK8vB,aAAc,GC7CvB,MAAMm2B,WAAuBF,GAE3BxnD,YAAY2E,EAAOC,GAGjB1E,MADa,IAAI41B,WAAWnxB,EAAQC,EAAS,GACjCD,EAAOC,EAAQ8M,GAC3BjQ,KAAKgmD,WAAa,KCNtB,MAAME,WAAwBH,GAE5BxnD,YAAY2E,EAAOC,GAGjB1E,MADa,IAAI41B,WAAWnxB,EAAQC,EAAS,GACjCD,EAAOC,EAAQ8M,GAC3BjQ,KAAKgmD,WAAa,KCNtB,MAAMG,WAA4BJ,GAEhCxnD,YAAY2E,EAAOC,GAGjB1E,MADa,IAAIgS,aAAavN,EAAQC,EAAS,GACnCD,EAAOC,EAAQ8M,EAAYI,ICJ3C,MAAM+1C,WAA6BL,GAEjCxnD,YAAY2E,EAAOC,GAGjB1E,MADa,IAAIgS,aAAavN,EAAQC,EAAS,GACnCD,EAAOC,EAAQ8M,EAAYI,ICH3C,MAAMg2C,WAAoBllD,EAExB5C,YAAY+nD,EAAU3lD,EAAUG,EAAUylD,GAExC9nD,MAAMkC,EAAUG,GAEhBd,KAAKsmD,SAAWA,EAChBtmD,KAAKwmD,cAAgB57C,OAAO4P,KAAK8rC,GAAUtlD,OAC3ChB,KAAKumD,kBAAoBA,EACzBvmD,KAAK25B,YAAc35B,KAAKwmD,cAAgBD,EACxCvmD,KAAKymD,aAAen4C,KAAKC,KAAKvO,KAAKwmD,cAAgBD,GAGrDhoD,mBAAmB27B,GAEjBl6B,KAAKc,SAASkF,SAASk0B,GAAcl3B,MAAQ,IAAIijD,GAAejmD,KAAK25B,YAAa35B,KAAKymD,cAGzFloD,oBAAoB27B,GAElBl6B,KAAKc,SAASkF,SAASk0B,GAAcl3B,MAAQ,IAAIkjD,GAAgBlmD,KAAK25B,YAAa35B,KAAKymD,cAG1FloD,yBAAyB27B,GAEvBl6B,KAAKc,SAASkF,SAASk0B,GAAcl3B,MAAQ,IAAImjD,GAAoBnmD,KAAK25B,YAAa35B,KAAKymD,cAG9FloD,0BAA0B27B,GAExBl6B,KAAKc,SAASkF,SAASk0B,GAAcl3B,MAAQ,IAAIojD,GAAqBpmD,KAAK25B,YAAa35B,KAAKymD,cAG/FloD,eAAe+B,GAEb,OAAON,KAAKsmD,SAAShmD,GAGvB/B,cAAc27B,EAAcwsB,EAAW5vC,EAAGG,EAAGC,GAE3ClX,KAAKc,SAASkF,SAASk0B,GAAcysB,QAAQ3mD,KAAK4mD,eAAeF,GAAY5vC,EAAGG,EAAGC,GAGrF3Y,eAAe27B,EAAcwsB,EAAW5vC,EAAGG,EAAGC,EAAG+G,GAE/Cje,KAAKc,SAASkF,SAASk0B,GAAc2sB,SAAS7mD,KAAK4mD,eAAeF,GAAY5vC,EAAGG,EAAGC,EAAG+G,IC7C3F,MAAM6oC,GAEJvoD,MAAMwoD,EAAQjmD,GAEZ,MAMM+2C,EAAa,GACbyO,EAAW,GAEXU,EAAe,GAErB,IAAK,IAAIjyC,EAAI,EAAGA,EAAIgyC,EAAO/lD,OAAQ+T,IACnC,CACE,MAAMC,EAAO+xC,EAAOhyC,GACdkoB,EAAejoB,EAAKrU,SAASyc,aAAa,YAAY8f,MAE5D,IAAK,IAAIA,EAAQ,EAAGA,EAAQD,EAAcC,IAExC8pB,EAAaroD,KAAKoW,GAGpB8iC,EAAWl5C,KAAKqW,EAAKrU,eAEOgE,IAAxB2hD,EAAStxC,EAAK1U,MAEhBgmD,EAAStxC,EAAK1U,MAAQyU,EAItBkG,QAAQC,MAAM,4EAA6ElG,EAAK1U,KAAMgmD,GAI1G,MAAM7jD,EAAkBC,GAAoBC,gBAAgBk1C,GAEtD1a,EAAmB,IAAIC,EAAgB,IAAI3sB,aAAau2C,GAAe,GAG7E,OAFAvkD,EAAgB+yB,aAAa,UAAW2H,GAEjCn9B,KAAKinD,oBAAoBX,EAAU7jD,EAAiB3B,EAtCjC,MAyC5BvC,oBAAoB+nD,EAAU7jD,EAAiB3B,EAAUylD,GAEvD,OAAO,IAAIF,GAAYC,EAAU7jD,EAAiB3B,EAAUylD,ICjDhE,MAAMW,WAAkB3gC,GAEtBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAI66B,GAGpB5oD,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM8J,IAE1BxF,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK8J,GAE5D1sB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,qLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCtCX,MAAMq/B,WAAmB7gC,GAEvBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAI+6B,GAGpB9oD,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM0kC,IAE1BpgC,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK0kC,GAE5DtnD,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,GACjB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCtCX,MAAMw/B,WAAmBhhC,GAEvBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAIk7B,GAGpBjpD,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAMgT,IAE1B1O,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKgT,GAE5D51B,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,iLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCxCX,MAAM0/B,WAAmBlhC,GAEvBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GAG1B7C,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3CyE,MAAMrnB,KAAK4iB,KAAK6E,MAAMO,IAEpBA,EAAS0/B,OAAOjgC,MAAMigC,IAEpBxgC,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK8kC,GAE5D1nD,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,yBAMTb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCzBX,MAAM4/B,WAAkBphC,GAEtBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAIs7B,GAGpBrpD,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAMmwB,IAE1B7rB,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKmwB,GAE5D/yC,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,EAAM,iLACvB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCrCX,MAAM8/B,WAAyBthC,GAE7BhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAI86B,GAGpB7oD,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM+S,IAE1BzO,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK5iB,KAAK8nD,WAAWnyB,IAE5E31B,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,GACjB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,mBAITxpB,WAAWwpD,GAET,MAAMC,EAAeD,EAASlvC,MAAM,MAEU,KAA1CmvC,EAAaA,EAAahnD,OAAS,IAErCgnD,EAAaC,MAGf,MAAMvU,EAAY,GAElB,IAAK,IAAI3+B,EAAI,EAAGA,EAAIizC,EAAahnD,OAAQ+T,GAAK,EAC9C,CACE,MAAMxT,EAAI+b,WAAW0qC,EAAajzC,EAAI,IAChCvT,EAAI8b,WAAW0qC,EAAajzC,EAAI,IAChCtT,EAAI6b,WAAW0qC,EAAajzC,EAAI,IACtC2+B,EAAU/0C,KAAK,IAAIC,EAAQ2C,EAAGC,EAAGC,IAEnC,OAAOiyC,GC7DX,MAAMwU,WAAmB3hC,GAEvBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GACxBpB,KAAKssB,OAAS,IAAI+6B,GAGpB9oD,sBAAsB2oB,QAEkCviB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3C5iB,KAAKssB,OAAOG,KAAKzsB,KAAK4iB,KAAM8J,IAE1BxF,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAK8J,GAE5D1sB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,qBAEN4E,QAQAC,IAEC5sB,KAAK4oB,YAAYgE,GACjB5sB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCtCX,MAAMogC,WAAsB5hC,GAE1BhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GAG1B7C,sBAAsB2oB,EAAoBc,QAEcrjB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3CoF,EAAS9Y,OAAOuY,MAAMvY,IAEpB,MAAM9H,EAAU,IAAIqoB,EAEd7M,EAAMtT,IAAIC,gBAAgBL,GAE1B5H,EAAQ,IAAIooB,MAClBpoB,EAAMN,IAAM4b,EAEZtb,EAAMqoB,OAAS,KAEbvoB,EAAQE,MAAQA,EAChBF,EAAQ0oB,aAAc,EAEtB5I,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKxb,GAE5DpH,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,mBAGPzgB,EAAMyoB,QAAU,KAEd9U,QAAQC,MAAM,6DAA8Dlb,KAAK4iB,UAMrFsE,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBC5CX,MAAMqgC,WAAoB7hC,GAExBhoB,YAAYioB,EAAa5D,EAAKxhB,GAE5B3C,MAAM+nB,EAAa5D,EAAKxhB,GAG1B7C,sBAAsB2oB,EAAoBc,QAEcrjB,IAAlDuiB,EAAmBC,iBAAiBnnB,KAAK4iB,KAE3CoF,EAAS9Y,OAAOuY,MAAMvY,IAEpBgY,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKtT,IAAIC,gBAAgBL,IAEhFlP,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,sBAKPb,EAAmBW,aAAa7nB,KAAKwmB,YAAaxmB,KAAK4iB,IAAKsE,EAAmBC,iBAAiBnnB,KAAK4iB,MAErG5iB,KAAK8nB,0BAA0B,EAAG,GAClC9nB,KAAK+nB,oBCxBX,MAAMsgC,GAEJ9pD,YAAY+pD,GAEVtoD,KAAKuoD,iBAAmB,GACxBvoD,KAAKsoD,WAAaA,GAAc,gBAGlC/pD,WAAW+tB,GAETtsB,KAAKuoD,iBAAiB5pD,KAAK2tB,GAG7B/tB,KAAK2oB,GAEH,IAAK,IAAInS,EAAI,EAAGA,EAAI/U,KAAKuoD,iBAAiBvnD,OAAQ+T,IAEhD/U,KAAKuoD,iBAAiBxzC,GAAG0X,KAAKvF,GAAsB0D,IAIxD49B,uBAEE,IAAIj3B,GAAW,EACf,IAAK,IAAIxc,EAAI,EAAGA,EAAI/U,KAAKuoD,iBAAiBvnD,OAAQ+T,IAEhDwc,EAAWA,GAAYvxB,KAAKuoD,iBAAiBxzC,GAAG4R,aAElD,OAAO4K,EAGTk3B,iBAEE,IAAI7hC,GAAY,EAChB,IAAK,IAAI7R,EAAI,EAAGA,EAAI/U,KAAKuoD,iBAAiBvnD,OAAQ+T,IAEhD6R,EAAYA,GAAa5mB,KAAKuoD,iBAAiBxzC,GAAG6R,UAEpD,OAAOA,EAGTroB,eAEE0c,QAAQC,MAAM,UAAYlb,KAAKsoD,WAAa,iCAC5C,IAAK,IAAIvzC,EAAI,EAAGA,EAAI/U,KAAKuoD,iBAAiBvnD,OAAQ+T,IAE5C/U,KAAKuoD,iBAAiBxzC,GAAG6R,WAE3B5mB,KAAKuoD,iBAAiBxzC,GAAGuW,cAK/B/sB,eAEE,OAAOyB,KAAK0oD,mBAAqB1oD,KAAK2oD,kBAGxCpqD,mBAEE,IAAIkoB,EAAe,EAEnB,IAAK,IAAI1R,EAAI,EAAGA,EAAI/U,KAAKuoD,iBAAiBvnD,OAAQ+T,IAEhD0R,GAAgBzmB,KAAKuoD,iBAAiBxzC,GAAG0R,aAG3C,OAAOA,EAGTloB,kBAEE,IAAImoB,EAAc,EAElB,IAAK,IAAI3R,EAAI,EAAGA,EAAI/U,KAAKuoD,iBAAiBvnD,OAAQ+T,IAEhD2R,GAAe1mB,KAAKuoD,iBAAiBxzC,GAAG2R,YAG1C,OAAOA"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/PerspectiveCamera.js","../src/CameraManager.js","../src/Capabilities.js","../src/OrthographicCamera.js","../src/render_mode/BaseRender.js","../src/materials/BlitMaterial.js","../src/render_utilities/Blitter.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/Graphics.js","../src/materials/BaseShaderMaterial.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/Debug.js","../src/Time.js","../src/utilities/OMath.js","../src/action_sequencer/ActionEvent.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/ActionSequencer.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/view_components/transition/TransitionTable.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/TransitionManager.js","../src/view_components/ViewComponentManager.js","../src/view_components/ViewManager.js","../src/RenderLoop.js","../src/BaseApplication.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.js","../src/resource_loader/AbstractLoader.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/ResourceContainer.js","../src/loaders/AsyncAbstractLoader.js","../src/loaders/AsyncAudiosLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/GLTFLoader.js","../src/loaders/AsyncObjectsLoader.js","../src/Browser.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/loaders/AsyncTexturesLoader.js","../src/scenes/loading_states/CompilatorManager.js","../src/scenes/loading_states/LoadingState.js","../src/scenes/loading_states/HighQualityLoadingState.js","../src/scenes/loading_states/RegularLoadingState.js","../src/scenes/AbstractScene.js","../src/view_components/ApplicationView.js","../src/canvas_drawer/CanvasDrawer.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/UI.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/KeyboardInput.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/SSAOMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/render_mode/VRRender.js","../src/Screen.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/HTMLUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/Validation.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/gpu_particles/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["// @ts-check\r\nimport { Object3D } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { Line } from 'three';\r\n\r\nclass AxisHelper extends Object3D\r\n{\r\n constructor(scale = 1.0)\r\n {\r\n super();\r\n\r\n const blue_points = [];\r\n blue_points.push(new Vector3(0, 0, 0));\r\n blue_points.push(new Vector3(0, 0, 1000));\r\n\r\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\r\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\r\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\r\n blue_axis_line.renderOrder = 50000;\r\n\r\n const green_points = [];\r\n green_points.push(new Vector3(0, 0, 0));\r\n green_points.push(new Vector3(0, 1000, 0));\r\n\r\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\r\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\r\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\r\n green_axis_line.renderOrder = 50000;\r\n\r\n const red_points = [];\r\n red_points.push(new Vector3(0, 0, 0));\r\n red_points.push(new Vector3(1000, 0, 0));\r\n\r\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\r\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\r\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\r\n red_axis_line.renderOrder = 50000;\r\n\r\n this.renderOrder = 100000;\r\n\r\n this.add(blue_axis_line);\r\n this.add(green_axis_line);\r\n this.add(red_axis_line);\r\n\r\n this.scale.set(scale, scale, scale);\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n dispose()\r\n {\r\n }\r\n}\r\n\r\nexport { AxisHelper };\r\n","// @ts-check\r\nimport { Scene, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\n\r\nclass SceneManager\r\n{\r\n init()\r\n {\r\n this._current = new Scene();\r\n this._current.name = 'default_scene';\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n add_scene(name) // eslint-disable-line no-unused-vars\r\n {\r\n\r\n }\r\n\r\n /** @type {Scene} */\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n\r\n set current(scene)\r\n {\r\n this._current = scene;\r\n }\r\n\r\n dispose()\r\n {\r\n this.current.traverse((/** @type {Mesh} */ child) =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.dispose();\r\n const mat = child.material;\r\n if ('disppose' in mat && typeof (mat.disppose) === 'function')\r\n {\r\n // @ts-ignore\r\n mat.dispose();\r\n }\r\n }\r\n });\r\n\r\n while (this.current.children.length > 0)\r\n {\r\n this.current.remove(this.current.children[0]);\r\n }\r\n }\r\n}\r\n\r\nconst scene_manager = new SceneManager();\r\nexport { scene_manager as SceneManager };\r\n","// @ts-check\r\nimport { Vector3, Mesh } from 'three';\r\nimport { BoxGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nclass Cube extends Mesh\r\n{\r\n /**\r\n * @param {Vector3} [size]\r\n * @param {Vector3} [segments]\r\n * @param {number | string} [color]\r\n */\r\n constructor(size, segments, color)\r\n {\r\n size = size || new Vector3(1, 1, 1);\r\n segments = segments || new Vector3(1, 1, 1);\r\n color = color || 0xff0000;\r\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n\r\nexport { Cube };\r\n","import { Mesh, MeshBasicMaterial, SphereGeometry } from 'three';\r\n\r\nclass Sphere extends Mesh\r\n{\r\n /**\r\n * @param {number} radius\r\n * @param {number | string} color\r\n */\r\n constructor(radius, color)\r\n {\r\n color = color || '#FF0000';\r\n radius = radius || 1;\r\n const geometry = new SphereGeometry(radius, 64, 64);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n this.radius = radius;\r\n this.color = color;\r\n this.center = this.position;\r\n }\r\n}\r\n\r\nexport { Sphere };\r\n","// @ts-check\r\nimport { ConeGeometry, CylinderGeometry, Mesh, MeshBasicMaterial, Vector3 } from 'three';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nclass Arrow extends Mesh\r\n{\r\n /**\r\n * @param {string | number} [color]\r\n * @param {number} [length]\r\n * @param {Vector3} [dir]\r\n */\r\n constructor(color, length, dir)\r\n {\r\n color = color || '#FF0000';\r\n length = length || 1;\r\n\r\n const cone_height = 0.4;\r\n const cylinder_height = length - cone_height;\r\n const cylinder_geo = new CylinderGeometry(0.01, 0.01, cylinder_height, 32);\r\n cylinder_geo.translate(0, cylinder_height / 2, 0);\r\n\r\n const cone_geometry = new ConeGeometry(0.1, cone_height, 32);\r\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\r\n\r\n const buffer_geometry = BufferGeometryUtils.mergeGeometries([cylinder_geo, cone_geometry]);\r\n buffer_geometry.rotateX(3.14 / 2);\r\n\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(buffer_geometry, material);\r\n\r\n if (dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n }\r\n\r\n this._dir = dir;\r\n }\r\n\r\n set dir(dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n this._dir = dir;\r\n }\r\n\r\n get dir()\r\n {\r\n return this._dir;\r\n }\r\n\r\n set length(value)\r\n {\r\n this.scale.z = value;\r\n }\r\n\r\n get length()\r\n {\r\n return this.scale.z;\r\n }\r\n}\r\n\r\nexport { Arrow };\r\n","// @ts-check\r\nimport { Vector2 } from 'three';\r\n\r\nclass OScreen\r\n{\r\n init()\r\n {\r\n this.width = 1;\r\n this.height = 1;\r\n\r\n this.position = new Vector2();\r\n\r\n this.render_width = 1;\r\n this.render_height = 1;\r\n this.width_height = new Vector2(this.width, this.height);\r\n\r\n this.dpr = 1;\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n }\r\n\r\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n update_position(x, y)\r\n {\r\n this.position.set(x, y);\r\n }\r\n\r\n update()\r\n {\r\n this.size_changed = false;\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n update_size(width, height)\r\n {\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n\r\n this.width_height.x = width;\r\n this.width_height.y = height;\r\n\r\n this.render_width = width * this.dpr;\r\n this.render_height = height * this.dpr;\r\n\r\n this.size_changed = true;\r\n }\r\n\r\n /**\r\n * @param {Vector2} vector2\r\n */\r\n apply_pixel_density_v2(vector2)\r\n {\r\n vector2.multiplyScalar(1 / this.dpr);\r\n\r\n return vector2;\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n apply_pixel_density(value)\r\n {\r\n return value * (1 / this.dpr);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n return this.pixel_size;\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n return this.width / this.height;\r\n }\r\n\r\n get portrait()\r\n {\r\n return this.width < this.height;\r\n }\r\n}\r\n\r\nconst oscreen = new OScreen();\r\nexport { oscreen as OScreen };\r\n","// @ts-check\r\nimport { Color } from 'three';\r\nimport { PerspectiveCamera as TPerspectiveCamera } from 'three';\r\n\r\nclass PerspectiveCamera extends TPerspectiveCamera\r\n{\r\n /**\r\n * @param {number} fov\r\n * @param {number} aspect\r\n * @param {number} near\r\n * @param {number} far\r\n */\r\n constructor(fov, aspect, near, far)\r\n {\r\n super(fov, aspect, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n\r\n /**\r\n * @param {PerspectiveCamera} camera\r\n * @returns {this}\r\n */\r\n copy(camera)\r\n {\r\n super.copy(camera);\r\n this.clear_color.copy(camera.clear_color);\r\n this.clear_alpha = camera.clear_alpha;\r\n return this;\r\n }\r\n}\r\n\r\nexport { PerspectiveCamera };\r\n","// @ts-check\r\nimport { PerspectiveCamera } from './PerspectiveCamera'; // eslint-disable-line no-unused-vars\r\n\r\nclass CameraManager\r\n{\r\n init()\r\n {\r\n this._current = undefined;\r\n // VR Spectator\r\n this._spectator = undefined;\r\n }\r\n\r\n set current(camera)\r\n {\r\n this._current = camera;\r\n }\r\n\r\n /** @type {PerspectiveCamera} */\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n\r\n set spectator(camera)\r\n {\r\n this._spectator = camera;\r\n }\r\n\r\n /** @type {PerspectiveCamera} */\r\n get spectator()\r\n {\r\n return this._spectator;\r\n }\r\n}\r\n\r\nconst camera_manager = new CameraManager();\r\nexport { camera_manager as CameraManager };\r\n","// @ts-check\r\nclass Capabilities\r\n{\r\n init()\r\n {\r\n this.max_anisotropy = 0;\r\n this.vertex_texture_sampler_available = false;\r\n this.fp_textures_available = false;\r\n }\r\n}\r\n\r\nconst capabilities = new Capabilities();\r\nexport { capabilities as Capabilities };\r\n","// @ts-check\r\nimport { Color } from 'three';\r\nimport { OrthographicCamera as TOrthographicCamera } from 'three';\r\n\r\nclass OrthographicCamera extends TOrthographicCamera\r\n{\r\n /**\r\n * @param {number} left\r\n * @param {number} right\r\n * @param {number} top\r\n * @param {number} bottom\r\n * @param {number} near\r\n * @param {number} far\r\n */\r\n constructor(left, right, top, bottom, near, far)\r\n {\r\n super(left, right, top, bottom, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n\r\n /**\r\n * @param {OrthographicCamera} camera\r\n * @returns {this}\r\n */\r\n copy(camera)\r\n {\r\n super.copy(camera);\r\n this.clear_color.copy(camera.clear_color);\r\n this.clear_alpha = camera.clear_alpha;\r\n return this;\r\n }\r\n}\r\n\r\nexport { OrthographicCamera };\r\n","class BaseRender\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n render()\r\n {\r\n\r\n }\r\n\r\n on_enter(context, renderer)\r\n {\r\n\r\n }\r\n\r\n on_exit(context, renderer)\r\n {\r\n\r\n }\r\n\r\n resize()\r\n {\r\n\r\n }\r\n\r\n dispose()\r\n {\r\n\r\n }\r\n}\r\n\r\nexport { BaseRender };\r\n","import vert from '../shaders/copy/copy.vert';\r\nimport frag from '../shaders/copy/copy.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { NoBlending } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\n\r\nclass BlitMaterial extends ShaderMaterial\r\n{\r\n constructor(frag_shader, vert_shader, defines)\r\n {\r\n super({\r\n uniforms: {\r\n _MainTex: { value: null },\r\n _Resolution: { value: new Vector2(0, 0) },\r\n _TargetResolution: { value: new Vector2(0, 0) }\r\n },\r\n defines: defines || {},\r\n vertexShader: vert_shader || vert,\r\n fragmentShader: frag_shader || frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n }\r\n}\r\n\r\nexport { BlitMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport { Scene } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nclass Blitter\r\n{\r\n constructor(renderer)\r\n {\r\n this.renderer = renderer;\r\n this._blit_scene = new Scene();\r\n this._blit_material = new BlitMaterial();\r\n this._blit_quad = new Mesh(\r\n new PlaneGeometry(1, 1), this._blit_material);\r\n this._blit_scene.add(this._blit_quad);\r\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\r\n }\r\n\r\n blit(src, dst)\r\n {\r\n this._blit_quad.material = this._blit_material;\r\n\r\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n material_pass(mat, dst)\r\n {\r\n this._blit_quad.material = mat;\r\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\r\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_with_material(src, dst, mat)\r\n {\r\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material = mat;\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this._blit_quad.material = mat;\r\n\r\n this.__render(dst_RT);\r\n }\r\n\r\n dispose()\r\n {\r\n this._blit_quad.geometry.dispose();\r\n this._blit_quad.material.dispose();\r\n }\r\n\r\n __render(dst_RT)\r\n {\r\n const RT = dst_RT === undefined ? null : dst_RT;\r\n\r\n const current_rt = this.renderer.getRenderTarget();\r\n\r\n this.renderer.setRenderTarget(RT);\r\n this.renderer.render(this._blit_scene, this._blit_camera);\r\n\r\n this.renderer.setRenderTarget(current_rt);\r\n }\r\n}\r\n\r\nexport { Blitter };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/clear/clear_depth_normal.frag';\r\n\r\nimport { Vector4 } from 'three';\r\n\r\nclass ClearDepthNormalMaterial extends BlitMaterial\r\n{\r\n constructor(clear_depth, clear_normal)\r\n {\r\n super(frag);\r\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\r\n }\r\n}\r\n\r\nexport { ClearDepthNormalMaterial };\r\n","import vert from '../shaders/depth_normals/depth_normals.vert';\r\nimport frag from '../shaders/depth_normals/depth_normals.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nclass DepthNormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n _FarPlane: { value: 1 }\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n\r\n set far_plane(value)\r\n {\r\n this.uniforms._FarPlane.value = value;\r\n }\r\n\r\n get far_plane()\r\n {\r\n return this.uniforms._FarPlane.value;\r\n }\r\n}\r\n\r\nexport { DepthNormalMaterial };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { OScreen } from '../OScreen';\r\n\r\nimport { ClearDepthNormalMaterial } from '../materials/ClearDepthNormalMaterial';\r\nimport { DepthNormalMaterial } from '../materials/DepthNormalMaterial';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nclass DepthAndNormalsRenderer\r\n{\r\n constructor()\r\n {\r\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\r\n\r\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\r\n this.depth_normal_material = new DepthNormalMaterial();\r\n }\r\n\r\n render(graphics)\r\n {\r\n this.__resize_RT_if_necessary();\r\n\r\n graphics.clear(this.RT, undefined, true, true);\r\n\r\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\r\n\r\n this.depth_normal_material.far_plane = CameraManager.current.far;\r\n\r\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\r\n }\r\n\r\n __resize_RT_if_necessary()\r\n {\r\n if (this.RT.width !== OScreen.width || this.RT.height !== OScreen.height)\r\n {\r\n this.RT.setSize(OScreen.width, OScreen.height);\r\n }\r\n }\r\n\r\n get render_target()\r\n {\r\n return this.RT;\r\n }\r\n}\r\n\r\nexport { DepthAndNormalsRenderer };\r\n","// @ts-check\r\nimport { BaseApplication } from './BaseApplication'; // eslint-disable-line no-unused-vars\r\nimport { CameraManager } from './CameraManager';\r\nimport { Capabilities } from './Capabilities';\r\nimport { OScreen } from './OScreen';\r\nimport { OrthographicCamera } from './OrthographicCamera'; // eslint-disable-line no-unused-vars\r\nimport { PerspectiveCamera } from './PerspectiveCamera'; // eslint-disable-line no-unused-vars\r\nimport { SceneManager } from './SceneManager';\r\n\r\nimport { BaseRender } from './render_mode/BaseRender';\r\nimport { Blitter } from './render_utilities/Blitter';\r\nimport { DepthAndNormalsRenderer } from './render_utilities/DepthAndNormalsRenderer';\r\n\r\nimport {\r\n AlwaysDepth,\r\n FloatType,\r\n LinearSRGBColorSpace,\r\n NearestFilter,\r\n NoBlending,\r\n RGBAFormat,\r\n ShaderMaterial,\r\n WebGLRenderTarget,\r\n Material, Object3D, Scene // eslint-disable-line no-unused-vars\r\n} from 'three';\r\n\r\nimport { WebGLRenderer } from 'three';\r\n\r\nclass Graphics\r\n{\r\n /**\r\n * @param {Object} options\r\n * @param {HTMLCanvasElement} options.canvas\r\n * @param {Record<string, any>} options.core_attributes\r\n * @param {Record<string, any>} options.context_attributes\r\n * @param {Record<string, any>} options.threejs_attributes\r\n * @param {number} options.dpr\r\n */\r\n init({ canvas, core_attributes, context_attributes, threejs_attributes, dpr })\r\n {\r\n this._renderer = undefined;\r\n this.blitter = undefined;\r\n this.canvas = undefined;\r\n this.no_render = undefined;\r\n this.current_render_mode = undefined;\r\n this.generateDepthNormalTexture = false;\r\n this.depth_and_normals_renderer = undefined;\r\n\r\n this.is_webgl2 = false;\r\n this.canvas_context = undefined;\r\n this.context_attributes = undefined;\r\n\r\n this.core_attributes = {\r\n force_webgl2: true,\r\n xr_enabled: false\r\n };\r\n\r\n this.context_attributes = {\r\n alpha: true,\r\n antialias: false,\r\n depth: true,\r\n desynchronized: false,\r\n failIfMajorPerformanceCaveat: false,\r\n powerPreference: 'high-performance',\r\n premultipliedAlpha: true,\r\n preserveDrawingBuffer: true,\r\n stencil: false\r\n };\r\n\r\n /** @type {Record<string, any>} */\r\n this.threejs_attributes = {\r\n logarithmicDepthBuffer: false\r\n };\r\n\r\n Object.assign(this.core_attributes, core_attributes);\r\n Object.assign(this.context_attributes, context_attributes);\r\n\r\n Object.assign(this.threejs_attributes, this.context_attributes);\r\n Object.assign(this.threejs_attributes, threejs_attributes);\r\n\r\n if (this.core_attributes.force_webgl2)\r\n {\r\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\r\n canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n else\r\n {\r\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n\r\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\r\n\r\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\r\n\r\n this.threejs_attributes.canvas = canvas;\r\n this.threejs_attributes.context = this.canvas_context;\r\n\r\n this._renderer = new WebGLRenderer(this.threejs_attributes);\r\n\r\n if (this.core_attributes.xr_enabled)\r\n {\r\n this._renderer.xr.enabled = true;\r\n }\r\n else\r\n {\r\n this._renderer.autoClear = false;\r\n }\r\n\r\n OScreen.dpr = dpr;\r\n this._renderer.setPixelRatio(1);\r\n\r\n if (!this.is_webgl2)\r\n {\r\n this._renderer.extensions.get('ANGLE_instanced_arrays');\r\n }\r\n\r\n this.blitter = new Blitter(this._renderer);\r\n\r\n this.canvas = this._renderer.domElement;\r\n\r\n this.no_render = new BaseRender();\r\n\r\n this.current_render_mode = this.no_render;\r\n\r\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\r\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\r\n Capabilities.fp_textures_available = this.is_floating_point_texture_available();\r\n\r\n this.generateDepthNormalTexture = false;\r\n\r\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\r\n }\r\n\r\n get dom_element()\r\n {\r\n return this._renderer.domElement;\r\n }\r\n\r\n get depth_normals_RT()\r\n {\r\n return this.depth_and_normals_renderer.render_target;\r\n }\r\n\r\n /**\r\n * @param {BaseRender} new_state\r\n */\r\n set_state(new_state)\r\n {\r\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\r\n\r\n this.current_render_mode.on_exit(this, this._renderer);\r\n this.current_render_mode = new_state;\r\n this.current_render_mode.on_enter(this, this._renderer);\r\n }\r\n\r\n update()\r\n {\r\n if (this.generateDepthNormalTexture)\r\n {\r\n this.depth_and_normals_renderer.render(this);\r\n }\r\n\r\n this.__update_current_camera();\r\n\r\n if (CameraManager.current)\r\n {\r\n this.current_render_mode.render();\r\n }\r\n\r\n OScreen.update();\r\n }\r\n\r\n __update_current_camera()\r\n {\r\n if (CameraManager.current)\r\n {\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateProjectionMatrix();\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Scene} [scene]\r\n * @param {PerspectiveCamera | OrthographicCamera} [camera]\r\n * @param {WebGLRenderTarget} [RT]\r\n * @param {Material} [override_mat]\r\n */\r\n render(scene, camera, RT, override_mat)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this._renderer.render(scene || SceneManager.current,\r\n camera || CameraManager.current);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n }\r\n\r\n /**\r\n * @param {Scene} scene\r\n * @param {PerspectiveCamera} camera\r\n * @param {WebGLRenderTarget} RT\r\n * @param {Material} override_mat\r\n */\r\n compile(scene, camera, RT, override_mat)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this._renderer.compile(scene || SceneManager.current,\r\n camera || CameraManager.current);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n }\r\n\r\n /**\r\n * @param {Scene} scene\r\n * @param {PerspectiveCamera} camera\r\n * @param {WebGLRenderTarget} RT\r\n * @param {Material} override_mat\r\n * @param {Scene} target_scene\r\n * @returns {Promise<Object3D>}\r\n */\r\n async compile_async(scene, camera, RT, override_mat, target_scene)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n const promise = this._renderer.compileAsync(scene || SceneManager.current,\r\n camera || CameraManager.current, target_scene);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * @param {BaseApplication | Scene | {render:()=>void}} scene\r\n */\r\n render_scene(scene)\r\n {\r\n if ('on_pre_render' in scene)\r\n {\r\n scene.on_pre_render();\r\n }\r\n\r\n if ('render' in scene)\r\n {\r\n scene.render();\r\n }\r\n else\r\n {\r\n // @ts-ignore\r\n this.render(scene, undefined);\r\n }\r\n\r\n if ('on_post_render' in scene)\r\n {\r\n scene.on_post_render();\r\n }\r\n }\r\n\r\n /**\r\n * @param {Scene} scene\r\n * @param {Material} mat\r\n */\r\n __apply_override_material(scene, mat)\r\n {\r\n mat = mat === undefined ? null : mat;\r\n if (scene)\r\n {\r\n scene.overrideMaterial = mat;\r\n }\r\n else\r\n {\r\n SceneManager.current.overrideMaterial = mat;\r\n }\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} RT\r\n * @param {import('three').TypedArray} buffer\r\n */\r\n readback_RT(RT, buffer)\r\n {\r\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} RT\r\n * @param {PerspectiveCamera} camera\r\n * @param {boolean} clear_depth\r\n * @param {boolean} clear_stencil\r\n */\r\n clear(RT, camera, clear_depth, clear_stencil)\r\n {\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n\r\n if (camera)\r\n {\r\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\r\n }\r\n\r\n this._renderer.clear(!!camera, // clear color\r\n !!clear_depth,\r\n !!clear_stencil);\r\n }\r\n\r\n /**\r\n * @param {ResizeObserverEntry[]} entries\r\n * @param {number} dpr\r\n */\r\n on_resize(entries, dpr)\r\n {\r\n for (const entry of entries)\r\n {\r\n OScreen.dpr = dpr;\r\n // this._renderer.setPixelRatio(dpr);\r\n\r\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\r\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\r\n\r\n this.canvas.width = OScreen.render_width;\r\n this.canvas.height = OScreen.render_height;\r\n\r\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\r\n\r\n this.__update_current_camera();\r\n }\r\n }\r\n\r\n /**\r\n * @param {Material} mat\r\n * @param {WebGLRenderTarget} dst\r\n */\r\n material_pass(mat, dst)\r\n {\r\n this.blitter.material_pass(mat, dst);\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} src_RT\r\n * @param {WebGLRenderTarget} dst_RT\r\n * @param {Material} mat\r\n */\r\n blit(src_RT, dst_RT, mat)\r\n {\r\n if (mat)\r\n {\r\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\r\n }\r\n else\r\n {\r\n this.blitter.blit(src_RT, dst_RT);\r\n }\r\n }\r\n\r\n /**\r\n * @param {WebGLRenderTarget} dst_RT\r\n * @param {Material} mat\r\n */\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this.blitter.blit_clear_with_material(dst_RT, mat);\r\n }\r\n\r\n /**\r\n * @param {BlobCallback} blob_callback\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\r\n {\r\n // const ctx = this;\r\n\r\n const old_width = OScreen.width;\r\n const old_height = OScreen.height;\r\n\r\n const new_width = width;\r\n const new_height = height;\r\n\r\n const tile_width = 1024;\r\n const tile_height = 1024;\r\n\r\n const divisions_x = Math.ceil(new_width / tile_width);\r\n const divisions_y = Math.ceil(new_height / tile_height);\r\n\r\n OScreen.update_size(tile_width, tile_height);\r\n const old_dpr = this._renderer.getPixelRatio();\r\n this._renderer.setPixelRatio(1);\r\n\r\n this._renderer.setSize(tile_width, tile_height, false);\r\n\r\n const canvas_2d = document.createElement('canvas');\r\n const ctx_2D = canvas_2d.getContext('2d');\r\n\r\n ctx_2D.canvas.width = new_width;\r\n ctx_2D.canvas.height = new_height;\r\n\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n\r\n for (let x = 0; x < divisions_x; x++)\r\n {\r\n for (let y = 0; y < divisions_y; y++)\r\n {\r\n CameraManager.current.setViewOffset(new_width, new_height,\r\n OScreen.width * x, OScreen.height * y,\r\n OScreen.width, OScreen.height);\r\n this.current_render_mode.render();\r\n\r\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.height * y);\r\n }\r\n }\r\n\r\n // transform the result canvas into a blob\r\n // } from them the callback turns into a ULR and download it\r\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\r\n\r\n CameraManager.current.clearViewOffset();\r\n\r\n OScreen.update_size(old_width, old_height);\r\n this._renderer.setPixelRatio(old_dpr);\r\n this._renderer.setSize(old_width, old_height, false);\r\n\r\n CameraManager.current.aspect = OScreen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n\r\n /**\r\n * @param {Blob} blob\r\n */\r\n download_screenshot(blob)\r\n {\r\n const link = document.createElement('a');\r\n link.download = 'Snapshot.png';\r\n\r\n link.href = URL.createObjectURL(blob);\r\n link.click();\r\n\r\n link.onclick = function()\r\n {\r\n requestAnimationFrame(function()\r\n {\r\n URL.revokeObjectURL(link.href);\r\n });\r\n link.removeAttribute('href');\r\n };\r\n }\r\n\r\n dispose()\r\n {\r\n this._renderer.dispose();\r\n this.current_render_mode.dispose();\r\n this.blitter.dispose();\r\n }\r\n\r\n is_floating_point_texture_available()\r\n {\r\n const RT = new WebGLRenderTarget(1, 1, {\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter,\r\n format: RGBAFormat,\r\n colorSpace: LinearSRGBColorSpace,\r\n type: FloatType,\r\n stencilBuffer: false,\r\n depthBuffer: false\r\n });\r\n\r\n const vert = `\r\n void main()\r\n {\r\n gl_Position = vec4(uv * 2.0 - 1.0, 1.0, 1.0);\r\n }\r\n `;\r\n const frag = `\r\n void main()\r\n {\r\n gl_FragColor = vec4(0.0, 4865.35, 0.0, 1.0);\r\n }\r\n `;\r\n\r\n const mat = new ShaderMaterial({\r\n vertexShader: vert,\r\n fragmentShader: frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n\r\n this.material_pass(mat, RT);\r\n\r\n const output = new Float32Array(4);\r\n this._renderer.readRenderTargetPixels(RT, 0, 0, 1, 1, output);\r\n\r\n return Math.abs(output[1] - 4865.35) < 0.001;\r\n }\r\n}\r\n\r\nconst graphics = new Graphics();\r\nexport { graphics as Graphics };\r\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\r\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nclass BaseShaderMaterial extends ShaderMaterial\r\n{\r\n constructor(vert, frag, uniforms)\r\n {\r\n super({\r\n vertexShader: vert || basic_vert,\r\n fragmentShader: frag || basic_frag,\r\n uniforms: uniforms || {\r\n _Color: { value: new Color('#FF0000') }\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { BaseShaderMaterial };\r\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\r\nimport { Vector2 } from 'three';\r\nclass ScreenSpaceTextureMaterial extends BaseShaderMaterial\r\n{\r\n constructor(x, y, w, h)\r\n {\r\n const vert = `\r\n uniform vec2 _ScreenSpacePosition;\r\n uniform vec2 _ScreenSize;\r\n uniform vec2 _TextureSize;\r\n varying vec2 vUv;\r\n void main()\r\n {\r\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\r\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\r\n\r\n pos.x = pos.x * 2.0 - 1.0;\r\n pos.y = pos.y * 2.0 - 1.0;\r\n\r\n gl_Position = vec4(pos, 0.0, 1.0);\r\n vUv = uv;\r\n }\r\n `;\r\n const frag = `\r\n uniform sampler2D _MainTex;\r\n varying vec2 vUv;\r\n\r\n void main()\r\n {\r\n gl_FragColor = texture2D(_MainTex, vUv);\r\n }\r\n `;\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSpacePosition: { value: new Vector2() },\r\n _ScreenSize: { value: new Vector2() },\r\n _TextureSize: { value: new Vector2() }\r\n });\r\n }\r\n\r\n set_position(x, y)\r\n {\r\n this.uniforms._ScreenSpacePosition.value.set(x, y);\r\n }\r\n\r\n set_texture(tex, w, h)\r\n {\r\n this.uniforms._MainTex.value = tex;\r\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\r\n\r\n if (w !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.x = w;\r\n }\r\n if (h !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.y = h;\r\n }\r\n }\r\n\r\n set_screen_size(w, h)\r\n {\r\n this.uniforms._ScreenSize.value.set(w, h);\r\n }\r\n}\r\n\r\nexport { ScreenSpaceTextureMaterial };\r\n","// @ts-check\r\nimport { AxisHelper } from './components/AxisHelper';\r\n\r\nimport { SceneManager } from './SceneManager';\r\nimport { Cube } from './primitives/Cube';\r\nimport { Sphere } from './primitives/Sphere';\r\nimport { Arrow } from './primitives/Arrow';\r\nimport { OScreen } from './OScreen';\r\nimport { Graphics } from './Graphics'; // eslint-disable-line no-unused-vars\r\nimport { ScreenSpaceTextureMaterial } from './materials/ScreenSpaceTextureMaterial';\r\nimport { PerspectiveCamera } from './PerspectiveCamera';\r\n\r\nimport { RenderTarget, Texture, Vector2, Vector3, WebGLRenderer } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { LineBasicMaterial } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Line } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector4 } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { Box3 } from 'three';\r\nimport { Box3Helper } from 'three';\r\nimport { Scene } from 'three';\r\nimport { CatmullRomCurve3 } from 'three';\r\nimport { SphereGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n// @ts-ignore\r\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\r\n// @ts-ignore\r\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\r\nimport { CameraManager } from './CameraManager';\r\n\r\nclass Debug\r\n{\r\n init()\r\n {\r\n this.Vector3_one = new Vector3(1, 1, 1);\r\n this.Vector3_zero = new Vector3(0, 0, 0);\r\n this.canvas_renderer = undefined;\r\n\r\n /** @type { Mesh<PlaneGeometry, ScreenSpaceTextureMaterial>[] } */\r\n this.display_texture_meshes = [];\r\n\r\n this.ctx = undefined;\r\n this.scene = new Scene();\r\n this.camera = new PerspectiveCamera(60, OScreen.aspect_ratio, 0.1, 1000);\r\n this.camera.clear_alpha = 0;\r\n }\r\n\r\n /**\r\n * @param {Vector3} origin\r\n * @param {Vector3} dir\r\n * @param {number | string} color\r\n * @returns {Arrow}\r\n */\r\n draw_arrow(origin, dir, color = 0xff0000)\r\n {\r\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\r\n arrow.position.copy(origin);\r\n this.scene.add(arrow);\r\n return arrow;\r\n }\r\n\r\n draw_axis()\r\n {\r\n const axis = new AxisHelper();\r\n this.scene.add(axis);\r\n return axis;\r\n }\r\n\r\n /**\r\n * @param {RenderTarget} RT\r\n */\r\n set_debug_RT(RT)\r\n {\r\n this.rt_debug = RT;\r\n }\r\n\r\n /**\r\n * @param {Vector2 | Vector3} position_2d\r\n * @param {number} width\r\n * @param {number} height\r\n * @param {number | string} color\r\n */\r\n draw_rectangle(position_2d, width, height, color)\r\n {\r\n width = width || 100;\r\n height = height || 100;\r\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.fillRect(position_2d.x - width / 2,\r\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\r\n }\r\n\r\n clear()\r\n {\r\n if (this.ctx)\r\n {\r\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Vector3 | Vector2} from\r\n * @param {Vector3 | Vector2} to\r\n * @param {number | string} color\r\n */\r\n draw_line_2D(from, to, color)\r\n {\r\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(from.x, from.y);\r\n this.ctx.lineTo(to.x, to.y);\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n * @param {number | string} color\r\n * @returns {Line}\r\n */\r\n draw_line(points, color = 0xff0000)\r\n {\r\n const material = new LineBasicMaterial({\r\n color: color\r\n });\r\n\r\n const geometry = new BufferGeometry().setFromPoints(points);\r\n\r\n const line = new Line(geometry, material);\r\n line.frustumCulled = false;\r\n this.scene.add(line);\r\n return line;\r\n }\r\n\r\n /**\r\n * @param {Vector3} pos\r\n * @param {number} size\r\n * @param {number | string} color\r\n * @returns {Cube}\r\n */\r\n draw_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\r\n cube.position.copy(pos);\r\n this.scene.add(cube);\r\n return cube;\r\n }\r\n\r\n /**\r\n * @param {Vector3} from\r\n * @param {Vector3} to\r\n * @param {number} height\r\n * @param {number | string} color\r\n * @param {number} depth\r\n * @returns {Cube}\r\n */\r\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\r\n {\r\n const size = from.distanceTo(to);\r\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\r\n\r\n const center = to.clone().sub(from).multiplyScalar(0.5);\r\n const forward_dir = center.clone().normalize();\r\n center.add(from);\r\n\r\n cube.position.copy(center);\r\n\r\n // let up = new Vector3(0, 1, 0);\r\n // let forward = forward_dir.clone();\r\n // let right = forward.clone().cross(up);\r\n\r\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\r\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\r\n\r\n this.scene.add(cube);\r\n return cube;\r\n }\r\n\r\n /**\r\n *\r\n * @param {number} [width]\r\n * @param {number} [height]\r\n * @param {number | string} [color]\r\n * @returns\r\n */\r\n draw_plane(width, height, color) // eslint-disable-line no-unused-vars\r\n {\r\n const geometry = new PlaneGeometry(width, height);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane = new Mesh(geometry, material);\r\n plane.renderOrder = -10000;\r\n this.scene.add(plane);\r\n return plane;\r\n }\r\n\r\n /**\r\n * @param {Vector3} pos\r\n * @param {number} size\r\n * @param {number | string} color\r\n * @returns {Box3Helper}\r\n */\r\n draw_empty_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n\r\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\r\n const helper = new Box3Helper(box, color);\r\n helper.position.copy(pos || new Vector3());\r\n return helper;\r\n }\r\n\r\n /**\r\n * @param {Vector3} pos\r\n * @param {number} size\r\n * @param {number | string} color\r\n * @returns {Sphere}\r\n */\r\n draw_sphere(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n const sphere = new Sphere(size, color);\r\n sphere.position.copy(pos);\r\n this.scene.add(sphere);\r\n return sphere;\r\n }\r\n\r\n /**\r\n *\r\n * @param {Vector3[]} input_points\r\n * @param {boolean} open\r\n * @param {number | string} color\r\n * @returns {Line}\r\n */\r\n draw_point_array(input_points, open = false, color = 0xff0000) // eslint-disable-line no-unused-vars\r\n {\r\n const catmull = new CatmullRomCurve3(input_points, open);\r\n catmull.updateArcLengths();\r\n const points = catmull.getSpacedPoints(200);\r\n const line_helper = this.draw_line(points, 0x00ff00);\r\n // line_helper.position.y = 1.5;\r\n return line_helper;\r\n }\r\n\r\n /**\r\n * @param {Sphere} sphere\r\n * @param {number | string} color\r\n * @returns {Mesh}\r\n */\r\n draw_sphere_helper(sphere, color)\r\n {\r\n color = color || 0xff0000;\r\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n const material = new MeshBasicMaterial({ color: color });\r\n const sphere_mesh = new Mesh(geometry, material);\r\n sphere_mesh.position.copy(sphere.center);\r\n SceneManager.current.add(sphere_mesh);\r\n return sphere_mesh;\r\n }\r\n\r\n /**\r\n * @param {Sphere} sphere\r\n */\r\n draw_math_sphere(sphere)\r\n {\r\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true\r\n });\r\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\r\n const sphere1 = new Mesh(geometry, material);\r\n sphere1.position.copy(sphere.center);\r\n SceneManager.current.add(sphere1);\r\n }\r\n\r\n /**\r\n * @param {Box3} bb\r\n */\r\n draw_bounding_box(bb)\r\n {\r\n const helper = new Box3Helper(bb, 0xffff00);\r\n SceneManager.current.add(helper);\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} curve\r\n * @param {object} options\r\n * @param {number} options.offset\r\n */\r\n draw_curve(curve, options)\r\n {\r\n const offset = new Vector3(0, 0, 0);\r\n if (options)\r\n {\r\n offset.y = options.offset || 0;\r\n }\r\n\r\n for (let i = 0; i < curve.length - 1; i++)\r\n {\r\n this.draw_line([curve[i].clone().add(offset), curve[i + 1].clone().add(offset)]);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Texture} tex\r\n * @param {number} w\r\n * @param {number} h\r\n * @returns {Mesh}\r\n */\r\n draw_texture(tex, w, h)\r\n {\r\n const mesh = new Mesh(new PlaneGeometry(1, 1), new ScreenSpaceTextureMaterial());\r\n this.display_texture_meshes.push(mesh);\r\n this.scene.add(mesh);\r\n\r\n mesh.material.set_texture(tex, w, h);\r\n return mesh;\r\n }\r\n\r\n /**\r\n * @param {Graphics} graphics\r\n */\r\n render(graphics)\r\n {\r\n for (let i = 0; i < this.display_texture_meshes.length; i++)\r\n {\r\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\r\n }\r\n if (this.scene.children.length > 0)\r\n {\r\n graphics.render(this.scene, CameraManager.current);\r\n }\r\n }\r\n}\r\n\r\nconst debug = new Debug();\r\nexport { debug as Debug };\r\n","// @ts-check\r\n\r\nclass Time\r\n{\r\n constructor()\r\n {\r\n this.__delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\r\n }\r\n\r\n init()\r\n {\r\n this.__previous_elapsed_time = -1;\r\n this.__delta_time = 0;\r\n this.__smooth_delta_time = 0;\r\n this.__elapsed_time = 0;\r\n this.__frame_interpolation_t = 0;\r\n this.fixed_delta_time = 1 / 30;\r\n }\r\n\r\n get elapsed_time()\r\n {\r\n return this.__elapsed_time;\r\n }\r\n\r\n get delta_time()\r\n {\r\n return this.__delta_time;\r\n }\r\n\r\n get smooth_delta_time()\r\n {\r\n return this.__smooth_delta_time;\r\n }\r\n\r\n get frame_interpolation()\r\n {\r\n return this.__frame_interpolation_t;\r\n }\r\n\r\n get fdt()\r\n {\r\n return this.fixed_delta_time;\r\n }\r\n\r\n get dt()\r\n {\r\n return this.delta_time;\r\n }\r\n\r\n get sdt()\r\n {\r\n return this.smooth_delta_time;\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n __set_frame_interpolation(value)\r\n {\r\n this.__frame_interpolation_t = value;\r\n }\r\n\r\n /**\r\n * @param {number} elapsed_time\r\n */\r\n __update(elapsed_time)\r\n {\r\n if (this.__previous_elapsed_time < 0)\r\n {\r\n this.__previous_elapsed_time = elapsed_time;\r\n }\r\n this.__delta_time = (elapsed_time - this.__previous_elapsed_time) / 1000;\r\n this.__elapsed_time = elapsed_time / 1000;\r\n\r\n this.__delta_buffer.shift();\r\n this.__delta_buffer.push(this.delta_time < 0.32 ? this.delta_time : 0.032);\r\n\r\n this.__calculate_smooth_delta_time();\r\n\r\n this.__previous_elapsed_time = elapsed_time;\r\n }\r\n\r\n __calculate_smooth_delta_time()\r\n {\r\n this.__smooth_delta_time = 0;\r\n\r\n for (let i = 0; i < this.__delta_buffer.length; i++)\r\n {\r\n this.__smooth_delta_time += this.__delta_buffer[i];\r\n }\r\n\r\n this.__smooth_delta_time = this.__smooth_delta_time / this.__delta_buffer.length;\r\n }\r\n}\r\n\r\nconst time = new Time();\r\nexport { time as Time };\r\n","\r\nclass OMath\r\n{\r\n constructor()\r\n {}\r\n\r\n static linear_map(value,\r\n from_range_start_value,\r\n from_range_end_value,\r\n to_range_start_value,\r\n to_range_end_value)\r\n {\r\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\r\n }\r\n\r\n static between(value, min, max)\r\n {\r\n return (value >= min && value <= max);\r\n }\r\n\r\n static mod(number, divisor)\r\n {\r\n return ((number % divisor) + divisor) % divisor;\r\n }\r\n\r\n static rgb_to_hex(rgb)\r\n {\r\n rgb.r = Math.round(rgb.r * 255).toString(16);\r\n rgb.g = Math.round(rgb.g * 255).toString(16);\r\n rgb.b = Math.round(rgb.b * 255).toString(16);\r\n\r\n if (rgb.r.length === 1)\r\n {\r\n rgb.r = '0' + rgb.r;\r\n }\r\n if (rgb.g.length === 1)\r\n {\r\n rgb.g = '0' + rgb.g;\r\n }\r\n if (rgb.b.length === 1)\r\n {\r\n rgb.b = '0' + rgb.b;\r\n }\r\n\r\n return '#' + rgb.r + rgb.g + rgb.b;\r\n }\r\n\r\n static project_points_on_plane(points, plane)\r\n {\r\n const projected_point = points[0].clone();\r\n projected_point.set(0, 0, 0);\r\n\r\n const points_on_plane = [];\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n plane.projectPoint(points[i], projected_point);\r\n points_on_plane.push(projected_point.clone());\r\n }\r\n\r\n return points_on_plane;\r\n }\r\n\r\n static matrix4_lerp(from, to, target, t)\r\n {\r\n for (let i = 0; i < 16; i++)\r\n {\r\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\r\n }\r\n }\r\n\r\n static equals(x1, x2)\r\n {\r\n return Math.abs(x1 - x2) < 0.000001;\r\n }\r\n\r\n static lerp(x, y, t)\r\n {\r\n return (1 - t) * x + t * y;\r\n }\r\n\r\n static clamp(value, min, max)\r\n {\r\n return Math.max(min, Math.min(max, value));\r\n }\r\n\r\n static euclideanModulo(n, m)\r\n {\r\n return ((n % m) + m) % m;\r\n }\r\n\r\n static pingpong(x, length = 1)\r\n {\r\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\r\n }\r\n\r\n static degToRad(degrees)\r\n {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static radToDeg(radians)\r\n {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n static deg_to_rad(degrees)\r\n {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static rad_to_deg(radians)\r\n {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n static perspective_divide(v)\r\n {\r\n v.x /= v.w;\r\n v.y /= v.w;\r\n v.z /= v.w;\r\n return v;\r\n }\r\n\r\n static points_average(points)\r\n {\r\n const center = points[0].clone();\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n center.add(points[i]);\r\n }\r\n center.multiplyScalar(1 / points.length);\r\n return center;\r\n }\r\n\r\n static get_random_color()\r\n {\r\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\r\n\r\n let col = '#';\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n return col;\r\n }\r\n\r\n static saturate(x)\r\n {\r\n return OMath.clamp(x, 0, 1);\r\n }\r\n}\r\n\r\nexport { OMath };\r\n","// @ts-check\r\nclass ActionEvent\r\n{\r\n /**\r\n * @param {string} name\r\n * @param {string} method\r\n * @param {string} args\r\n */\r\n constructor(name, method, args)\r\n {\r\n this.name = name;\r\n this.method = method;\r\n this.args = args;\r\n }\r\n\r\n trigger()\r\n {\r\n ViewApi.application[this.name][this.method](...this.args.split(','));\r\n }\r\n}\r\n\r\nexport { ActionEvent };\r\n","\r\nclass EasingFunctions\r\n{\r\n constructor()\r\n {}\r\n\r\n static linear(x)\r\n {\r\n return x;\r\n }\r\n\r\n static triangular(x)\r\n {\r\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\r\n }\r\n\r\n static ease_in_sine(x)\r\n {\r\n return 1 - Math.cos(x * 3.1415926 / 2);\r\n }\r\n\r\n static ease_out_sine(x)\r\n {\r\n return Math.sin(x * 3.1415926 / 2);\r\n }\r\n\r\n static ease_in_out_sine(x)\r\n {\r\n return -(Math.cos(3.1415926 * x) - 1) / 2;\r\n }\r\n\r\n static ease_in_cubic(x)\r\n {\r\n return x * x * x;\r\n }\r\n\r\n static ease_out_cubic(x)\r\n {\r\n return 1 - Math.pow(1 - x, 3);\r\n }\r\n\r\n static ease_in_out_cubic(x)\r\n {\r\n return x < 0.5\r\n ? 4 * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\r\n }\r\n\r\n static ease_in_quad(x)\r\n {\r\n return x * x;\r\n }\r\n\r\n static ease_out_quad(x)\r\n {\r\n return 1 - (1 - x) * (1 - x);\r\n }\r\n\r\n static ease_in_out_quad(x)\r\n {\r\n return x < 0.5\r\n ? 2 * x * x\r\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\r\n }\r\n\r\n static ease_in_quart(x)\r\n {\r\n return x * x * x * x;\r\n }\r\n\r\n static ease_out_quart(x)\r\n {\r\n return 1 - Math.pow(1 - x, 4);\r\n }\r\n\r\n static ease_in_out_quart(x)\r\n {\r\n return x < 0.5\r\n ? 8 * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\r\n }\r\n\r\n static ease_in_quint(x)\r\n {\r\n return x * x * x * x * x;\r\n }\r\n\r\n static ease_out_quint(x)\r\n {\r\n return 1 - Math.pow(1 - x, 5);\r\n }\r\n\r\n static ease_in_out_quint(x)\r\n {\r\n return x < 0.5\r\n ? 16 * x * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\r\n }\r\n\r\n static ease_in_expo(x)\r\n {\r\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\r\n }\r\n\r\n static ease_out_expo(x)\r\n {\r\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\r\n }\r\n\r\n static ease_in_out_expo(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : x < 0.5\r\n ? Math.pow(2, 20 * x - 10) / 2\r\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\r\n }\r\n\r\n static ease_in_circ(x)\r\n {\r\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\r\n }\r\n\r\n static ease_out_circ(x)\r\n {\r\n return Math.sqrt(1 - Math.pow(x - 1, 2));\r\n }\r\n\r\n static ease_in_out_circ(x)\r\n {\r\n return x < 0.5\r\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\r\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\r\n }\r\n\r\n static ease_in_back(x)\r\n {\r\n return 2.7015 * x * x * x - 1.7015 * x * x;\r\n }\r\n\r\n static ease_out_back(x)\r\n {\r\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\r\n }\r\n\r\n static ease_in_out_back(x)\r\n {\r\n return x < 0.5\r\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\r\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\r\n }\r\n\r\n static ease_in_elastic(x)\r\n {\r\n const c4 = (2 * Math.PI) / 3;\r\n\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\r\n }\r\n\r\n static ease_out_elastic(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\r\n }\r\n\r\n static ease_in_out_elastic(x)\r\n {\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : x < 0.5\r\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\r\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\r\n }\r\n\r\n static ease_in_bounce(x)\r\n {\r\n return 1 - this.ease_out_bounce(1 - x);\r\n }\r\n\r\n static ease_out_bounce(x)\r\n {\r\n const n1 = 7.5625;\r\n const d1 = 2.75;\r\n\r\n if (x < 1 / d1)\r\n {\r\n return n1 * x * x;\r\n }\r\n else if (x < 2 / d1)\r\n {\r\n return n1 * (x -= 1.5 / d1) * x + 0.75;\r\n }\r\n else if (x < 2.5 / d1)\r\n {\r\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\r\n }\r\n else\r\n {\r\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\r\n }\r\n }\r\n\r\n static ease_in_out_bounce(x)\r\n {\r\n return x < 0.5\r\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\r\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\r\n }\r\n\r\n static heartbeat(t)\r\n {\r\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {'linear'|'triangular'|'ease_in_sine'|'ease_out_sine'|'ease_in_out_sine'|'ease_in_cubic'|'ease_out_cubic'|'ease_in_out_cubic'|'ease_in_quad'|'ease_out_quad'|'ease_in_out_quad'|'ease_in_quart'|'ease_out_quart'|'ease_in_out_quart'|'ease_in_quint'|'ease_out_quint'|'ease_in_out_quint'|'ease_in_expo'|'ease_out_expo'|'ease_in_out_expo'|'ease_in_circ'|'ease_out_circ'|'ease_in_out_circ'|'ease_in_back'|'ease_out_back'|'ease_in_out_back'|'ease_in_elastic'|'ease_out_elastic'|'ease_in_out_elastic'|'ease_in_bounce'|'ease_out_bounce'|'ease_in_out_bounce'|'heartbeat'} EasingFunctionType\r\n */\r\n\r\nexport { EasingFunctions };\r\n","// @ts-check\r\nimport { Vector3 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { EasingFunctions } from '../utilities/EasingFunctions';\r\n\r\nclass ActionInterpolator\r\n{\r\n /**\r\n * @param {import('../utilities/EasingFunctions').EasingFunctionType | function} easing_function\r\n */\r\n constructor(easing_function = 'linear')\r\n {\r\n this.easing_function = undefined;\r\n\r\n if (typeof easing_function === 'string')\r\n {\r\n this.easing_function = EasingFunctions[easing_function];\r\n }\r\n else\r\n {\r\n this.easing_function = easing_function;\r\n }\r\n\r\n this.attribute_name = '';\r\n /** @type {number | Vector3} */\r\n this.from = 0;\r\n /** @type {number | Vector3} */\r\n this.to = 1;\r\n }\r\n\r\n /**\r\n * @param {any} context\r\n * @param {number} t\r\n */\r\n update(context, t) // eslint-disable-line no-unused-vars\r\n {\r\n }\r\n}\r\n\r\nexport { ActionInterpolator };\r\n","// @ts-check\r\nimport { OMath } from '../utilities/OMath';\r\nimport { ActionEvent } from './ActionEvent'; // eslint-disable-line no-unused-vars\r\nimport { ActionInterpolator } from './ActionInterpolator'; // eslint-disable-line no-unused-vars\r\n\r\nclass ActionSequencer\r\n{\r\n /**\r\n * @param {any} [context]\r\n */\r\n constructor(context = {})\r\n {\r\n this.previous_elapsed_time = -0.00001;\r\n this.elapsed_time = -0.00001;\r\n this.playback_speed = this.__get_playback_speed();\r\n this.playing = true;\r\n\r\n /** @type {{action:ActionEvent, trigger_time:number }[]} */\r\n this.action_events = [];\r\n this.context = context;\r\n\r\n this.initial_context = JSON.parse(JSON.stringify(context));\r\n\r\n this.tmp_t = 0;\r\n\r\n /** @type {{[key:string]:any[]}} */\r\n this.channels = {};\r\n\r\n const channel_names = Object.keys(context);\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n this.channels[channel_names[i]] = [];\r\n }\r\n\r\n this.duration = 0;\r\n }\r\n\r\n play()\r\n {\r\n this.playing = true;\r\n }\r\n\r\n stop()\r\n {\r\n this.playing = false;\r\n }\r\n\r\n reset()\r\n {\r\n this.elapsed_time = -0.00001;\r\n }\r\n\r\n skip()\r\n {\r\n const duration = this.get_duration();\r\n this.__play_clips(this.elapsed_time, duration + 0.0001);\r\n this.elapsed_time = duration;\r\n }\r\n\r\n /**\r\n * @param {number} delta_time\r\n */\r\n update(delta_time)\r\n {\r\n if (this.playing)\r\n {\r\n this.previous_elapsed_time = this.elapsed_time;\r\n this.elapsed_time += delta_time * this.playback_speed;\r\n this.__play_clips(this.previous_elapsed_time, this.elapsed_time);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} time\r\n */\r\n set_progress(time)\r\n {\r\n this.previous_elapsed_time = this.elapsed_time;\r\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n /**\r\n * @param {number} t\r\n */\r\n set_normalized_progress(t)\r\n {\r\n this.previous_elapsed_time = this.elapsed_time;\r\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n get_progress()\r\n {\r\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\r\n }\r\n\r\n is_finished()\r\n {\r\n return this.elapsed_time > this.get_duration();\r\n }\r\n\r\n /**\r\n * @param {number} trigger_time\r\n * @param {ActionEvent} action\r\n */\r\n add_action_event(trigger_time, action)\r\n {\r\n this.action_events.push({\r\n trigger_time: trigger_time,\r\n action: action\r\n });\r\n\r\n this.duration = Math.max(this.duration, trigger_time);\r\n }\r\n\r\n /**\r\n * @param {number} from\r\n * @param {number} to\r\n * @param {ActionInterpolator} interpolator\r\n * @param {boolean} [use_dynamic_from_value]\r\n */\r\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\r\n {\r\n if (use_dynamic_from_value)\r\n {\r\n const keyframes = this.channels[interpolator.attribute_name];\r\n\r\n if (keyframes === undefined)\r\n {\r\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\r\n }\r\n\r\n if (keyframes.length === 0)\r\n {\r\n interpolator.from = this.initial_context[interpolator.attribute_name];\r\n }\r\n else\r\n {\r\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\r\n }\r\n }\r\n\r\n const keyframe = {\r\n from: from,\r\n to: to,\r\n interpolator: interpolator\r\n };\r\n\r\n this.duration = Math.max(this.duration, to);\r\n this.channels[interpolator.attribute_name].push(keyframe);\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_current_target_value(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n\r\n if (this.elapsed_time < keyframe.from)\r\n {\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n return keyframe.interpolator.evaluate(1);\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_current_starting_value(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_current_progress(name)\r\n {\r\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\r\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\r\n\r\n return keyframe.interpolator.easing_function(t);\r\n }\r\n\r\n get_duration()\r\n {\r\n return this.duration;\r\n }\r\n\r\n /**\r\n * @param {number} from\r\n * @param {number} to\r\n */\r\n __play_clips(from, to) // eslint-disable-line no-unused-vars\r\n {\r\n if (this.elapsed_time > this.previous_elapsed_time)\r\n {\r\n this.__play_events(this.previous_elapsed_time, this.elapsed_time);\r\n }\r\n const channel_names = Object.keys(this.initial_context);\r\n\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n const name = channel_names[i];\r\n const keyframe = this.__get_current_keyframe(name, from);\r\n\r\n this.context[name] = this.evaluate_keyframe(keyframe, from);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} from\r\n * @param {number} to\r\n */\r\n __play_events(from, to)\r\n {\r\n for (let i = 0; i < this.action_events.length; i++)\r\n {\r\n const trigger_time = this.action_events[i].trigger_time;\r\n if (OMath.between(trigger_time, from, to))\r\n {\r\n console.log('Play event: ' + this.action_events[i].action.constructor.name + ' at ' + this.action_events[i].trigger_time);\r\n this.action_events[i].action.trigger();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {any} keyframe\r\n * @param {number} time\r\n */\r\n evaluate_keyframe(keyframe, time)\r\n {\r\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\r\n\r\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\r\n }\r\n\r\n /**\r\n * @param {string} channel_name\r\n */\r\n get_keyframes(channel_name)\r\n {\r\n return this.channels[channel_name];\r\n }\r\n\r\n /**\r\n * @param {string} channel_name\r\n */\r\n is_channel_redefined(channel_name)\r\n {\r\n for (let i = 0; i < this.channels[channel_name].length; i++)\r\n {\r\n const keyframe = this.channels[channel_name][i];\r\n\r\n if (keyframe.interpolator.initial)\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n * @param {number} from_range_start_value\r\n * @param {number} from_range_end_value\r\n * @returns {number}\r\n */\r\n __linear_map_01(value,\r\n from_range_start_value,\r\n from_range_end_value)\r\n {\r\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\r\n }\r\n\r\n /**\r\n * @param {string} channel_name\r\n * @param {number} time\r\n */\r\n __get_current_keyframe(channel_name, time)\r\n {\r\n let current = undefined;\r\n\r\n const keyframes = this.channels[channel_name];\r\n\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n const keyframe = keyframes[i];\r\n\r\n if (time >= keyframe.from && time <= keyframe.to)\r\n {\r\n current = keyframe;\r\n return current;\r\n }\r\n }\r\n\r\n let min = Infinity;\r\n\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n const keyframe = keyframes[i];\r\n const distance = Math.abs(keyframe.to - time);\r\n\r\n if (distance < min)\r\n {\r\n current = keyframe;\r\n min = distance;\r\n }\r\n }\r\n\r\n return current;\r\n }\r\n\r\n __get_playback_speed()\r\n {\r\n const url_params = new URLSearchParams(window.location.search);\r\n\r\n const transitions_velocity = url_params.get('transitions_velocity');\r\n\r\n if (transitions_velocity)\r\n {\r\n return Number(transitions_velocity);\r\n }\r\n else\r\n {\r\n return 1;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n * @param {number} value\r\n */\r\n set_initial_value_on_channel(name, value)\r\n {\r\n const keyframes = this.get_keyframes(name);\r\n keyframes[0].interpolator.from = value;\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n * @param {number} value\r\n */\r\n set_final_value_on_channel(name, value)\r\n {\r\n const keyframes = this.get_keyframes(name);\r\n keyframes[keyframes.length - 1].interpolator.to = value;\r\n }\r\n}\r\n\r\nexport { ActionSequencer };\r\n","// @ts-check\r\nimport { ActionInterpolator } from './ActionInterpolator';\r\nimport { OMath } from '../utilities/OMath';\r\n\r\nclass NumberInterpolator extends ActionInterpolator\r\n{\r\n /**\r\n * @param {string} attribute_name\r\n * @param {number} [from]\r\n * @param {number} [to]\r\n * @param {boolean} [initial]\r\n * @param {import('../utilities/EasingFunctions').EasingFunctionType | function} [easing_function]\r\n */\r\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n this.initial = initial;\r\n }\r\n\r\n /**\r\n * @param {any} context\r\n * @param {number} t\r\n */\r\n update(context, t)\r\n {\r\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n\r\n /**\r\n * @param {number} t\r\n */\r\n evaluate(t)\r\n {\r\n return OMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n}\r\n\r\nexport { NumberInterpolator };\r\n","class DrawIOAnimationSheet\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n parse(xml_document)\r\n {\r\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\r\n\r\n const animation_nodes = doc.querySelectorAll('mxGeometry');\r\n\r\n const animation_tracks = [];\r\n const triggers = [];\r\n\r\n for (let i = 0; i < animation_nodes.length; i++)\r\n {\r\n const node = animation_nodes[i];\r\n const parent_node = node.parentElement;\r\n const data = parent_node.getAttribute('value');\r\n\r\n const x_pos = this.get_node_x_position(node);\r\n\r\n const from = x_pos / 100;\r\n const duration = parseFloat(node.getAttribute('width')) / 100;\r\n\r\n // is trigger\r\n if (parent_node.getAttribute('style').includes('rhombus;'))\r\n {\r\n const split_data = data.split('.');\r\n const trigger_name = split_data[0];\r\n const trigger_method = split_data[1];\r\n\r\n triggers.push({\r\n name: trigger_name,\r\n method: trigger_method,\r\n at_time: from + duration * 0.5\r\n });\r\n }\r\n\r\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\r\n !parent_node.getAttribute('style').includes('text;');\r\n\r\n if (valid_element && data !== '' && !data.includes(' '))\r\n {\r\n const split_data = data.split('=');\r\n\r\n const attribute_name = split_data[0];\r\n\r\n const value_data = split_data[1].split('--');\r\n const to_value = parseFloat(value_data[0]);\r\n const easing_function = value_data[1];\r\n\r\n if (split_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n if (value_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n animation_tracks.push({\r\n attribute_name: attribute_name,\r\n from_time: from,\r\n to_time: from + duration,\r\n to_value: to_value,\r\n easing_function: easing_function\r\n });\r\n }\r\n }\r\n\r\n animation_tracks.sort((a, b) =>\r\n {\r\n return a.from_time - b.from_time;\r\n });\r\n return {\r\n animation_tracks: animation_tracks,\r\n triggers: triggers\r\n };\r\n }\r\n\r\n get_node_x_position(node)\r\n {\r\n const x_pos = node.getAttribute('x');\r\n return x_pos === null ? 0 : parseFloat(x_pos);\r\n }\r\n}\r\n\r\nexport { DrawIOAnimationSheet };\r\n","import { ActionSequencer } from '../../action_sequencer/ActionSequencer';\r\nimport { NumberInterpolator } from '../../action_sequencer/NumberInterpolator';\r\nimport { ActionEvent } from '../../action_sequencer/ActionEvent';\r\nimport { DrawIOAnimationSheet } from './DrawIOAnimationSheet';\r\n\r\nclass ActionSequencerBuilder\r\n{\r\n constructor(default_state_data)\r\n {\r\n this.default_state_data = default_state_data;\r\n }\r\n\r\n from_animation_sheet(animation_data, current_context, initial_context)\r\n {\r\n initial_context = initial_context || this.default_state_data;\r\n const tracks = animation_data.animation_tracks;\r\n const triggers = animation_data.triggers;\r\n\r\n const initial_tracks = this.state_to_tracks(this.default_state_data, this.get_longest_time(animation_data.animation_tracks));\r\n\r\n for (let i = 0; i < initial_tracks.length; i++)\r\n {\r\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\r\n {\r\n tracks.push(initial_tracks[i]);\r\n }\r\n }\r\n\r\n const sequencer = new ActionSequencer(current_context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const t = tracks[i];\r\n const interpolator = new NumberInterpolator(\r\n t.attribute_name,\r\n current_context[t.attribute_name],\r\n t.to_value,\r\n t.initial,\r\n t.easing_function\r\n );\r\n\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n for (let i = 0; i < triggers.length; i++)\r\n {\r\n const t = triggers[i];\r\n const action_event = new ActionEvent(t.name, t.method, t.args);\r\n sequencer.add_action_event(t.at_time, action_event);\r\n }\r\n\r\n return sequencer;\r\n }\r\n\r\n state_to_tracks(state, longest_time)\r\n {\r\n const tracks = [];\r\n\r\n const keys = Object.keys(state);\r\n\r\n for (let i = 0; i < keys.length; i++)\r\n {\r\n tracks.push({\r\n attribute_name: keys[i],\r\n from_time: 0,\r\n to_time: longest_time < 1 ? longest_time : 1,\r\n to_value: state[keys[i]],\r\n initial: true,\r\n easing_function: 'ease_in_out_cubic'\r\n });\r\n }\r\n\r\n return tracks;\r\n }\r\n\r\n from_draw_io(xml, context)\r\n {\r\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\r\n const tracks = transition_data.animation_tracks;\r\n const triggers = transition_data.triggers;\r\n const sequencer = new ActionSequencer(context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const t = tracks[i];\r\n const interpolator = new NumberInterpolator(\r\n t.attribute_name,\r\n context[t.attribute_name],\r\n t.to_value,\r\n t.initial,\r\n t.easing_function\r\n );\r\n\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n for (let i = 0; i < triggers.length; i++)\r\n {\r\n const t = triggers[i];\r\n const action_event = new ActionEvent(t.name, t.method);\r\n sequencer.add_action_event(t.at_time, action_event);\r\n }\r\n\r\n return sequencer;\r\n }\r\n\r\n get_longest_time(tracks)\r\n {\r\n let longest_time = -1;\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n const track = tracks[i];\r\n\r\n const track_time = track.to_time;\r\n\r\n longest_time = track_time > longest_time ? track_time : longest_time;\r\n }\r\n\r\n return longest_time;\r\n }\r\n}\r\n\r\nexport { ActionSequencerBuilder };\r\n","import { ActionSequencerBuilder } from './ActionSequencerBuilder';\r\n\r\nclass TransitionTable\r\n{\r\n constructor()\r\n {\r\n this.transitions = [];\r\n this.default_state_data = {};\r\n }\r\n\r\n get(from_state_name, to_state_name, current_context)\r\n {\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].to === to_state_name && this.transitions[i].from === undefined)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\r\n return undefined;\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n for (let i = 0; i < transitions.length; i++)\r\n {\r\n this.transitions.push(transitions[i]);\r\n }\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transitions = transitions;\r\n }\r\n\r\n set_default_state_data(default_state_data)\r\n {\r\n this.default_state_data = default_state_data;\r\n }\r\n}\r\n\r\nexport { TransitionTable };\r\n","class ViewState\r\n{\r\n constructor(name)\r\n {\r\n this.name = name;\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n before_enter()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n }\r\n\r\n before_exit()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n }\r\n\r\n before_update()\r\n {\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n fixed_update()\r\n {\r\n }\r\n\r\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n}\r\n\r\nexport { ViewState };\r\n","import { Time } from '../../Time';\r\nimport { ViewState } from '../ViewState';\r\n\r\nclass ViewStateTransitionHandler\r\n{\r\n constructor(transition_table)\r\n {\r\n this.last_state = new ViewState();\r\n this.current_state = new ViewState();\r\n\r\n this.default_state_data = {};\r\n this.current_state_data = {};\r\n\r\n this.transition_table = transition_table;\r\n\r\n this.transitioning = false;\r\n }\r\n\r\n go_to_state(state, skip = false)\r\n {\r\n if (this.transitioning)\r\n {\r\n this.__exit_last_state();\r\n }\r\n\r\n this.last_state = this.current_state;\r\n this.current_state = state;\r\n\r\n this.last_state.before_exit();\r\n\r\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\r\n this.action_sequencer.play();\r\n\r\n this.current_state.before_enter(this.action_sequencer);\r\n\r\n this.transitioning = true;\r\n\r\n if (skip)\r\n {\r\n this.action_sequencer.skip();\r\n this.update();\r\n }\r\n }\r\n\r\n update()\r\n {\r\n if (this.transitioning)\r\n {\r\n this.__update_transitions();\r\n\r\n if (this.action_sequencer.is_finished())\r\n {\r\n this.transitioning = false;\r\n\r\n this.__update_transitions();\r\n\r\n this.__exit_last_state();\r\n\r\n this.current_state.on_enter(this.action_sequencer);\r\n }\r\n }\r\n else\r\n {\r\n this.current_state.update();\r\n }\r\n }\r\n\r\n before_update()\r\n {\r\n this.current_state.before_update(this.action_sequencer);\r\n }\r\n\r\n fixed_update()\r\n {\r\n this.current_state.fixed_update();\r\n }\r\n\r\n set_state(state)\r\n {\r\n this.current_state = state;\r\n }\r\n\r\n set_default_state_data(default_state_data)\r\n {\r\n Object.assign(this.default_state_data, default_state_data);\r\n Object.assign(this.current_state_data, default_state_data);\r\n }\r\n\r\n __update_transitions()\r\n {\r\n this.action_sequencer.update(Time.delta_time);\r\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n }\r\n\r\n __exit_last_state()\r\n {\r\n // if (this.last_state.name !== this.current_state.name)\r\n // {\r\n // this.last_state.hide();\r\n // }\r\n\r\n this.last_state.on_exit();\r\n }\r\n}\r\n\r\nexport { ViewStateTransitionHandler };\r\n","import { TransitionTable } from './transition/TransitionTable';\r\nimport { ViewStateTransitionHandler } from './transition/ViewStateTransitionHandler';\r\n\r\nclass TransitionManager\r\n{\r\n constructor()\r\n {\r\n this.transition_table = new TransitionTable();\r\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\r\n }\r\n\r\n get action_sequencer()\r\n {\r\n return this.transition_handler.action_sequencer;\r\n }\r\n\r\n get current_state_data()\r\n {\r\n return this.transition_handler.current_state_data;\r\n }\r\n\r\n get_current_state()\r\n {\r\n return this.transition_handler.current_state;\r\n }\r\n\r\n go_to_state(state, skip = false)\r\n {\r\n this.transition_handler.go_to_state(state, skip);\r\n }\r\n\r\n before_update()\r\n {\r\n this.transition_handler.before_update();\r\n }\r\n\r\n update()\r\n {\r\n this.transition_handler.update();\r\n }\r\n\r\n fixed_update()\r\n {\r\n this.transition_handler.fixed_update();\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n this.transition_table.add_transitions(transitions);\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transition_table.set_transitions(transitions);\r\n }\r\n\r\n set_state(state)\r\n {\r\n this.transition_handler.set_state(state);\r\n }\r\n\r\n set_default_state_data(default_state_data)\r\n {\r\n this.transition_table.set_default_state_data(default_state_data);\r\n this.transition_handler.set_default_state_data(default_state_data);\r\n }\r\n\r\n set_transitions_velocity(transitions_velocity)\r\n {\r\n this.transition_table.set_transitions_velocity(transitions_velocity);\r\n }\r\n}\r\n\r\nconst transition_manager = new TransitionManager();\r\nexport { transition_manager as TransitionManager };\r\n","import { TransitionManager } from './TransitionManager';\r\n\r\nclass ViewComponentManager\r\n{\r\n constructor()\r\n {\r\n this.components = [];\r\n this.enabled_components = new Set();\r\n }\r\n\r\n update()\r\n {\r\n this.__set_components_opacities();\r\n\r\n for (const component of this.enabled_components)\r\n {\r\n component.update(TransitionManager.current_state_data);\r\n }\r\n }\r\n\r\n register_component(component)\r\n {\r\n this.components.push(component);\r\n }\r\n\r\n enable_component(component)\r\n {\r\n // const component_to_enable = this.get_component_by_name(component_name);\r\n\r\n this.enabled_components.add(component);\r\n }\r\n\r\n disable_component(component)\r\n {\r\n // const component_to_disable = this.get_component_by_name(component_name);\r\n\r\n this.enabled_components.delete(component);\r\n }\r\n\r\n get_component_by_name(component_name)\r\n {\r\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\r\n this.get(component_name);\r\n }\r\n\r\n get(component_name)\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n if (this.components[i].name === component_name)\r\n {\r\n return this.components[i];\r\n }\r\n }\r\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\r\n return undefined;\r\n }\r\n\r\n __set_components_opacities()\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n this.components[i].set_opacity(TransitionManager.current_state_data);\r\n }\r\n }\r\n}\r\n\r\nconst view_component_manager = new ViewComponentManager();\r\nexport { view_component_manager as ViewComponentManager };\r\n","import { TransitionManager } from './TransitionManager';\r\n\r\nclass ViewManager\r\n{\r\n constructor()\r\n {\r\n this.views = [];\r\n\r\n this.browser_title_suffix = '';\r\n }\r\n\r\n update()\r\n {\r\n this.__set_views_opacities();\r\n }\r\n\r\n go_to_view(view_name, change_url = true, skip = false)\r\n {\r\n const v = this.get(view_name);\r\n\r\n if (change_url)\r\n {\r\n this.__change_browser_url(v.url);\r\n this.__change_browser_title(v.url);\r\n }\r\n\r\n TransitionManager.go_to_state(v, skip);\r\n }\r\n\r\n go_to_scene(scene_name, change_url = false, skip = false)\r\n {\r\n const next_view = this.get(scene_name);\r\n const transition_view = this.get('transition');\r\n\r\n transition_view.set_next_view(next_view);\r\n this.go_to_view(transition_view.name, change_url, skip);\r\n }\r\n\r\n register_view(view)\r\n {\r\n this.views.push(view);\r\n }\r\n\r\n has_view(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n set_view(view_name)\r\n {\r\n const view = this.get(view_name);\r\n\r\n TransitionManager.set_state(view);\r\n }\r\n\r\n set_browser_title_suffix(title_suffix)\r\n {\r\n this.browser_title_suffix = title_suffix;\r\n }\r\n\r\n get_current_view()\r\n {\r\n return TransitionManager.get_current_state();\r\n }\r\n\r\n get_view_by_name(view_name)\r\n {\r\n console.warn('DEPRECATED. Use ViewManager.get instead');\r\n this.get(view_name);\r\n }\r\n\r\n get(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('[ViewManager.get] no view found for: ', view_name);\r\n return undefined;\r\n }\r\n\r\n get_by_url(url)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].url === url)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('[ViewManager.get_by_url] no view found for: ', url);\r\n return undefined;\r\n }\r\n\r\n __change_browser_url(url)\r\n {\r\n window.history.pushState('', '', url);\r\n }\r\n\r\n __change_browser_title(name)\r\n {\r\n const title = this.__capitalize(name);\r\n\r\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\r\n }\r\n\r\n __set_views_opacities()\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n this.views[i].set_opacity(TransitionManager.current_state_data);\r\n }\r\n }\r\n\r\n __capitalize(string)\r\n {\r\n let aux_string = string.toUpperCase().replace('/', '');\r\n aux_string = this.__snake_to_whitespace(aux_string);\r\n\r\n return aux_string;\r\n }\r\n\r\n __snake_to_whitespace(string)\r\n {\r\n return string.replace(\r\n /([-_][A-Z])/g,\r\n (group) => group\r\n .replace('-', ' ')\r\n .replace('_', ' ')\r\n );\r\n }\r\n}\r\n\r\nconst view_manager = new ViewManager();\r\nexport { view_manager as ViewManager };\r\n","// @ts-check\r\nimport { BaseApplication } from './BaseApplication';\r\nimport { Debug } from './Debug';\r\nimport { Time } from './Time';\r\nimport { TransitionManager } from './view_components/TransitionManager';\r\nimport { ViewComponentManager } from './view_components/ViewComponentManager';\r\nimport { ViewManager } from './view_components/ViewManager';\r\nimport { Graphics, KeyboardInput } from './index'; // eslint-disable-line no-unused-vars\r\n\r\nclass RenderLoop\r\n{\r\n /**\r\n * @param {BaseApplication} target_application\r\n * @param {Graphics} graphics\r\n */\r\n constructor(target_application, graphics, input)\r\n {\r\n target_application = target_application || new BaseApplication();\r\n\r\n this.target_application = target_application;\r\n this.graphics = graphics;\r\n this.input = input;\r\n\r\n this.is_running = false;\r\n this.frames_passed = 0;\r\n\r\n this.time_accumulator = 0;\r\n }\r\n\r\n /**\r\n * @param {number} elapsed_time\r\n */\r\n update(elapsed_time)\r\n {\r\n if (!this.is_running)\r\n {\r\n return;\r\n }\r\n Time.__update(elapsed_time);\r\n\r\n // ###### START CYCLE ######\r\n if (this.frames_passed === 1)\r\n {\r\n this.target_application.on_post_start();\r\n }\r\n\r\n this.input.update();\r\n\r\n this.time_accumulator += Time.delta_time;\r\n\r\n this.target_application.before_update();\r\n TransitionManager.before_update();\r\n\r\n while (this.time_accumulator > Time.fixed_delta_time)\r\n {\r\n this.target_application.fixed_update();\r\n TransitionManager.fixed_update();\r\n\r\n this.time_accumulator -= Time.fixed_delta_time;\r\n }\r\n Time.__set_frame_interpolation(this.time_accumulator / Time.fixed_delta_time);\r\n\r\n this.target_application.update();\r\n\r\n TransitionManager.update();\r\n ViewManager.update();\r\n ViewComponentManager.update();\r\n\r\n this.target_application.on_pre_render();\r\n\r\n this.graphics.update(); // render scene\r\n this.target_application.on_post_render();\r\n\r\n Debug.render(this.graphics); // render debug layer\r\n\r\n // ###### END CYCLE #######\r\n this.target_application.on_frame_end();\r\n this.frames_passed++;\r\n\r\n this.input.clear();\r\n Debug.clear();\r\n }\r\n\r\n start()\r\n {\r\n if (this.is_running) return; // sanity check\r\n\r\n if (this.frames_passed === 0)\r\n {\r\n this.target_application.on_enter();\r\n }\r\n\r\n this.is_running = true;\r\n\r\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\r\n }\r\n\r\n stop()\r\n {\r\n if (this.is_running === false) return; // sanity check\r\n\r\n this.is_running = false;\r\n this.target_application.on_exit();\r\n\r\n this.graphics._renderer.setAnimationLoop(null);\r\n }\r\n\r\n /**\r\n * @param {BaseApplication} new_state\r\n */\r\n set_state(new_state)\r\n {\r\n this.target_application.on_exit(this);\r\n this.target_application = new_state;\r\n this.target_application.on_enter(this);\r\n }\r\n\r\n dispose()\r\n {\r\n this.stop();\r\n this.frames_passed = 0;\r\n }\r\n}\r\n\r\nexport { RenderLoop };\r\n","import { RenderLoop } from './RenderLoop'; // eslint-disable-line no-unused-vars\r\n\r\n// @ts-check\r\nclass BaseApplication\r\n{\r\n on_post_start()\r\n {}\r\n\r\n /**\r\n * @param {RenderLoop} [loop]\r\n */\r\n on_enter(loop) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n /**\r\n * @param {RenderLoop} [loop]\r\n */\r\n on_exit(loop) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n before_update()\r\n {}\r\n\r\n update()\r\n {}\r\n\r\n fixed_update()\r\n {}\r\n\r\n on_post_render()\r\n {}\r\n\r\n on_pre_render()\r\n {}\r\n\r\n on_frame_end()\r\n {}\r\n}\r\n\r\nexport { BaseApplication };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/add/add.frag';\r\n\r\nclass AddMaterial extends BlitMaterial\r\n{\r\n constructor(use_half_float = false)\r\n {\r\n super(frag);\r\n this.defines.USE_LINEAR_COLOR_SPACE = use_half_float;\r\n this.uniforms._SecondTex = { value: undefined };\r\n }\r\n\r\n set_add_texture(tex)\r\n {\r\n this.uniforms._SecondTex.value = tex;\r\n }\r\n}\r\n\r\nexport { AddMaterial };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\r\n\r\nimport { Color } from 'three';\r\nclass UnrealBloomComposeMaterial extends BlitMaterial\r\n{\r\n constructor(nMips, use_linear_color_space = false)\r\n {\r\n super(frag, undefined, {\r\n NUM_MIPS: nMips\r\n });\r\n this.uniforms._MainTex = { value: undefined };\r\n this.uniforms._BlurredTex = { value: undefined };\r\n this.uniforms._BloomStrength = { value: 1 };\r\n\r\n this.uniforms.blurTexture1 = { value: null };\r\n this.uniforms.blurTexture2 = { value: null };\r\n this.uniforms.blurTexture3 = { value: null };\r\n this.uniforms.blurTexture4 = { value: null };\r\n this.uniforms.blurTexture5 = { value: null };\r\n\r\n this.uniforms.bloomStrength = { value: 1.0 };\r\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\r\n this.uniforms.bloomRadius = { value: 1.0 };\r\n\r\n this.defines.USE_LINEAR_COLOR_SPACE = use_linear_color_space;\r\n const bloomTintColors = [\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF')\r\n ];\r\n\r\n this.uniforms.bloomTintColors = { value: bloomTintColors };\r\n }\r\n\r\n set_RT_0(rt)\r\n {\r\n this.uniforms.blurTexture1.value = rt;\r\n }\r\n\r\n set_RT_1(rt)\r\n {\r\n this.uniforms.blurTexture2.value = rt;\r\n }\r\n\r\n set_RT_2(rt)\r\n {\r\n this.uniforms.blurTexture3.value = rt;\r\n }\r\n\r\n set_RT_3(rt)\r\n {\r\n this.uniforms.blurTexture4.value = rt;\r\n }\r\n\r\n set_RT_4(rt)\r\n {\r\n this.uniforms.blurTexture5.value = rt;\r\n }\r\n\r\n set_bloom_strength(value)\r\n {\r\n this.uniforms.bloomStrength.value = value;\r\n }\r\n\r\n set_bloom_radius(value)\r\n {\r\n this.uniforms.bloomRadius.value = value;\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[0].set(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[1].set(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[2].set(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[3].set(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[4].set(col_string);\r\n }\r\n}\r\n\r\nexport { UnrealBloomComposeMaterial };\r\n","\r\nexport class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = this.is_number(loaded) ? loaded : 1;\r\n total = this.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n if (response.ok)\r\n {\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n else\r\n {\r\n this.__set_error(`${response.status}: ${response.statusText}`);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n\r\n is_int(n)\r\n {\r\n return Number(n) === n && n % 1 === 0;\r\n }\r\n\r\n is_float(n)\r\n {\r\n return Number(n) === n && n % 1 !== 0;\r\n }\r\n\r\n is_number(n)\r\n {\r\n return this.is_int(n) || this.is_float(n);\r\n }\r\n}\r\n","// @ts-check\r\nimport { AudioListener, Audio as TAudio } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { PositionalAudio as TPositionalAudio } from 'three';\r\n\r\nclass AudioClip\r\n{\r\n /**\r\n * @param {AudioBuffer} buffer\r\n * @param {boolean} [loop]\r\n * @param {number} [volume]\r\n * @param {boolean} [positional]\r\n */\r\n constructor(buffer, loop = true, volume = 1, positional = false)\r\n {\r\n this.buffer = buffer;\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n\r\n this.audio = undefined;\r\n }\r\n\r\n /**\r\n * @param {AudioListener} audio_listener\r\n */\r\n init(audio_listener)\r\n {\r\n if (this.positional)\r\n {\r\n this.audio = new TPositionalAudio(audio_listener);\r\n }\r\n else\r\n {\r\n this.audio = new TAudio(audio_listener);\r\n }\r\n\r\n this.audio.setBuffer(this.buffer);\r\n this.audio.setLoop(this.loop);\r\n\r\n // This prevents undesired volume at the beginning of playing\r\n this.audio.gain.gain.value = 0;\r\n\r\n this.audio.setVolume(this.loop ? 0 : this.volume);\r\n }\r\n\r\n play()\r\n {\r\n this.audio.play();\r\n }\r\n\r\n pause()\r\n {\r\n this.audio.pause();\r\n }\r\n\r\n stop()\r\n {\r\n this.audio.stop();\r\n }\r\n\r\n get is_playing()\r\n {\r\n return this.audio.isPlaying;\r\n }\r\n}\r\n\r\nexport { AudioClip };\r\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","// @ts-check\r\nimport { Object3D, Texture, } from 'three'; // eslint-disable-line\r\n\r\n/**\r\n * @typedef {Object3D | Texture} Resource\r\n */\r\n\r\nclass ResourceContainer\r\n{\r\n init()\r\n {\r\n /** @type {Record<string, Resource>} */\r\n this.resources = {};\r\n\r\n /** @type {Record<string, any>} */\r\n this.resources_by_url = {};\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n * @param {string} url\r\n * @param {Resource} resource\r\n */\r\n set_resource(name, url, resource)\r\n {\r\n const urls = Object.keys(this.resources_by_url);\r\n\r\n if (urls.includes(url))\r\n {\r\n this.resources[name] = this.resources_by_url[url];\r\n }\r\n else\r\n {\r\n this.resources[name] = resource;\r\n this.resources_by_url[url] = resource;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get_resource(name)\r\n {\r\n return this.resources[name];\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n get(name)\r\n {\r\n return this.resources[name];\r\n }\r\n}\r\n\r\nconst resource_container = new ResourceContainer();\r\nexport { resource_container as ResourceContainer };\r\n","// @ts-check\r\nimport { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass AsyncAbstractLoader\r\n{\r\n /**\r\n * @param {string} name\r\n * @param {any[]} assets\r\n * @param {Worker} worker\r\n */\r\n constructor(name, assets, worker)\r\n {\r\n this.resource_container = ResourceContainer;\r\n this.assets = assets;\r\n this.name = name;\r\n\r\n this.worker = worker;\r\n\r\n this.bound_on_message = this.on_message.bind(this);\r\n\r\n this.__setup_worker();\r\n\r\n this.assets_loaders = this.__setup_loaders();\r\n }\r\n\r\n load()\r\n {\r\n this.worker.postMessage({ type: 'load', loader_name: this.name });\r\n }\r\n\r\n is_loaded()\r\n {\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n const asset_loader = this.assets_loaders[i];\r\n\r\n if (!asset_loader.has_finished)\r\n {\r\n return false;\r\n }\r\n else\r\n {\r\n if (asset_loader.has_error)\r\n {\r\n // Restore original url so the error message make more sense\r\n asset_loader.url = asset_loader.original_url;\r\n\r\n asset_loader.print_error();\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.__get_loaded_bytes() / this.__get_total_bytes();\r\n }\r\n\r\n __get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n loaded_bytes += this.assets_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n __get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n total_bytes += this.assets_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n\r\n get_assets_names()\r\n {\r\n const names = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset = this.assets[i];\r\n\r\n names.push(asset.name);\r\n }\r\n\r\n return names;\r\n }\r\n\r\n static create_worker()\r\n {\r\n const worker = new Worker(\r\n new URL('./assets_loader/AsyncAssetsLoaderWorker.js', import.meta.url),\r\n { name: 'OHZI - AssetLoader', type: 'module' });\r\n\r\n return worker;\r\n }\r\n\r\n __setup_worker()\r\n {\r\n this.worker.addEventListener('message', this.bound_on_message);\r\n\r\n this.worker.postMessage({ type: 'assets', loader_name: this.name, data: this.assets });\r\n }\r\n\r\n /**\r\n * @param {MessageEvent} e\r\n */\r\n on_message(e)\r\n {\r\n const message = e.data;\r\n\r\n switch (message.type)\r\n {\r\n case `asset_loaded_${this.name}`:\r\n this.__on_assets_loaded(message.data);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * @param {any} resources\r\n */\r\n __on_assets_loaded(resources)\r\n {\r\n this.worker.removeEventListener('message', this.bound_on_message);\r\n\r\n for (let i = 0; i < this.assets_loaders.length; i++)\r\n {\r\n const asset_loader = this.assets_loaders[i];\r\n\r\n // Save original url to show in a possible error\r\n asset_loader.original_url = asset_loader.url;\r\n\r\n asset_loader.url = resources[asset_loader.resource_id];\r\n\r\n asset_loader.on_preloaded_finished(this.resource_container);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {any[]}\r\n */\r\n __setup_loaders()\r\n {\r\n console.warn('Not implemented');\r\n return [];\r\n }\r\n}\r\n\r\nexport { AsyncAbstractLoader };\r\n","import { AudioLoader } from '../resource_loader/AudioLoader';\r\nimport { AsyncAbstractLoader } from './AsyncAbstractLoader';\r\n\r\nclass AsyncAudiosLoader extends AsyncAbstractLoader\r\n{\r\n constructor(scene_name, assets, worker)\r\n {\r\n super(scene_name, assets, worker);\r\n }\r\n\r\n // Called from parent\r\n __setup_loaders()\r\n {\r\n const loaders = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset_data = this.assets[i];\r\n\r\n loaders.push(new AudioLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.loop,\r\n asset_data.volume,\r\n asset_data.size,\r\n asset_data.positional\r\n ));\r\n }\r\n\r\n return loaders;\r\n }\r\n}\r\n\r\nexport { AsyncAudiosLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","// @ts-check\r\nimport { GLTFDRACOLoader } from '../resource_loader/GLTFDRACOLoader';\r\nimport { GLTFLoader } from '../resource_loader/GLTFLoader';\r\nimport { ResourceContainer } from '../ResourceContainer';\r\nimport { AsyncAbstractLoader } from './AsyncAbstractLoader';\r\n\r\nclass AsyncObjectsLoader extends AsyncAbstractLoader\r\n{\r\n /**\r\n * @param {string} scene_name\r\n * @param {any[]} assets\r\n * @param {Worker} worker\r\n */\r\n constructor(scene_name, assets, worker)\r\n {\r\n super(scene_name, assets, worker);\r\n }\r\n\r\n // Called from parent\r\n __setup_loaders()\r\n {\r\n const loaders = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset_data = this.assets[i];\r\n\r\n if (asset_data.draco)\r\n {\r\n const draco_loader = ResourceContainer.get('draco_loader');\r\n\r\n loaders.push(new GLTFDRACOLoader(asset_data.name, asset_data.url, draco_loader, asset_data.size));\r\n }\r\n else\r\n {\r\n loaders.push(new GLTFLoader(asset_data.name, asset_data.url, asset_data.size));\r\n }\r\n }\r\n\r\n return loaders;\r\n }\r\n}\r\n\r\nexport { AsyncObjectsLoader };\r\n","// @ts-check\r\nclass Browser\r\n{\r\n async init()\r\n {\r\n this.browser_name = '';\r\n this.agent = window.navigator.userAgent.toLowerCase();\r\n\r\n this.has_web_xr_support = 'xr' in navigator;\r\n this.is_vr = this.has_web_xr_support && await navigator.xr.isSessionSupported('immersive-vr');\r\n\r\n switch (true)\r\n {\r\n case this.agent.indexOf('edge') > -1:\r\n this.browser_name = 'edge_ie';\r\n break;\r\n case this.agent.indexOf('edg') > -1:\r\n this.browser_name = 'edge_chromium';\r\n break;\r\n // @ts-ignore\r\n case this.agent.indexOf('opr') > -1 && !!window.opr:\r\n this.browser_name = 'opera';\r\n break;\r\n // @ts-ignore\r\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\r\n this.browser_name = 'chrome';\r\n break;\r\n case this.agent.indexOf('trident') > -1:\r\n this.browser_name = 'iexplorer';\r\n break;\r\n case this.agent.indexOf('firefox') > -1:\r\n this.browser_name = 'firefox';\r\n break;\r\n case this.agent.indexOf('safari') > -1:\r\n this.browser_name = 'safari';\r\n break;\r\n default:\r\n this.browser_name = 'other';\r\n break;\r\n }\r\n\r\n this.version = this.get_version();\r\n }\r\n\r\n get name()\r\n {\r\n return this.browser_name;\r\n }\r\n\r\n get is_safari()\r\n {\r\n return this.browser_name === 'safari';\r\n }\r\n\r\n get is_chrome()\r\n {\r\n return this.browser_name === 'chrome';\r\n }\r\n\r\n get is_firefox()\r\n {\r\n return this.browser_name === 'firefox';\r\n }\r\n\r\n get is_edge()\r\n {\r\n return this.browser_name === 'edge_ie';\r\n }\r\n\r\n get is_edge_chromium()\r\n {\r\n return this.browser_name === 'edge_chromium';\r\n }\r\n\r\n get has_webm()\r\n {\r\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\r\n }\r\n\r\n get has_hvec()\r\n {\r\n return this.is_safari;\r\n }\r\n\r\n get preferred_video_extension()\r\n {\r\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\r\n }\r\n\r\n get_version()\r\n {\r\n const ua = navigator.userAgent;\r\n let tem = [];\r\n let version = '0';\r\n\r\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\r\n\r\n if (/trident/i.test(M[1]))\r\n {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n version = 'IE ' + (tem[1] || '');\r\n }\r\n if (M[1] === 'Chrome')\r\n {\r\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\r\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\r\n }\r\n\r\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\r\n if ((tem = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null) M.splice(1, 1, tem[1]);\r\n\r\n version = M.join(' ');\r\n\r\n return Number(version.split(' ')[1]);\r\n }\r\n}\r\n\r\nconst browser = new Browser();\r\nexport { browser as Browser };\r\n","import { Browser } from '../Browser';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { NoColorSpace, SRGBColorSpace, Texture } from 'three';\r\n\r\nexport class AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size, flipY = true, premultiplyAlpha = false, colorSpaceConversion = true)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.original_url = '';\r\n\r\n this.colorSpaceConversion = colorSpaceConversion;\r\n this.premultiplyAlpha = premultiplyAlpha;\r\n this.flipY = flipY;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari) // && Browser.version < 15\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('The source image could not be decoded.', this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, {\r\n colorSpaceConversion: this.colorSpaceConversion ? 'default' : 'none',\r\n imageOrientation: this.flipY ? 'flipY' : 'from-image',\r\n premultiplyAlpha: this.premultiplyAlpha ? 'premultiply' : 'none'\r\n });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch((e) =>\r\n {\r\n console.error(e, this.original_url);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\n// import { sRGBEncoding } from 'three';\r\n\r\nclass BasisLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.loader = loader;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (basis) =>\r\n {\r\n // basis.encoding = sRGBEncoding;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, basis);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { BasisLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\n\r\nclass HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THDRCubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n // this.loader.setDataType(UnsignedByteType);\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\r\n\r\nclass RGBETextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new RGBELoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { RGBETextureLoader };\r\n","import { AsyncTextureLoader } from '../resource_loader/AsyncTextureLoader';\r\nimport { BasisLoader } from '../resource_loader/BasisLoader';\r\nimport { CubemapLoader } from '../resource_loader/CubemapLoader';\r\nimport { HDRCubeTextureLoader } from '../resource_loader/HDRCubeTextureLoader';\r\nimport { RGBETextureLoader } from '../resource_loader/RGBETextureLoader';\r\nimport { ResourceContainer } from '../ResourceContainer';\r\nimport { AsyncAbstractLoader } from './AsyncAbstractLoader';\r\n\r\nclass AsyncTexturesLoader extends AsyncAbstractLoader\r\n{\r\n constructor(scene_name, assets, worker)\r\n {\r\n super(scene_name, assets, worker);\r\n }\r\n\r\n // Called from parent\r\n __setup_loaders()\r\n {\r\n const loaders = [];\r\n\r\n for (let i = 0; i < this.assets.length; i++)\r\n {\r\n const asset_data = this.assets[i];\r\n\r\n switch (asset_data.kind)\r\n {\r\n case 'regular':\r\n loaders.push(new AsyncTextureLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.size,\r\n asset_data.flipY,\r\n asset_data.premultiplyAlpha,\r\n asset_data.colorSpaceConversion\r\n ));\r\n\r\n break;\r\n case 'basis':\r\n loaders.push(new BasisLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n ResourceContainer.get('basis_loader'),\r\n asset_data.size\r\n ));\r\n\r\n break;\r\n case 'hdr':\r\n loaders.push(new RGBETextureLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.size\r\n ));\r\n\r\n break;\r\n case 'cubemap':\r\n loaders.push(new CubemapLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.extension,\r\n asset_data.size\r\n ));\r\n break;\r\n case 'cubemap_hdr':\r\n loaders.push(new HDRCubeTextureLoader(\r\n asset_data.name,\r\n asset_data.url,\r\n asset_data.extension,\r\n asset_data.size\r\n ));\r\n\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return loaders;\r\n }\r\n}\r\n\r\nexport { AsyncTexturesLoader };\r\n","class CompilatorManager\r\n{\r\n constructor(compilators)\r\n {\r\n this.compilators = compilators;\r\n this.first_update = true;\r\n\r\n this.index = 0;\r\n }\r\n\r\n update()\r\n {\r\n if (!this.is_finished())\r\n {\r\n if (this.compilators[this.index].finished)\r\n {\r\n this.index++;\r\n this.first_update = true;\r\n }\r\n else\r\n {\r\n if (this.first_update)\r\n {\r\n this.compilators[this.index].start();\r\n this.first_update = false;\r\n }\r\n else\r\n {\r\n this.compilators[this.index].update();\r\n }\r\n }\r\n }\r\n }\r\n\r\n is_finished()\r\n {\r\n return this.index === this.compilators.length;\r\n }\r\n}\r\n\r\nexport { CompilatorManager };\r\n","import { ResourceContainer } from 'ohzi-core';\r\n\r\nimport { AsyncAudiosLoader } from '../../loaders/AsyncAudiosLoader';\r\nimport { AsyncObjectsLoader } from '../../loaders/AsyncObjectsLoader';\r\nimport { AsyncTexturesLoader } from '../../loaders/AsyncTexturesLoader';\r\nimport { CompilatorManager } from './CompilatorManager';\r\n\r\nexport class LoadingState\r\n{\r\n constructor(scene, { SceneCompilator, TexturesCompilator, AudiosCompilator })\r\n {\r\n this.scene = scene;\r\n\r\n this.SceneCompilator = SceneCompilator;\r\n this.TexturesCompilator = TexturesCompilator;\r\n this.AudiosCompilator = AudiosCompilator;\r\n\r\n this.loaders = [];\r\n this.compilators = [];\r\n\r\n this.callback_called = false;\r\n }\r\n\r\n set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders = [], custom_compilators = [], custom_data = [])\r\n {\r\n this.scene_objects = scene_objects;\r\n this.scene_textures = scene_textures;\r\n this.scene_sounds = scene_sounds;\r\n\r\n this.custom_loaders = custom_loaders;\r\n this.custom_compilators = custom_compilators;\r\n this.custom_data = custom_data;\r\n }\r\n\r\n get loading_progress()\r\n {\r\n let progress = 0;\r\n\r\n for (let i = 0; i < this.loaders.length; i++)\r\n {\r\n const loader = this.loaders[i];\r\n progress += loader.get_progress();\r\n }\r\n return progress / this.loaders.length;\r\n }\r\n\r\n load()\r\n {\r\n this.setup_loader();\r\n\r\n // TODO: improve this.\r\n // We call load method to one of the 3 loaders because they share the same worker.\r\n this.loaders[0].load();\r\n }\r\n\r\n on_enter()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n }\r\n\r\n update()\r\n {\r\n\r\n }\r\n\r\n setup_loader()\r\n {\r\n const compilators = [];\r\n\r\n const assets_worker = ResourceContainer.get('assets_worker');\r\n assets_worker.postMessage({ type: 'reset', loader_name: this.scene.name });\r\n\r\n const object_loader = new AsyncObjectsLoader(this.scene.name, this.scene_objects, assets_worker);\r\n this.loaders.push(object_loader);\r\n compilators.push(new this.SceneCompilator(this.scene));\r\n\r\n const textures_loader = new AsyncTexturesLoader(this.scene.name, this.scene_textures, assets_worker);\r\n this.loaders.push(textures_loader);\r\n compilators.push(new this.TexturesCompilator(textures_loader.get_assets_names()));\r\n\r\n const audios_loader = new AsyncAudiosLoader(this.scene.name, this.scene_sounds, assets_worker);\r\n this.loaders.push(audios_loader);\r\n compilators.push(new this.AudiosCompilator(audios_loader.get_assets_names()));\r\n\r\n for (let i = 0; i < this.custom_loaders.length; i++)\r\n {\r\n const loader = new this.custom_loaders[i](this.scene.name, this.custom_data[i], assets_worker);\r\n this.loaders.push(loader);\r\n compilators.push(new this.custom_compilators[i](loader.get_assets_names()));\r\n }\r\n\r\n this.compilator_manager = new CompilatorManager(compilators);\r\n }\r\n\r\n is_loaded()\r\n {\r\n let loaded = true;\r\n\r\n for (let i = 0; i < this.loaders.length; i++)\r\n {\r\n const loader = this.loaders[i];\r\n\r\n loaded = loaded && loader.is_loaded();\r\n }\r\n\r\n return loaded;\r\n }\r\n\r\n is_compiled()\r\n {\r\n this.compilator_manager.update();\r\n return this.compilator_manager.is_finished();\r\n }\r\n}\r\n","import { LoadingState } from './LoadingState';\r\n\r\nexport class HighQualityLoadingState extends LoadingState\r\n{\r\n on_enter()\r\n {\r\n super.on_enter();\r\n // this.setup_loader();\r\n }\r\n\r\n on_exit()\r\n {\r\n super.on_exit();\r\n }\r\n\r\n update()\r\n {\r\n super.update();\r\n\r\n if (this.is_loaded())\r\n {\r\n // if (this.is_compiled())\r\n // {\r\n this.scene.on_high_quality_assets_ready();\r\n // }\r\n }\r\n }\r\n}\r\n","import { LoadingState } from './LoadingState';\r\n\r\nexport class RegularLoadingState extends LoadingState\r\n{\r\n constructor(scene, compilators)\r\n {\r\n super(scene, compilators);\r\n\r\n this.on_assets_ready_called = false;\r\n }\r\n\r\n on_enter()\r\n {\r\n super.on_enter();\r\n // this.setup_loader();\r\n }\r\n\r\n on_exit()\r\n {\r\n super.on_exit();\r\n }\r\n\r\n update()\r\n {\r\n super.update();\r\n\r\n if (this.is_loaded())\r\n {\r\n if (!this.on_assets_ready_called)\r\n {\r\n this.scene.on_assets_ready();\r\n this.on_assets_ready_called = true;\r\n }\r\n\r\n if (this.is_compiled())\r\n {\r\n this.scene.on_assets_compiled();\r\n }\r\n }\r\n }\r\n}\r\n","import { Scene } from 'three';\r\n// import { AvatarSystem } from '../../components/avatar/AvatarSystem';\r\n\r\nimport { HighQualityLoadingState } from './loading_states/HighQualityLoadingState';\r\nimport { LoadingState } from './loading_states/LoadingState';\r\nimport { RegularLoadingState } from './loading_states/RegularLoadingState';\r\n\r\nclass AbstractScene extends Scene\r\n{\r\n constructor({ name, compilators })\r\n {\r\n super();\r\n\r\n this.name = name;\r\n\r\n this.initialized = false;\r\n this.is_loaded = false;\r\n this.is_high_loaded = false;\r\n\r\n this.loading_states = {\r\n regular: new RegularLoadingState(this, compilators),\r\n high: new HighQualityLoadingState(this, compilators)\r\n };\r\n\r\n this.current_loading_state = new LoadingState(this, compilators);\r\n // this.set_loading_state(this.loading_states.regular);\r\n }\r\n\r\n get loading_progress()\r\n {\r\n return this.current_loading_state.loading_progress;\r\n }\r\n\r\n init()\r\n {\r\n this.initialized = true;\r\n }\r\n\r\n load()\r\n {\r\n if (!this.initialized)\r\n {\r\n this.init();\r\n }\r\n\r\n this.set_loading_state(this.loading_states.regular);\r\n this.current_loading_state.load();\r\n }\r\n\r\n get_objects()\r\n {\r\n const objects = [];\r\n\r\n this.traverse(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n objects.push(child);\r\n\r\n // if (child.name === 'pitch_floor')\r\n // {\r\n // objects.push(child);\r\n // }\r\n // else\r\n // {\r\n // child.visible = false;\r\n // }\r\n }\r\n });\r\n\r\n return objects;\r\n }\r\n\r\n dispose_cpu()\r\n {\r\n this.traverse(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.attributes.position.array = new Float32Array(3);\r\n if (child.geometry.attributes.normal)\r\n {\r\n child.geometry.attributes.normal.array = new Float32Array(3);\r\n }\r\n if (child.geometry.attributes.uv)\r\n {\r\n child.geometry.attributes.uv.array = new Float32Array(2);\r\n }\r\n if (child.material.map)\r\n {\r\n for (let i = 0; i < child.material.map.mipmaps.length; i++)\r\n {\r\n child.material.map.mipmaps[i] = new Uint8Array(4);\r\n }\r\n }\r\n }\r\n });\r\n\r\n // AvatarSystem.component_container.component_instancer.data_texture.data = new Float32Array(4);\r\n\r\n this.initialized = false;\r\n }\r\n\r\n dispose()\r\n {\r\n this.traverse(child =>\r\n {\r\n if (child.material)\r\n {\r\n if (child.material.map)\r\n {\r\n child.material.map.dispose();\r\n }\r\n\r\n child.material.dispose();\r\n child.geometry.dispose();\r\n }\r\n });\r\n // AvatarSystem.component_container.component_instancer.data_texture.data = new Float32Array(4);\r\n\r\n this.initialized = false;\r\n }\r\n\r\n set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data)\r\n {\r\n this.loading_states.regular.set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data);\r\n }\r\n\r\n set_high_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data)\r\n {\r\n this.loading_states.high.set_assets(scene_objects, scene_textures, scene_sounds, custom_loaders, custom_compilators, custom_data);\r\n }\r\n\r\n set_loading_state(state)\r\n {\r\n this.current_loading_state.on_exit();\r\n this.current_loading_state = state;\r\n this.current_loading_state.on_enter();\r\n }\r\n\r\n // Called from transition\r\n update_loading_state()\r\n {\r\n if (!this.is_high_loaded)\r\n {\r\n this.current_loading_state.update();\r\n }\r\n }\r\n\r\n update()\r\n {\r\n this.update_loading_state();\r\n }\r\n\r\n on_assets_ready()\r\n {\r\n\r\n }\r\n\r\n on_assets_compiled()\r\n {\r\n this.is_loaded = true;\r\n\r\n // Load high quality assets\r\n this.set_loading_state(this.loading_states.high);\r\n this.current_loading_state.load();\r\n }\r\n\r\n on_high_quality_assets_ready()\r\n {\r\n this.is_high_loaded = true;\r\n }\r\n}\r\n\r\nexport { AbstractScene };\r\n","import { TransitionManager } from './TransitionManager';\r\nimport { ViewManager } from './ViewManager';\r\nimport { ViewState } from './ViewState';\r\n\r\nclass ApplicationView extends ViewState\r\n{\r\n constructor({ name, url, container, transition_data })\r\n {\r\n super(name);\r\n\r\n this.container = container;\r\n this.url = url;\r\n\r\n this.current_opacity = 0;\r\n\r\n transition_data = transition_data || {\r\n animation_tracks: [],\r\n triggers: []\r\n };\r\n\r\n const transitions = [\r\n {\r\n to: name,\r\n data: transition_data\r\n }\r\n ];\r\n\r\n ViewManager.register_view(this);\r\n TransitionManager.add_transitions(transitions);\r\n }\r\n\r\n before_enter()\r\n {\r\n this.container.classList.add('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n before_exit()\r\n {\r\n this.container.classList.add('before_exit');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n on_exit()\r\n {\r\n this.container.classList.add('hidden');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n }\r\n\r\n set_opacity(current_state_data)\r\n {\r\n const opacity = current_state_data[`${this.name}_opacity`];\r\n\r\n if (this.current_opacity > opacity || this.current_opacity < opacity)\r\n {\r\n this.current_opacity = opacity;\r\n\r\n this.container.style.opacity = this.current_opacity;\r\n }\r\n }\r\n}\r\n\r\nexport { ApplicationView };\r\n","// @ts-check\r\nimport { CanvasTexture } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { UVMapping } from 'three';\r\nimport { ClampToEdgeWrapping } from 'three';\r\nimport { NearestFilter } from 'three';\r\n\r\nclass CanvasDrawer\r\n{\r\n /**\r\n * @param {boolean} [uses_dynamic_font]\r\n */\r\n constructor(uses_dynamic_font)\r\n {\r\n this.uses_dynamic_font = !!uses_dynamic_font;\r\n this.__textHeight = null;\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.ctx = this.canvas.getContext('2d');\r\n }\r\n\r\n getFontHeight(fontStyle = 'Arial')\r\n {\r\n if (this.__textHeight == null || this.uses_dynamic_font)\r\n {\r\n const body = document.getElementsByTagName('body')[0];\r\n const dummy = document.createElement('div');\r\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\r\n dummy.appendChild(dummyText);\r\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\r\n body.appendChild(dummy);\r\n this.__textHeight = dummy.offsetHeight;\r\n body.removeChild(dummy);\r\n }\r\n return this.__textHeight;\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\n get_text_size(text, font = '24px Arial')\r\n {\r\n const size = new Vector2();\r\n this.ctx.font = font;\r\n size.x = Math.ceil(this.ctx.measureText(text).width);\r\n size.y = Math.ceil(this.getFontHeight(font));\r\n return size;\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {any} [ctxOptions]\r\n */\r\n draw_canvas(text, ctxOptions = {})\r\n {\r\n ctxOptions.font = ctxOptions.font || '24px Arial';\r\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\r\n\r\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\r\n return this.canvas;\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {any} [ctxOptions]\r\n */\r\n draw_on_texture(text, ctxOptions)\r\n {\r\n const canvas = this.draw_canvas(text, ctxOptions);\r\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\r\n ClampToEdgeWrapping,\r\n ClampToEdgeWrapping,\r\n NearestFilter,\r\n NearestFilter);\r\n canvas_texture.generateMipmaps = false;\r\n canvas_texture.needsUpdate = true;\r\n\r\n return canvas_texture;\r\n }\r\n\r\n /**\r\n * @param {string[] | string} text\r\n * @param {any} [ctxOptions]\r\n * @param {HTMLCanvasElement} [canvas]\r\n * @param {CanvasRenderingContext2D} [ctx]\r\n */\r\n __draw(text, ctxOptions, canvas, ctx) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n /**\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {number} x\r\n * @param {number} y\r\n * @param {number} width\r\n * @param {number} height\r\n * @param {number | {tl:number, tr:number, br:number, bl:number}} radius\r\n * @param {boolean} fill\r\n * @param {boolean} stroke\r\n */\r\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\r\n {\r\n if (typeof stroke === 'undefined')\r\n {\r\n stroke = true;\r\n }\r\n if (typeof radius === 'undefined')\r\n {\r\n radius = 5;\r\n }\r\n if (typeof radius === 'number')\r\n {\r\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\r\n }\r\n else\r\n {\r\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\r\n for (const side in defaultRadius)\r\n {\r\n const _side = /** @type {keyof typeof defaultRadius} */ (side);\r\n radius[_side] = radius[_side] || defaultRadius[_side];\r\n }\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius.tl, y);\r\n ctx.lineTo(x + width - radius.tr, y);\r\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\r\n ctx.lineTo(x + width, y + height - radius.br);\r\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\r\n ctx.lineTo(x + radius.bl, y + height);\r\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\r\n ctx.lineTo(x, y + radius.tl);\r\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\r\n ctx.closePath();\r\n if (fill)\r\n {\r\n ctx.fill();\r\n }\r\n if (stroke)\r\n {\r\n ctx.stroke();\r\n }\r\n }\r\n}\r\n\r\nexport { CanvasDrawer };\r\n","// @ts-check\r\nimport { CanvasDrawer } from './CanvasDrawer';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass SimpleTextDrawer extends CanvasDrawer\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.text_margin = new Vector2(2, 0);\r\n }\r\n\r\n /**\r\n * @param {string} text\r\n * @param {any} [ctxOptions]\r\n * @param {HTMLCanvasElement} [canvas]\r\n * @param {CanvasRenderingContext2D} [ctx]\r\n */\r\n __draw(text, ctxOptions, canvas, ctx)\r\n {\r\n ctx.font = ctxOptions.font;\r\n\r\n const text_size = this.get_text_size(text, ctxOptions.font);\r\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\r\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\r\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\r\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // turn this on for debugging\r\n ctx.globalAlpha = 0.0;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.font = ctxOptions.font;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.textBaseline = 'middle';\r\n\r\n ctx.textAlign = ctxOptions.textAlign || 'center';\r\n if (ctx.textAlign === 'center')\r\n {\r\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\r\n }\r\n else\r\n {\r\n ctx.fillText(text, 0, canvas.height / 2);\r\n }\r\n }\r\n}\r\n\r\nexport { SimpleTextDrawer };\r\n","class Idle\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n get is_animating()\r\n {\r\n return false;\r\n }\r\n\r\n on_enter(view)\r\n {\r\n\r\n }\r\n\r\n update(view)\r\n {\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport { Idle };\r\n","import { Time } from '../../Time';\r\nimport { Idle } from './Idle';\r\n\r\nimport { OMath } from '../../utilities/OMath';\r\nclass Animating\r\n{\r\n constructor()\r\n {\r\n this.t = 0;\r\n this.easing_function_t = 0;\r\n }\r\n\r\n get is_animating()\r\n {\r\n return true;\r\n }\r\n\r\n on_enter(animator)\r\n {\r\n }\r\n\r\n update(animator)\r\n {\r\n this.t += Time.delta_time / animator.duration;\r\n\r\n this.easing_function_t = animator.easing_function(this.t);\r\n this.easing_function_t = OMath.clamp(this.easing_function_t, 0, 1);\r\n\r\n animator.set_property_value(OMath.lerp(animator.from, animator.to, this.easing_function_t));\r\n\r\n if (this.easing_function_t >= 0.9999)\r\n {\r\n animator.set_property_value(animator.to);\r\n\r\n animator.set_current_state(new Idle());\r\n animator.finished_callback(animator);\r\n }\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport { Animating };\r\n","import { Animating } from './css_animator_states/Animating';\r\nimport { Idle } from './css_animator_states/Idle';\r\nimport { EasingFunctions } from '../utilities/EasingFunctions';\r\n\r\nclass CSSAnimator\r\n{\r\n constructor({\r\n element,\r\n css_property,\r\n from = 0,\r\n to = 1,\r\n duration = 1,\r\n value_prefix = '',\r\n value_suffix = '',\r\n easing_function = EasingFunctions.ease_in_out_cubic,\r\n finished_callback = () =>\r\n {}\r\n })\r\n {\r\n this.element = element;\r\n this.css_property = css_property;\r\n this.from = from;\r\n this.to = to;\r\n this.value_prefix = value_prefix;\r\n this.value_suffix = value_suffix;\r\n this.duration = duration;\r\n this.easing_function = easing_function;\r\n this.finished_callback = finished_callback;\r\n\r\n this.current_state = new Idle();\r\n }\r\n\r\n animate()\r\n {\r\n this.set_current_state(new Animating());\r\n }\r\n\r\n stop()\r\n {\r\n this.set_current_state(new Idle());\r\n }\r\n\r\n set_property_value(value)\r\n {\r\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\r\n }\r\n\r\n update()\r\n {\r\n this.current_state.update(this);\r\n }\r\n\r\n get is_animating()\r\n {\r\n return this.current_state.is_animating;\r\n }\r\n\r\n set_current_state(state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = state;\r\n this.current_state.on_enter(this);\r\n }\r\n}\r\n\r\nexport { CSSAnimator };\r\n","// @ts-check\r\nclass OS\r\n{\r\n init()\r\n {\r\n this.operating_systems = {\r\n ANDROID: 'android',\r\n IOS: 'ios',\r\n LINUX: 'linux',\r\n MAC: 'mac',\r\n WINDOWS: 'windows'\r\n };\r\n\r\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\r\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\r\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\r\n\r\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\r\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\r\n this.is_mac = this.get_os() === this.operating_systems.MAC;\r\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\r\n }\r\n\r\n get_os()\r\n {\r\n const userAgent = window.navigator.userAgent;\r\n const platform = window.navigator.platform;\r\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\r\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\r\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\r\n let os = null;\r\n\r\n if (macosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.MAC;\r\n }\r\n else if (iosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.IOS;\r\n }\r\n else if (windowsPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.WINDOWS;\r\n }\r\n else if (/Android/.test(userAgent))\r\n {\r\n os = this.operating_systems.ANDROID;\r\n }\r\n else if (!os && /Linux/.test(platform))\r\n {\r\n os = this.operating_systems.LINUX;\r\n }\r\n\r\n return os;\r\n }\r\n}\r\n\r\nconst os = new OS();\r\nexport { os as OS };\r\n","// @ts-check\r\nimport { BufferGeometry, Vector3 } from 'three'; // eslint-disable-line\r\n\r\nclass ReflectionPlaneContext\r\n{\r\n init()\r\n {\r\n this.target_geometry = undefined;\r\n this.target_position = new Vector3();\r\n }\r\n\r\n /**\r\n * @param {BufferGeometry} geometry\r\n */\r\n set_target_geometry(geometry)\r\n {\r\n this.target_geometry = geometry;\r\n }\r\n}\r\n\r\nconst reflection_plane_context = new ReflectionPlaneContext();\r\nexport { reflection_plane_context as ReflectionPlaneContext };\r\n","import { DataTexture, FloatType, Mesh, RGBAFormat, ShaderMaterial, Vector2 } from 'three';\r\n\r\nclass GeometryBatch\r\n{\r\n constructor(geometry, batch_width)\r\n {\r\n this.geometry = geometry;\r\n\r\n this.material = undefined;\r\n this.uniforms = {};\r\n this.batch_width = batch_width;\r\n\r\n this.data_textures = [];\r\n\r\n this.object_names = undefined;\r\n\r\n this.zero_offset = new Vector2();\r\n this.write_offset = new Vector2();\r\n\r\n this.uniform_dirty_count = 0;\r\n\r\n this.tmp_uploaded_data_count = 0;\r\n }\r\n\r\n init(object_names, vert_shader, frag_shader)\r\n {\r\n this.material = new ShaderMaterial({\r\n uniforms: this.uniforms,\r\n vertexShader: vert_shader,\r\n fragmentShader: frag_shader\r\n });\r\n this.object_names = object_names;\r\n }\r\n\r\n add_global_uniform(name, data)\r\n {\r\n this.uniforms[name] = { value: data };\r\n this.material.needsUpdate = true;\r\n }\r\n\r\n set_global_uniform(name, data)\r\n {\r\n this.uniforms[name].value = data;\r\n }\r\n\r\n add_object_uniform_v3(uniform_name, default_value_v3)\r\n {\r\n const src_tex = this.__create_rgb_texture(this.batch_width);\r\n const dst_tex = this.__create_rgb_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgb_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v3)\r\n {\r\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\r\n }\r\n }\r\n\r\n add_object_uniform_v4(uniform_name, default_value_v4)\r\n {\r\n const src_tex = this.__create_rgba_texture(this.batch_width);\r\n const dst_tex = this.__create_rgba_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgba_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n add_object_uniform_v4_float(uniform_name, default_value_v4)\r\n {\r\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\r\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\r\n const one_pixel_tex = this.__create_rgba_float_texture(1);\r\n\r\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\r\n {\r\n const obj_index = this.__get_object_index(object_name);\r\n const data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\r\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\r\n\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n const obj_index = this.__get_object_index(object_name);\r\n const data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\r\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n upload_texture_data(renderer, upload_budget)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\r\n {\r\n if (this.data_textures[i].dirty_count === 1)\r\n {\r\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n if (this.data_textures[i].dirty_count > 1)\r\n {\r\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n\r\n this.data_textures[i].dirty_count = 0;\r\n\r\n upload_budget--;\r\n }\r\n }\r\n }\r\n\r\n get_uniform_dirty_count()\r\n {\r\n this.uniform_dirty_count = 0;\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].dirty_count > 0)\r\n {\r\n this.uniform_dirty_count++;\r\n }\r\n }\r\n return this.uniform_dirty_count;\r\n }\r\n\r\n __full_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"full texture update of\"+ texture_data.name);\r\n texture_data.dst.needsUpdate = true;\r\n renderer.copyTextureToTexture(\r\n this.zero_offset,\r\n texture_data.src,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n __partial_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"partial texture update\"+ texture_data.name);\r\n const index = texture_data.last_accessed_index;\r\n if (index === -1)\r\n {\r\n return;\r\n }\r\n\r\n this.write_offset.y = Math.floor(index / this.batch_width);\r\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\r\n renderer.copyTextureToTexture(\r\n this.write_offset,\r\n texture_data.one_pixel,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n get_mesh()\r\n {\r\n return new Mesh(this.geometry, this.material);\r\n }\r\n\r\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 3 + 0] = vector3.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 3 + 1] = vector3.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 3 + 2] = vector3.z;\r\n }\r\n }\r\n\r\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 4 + 0] = vector4.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 4 + 1] = vector4.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 4 + 2] = vector4.z;\r\n }\r\n if (use_a)\r\n {\r\n data_texture.image.data[index * 4 + 3] = vector4.w;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgb(data_texture, v3)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgba(data_texture, v4)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __create_rgb_texture(width)\r\n {\r\n const data = new Uint8Array(3 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat);\r\n }\r\n\r\n __create_rgba_texture(width)\r\n {\r\n const data = new Uint8Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat);\r\n }\r\n\r\n __create_rgba_float_texture(width)\r\n {\r\n const data = new Float32Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\r\n }\r\n\r\n __get_data_texture(uniform_name)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].name === uniform_name)\r\n {\r\n return this.data_textures[i];\r\n }\r\n }\r\n console.error('Data texture ' + uniform_name + ' does not exist');\r\n return undefined;\r\n }\r\n\r\n __get_object_index(name)\r\n {\r\n for (let i = 0; i < this.object_names.length; i++)\r\n {\r\n if (this.object_names[i] === name)\r\n {\r\n return i;\r\n }\r\n }\r\n console.error('the name ' + name + ' is not contained in this batch');\r\n return undefined;\r\n }\r\n\r\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\r\n {\r\n dst_texture.needsUpdate = true;\r\n\r\n this.data_textures.push({\r\n name: uniform_name,\r\n src: src_texture,\r\n dst: dst_texture,\r\n one_pixel: one_pixel_text,\r\n last_accessed_index: -1,\r\n dirty_count: 0\r\n });\r\n\r\n this.uniforms[uniform_name] = { value: dst_texture };\r\n return this.data_textures[this.data_textures.length - 1];\r\n }\r\n\r\n dispose()\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n this.data_textures[i].src.dispose();\r\n this.data_textures[i].dst.dispose();\r\n this.data_textures[i].one_pixel.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport { GeometryBatch };\r\n","import { GeometryBatch } from './GeometryBatch';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { BufferAttribute } from 'three';\r\nimport { OMath } from '../utilities/OMath';\r\n\r\nclass GeometryBatcher\r\n{\r\n init()\r\n {\r\n this.batches = [];\r\n }\r\n\r\n batch(buffer_geometries)\r\n {\r\n const attr_accessor_uvs = [];\r\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n this.__init_uv_array(attr_accessor_uvs, texture_width);\r\n\r\n let uv_index = 0;\r\n\r\n for (let i = 0; i < buffer_geometries.length; i++)\r\n {\r\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\r\n const y = Math.floor(i / texture_width);\r\n const x = i - texture_width * y;\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\r\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\r\n uv_index += 2;\r\n }\r\n }\r\n\r\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\r\n const buffer_geometry = BufferGeometryUtils.mergeGeometries(buffer_geometries);\r\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\r\n\r\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\r\n return this.batches[this.batches.length - 1];\r\n }\r\n\r\n upload_texture_data(renderer)\r\n {\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n this.batches[i].upload_texture_data(renderer, 1);\r\n }\r\n }\r\n\r\n __init_uv_array(uvs, texture_width)\r\n {\r\n for (let i = 0; i < texture_width * texture_width * 2; i++)\r\n {\r\n uvs.push(0);\r\n }\r\n }\r\n}\r\n\r\nconst geometry_batcher = new GeometryBatcher();\r\nexport { geometry_batcher as GeometryBatcher };\r\n","import vert from '../shaders/ui_element/ui_element.vert';\r\nimport frag from '../shaders/ui_element/ui_element.frag';\r\n\r\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nimport { OScreen } from '../OScreen';\r\n\r\nclass UIElementMaterial extends BaseShaderMaterial\r\n{\r\n constructor(intensity = 1)\r\n {\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\r\n _TextureSize: { value: new Vector2() },\r\n _PixelOffset: { value: new Vector2(0, 0) },\r\n _NDC: { value: new Vector3() },\r\n _PivotPoint: { value: new Vector2() },\r\n _DepthOffset: { value: 0 }\r\n });\r\n this.transparent = true;\r\n this.depthWrite = false;\r\n this.depthTest = false;\r\n }\r\n}\r\n\r\nexport { UIElementMaterial };\r\n","import { Vector2 } from 'three';\r\n\r\nclass ScreenSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n return this.tmp_vec.set(position.x, position.y);\r\n }\r\n}\r\n\r\nexport { ScreenSpacePosition };\r\n","import { CameraManager } from '../../CameraManager';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nclass WorldSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec3 = new Vector3();\r\n this.tmp_vec2 = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n this.tmp_vec3.copy(position);\r\n this.tmp_vec3.project(CameraManager.current);\r\n\r\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\r\n }\r\n}\r\n\r\nexport { WorldSpacePosition };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\n\r\nclass UIElementState\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position) // eslint-disable-line no-unused-vars\r\n {\r\n\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element) // eslint-disable-line no-unused-vars\r\n {}\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_exit(ui_element) // eslint-disable-line no-unused-vars\r\n {}\r\n}\r\n\r\nexport { UIElementState };\r\n","import { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnIdle extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_enter_state);\r\n }\r\n }\r\n}\r\n\r\nexport { OnIdle };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnMouseEnter extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n *\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_enter();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_hover_state);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n}\r\n\r\nexport { OnMouseEnter };\r\n","// @ts-check\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnMouseExit extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_exit();\r\n ui_element.set_state(ui_element._on_idle_state);\r\n }\r\n}\r\n\r\nexport { OnMouseExit };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { UIElement } from '../../components/UIElement'; // eslint-disable-line no-unused-vars\r\nimport { UIElementState } from './UIElementState';\r\n\r\nclass OnMouseHover extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n on_enter(ui_element)\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n * @param {Vector2} normalized_mouse_position\r\n */\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n\r\n /**\r\n * @param {UIElement} ui_element\r\n */\r\n __trigger_on_hover(ui_element)\r\n {\r\n ui_element.on_mouse_hover();\r\n }\r\n}\r\n\r\nexport { OnMouseHover };\r\n","// @ts-check\r\nimport { OScreen } from '../OScreen';\r\n\r\nimport { UIElementMaterial } from '../materials/UIElementMaterial';\r\n\r\nimport { ScreenSpacePosition } from '../ui/ui_element_position/ScreenSpacePosition';\r\nimport { WorldSpacePosition } from '../ui/ui_element_position/WorldSpacePosition';\r\n\r\nimport { OnIdle } from '../ui/ui_element_state/OnIdle';\r\nimport { OnMouseEnter } from '../ui/ui_element_state/OnMouseEnter';\r\nimport { OnMouseExit } from '../ui/ui_element_state/OnMouseExit';\r\nimport { OnMouseHover } from '../ui/ui_element_state/OnMouseHover';\r\n\r\nimport { Mesh, Texture } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { NearestFilter } from 'three';\r\nimport { Box2 } from 'three';\r\nimport { UIElementState } from '../ui/ui_element_state/UIElementState'; // eslint-disable-line no-unused-vars\r\n\r\nclass UIElement extends Mesh\r\n{\r\n /**\r\n * @param {string} [vert]\r\n * @param {string} [frag]\r\n */\r\n constructor(vert, frag) // eslint-disable-line no-unused-vars\r\n {\r\n const material = new UIElementMaterial();\r\n super(new PlaneGeometry(1, 1), material);\r\n this.material = material;\r\n\r\n this.is_clickable = false;\r\n\r\n /** @type {WorldSpacePosition | ScreenSpacePosition} */\r\n this.position_strategy = new WorldSpacePosition();\r\n this.current_state = new OnIdle();\r\n\r\n this._position = new Vector3();\r\n\r\n this._on_idle_state = new OnIdle();\r\n this._on_enter_state = new OnMouseEnter();\r\n this._on_exit_state = new OnMouseExit();\r\n this._on_hover_state = new OnMouseHover();\r\n\r\n this.on_enter = undefined;\r\n this.on_exit = undefined;\r\n this.on_hover = undefined;\r\n\r\n this.mouse_pos_tmp = new Vector2();\r\n this.cached_NDC_position = new Vector2();\r\n this.screen_pos_tmp = new Vector2();\r\n\r\n this.texture_size = new Vector2(1, 1);\r\n\r\n this.frustumCulled = false;\r\n this.matrixAutoUpdate = false;\r\n this.renderOrder = 0;\r\n\r\n this.size = 1;\r\n this.pixel_offset = new Vector2();\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n set_render_order(value)\r\n {\r\n this.renderOrder = value;\r\n }\r\n\r\n get pivot_point()\r\n {\r\n return this.material.uniforms._PivotPoint.value;\r\n }\r\n\r\n /**\r\n * @param {Vector2} offset\r\n */\r\n set_pixel_offset(offset)\r\n {\r\n this.pixel_offset.copy(offset);\r\n this.material.uniforms._PixelOffset.value.copy(offset);\r\n }\r\n\r\n /**\r\n *@param {UIElementState} new_state\r\n */\r\n set_state(new_state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = new_state;\r\n this.current_state.on_enter(this);\r\n }\r\n\r\n // @ts-ignore\r\n get position()\r\n {\r\n return this._position;\r\n }\r\n\r\n set use_depth(boolean)\r\n {\r\n this.material.depthTest = boolean;\r\n }\r\n\r\n get use_depth()\r\n {\r\n return this.material.depthTest;\r\n }\r\n\r\n set depth_offset(value)\r\n {\r\n this.material.uniforms._DepthOffset.value = value;\r\n }\r\n\r\n get depth_offset()\r\n {\r\n return this.material.uniforms._DepthOffset.value;\r\n }\r\n\r\n clear_state()\r\n {\r\n this.visible = false;\r\n }\r\n\r\n set_world_space_coordinate_system()\r\n {\r\n this.position_strategy = new WorldSpacePosition();\r\n }\r\n\r\n set_screen_space_coordinate_system()\r\n {\r\n this.position_strategy = new ScreenSpacePosition();\r\n }\r\n\r\n /**\r\n * @param {Texture} texture\r\n */\r\n set_texture(texture)\r\n {\r\n texture.minFilter = NearestFilter;\r\n texture.magFilter = NearestFilter;\r\n texture.needsUpdate = true;\r\n\r\n this.texture_size.set(texture.image.width, texture.image.height);\r\n\r\n this.material.uniforms._MainTex.value = texture;\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n this.visible = true;\r\n }\r\n\r\n /**\r\n * @param {Vector2} normalized_mouse_pos\r\n */\r\n update_state(normalized_mouse_pos)\r\n {\r\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n\r\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\r\n this.material.uniforms._NDC.value.copy(this.position);\r\n this.current_state.update(this, normalized_mouse_pos);\r\n }\r\n\r\n /**\r\n * @param {Vector2} normalized_mouse_pos\r\n */\r\n is_mouse_over(normalized_mouse_pos)\r\n {\r\n this.screen_pos_tmp.copy(this.cached_NDC_position);\r\n this.to_screen_position(this.screen_pos_tmp);\r\n this.screen_pos_tmp.x += this.pixel_offset.x;\r\n this.screen_pos_tmp.y += this.pixel_offset.y;\r\n\r\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\r\n\r\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\r\n this.to_screen_position(this.mouse_pos_tmp);\r\n\r\n return rect.containsPoint(this.mouse_pos_tmp);\r\n }\r\n\r\n /**\r\n * @param {Vector2} projected_pos\r\n */\r\n to_screen_position(projected_pos)\r\n {\r\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\r\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\r\n }\r\n\r\n get_screen_space_position()\r\n {\r\n const pos = this.cached_NDC_position.clone();\r\n this.to_screen_position(pos);\r\n return pos;\r\n }\r\n\r\n /**\r\n * @param {Vector2} screen_pos\r\n */\r\n set_screen_space_position(screen_pos)\r\n {\r\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\r\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\r\n }\r\n\r\n dispose()\r\n {\r\n if (this.material.uniforms._MainTex.value)\r\n {\r\n this.material.uniforms._MainTex.value.dispose();\r\n }\r\n // OScreen.remove_screen_material(this.material);\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n /**\r\n * @param {Vector2} [vector2]\r\n */\r\n get_size(vector2)\r\n {\r\n if (vector2)\r\n {\r\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\r\n }\r\n else\r\n {\r\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\r\n }\r\n }\r\n\r\n on_mouse_enter()\r\n {}\r\n\r\n on_mouse_exit()\r\n {}\r\n\r\n on_mouse_hover()\r\n {}\r\n}\r\n\r\nexport { UIElement };\r\n","// @ts-check\r\nimport { CameraManager } from './CameraManager';\r\nimport { Graphics } from './Graphics';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Scene } from 'three';\r\nimport { OrthographicCamera } from './OrthographicCamera';\r\nimport { UIElement } from './components/UIElement'; // eslint-disable-line\r\n\r\nclass UI\r\n{\r\n init(input)\r\n {\r\n this.input = input;\r\n /** @type {UIElement[]} */\r\n this.ui_elements = [];\r\n this._tmp_normalized_pos = new Vector2();\r\n this.ss_scene = new Scene();\r\n this.ss_scene.matrixWorldAutoUpdate = false;\r\n this.ss_scene.frustumCulled = false;\r\n\r\n this.ws_scene = new Scene();\r\n this.ws_scene.matrixWorldAutoUpdate = false;\r\n this.ws_scene.frustumCulled = false;\r\n\r\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\r\n }\r\n\r\n /**\r\n * @param {UIElement} elem\r\n */\r\n delete_element(elem)\r\n {\r\n const index = this.ui_elements.indexOf(elem);\r\n if (index > -1)\r\n {\r\n this.ui_elements.splice(index, 1);\r\n }\r\n\r\n this.ss_scene.remove(elem);\r\n this.ws_scene.remove(elem);\r\n\r\n elem.dispose();\r\n }\r\n\r\n /**\r\n * @param {UIElement} elem\r\n */\r\n add_screen_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ss_scene.add(elem);\r\n\r\n elem.set_screen_space_coordinate_system();\r\n }\r\n\r\n /**\r\n * @param {UIElement} elem\r\n */\r\n add_world_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ws_scene.add(elem);\r\n\r\n elem.set_world_space_coordinate_system();\r\n }\r\n\r\n update()\r\n {\r\n // this.ss_camera.left = -OScreen.width / 2;\r\n // this.ss_camera.right = OScreen.width / 2;\r\n // this.ss_camera.top = OScreen.top / 2;\r\n // this.ss_camera.right = -OScreen.bottom / 2;\r\n this.ss_camera.updateProjectionMatrix();\r\n\r\n this._tmp_normalized_pos.copy(this.input.NDC);\r\n for (let i = 0; i < this.ui_elements.length; i++)\r\n {\r\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Graphics} renderer\r\n */\r\n render(renderer)\r\n {\r\n // renderer.render_ui(this.scene);\r\n if (this.ss_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ss_scene, this.ss_camera);\r\n }\r\n if (this.ws_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ws_scene, CameraManager.current);\r\n }\r\n }\r\n\r\n clear()\r\n {\r\n this.current_clicked_element = undefined;\r\n }\r\n}\r\n\r\nconst ui = new UI();\r\nexport { ui as UI };\r\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\r\nimport { OMath } from './OMath';\r\n\r\nclass PerspectiveFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n const v_fov = OMath.degToRad(vertical_fov / 2);\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n const sphere_center = this.sphere.center.clone();\r\n\r\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n const up_line_intersection = new Vector3();\r\n const down_line_intersection = new Vector3();\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n const vertical_min = Math.min(new_up_distance, new_down_distance);\r\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n const min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n const closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n // let closest_up_point = undefined;\r\n // let closest_down_point = undefined;\r\n\r\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n const down_line_intersection = new Vector3();\r\n const up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n const down_dist = down_line_intersection.distanceTo(points[i]);\r\n const up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n // closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n // closest_up_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n // let closest_right_point = undefined;\r\n // let closest_left_point = undefined;\r\n\r\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n const left_dist = left_line_intersection.distanceTo(points[i]);\r\n const right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n // closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n // closest_right_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n\r\nexport { PerspectiveFrustumPointFitter };\r\n","import { Vector3, Box3 } from 'three';\r\n\r\nclass OrthographicFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n const inverse_camera_quat = camera_quaternion.clone().inverse();\r\n\r\n const inverted_points = [];\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\r\n }\r\n\r\n const box = new Box3().setFromPoints(inverted_points);\r\n const size = new Vector3();\r\n box.getSize(size);\r\n\r\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\r\n\r\n const center = new Vector3();\r\n box.getCenter(center);\r\n\r\n center.applyQuaternion(camera_quaternion);\r\n\r\n return {\r\n center: center,\r\n distance_to_center: distance\r\n };\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n\r\nexport { OrthographicFrustumPointFitter };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { OMath } from '../utilities/OMath';\r\nimport { OScreen } from '../OScreen';\r\n\r\nimport { Vector3 } from 'three';\r\nimport { Matrix4 } from 'three';\r\nimport { Plane } from 'three';\r\nimport { Ray } from 'three';\r\nimport { Sphere } from 'three';\r\nimport { Box3 } from 'three';\r\nimport { PerspectiveFrustumPointFitter } from './PerspectiveFrustumPointFitter';\r\nimport { OrthographicFrustumPointFitter } from './OrthographicFrustumPointFitter';\r\n\r\nclass CameraUtilities\r\n{\r\n init(input)\r\n {\r\n this.tmp_mat = new Matrix4();\r\n this.plane = new Plane();\r\n this.ray = new Ray();\r\n\r\n this.tmp_size = new Vector3();\r\n this.tmp_unproj = new Vector3();\r\n\r\n this.input = input;\r\n }\r\n\r\n get_up_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(0, 1, 0);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n get_forward_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(0, 0, -1);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n get_right_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.set(1, 0, 0);\r\n tmp_vec.applyQuaternion(camera.quaternion);\r\n return tmp_vec;\r\n }\r\n\r\n unproject_mouse_position(NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n const v_fov = (camera.fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\r\n\r\n const distV = Math.tan(v_fov) * camera.far;\r\n const distH = Math.tan(h_fov) * camera.far;\r\n\r\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\r\n\r\n return tmp_vec.applyQuaternion(camera.quaternion);\r\n }\r\n\r\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n NDC = NDC || this.input.NDC;\r\n\r\n const tmp_vec = new Vector3();\r\n\r\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\r\n if (camera.isPerspectiveCamera)\r\n {\r\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\r\n }\r\n else\r\n {\r\n const pos = new Vector3(NDC.x * camera.right, NDC.y * camera.top, 0);\r\n pos.applyQuaternion(camera.quaternion);\r\n pos.add(camera.position);\r\n const dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\r\n this.ray.set(pos, dir);\r\n }\r\n this.ray.intersectPlane(this.plane, tmp_vec);\r\n\r\n return tmp_vec;\r\n }\r\n\r\n fit_points_on_camera(points, zoom_scale = 1)\r\n {\r\n const points_sphere = new Sphere().setFromPoints(points);\r\n const world_space_center = points_sphere.center;\r\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\r\n\r\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\r\n\r\n const points_on_plane = OMath.project_points_on_plane(points, plane);\r\n\r\n const projected_points_center = new Vector3();\r\n let box = new Box3().setFromPoints(points_on_plane);\r\n box.getCenter(projected_points_center);\r\n\r\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\r\n const right = up.clone().cross(camera_forward).normalize();\r\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\r\n right.y, up.y, camera_forward.y, world_space_center.y,\r\n right.z, up.z, camera_forward.z, world_space_center.z,\r\n 0, 0, 0, 1);\r\n\r\n const inverse_mat = new Matrix4().getInverse(mat);\r\n for (let i = 0; i < points_on_plane.length; i++)\r\n {\r\n points_on_plane[i].applyMatrix4(inverse_mat);\r\n }\r\n\r\n const size = new Vector3();\r\n box = new Box3().setFromPoints(points_on_plane);\r\n box.getSize(size);\r\n size.multiplyScalar(zoom_scale);\r\n const projected_center = new Vector3();\r\n box.getCenter(projected_center);\r\n\r\n return {\r\n position: projected_points_center,\r\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\r\n };\r\n }\r\n\r\n get_zoom_to_fit_rect(width, height)\r\n {\r\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n\r\n get_zoom_to_fit_box(bb, camera)\r\n {\r\n if (camera.isOrthographicCamera)\r\n {\r\n bb.getSize(this.tmp_size);\r\n\r\n const obj_x = this.tmp_size.x;\r\n const obj_y = this.tmp_size.y;\r\n const object_aspect = obj_x / obj_y;\r\n if (OScreen.aspect_ratio / object_aspect > 1)\r\n {\r\n return OScreen.height / obj_y;\r\n }\r\n else\r\n {\r\n return OScreen.width / obj_x;\r\n }\r\n }\r\n else\r\n {\r\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\r\n const size = new Vector3();\r\n bb.getSize(size);\r\n return this.get_zoom_to_fit_rect(size.x, size.y);\r\n }\r\n }\r\n\r\n get_html_screen_pos(object, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n object.getWorldPosition(tmp_vec);\r\n tmp_vec.project(camera);\r\n\r\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\r\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\r\n return tmp_vec;\r\n }\r\n\r\n world_pos_to_screen(pos, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n const tmp_vec = new Vector3();\r\n\r\n tmp_vec.copy(pos);\r\n tmp_vec.project(camera);\r\n\r\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\r\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\r\n return tmp_vec;\r\n }\r\n\r\n update_projection(camera)\r\n {\r\n camera.left = -OScreen.width / 2;\r\n camera.right = OScreen.width / 2;\r\n camera.top = OScreen.height / 2;\r\n camera.bottom = -OScreen.height / 2;\r\n camera.aspect = OScreen.aspect_ratio;\r\n camera.updateProjectionMatrix(true);\r\n }\r\n\r\n fit_bounding_box_points(camera, bb, scale = 1)\r\n {\r\n const dir = new Vector3();\r\n dir.copy(bb.max).sub(bb.min);\r\n\r\n const p1 = bb.min.clone();\r\n\r\n const p2 = p1.clone().add(new Vector3(dir.x, 0, 0));\r\n const p3 = p1.clone().add(new Vector3(0, dir.y, 0));\r\n const p4 = p1.clone().add(new Vector3(0, 0, dir.z));\r\n\r\n const p5 = p1.clone().add(new Vector3(dir.x, 0, dir.z));\r\n const p6 = p1.clone().add(new Vector3(0, dir.y, dir.z));\r\n const p7 = bb.max.clone();\r\n const p8 = p1.clone().add(new Vector3(dir.x, dir.y, 0));\r\n return this.fit_points(camera, [p1, p2, p3, p4, p5, p6, p7, p8], scale);\r\n }\r\n\r\n fit_points(camera, points, zoom_scale = 1)\r\n {\r\n if (camera.isPerspectiveCamera)\r\n {\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\r\n const camera_backward_dir = camera_forward_dir.clone().multiplyScalar(-1);\r\n\r\n const fitter = new PerspectiveFrustumPointFitter();\r\n\r\n const aspect_ratio = OScreen.aspect_ratio;\r\n\r\n const camera_pos = fitter.fit_points(points, camera.quaternion, camera.fov * zoom_scale, aspect_ratio);\r\n const box = new Box3().setFromPoints(points);\r\n const center = new Vector3();\r\n box.getCenter(center);\r\n\r\n const reference_position_plane = new Plane().setFromNormalAndCoplanarPoint(camera_backward_dir, center);\r\n\r\n const camera_ray = new Ray(camera_pos, camera_forward_dir);\r\n\r\n const reference_position = new Vector3();\r\n camera_ray.intersectPlane(reference_position_plane, reference_position);\r\n\r\n const zoom = camera_pos.distanceTo(reference_position);\r\n\r\n return {\r\n zoom: zoom,\r\n reference_position: reference_position,\r\n camera_position: camera_pos\r\n };\r\n }\r\n else\r\n {\r\n const fitter = new OrthographicFrustumPointFitter();\r\n const result = fitter.fit_points(points, this.reference_rotation, camera.fov * zoom_scale, OScreen.aspect_ratio);\r\n\r\n this.reference_position.copy(result.center);\r\n this.reference_zoom = result.distance_to_center;\r\n\r\n const forward = new Vector3(0, 0, 1).applyQuaternion(camera.quaternion);\r\n return {\r\n zoom: result.distance_to_center,\r\n reference_position: result.center,\r\n camera_position: forward.multiplyScalar(result.distance_to_center)\r\n };\r\n }\r\n }\r\n}\r\n\r\nconst camera_utilities = new CameraUtilities();\r\nexport { camera_utilities as CameraUtilities };\r\n","// @ts-check\r\nimport { Browser } from './Browser';\r\nimport { CameraManager } from './CameraManager';\r\nimport { Capabilities } from './Capabilities';\r\nimport { Debug } from './Debug';\r\nimport { Graphics } from './Graphics';\r\nimport { OS } from './OS';\r\nimport { OScreen } from './OScreen';\r\nimport { ReflectionPlaneContext } from './ReflectionPlaneContext';\r\nimport { ResourceContainer } from './ResourceContainer';\r\nimport { SceneManager } from './SceneManager';\r\nimport { GeometryBatcher } from './static_batcher/GeometryBatcher';\r\nimport { Time } from './Time';\r\nimport { UI } from './UI';\r\nimport { CameraUtilities } from './utilities/CameraUtilities';\r\nimport { RenderLoop } from './index'; // eslint-disable-line no-unused-vars\r\n\r\nclass Initializer\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n init(input)\r\n {\r\n CameraManager.init();\r\n CameraUtilities.init(input);\r\n Capabilities.init();\r\n GeometryBatcher.init();\r\n\r\n OS.init();\r\n Browser.init();\r\n ReflectionPlaneContext.init();\r\n ResourceContainer.init();\r\n SceneManager.init();\r\n OScreen.init();\r\n Time.init();\r\n UI.init(input);\r\n\r\n Debug.init();\r\n }\r\n\r\n /**\r\n * @param {RenderLoop} render_loop\r\n */\r\n dispose(render_loop)\r\n {\r\n Graphics.dispose();\r\n SceneManager.dispose();\r\n\r\n render_loop.dispose();\r\n }\r\n}\r\n\r\nconst initializer = new Initializer();\r\nexport { initializer as Initializer };\r\n","// @ts-check\r\nclass KeyboardInput\r\n{\r\n /**\r\n * @param {HTMLElement} container\r\n */\r\n init(container)\r\n {\r\n this.ctrlz_pressed = false;\r\n this.ctrlz_fired = false;\r\n\r\n /**\r\n * @type {{[key:string]:{key_name: string, pressed: boolean, down: boolean, fired: boolean, released: boolean}}}\r\n */\r\n this.keys = {};\r\n /** @type {string[]} */\r\n this.keys_keys = [];\r\n this.container = container;\r\n\r\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\r\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} e\r\n */\r\n on_key_down(e)\r\n {\r\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\r\n {\r\n this.ctrlz_pressed = true;\r\n this.ctrlz_fired = true;\r\n }\r\n\r\n if (e.code)\r\n {\r\n this.press_key(e.code);\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} e\r\n */\r\n on_key_up(e)\r\n {\r\n this.release_key(e.code);\r\n }\r\n\r\n clear()\r\n {\r\n this.ctrlz_pressed = false;\r\n\r\n for (let i = 0; i < this.keys_keys.length; i++)\r\n {\r\n this.keys[this.keys_keys[i]].pressed = false;\r\n this.keys[this.keys_keys[i]].released = false;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n */\r\n release_key(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n key.fired = false;\r\n key.down = false;\r\n key.released = true;\r\n }\r\n }\r\n\r\n release_keys()\r\n {\r\n this.ctrlz_fired = false;\r\n\r\n for (let i = 0; i < this.keys_keys.length; i++)\r\n {\r\n this.keys[this.keys_keys[i]].fired = false;\r\n this.keys[this.keys_keys[i]].down = false;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n */\r\n press_key(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n if (key.down === false)\r\n {\r\n key.pressed = true;\r\n }\r\n key.down = true;\r\n key.fired = true;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n * @returns {boolean}\r\n */\r\n is_key_pressed(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.pressed;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n * @returns {boolean}\r\n */\r\n is_key_down(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.down;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n * @returns {boolean}\r\n */\r\n is_key_released(key_name)\r\n {\r\n const key = this.keys[key_name];\r\n if (key)\r\n {\r\n return key.released;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n register_key(key)\r\n {\r\n this.keys[key] =\r\n {\r\n key_name: key,\r\n pressed: false,\r\n down: false,\r\n fired: false,\r\n released: false\r\n };\r\n\r\n this.keys_keys = Object.keys(this.keys);\r\n }\r\n\r\n /**\r\n * @param {string} key_name\r\n */\r\n unregister_key(key_name)\r\n {\r\n delete this.keys[key_name];\r\n }\r\n\r\n dispose()\r\n {\r\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\r\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\r\n }\r\n}\r\n\r\nexport { KeyboardInput };\r\n","import frag from '../shaders/normal/normal.frag';\r\nimport vert from '../shaders/normal/normal.vert';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nclass NormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n}\r\n\r\nexport { NormalMaterial };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Graphics } from '../Graphics';\r\nimport { NormalMaterial } from '../materials/NormalMaterial';\r\n\r\nclass DebugNormalsRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\r\n }\r\n}\r\n\r\nexport { DebugNormalsRender };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/depth_normals/debug_normals.frag';\r\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\n\r\nclass DisplayNormalTextureMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, depth_normals_vert);\r\n this.uniforms._FarPlane = { value: 1 };\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n }\r\n}\r\n\r\nexport { DisplayNormalTextureMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/ssao/ssao_compose.frag';\r\n\r\nclass SSAOComposeMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._AO = { value: undefined };\r\n }\r\n}\r\n\r\nexport { SSAOComposeMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/ssao/ssao.frag';\r\nimport vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { DataTexture, Matrix4, RGBAFormat, RepeatWrapping, Vector3 } from 'three';\r\n\r\nimport { OMath } from '../utilities/OMath';\r\nclass SSAOMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, vert);\r\n\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\r\n\r\n this.uniforms._Bias = { value: 0.0125 };\r\n this.uniforms._Radius = { value: 0.3 };\r\n this.uniforms._FarPlane = { value: 100 };\r\n\r\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\r\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\r\n }\r\n\r\n __get_sample_kernel()\r\n {\r\n const sample_kernel = [];\r\n const kernel_size = 64;\r\n\r\n for (let i = 0; i < kernel_size; i++)\r\n {\r\n const dir = new Vector3(Math.random() * 2 - 1,\r\n Math.random() * 2 - 1,\r\n Math.random());\r\n dir.normalize();\r\n let scale = i / kernel_size;\r\n scale = OMath.lerp(0.1, 1.0, scale * scale);\r\n dir.multiplyScalar(scale);\r\n\r\n sample_kernel.push(dir);\r\n }\r\n return sample_kernel;\r\n }\r\n\r\n __get_rotation_kernel()\r\n {\r\n const rotation_kernel = new Uint8Array(3 * 16);\r\n for (let i = 0; i < 16; i++)\r\n {\r\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 3] = 0;\r\n }\r\n\r\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBAFormat);\r\n rotation_texture.wrapS = RepeatWrapping;\r\n rotation_texture.wrapT = RepeatWrapping;\r\n\r\n rotation_texture.needsUpdate = true;\r\n return rotation_texture;\r\n }\r\n}\r\n\r\nexport { SSAOMaterial };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/box_blur/box_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass BoxBlurMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._SampleDir = { value: new Vector2() };\r\n }\r\n}\r\n\r\nexport { BoxBlurMaterial };\r\n","import { BoxBlurMaterial } from '../materials/BoxBlurMaterial';\r\nimport { Graphics } from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nclass Blurrer\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.box_blur_mat = new BoxBlurMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\r\n {\r\n this.RT1.setSize(RT.width, RT.height);\r\n this.RT2.setSize(RT.width, RT.height);\r\n }\r\n\r\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\r\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\r\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\r\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\r\n // return this.RT2;\r\n }\r\n}\r\n\r\nexport { Blurrer };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { Graphics } from '../Graphics';\r\nimport { DisplayNormalTextureMaterial } from '../materials/DisplayNormalTextureMaterial';\r\nimport { SSAOComposeMaterial } from '../materials/SSAOComposeMaterial';\r\nimport { SSAOMaterial } from '../materials/SSAOMaterial';\r\nimport { OScreen } from '../OScreen';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Blurrer } from '../render_utilities/Blurrer';\r\nimport { SceneManager } from '../SceneManager';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nclass NormalAORender extends BaseRender\r\n{\r\n constructor(use_ssaa = false)\r\n {\r\n super();\r\n\r\n this.ssao_mat = new SSAOMaterial();\r\n this.ssao_compose_mat = new SSAOComposeMaterial();\r\n this.debug_normals = new DisplayNormalTextureMaterial();\r\n\r\n this.ssaa = use_ssaa ? 2 : 1;\r\n\r\n this.main_RT = new WebGLRenderTarget(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\r\n\r\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\r\n\r\n this.blurrer = new Blurrer();\r\n Graphics.generateDepthNormalTexture = true;\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n this.__update_uniforms();\r\n\r\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\r\n\r\n // // BLUR\r\n this.blurrer.blur(this.SSAO_RT);\r\n Graphics.blit(this.SSAO_RT, undefined);\r\n\r\n // // COMPOSE\r\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\r\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\r\n\r\n // Graphics.blit(this.SSAO_RT, undefined);\r\n }\r\n\r\n __update_uniforms()\r\n {\r\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\r\n {\r\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\r\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\r\n }\r\n }\r\n}\r\n\r\nexport { NormalAORender };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Graphics } from '../Graphics';\r\n\r\nclass NormalRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n if (SceneManager.current.on_pre_render)\r\n {\r\n SceneManager.current.on_pre_render();\r\n }\r\n\r\n if (SceneManager.current.render)\r\n {\r\n SceneManager.current.render();\r\n }\r\n else\r\n {\r\n Graphics.render(SceneManager.current, CameraManager.current);\r\n }\r\n\r\n if (SceneManager.current.on_post_render)\r\n {\r\n SceneManager.current.on_post_render();\r\n }\r\n }\r\n}\r\n\r\nexport { NormalRender };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass GaussianBlurMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius, use_half_float)\r\n {\r\n super(frag, undefined, {\r\n KERNEL_RADIUS: kernel_radius,\r\n SIGMA: kernel_radius\r\n });\r\n\r\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\r\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\r\n this.uniforms.radius = { value: 1 };\r\n\r\n this.defines.USE_LINEAR_COLOR_SPACE = true;\r\n }\r\n\r\n set_size(w, h)\r\n {\r\n this.uniforms.texSize.value.x = w;\r\n this.uniforms.texSize.value.y = h;\r\n }\r\n\r\n set_direction(x, y)\r\n {\r\n this.uniforms.direction.value.set(x, y);\r\n }\r\n\r\n set_radius(value = 1)\r\n {\r\n this.uniforms.radius.value = value;\r\n }\r\n}\r\n\r\nexport { GaussianBlurMaterial };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\r\n\r\nimport { Color } from 'three';\r\nclass LuminosityHighPassMaterial extends BlitMaterial\r\n{\r\n constructor(use_half_float)\r\n {\r\n super(frag);\r\n\r\n this.uniforms.luminosityThreshold = { value: 0.23 };\r\n this.uniforms.smoothWidth = { value: 0.01 };\r\n this.uniforms.defaultColor = { value: new Color('#000000') };\r\n this.uniforms.defaultOpacity = { value: 0.0 };\r\n\r\n this.defines.USE_LINEAR_COLOR_SPACE = true;\r\n }\r\n\r\n set_threshold(value_01)\r\n {\r\n this.uniforms.luminosityThreshold.value = value_01;\r\n }\r\n}\r\n\r\nexport { LuminosityHighPassMaterial };\r\n","import { GaussianBlurMaterial } from '../materials/GaussianBlurMaterial';\r\nimport { LuminosityHighPassMaterial } from '../materials/LuminosityHighPassMaterial';\r\nimport { Graphics } from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat, HalfFloatType, UnsignedByteType, SRGBColorSpace, LinearSRGBColorSpace } from 'three';\r\n\r\nclass GaussianBlurrer\r\n{\r\n constructor(use_half_float = false)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n\r\n this.separableBlurMaterials = [];\r\n this.renderTargetsHorizontal = [];\r\n this.renderTargetsVertical = [];\r\n this.use_half_float = use_half_float;\r\n this.nMips = 5;\r\n this.kernelSizeArray = [3, 5, 7, 9, 11];\r\n this.rt_pars = {\r\n minFilter: LinearFilter,\r\n magFilter: LinearFilter,\r\n format: RGBAFormat,\r\n type: use_half_float ? HalfFloatType : UnsignedByteType,\r\n colorSpace: use_half_float ? LinearSRGBColorSpace : SRGBColorSpace\r\n };\r\n\r\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n this.renderTargetBright.texture.generateMipmaps = false;\r\n\r\n this.init_materials();\r\n this.init_RT();\r\n\r\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial(use_half_float);\r\n }\r\n\r\n blur(RT, use_luminosity_high_pass)\r\n {\r\n this.resize_RT(RT.width, RT.height);\r\n\r\n let inputRenderTarget = RT;\r\n\r\n if (use_luminosity_high_pass)\r\n {\r\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\r\n inputRenderTarget = this.renderTargetBright;\r\n }\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n const mat = this.separableBlurMaterials[i];\r\n\r\n mat.set_direction(1, 0);\r\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\r\n\r\n mat.set_direction(0, 1);\r\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\r\n\r\n inputRenderTarget = this.renderTargetsVertical[i];\r\n }\r\n }\r\n\r\n get_blurred_texture()\r\n {\r\n return this.renderTargetsHorizontal[0].texture;\r\n }\r\n\r\n get_blurred_RT()\r\n {\r\n return this.renderTargetsHorizontal[0];\r\n }\r\n\r\n init_RT()\r\n {\r\n this.dispose_RT();\r\n\r\n this.renderTargetBright.setSize(1, 1);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n\r\n hor.texture.generateMipmaps = false;\r\n ver.texture.generateMipmaps = false;\r\n\r\n hor.texture.colorSpace = this.rt_pars.colorSpace;\r\n ver.texture.colorSpace = this.rt_pars.colorSpace;\r\n\r\n this.renderTargetsHorizontal.push(hor);\r\n this.renderTargetsVertical.push(ver);\r\n }\r\n }\r\n\r\n resize_RT(texture_width, texture_height)\r\n {\r\n if (this.current_width === texture_width && this.current_height === texture_height)\r\n {\r\n return;\r\n }\r\n\r\n this.current_width = texture_width;\r\n this.current_height = texture_height;\r\n\r\n let width = Math.round(texture_width / 2);\r\n let height = Math.round(texture_height / 2);\r\n\r\n this.renderTargetBright.setSize(width, height);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.renderTargetsVertical[i].setSize(width, height);\r\n this.renderTargetsHorizontal[i].setSize(width, height);\r\n this.separableBlurMaterials[i].set_size(width, height);\r\n\r\n width = Math.round(width / 2);\r\n height = Math.round(height / 2);\r\n }\r\n }\r\n\r\n init_materials()\r\n {\r\n this.dispose_materials();\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i], this.use_half_float));\r\n }\r\n }\r\n\r\n set_radius(value)\r\n {\r\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\r\n {\r\n this.separableBlurMaterials[i].set_radius(value);\r\n }\r\n }\r\n\r\n set_luminosity_threshold(value)\r\n {\r\n this.luminosity_high_pass_mat.set_threshold(value);\r\n }\r\n\r\n dispose_materials()\r\n {\r\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\r\n {\r\n this.separableBlurMaterials[i].dispose();\r\n }\r\n this.separableBlurMaterials.length = 0;\r\n }\r\n\r\n dispose_RT()\r\n {\r\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\r\n {\r\n this.renderTargetsHorizontal[i].dispose();\r\n this.renderTargetsVertical[i].dispose();\r\n }\r\n this.renderTargetBright.dispose();\r\n\r\n this.renderTargetsHorizontal.length = 0;\r\n this.renderTargetsVertical.length = 0;\r\n }\r\n}\r\n\r\nexport { GaussianBlurrer };\r\n","import { OScreen } from '../OScreen';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { UnrealBloomComposeMaterial } from '../materials/UnrealBloomComposeMaterial';\r\nimport { AddMaterial } from '../materials/AddMaterial';\r\n\r\nimport { HalfFloatType, LinearSRGBColorSpace, NearestFilter, RGBAFormat, UnsignedByteType, WebGLRenderTarget } from 'three';\r\n\r\nimport { GaussianBlurrer } from '../render_utilities/GaussianBlurrer';\r\nimport { Graphics } from '../Graphics';\r\nimport { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\n\r\nclass UnrealBloomRender extends BaseRender\r\n{\r\n constructor(use_antialiasing, use_half_float, use_hight_luminosity_pass, use_rendering_size = false)\r\n {\r\n super();\r\n\r\n this.add_mat = new AddMaterial(use_half_float);\r\n\r\n const rt_settings = {\r\n samples: use_antialiasing ? 8 : 1,\r\n type: use_half_float ? HalfFloatType : UnsignedByteType,\r\n format: RGBAFormat,\r\n colorSpace: LinearSRGBColorSpace,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n };\r\n this.use_rendering_size = use_rendering_size;\r\n this.main_RT = new WebGLRenderTarget(1, 1, rt_settings);\r\n this.main_RT.texture.colorSpace = LinearSRGBColorSpace;\r\n this.main_RT.texture.minFilter = NearestFilter;\r\n this.main_RT.texture.magFilter = NearestFilter;\r\n\r\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5, use_half_float);\r\n this.blurrer = new GaussianBlurrer(use_half_float);\r\n this.use_hight_luminosity_pass = use_hight_luminosity_pass;\r\n this.luminosity_threshold = 0.5;\r\n }\r\n\r\n on_enter()\r\n {\r\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\r\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\r\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\r\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\r\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\r\n\r\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n // // // BLUR\r\n this.blurrer.blur(this.main_RT, this.use_hight_luminosity_pass);\r\n\r\n // // Blur compose\r\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\r\n\r\n // // Additive blend\r\n // Graphics.clear(undefined, CameraManager.current, true, false);\r\n // Graphics.render(SceneManager.current, CameraManager.current);\r\n Graphics.blit(this.main_RT, undefined, this.add_mat);\r\n }\r\n\r\n set_bloom_strength(val)\r\n {\r\n this.bloom_compose_mat.set_bloom_strength(val);\r\n }\r\n\r\n set_bloom_radius(val)\r\n {\r\n // this.bloom_compose_mat.set_bloom_radius(val);\r\n this.blurrer.set_radius(val);\r\n }\r\n\r\n set_luminosity_threshold(value)\r\n {\r\n this.blurrer.set_luminosity_threshold(value);\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_0(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_1(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_2(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_3(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_4(col_string);\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n const width = this.use_rendering_size ? OScreen.render_width : OScreen.width;\r\n const height = this.use_rendering_size ? OScreen.render_height : OScreen.height;\r\n if (this.main_RT.width !== width || this.main_RT.height !== height)\r\n {\r\n this.main_RT.setSize(width, height);\r\n }\r\n }\r\n}\r\n\r\nexport { UnrealBloomRender };\r\n","import { CameraManager } from '../CameraManager';\r\nimport { SceneManager } from '../SceneManager';\r\nimport { BaseRender } from '../render_mode/BaseRender';\r\nimport { Graphics } from '../Graphics';\r\n\r\nclass VRRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n // Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n if (SceneManager.current.on_pre_render)\r\n {\r\n SceneManager.current.on_pre_render();\r\n }\r\n\r\n if (SceneManager.current.render)\r\n {\r\n SceneManager.current.render();\r\n }\r\n else\r\n {\r\n Graphics.render(SceneManager.current, CameraManager.current, Graphics._renderer.getRenderTarget());\r\n }\r\n\r\n this.render_spectator_camera();\r\n\r\n if (SceneManager.current.on_post_render)\r\n {\r\n SceneManager.current.on_post_render();\r\n }\r\n }\r\n\r\n render_spectator_camera()\r\n {\r\n const spectator_camera = CameraManager.spectator;\r\n\r\n if (spectator_camera && Graphics._renderer.xr.isPresenting)\r\n {\r\n // Copy the XR Camera's position and rotation, but use your\r\n // main camera's projection matrix\r\n const xrCam = Graphics._renderer.xr.getCamera(CameraManager.current);\r\n\r\n spectator_camera.projectionMatrix.copy(CameraManager.current.projectionMatrix);\r\n\r\n spectator_camera.position.copy(xrCam.position);\r\n spectator_camera.quaternion.copy(xrCam.quaternion);\r\n\r\n // we'll restore this later\r\n const currentRenderTarget = Graphics._renderer.getRenderTarget();\r\n\r\n // turn off the WebXR rendering\r\n Graphics._renderer.xr.isPresenting = false;\r\n\r\n // render to the canvas on our main display\r\n Graphics._renderer.setRenderTarget(null);\r\n Graphics._renderer.render(SceneManager.current, spectator_camera);\r\n\r\n // reset back to enable WebXR\r\n Graphics._renderer.setRenderTarget(currentRenderTarget);\r\n Graphics._renderer.xr.isPresenting = true;\r\n }\r\n }\r\n}\r\n\r\nexport { VRRender };\r\n","// @ts-check\r\nimport { Vector2 } from 'three'; // eslint-disable-line\r\nimport { OScreen } from './OScreen';\r\n\r\nclass Screen\r\n{\r\n init()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.init();\r\n }\r\n\r\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n update_position(x, y)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update_position(x, y);\r\n }\r\n\r\n update()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update();\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n update_size(width, height)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n OScreen.update_size(width, height);\r\n }\r\n\r\n /**\r\n * @param {Vector2} vector2\r\n */\r\n apply_pixel_density_v2(vector2)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.apply_pixel_density_v2(vector2);\r\n }\r\n\r\n /**\r\n * @param {number} value\r\n */\r\n apply_pixel_density(value)\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.apply_pixel_density(value);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.get_pixel_size();\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\r\n return OScreen.aspect_ratio;\r\n }\r\n}\r\n\r\nconst screen = new Screen();\r\nexport { screen as Screen };\r\n","import { ViewComponentManager } from './ViewComponentManager';\r\n\r\nexport class ViewComponent\r\n{\r\n constructor({ name, container })\r\n {\r\n this.name = name;\r\n this.container = container;\r\n this.hidden = true;\r\n\r\n ViewComponentManager.register_component(this);\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('hidden');\r\n ViewComponentManager.enable_component(this);\r\n\r\n this.hidden = false;\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n this.container.classList.add('hidden');\r\n ViewComponentManager.disable_component(this);\r\n\r\n this.hidden = true;\r\n }\r\n\r\n set_opacity(current_state_data)\r\n {\r\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\r\n this.toggle_hidden();\r\n }\r\n\r\n toggle_hidden()\r\n {\r\n if (this.container.style.opacity > 0.001)\r\n {\r\n if (this.hidden)\r\n {\r\n this.on_enter();\r\n }\r\n }\r\n else\r\n {\r\n if (!this.hidden)\r\n {\r\n this.on_exit();\r\n }\r\n }\r\n }\r\n}\r\n","// @ts-check\r\nimport { Material, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\n\r\nclass HorizontalPlane extends Mesh\r\n{\r\n /**\r\n * @param {number} [width]\r\n * @param {number} [height]\r\n * @param {number | string} [color]\r\n * @param {Material} [material]\r\n */\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n const geometry = new PlaneGeometry(width, height);\r\n geometry.rotateX(-3.14 / 2);\r\n super(geometry, material);\r\n }\r\n}\r\n\r\nexport { HorizontalPlane };\r\n","// @ts-check\r\nimport { Material, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { PlaneGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nclass VerticalPlane extends Mesh\r\n{\r\n /**\r\n * @param {number} [width]\r\n * @param {number} [height]\r\n * @param {number | string} [color]\r\n * @param {Material} [material]\r\n */\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n const geometry = new PlaneGeometry(width, height);\r\n super(geometry, material);\r\n }\r\n}\r\n\r\nexport { VerticalPlane };\r\n","class ArrayUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static merge_from_to(source, target)\r\n {\r\n target.push.apply(target, source);\r\n }\r\n\r\n static expand_vec3_array(array, size)\r\n {\r\n const items_left_count = size - array.length;\r\n\r\n for (let i = 0; i < items_left_count; i++)\r\n {\r\n array.push(array[i].clone());\r\n }\r\n }\r\n\r\n static remove_elem(array, elem)\r\n {\r\n const index = array.indexOf(elem);\r\n if (index > -1)\r\n {\r\n array.splice(index, 1);\r\n }\r\n }\r\n\r\n static get_closest_point(points, target)\r\n {\r\n let closest_point = points[0];\r\n let closest_distance = closest_point.distanceTo(target);\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n if (points[i].distanceTo(target) < closest_distance)\r\n {\r\n closest_point = points[i];\r\n closest_distance = points[i].distanceTo(target);\r\n }\r\n }\r\n return closest_point;\r\n }\r\n\r\n static object_values_to_array(obj)\r\n {\r\n const ids = Object.keys(obj);\r\n const arr = [];\r\n for (let i = 0; i < ids.length; i++)\r\n {\r\n arr.push(obj[ids[i]]);\r\n }\r\n return arr;\r\n }\r\n}\r\n\r\nexport { ArrayUtilities };\r\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\r\n\r\nclass FrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n const v_fov = Math.degToRad(vertical_fov / 2);\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n const sphere_center = this.sphere.center.clone();\r\n\r\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n const up_line_intersection = new Vector3();\r\n const down_line_intersection = new Vector3();\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n const vertical_min = Math.min(new_up_distance, new_down_distance);\r\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n const min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n const closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n let closest_up_point = undefined;\r\n let closest_down_point = undefined;\r\n\r\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n const down_line_intersection = new Vector3();\r\n const up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n const down_dist = down_line_intersection.distanceTo(points[i]);\r\n const up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n closest_up_point = points[i];\r\n }\r\n }\r\n\r\n console.log(closest_up_point, closest_down_point);\r\n\r\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n let closest_right_point = undefined;\r\n let closest_left_point = undefined;\r\n\r\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n const left_line_intersection = new Vector3();\r\n const right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n const left_dist = left_line_intersection.distanceTo(points[i]);\r\n const right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n closest_right_point = points[i];\r\n }\r\n }\r\n\r\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n console.log(closest_right_point, closest_left_point);\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n const down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n const right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n const distV = height / Math.tan(v_fov);\r\n const distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n\r\nexport { FrustumPointFitter };\r\n","import { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\n\r\nclass GeometryUtilities\r\n{\r\n static convert_to_non_indexed_geometry(geometry_buffer)\r\n {\r\n const indices = geometry_buffer.index;\r\n const positions = geometry_buffer.getAttribute('position');\r\n\r\n const bar_coordinates = [];\r\n const vertices = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n // VERTEX 1\r\n vertices.push(positions.getX(indices.array[i + 0]));\r\n vertices.push(positions.getY(indices.array[i + 0]));\r\n vertices.push(positions.getZ(indices.array[i + 0]));\r\n\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 2\r\n\r\n vertices.push(positions.getX(indices.array[i + 1]));\r\n vertices.push(positions.getY(indices.array[i + 1]));\r\n vertices.push(positions.getZ(indices.array[i + 1]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 3\r\n\r\n vertices.push(positions.getX(indices.array[i + 2]));\r\n vertices.push(positions.getY(indices.array[i + 2]));\r\n vertices.push(positions.getZ(indices.array[i + 2]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n\r\n const geometry = new BufferGeometry();\r\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\r\n GeometryUtilities.add_barycentric_attribute(geometry);\r\n return geometry;\r\n }\r\n\r\n static add_barycentric_attribute(non_indexed_geometry_buffer)\r\n {\r\n const bar_coordinates = [];\r\n const positions = non_indexed_geometry_buffer.getAttribute('position');\r\n\r\n for (let i = 0; i < positions.count; i += 3)\r\n {\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\r\n }\r\n}\r\n\r\nexport { GeometryUtilities };\r\n","class HTMLUtilities\r\n{\r\n static load_images(container)\r\n {\r\n const images = container.querySelectorAll('img');\r\n\r\n for (let i = 0; i < images.length; i++)\r\n {\r\n const image = images[i];\r\n\r\n if (image.dataset.src)\r\n {\r\n image.src = image.dataset.src;\r\n }\r\n }\r\n\r\n const image_objects = container.querySelectorAll('object');\r\n\r\n for (let i = 0; i < image_objects.length; i++)\r\n {\r\n const image_object = image_objects[i];\r\n\r\n if (image_object.dataset.src)\r\n {\r\n image_object.data = image_object.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_videos(container)\r\n {\r\n const videos = container.querySelectorAll('video');\r\n\r\n for (let i = 0; i < videos.length; i++)\r\n {\r\n const video = videos[i];\r\n\r\n if (video.dataset.src)\r\n {\r\n video.src = video.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_iframes(container)\r\n {\r\n const iframes = container.querySelectorAll('iframe');\r\n\r\n for (let i = 0; i < iframes.length; i++)\r\n {\r\n const iframe = iframes[i];\r\n\r\n if (iframe.dataset.src)\r\n {\r\n iframe.src = iframe.dataset.src;\r\n }\r\n }\r\n }\r\n\r\n static load_elements(container, selector)\r\n {\r\n const elements = container.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < elements.length; i++)\r\n {\r\n const element = elements[i];\r\n\r\n if (element.dataset.src)\r\n {\r\n element.src = element.dataset.src;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { HTMLUtilities };\r\n","import { Vector4 } from 'three';\r\n\r\nclass ImageUtilities\r\n{\r\n constructor()\r\n { }\r\n\r\n static get_image_data(image)\r\n {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n\r\n const context = canvas.getContext('2d');\r\n context.drawImage(image, 0, 0);\r\n\r\n return context.getImageData(0, 0, image.width, image.height);\r\n }\r\n\r\n static get_pixel(imagedata, x, y)\r\n {\r\n const position = (x + imagedata.width * y) * 4;\r\n const data = imagedata.data;\r\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\r\n }\r\n}\r\n\r\nexport { ImageUtilities };\r\n","import { Vector3 } from 'three';\r\nimport { Vector2 } from 'three';\r\nclass MeshSampler\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n sample(buffer_geometry, sample_count)\r\n {\r\n const face_areas = [];\r\n\r\n let min_area = 99999999;\r\n\r\n const vertices = buffer_geometry.getAttribute('position');\r\n const normals = buffer_geometry.getAttribute('normal');\r\n const tangents = buffer_geometry.getAttribute('tangent');\r\n const uvs = buffer_geometry.getAttribute('uv');\r\n const indices = buffer_geometry.index;\r\n\r\n const faces = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n const index_0 = indices.array[i + 0];\r\n const index_1 = indices.array[i + 1];\r\n const index_2 = indices.array[i + 2];\r\n\r\n const v1 = new Vector3();\r\n v1.x = vertices.getX(index_0);\r\n v1.y = vertices.getY(index_0);\r\n v1.z = vertices.getZ(index_0);\r\n\r\n const v2 = new Vector3();\r\n v2.x = vertices.getX(index_1);\r\n v2.y = vertices.getY(index_1);\r\n v2.z = vertices.getZ(index_1);\r\n\r\n const v3 = new Vector3();\r\n v3.x = vertices.getX(index_2);\r\n v3.y = vertices.getY(index_2);\r\n v3.z = vertices.getZ(index_2);\r\n\r\n const face = {\r\n a: v1,\r\n b: v2,\r\n c: v3\r\n };\r\n\r\n if (normals)\r\n {\r\n const n1 = new Vector3();\r\n n1.x = normals.getX(index_0);\r\n n1.y = normals.getY(index_0);\r\n n1.z = normals.getZ(index_0);\r\n\r\n const n2 = new Vector3();\r\n n2.x = normals.getX(index_1);\r\n n2.y = normals.getY(index_1);\r\n n2.z = normals.getZ(index_1);\r\n\r\n const n3 = new Vector3();\r\n n3.x = normals.getX(index_2);\r\n n3.y = normals.getY(index_2);\r\n n3.z = normals.getZ(index_2);\r\n\r\n const normal = n1.clone().add(n2).add(n3).normalize();\r\n face.normal = normal;\r\n }\r\n\r\n if (tangents)\r\n {\r\n const n1 = new Vector3();\r\n n1.x = tangents.getX(index_0);\r\n n1.y = tangents.getY(index_0);\r\n n1.z = tangents.getZ(index_0);\r\n\r\n const n2 = new Vector3();\r\n n2.x = tangents.getX(index_1);\r\n n2.y = tangents.getY(index_1);\r\n n2.z = tangents.getZ(index_1);\r\n\r\n const n3 = new Vector3();\r\n n3.x = tangents.getX(index_2);\r\n n3.y = tangents.getY(index_2);\r\n n3.z = tangents.getZ(index_2);\r\n\r\n const tangent = n1.clone().add(n2).add(n3).normalize();\r\n face.tangent = tangent;\r\n }\r\n if (uvs)\r\n {\r\n const uv_a = new Vector2();\r\n uv_a.x = uvs.getX(index_0);\r\n uv_a.y = uvs.getY(index_0);\r\n\r\n const uv_b = new Vector2();\r\n uv_b.x = uvs.getX(index_1);\r\n uv_b.y = uvs.getY(index_1);\r\n\r\n const uv_c = new Vector2();\r\n uv_c.x = uvs.getX(index_2);\r\n uv_c.y = uvs.getY(index_2);\r\n\r\n face.uv_a = uv_a;\r\n face.uv_b = uv_b;\r\n face.uv_c = uv_c;\r\n }\r\n\r\n faces.push(face);\r\n\r\n const area = this.get_face_area(face);\r\n min_area = Math.min(area, min_area);\r\n face_areas.push(area);\r\n }\r\n\r\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\r\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\r\n const sampled_data = this.sample_data_from_faces(selected_faces);\r\n return sampled_data;\r\n }\r\n\r\n sample_data_from_faces(faces)\r\n {\r\n const sampled_points = [];\r\n const sampled_normals = [];\r\n const sampled_tangents = [];\r\n const sampled_uvs = [];\r\n\r\n for (let i = 0; i < faces.length; i++)\r\n {\r\n const face = faces[i];\r\n\r\n const w1 = Math.random();\r\n const w2 = Math.random();\r\n\r\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\r\n if (face.normal)\r\n {\r\n sampled_normals.push(face.normal.clone());\r\n }\r\n if (face.tangent)\r\n {\r\n sampled_tangents.push(face.tangent.clone());\r\n }\r\n if (face.uv_a)\r\n {\r\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\r\n }\r\n }\r\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\r\n }\r\n\r\n select_random_faces(faces, amount)\r\n {\r\n const selected_faces = [];\r\n for (let i = 0; i < amount; i++)\r\n {\r\n const random = Math.floor(Math.random() * faces.length);\r\n const selected_face = faces[random];\r\n\r\n selected_faces.push(selected_face);\r\n }\r\n\r\n return selected_faces;\r\n }\r\n\r\n get_uniform_face_distribution(face_areas, minimum_area, faces)\r\n {\r\n const extended_triangle_indices = [];\r\n for (let i = 0; i < face_areas.length; i++)\r\n {\r\n face_areas[i] /= minimum_area;\r\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\r\n for (let j = 0; j < repetitions_needed; j++)\r\n {\r\n extended_triangle_indices.push(faces[i]);\r\n }\r\n }\r\n return extended_triangle_indices;\r\n }\r\n\r\n get_face_area(face)\r\n {\r\n const vec1 = face.b.clone().sub(face.a);\r\n const vec2 = face.c.clone().sub(face.a);\r\n return vec1.cross(vec2).length() / 2;\r\n }\r\n\r\n sample_point_in_face(w1, w2, v1, v2, v3)\r\n {\r\n if (w1 + w2 > 1)\r\n {\r\n w1 = 1.0 - w1;\r\n w2 = 1.0 - w2;\r\n }\r\n\r\n const w3 = 1.0 - (w1 + w2);\r\n\r\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\r\n }\r\n}\r\n\r\nconst mesh_sampler = new MeshSampler();\r\nexport { mesh_sampler as MeshSampler };\r\n","import { Mesh } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Skeleton } from 'three';\r\n\r\nclass ModelUtilities\r\n{\r\n get_mesh(scene, result_callback)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\r\n }\r\n result_callback(child);\r\n }\r\n });\r\n }\r\n\r\n get_geometries(scene)\r\n {\r\n const geometries = [];\r\n\r\n this.get_mesh(scene, (child) =>\r\n {\r\n geometries.push(child.geometry);\r\n });\r\n return geometries;\r\n }\r\n\r\n assign_material(scene, material, name)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n // assign to all if no name is given\r\n if (name === undefined)\r\n {\r\n child.material = material;\r\n }\r\n else\r\n {\r\n // if name is given, assign only to that\r\n if (child.name === name)\r\n {\r\n child.material = material;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n clone_animated_gltf(gltf)\r\n {\r\n const clone = {\r\n animations: gltf.animations,\r\n scene: gltf.scene.clone(true)\r\n };\r\n\r\n const skinnedMeshes = {};\r\n\r\n gltf.scene.traverse(node =>\r\n {\r\n if (node.isSkinnedMesh)\r\n {\r\n skinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n const cloneBones = {};\r\n const cloneSkinnedMeshes = {};\r\n\r\n clone.scene.traverse(node =>\r\n {\r\n if (node.isBone)\r\n {\r\n cloneBones[node.name] = node;\r\n }\r\n\r\n if (node.isSkinnedMesh)\r\n {\r\n cloneSkinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n for (const name in skinnedMeshes)\r\n {\r\n const skinnedMesh = skinnedMeshes[name];\r\n const skeleton = skinnedMesh.skeleton;\r\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\r\n\r\n const orderedCloneBones = [];\r\n\r\n for (let i = 0; i < skeleton.bones.length; ++i)\r\n {\r\n const cloneBone = cloneBones[skeleton.bones[i].name];\r\n orderedCloneBones.push(cloneBone);\r\n }\r\n\r\n cloneSkinnedMesh.bind(\r\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\r\n cloneSkinnedMesh.matrixWorld);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n set_shadow_config(scene, cast, receive)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n child.castShadow = cast;\r\n child.receiveShadow = receive;\r\n }\r\n });\r\n }\r\n\r\n __find_object(scene, object_name, result_callback)\r\n {\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n result_callback(obj);\r\n }\r\n });\r\n }\r\n\r\n get_object(scene, object_name)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n\r\n get_object_by_type(scene, object_type)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.constructor.name === object_type)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n}\r\n\r\nconst model_utilities = new ModelUtilities();\r\nexport { model_utilities as ModelUtilities };\r\n","class ObjectUtilities\r\n{\r\n static is_object(item)\r\n {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n }\r\n\r\n static merge_deep(target, ...sources)\r\n {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (ObjectUtilities.is_object(target) && ObjectUtilities.is_object(source))\r\n {\r\n for (const key in source)\r\n {\r\n if (ObjectUtilities.is_object(source[key]))\r\n {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n ObjectUtilities.merge_deep(target[key], source[key]);\r\n }\r\n else\r\n {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return ObjectUtilities.merge_deep(target, ...sources);\r\n }\r\n\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport { ObjectUtilities };\r\n","class StringUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static get_random_color()\r\n {\r\n const hexValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];\r\n let hex = '#';\r\n\r\n for (let i = 0; i < 6; i++)\r\n {\r\n const index = Math.floor(Math.random() * hexValues.length);\r\n hex += hexValues[index];\r\n }\r\n\r\n return hex;\r\n }\r\n\r\n static capitalize(string)\r\n {\r\n const words = string.split(' ');\r\n\r\n for (let i = 0; i < words.length; i++)\r\n {\r\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\r\n }\r\n\r\n return words.join(' ');\r\n }\r\n\r\n static capitalize_first_letter(string)\r\n {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n\r\n static snake_to_camelcase(string)\r\n {\r\n return string.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\r\n }\r\n}\r\n\r\nexport { StringUtilities };\r\n","class TimeUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Converts a time string (00:00:00.45) into miliseconds\r\n time_str_to_ms(time_str)\r\n {\r\n time_str = time_str.split(':');\r\n\r\n let hours = Number(time_str[0]);\r\n hours = hours * 60 * 60 * 1000;\r\n\r\n let minutes = Number(time_str[1]);\r\n minutes = minutes * 60 * 1000;\r\n\r\n let seconds = Number(time_str[2]);\r\n seconds = seconds * 1000;\r\n\r\n return hours + minutes + seconds;\r\n }\r\n}\r\n\r\nexport { TimeUtilities };\r\n","class Validation\r\n{\r\n constructor()\r\n {}\r\n\r\n static is_int(n)\r\n {\r\n return Number(n) === n && n % 1 === 0;\r\n }\r\n\r\n static is_float(n)\r\n {\r\n return Number(n) === n && n % 1 !== 0;\r\n }\r\n\r\n static is_number(n)\r\n {\r\n return this.is_int(n) || this.is_float(n);\r\n }\r\n\r\n static is_json(str)\r\n {\r\n try\r\n {\r\n JSON.parse(str);\r\n }\r\n catch (e)\r\n {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\nexport { Validation };\r\n","// @ts-check\r\n// @ts-ignore\r\nimport grid_frag from '../shaders/grid/grid.frag';\r\n// @ts-ignore\r\nimport grid_vert from '../shaders/grid/grid.vert';\r\n\r\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\r\n\r\nimport { Mesh } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\n\r\nclass Grid extends Mesh\r\n{\r\n constructor()\r\n {\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Color('#919191') }\r\n },\r\n vertexShader: grid_vert,\r\n fragmentShader: grid_frag,\r\n // @ts-ignore\r\n extensions: { derivatives: true },\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\r\n\r\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\r\n\r\n super(non_indexed_geometry, material);\r\n\r\n this.rotation.x = -3.14 / 2;\r\n }\r\n}\r\n\r\nexport { Grid };\r\n","// @ts-check\r\n// @ts-ignore\r\nimport line_vs from '../shaders/basic_line/basic_line.vert';\r\n// @ts-ignore\r\nimport line_fs from '../shaders/basic_line/basic_line.frag';\r\n\r\nimport { Mesh, Vector3 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nclass Line extends Mesh\r\n{\r\n /**\r\n * @param {Vector3[]} [points]\r\n */\r\n constructor(points)\r\n {\r\n const geometry = new BufferGeometry();\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\r\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\r\n\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _Thickness: { value: 0.2 },\r\n _Length: { value: 0 },\r\n _ElapsedTime: { value: 0 },\r\n _Color: { value: new Color('#FF0000') }\r\n },\r\n vertexShader: line_vs,\r\n fragmentShader: line_fs,\r\n transparent: true,\r\n depthWrite: false,\r\n // @ts-ignore\r\n extensions: { derivatives: true }\r\n\r\n });\r\n\r\n super(geometry, material);\r\n this.material = material;\r\n if (points)\r\n {\r\n this.setup(points);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n */\r\n setup(points)\r\n {\r\n const vertices = [];\r\n const next_position = [];\r\n const previous_position = [];\r\n const orientation = [];\r\n const coverage = [];\r\n let accumulated_length = 0;\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(1);\r\n\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(-1);\r\n\r\n const next_point = this.__get_next_position(points, i);\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n const previous_point = this.__get_previous_position(points, i);\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n coverage.push(accumulated_length);\r\n coverage.push(accumulated_length);\r\n\r\n if (i < points.length - 1)\r\n {\r\n accumulated_length += points[i].distanceTo(next_point);\r\n }\r\n }\r\n const vertexList = new Float32Array(vertices);\r\n const nextPositionList = new Float32Array(next_position);\r\n const previousPositionList = new Float32Array(previous_position);\r\n const orientationList = new Float32Array(orientation);\r\n const coverageList = new Float32Array(coverage);\r\n\r\n const indices = [];\r\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\r\n {\r\n const index = (i * 2) + 1;\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index - 1);\r\n\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 1);\r\n }\r\n\r\n this.geometry.setIndex(indices);\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('position')).copy(new BufferAttribute(vertexList, 3));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('next_position')).copy(new BufferAttribute(nextPositionList, 3));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('previous_position')).copy(new BufferAttribute(previousPositionList, 3));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('orientation')).copy(new BufferAttribute(orientationList, 1));\r\n /** @type {BufferAttribute} */(this.geometry.getAttribute('coverage')).copy(new BufferAttribute(coverageList, 1));\r\n\r\n this.geometry.getAttribute('position').needsUpdate = true;\r\n this.geometry.getAttribute('next_position').needsUpdate = true;\r\n this.geometry.getAttribute('previous_position').needsUpdate = true;\r\n this.geometry.getAttribute('orientation').needsUpdate = true;\r\n this.geometry.getAttribute('coverage').needsUpdate = true;\r\n\r\n this.material.uniforms._Length.value = accumulated_length;\r\n this._length = accumulated_length;\r\n this.accumulated_length = accumulated_length;\r\n }\r\n\r\n set thickness(value)\r\n {\r\n this.material.uniforms._Thickness.value = value;\r\n }\r\n\r\n get thickness()\r\n {\r\n return this.material.uniforms._Thickness.value;\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n * @param {number} i\r\n * @returns {Vector3}\r\n */\r\n __get_previous_position(points, i)\r\n {\r\n if (i === 0)\r\n {\r\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\r\n }\r\n else\r\n {\r\n return points[i - 1];\r\n }\r\n }\r\n\r\n /**\r\n * @param {Vector3[]} points\r\n * @param {number} i\r\n * @returns {Vector3}\r\n */\r\n __get_next_position(points, i)\r\n {\r\n if (i === points.length - 1)\r\n {\r\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\r\n }\r\n else\r\n {\r\n return points[i + 1];\r\n }\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n distance()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n total_length()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n if (this.parent)\r\n {\r\n this.parent.remove(this);\r\n }\r\n }\r\n\r\n set color(col)\r\n {\r\n this.material.uniforms._Color.value.set(col);\r\n }\r\n\r\n get color()\r\n {\r\n return this.material.uniforms._Color.value;\r\n }\r\n\r\n /**\r\n * @param {Color} col\r\n */\r\n copy_color(col)\r\n {\r\n this.material.uniforms._Color.value.copy(col);\r\n }\r\n}\r\n\r\nexport { Line };\r\n","// @ts-check\r\n// @ts-ignore\r\nimport basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\r\n// @ts-ignore\r\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\r\n\r\nimport { Mesh, Texture } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { DoubleSide } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nclass WorldImage extends Mesh\r\n{\r\n /**\r\n * @param {Texture} texture\r\n * @param {Vector2} [pivot]\r\n */\r\n constructor(texture, pivot)\r\n {\r\n pivot = pivot || new Vector2(0, 0);\r\n const material = new ShaderMaterial({\r\n uniforms: {\r\n _MainTex: { value: texture },\r\n _ScreenAligned: { value: 0 },\r\n _Scale: { value: 1 },\r\n _Opacity: { value: 1 }\r\n },\r\n vertexShader: basic_texture_vert,\r\n fragmentShader: basic_texture_frag,\r\n transparent: true,\r\n depthWrite: false,\r\n side: DoubleSide\r\n });\r\n const geometry = new PlaneGeometry(1, 1, 1);\r\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\r\n const current_scale = texture.image.width / texture.image.height;\r\n geometry.scale(current_scale, 1, 1);\r\n super(geometry, material);\r\n this.current_scale = current_scale;\r\n this.geometry.computeBoundingBox();\r\n\r\n this.tmp_bb_size = new Vector3();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n this.material = material;\r\n }\r\n\r\n update_texture()\r\n {\r\n this.material.uniforms._MainTex.value.needsUpdate = true;\r\n const img = this.material.uniforms._MainTex.value.image;\r\n\r\n this.geometry.scale(1 / this.current_scale, 1, 1);\r\n this.current_scale = img.width / img.height;\r\n this.geometry.scale(this.current_scale, 1, 1);\r\n this.geometry.computeBoundingBox();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n }\r\n\r\n get size()\r\n {\r\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\r\n }\r\n\r\n set size(value)\r\n {\r\n this.scale.copy(value);\r\n this.material.uniforms._Scale.value = value;\r\n }\r\n\r\n set screen_aligned(boolean)\r\n {\r\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\r\n }\r\n\r\n get screen_aligned()\r\n {\r\n return this.material.uniforms._ScreenAligned.value === 1;\r\n }\r\n\r\n set opacity(opacity)\r\n {\r\n this.material.uniforms._Opacity.value = opacity;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.material.uniforms._Opacity.value;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.parent.remove(this);\r\n this.material.uniforms._MainTex.value.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n\r\nexport { WorldImage };\r\n","// @ts-check\r\nimport { WorldImage } from './WorldImage';\r\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\r\n\r\nimport { LinearMipMapLinearFilter, Vector2 } from 'three'; // eslint-disable-line no-unused-vars\r\nimport { LinearFilter } from 'three';\r\n\r\nclass Text2D extends WorldImage\r\n{\r\n /**\r\n * @param {string} text\r\n * @param {string} font\r\n * @param {string | Number} color\r\n * @param {Vector2} pivot\r\n * @param {boolean} [is_static]\r\n */\r\n constructor(text, font, color, pivot, is_static) // eslint-disable-line no-unused-vars\r\n {\r\n const simple_text_drawer = new SimpleTextDrawer();\r\n\r\n const draw_settings = {\r\n font: font,\r\n font_color: color || '#000000'\r\n };\r\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\r\n\r\n canvas_texture.minFilter = LinearMipMapLinearFilter;\r\n canvas_texture.minFilter = LinearFilter;\r\n canvas_texture.needsUpdate = true;\r\n super(canvas_texture, pivot);\r\n\r\n this.simple_text_drawer = simple_text_drawer;\r\n this.canvas_texture = canvas_texture;\r\n this.draw_settings = draw_settings;\r\n }\r\n\r\n set text(value)\r\n {\r\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\r\n this.update_texture();\r\n }\r\n\r\n get text()\r\n {\r\n return 'not implemented';\r\n }\r\n}\r\n\r\nexport { Text2D };\r\n","// @ts-check\r\nimport { BufferGeometry, Material, Mesh } from 'three'; // eslint-disable-line no-unused-vars\r\n\r\nclass UpdatableMaterialMesh extends Mesh\r\n{\r\n /**\r\n * @param {BufferGeometry} geometry\r\n * @param {Material} material\r\n */\r\n constructor(geometry, material)\r\n {\r\n super(geometry, material);\r\n this.material = material;\r\n const self = this;\r\n\r\n this.onBeforeRender = () =>\r\n {\r\n if ('update' in self.material && typeof self.material.update === 'function')\r\n {\r\n self.material.update();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport { UpdatableMaterialMesh };\r\n","import { Vector2, Vector4 } from 'three';\r\n\r\nclass TextGlyph\r\n{\r\n constructor(offset, plane_bounds, atlas_bounds)\r\n {\r\n const width = plane_bounds.right - plane_bounds.left;\r\n const height = plane_bounds.top - plane_bounds.bottom;\r\n\r\n this.scale = new Vector2(width, height);\r\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\r\n\r\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\r\n }\r\n}\r\n\r\nexport { TextGlyph };\r\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\r\nimport { TextGlyph } from './TextGlyph';\r\n\r\nclass SDFText\r\n{\r\n constructor(glyph_layout, text = '')\r\n {\r\n this.glyph_layout = glyph_layout;\r\n\r\n this.glyphs = [];\r\n\r\n this.glyph_is_dirty = true;\r\n this.matrix_is_dirty = true;\r\n this.color_is_dirty = true;\r\n\r\n this.position = new Vector3();\r\n this.quaternion = new Quaternion();\r\n this.scale = new Vector3(1, 1, 1);\r\n this.matrix = new Matrix4();\r\n\r\n this.color = new Color('#FFFFFF');\r\n\r\n this.pivot_point = new Vector2();\r\n this.__opacity = 1;\r\n\r\n this.__text = text;\r\n\r\n this.__generate_glyphs(text);\r\n }\r\n\r\n set text(value)\r\n {\r\n this.__text = value;\r\n this.__generate_glyphs(value);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n get text()\r\n {\r\n return this.__text;\r\n }\r\n\r\n update_matrix()\r\n {\r\n this.matrix.compose(this.position, this.quaternion, this.scale);\r\n this.matrix_is_dirty = false;\r\n this.glyph_is_dirty = true;\r\n }\r\n\r\n clear_glyph_dirty()\r\n {\r\n this.glyph_is_dirty = false;\r\n }\r\n\r\n clear_color_dirty()\r\n {\r\n this.color_is_dirty = false;\r\n }\r\n\r\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\r\n {\r\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\r\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\r\n\r\n this.quaternion.copy(new_orientation.multiply(new_tilt));\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_position(pos)\r\n {\r\n this.position.copy(pos);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_size(size)\r\n {\r\n this.scale.set(size, size, size);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_color(col)\r\n {\r\n this.color.set(col);\r\n this.color_is_dirty = true;\r\n }\r\n\r\n set_pivot(pivot)\r\n {\r\n this.pivot_point.copy(pivot);\r\n this.update_glyphs();\r\n }\r\n\r\n set opacity(op)\r\n {\r\n this.__opacity = op;\r\n this.color_is_dirty = true;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.__opacity;\r\n }\r\n\r\n update_glyphs()\r\n {\r\n this.__generate_glyphs(this.text);\r\n }\r\n\r\n __generate_glyphs(text)\r\n {\r\n let cursor = 0;\r\n\r\n this.glyphs.length = 0;\r\n\r\n for (let i = 0; i < text.length; i++)\r\n {\r\n const unicode = text.charCodeAt(i);\r\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\r\n if (glyph)\r\n {\r\n if (glyph.planeBounds)\r\n {\r\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\r\n this.glyphs.push(text_glyph);\r\n }\r\n cursor += glyph.advance;\r\n }\r\n }\r\n\r\n const box2 = new Box2();\r\n const first_glyph = this.glyphs[0];\r\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\r\n\r\n for (let i = 1; i < this.glyphs.length; i++)\r\n {\r\n const g = this.glyphs[i];\r\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\r\n box2.union(box);\r\n }\r\n\r\n const box2_size = new Vector2();\r\n box2.getSize(box2_size);\r\n for (let i = 0; i < this.glyphs.length; i++)\r\n {\r\n this.glyphs[i].position.x -= box2_size.x / 2;\r\n this.glyphs[i].position.y -= box2_size.y / 2;\r\n\r\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\r\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\r\n }\r\n\r\n this.glyph_is_dirty = true;\r\n }\r\n}\r\n\r\nexport { SDFText };\r\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\r\n\r\nimport frag from '../shaders/sdf_text/sdf_text.frag';\r\nimport vert from '../shaders/sdf_text/sdf_text.vert';\r\n\r\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\r\nimport { OMath } from '../utilities/OMath';\r\n\r\nclass SDFTextMaterial extends BaseShaderMaterial\r\n{\r\n constructor(texture)\r\n {\r\n super(vert, frag, {\r\n _Texture: { value: texture },\r\n _Boldness: { value: 0.5 },\r\n _AtlasSize: { value: new Vector2(1, 1) }\r\n });\r\n\r\n this.transparent = true;\r\n this.extensions = {\r\n derivatives: true\r\n };\r\n this.depthWrite = false;\r\n this.side = DoubleSide;\r\n texture.minFilter = LinearFilter;\r\n texture.magFilter = LinearFilter;\r\n texture.generateMipMaps = false;\r\n }\r\n\r\n set_atlas_size(size)\r\n {\r\n this.uniforms._AtlasSize.value.copy(size);\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\r\n }\r\n}\r\n\r\nexport { SDFTextMaterial };\r\n","import { SDFText } from './SDFText';\r\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\r\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\r\n\r\nimport {\r\n PlaneGeometry,\r\n Mesh,\r\n Vector2,\r\n InstancedBufferGeometry,\r\n InstancedBufferAttribute,\r\n Float32BufferAttribute,\r\n DynamicDrawUsage\r\n} from 'three';\r\n\r\nclass SDFTextBatch extends Mesh\r\n{\r\n constructor(font_layout, atlas_texture)\r\n {\r\n const max_allocations = 2000;\r\n\r\n const instanced_geometry = new InstancedBufferGeometry();\r\n instanced_geometry.instanceCount = 0;\r\n\r\n const geometry = new PlaneGeometry(1, 1);\r\n geometry.translate(0.5, 0.5, 0);\r\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\r\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\r\n instanced_geometry.index = geometry.index;\r\n\r\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n transformsCol0.usage = DynamicDrawUsage;\r\n transformsCol1.usage = DynamicDrawUsage;\r\n transformsCol2.usage = DynamicDrawUsage;\r\n transformsCol3.usage = DynamicDrawUsage;\r\n glyph_bounds.usage = DynamicDrawUsage;\r\n plane_bounds.usage = DynamicDrawUsage;\r\n color.usage = DynamicDrawUsage;\r\n\r\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\r\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\r\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\r\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\r\n\r\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\r\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\r\n instanced_geometry.setAttribute('color', color);\r\n\r\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\r\n\r\n this.text_elements = [];\r\n this.font_layout = font_layout;\r\n\r\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\r\n\r\n this.frustumCulled = false;\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.material.set_boldness(value);\r\n }\r\n\r\n add_text(text_str)\r\n {\r\n const elem = new SDFText(this.font_layout.glyphs, text_str);\r\n this.text_elements.push(elem);\r\n return elem;\r\n }\r\n\r\n remove_text(text_elem)\r\n {\r\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\r\n this.update(true);\r\n }\r\n\r\n update(force_update)\r\n {\r\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\r\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\r\n\r\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\r\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\r\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\r\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\r\n\r\n const color_atr = this.geometry.getAttribute('color');\r\n\r\n let matrix_needs_update = force_update === true;\r\n let glyph_needs_update = force_update === true;\r\n let color_needs_update = force_update === true;\r\n\r\n let glyph_count = 0;\r\n for (let i = 0; i < this.text_elements.length; i++)\r\n {\r\n const text = this.text_elements[i];\r\n\r\n if (text.matrix_is_dirty)\r\n {\r\n matrix_needs_update = true;\r\n text.update_matrix();\r\n }\r\n\r\n if (text.glyph_is_dirty)\r\n {\r\n glyph_needs_update = true;\r\n text.clear_glyph_dirty();\r\n }\r\n\r\n if (text.color_is_dirty)\r\n {\r\n color_needs_update = true;\r\n text.clear_color_dirty();\r\n }\r\n\r\n const matrix = text.matrix;\r\n const color = text.color;\r\n const opacity = text.opacity;\r\n\r\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\r\n {\r\n const glyph = text.glyphs[glyph_i];\r\n\r\n const buffer_i = glyph_count;\r\n\r\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\r\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\r\n\r\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\r\n matrix.elements[1],\r\n matrix.elements[2],\r\n matrix.elements[3]);\r\n\r\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\r\n matrix.elements[5],\r\n matrix.elements[6],\r\n matrix.elements[7]);\r\n\r\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\r\n matrix.elements[9],\r\n matrix.elements[10],\r\n matrix.elements[11]);\r\n\r\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\r\n matrix.elements[13],\r\n matrix.elements[14],\r\n matrix.elements[15]);\r\n\r\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\r\n\r\n glyph_count++;\r\n }\r\n }\r\n\r\n this.geometry.instanceCount = glyph_count;\r\n\r\n if (glyph_count > this.max_allocations)\r\n {\r\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\r\n }\r\n\r\n if (matrix_needs_update)\r\n {\r\n transformsCol0.needsUpdate = true;\r\n transformsCol1.needsUpdate = true;\r\n transformsCol2.needsUpdate = true;\r\n transformsCol3.needsUpdate = true;\r\n }\r\n if (glyph_needs_update)\r\n {\r\n glyph_bounds_atr.needsUpdate = true;\r\n plane_bounds_atr.needsUpdate = true;\r\n }\r\n if (color_needs_update)\r\n {\r\n color_atr.needsUpdate = true;\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n\r\nexport { SDFTextBatch };\r\n","// @ts-check\r\nimport { Vector3 } from 'three';\r\nimport { ActionInterpolator } from './ActionInterpolator';\r\n\r\nclass VectorInterpolator extends ActionInterpolator\r\n{\r\n /**\r\n * @param {string} attribute_name\r\n * @param {Vector3} [from]\r\n * @param {Vector3} [to]\r\n * @param {import('../utilities/EasingFunctions').EasingFunctionType | function} [easing_function]\r\n */\r\n constructor(attribute_name, from = new Vector3(), to = new Vector3(1, 1, 1), easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n }\r\n\r\n /**\r\n * @param {any} context\r\n * @param {number} t\r\n */\r\n update(context, t)\r\n {\r\n const tmp = this.from.clone();\r\n tmp.lerp(this.to, this.easing_function(t));\r\n context[this.attribute_name].copy(tmp);\r\n }\r\n}\r\n\r\nexport { VectorInterpolator };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\r\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\r\n\r\nclass DualFilteringBlurMaterial extends BlitMaterial\r\n{\r\n constructor(upsample)\r\n {\r\n super(upsample ? upsample_frag : downsample_frag);\r\n }\r\n}\r\n\r\nexport { DualFilteringBlurMaterial };\r\n","import { BlitMaterial } from './BlitMaterial';\r\n\r\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\r\n\r\nclass AlphaFilterMaterial extends BlitMaterial\r\n{\r\n constructor(use_alpha_mask, upsample)\r\n {\r\n super(frag);\r\n }\r\n\r\n set offset(value)\r\n {\r\n this.uniforms._Offset.value = value;\r\n }\r\n\r\n get offset()\r\n {\r\n return this.uniforms._Offset.value;\r\n }\r\n}\r\n\r\nexport { AlphaFilterMaterial };\r\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\r\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\r\nimport { Graphics } from '../Graphics';\r\nimport { WebGLRenderTarget } from 'three';\r\nclass DualFilteringBlurrer\r\n{\r\n constructor(use_alpha_mask)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n this.RT0 = new WebGLRenderTarget(1, 1);\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.RT3 = new WebGLRenderTarget(1, 1);\r\n this.RT4 = new WebGLRenderTarget(1, 1);\r\n\r\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\r\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\r\n\r\n this.alpha_filter_mat = new AlphaFilterMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n this.check_RT_resize(RT.width, RT.height);\r\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\r\n\r\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\r\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\r\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\r\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\r\n\r\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\r\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\r\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\r\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\r\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\r\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\r\n\r\n // return this.RT2;\r\n }\r\n\r\n check_RT_resize(width, height)\r\n {\r\n if (this.current_width !== width || this.current_height !== height)\r\n {\r\n this.current_width = width;\r\n this.current_height = height;\r\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\r\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\r\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\r\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\r\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\r\n }\r\n }\r\n}\r\n\r\nexport { DualFilteringBlurrer };\r\n","import { BlitMaterial } from '../materials/BlitMaterial';\r\n\r\nimport frag from '../shaders/median_filter/median_filter.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nclass MedianFilterMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, undefined, {\r\n kernel3x3: true\r\n });\r\n\r\n this.uniforms._SourceTex = { value: undefined };\r\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\r\n }\r\n\r\n set_texture(tex)\r\n {\r\n this.uniforms._SourceTex.value = tex;\r\n\r\n const size = this.get_size(tex);\r\n this.uniforms._SourceTexSize.value.copy(size);\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n\r\nexport { MedianFilterMaterial };\r\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\r\nimport { Graphics } from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\r\n\r\nclass MedianFilter\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n this.RT1 = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n\r\n this.median_filter_mat = new MedianFilterMaterial();\r\n }\r\n\r\n filter(texture)\r\n {\r\n const tex_size = this.get_size(texture);\r\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\r\n {\r\n this.RT.setSize(tex_size.x, tex_size.y);\r\n this.RT1.setSize(tex_size.x, tex_size.y);\r\n }\r\n\r\n this.median_filter_mat.set_texture(texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n\r\n for (let i = 0; i < 0; i++)\r\n {\r\n this.median_filter_mat.set_texture(this.RT.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT1);\r\n\r\n this.median_filter_mat.set_texture(this.RT1.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n }\r\n\r\n return this.RT;\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n\r\nexport { MedianFilter };\r\n","import { Graphics } from '../Graphics';\r\n\r\nimport { FloatType, HalfFloatType, NearestFilter, NoColorSpace, RGBAFormat, WebGLRenderTarget } from 'three';\r\nimport { Capabilities } from '../Capabilities';\r\n\r\nclass ParticleAttribute\r\n{\r\n constructor(attr_name, update_material)\r\n {\r\n this.read = undefined;\r\n this.write = undefined;\r\n\r\n this.name = attr_name;\r\n\r\n this.update_material = update_material;\r\n }\r\n\r\n init_from_geometry(geometry)\r\n {\r\n // overrided by inheritance\r\n }\r\n\r\n init_from_attribute(particle_attribute)\r\n {\r\n\r\n }\r\n\r\n build_RT(particle_count)\r\n {\r\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\r\n const options = {\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter,\r\n format: RGBAFormat,\r\n colorScape: NoColorSpace,\r\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\r\n stencilBuffer: false,\r\n depthBuffer: false\r\n };\r\n\r\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\r\n }\r\n\r\n static calculate_resolution(particle_count)\r\n {\r\n const width = Math.min(particle_count, 512);\r\n const height = Math.max(1, Math.ceil(particle_count / width));\r\n return { width, height };\r\n }\r\n\r\n swap_RT()\r\n {\r\n const tmp = this.read;\r\n this.read = this.write;\r\n this.write = tmp;\r\n }\r\n\r\n update(attribute_writter_scene)\r\n {\r\n if (this.update_material)\r\n {\r\n this.update_material.update();\r\n attribute_writter_scene.children[0].material = this.update_material;\r\n this.update_material.uniforms._MainTex.value = this.read.texture;\r\n Graphics.render(attribute_writter_scene, undefined, this.write);\r\n attribute_writter_scene.children[0].material = undefined;\r\n\r\n this.swap_RT();\r\n }\r\n }\r\n\r\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\r\n {\r\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\r\n attribute_writter_scene.children[0].material = storage_material;\r\n\r\n Graphics.render(attribute_writter_scene, undefined, RT);\r\n\r\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\r\n attribute_writter_scene.children[0].material = undefined;\r\n }\r\n\r\n get_texture()\r\n {\r\n return this.read.texture;\r\n }\r\n}\r\n\r\nexport { ParticleAttribute };\r\n","import { Object3D } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Scene } from 'three';\r\nimport { Points } from 'three';\r\nimport { InstancedBufferGeometry } from 'three';\r\nimport { InstancedBufferAttribute } from 'three';\r\nimport { ParticleAttribute } from './ParticleAttribute';\r\n\r\nclass GPUParticleSystem extends Object3D\r\n{\r\n constructor(particle_count, material)\r\n {\r\n super();\r\n this.attributes = [];\r\n\r\n this.mesh = this.build_point_mesh(particle_count, material);\r\n this.add(this.mesh);\r\n\r\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\r\n this.attribute_writter_scene = new Scene();\r\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\r\n }\r\n\r\n add_texture_attribute(buffer_attribute)\r\n {\r\n this.attributes.push(buffer_attribute);\r\n }\r\n\r\n add_update_attribute_array(name, array, item_size)\r\n {\r\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\r\n }\r\n\r\n add_attribute_array(name, array, item_size)\r\n {\r\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\r\n }\r\n\r\n update()\r\n {\r\n this.mesh.material.update();\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n this.attributes[i].update(this.attribute_writter_scene);\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.mesh.geometry.dispose();\r\n this.mesh.material.dispose();\r\n }\r\n\r\n build_point_mesh(instance_count = 1, material)\r\n {\r\n const geo = new PlaneGeometry();\r\n\r\n const instanced_geo = new InstancedBufferGeometry();\r\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\r\n instanced_geo.index = geo.index;\r\n\r\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\r\n instanced_geo.instanceCount = instance_count;\r\n const mesh = new Mesh(instanced_geo, material);\r\n mesh.frustumCulled = false;\r\n return mesh;\r\n }\r\n\r\n build_attribute_writter_mesh(particle_count)\r\n {\r\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\r\n\r\n const uvs = new Float32Array(particle_count * 3);\r\n\r\n for (let i = 0; i < particle_count; i++)\r\n {\r\n const x = i % width;\r\n const y = Math.floor(i / width);\r\n uvs[i * 3 + 0] = (x + 0.5) / width;\r\n uvs[i * 3 + 1] = (y + 0.5) / height;\r\n uvs[i * 3 + 2] = i;\r\n }\r\n const geo = new BufferGeometry();\r\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\r\n\r\n const points = new Points(geo);\r\n points.frustumCulled = false;\r\n return points;\r\n }\r\n\r\n build_uv_storage_attribute(particle_count)\r\n {\r\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\r\n\r\n const uvs = new Float32Array(particle_count * 2);\r\n\r\n for (let i = 0; i < particle_count; i++)\r\n {\r\n const x = i % width;\r\n const y = Math.floor(i / width);\r\n uvs[i * 2 + 0] = (x + 0.5) / width;\r\n uvs[i * 2 + 1] = (y + 0.5) / height;\r\n }\r\n return new InstancedBufferAttribute(uvs, 2, false);\r\n }\r\n}\r\n\r\nexport { GPUParticleSystem };\r\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { NoBlending } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\n\r\nclass ParticleStorageMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n const vert = `\r\n varying vec4 value;\r\n attribute vec4 data;\r\n\r\n void main()\r\n {\r\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\r\n gl_PointSize = 1.0;\r\n\r\n value = data;\r\n }\r\n `;\r\n super({\r\n uniforms: {\r\n\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n }\r\n}\r\n\r\nexport { ParticleStorageMaterial };\r\n","import { BufferAttribute } from 'three';\r\n\r\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\r\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\r\n\r\nclass ParticlePositionAttribute extends ParticleAttribute\r\n{\r\n constructor(update_material)\r\n {\r\n super('_Position', update_material);\r\n }\r\n\r\n store_geometry(geometry, attribute_writter_scene)\r\n {\r\n const pos_attr = geometry.getAttribute('position');\r\n this.read = this.build_RT(pos_attr.count);\r\n this.write = this.build_RT(pos_attr.count);\r\n\r\n const mat = new ParticleStorageMaterial();\r\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\r\n }\r\n\r\n store_positions(positions, attribute_writter_scene)\r\n {\r\n this.read = this.build_RT(positions.length);\r\n this.write = this.build_RT(positions.length);\r\n\r\n const arr = new Float32Array(positions.length * 4);\r\n\r\n for (let i = 0; i < positions.length; i++)\r\n {\r\n arr[i * 4 + 0] = positions[i].x;\r\n arr[i * 4 + 1] = positions[i].y;\r\n arr[i * 4 + 2] = positions[i].z;\r\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\r\n }\r\n const mat = new ParticleStorageMaterial();\r\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\r\n }\r\n}\r\n\r\nexport { ParticlePositionAttribute };\r\n","import { DataTexture } from 'three';\r\n\r\nclass CustomDataTexture extends DataTexture\r\n{\r\n constructor(data, width, height, format, type)\r\n {\r\n super(data, width, height, format, type);\r\n this.multiplier = 1;\r\n }\r\n\r\n set_rgba(index, r, g, b, a)\r\n {\r\n this.data[index * 3 + 0] = r * this.multiplier;\r\n this.data[index * 3 + 1] = g * this.multiplier;\r\n this.data[index * 3 + 2] = b * this.multiplier;\r\n this.data[index * 3 + 3] = a * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_rgb(index, r, g, b)\r\n {\r\n this.data[index * 3 + 0] = r * this.multiplier;\r\n this.data[index * 3 + 1] = g * this.multiplier;\r\n this.data[index * 3 + 2] = b * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_r(index, value)\r\n {\r\n this.data[index * 3 + 0] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_g(index, value)\r\n {\r\n this.data[index * 3 + 1] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_b(index, value)\r\n {\r\n this.data[index * 3 + 2] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n\r\n set_a(index, value)\r\n {\r\n this.data[index * 3 + 2] = value * this.multiplier;\r\n this.needsUpdate = true;\r\n }\r\n}\r\n\r\nexport { CustomDataTexture };\r\n","import { RGBAFormat } from 'three';\r\nimport { CustomDataTexture } from './CustomDataTexture';\r\n\r\nclass RGBDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Uint8Array(width * height * 3);\r\n super(data, width, height, RGBAFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n\r\nexport { RGBDataTexture };\r\n","import { CustomDataTexture } from './CustomDataTexture';\r\nimport { RGBAFormat } from 'three';\r\n\r\nclass RGBADataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Uint8Array(width * height * 4);\r\n super(data, width, height, RGBAFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n\r\nexport { RGBADataTexture };\r\n","import { FloatType, RGBAFormat } from 'three';\r\nimport { CustomDataTexture } from './CustomDataTexture';\r\n\r\nclass RGBFloatDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Float32Array(width * height * 3);\r\n super(data, width, height, RGBAFormat, FloatType);\r\n }\r\n}\r\n\r\nexport { RGBFloatDataTexture };\r\n","import { CustomDataTexture } from './CustomDataTexture';\r\nimport { FloatType } from 'three';\r\nimport { RGBAFormat } from 'three';\r\n\r\nclass RGBAFloatDataTexture extends CustomDataTexture\r\n{\r\n constructor(width, height)\r\n {\r\n const data = new Float32Array(width * height * 4);\r\n super(data, width, height, RGBAFormat, FloatType);\r\n }\r\n}\r\n\r\nexport { RGBAFloatDataTexture };\r\n","import { Mesh } from 'three';\r\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\r\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\r\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\r\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\r\n\r\nclass BatchedMesh extends Mesh\r\n{\r\n constructor(id_table, geometry, material, max_texture_width)\r\n {\r\n super(geometry, material);\r\n\r\n this.id_table = id_table;\r\n this.batched_count = Object.keys(id_table).length;\r\n this.max_texture_width = max_texture_width;\r\n this.batch_width = this.batched_count % max_texture_width;\r\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\r\n }\r\n\r\n attach_rgb_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgba_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgb_float_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n attach_rgba_float_texture(uniform_name)\r\n {\r\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\r\n }\r\n\r\n get_mesh_index(name)\r\n {\r\n return this.id_table[name];\r\n }\r\n\r\n set_rgb_value(uniform_name, mesh_name, r, g, b)\r\n {\r\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\r\n }\r\n\r\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\r\n {\r\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\r\n }\r\n}\r\n\r\nexport { BatchedMesh };\r\n","import { BatchedMesh } from './BatchedMesh';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { BufferAttribute } from 'three';\r\n\r\nclass MeshBatcher\r\n{\r\n batch(meshes, material)\r\n {\r\n const max_texture_width = 2048;\r\n // let texture_width = meshes.length % max_texture_width;\r\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\r\n\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n const geometries = [];\r\n const id_table = {};\r\n\r\n const attr_mesh_id = [];\r\n\r\n for (let i = 0; i < meshes.length; i++)\r\n {\r\n const mesh = meshes[i];\r\n const vertex_count = mesh.geometry.getAttribute('position').count;\r\n\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_mesh_id.push(i);\r\n }\r\n\r\n geometries.push(mesh.geometry);\r\n\r\n if (id_table[mesh.name] === undefined)\r\n {\r\n id_table[mesh.name] = i;\r\n }\r\n else\r\n {\r\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\r\n }\r\n }\r\n\r\n const buffer_geometry = BufferGeometryUtils.mergeGeometries(geometries);\r\n\r\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\r\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\r\n\r\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\r\n }\r\n\r\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\r\n {\r\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\r\n }\r\n}\r\n\r\nexport { MeshBatcher };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\r\n\r\nclass FontLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFontLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (font) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, font);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FontLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nclass JSONLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n fetch(this.url).then((response) =>\r\n {\r\n response.json().then((json) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, json);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { JSONLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\r\n\r\nclass OBJLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TOBJLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (obj) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, obj);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { OBJLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Vector3 } from 'three';\r\nimport { FileLoader } from 'three';\r\n\r\nclass PointArrayLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new FileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (text) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n parse_path(raw_data)\r\n {\r\n const string_array = raw_data.split('\\n');\r\n\r\n if (string_array[string_array.length - 1] === '')\r\n {\r\n string_array.pop();\r\n }\r\n\r\n const positions = [];\r\n\r\n for (let i = 0; i < string_array.length; i += 3)\r\n {\r\n const x = parseFloat(string_array[i + 0]);\r\n const y = parseFloat(string_array[i + 1]);\r\n const z = parseFloat(string_array[i + 2]);\r\n positions.push(new Vector3(x, y, z));\r\n }\r\n return positions;\r\n // let curve = new THREE.CatmullRomCurve3(positions);\r\n // return curve.getPoints(100);\r\n }\r\n}\r\n\r\nexport { PointArrayLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nclass VideoLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { VideoLoader };\r\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["AxisHelper","Object3D","constructor","scale","super","blue_points","push","Vector3","blue_axis_mat","LineBasicMaterial","color","depthFunc","AlwaysDepth","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","this","add","set","update","dispose","scene_manager","init","_current","Scene","name","add_scene","current","scene","traverse","child","geometry","mat","material","children","length","remove","Cube","Mesh","size","segments","BoxGeometry","x","y","z","MeshBasicMaterial","Sphere","radius","SphereGeometry","center","position","Arrow","dir","cylinder_height","cylinder_geo","CylinderGeometry","translate","cone_geometry","ConeGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeGeometries","rotateX","quaternion","setFromUnitVectors","_dir","value","oscreen","width","height","Vector2","render_width","render_height","width_height","dpr","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","multiplyScalar","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","Color","clear_alpha","copy","camera","camera_manager","undefined","_spectator","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","OrthographicCamera","TOrthographicCamera","left","right","top","bottom","BaseRender","render","on_enter","context","renderer","on_exit","resize","BlitMaterial","ShaderMaterial","frag_shader","vert_shader","defines","uniforms","_MainTex","_Resolution","_TargetResolution","vertexShader","fragmentShader","depthWrite","blending","NoBlending","depthTest","Blitter","_blit_scene","_blit_material","_blit_quad","PlaneGeometry","_blit_camera","blit","src","dst","src_texture","isWebGLRenderTarget","texture","src_width","image","src_height","getSize","__render","material_pass","blit_with_material","blit_clear_with_material","dst_RT","RT","current_rt","getRenderTarget","setRenderTarget","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","Vector4","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","OScreen","clear_depth_normal_mat","depth_normal_material","graphics","__resize_RT_if_necessary","clear","CameraManager","setSize","render_target","canvas","core_attributes","context_attributes","threejs_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","force_webgl2","xr_enabled","alpha","antialias","depth","desynchronized","failIfMajorPerformanceCaveat","powerPreference","premultipliedAlpha","preserveDrawingBuffer","stencil","logarithmicDepthBuffer","Object","assign","getContext","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","extensions","get","domElement","Capabilities","getMaxAnisotropy","maxVertexTextures","is_floating_point_texture_available","dom_element","depth_normals_RT","set_state","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","SceneManager","compile","compile_async","target_scene","promise","compileAsync","render_scene","on_pre_render","on_post_render","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","on_resize","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","Math","ceil","divisions_y","old_dpr","getPixelRatio","ctx_2D","document","createElement","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","minFilter","NearestFilter","magFilter","format","RGBAFormat","colorSpace","LinearSRGBColorSpace","type","FloatType","stencilBuffer","depthBuffer","output","Float32Array","abs","BaseShaderMaterial","vert","frag","basic_vert","basic_frag","_Color","ScreenSpaceTextureMaterial","w","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","tex","set_screen_size","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","ctx","draw_arrow","origin","arrow","clone","normalize","draw_axis","axis","set_debug_RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clearRect","draw_line_2D","from","to","strokeStyle","beginPath","moveTo","lineTo","closePath","stroke","draw_line","points","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","distanceTo","sub","forward_dir","draw_plane","basic_color_vert","basic_color_frag","transparent","plane","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","sphere_mesh","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","i","draw_texture","mesh","time","__delta_buffer","__previous_elapsed_time","__delta_time","__smooth_delta_time","__elapsed_time","__frame_interpolation_t","fixed_delta_time","elapsed_time","delta_time","smooth_delta_time","frame_interpolation","fdt","dt","sdt","__set_frame_interpolation","__update","shift","__calculate_smooth_delta_time","OMath","linear_map","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","between","min","max","mod","number","divisor","rgb_to_hex","rgb","r","round","toString","g","b","project_points_on_plane","projected_point","points_on_plane","projectPoint","matrix4_lerp","target","t","elements","lerp","equals","x1","x2","clamp","euclideanModulo","n","m","pingpong","degToRad","degrees","PI","radToDeg","radians","deg_to_rad","rad_to_deg","perspective_divide","v","points_average","get_random_color","arr","col","floor","random","saturate","ActionEvent","method","args","trigger","ViewApi","application","split","EasingFunctions","linear","triangular","ease_in_sine","cos","ease_out_sine","sin","ease_in_out_sine","ease_in_cubic","ease_out_cubic","pow","ease_in_out_cubic","ease_in_quad","ease_out_quad","ease_in_out_quad","ease_in_quart","ease_out_quart","ease_in_out_quart","ease_in_quint","ease_out_quint","ease_in_out_quint","ease_in_expo","ease_out_expo","ease_in_out_expo","ease_in_circ","sqrt","ease_out_circ","ease_in_out_circ","ease_in_back","ease_out_back","ease_in_out_back","ease_in_elastic","c4","ease_out_elastic","ease_in_out_elastic","ease_in_bounce","ease_out_bounce","n1","d1","ease_in_out_bounce","heartbeat","sign","ActionInterpolator","easing_function","attribute_name","ActionSequencer","previous_elapsed_time","playback_speed","__get_playback_speed","playing","action_events","initial_context","JSON","parse","stringify","tmp_t","channels","channel_names","keys","duration","play","stop","reset","skip","get_duration","__play_clips","set_progress","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","console","error","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","__play_events","evaluate_keyframe","log","get_keyframes","channel_name","is_channel_redefined","initial","Infinity","distance","transitions_velocity","URLSearchParams","window","location","search","Number","set_initial_value_on_channel","set_final_value_on_channel","NumberInterpolator","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","data","getAttribute","get_node_x_position","parseFloat","includes","split_data","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","action_event","state","longest_time","from_draw_io","xml","transition_data","track_time","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_default_state_data","ViewState","start","before_enter","before_exit","before_update","fixed_update","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_exit_transition","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","Time","transition_manager","transition_handler","get_current_state","set_transitions_velocity","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","TransitionManager","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","warn","set_opacity","view_manager","views","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","url","__change_browser_title","go_to_scene","scene_name","next_view","transition_view","set_next_view","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_by_url","history","pushState","title","__capitalize","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","RenderLoop","target_application","input","BaseApplication","is_running","frames_passed","time_accumulator","on_post_start","ViewManager","ViewComponentManager","Debug","on_frame_end","setAnimationLoop","bind","loop","AddMaterial","use_half_float","USE_LINEAR_COLOR_SPACE","_SecondTex","set_add_texture","UnrealBloomComposeMaterial","nMips","use_linear_color_space","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","set_RT_0","rt","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_tint_color_0","col_string","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","AbstractLoader","resource_id","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","__loading_ended","__set_error","message","print_error","load","resource_container","resources_by_url","cache","fetch","mode","credentials","redirect","then","on_progress","catch","__on_error","set_resource","response","response_clone","reader","body","getReader","contentLength","headers","receivedLength","done","read","ok","on_preloaded_finished","status","statusText","is_int","is_float","AudioClip","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","resources","resource","get_resource","AsyncAbstractLoader","assets","worker","ResourceContainer","bound_on_message","on_message","__setup_worker","assets_loaders","__setup_loaders","postMessage","loader_name","is_loaded","asset_loader","original_url","__get_loaded_bytes","__get_total_bytes","get_assets_names","names","asset","create_worker","Worker","addEventListener","e","__on_assets_loaded","removeEventListener","AsyncAudiosLoader","loaders","asset_data","GLTFDRACOLoader","loader","GLTFLoader","setDRACOLoader","gltf","xhr","msg","TGLTFLoader","AsyncObjectsLoader","draco","draco_loader","browser","browser_name","agent","navigator","userAgent","toLowerCase","has_web_xr_support","is_vr","isSessionSupported","indexOf","opr","chrome","version","get_version","is_safari","is_chrome","is_firefox","is_edge","is_edge_chromium","has_webm","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","appName","appVersion","splice","AsyncTextureLoader","flipY","premultiplyAlpha","colorSpaceConversion","Browser","load_with_old_method","load_with_new_method","Texture","Image","onload","SRGBColorSpace","NoColorSpace","needsUpdate","onerror","fetchOptions","res","createImageBitmap","imageOrientation","imageBitmap","BasisLoader","basis","CubemapLoader","extension","CubeTextureLoader","setPath","urls","HDRCubeTextureLoader","THDRCubeTextureLoader","hdr","RGBETextureLoader","RGBELoader","AsyncTexturesLoader","kind","CompilatorManager","compilators","first_update","index","finished","LoadingState","SceneCompilator","TexturesCompilator","AudiosCompilator","callback_called","set_assets","scene_objects","scene_textures","scene_sounds","custom_loaders","custom_compilators","custom_data","loading_progress","progress","setup_loader","assets_worker","object_loader","textures_loader","audios_loader","compilator_manager","is_compiled","HighQualityLoadingState","on_high_quality_assets_ready","RegularLoadingState","on_assets_ready_called","on_assets_ready","on_assets_compiled","AbstractScene","initialized","is_high_loaded","loading_states","regular","high","current_loading_state","set_loading_state","get_objects","objects","dispose_cpu","attributes","array","normal","uv","map","mipmaps","Uint8Array","set_high_assets","update_loading_state","ApplicationView","container","current_opacity","classList","opacity","style","CanvasDrawer","uses_dynamic_font","__textHeight","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","measureText","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","generateMipmaps","roundRect","fill","tl","tr","br","bl","defaultRadius","side","_side","quadraticCurveTo","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","animate","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","target_geometry","target_position","set_target_geometry","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","add_global_uniform","set_global_uniform","add_object_uniform_v3","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","add_object_uniform_v4","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","add_object_uniform_v4_float","__create_rgba_float_texture","set_object_uniform_v3","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","set_object_uniform_v4","vector4","use_a","__set_pixel_rgba","upload_texture_data","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","get_uniform_dirty_count","texture_data","copyTextureToTexture","get_mesh","v3","v4","DataTexture","dst_texture","one_pixel_text","geometry_batcher","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","tmp_vec","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","project","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","boolean","depth_offset","clear_state","visible","set_world_space_coordinate_system","set_screen_space_coordinate_system","get_size","update_state","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","ui","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","delete_element","elem","add_screen_space_element","add_world_space_element","NDC","Graphics","current_clicked_element","PerspectiveFrustumPointFitter","fit_points","camera_quaternion","vertical_fov","v_fov","h_fov","atan","tan","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","applyQuaternion","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","Plane","setFromNormalAndCoplanarPoint","down_plane","left_plane","right_plane","apply_center_correction_to_pos","closest_distance","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_horizontal_correction","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","distV","distH","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","getCenter","distance_to_center","camera_utilities","tmp_mat","Matrix4","ray","Ray","tmp_size","tmp_unproj","get_up_dir","get_forward_dir","get_right_dir","unproject_mouse_position","get_plane_intersection","plane_position","plane_normal","isPerspectiveCamera","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","projected_points_center","up","cross","inverse_mat","getInverse","applyMatrix4","projected_center","zoom","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","world_pos_to_screen","update_projection","fit_bounding_box_points","p1","p2","p3","p4","p5","p6","p7","p8","camera_backward_dir","fitter","camera_pos","reference_position_plane","camera_ray","reference_position","camera_position","result","reference_rotation","reference_zoom","forward","initializer","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","render_loop","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","on_key_down","on_key_up","keyCode","ctrlKey","code","press_key","release_key","pressed","released","key_name","key","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","NormalMaterial","DebugNormalsRender","DisplayNormalTextureMaterial","depth_normals_vert","_InverseProjMatrix","SSAOComposeMaterial","_AO","SSAOMaterial","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","use_ssaa","ssao_mat","ssao_compose_mat","debug_normals","ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","set_radius","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","set_threshold","value_01","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","HalfFloatType","UnsignedByteType","renderTargetBright","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","get_blurred_texture","get_blurred_RT","dispose_RT","hor","ver","texture_height","dispose_materials","set_luminosity_threshold","UnrealBloomRender","use_antialiasing","use_hight_luminosity_pass","use_rendering_size","add_mat","rt_settings","samples","bloom_compose_mat","luminosity_threshold","val","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","screen","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","merge_from_to","source","apply","expand_vec3_array","items_left_count","remove_elem","get_closest_point","closest_point","object_values_to_array","obj","ids","FrustumPointFitter","get_hozirontal_correction","closest_up_point","closest_down_point","closest_right_point","closest_left_point","GeometryUtilities","convert_to_non_indexed_geometry","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","HTMLUtilities","load_images","images","dataset","image_objects","image_object","load_videos","videos","video","load_iframes","iframes","iframe","load_elements","selector","ImageUtilities","get_image_data","getImageData","get_pixel","imagedata","mesh_sampler","sample","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","set_shadow_config","cast","receive","castShadow","receiveShadow","__find_object","get_object","get_object_by_type","object_type","ObjectUtilities","is_object","item","Array","isArray","merge_deep","sources","xml_to_json","nodeType","attribute","nodeName","nodeValue","hasChildNodes","childNodes","old","StringUtilities","hexValues","hex","capitalize","words","substr","capitalize_first_letter","charAt","snake_to_camelcase","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","Validation","is_json","str","Grid","derivatives","plane_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","generateMipMaps","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","filter","tex_size","ParticleAttribute","attr_name","update_material","write","init_from_geometry","init_from_attribute","particle_attribute","build_RT","particle_count","resolution","calculate_resolution","colorScape","swap_RT","attribute_writter_scene","store_geometry_attribute_in_RT","storage_material","deleteAttribute","get_texture","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","add_texture_attribute","add_update_attribute_array","item_size","add_attribute_array","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","store_geometry","pos_attr","store_positions","CustomDataTexture","multiplier","set_rgba","set_rgb","set_r","set_g","set_b","set_a","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","attach_rgb_texture","attach_rgba_texture","attach_rgb_float_texture","attach_rgba_float_texture","get_mesh_index","set_rgb_value","mesh_name","set_rgba_value","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","JSONLoader","json","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","TextLoader","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
|