ohzi-core 6.14.2 → 6.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +9 -9
  2. package/build/index.module.js +1 -1
  3. package/build/index.module.js.map +1 -1
  4. package/package.json +51 -51
  5. package/src/.vscode/settings.json +2 -2
  6. package/src/BaseApplication.js +23 -23
  7. package/src/Browser.js +79 -79
  8. package/src/CameraManager.js +19 -19
  9. package/src/Capabilities.js +11 -11
  10. package/src/Configuration.js +22 -22
  11. package/src/CustomBezierCurve.js +44 -44
  12. package/src/Debug.js +260 -260
  13. package/src/EventManager.js +150 -150
  14. package/src/Graphics.js +337 -337
  15. package/src/Initializer.js +57 -57
  16. package/src/Input.js +66 -66
  17. package/src/KeyboardInput.js +135 -135
  18. package/src/OS.js +58 -58
  19. package/src/OScreen.js +74 -74
  20. package/src/OrthographicCamera.js +13 -13
  21. package/src/PerspectiveCamera.js +13 -13
  22. package/src/ReflectionPlaneContext.js +17 -17
  23. package/src/RenderLayers.js +28 -28
  24. package/src/RenderLoop.js +97 -97
  25. package/src/RenderOrder.js +38 -38
  26. package/src/ResourceContainer.js +39 -39
  27. package/src/SceneManager.js +44 -44
  28. package/src/Screen.js +54 -54
  29. package/src/Time.js +57 -57
  30. package/src/UI.js +90 -90
  31. package/src/action_sequencer/ActionEvent.js +15 -15
  32. package/src/action_sequencer/ActionInterpolator.js +23 -23
  33. package/src/action_sequencer/ActionSequencer.js +246 -246
  34. package/src/action_sequencer/NumberInterpolator.js +25 -25
  35. package/src/action_sequencer/VectorInterpolator.js +20 -20
  36. package/src/blitter_index.js +13 -13
  37. package/src/canvas_drawer/CanvasDrawer.js +111 -111
  38. package/src/canvas_drawer/MultiLineTextDrawer.js +49 -49
  39. package/src/canvas_drawer/SimpleTextDrawer.js +47 -47
  40. package/src/components/AudioClip.js +55 -55
  41. package/src/components/AxisHelper.js +58 -58
  42. package/src/components/BaseObject.js +45 -45
  43. package/src/components/EdgeMesh.js +151 -151
  44. package/src/components/GeometryEdgeVisualizer.js +45 -45
  45. package/src/components/Grid.js +33 -33
  46. package/src/components/Line.js +199 -199
  47. package/src/components/MultiLinePath.js +19 -19
  48. package/src/components/MultiLineText2D.js +62 -62
  49. package/src/components/ObjectAxis.js +20 -20
  50. package/src/components/ObjectOrientedBoundingBox.js +201 -201
  51. package/src/components/PlaneHelper.js +36 -36
  52. package/src/components/Shape2D.js +42 -42
  53. package/src/components/Shape3D.js +38 -38
  54. package/src/components/Text2D.js +39 -39
  55. package/src/components/UIElement.js +208 -208
  56. package/src/components/UpdatableMaterialMesh.js +16 -16
  57. package/src/components/WorldImage.js +91 -91
  58. package/src/components/mouse_interactors/ObjectRotator.js +61 -61
  59. package/src/components/sdf_text/SDFText.js +154 -154
  60. package/src/components/sdf_text/SDFTextBatch.js +193 -193
  61. package/src/components/sdf_text/TextGlyph.js +15 -15
  62. package/src/data_textures/CustomDataTexture.js +51 -51
  63. package/src/data_textures/RGBADataTexture.js +12 -12
  64. package/src/data_textures/RGBAFloatDataTexture.js +12 -12
  65. package/src/data_textures/RGBDataTexture.js +12 -12
  66. package/src/data_textures/RGBFloatDataTexture.js +12 -12
  67. package/src/editor/ManipulatorHandle.js +70 -70
  68. package/src/editor/ObjectEditor.js +66 -66
  69. package/src/editor/ObjectManipulator.js +118 -118
  70. package/src/editor/ObjectPicker.js +75 -75
  71. package/src/editor/shaders/object_picker.frag +5 -5
  72. package/src/editor/shaders/object_picker.vert +7 -7
  73. package/src/gpu_particles/GPUParticleSystem.js +87 -87
  74. package/src/gpu_particles/ParticleAttribute.js +83 -83
  75. package/src/gpu_particles/ParticlePositionAttribute.js +20 -20
  76. package/src/html_utilities/CSSAnimator.js +64 -64
  77. package/src/html_utilities/css_animator_states/Animating.js +45 -45
  78. package/src/html_utilities/css_animator_states/Idle.js +25 -25
  79. package/src/index.js +217 -217
  80. package/src/materials/AddMaterial.js +17 -17
  81. package/src/materials/AlphaFilterMaterial.js +20 -20
  82. package/src/materials/BaseShaderMaterial.js +19 -19
  83. package/src/materials/BlitMaterial.js +28 -28
  84. package/src/materials/BloomComposeMaterial.js +22 -22
  85. package/src/materials/BoxBlurMaterial.js +13 -13
  86. package/src/materials/ClearAlphaMaterial.js +13 -13
  87. package/src/materials/ClearColorMaterial.js +31 -31
  88. package/src/materials/ClearDepthNormalMaterial.js +13 -13
  89. package/src/materials/DeferredRendererComposeMaterial.js +32 -32
  90. package/src/materials/DepthNormalMaterial.js +28 -28
  91. package/src/materials/DisplayNormalTextureMaterial.js +15 -15
  92. package/src/materials/DualFilteringBlurMaterial.js +11 -11
  93. package/src/materials/FXAAMaterial.js +10 -10
  94. package/src/materials/GaussianBlurMaterial.js +28 -28
  95. package/src/materials/LuminosityHighPassMaterial.js +15 -15
  96. package/src/materials/MedianFilterMaterial.js +42 -42
  97. package/src/materials/NormalMaterial.js +17 -17
  98. package/src/materials/SDFScreenTextMaterial.js +31 -31
  99. package/src/materials/SDFTextMaterial.js +37 -37
  100. package/src/materials/SSAOComposeMaterial.js +11 -11
  101. package/src/materials/SSAOMaterial.js +66 -66
  102. package/src/materials/ScreenSpaceTextureMaterial.js +65 -65
  103. package/src/materials/UIElementMaterial.js +27 -27
  104. package/src/materials/UnrealBloomComposeMaterial.js +95 -95
  105. package/src/materials/UnrealBlurMaterial.js +17 -17
  106. package/src/materials/UnrealComposeMaterial.js +24 -24
  107. package/src/materials/ViewPositionMaterial.js +17 -17
  108. package/src/materials/deferred/DeferredPointLightMaterial.js +39 -39
  109. package/src/materials/gpu_particles/AttributeUpdateMaterial.js +33 -33
  110. package/src/materials/gpu_particles/BasicParticleMaterial.js +23 -23
  111. package/src/materials/gpu_particles/ParticleStorageMaterial.js +27 -27
  112. package/src/materials/gpu_particles/PositionStorageMaterial.js +10 -10
  113. package/src/object_pool/Pool.js +73 -73
  114. package/src/primitives/Arrow.js +57 -57
  115. package/src/primitives/Cube.js +17 -17
  116. package/src/primitives/HorizontalPlane.js +18 -18
  117. package/src/primitives/Sphere.js +15 -15
  118. package/src/primitives/VerticalPlane.js +17 -17
  119. package/src/raycast/GroupRaycaster.js +41 -41
  120. package/src/raycast/PlaneDragResolver.js +89 -89
  121. package/src/raycast/PlaneRaycastResolver.js +22 -22
  122. package/src/raycast/PlaneRaycaster.js +23 -23
  123. package/src/raycast/RaycastResolver.js +22 -22
  124. package/src/raycast/SurfaceDragResolver.js +77 -77
  125. package/src/raycast/states/BaseState.js +16 -16
  126. package/src/raycast/states/IdleState.js +17 -17
  127. package/src/raycast/states/OnRaycastEnter.js +15 -15
  128. package/src/raycast/states/OnRaycastExit.js +16 -16
  129. package/src/raycast/states/OnRaycastHover.js +25 -25
  130. package/src/render_mode/BaseRender.js +32 -32
  131. package/src/render_mode/BloomRender.js +61 -61
  132. package/src/render_mode/DebugNormalsRender.js +20 -20
  133. package/src/render_mode/DeferredRender.js +112 -112
  134. package/src/render_mode/NormalAORender.js +71 -71
  135. package/src/render_mode/NormalRender.js +36 -36
  136. package/src/render_mode/OutlineRender.js +154 -154
  137. package/src/render_mode/PlanarReflectionsRender.js +118 -118
  138. package/src/render_mode/TransparencyMixRender.js +143 -143
  139. package/src/render_mode/UnrealBloomRender.js +109 -109
  140. package/src/render_utilities/Blitter.js +99 -99
  141. package/src/render_utilities/Blurrer.js +29 -29
  142. package/src/render_utilities/DepthAndNormalsRenderer.js +45 -45
  143. package/src/render_utilities/DualFilteringBlurrer.js +56 -56
  144. package/src/render_utilities/GaussianBlurrer.js +146 -146
  145. package/src/render_utilities/MedianFilter.js +66 -66
  146. package/src/render_utilities/ViewPositionRenderer.js +48 -48
  147. package/src/resource_loader/BasisLoader.js +49 -49
  148. package/src/resource_loader/FontLoader.js +46 -46
  149. package/src/resource_loader/GLTFDRACOLoader.js +2 -8
  150. package/src/resource_loader/JSONLoader.js +30 -30
  151. package/src/resource_loader/OBJLoader.js +46 -46
  152. package/src/resource_loader/PointArrayLoader.js +70 -70
  153. package/src/resource_loader/RGBETextureLoader.js +49 -49
  154. package/src/resource_loader/VideoLoader.js +30 -30
  155. package/src/shaders/add/add.frag +8 -8
  156. package/src/shaders/anti_aliasing/fxaa.frag +71 -71
  157. package/src/shaders/basic_color/basic_color.frag +5 -5
  158. package/src/shaders/basic_color/basic_color.vert +9 -9
  159. package/src/shaders/basic_line/basic_line.frag +36 -36
  160. package/src/shaders/basic_line/basic_line.vert +36 -36
  161. package/src/shaders/basic_texture/basic_texture.frag +9 -9
  162. package/src/shaders/basic_texture/basic_texture.vert +16 -16
  163. package/src/shaders/bloom/bloom_compose_frag.glsl +22 -22
  164. package/src/shaders/bloom/cheap_bloom_compose_frag.glsl +13 -13
  165. package/src/shaders/box_blur/box_blur.frag +24 -24
  166. package/src/shaders/box_blur/compose.frag +31 -31
  167. package/src/shaders/clear/clear_depth_normal.frag +24 -24
  168. package/src/shaders/copy/copy.frag +6 -6
  169. package/src/shaders/copy/copy.vert +5 -5
  170. package/src/shaders/deferred/blit_copy.vert +11 -11
  171. package/src/shaders/deferred/deferred_compose.frag +59 -59
  172. package/src/shaders/deferred/point_light.frag +66 -66
  173. package/src/shaders/deferred/point_light.vert +13 -13
  174. package/src/shaders/depth_normals/debug_normals.frag +47 -47
  175. package/src/shaders/depth_normals/depth_normals.frag +30 -30
  176. package/src/shaders/depth_normals/depth_normals.vert +12 -12
  177. package/src/shaders/dual_filter_blur/alpha_filter.frag +14 -14
  178. package/src/shaders/dual_filter_blur/downsample.frag +21 -21
  179. package/src/shaders/dual_filter_blur/upsample.frag +24 -24
  180. package/src/shaders/edge_visualizer/edge_visualizer.frag +17 -17
  181. package/src/shaders/edge_visualizer/edge_visualizer.vert +15 -15
  182. package/src/shaders/edges/corners.frag +10 -10
  183. package/src/shaders/edges/corners.vert +30 -30
  184. package/src/shaders/edges/edges.frag +6 -6
  185. package/src/shaders/edges/edges.vert +27 -27
  186. package/src/shaders/gaussian_blur/gaussian_blur.frag +24 -24
  187. package/src/shaders/gaussian_blur/unreal_bloom_compose.frag +24 -24
  188. package/src/shaders/gpu_particles/common_utils.glsl +12 -12
  189. package/src/shaders/gpu_particles/generic_storage.frag +7 -7
  190. package/src/shaders/gpu_particles/store/store_position.vert +14 -14
  191. package/src/shaders/gpu_particles/update/basic_update.frag +20 -20
  192. package/src/shaders/gpu_particles/visualize/visualize.frag +10 -10
  193. package/src/shaders/gpu_particles/visualize/visualize.vert +12 -12
  194. package/src/shaders/grid/grid.frag +16 -16
  195. package/src/shaders/grid/grid.vert +9 -9
  196. package/src/shaders/luminosity_high_pass/luminosity_high_pass.frag +22 -22
  197. package/src/shaders/median_filter/median_filter.frag +134 -134
  198. package/src/shaders/normal/normal.frag +6 -6
  199. package/src/shaders/normal/normal.vert +6 -6
  200. package/src/shaders/sdf_text/sdf_screen_text.frag +51 -51
  201. package/src/shaders/sdf_text/sdf_screen_text.vert +41 -41
  202. package/src/shaders/sdf_text/sdf_text.frag +53 -53
  203. package/src/shaders/sdf_text/sdf_text.vert +41 -41
  204. package/src/shaders/ssao/hbao.frag +264 -264
  205. package/src/shaders/ssao/ssao.frag +95 -95
  206. package/src/shaders/ssao/ssao.vert +10 -10
  207. package/src/shaders/ssao/ssao_compose.frag +14 -14
  208. package/src/shaders/transparent_mix/copy.frag +6 -6
  209. package/src/shaders/transparent_mix/transparent_mix.frag +18 -18
  210. package/src/shaders/transparent_mix/transparent_mix.vert +7 -7
  211. package/src/shaders/ui/ss_texture.frag +10 -10
  212. package/src/shaders/ui/ss_texture.vert +31 -31
  213. package/src/shaders/ui/ws_texture.vert +38 -38
  214. package/src/shaders/ui_element/ui_element.frag +11 -11
  215. package/src/shaders/ui_element/ui_element.vert +32 -32
  216. package/src/shaders/unreal_blur/unreal_blur.frag +24 -24
  217. package/src/shaders/unreal_blur/unreal_compose.frag +23 -23
  218. package/src/shaders/write_view_position/write_view_position.frag +6 -6
  219. package/src/shaders/write_view_position/write_view_position.vert +8 -8
  220. package/src/static_batcher/BatchedMesh.js +54 -54
  221. package/src/static_batcher/GeometryBatch.js +312 -312
  222. package/src/static_batcher/GeometryBatcher.js +63 -63
  223. package/src/static_batcher/MeshBatcher.js +56 -56
  224. package/src/ui/ui_element_position/ScreenSpacePosition.js +14 -14
  225. package/src/ui/ui_element_position/WorldSpacePosition.js +21 -21
  226. package/src/ui/ui_element_state/OnIdle.js +17 -17
  227. package/src/ui/ui_element_state/OnMouseEnter.js +26 -26
  228. package/src/ui/ui_element_state/OnMouseExit.js +15 -15
  229. package/src/ui/ui_element_state/OnMouseHover.js +31 -31
  230. package/src/ui/ui_element_state/UIElementState.js +18 -18
  231. package/src/utilities/ArrayUtilities.js +55 -55
  232. package/src/utilities/CameraUtilities.js +210 -210
  233. package/src/utilities/EasingFunctions.js +226 -226
  234. package/src/utilities/FrustumPointFitter.js +255 -255
  235. package/src/utilities/GeometryUtilities.js +74 -74
  236. package/src/utilities/HTMLUtilities.js +44 -44
  237. package/src/utilities/ImageUtilities.js +26 -26
  238. package/src/utilities/MeshSampler.js +152 -152
  239. package/src/utilities/ModelUtilities.js +161 -161
  240. package/src/utilities/OMath.js +155 -155
  241. package/src/utilities/OrthographicFrustumPointFitter.js +47 -47
  242. package/src/utilities/PerspectiveFrustumPointFitter.js +250 -250
  243. package/src/utilities/StringUtilities.js +32 -32
  244. package/src/utilities/TimeUtilities.js +22 -22
  245. package/src/utilities/Validation.js +34 -34
  246. package/src/view_components/ApplicationView.js +75 -75
  247. package/src/view_components/ViewComponent.js +72 -72
  248. package/src/view_components/ViewComponentManager.js +68 -68
  249. package/src/view_components/ViewContext.js +14 -14
  250. package/src/view_components/ViewManager.js +180 -180
  251. package/src/view_components/ViewState.js +54 -54
  252. package/src/view_components/transition/ActionSequencerBuilder.js +106 -106
  253. package/src/view_components/transition/DrawIOAnimationSheet.js +90 -90
  254. package/src/view_components/transition/TransitionTable.js +54 -54
  255. package/src/view_components/transition/ViewStateTransitionHandler.js +96 -96
  256. package/types/BaseApplication.d.ts +8 -8
  257. package/types/Browser.d.ts +12 -12
  258. package/types/CameraManager.d.ts +8 -8
  259. package/types/Capabilities.d.ts +6 -6
  260. package/types/Configuration.d.ts +6 -6
  261. package/types/Debug.d.ts +38 -38
  262. package/types/EventManager.d.ts +42 -42
  263. package/types/Graphics.d.ts +35 -35
  264. package/types/Initializer.d.ts +4 -4
  265. package/types/Input.d.ts +170 -170
  266. package/types/OS.d.ts +18 -18
  267. package/types/OScreen.d.ts +18 -18
  268. package/types/OrthographicCamera.d.ts +5 -5
  269. package/types/PerspectiveCamera.d.ts +5 -5
  270. package/types/ReflectionPlaneContext.d.ts +6 -6
  271. package/types/RenderLayers.d.ts +6 -6
  272. package/types/RenderLoop.d.ts +12 -12
  273. package/types/ResourceContainer.d.ts +8 -8
  274. package/types/SceneManager.d.ts +10 -10
  275. package/types/Screen.d.ts +17 -17
  276. package/types/Time.d.ts +11 -11
  277. package/types/UI.d.ts +15 -15
  278. package/types/action_sequencer/ActionEvent.d.ts +6 -6
  279. package/types/action_sequencer/ActionInterpolator.d.ts +5 -5
  280. package/types/action_sequencer/ActionSequencer.d.ts +30 -30
  281. package/types/action_sequencer/NumberInterpolator.d.ts +8 -8
  282. package/types/action_sequencer/VectorInterpolator.d.ts +7 -7
  283. package/types/canvas_drawer/CanvasDrawer.d.ts +13 -13
  284. package/types/canvas_drawer/MultiLineTextDrawer.d.ts +5 -5
  285. package/types/canvas_drawer/SimpleTextDrawer.d.ts +5 -5
  286. package/types/components/AudioClip.d.ts +12 -12
  287. package/types/components/AxisHelper.d.ts +6 -6
  288. package/types/components/BaseObject.d.ts +5 -5
  289. package/types/components/EdgeMesh.d.ts +13 -13
  290. package/types/components/GeometryEdgeVisualizer.d.ts +4 -4
  291. package/types/components/Grid.d.ts +2 -2
  292. package/types/components/Line.d.ts +16 -16
  293. package/types/components/MultiLinePath.d.ts +4 -4
  294. package/types/components/MultiLineText2D.d.ts +10 -10
  295. package/types/components/ObjectAxis.d.ts +3 -3
  296. package/types/components/ObjectOrientedBoundingBox.d.ts +18 -18
  297. package/types/components/PlaneHelper.d.ts +6 -6
  298. package/types/components/Shape2D.d.ts +4 -4
  299. package/types/components/Shape3D.d.ts +3 -3
  300. package/types/components/Text2D.d.ts +13 -13
  301. package/types/components/UIElement.d.ts +52 -52
  302. package/types/components/UpdatableMaterialMesh.d.ts +4 -4
  303. package/types/components/WorldImage.d.ts +13 -13
  304. package/types/components/sdf_text/SDFText.d.ts +30 -30
  305. package/types/components/sdf_text/SDFTextBatch.d.ts +12 -12
  306. package/types/components/sdf_text/TextGlyph.d.ts +6 -6
  307. package/types/editor/ManipulatorHandle.d.ts +14 -14
  308. package/types/editor/ObjectEditor.d.ts +16 -16
  309. package/types/editor/ObjectManipulator.d.ts +19 -19
  310. package/types/editor/ObjectPicker.d.ts +16 -16
  311. package/types/gpu_particles/GPUParticleSystem.d.ts +12 -12
  312. package/types/gpu_particles/ParticleAttribute.d.ts +15 -15
  313. package/types/gpu_particles/ParticlePositionAttribute.d.ts +4 -4
  314. package/types/html_utilities/CSSAnimator.d.ts +30 -30
  315. package/types/html_utilities/css_animator_states/Animating.d.ts +8 -8
  316. package/types/html_utilities/css_animator_states/Idle.d.ts +6 -6
  317. package/types/index.d.ts +90 -90
  318. package/types/materials/AddMaterial.d.ts +5 -5
  319. package/types/materials/AlphaFilterMaterial.d.ts +6 -6
  320. package/types/materials/BaseShaderMaterial.d.ts +3 -3
  321. package/types/materials/BlitMaterial.d.ts +3 -3
  322. package/types/materials/BloomComposeMaterial.d.ts +7 -7
  323. package/types/materials/BoxBlurMaterial.d.ts +4 -4
  324. package/types/materials/ClearAlphaMaterial.d.ts +3 -3
  325. package/types/materials/ClearColorMaterial.d.ts +7 -7
  326. package/types/materials/ClearDepthNormalMaterial.d.ts +4 -4
  327. package/types/materials/DeferredRendererComposeMaterial.d.ts +7 -7
  328. package/types/materials/DepthNormalMaterial.d.ts +4 -4
  329. package/types/materials/DisplayNormalTextureMaterial.d.ts +4 -4
  330. package/types/materials/DualFilteringBlurMaterial.d.ts +4 -4
  331. package/types/materials/FXAAMaterial.d.ts +3 -3
  332. package/types/materials/GaussianBlurMaterial.d.ts +6 -6
  333. package/types/materials/LuminosityHighPassMaterial.d.ts +4 -4
  334. package/types/materials/MedianFilterMaterial.d.ts +6 -6
  335. package/types/materials/NormalMaterial.d.ts +2 -2
  336. package/types/materials/SDFScreenTextMaterial.d.ts +11 -11
  337. package/types/materials/SDFTextMaterial.d.ts +12 -12
  338. package/types/materials/SSAOComposeMaterial.d.ts +4 -4
  339. package/types/materials/SSAOMaterial.d.ts +6 -6
  340. package/types/materials/ScreenSpaceTextureMaterial.d.ts +7 -7
  341. package/types/materials/UIElementMaterial.d.ts +7 -7
  342. package/types/materials/UnrealBloomComposeMaterial.d.ts +17 -17
  343. package/types/materials/UnrealBlurMaterial.d.ts +4 -4
  344. package/types/materials/UnrealComposeMaterial.d.ts +4 -4
  345. package/types/materials/ViewPositionMaterial.d.ts +3 -3
  346. package/types/materials/deferred/DeferredPointLightMaterial.d.ts +10 -10
  347. package/types/materials/gpu_particles/ParticleStorageMaterial.d.ts +3 -3
  348. package/types/materials/gpu_particles/PositionStorageMaterial.d.ts +4 -4
  349. package/types/object_pool/Pool.d.ts +10 -10
  350. package/types/primitives/Arrow.d.ts +8 -8
  351. package/types/primitives/Cube.d.ts +3 -3
  352. package/types/primitives/HorizontalPlane.d.ts +3 -3
  353. package/types/primitives/Sphere.d.ts +3 -3
  354. package/types/primitives/VerticalPlane.d.ts +3 -3
  355. package/types/raycast/GroupRaycaster.d.ts +13 -13
  356. package/types/raycast/PlaneDragResolver.d.ts +14 -14
  357. package/types/raycast/PlaneRaycastResolver.d.ts +5 -5
  358. package/types/raycast/PlaneRaycaster.d.ts +7 -7
  359. package/types/raycast/RaycastResolver.d.ts +5 -5
  360. package/types/raycast/SurfaceDragResolver.d.ts +13 -13
  361. package/types/raycast/states/BaseState.d.ts +5 -5
  362. package/types/raycast/states/IdleState.d.ts +5 -5
  363. package/types/raycast/states/OnRaycastEnter.d.ts +5 -5
  364. package/types/raycast/states/OnRaycastExit.d.ts +4 -4
  365. package/types/raycast/states/OnRaycastHover.d.ts +4 -4
  366. package/types/render_mode/BaseRender.d.ts +7 -7
  367. package/types/render_mode/BloomRender.d.ts +10 -10
  368. package/types/render_mode/DebugNormalsRender.d.ts +4 -4
  369. package/types/render_mode/DeferredRender.d.ts +9 -9
  370. package/types/render_mode/NormalAORender.d.ts +16 -16
  371. package/types/render_mode/NormalRender.d.ts +4 -4
  372. package/types/render_mode/OutlineRender.d.ts +20 -20
  373. package/types/render_mode/PlanarReflectionsRender.d.ts +13 -13
  374. package/types/render_mode/TransparencyMixRender.d.ts +21 -21
  375. package/types/render_mode/UnrealBloomRender.d.ts +19 -19
  376. package/types/render_utilities/Blitter.d.ts +16 -16
  377. package/types/render_utilities/Blurrer.d.ts +9 -9
  378. package/types/render_utilities/DepthAndNormalsRenderer.d.ts +12 -12
  379. package/types/render_utilities/DualFilteringBlurrer.d.ts +19 -19
  380. package/types/render_utilities/GaussianBlurrer.d.ts +27 -27
  381. package/types/render_utilities/MedianFilter.d.ts +10 -10
  382. package/types/render_utilities/ViewPositionRenderer.d.ts +9 -9
  383. package/types/resource_loader/AbstractLoader.d.ts +18 -18
  384. package/types/resource_loader/AsyncTextureLoader.ts +6 -6
  385. package/types/resource_loader/AudioLoader.d.ts +8 -8
  386. package/types/resource_loader/BasisLoader.d.ts +6 -6
  387. package/types/resource_loader/CubemapLoader.d.ts +7 -7
  388. package/types/resource_loader/DAELoader.d.ts +6 -6
  389. package/types/resource_loader/DDSLoader.d.ts +6 -6
  390. package/types/resource_loader/FileLoader.d.ts +6 -6
  391. package/types/resource_loader/FontLoader.d.ts +6 -6
  392. package/types/resource_loader/GLTFDRACOLoader.d.ts +6 -7
  393. package/types/resource_loader/GLTFLoader.d.ts +5 -5
  394. package/types/resource_loader/HDRCubeTextureLoader.d.ts +7 -7
  395. package/types/resource_loader/JSONLoader.d.ts +6 -6
  396. package/types/resource_loader/OBJLoader.d.ts +6 -6
  397. package/types/resource_loader/PointArrayLoader.d.ts +7 -7
  398. package/types/resource_loader/RGBETextureLoader.d.ts +6 -6
  399. package/types/resource_loader/ResourceBatch.d.ts +13 -13
  400. package/types/resource_loader/SVGLoader.d.ts +6 -6
  401. package/types/resource_loader/TextLoader.d.ts +6 -6
  402. package/types/resource_loader/TextureLoader.d.ts +6 -6
  403. package/types/resource_loader/VideoLoader.d.ts +6 -6
  404. package/types/static_batcher/GeometryBatch.d.ts +37 -37
  405. package/types/static_batcher/GeometryBatcher.d.ts +7 -7
  406. package/types/ui/ui_element_position/ScreenSpacePosition.d.ts +4 -4
  407. package/types/ui/ui_element_position/WorldSpacePosition.d.ts +5 -5
  408. package/types/ui/ui_element_state/OnIdle.d.ts +5 -5
  409. package/types/ui/ui_element_state/OnMouseEnter.d.ts +5 -5
  410. package/types/ui/ui_element_state/OnMouseExit.d.ts +5 -5
  411. package/types/ui/ui_element_state/OnMouseHover.d.ts +5 -5
  412. package/types/ui/ui_element_state/UIElementState.d.ts +5 -5
  413. package/types/utilities/ArrayUtilities.d.ts +7 -7
  414. package/types/utilities/CameraUtilities.d.ts +24 -24
  415. package/types/utilities/EasingFunctions.d.ts +35 -35
  416. package/types/utilities/FrustumPointFitter.d.ts +14 -14
  417. package/types/utilities/GeometryUtilities.d.ts +4 -4
  418. package/types/utilities/HTMLUtilities.d.ts +10 -10
  419. package/types/utilities/ImageUtilities.d.ts +4 -4
  420. package/types/utilities/MeshSampler.d.ts +14 -14
  421. package/types/utilities/ModelUtilities.d.ts +13 -13
  422. package/types/utilities/OMath.d.ts +21 -21
  423. package/types/utilities/ObjectUtilities.d.ts +16 -16
  424. package/types/utilities/OrthographicFrustumPointFitter.d.ts +7 -7
  425. package/types/utilities/PerspectiveFrustumPointFitter.d.ts +12 -12
  426. package/types/utilities/StringUtilities.d.ts +5 -5
  427. package/types/utilities/TimeUtilities.d.ts +3 -3
  428. package/types/utilities/Validation.d.ts +6 -6
  429. package/types/view_components/ApplicationView.d.ts +20 -20
  430. package/types/view_components/ViewComponent.d.ts +15 -15
  431. package/types/view_components/ViewComponentManager.d.ts +10 -10
  432. package/types/view_components/ViewContext.d.ts +6 -6
  433. package/types/view_components/ViewManager.d.ts +24 -24
  434. package/types/view_components/ViewState.d.ts +15 -15
  435. package/types/view_components/transition/ActionSequencerBuilder.d.ts +15 -15
  436. package/types/view_components/transition/DrawIOAnimationSheet.d.ts +17 -17
  437. package/types/view_components/transition/TransitionTable.d.ts +8 -8
  438. package/types/view_components/transition/ViewStateTransitionHandler.d.ts +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/Screen.js","../src/canvas_drawer/SimpleTextDrawer.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/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.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/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/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/GPUParticleSystem.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/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\r\nclass Browser\r\n{\r\n init()\r\n {\r\n this.browser_name = '';\r\n this.agent = window.navigator.userAgent.toLowerCase();\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 case this.agent.indexOf('opr') > -1 && !!window.opr:\r\n this.browser_name = 'opera';\r\n break;\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\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_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\r\nexport default new Browser();\r\n","export default 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","import Browser from '../Browser';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default 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 = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.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 = Browser.is_safari ? 'no-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 this.on_preloaded_finished(resource_container, response_clone);\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","import { Vector3 } from 'three';\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class 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 = new Vector3();\r\n const points_on_plane = [];\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] = TMath.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\nimport { Math as TMath } from 'three';\r\nimport OMath from '../utilities/OMath';\r\n\r\nexport default class ActionSequencer\r\n{\r\n constructor(context)\r\n {\r\n this.elapsed_time = -0.00001;\r\n this.playback_speed = 1;\r\n this.playing = false;\r\n\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 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 update(delta_time)\r\n {\r\n if (this.playing)\r\n {\r\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\r\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\r\n }\r\n }\r\n\r\n set_progress(time)\r\n {\r\n this.elapsed_time = TMath.clamp(time, 0, this.duration);\r\n this.__play_clips(this.elapsed_time, this.elapsed_time);\r\n }\r\n\r\n set_normalized_progress(t)\r\n {\r\n this.elapsed_time = TMath.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 TMath.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 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 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 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 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 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 __play_clips(from, to)\r\n {\r\n for (let i = 0; i < this.action_events.length; i++)\r\n {\r\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\r\n this.action_events[i].trigger_time < to + Number.EPSILON)\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 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 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(TMath.clamp(this.tmp_t, 0, 1));\r\n }\r\n\r\n get_keyframes(channel_name)\r\n {\r\n return this.channels[channel_name];\r\n }\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 __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 __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","class EasingFunctions\r\n{\r\n constructor()\r\n { }\r\n\r\n linear(x)\r\n {\r\n return x;\r\n }\r\n\r\n triangular(x)\r\n {\r\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\r\n }\r\n\r\n ease_in_sine(x)\r\n {\r\n return 1 - Math.cos(x * 3.1415926 / 2);\r\n }\r\n\r\n ease_out_sine(x)\r\n {\r\n return Math.sin(x * 3.1415926 / 2);\r\n }\r\n\r\n ease_in_out_sine(x)\r\n {\r\n return -(Math.cos(3.1415926 * x) - 1) / 2;\r\n }\r\n\r\n ease_in_cubic(x)\r\n {\r\n return x * x * x;\r\n }\r\n\r\n ease_out_cubic(x)\r\n {\r\n return 1 - Math.pow(1 - x, 3);\r\n }\r\n\r\n 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 ease_in_quad(x)\r\n {\r\n return x * x;\r\n }\r\n\r\n ease_out_quad(x)\r\n {\r\n return 1 - (1 - x) * (1 - x);\r\n }\r\n\r\n 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 ease_in_quart(x)\r\n {\r\n return x * x * x * x;\r\n }\r\n\r\n ease_out_quart(x)\r\n {\r\n return 1 - Math.pow(1 - x, 4);\r\n }\r\n\r\n 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 ease_in_quint(x)\r\n {\r\n return x * x * x * x * x;\r\n }\r\n\r\n ease_out_quint(x)\r\n {\r\n return 1 - Math.pow(1 - x, 5);\r\n }\r\n\r\n 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 ease_in_expo(x)\r\n {\r\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\r\n }\r\n\r\n ease_out_expo(x)\r\n {\r\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\r\n }\r\n\r\n 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 ease_in_circ(x)\r\n {\r\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\r\n }\r\n\r\n ease_out_circ(x)\r\n {\r\n return Math.sqrt(1 - Math.pow(x - 1, 2));\r\n }\r\n\r\n 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 ease_in_back(x)\r\n {\r\n return 2.7015 * x * x * x - 1.7015 * x * x;\r\n }\r\n\r\n 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 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 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 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 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 ease_in_bounce(x)\r\n {\r\n return 1 - this.ease_out_bounce(1 - x);\r\n }\r\n\r\n 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 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 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\nexport default new EasingFunctions();\r\n","import EasingFunctions from '../utilities/EasingFunctions';\r\n\r\nexport default class ActionInterpolator\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\r\n update(context, t)\r\n {\r\n\r\n }\r\n}\r\n","import ActionInterpolator from './ActionInterpolator';\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class NumberInterpolator extends ActionInterpolator\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 update(context, t)\r\n {\r\n context[this.attribute_name] = TMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n\r\n evaluate(t)\r\n {\r\n return TMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n}\r\n","class ViewContext\r\n{\r\n constructor()\r\n {\r\n this.app = undefined;\r\n }\r\n\r\n set_app(app)\r\n {\r\n this.app = app;\r\n }\r\n}\r\n\r\nexport default new ViewContext();\r\n","import ViewContext from '../view_components/ViewContext';\r\n\r\nexport default class ActionEvent\r\n{\r\n constructor(name, method)\r\n {\r\n this.name = name;\r\n this.method = method;\r\n }\r\n\r\n trigger()\r\n {\r\n ViewContext.app[this.name][this.method]();\r\n }\r\n}\r\n","export default 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","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\nexport default class ActionSequencerBuilder\r\n{\r\n constructor(initial_state_data)\r\n {\r\n this.initial_state_data = initial_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.initial_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.initial_state_data);\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);\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)\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: 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","class EventManager\r\n{\r\n init()\r\n {\r\n this.queue = {};\r\n\r\n this.zoom_changed_evt = 'zoom_changed';\r\n this.store_clickd_evt = 'store_clicked';\r\n this.point_selected_evt = 'point_selected';\r\n this.config_changed = 'config_changed';\r\n\r\n this.path_substep_completed = 'path_substep_completed';\r\n this.path_completed = 'path_completed';\r\n this.go_to_store_requested_evt = 'go_to_store_requested';\r\n\r\n this.resource_loaded_evt = 'resource_loaded';\r\n this.service_clicked_evt = 'service_clicked';\r\n this.unit_pos_updated_evt = 'unit_position_updated';\r\n\r\n this.floor_changed_evt = 'floor_changed';\r\n\r\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\r\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\r\n\r\n this.on_enter_floor_selection = 'on_enter_floor_selection';\r\n this.on_exit_floor_selection = 'on_exit_floor_selection';\r\n\r\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\r\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\r\n\r\n this.step_selected_evt = 'step_selected';\r\n }\r\n\r\n fire(event, payload)\r\n {\r\n const queue = this.queue[event];\r\n\r\n if (queue === undefined)\r\n {\r\n return;\r\n }\r\n let i = queue.length;\r\n while (i--)\r\n {\r\n queue[i](payload);\r\n }\r\n }\r\n\r\n on(event, callback)\r\n {\r\n if (typeof this.queue[event] === 'undefined')\r\n {\r\n this.queue[event] = [];\r\n }\r\n\r\n this.queue[event].push(callback);\r\n }\r\n\r\n fire_zoom_changed(zoom)\r\n {\r\n this.fire(this.zoom_changed_evt, zoom);\r\n }\r\n\r\n fire_store_selected(store_id)\r\n {\r\n this.fire(this.store_clickd_evt, store_id);\r\n }\r\n\r\n fire_point_selected(hit_data)\r\n {\r\n this.fire(this.point_selected_evt, hit_data);\r\n }\r\n\r\n fire_config_changed()\r\n {\r\n this.fire(this.config_changed);\r\n }\r\n\r\n fire_path_substep_completed(step_number)\r\n {\r\n this.fire(this.path_substep_completed, step_number);\r\n }\r\n\r\n fire_path_completed()\r\n {\r\n this.fire(this.path_completed);\r\n }\r\n\r\n fire_step_selected(step_index)\r\n {\r\n this.fire(this.step_selected_evt, step_index);\r\n }\r\n\r\n fire_go_to_store_requested(store_id)\r\n {\r\n this.fire(this.go_to_store_requested_evt, store_id);\r\n }\r\n\r\n fire_resource_loaded(resource)\r\n {\r\n this.fire(this.resource_loaded_evt, resource);\r\n }\r\n\r\n fire_service_clicked(service)\r\n {\r\n this.fire(this.service_clicked_evt, service);\r\n }\r\n\r\n fire_unit_position_updated(unit_data)\r\n {\r\n this.fire(this.unit_pos_updated_evt, unit_data);\r\n }\r\n\r\n fire_floor_switched(floor_id)\r\n {\r\n this.fire(this.floor_changed_evt, floor_id);\r\n }\r\n\r\n fire_on_enter_floor_navigation(state)\r\n {\r\n this.fire(this.on_enter_floor_navigation, state);\r\n }\r\n\r\n fire_on_exit_floor_navigation(state)\r\n {\r\n this.fire(this.on_exit_floor_navigation, state);\r\n }\r\n\r\n fire_on_enter_floor_selection(state)\r\n {\r\n this.fire(this.on_enter_floor_selection, state);\r\n }\r\n\r\n fire_on_exit_floor_selection(state)\r\n {\r\n this.fire(this.on_exit_floor_selection, state);\r\n }\r\n\r\n fire_on_enter_outside_navigation(state)\r\n {\r\n this.fire(this.on_enter_outside_navigation, state);\r\n }\r\n\r\n fire_on_exit_outside_navigation(state)\r\n {\r\n this.fire(this.on_exit_outside_navigation, state);\r\n }\r\n}\r\n\r\nexport default new EventManager();\r\n","import EventManager from './EventManager';\r\n\r\nclass ResourceContainer\r\n{\r\n init()\r\n {\r\n this.resources = {};\r\n this.resources_by_url = {};\r\n }\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 EventManager.fire_resource_loaded({ name: name, value: resource });\r\n }\r\n\r\n get_resource(name)\r\n {\r\n return this.resources[name];\r\n }\r\n\r\n get(name)\r\n {\r\n return this.resources[name];\r\n }\r\n}\r\n\r\nexport default new ResourceContainer();\r\n","export default 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","import ActionSequencerBuilder from './ActionSequencerBuilder';\r\n\r\nexport default class TransitionTable\r\n{\r\n constructor()\r\n {\r\n this.transitions = [];\r\n this.initial_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.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n\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)\r\n {\r\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n\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_initial_state_data(initial_state_data)\r\n {\r\n this.initial_state_data = initial_state_data;\r\n }\r\n}\r\n","import { 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.___time = new Clock();\r\n this.__raw_delta_time = 0;\r\n this.__elapsed_time = 0;\r\n this.__allocated_time = new Vector2(0, 0);\r\n\r\n this.delta_time = 0.016;\r\n }\r\n\r\n get elapsed_time()\r\n {\r\n return this.__elapsed_time;\r\n }\r\n\r\n get shader_time()\r\n {\r\n this.__allocated_time.x = this.delta_time;\r\n this.__allocated_time.y = this.elapsed_time;\r\n return this.__allocated_time;\r\n }\r\n\r\n __update()\r\n {\r\n this.__raw_delta_time = this.___time.getDelta();\r\n this.__elapsed_time = this.___time.getElapsedTime();\r\n\r\n this.delta_buffer.shift();\r\n this.delta_buffer.push(this.__raw_delta_time < 0.32 ? this.__raw_delta_time : 0.032);\r\n\r\n this.__calculate_delta_time();\r\n }\r\n\r\n __calculate_delta_time()\r\n {\r\n this.delta_time = 0;\r\n\r\n for (let i = 0; i < this.delta_buffer.length; i++)\r\n {\r\n this.delta_time += this.delta_buffer[i];\r\n }\r\n\r\n this.delta_time = this.delta_time / this.delta_buffer.length;\r\n }\r\n}\r\n\r\nexport default new Time();\r\n","export default 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 show()\r\n {\r\n }\r\n\r\n hide()\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 update()\r\n {\r\n }\r\n\r\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n // Backward compatibility. It will be removed in future releases.\r\n this.update_transition(global_view_data, transition_progress, action_sequencer);\r\n }\r\n\r\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n // Deprecated\r\n update_transition(global_view_data, transition_progress, action_sequencer)\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","import Time from '../../Time';\r\nimport ViewState from '../ViewState';\r\n\r\nexport default class 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.initial_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.show();\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.current_state.before_enter();\r\n\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 set_state(state)\r\n {\r\n this.current_state = state;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n Object.assign(this.initial_state_data, initial_state_data);\r\n Object.assign(this.current_state_data, initial_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","import TransitionTable from './transition/TransitionTable';\r\nimport ViewStateTransitionHandler from './transition/ViewStateTransitionHandler';\r\n\r\nclass ViewManager\r\n{\r\n constructor()\r\n {\r\n this.views = [];\r\n\r\n this.transition_table = new TransitionTable();\r\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\r\n\r\n this.view_change_subscribers = [];\r\n\r\n this.browser_title_suffix = '';\r\n }\r\n\r\n update()\r\n {\r\n this.transition_handler.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 this.transition_handler.go_to_state(v, skip);\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 this.notify_view_change(view_name);\r\n }\r\n\r\n subscribe_to_view_change(subscriber)\r\n {\r\n this.view_change_subscribers.push(subscriber);\r\n }\r\n\r\n notify_view_change(view_name)\r\n {\r\n for (let i = 0; i < this.view_change_subscribers.length; i++)\r\n {\r\n const subscriber = this.view_change_subscribers[i];\r\n subscriber.on_view_change(view_name);\r\n }\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 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_view(view_name)\r\n {\r\n const view = this.get(view_name);\r\n\r\n this.transition_handler.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 this.transition_handler.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_view_by_url(url)\r\n {\r\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\r\n this.get_by_url(url);\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 set_initial_state_data(initial_state_data)\r\n {\r\n this.transition_table.set_initial_state_data(initial_state_data);\r\n this.transition_handler.set_initial_state_data(initial_state_data);\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(this.transition_handler.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\nexport default new ViewManager();\r\n","import ResourceContainer from '../ResourceContainer';\r\nimport HTMLUtilities from '../utilities/HTMLUtilities';\r\nimport ViewManager from './ViewManager';\r\nimport ViewState from './ViewState';\r\n\r\nexport default class ApplicationView extends ViewState\r\n{\r\n constructor({ name, url, container })\r\n {\r\n super(name);\r\n\r\n this.container = container;\r\n this.url = url;\r\n\r\n let transition_data = ResourceContainer.get(`${name}_data`);\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 ViewManager.add_transitions(transitions);\r\n }\r\n\r\n show()\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 hide()\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 load_html_images()\r\n {\r\n HTMLUtilities.load_images(this.container);\r\n }\r\n\r\n load_html_videos()\r\n {\r\n HTMLUtilities.load_videos(this.container);\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 }\r\n}\r\n","export default class BaseApplication\r\n{\r\n on_post_start()\r\n {}\r\n\r\n on_enter()\r\n {}\r\n\r\n on_exit()\r\n {}\r\n\r\n 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","export default 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","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\nexport default class 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","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\nexport default class 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","class CameraManager\r\n{\r\n init()\r\n {\r\n this._current = undefined;\r\n }\r\n\r\n set current(camera)\r\n {\r\n this._current = camera;\r\n }\r\n\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n}\r\n\r\nexport default new CameraManager();\r\n","class 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\nexport default new Capabilities();\r\n","import { 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\nexport default class CanvasDrawer\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 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 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 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 __draw(text, ctxOptions)\r\n {}\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 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\n\r\n A configuration class used as a singleton\r\n\r\n*/\r\n\r\nclass Configuration\r\n{\r\n init(parameters = {})\r\n {\r\n this.dpr = 1;\r\n\r\n this.app = {}; // for arbitrary use in end application\r\n }\r\n\r\n from_json(json)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport default new Configuration();\r\n","export default 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","import Time from '../../Time';\r\nimport Idle from './Idle';\r\n\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class 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 = TMath.clamp(this.easing_function_t, 0, 1);\r\n\r\n animator.set_property_value(TMath.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","import Animating from './css_animator_states/Animating';\r\nimport Idle from './css_animator_states/Idle';\r\nimport EasingFunctions from '../utilities/EasingFunctions';\r\n\r\nexport default class 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\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\nexport default class 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","import { Scene } from 'three';\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 add_scene(name)\r\n {\r\n\r\n }\r\n\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(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.dispose();\r\n child.material.dispose();\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\nexport default new SceneManager();\r\n","\r\nimport { Vector3, Mesh } from 'three';\r\nimport { BoxGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class Cube extends Mesh\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","import { Mesh } from 'three';\r\nimport { SphereBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class Sphere extends Mesh\r\n{\r\n constructor(radius, color)\r\n {\r\n color = color || '#FF0000';\r\n radius = radius || 1;\r\n const geometry = new SphereBufferGeometry(radius, 64, 64);\r\n const material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n","import { CylinderBufferGeometry } from 'three';\r\nimport { ConeBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { Vector3, Mesh } from 'three';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nexport default class Arrow extends Mesh\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 CylinderBufferGeometry(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 ConeBufferGeometry(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.mergeBufferGeometries([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","import { 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 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 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 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 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\nexport default new OScreen();\r\n","import BaseShaderMaterial from './BaseShaderMaterial';\r\nimport { Vector2 } from 'three';\r\nexport default class 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","import { Color } from 'three';\r\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\r\n\r\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\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","import AxisHelper from './components/AxisHelper';\r\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\r\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\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 ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\r\nimport { Vector3 } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Line } from 'three';\r\nimport { PlaneBufferGeometry } 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\nimport PerspectiveCamera from './PerspectiveCamera';\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 this.display_texture_meshes = [];\r\n\r\n this.ctx = undefined;\r\n this.scene = new Scene();\r\n this.camera = new PerspectiveCamera();\r\n // this.camera.clear_alpha = 0;\r\n }\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 SceneManager.current.add(arrow);\r\n return arrow;\r\n }\r\n\r\n draw_axis()\r\n {\r\n const axis = new AxisHelper();\r\n SceneManager.current.add(axis);\r\n return axis;\r\n }\r\n\r\n set_debug_RT(RT)\r\n {\r\n this.rt_debug = RT;\r\n }\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 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 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 SceneManager.current.add(line);\r\n return line;\r\n }\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 SceneManager.current.add(cube);\r\n return cube;\r\n }\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 SceneManager.current.add(cube);\r\n return cube;\r\n }\r\n\r\n draw_plane(width, height, color)\r\n {\r\n const geometry = new PlaneBufferGeometry(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 SceneManager.current.add(plane);\r\n return plane;\r\n }\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 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 SceneManager.current.add(sphere);\r\n return sphere;\r\n }\r\n\r\n draw_point_array(input_points, open = false, color = 0xff0000)\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 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 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 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 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 draw_texture(tex, w, h)\r\n {\r\n const mesh = new Mesh(new PlaneBufferGeometry(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 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, this.camera);\r\n }\r\n }\r\n}\r\n\r\nexport default new Debug();\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/clear/clear_depth_normal.frag';\r\n\r\nimport { Vector4 } from 'three';\r\n\r\nexport default class 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","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\nexport default class 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","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\nexport default class 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","import BlitMaterial from '../materials/BlitMaterial';\r\n\r\nimport { Scene } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nexport default class 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 PlaneBufferGeometry(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(RT)\r\n {\r\n RT = RT === undefined ? null : RT;\r\n\r\n const current_rt = this.renderer.getRenderTarget();\r\n\r\n this.renderer.setRenderTarget(RT === undefined ? null : 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","import Configuration from './Configuration';\r\nimport BaseRender from './render_mode/BaseRender';\r\nimport OScreen from './OScreen';\r\nimport CameraManager from './CameraManager';\r\nimport SceneManager from './SceneManager';\r\nimport Capabilities from './Capabilities';\r\nimport DepthAndNormalsRenderer from './render_utilities/DepthAndNormalsRenderer';\r\nimport Blitter from './render_utilities/Blitter';\r\n\r\nimport { WebGLRenderer } from 'three';\r\n\r\nclass Graphics\r\n{\r\n init(canvas, context_attributes)\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.context_attributes = {\r\n alpha: true,\r\n depth: true,\r\n desynchronized: false,\r\n stencil: false,\r\n antialias: false,\r\n premultipliedAlpha: true,\r\n preserveDrawingBuffer: true,\r\n powerPreference: 'high-performance',\r\n logarithmicDepthBuffer: false,\r\n force_webgl2: true,\r\n xr_enabled: false\r\n };\r\n\r\n Object.assign(this.context_attributes, context_attributes);\r\n\r\n if (this.context_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._renderer = new WebGLRenderer({\r\n canvas: canvas,\r\n context: this.canvas_context\r\n });\r\n\r\n if (this.context_attributes.xr_enabled)\r\n {\r\n this._renderer.xr.enabled = true;\r\n }\r\n\r\n this._renderer.autoClear = false;\r\n\r\n this._renderer.setPixelRatio(1);\r\n\r\n OScreen.dpr = Configuration.dpr;\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 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._renderer.capabilities.floatVertexTextures;\r\n\r\n this.generateDepthNormalTexture = false;\r\n\r\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\r\n\r\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\r\n this.resize_observer.observe(this.canvas);\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 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 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 render_scene(scene)\r\n {\r\n if (scene.on_pre_render)\r\n {\r\n scene.on_pre_render();\r\n }\r\n\r\n if (scene.render)\r\n {\r\n scene.render();\r\n }\r\n else\r\n {\r\n this.render(scene, undefined);\r\n }\r\n\r\n if (scene.on_post_render)\r\n {\r\n scene.on_post_render();\r\n }\r\n }\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 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 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 on_resize(entries)\r\n {\r\n for (const entry of entries)\r\n {\r\n OScreen.dpr = Configuration.dpr;\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 material_pass(mat, dst)\r\n {\r\n this.blitter.material_pass(mat, dst);\r\n }\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 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 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 = parseInt(Math.ceil(new_width / tile_width));\r\n const divisions_y = parseInt(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 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\r\nexport default new Graphics();\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\nexport default class 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","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\nexport default class 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","export default class KeyboardInput\r\n{\r\n init(container)\r\n {\r\n this.ctrlz_pressed = false;\r\n this.ctrlz_fired = false;\r\n\r\n this.keys = {};\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 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 if (e.key)\r\n {\r\n this.press_key(e.key);\r\n }\r\n }\r\n\r\n on_key_up(e)\r\n {\r\n this.release_key(e.key);\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 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 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 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 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 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 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 };\r\n\r\n this.keys_keys = Object.keys(this.keys);\r\n }\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","import { InputController } from 'pit-js';\r\nimport KeyboardInput from './KeyboardInput';\r\n\r\nclass Input extends InputController\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.clicked = false;\r\n this.captured_NDC = { x: 0, y: 0 };\r\n this.current_NDC_delta = { x: 0, y: 0 };\r\n\r\n this.keyboard = new KeyboardInput();\r\n }\r\n\r\n init(container, keyboard_input_container)\r\n {\r\n super.init(container);\r\n\r\n this.keyboard.init(keyboard_input_container);\r\n }\r\n\r\n dispose()\r\n {\r\n super.dispose();\r\n\r\n this.keyboard.dispose();\r\n }\r\n\r\n update()\r\n {\r\n if (this.left_mouse_button_pressed)\r\n {\r\n this.captured_NDC.x = this.NDC.x;\r\n this.captured_NDC.y = this.NDC.y;\r\n }\r\n\r\n if (this.left_mouse_button_down)\r\n {\r\n this.current_NDC_delta.x += Math.abs(this.NDC_delta.x);\r\n this.current_NDC_delta.y += Math.abs(this.NDC_delta.y);\r\n }\r\n\r\n if (this.left_mouse_button_released)\r\n {\r\n if (this.current_NDC_delta.x < 0.001 || this.current_NDC_delta.y < 0.001)\r\n {\r\n this.clicked = true;\r\n }\r\n\r\n this.current_NDC_delta = { x: 0, y: 0 };\r\n }\r\n }\r\n\r\n clear()\r\n {\r\n super.clear();\r\n\r\n this.clicked = false;\r\n\r\n this.keyboard.clear();\r\n }\r\n}\r\n\r\nexport default new Input();\r\n","\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\nexport default new OS();\r\n","import { Vector3 } from 'three';\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 set_target_geometry(geometry)\r\n {\r\n this.target_geometry = geometry;\r\n }\r\n}\r\n\r\nexport default new ReflectionPlaneContext();\r\n","import { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { DataTexture } from 'three';\r\nimport { RGBAFormat } from 'three';\r\nimport { RGBFormat } from 'three';\r\nimport { FloatType } from 'three';\r\n\r\nexport default class 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, RGBFormat);\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","import GeometryBatch from './GeometryBatch';\r\n\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { Math as TMath } from 'three';\r\nimport { BufferAttribute } from 'three';\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 = TMath.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.mergeBufferGeometries(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\nexport default new GeometryBatcher();\r\n","import Input from './Input';\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 'three';\r\n\r\nclass UI\r\n{\r\n init()\r\n {\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.autoUpdate = false;\r\n this.ss_scene.frustumCulled = false;\r\n\r\n this.ws_scene = new Scene();\r\n this.ws_scene.autoUpdate = 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 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 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 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(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 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\nexport default new UI();\r\n","import CameraManager from '../CameraManager';\r\nimport Input from '../Input';\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\n\r\nclass CameraUtilities\r\n{\r\n init()\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\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 || 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 this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\r\n this.ray.set(camera.position, this.tmp_unproj);\r\n }\r\n\r\n this.ray.intersectPlane(this.plane, tmp_vec);\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\r\nexport default new CameraUtilities();\r\n","import Browser from './Browser';\r\nimport CameraManager from './CameraManager';\r\nimport Capabilities from './Capabilities';\r\nimport Configuration from './Configuration';\r\nimport Debug from './Debug';\r\nimport EventManager from './EventManager';\r\nimport Graphics from './Graphics';\r\nimport Input from './Input';\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\n\r\nclass Initializer\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n init(canvas, app_container, context_attributes, keyboard_input_container = document)\r\n {\r\n CameraManager.init();\r\n CameraUtilities.init();\r\n Capabilities.init();\r\n Configuration.init();\r\n EventManager.init();\r\n GeometryBatcher.init();\r\n Input.init(app_container, keyboard_input_container);\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();\r\n\r\n Graphics.init(canvas, context_attributes);\r\n Debug.init();\r\n }\r\n\r\n dispose(render_loop)\r\n {\r\n Graphics.dispose();\r\n Input.dispose();\r\n SceneManager.dispose();\r\n\r\n render_loop.dispose();\r\n }\r\n}\r\n\r\nexport default new Initializer();\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/ssao/ssao.frag';\r\nimport vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\nimport { Math as TMath } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { DataTexture } from 'three';\r\nimport { RGBFormat } from 'three';\r\nimport { RepeatWrapping } from 'three';\r\n\r\nexport default class 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 = TMath.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, RGBFormat);\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","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/ssao/ssao_compose.frag';\r\n\r\nexport default class 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","import BlitMaterial from '../materials/BlitMaterial';\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\nexport default class 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","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/box_blur/box_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class 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","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nexport default class 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","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport OScreen from '../OScreen';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Configuration from '../Configuration';\r\nimport SSAOMaterial from '../materials/SSAOMaterial';\r\nimport SSAOComposeMaterial from '../materials/SSAOComposeMaterial';\r\nimport DisplayNormalTextureMaterial from '../materials/DisplayNormalTextureMaterial';\r\nimport Blurrer from '../render_utilities/Blurrer';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nexport default class NormalAORender extends BaseRender\r\n{\r\n constructor()\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 = Configuration.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","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Graphics from '../Graphics';\r\n\r\nexport default class 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","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\r\nimport { Color } from 'three';\r\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\r\n{\r\n constructor(nMips)\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: 0.0 };\r\n\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","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/add/add.frag';\r\n\r\nexport default class AddMaterial extends BlitMaterial\r\n{\r\n constructor(nMips)\r\n {\r\n super(frag);\r\n\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","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class GaussianBlurMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius)\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 }\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","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\r\nimport { Color } from 'three';\r\nexport default class LuminosityHighPassMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius)\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}\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 } from 'three';\r\n\r\nexport default class GaussianBlurrer\r\n{\r\n constructor(nMips = 5)\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\r\n this.nMips = nMips;\r\n this.kernelSizeArray = [3, 5, 7, 9, 11];\r\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\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();\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 if (use_luminosity_high_pass)\r\n {\r\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\r\n }\r\n else\r\n {\r\n Graphics.blit(RT, this.renderTargetBright);\r\n }\r\n\r\n let inputRenderTarget = this.renderTargetBright;\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 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(texture_width, texture_height)\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]));\r\n }\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","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 { 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\nexport default class UnrealBloomRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.bloom_compose_mat = undefined;\r\n\r\n this.main_RT = undefined;\r\n this.blur_RT = undefined;\r\n this.blurrer = undefined;\r\n\r\n this.add_mat = new AddMaterial();\r\n }\r\n\r\n on_enter()\r\n {\r\n this.blurrer = new GaussianBlurrer();\r\n this.main_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\r\n this.blur_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\r\n\r\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\r\n this.blurrer = new GaussianBlurrer(5);\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.bloom_compose_mat.set_bloom_strength(1);\r\n this.bloom_compose_mat.set_bloom_radius(1);\r\n\r\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\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 }\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 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, true);\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.blit(this.main_RT, undefined, this.add_mat);\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== OScreen.render_width || this.main_RT.height !== OScreen.render_height)\r\n {\r\n this.main_RT.setSize(OScreen.render_width, OScreen.render_height);\r\n this.blur_RT.setSize(OScreen.render_width, OScreen.render_height);\r\n }\r\n }\r\n}\r\n","import { Color } from 'three';\r\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\r\n\r\nexport default class OrthographicCamera extends THREEOrthographicCamera\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","import ViewManager from './ViewManager';\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(ViewManager.transition_handler.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(ViewManager.transition_handler.current_state_data);\r\n }\r\n }\r\n}\r\n\r\nexport default new ViewComponentManager();\r\n","import Time from './Time';\r\nimport Input from './Input';\r\nimport UI from './UI';\r\nimport Debug from './Debug';\r\nimport BaseApplication from './BaseApplication';\r\nimport ViewManager from './view_components/ViewManager';\r\nimport ViewComponentManager from './view_components/ViewComponentManager';\r\n\r\nexport default class RenderLoop\r\n{\r\n constructor(target_application, graphics)\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\r\n this.is_running = false;\r\n this.frames_passed = 0;\r\n }\r\n\r\n update()\r\n {\r\n if (!this.is_running)\r\n {\r\n return;\r\n }\r\n Time.__update();\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 Input.update();\r\n\r\n this.target_application.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 UI.update(); // update after new camera matrix has been calculated\r\n UI.render(this.graphics); // render ui layer on top\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\r\n this.target_application.on_frame_end();\r\n this.frames_passed++;\r\n\r\n Input.clear();\r\n UI.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 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","import 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 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 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 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 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\nexport default new Screen();\r\n","\r\nimport CanvasDrawer from './CanvasDrawer';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class 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 __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","import HTMLUtilities from '../utilities/HTMLUtilities';\r\nimport ViewComponentManager from './ViewComponentManager';\r\n\r\nexport default 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 load_html_images()\r\n {\r\n HTMLUtilities.load_images(this.container);\r\n }\r\n\r\n load_html_videos()\r\n {\r\n HTMLUtilities.load_videos(this.container);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\n\r\nexport default class HorizontalPlane extends Mesh\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 PlaneBufferGeometry(width, height);\r\n geometry.rotateX(-3.14 / 2);\r\n super(geometry, material);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class VerticalPlane extends Mesh\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 PlaneBufferGeometry(width, height);\r\n super(geometry, material);\r\n }\r\n}\r\n","export default 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","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\r\n\r\nexport default class 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","import { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\n\r\nexport default class 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","import { Vector4 } from 'three';\r\n\r\nexport default class 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","import { Vector3 } 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 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 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 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 }\r\n return { points: sampled_points, normals: sampled_normals };\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\nexport default new 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\nexport default new ModelUtilities();\r\n","export default 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","export default class StringUtilities\r\n{\r\n constructor()\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.replace(\r\n /([-_][a-z])/g,\r\n (group) => group.toUpperCase()\r\n .replace('-', '')\r\n .replace('_', '')\r\n );\r\n }\r\n}\r\n","export default 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","import { Vector3, Plane, Quaternion, Sphere, Math as TMath, Line3 } from 'three';\r\nexport default class 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 = TMath.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","import { Vector3, Box3 } from 'three';\r\n\r\nexport default class 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","import grid_frag from '../shaders/grid/grid.frag';\r\nimport grid_vert from '../shaders/grid/grid.vert';\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 { PlaneBufferGeometry } from 'three';\r\n\r\nexport default class 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 extensions: { derivatives: true },\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n const plane_geometry = new PlaneBufferGeometry(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","import line_vs from '../shaders/basic_line/basic_line.vert';\r\nimport line_fs from '../shaders/basic_line/basic_line.frag';\r\n\r\nimport { Mesh } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nexport default class Line extends Mesh\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 extensions: { derivatives: true }\r\n\r\n });\r\n\r\n super(geometry, material);\r\n\r\n if (points)\r\n {\r\n this.setup(points);\r\n }\r\n }\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 this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\r\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\r\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\r\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\r\n 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 }\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 __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 __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 copy_color(col)\r\n {\r\n this.material.uniforms._Color.value.copy(col);\r\n }\r\n}\r\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\r\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\r\n\r\nimport { Mesh } from 'three';\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\nexport default class WorldImage extends Mesh\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 }\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.set(value, value, 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","import WorldImage from './WorldImage';\r\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\r\n\r\nimport { LinearMipMapLinearFilter } from 'three';\r\nimport { LinearFilter } from 'three';\r\n\r\nexport default class Text2D extends WorldImage\r\n{\r\n constructor(text, font, color, pivot, is_static)\r\n {\r\n const simple_text_drawer = new SimpleTextDrawer(is_static);\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","import vert from '../shaders/ui_element/ui_element.vert';\r\nimport frag from '../shaders/ui_element/ui_element.frag';\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\nexport default class 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","import { Vector2 } from 'three';\r\n\r\nexport default class 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","import CameraManager from '../../CameraManager';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class 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","export default class UIElementState\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n\r\n }\r\n\r\n on_enter(ui_element)\r\n {}\r\n\r\n on_exit(ui_element)\r\n {}\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnIdle extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\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","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseEnter extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_enter();\r\n }\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","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseExit extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\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","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseHover extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\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 __trigger_on_hover(ui_element)\r\n {\r\n ui_element.on_mouse_hover();\r\n }\r\n}\r\n","\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 } from 'three';\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\n\r\nexport default class UIElement extends Mesh\r\n{\r\n constructor(vert, frag)\r\n {\r\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\r\n\r\n this.is_clickable = false;\r\n\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 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 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 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 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 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 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 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 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 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 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","import { Mesh } from 'three';\r\n\r\nexport default class UpdatableMaterialMesh extends Mesh\r\n{\r\n constructor(geometry, material)\r\n {\r\n super(geometry, material);\r\n\r\n const self = this;\r\n\r\n this.onBeforeRender = () =>\r\n {\r\n self.material.update();\r\n };\r\n }\r\n}\r\n","import { Vector2, Vector4 } from 'three';\r\n\r\nexport default class 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","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\r\nimport TextGlyph from './TextGlyph';\r\n\r\nexport default class 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","import BaseShaderMaterial from './BaseShaderMaterial';\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, Math as TMath } from 'three';\r\n\r\nexport default class 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 = TMath.lerp(0.5, 0.2, value);\r\n }\r\n}\r\n","import SDFText from './SDFText';\r\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\r\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\r\n\r\nimport {\r\n PlaneBufferGeometry,\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\nexport default class 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 PlaneBufferGeometry(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","import ActionInterpolator from './ActionInterpolator';\r\n\r\nexport default class VectorInterpolator extends ActionInterpolator\r\n{\r\n constructor(attribute_name, from = 0, to = 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 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","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/median_filter/median_filter.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class 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","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\r\n\r\nexport default class 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","import BlitMaterial from './BlitMaterial';\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\nexport default class 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","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\r\n\r\nexport default class 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","import DualFilteringBlurMaterial from '../materials/DualFilteringBlurMaterial';\r\nimport AlphaFilterMaterial from '../materials/AlphaFilterMaterial';\r\nimport Graphics from '../Graphics';\r\nimport { WebGLRenderTarget } from 'three';\r\nexport default class 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","import { Object3D } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { Points } from 'three';\r\n\r\nexport default class GPUParticleSystem extends Object3D\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.attributes = [];\r\n\r\n this.particles = undefined;\r\n }\r\n\r\n set_from_geometry(geometry, material, init_attribute_uvs)\r\n {\r\n // let position = new ParticlePositionAttribute(\"_Position\");\r\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\r\n {\r\n const uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\r\n geometry.setAttribute('storage_uv', uv_storage_attr);\r\n }\r\n // position.init_from_geometry(geometry);\r\n // this.attributes.push(position);\r\n\r\n // material.uniforms._Position.value = position.read.texture;\r\n\r\n const points = new Points(geometry, material);\r\n points.frustumCulled = false;\r\n this.particles = points;\r\n\r\n this.add(points);\r\n }\r\n\r\n add_texture_attribute(buffer_attribute)\r\n {\r\n\r\n }\r\n\r\n add_attribute(name, buffer_attribute)\r\n {\r\n\r\n }\r\n\r\n build_uv_storage_attribute(particle_count)\r\n {\r\n const resolution = this.calculate_resolution(particle_count);\r\n const uvs = new Float32Array(particle_count * 2);\r\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\r\n {\r\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\r\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\r\n }\r\n\r\n return new BufferAttribute(uvs, 2);\r\n }\r\n\r\n calculate_resolution(particle_count)\r\n {\r\n return Math.ceil(Math.sqrt(particle_count));\r\n }\r\n\r\n update()\r\n {\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n this.attributes[i].update();\r\n }\r\n }\r\n\r\n set_attribute_update_material(attribute_name, mat)\r\n {\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n if (this.attributes[i].name === attribute_name)\r\n {\r\n this.attributes[i].update_material = mat;\r\n }\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.particles.geometry.dispose();\r\n this.particles.material.dispose();\r\n }\r\n}\r\n","import { DataTexture } from 'three';\r\n\r\nexport default class 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","import CustomDataTexture from './CustomDataTexture';\r\nimport { RGBFormat } from 'three';\r\n\r\nexport default class 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, RGBFormat);\r\n this.multiplier = 255;\r\n }\r\n}\r\n","import CustomDataTexture from './CustomDataTexture';\r\nimport { RGBAFormat } from 'three';\r\n\r\nexport default class 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","import CustomDataTexture from './CustomDataTexture';\r\nimport { FloatType } from 'three';\r\nimport { RGBFormat } from 'three';\r\n\r\nexport default class 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, RGBFormat, FloatType);\r\n }\r\n}\r\n","import CustomDataTexture from './CustomDataTexture';\r\nimport { FloatType } from 'three';\r\nimport { RGBAFormat } from 'three';\r\n\r\nexport default class 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","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\nexport default class 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","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\nexport default class 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.mergeBufferGeometries(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","import { Audio as TAudio } from 'three';\r\nimport { PositionalAudio as TPositionalAudio } from 'three';\r\n\r\nexport default class AudioClip\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 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport AudioClip from '../components/AudioClip';\r\n\r\nimport { AudioContext } from 'three';\r\n\r\nexport default class 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, response)\r\n {\r\n if (!window.user_interaction_for_audio)\r\n {\r\n setTimeout(this.on_preloaded_finished.bind(this, resource_container, response), 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, response);\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, response)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n const context = AudioContext.getContext();\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}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\n// import { sRGBEncoding } from 'three';\r\n\r\nexport default class 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader 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 THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class 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 THREEColladaLoader.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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class 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 THREEFileLoader();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\r\n\r\nexport default class 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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class 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 THREEGLTFLoader.GLTFLoader();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\nimport * as THREEDRACOLoader from 'three/examples/jsm/loaders/DRACOLoader.js';\r\n\r\nexport default class GLTFDRACOLoader 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 THREEGLTFLoader.GLTFLoader();\r\n this.draco_loader = new THREEDRACOLoader.DRACOLoader();\r\n\r\n this.draco_loader.setDecoderPath(window.draco_decoder_path);\r\n this.draco_loader.setDecoderConfig({ type: 'js' });\r\n this.draco_loader.setWorkerLimit(1);\r\n\r\n this.loader.setDRACOLoader(this.draco_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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader 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 THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\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.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (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","import AbstractLoader from './AbstractLoader';\r\n\r\nexport default class 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, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\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 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\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\r\n\r\nexport default class 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 THREEOBJLoader.OBJLoader();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Vector3 as THREEVector3 } from 'three';\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class 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 THREEFileLoader();\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 THREEVector3(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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\r\n\r\nimport { UnsignedByteType as THREEUnsignedByteType } from 'three';\r\n\r\nexport default class 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 THREERGBELoader.RGBELoader();\r\n this.loader.setDataType(THREEUnsignedByteType);\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class 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 THREEFileLoader();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class AsyncTextureLoader 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 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.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, 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\nimport { Texture } from 'three';\r\n\r\nexport default class 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","import AbstractLoader from './AbstractLoader';\r\n\r\nexport default class 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","import ResourceContainer from '../ResourceContainer';\r\n\r\nexport default class 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"],"names":["Browser$1","init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","constructor","static","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","TMath","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","get_keyframes","channel_name","is_channel_redefined","initial","saturate","current","Infinity","distance","EasingFunctions$1","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","EasingFunctions","NumberInterpolator","super","ViewContext$1","app","set_app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","initial_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","find","element","sequencer","action_event","state","from_draw_io","xml","transition_data","EventManager$1","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","fire","event","payload","on","callback","fire_zoom_changed","zoom","fire_store_selected","store_id","fire_point_selected","hit_data","fire_config_changed","fire_path_substep_completed","step_number","fire_path_completed","fire_step_selected","step_index","fire_go_to_store_requested","fire_resource_loaded","resource","fire_service_clicked","service","fire_unit_position_updated","unit_data","fire_floor_switched","floor_id","fire_on_enter_floor_navigation","fire_on_exit_floor_navigation","fire_on_enter_floor_selection","fire_on_exit_floor_selection","fire_on_enter_outside_navigation","fire_on_exit_outside_navigation","ResourceContainer$1","resources","EventManager","get_resource","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_initial_state_data","Time$1","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","__update","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","ViewManager$1","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_images","load_html_videos","load_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","CameraManager$1","_current","camera","Capabilities$1","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","Configuration$1","parameters","dpr","from_json","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","animate","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","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","set","SceneManager$1","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","OScreen$1","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","tex","set_screen_size","PerspectiveCamera","THREEPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","Debug$1","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","copy","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneBufferGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","SphereGeometry","sphere_mesh","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","OScreen","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","blit","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","material_pass","mat","blit_with_material","dst_RT","current_rt","getRenderTarget","setRenderTarget","Graphics$1","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","xr_enabled","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","key","press_key","release_key","pressed","released","key_name","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","Input$1","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","left_mouse_button_pressed","NDC","left_mouse_button_down","NDC_delta","left_mouse_button_released","OS$1","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","os","test","ReflectionPlaneContext$1","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","index","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","GeometryBatcher$1","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","UI$1","ui_elements","_tmp_normalized_pos","ss_scene","autoUpdate","ws_scene","ss_camera","delete_element","elem","splice","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","Input","update_state","current_clicked_element","CameraUtilities$1","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","applyQuaternion","get_forward_dir","get_right_dir","unproject_mouse_position","v_fov","h_fov","atan","tan","distV","distH","get_plane_intersection","plane_position","plane_normal","setFromNormalAndCoplanarPoint","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","Initializer$1","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","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","AddMaterial","_SecondTex","set_add_texture","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","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","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","val","THREEOrthographicCamera","ViewComponentManager$1","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","is_running","frames_passed","ViewComponentManager","setAnimationLoop","Screen$1","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","fit_points","camera_quaternion","vertical_fov","degToRad","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","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","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_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","MeshSampler$1","sample","sample_count","face_areas","min_area","normals","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","ModelUtilities$1","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","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","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","words","substr","join","charAt","slice","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance_to_center","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","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","PlaneGeometry","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","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","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","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","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","remove_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","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","type","median_filter_mat","filter","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","GPUParticleSystem","particles","set_from_geometry","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","add_texture_attribute","add_attribute","particle_count","resolution","calculate_resolution","set_attribute_update_material","update_material","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","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","user_interaction_for_audio","instantiate_audio","setTimeout","arrayBuffer","array_buffer","AudioContext","decodeAudioData","audio_buffer","BasisLoader","loader","basis","xhr","msg","CubemapLoader","THREECubeTextureLoader","setPath","urls","DAELoader","THREEColladaLoader","ColladaLoader","FileLoader","THREEFileLoader","file","FontLoader","TFontLoader","GLTFLoader","THREEGLTFLoader","GLTFDRACOLoader","draco_loader","THREEDRACOLoader","DRACOLoader","setDecoderPath","draco_decoder_path","setDecoderConfig","setWorkerLimit","setDRACOLoader","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","THREEOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","THREEVector3","RGBETextureLoader","THREERGBELoader","RGBELoader","THREEUnsignedByteType","TextLoader","AsyncTextureLoader","Texture","Image","onload","onerror","original_url","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"qsDA8EA,IAAeA,GAAA,IA7Ef,MAEEC,OAKE,OAHAC,KAAKC,aAAe,GACpBD,KAAKE,MAAQC,OAAOC,UAAUC,UAAUC,eAEhC,GAER,KAAKN,KAAKE,MAAMK,QAAQ,SAAW,EACjCP,KAAKC,aAAe,UACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,QAAU,EAChCP,KAAKC,aAAe,gBACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,QAAU,KAAOJ,OAAOK,IAC9CR,KAAKC,aAAe,QACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,WAAa,KAAOJ,OAAOM,OACjDT,KAAKC,aAAe,SACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,YAAc,EACpCP,KAAKC,aAAe,YACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,YAAc,EACpCP,KAAKC,aAAe,UACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,WAAa,EACnCP,KAAKC,aAAe,SACpB,MACF,QACED,KAAKC,aAAe,SAKpBS,WAEF,OAAOV,KAAKC,aAGVU,gBAEF,MAA6B,WAAtBX,KAAKC,aAGVW,gBAEF,MAA6B,WAAtBZ,KAAKC,aAGVY,cAEF,MAA6B,YAAtBb,KAAKC,aAGVa,uBAEF,MAA6B,kBAAtBd,KAAKC,aAGVc,eAEF,OAAOf,KAAKY,WAAaZ,KAAKgB,YAAchB,KAAKc,iBAG/CG,eAEF,OAAOjB,KAAKW,UAGVO,gCAEF,OAAOlB,KAAKe,SAAW,OAASf,KAAKiB,SAAW,WAAa,QC1ElD,MAAME,GAEnBC,eAGAC,cAAcC,GAEZ,OAAOC,OAAOD,KAAOA,GAAKA,EAAI,GAAM,EAGtCD,gBAAgBC,GAEd,OAAOC,OAAOD,KAAOA,GAAKA,EAAI,GAAM,EAGtCD,iBAAiBC,GAEf,OAAOtB,KAAKwB,OAAOF,IAAMtB,KAAKyB,SAASH,GAGzCD,eAAeK,GAEb,IAEEC,KAAKC,MAAMF,GAEb,MAAOG,GAEL,OAAO,EAGT,OAAO,GC5BI,MAAMC,GAEnBV,YAAYW,EAAaC,EAAKC,EAAO,GAEnCjC,KAAK+B,YAAcA,EACnB/B,KAAKgC,IAAMA,EACXhC,KAAKkC,aAAe,EACpBlC,KAAKmC,YAAcF,EAEnBjC,KAAKoC,cAAe,EACpBpC,KAAKqC,WAAY,EACjBrC,KAAKsC,cAAgB,OAGvBC,0BAA0BC,EAAQC,GAEhCD,EAASrB,GAAWuB,UAAUF,GAAUA,EAAS,EACjDC,EAAStB,GAAWuB,UAAUD,GAAUA,EAAS,EAEjDzC,KAAKkC,aAAeM,EAEhBC,EAAQ,IAEVzC,KAAKmC,YAAcM,GAGjBzC,KAAKkC,aAAelC,KAAKmC,aAE3BQ,QAAQC,KAAK,8EAA+E5C,KAAKgC,KAIrGa,kBAEE7C,KAAKoC,cAAe,EAGtBU,YAAYC,GAEV/C,KAAKqC,WAAY,EACjBrC,KAAKsC,cAAgBS,EAGvBC,cAEEL,QAAQM,MAAM,uBAAyBjD,KAAK+B,YAAc,cAAgB/B,KAAKgC,IAAM,SAAWhC,KAAKsC,eAGvGY,KAAKC,GAEH,QAAsDC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAC7C,CACE,MAAMsB,EAAQC,GAAQ5C,UAAY,WAAa,UAE/C6C,MAAMxD,KAAKgC,IAAK,CACdyB,OAAQ,MACRC,KAAM,OACNJ,MAAOA,EACPK,YAAa,cACbC,SAAU,WAETC,KAAK7D,KAAK8D,YAAYC,KAAK/D,KAAMmD,IACjCa,MAAMhE,KAAKiE,WAAWF,KAAK/D,YAI9BmD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,kBAITsB,kBAAkBhB,EAAoBiB,GAEpC,MAAMC,EAAiBD,EAASE,QAC1BC,EAASH,EAASI,KAAKC,YAGvBC,GAAiBN,EAASO,QAAQC,IAAI,kBAG5C,IAAIC,EAAiB,EAErB,OACA,CACE,MAAMC,KAAEA,EAAIC,MAAEA,SAAgBR,EAAOS,OAErC,GAAIF,EAEF,MAGFD,GAAkBE,EAAME,OAExBjF,KAAKuC,0BAA0BsC,EAAgBH,GAIjD1E,KAAKkF,sBAAsB/B,EAAoBkB,GAGjDa,sBAAsB/B,EAAoBiB,IAI1CH,WAAWkB,GAETxC,QAAQM,MAAMkC,IC5GH,MAAMC,GAEnBhE,eAGAC,kBAAkB0D,EAChBM,EACAC,EACAC,EACAC,GAEA,OAAST,EAAQM,IAA2BC,EAAuBD,IAA4BG,EAAqBD,GAAwBA,EAG9IlE,eAAe0D,EAAOU,EAAKC,GAEzB,OAAQX,GAASU,GAAOV,GAASW,EAGnCrE,WAAWsE,EAAQC,GAEjB,OAASD,EAASC,EAAWA,GAAWA,EAG1CvE,kBAAkBwE,GAmBhB,OAjBAA,EAAIC,EAAIC,KAAKC,MAAc,IAARH,EAAIC,GAASG,SAAS,IACzCJ,EAAIK,EAAIH,KAAKC,MAAc,IAARH,EAAIK,GAASD,SAAS,IACzCJ,EAAIM,EAAIJ,KAAKC,MAAc,IAARH,EAAIM,GAASF,SAAS,IAEpB,IAAjBJ,EAAIC,EAAEb,SAERY,EAAIC,EAAI,IAAMD,EAAIC,GAEC,IAAjBD,EAAIK,EAAEjB,SAERY,EAAIK,EAAI,IAAML,EAAIK,GAEC,IAAjBL,EAAIM,EAAElB,SAERY,EAAIM,EAAI,IAAMN,EAAIM,GAGb,IAAMN,EAAIC,EAAID,EAAIK,EAAIL,EAAIM,EAGnC9E,+BAA+B+E,EAAQC,GAErC,MAAMC,EAAkB,IAAIC,EACtBC,EAAkB,GACxB,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCJ,EAAMK,aAAaN,EAAOK,GAAIH,GAC9BE,EAAgBG,KAAKL,EAAgBhC,SAGvC,OAAOkC,EAGTnF,oBAAoBuF,EAAMC,EAAIC,EAAQC,GAEpC,IAAK,IAAIN,EAAI,EAAGA,EAAI,GAAIA,IAEtBK,EAAOE,SAASP,GAAKQ,EAAMC,KAAKN,EAAKI,SAASP,GAAII,EAAGG,SAASP,GAAIM,GAItE1F,cAAc8F,EAAIC,GAEhB,OAAOrB,KAAKsB,IAAIF,EAAKC,GAAM,KAG7B/F,YAAYiG,EAAGC,EAAGR,GAEhB,OAAQ,EAAIA,GAAKO,EAAIP,EAAIQ,EAG3BlG,aAAa0D,EAAOU,EAAKC,GAEvB,OAAOK,KAAKL,IAAID,EAAKM,KAAKN,IAAIC,EAAKX,IAGrC1D,uBAAuBC,EAAGkG,GAExB,OAASlG,EAAIkG,EAAKA,GAAKA,EAGzBnG,gBAAgBiG,EAAGrC,EAAS,GAE1B,OAAOA,EAASc,KAAKsB,IAAIjC,GAAMqC,gBAAgBH,EAAY,EAATrC,GAAcA,GAGlE5D,gBAAgBqG,GAEd,OAAOA,GAAW3B,KAAK4B,GAAK,KAG9BtG,gBAAgBuG,GAEd,OAAOA,GAAW,IAAM7B,KAAK4B,IAG/BtG,kBAAkBqG,GAEhB,OAAOA,GAAW3B,KAAK4B,GAAK,KAG9BtG,kBAAkBuG,GAEhB,OAAOA,GAAW,IAAM7B,KAAK4B,IAG/BtG,0BAA0BwG,GAKxB,OAHAA,EAAEP,GAAKO,EAAEC,EACTD,EAAEN,GAAKM,EAAEC,EACTD,EAAEE,GAAKF,EAAEC,EACFD,EAGTxG,sBAAsB+E,GAEpB,MAAM4B,EAAS5B,EAAO,GAAG9B,QACzB,IAAK,IAAImC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCuB,EAAOC,IAAI7B,EAAOK,IAGpB,OADAuB,EAAOE,eAAe,EAAI9B,EAAOnB,QAC1B+C,EAGT3G,0BAEE,MAAM8G,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAEpE,IAAIC,EAAM,IASV,OARAA,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAC3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAE3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAC3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAE3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAC3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WACpBF,EAGT/G,gBAAgBiG,GAEd,OAAOlC,GAAMmD,MAAMjB,EAAG,EAAG,ICpJd,MAAMkB,GAEnBpH,YAAYqH,GAEVzI,KAAK0I,cAAgB,KACrB1I,KAAK2I,eAAiB,EACtB3I,KAAK4I,SAAU,EAEf5I,KAAK6I,cAAgB,GACrB7I,KAAKyI,QAAUA,EAEfzI,KAAK8I,gBAAkBnH,KAAKC,MAAMD,KAAKoH,UAAUN,IAEjDzI,KAAKgJ,MAAQ,EAEbhJ,KAAKiJ,SAAW,GAEhB,MAAMC,EAAgBC,OAAOC,KAAKX,GAClC,IAAK,IAAIhC,EAAI,EAAGA,EAAIyC,EAAcjE,OAAQwB,IAExCzG,KAAKiJ,SAASC,EAAczC,IAAM,GAGpCzG,KAAKqJ,SAAW,EAGlBC,OAEEtJ,KAAK4I,SAAU,EAGjBW,OAEEvJ,KAAK4I,SAAU,EAGjBY,QAEExJ,KAAK0I,cAAgB,KAGvBe,OAEE,MAAMJ,EAAWrJ,KAAK0J,eACtB1J,KAAK2J,aAAa3J,KAAK0I,aAAcW,EAAW,MAChDrJ,KAAK0I,aAAeW,EAGtBO,OAAOC,GAED7J,KAAK4I,UAEP5I,KAAK2J,aAAa3J,KAAK0I,aAAc1I,KAAK0I,aAAemB,EAAa7J,KAAK2I,gBAC3E3I,KAAK0I,aAAe1I,KAAK0I,aAAemB,EAAa7J,KAAK2I,gBAI9DmB,aAAaC,GAEX/J,KAAK0I,aAAezB,EAAMsB,MAAMwB,EAAM,EAAG/J,KAAKqJ,UAC9CrJ,KAAK2J,aAAa3J,KAAK0I,aAAc1I,KAAK0I,cAG5CsB,wBAAwBjD,GAEtB/G,KAAK0I,aAAezB,EAAMsB,MAAMxB,EAAG,EAAG,GAAK/G,KAAKqJ,SAChDrJ,KAAK2J,aAAa3J,KAAK0I,aAAc1I,KAAK0I,cAG5CuB,eAEE,OAAOhD,EAAMsB,MAAMvI,KAAK0I,aAAe1I,KAAK0J,eAAgB,EAAG,GAGjEQ,cAEE,OAAOlK,KAAK0I,aAAe1I,KAAK0J,eAGlCS,iBAAiBC,EAAcC,GAE7BrK,KAAK6I,cAAclC,KAAK,CACtByD,aAAcA,EACdC,OAAQA,IAGVrK,KAAKqJ,SAAWtD,KAAKL,IAAI1F,KAAKqJ,SAAUe,GAG1CE,wBAAwB1D,EAAMC,EAAI0D,EAAcC,GAAyB,GAEvE,GAAIA,EACJ,CACE,MAAMC,EAAYzK,KAAKiJ,SAASsB,EAAaG,qBAE3BtH,IAAdqH,GAEF9H,QAAQM,MAAM,GAAGsH,EAAaG,iDAGP,IAArBD,EAAUxF,OAEZsF,EAAa3D,KAAO5G,KAAK8I,gBAAgByB,EAAaG,gBAItDH,EAAa3D,KAAO6D,EAAUA,EAAUxF,OAAS,GAAGsF,aAAa1D,GAIrE,MAAM8D,EAAW,CACf/D,KAAMA,EACNC,GAAIA,EACJ0D,aAAcA,GAGhBvK,KAAKqJ,SAAWtD,KAAKL,IAAI1F,KAAKqJ,SAAUxC,GACxC7G,KAAKiJ,SAASsB,EAAaG,gBAAgB/D,KAAKgE,GAGlDC,yBAAyBlK,GAEvB,MAAMiK,EAAW3K,KAAK6K,uBAAuBnK,EAAMV,KAAK0I,cAExD,OAAI1I,KAAK0I,aAAeiC,EAAS/D,KAExB+D,EAASJ,aAAaO,SAAS,GAGjCH,EAASJ,aAAaO,SAAS,GAGxCC,2BAA2BrK,GAIzB,OAFiBV,KAAK6K,uBAAuBnK,EAAMV,KAAK0I,cAExC6B,aAAaO,SAAS,GAGxCE,qBAAqBtK,GAEnB,MAAMiK,EAAW3K,KAAK6K,uBAAuBnK,EAAMV,KAAK0I,cAClD3B,EAAI/G,KAAKiL,gBAAgBjL,KAAK0I,aAAciC,EAAS/D,KAAM+D,EAAS9D,IAE1E,OAAO8D,EAASJ,aAAaW,gBAAgBnE,GAG/C2C,eAEE,OAAO1J,KAAKqJ,SAGdM,aAAa/C,EAAMC,GAEjB,IAAK,IAAIJ,EAAI,EAAGA,EAAIzG,KAAK6I,cAAc5D,OAAQwB,IAEzCzG,KAAK6I,cAAcpC,GAAG2D,aAAexD,EAAOrF,OAAO4J,SACnDnL,KAAK6I,cAAcpC,GAAG2D,aAAevD,EAAOtF,OAAO4J,SAGrDnL,KAAK6I,cAAcpC,GAAG4D,OAAOe,UAGjC,MAAMlC,EAAgBC,OAAOC,KAAKpJ,KAAK8I,iBAEvC,IAAK,IAAIrC,EAAI,EAAGA,EAAIyC,EAAcjE,OAAQwB,IAC1C,CACE,MAAM/F,EAAOwI,EAAczC,GACrBkE,EAAW3K,KAAK6K,uBAAuBnK,EAAMkG,GAEnD5G,KAAKyI,QAAQ/H,GAAQV,KAAKqL,kBAAkBV,EAAU/D,IAI1DyE,kBAAkBV,EAAUZ,GAI1B,OAFA/J,KAAKgJ,MAAQhJ,KAAKiL,gBAAgBlB,EAAMY,EAAS/D,KAAM+D,EAAS9D,IAEzD8D,EAASJ,aAAaO,SAAS7D,EAAMsB,MAAMvI,KAAKgJ,MAAO,EAAG,IAGnEsC,cAAcC,GAEZ,OAAOvL,KAAKiJ,SAASsC,GAGvBC,qBAAqBD,GAEnB,IAAK,IAAI9E,EAAI,EAAGA,EAAIzG,KAAKiJ,SAASsC,GAActG,OAAQwB,IACxD,CAGE,GAFiBzG,KAAKiJ,SAASsC,GAAc9E,GAEhC8D,aAAakB,QAExB,OAAO,EAIX,OAAO,EAGTR,gBAAgBlG,EACdM,EACAC,GAEA,OAAOF,GAAMsG,UAAW3G,EAAQM,IAA2BC,EAAuBD,GAAuB,EAAc,GAGzHwF,uBAAuBU,EAAcxB,GAEnC,IAAI4B,EAEJ,MAAMlB,EAAYzK,KAAKiJ,SAASsC,GAEhC,IAAK,IAAI9E,EAAI,EAAGA,EAAIgE,EAAUxF,OAAQwB,IACtC,CACE,MAAMkE,EAAWF,EAAUhE,GAE3B,GAAIsD,GAAQY,EAAS/D,MAAQmD,GAAQY,EAAS9D,GAG5C,OADA8E,EAAUhB,EACHgB,EAIX,IAAIlG,EAAMmG,EAAAA,EAEV,IAAK,IAAInF,EAAI,EAAGA,EAAIgE,EAAUxF,OAAQwB,IACtC,CACE,MAAMkE,EAAWF,EAAUhE,GACrBoF,EAAW9F,KAAKsB,IAAIsD,EAAS9D,GAAKkD,GAEpC8B,EAAWpG,IAEbkG,EAAUhB,EACVlF,EAAMoG,GAIV,OAAOF,GClBX,IAAeG,GAAA,IAjOf,MAEE1K,eAGA2K,OAAOzE,GAEL,OAAOA,EAGT0E,WAAW1E,GAET,OAAO,EAAIvB,KAAKsB,IAAS,EAAJC,EAAK,EAAc,GAG1C2E,aAAa3E,GAEX,OAAO,EAAIvB,KAAKmG,IAAQ,UAAJ5E,EAAgB,GAGtC6E,cAAc7E,GAEZ,OAAOvB,KAAKqG,IAAQ,UAAJ9E,EAAgB,GAGlC+E,iBAAiB/E,GAEf,QAASvB,KAAKmG,IAAI,UAAY5E,GAAK,GAAK,EAG1CgF,cAAchF,GAEZ,OAAOA,EAAIA,EAAIA,EAGjBiF,eAAejF,GAEb,OAAO,EAAIvB,KAAKyG,IAAI,EAAIlF,EAAG,GAG7BmF,kBAAkBnF,GAEhB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EACZ,EAAIvB,KAAKyG,KAAK,EAAIlF,EAAI,EAAG,GAAK,EAGpCoF,aAAapF,GAEX,OAAOA,EAAIA,EAGbqF,cAAcrF,GAEZ,OAAO,GAAK,EAAIA,IAAM,EAAIA,GAG5BsF,iBAAiBtF,GAEf,OAAOA,EAAI,GACP,EAAIA,EAAIA,EACR,EAAIvB,KAAKyG,KAAK,EAAIlF,EAAI,EAAG,GAAK,EAGpCuF,cAAcvF,GAEZ,OAAOA,EAAIA,EAAIA,EAAIA,EAGrBwF,eAAexF,GAEb,OAAO,EAAIvB,KAAKyG,IAAI,EAAIlF,EAAG,GAG7ByF,kBAAkBzF,GAEhB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EAAIA,EAChB,EAAIvB,KAAKyG,KAAK,EAAIlF,EAAI,EAAG,GAAK,EAGpC0F,cAAc1F,GAEZ,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,EAGzB2F,eAAe3F,GAEb,OAAO,EAAIvB,KAAKyG,IAAI,EAAIlF,EAAG,GAG7B4F,kBAAkB5F,GAEhB,OAAOA,EAAI,GACP,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EACrB,EAAIvB,KAAKyG,KAAK,EAAIlF,EAAI,EAAG,GAAK,EAGpC6F,aAAa7F,GAEX,OAAa,IAANA,EAAU,EAAIvB,KAAKyG,IAAI,EAAG,GAAKlF,EAAI,IAG5C8F,cAAc9F,GAEZ,OAAa,IAANA,EAAU,EAAI,EAAIvB,KAAKyG,IAAI,GAAI,GAAKlF,GAG7C+F,iBAAiB/F,GAEf,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,GACFvB,KAAKyG,IAAI,EAAG,GAAKlF,EAAI,IAAM,GAC1B,EAAIvB,KAAKyG,IAAI,GAAI,GAAKlF,EAAI,KAAO,EAG5CgG,aAAahG,GAEX,OAAO,EAAIvB,KAAKwH,KAAK,EAAIxH,KAAKyG,IAAIlF,EAAG,IAGvCkG,cAAclG,GAEZ,OAAOvB,KAAKwH,KAAK,EAAIxH,KAAKyG,IAAIlF,EAAI,EAAG,IAGvCmG,iBAAiBnG,GAEf,OAAOA,EAAI,IACN,EAAIvB,KAAKwH,KAAK,EAAIxH,KAAKyG,IAAI,EAAIlF,EAAG,KAAO,GACzCvB,KAAKwH,KAAK,EAAIxH,KAAKyG,KAAK,EAAIlF,EAAI,EAAG,IAAM,GAAK,EAGrDoG,aAAapG,GAEX,OAAO,OAASA,EAAIA,EAAIA,EAAI,OAASA,EAAIA,EAG3CqG,cAAcrG,GAEZ,OAAO,EAAI,OAASvB,KAAKyG,IAAIlF,EAAI,EAAG,GAAK,OAASvB,KAAKyG,IAAIlF,EAAI,EAAG,GAGpEsG,iBAAiBtG,GAEf,OAAOA,EAAI,GACNvB,KAAKyG,IAAI,EAAIlF,EAAG,IAAM,SAAsBA,EAAI,WAAc,GAC9DvB,KAAKyG,IAAI,EAAIlF,EAAI,EAAG,IAAM,WAAuB,EAAJA,EAAQ,GAAK,WAAa,GAAK,EAGnFuG,gBAAgBvG,GAEd,MAAMwG,EAAM,EAAI/H,KAAK4B,GAAM,EAE3B,OAAa,IAANL,EACH,EACM,IAANA,EACE,GACCvB,KAAKyG,IAAI,EAAG,GAAKlF,EAAI,IAAMvB,KAAKqG,KAAS,GAAJ9E,EAAS,OAASwG,GAGhEC,iBAAiBzG,GAEf,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAvB,KAAKyG,IAAI,GAAI,GAAKlF,GAAKvB,KAAKqG,IAAsB,UAAb,GAAJ9E,EAAS,MAAqB,EAGvE0G,oBAAoB1G,GAElB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,IACAvB,KAAKyG,IAAI,EAAG,GAAKlF,EAAI,IAAMvB,KAAKqG,IAAwB,WAAnB,GAAK9E,EAAI,SAAwB,EACxEvB,KAAKyG,IAAI,GAAI,GAAKlF,EAAI,IAAMvB,KAAKqG,IAAwB,WAAnB,GAAK9E,EAAI,SAAuB,EAAI,EAGpF2G,eAAe3G,GAEb,OAAO,EAAItH,KAAKkO,gBAAgB,EAAI5G,GAGtC4G,gBAAgB5G,GAEd,MAAM6G,EAAK,OACLC,EAAK,KAEX,OAAI9G,EAAI,EAAI8G,EAEHD,EAAK7G,EAAIA,EAETA,EAAI,EAAI8G,EAERD,GAAM7G,GAAK,IAAM8G,GAAM9G,EAAI,IAE3BA,EAAI,IAAM8G,EAEVD,GAAM7G,GAAK,KAAO8G,GAAM9G,EAAI,MAI5B6G,GAAM7G,GAAK,MAAQ8G,GAAM9G,EAAI,QAIxC+G,mBAAmB/G,GAEjB,OAAOA,EAAI,IACN,EAAItH,KAAKkO,gBAAgB,EAAI,EAAI5G,IAAM,GACvC,EAAItH,KAAKkO,gBAAgB,EAAI5G,EAAI,IAAM,EAG9CgH,UAAUvH,GAER,OAAO,EAAMhB,KAAKyG,IAAIzG,KAAKsB,IAAItB,KAAKqG,IAAIrF,EAAI,IAAO,IAAQhB,KAAKwI,KAAKxI,KAAKqG,IAAIrF,IAAMhB,KAAKqG,IAAIrF,EAAI,IAAM,GAAO,KC3NnG,MAAMyH,GAEnBpN,YAAY8J,EAAkB,UAE5BlL,KAAKkL,qBAAkB9H,EAIrBpD,KAAKkL,gBAFwB,iBAApBA,EAEcuD,GAAgBvD,GAIhBA,EAI3BtB,OAAOnB,EAAS1B,KCfH,MAAM2H,WAA2BF,GAE9CpN,YAAYsJ,EAAgB9D,EAAO,EAAGC,EAAK,EAAG4E,GAAU,EAAOP,EAAkB,UAE/EyD,MAAMzD,GAENlL,KAAK0K,eAAiBA,EACtB1K,KAAK4G,KAAOA,EACZ5G,KAAK6G,GAAKA,EACV7G,KAAKyL,QAAUA,EAGjB7B,OAAOnB,EAAS1B,GAEd0B,EAAQzI,KAAK0K,gBAAkBzD,EAAMC,KAAKlH,KAAK4G,KAAM5G,KAAK6G,GAAI7G,KAAKkL,gBAAgBnE,IAGrF+D,SAAS/D,GAEP,OAAOE,EAAMC,KAAKlH,KAAK4G,KAAM5G,KAAK6G,GAAI7G,KAAKkL,gBAAgBnE,KCT/D,IAAe6H,GAAA,IAbf,MAEExN,cAEEpB,KAAK6O,SAAMzL,EAGb0L,QAAQD,GAEN7O,KAAK6O,IAAMA,ICPA,MAAME,GAEnB3N,YAAYV,EAAM+C,GAEhBzD,KAAKU,KAAOA,EACZV,KAAKyD,OAASA,EAGhB2H,UAEE4D,GAAYH,IAAI7O,KAAKU,MAAMV,KAAKyD,WCZrB,MAAMwL,GAEnB7N,eAKAQ,MAAMsN,GAEJ,MAEMC,GAFM,IAAIC,WAAYC,gBAAgBH,EAAc,YAE9BI,iBAAiB,cAEvCC,EAAmB,GACnBC,EAAW,GAEjB,IAAK,IAAI/I,EAAI,EAAGA,EAAI0I,EAAgBlK,OAAQwB,IAC5C,CACE,MAAMgJ,EAAON,EAAgB1I,GACvBiJ,EAAcD,EAAKE,cACnBxK,EAAOuK,EAAYE,aAAa,SAIhChJ,EAFQ5G,KAAK6P,oBAAoBJ,GAElB,IACfpG,EAAWyG,WAAWL,EAAKG,aAAa,UAAY,IAG1D,GAAIF,EAAYE,aAAa,SAASG,SAAS,YAC/C,CACE,MAAMC,EAAa7K,EAAK8K,MAAM,KACxBC,EAAeF,EAAW,GAC1BG,EAAiBH,EAAW,GAElCR,EAAS7I,KAAK,CACZjG,KAAMwP,EACNzM,OAAQ0M,EACRC,QAASxJ,EAAkB,GAAXyC,IAOpB,GAHsBqG,EAAYE,aAAa,SAASG,SAAS,gBAC3CL,EAAYE,aAAa,SAASG,SAAS,UAEnC,KAAT5K,IAAgBA,EAAK4K,SAAS,KACnD,CACE,MAAMC,EAAa7K,EAAK8K,MAAM,KAExBvF,EAAiBsF,EAAW,GAE5BK,EAAaL,EAAW,GAAGC,MAAM,MACjCK,EAAWR,WAAWO,EAAW,IACjCnF,EAAkBmF,EAAW,GAET,IAAtBL,EAAW/K,QAEbtC,QAAQM,MAAM,4BAA6BkC,GAGnB,IAAtBkL,EAAWpL,QAEbtC,QAAQM,MAAM,4BAA6BkC,GAG7CoK,EAAiB5I,KAAK,CACpB+D,eAAgBA,EAChB6F,UAAW3J,EACX4J,QAAS5J,EAAOyC,EAChBiH,SAAUA,EACVpF,gBAAiBA,KASvB,OAJAqE,EAAiBkB,MAAK,CAACC,EAAGvK,IAEjBuK,EAAEH,UAAYpK,EAAEoK,YAElB,CACLhB,iBAAkBA,EAClBC,SAAUA,GAIdK,oBAAoBJ,GAElB,MAAMkB,EAAQlB,EAAKG,aAAa,KAChC,OAAiB,OAAVe,EAAiB,EAAIb,WAAWa,IClF5B,MAAMC,GAEnBxP,YAAYyP,GAEV7Q,KAAK6Q,mBAAqBA,EAG5BC,qBAAqBC,EAAgBC,EAAiBlI,GAEpDA,EAAkBA,GAAmB9I,KAAK6Q,mBAC1C,MAAMI,EAASF,EAAexB,iBACxBC,EAAWuB,EAAevB,SAE1B0B,EAAiBlR,KAAKmR,gBAAgBnR,KAAK6Q,oBAEjD,IAAK,IAAIpK,EAAI,EAAGA,EAAIyK,EAAejM,OAAQwB,SAEmDrD,IAAxF6N,EAAOG,MAAKC,GAAWA,EAAQ3G,iBAAmBwG,EAAezK,GAAGiE,kBAEtEuG,EAAOtK,KAAKuK,EAAezK,IAI/B,MAAM6K,EAAY,IAAI9I,GAAgBwI,GAEtC,IAAK,IAAIvK,EAAI,EAAGA,EAAIwK,EAAOhM,OAAQwB,IACnC,CACE,MAAMM,EAAIkK,EAAOxK,GACX8D,EAAe,IAAImE,GACvB3H,EAAE2D,eACFsG,EAAgBjK,EAAE2D,gBAClB3D,EAAEuJ,SACFvJ,EAAE0E,QACF1E,EAAEmE,iBAGJoG,EAAUhH,wBAAwBvD,EAAEwJ,UAAWxJ,EAAEyJ,QAASjG,GAAc,GAG1E,IAAK,IAAI9D,EAAI,EAAGA,EAAI+I,EAASvK,OAAQwB,IACrC,CACE,MAAMM,EAAIyI,EAAS/I,GACb8K,EAAe,IAAIxC,GAAYhI,EAAErG,KAAMqG,EAAEtD,QAC/C6N,EAAUnH,iBAAiBpD,EAAEqJ,QAASmB,GAGxC,OAAOD,EAGTH,gBAAgBK,GAEd,MAAMP,EAAS,GAET7H,EAAOD,OAAOC,KAAKoI,GAEzB,IAAK,IAAI/K,EAAI,EAAGA,EAAI2C,EAAKnE,OAAQwB,IAE/BwK,EAAOtK,KAAK,CACV+D,eAAgBtB,EAAK3C,GACrB8J,UAAW,EACXC,QAAS,EACTF,SAAUkB,EAAMpI,EAAK3C,IACrBgF,SAAS,EACTP,gBAAiB,sBAIrB,OAAO+F,EAGTQ,aAAaC,EAAKjJ,GAEhB,MAAMkJ,GAAkB,IAAK1C,IAAwBrN,MAAM8P,GACrDT,EAASU,EAAgBpC,iBACzBC,EAAWmC,EAAgBnC,SAC3B8B,EAAY,IAAI9I,GAAgBC,GAEtC,IAAK,IAAIhC,EAAI,EAAGA,EAAIwK,EAAOhM,OAAQwB,IACnC,CACE,MAAMM,EAAIkK,EAAOxK,GACX8D,EAAe,IAAImE,GACvB3H,EAAE2D,eACFjC,EAAQ1B,EAAE2D,gBACV3D,EAAEuJ,SACFvJ,EAAE0E,QACF1E,EAAEmE,iBAGJoG,EAAUhH,wBAAwBvD,EAAEwJ,UAAWxJ,EAAEyJ,QAASjG,GAAc,GAG1E,IAAK,IAAI9D,EAAI,EAAGA,EAAI+I,EAASvK,OAAQwB,IACrC,CACE,MAAMM,EAAIyI,EAAS/I,GACb8K,EAAe,IAAIxC,GAAYhI,EAAErG,KAAMqG,EAAEtD,QAC/C6N,EAAUnH,iBAAiBpD,EAAEqJ,QAASmB,GAGxC,OAAOD,GC8CX,IAAeM,GAAA,IArJf,MAEE7R,OAEEC,KAAK6R,MAAQ,GAEb7R,KAAK8R,iBAA6B,eAClC9R,KAAK+R,iBAA6B,gBAClC/R,KAAKgS,mBAA6B,iBAClChS,KAAKiS,eAA6B,iBAElCjS,KAAKkS,uBAA6B,yBAClClS,KAAKmS,eAA6B,iBAClCnS,KAAKoS,0BAA6B,wBAElCpS,KAAKqS,oBAA6B,kBAClCrS,KAAKsS,oBAA6B,kBAClCtS,KAAKuS,qBAA6B,wBAElCvS,KAAKwS,kBAA6B,gBAElCxS,KAAKyS,0BAA6B,4BAClCzS,KAAK0S,yBAA6B,2BAElC1S,KAAK2S,yBAA6B,2BAClC3S,KAAK4S,wBAA6B,0BAElC5S,KAAK6S,4BAA+B,8BACpC7S,KAAK8S,2BAA+B,6BAEpC9S,KAAK+S,kBAAoB,gBAG3BC,KAAKC,EAAOC,GAEV,MAAMrB,EAAQ7R,KAAK6R,MAAMoB,GAEzB,QAAc7P,IAAVyO,EAEF,OAEF,IAAIpL,EAAIoL,EAAM5M,OACd,KAAOwB,KAELoL,EAAMpL,GAAGyM,GAIbC,GAAGF,EAAOG,QAEyB,IAAtBpT,KAAK6R,MAAMoB,KAEpBjT,KAAK6R,MAAMoB,GAAS,IAGtBjT,KAAK6R,MAAMoB,GAAOtM,KAAKyM,GAGzBC,kBAAkBC,GAEhBtT,KAAKgT,KAAKhT,KAAK8R,iBAAkBwB,GAGnCC,oBAAoBC,GAElBxT,KAAKgT,KAAKhT,KAAK+R,iBAAkByB,GAGnCC,oBAAoBC,GAElB1T,KAAKgT,KAAKhT,KAAKgS,mBAAoB0B,GAGrCC,sBAEE3T,KAAKgT,KAAKhT,KAAKiS,gBAGjB2B,4BAA4BC,GAE1B7T,KAAKgT,KAAKhT,KAAKkS,uBAAwB2B,GAGzCC,sBAEE9T,KAAKgT,KAAKhT,KAAKmS,gBAGjB4B,mBAAmBC,GAEjBhU,KAAKgT,KAAKhT,KAAK+S,kBAAmBiB,GAGpCC,2BAA2BT,GAEzBxT,KAAKgT,KAAKhT,KAAKoS,0BAA2BoB,GAG5CU,qBAAqBC,GAEnBnU,KAAKgT,KAAKhT,KAAKqS,oBAAqB8B,GAGtCC,qBAAqBC,GAEnBrU,KAAKgT,KAAKhT,KAAKsS,oBAAqB+B,GAGtCC,2BAA2BC,GAEzBvU,KAAKgT,KAAKhT,KAAKuS,qBAAsBgC,GAGvCC,oBAAoBC,GAElBzU,KAAKgT,KAAKhT,KAAKwS,kBAAmBiC,GAGpCC,+BAA+BlD,GAE7BxR,KAAKgT,KAAKhT,KAAKyS,0BAA2BjB,GAG5CmD,8BAA8BnD,GAE5BxR,KAAKgT,KAAKhT,KAAK0S,yBAA0BlB,GAG3CoD,8BAA8BpD,GAE5BxR,KAAKgT,KAAKhT,KAAK2S,yBAA0BnB,GAG3CqD,6BAA6BrD,GAE3BxR,KAAKgT,KAAKhT,KAAK4S,wBAAyBpB,GAG1CsD,iCAAiCtD,GAE/BxR,KAAKgT,KAAKhT,KAAK6S,4BAA6BrB,GAG9CuD,gCAAgCvD,GAE9BxR,KAAKgT,KAAKhT,KAAK8S,2BAA4BtB,KC3G/C,IAAewD,GAAA,IApCf,MAEEjV,OAEEC,KAAKiV,UAAY,GACjBjV,KAAKqD,iBAAmB,GAG1Ba,aAAaxD,EAAMsB,EAAKmS,GAEThL,OAAOC,KAAKpJ,KAAKqD,kBAErB0M,SAAS/N,GAEhBhC,KAAKiV,UAAUvU,GAAQV,KAAKqD,iBAAiBrB,IAI7ChC,KAAKiV,UAAUvU,GAAQyT,EACvBnU,KAAKqD,iBAAiBrB,GAAOmS,GAG/Be,GAAahB,qBAAqB,CAAExT,KAAMA,EAAMqE,MAAOoP,IAGzDgB,aAAazU,GAEX,OAAOV,KAAKiV,UAAUvU,GAGxBkE,IAAIlE,GAEF,OAAOV,KAAKiV,UAAUvU,KClCX,MAAM0U,GAEnB/T,mBAAmBgU,GAEjB,MAAMC,EAASD,EAAU/F,iBAAiB,OAE1C,IAAK,IAAI7I,EAAI,EAAGA,EAAI6O,EAAOrQ,OAAQwB,IACnC,CACE,MAAM8O,EAAQD,EAAO7O,GAEjB8O,EAAMC,QAAQC,MAEhBF,EAAME,IAAMF,EAAMC,QAAQC,KAI9B,MAAMC,EAAgBL,EAAU/F,iBAAiB,UAEjD,IAAK,IAAI7I,EAAI,EAAGA,EAAIiP,EAAczQ,OAAQwB,IAC1C,CACE,MAAMkP,EAAeD,EAAcjP,GAE/BkP,EAAaH,QAAQC,MAEvBE,EAAaxQ,KAAOwQ,EAAaH,QAAQC,MAK/CpU,mBAAmBgU,GAEjB,MAAMO,EAASP,EAAU/F,iBAAiB,SAE1C,IAAK,IAAI7I,EAAI,EAAGA,EAAImP,EAAO3Q,OAAQwB,IACnC,CACE,MAAMoP,EAAQD,EAAOnP,GAEjBoP,EAAML,QAAQC,MAEhBI,EAAMJ,IAAMI,EAAML,QAAQC,OCrCnB,MAAMK,GAEnB1U,cAEEpB,KAAK+V,YAAc,GACnB/V,KAAK6Q,mBAAqB,GAG5BjM,IAAIoR,EAAiBC,EAAejF,GAElC,IAAK,IAAIvK,EAAI,EAAGA,EAAIzG,KAAK+V,YAAY9Q,OAAQwB,IAE3C,GAAIzG,KAAK+V,YAAYtP,GAAGG,OAASoP,GAAmBhW,KAAK+V,YAAYtP,GAAGI,KAAOoP,EAC/E,CAGE,OAFyB,IAAIrF,GAAuB5Q,KAAK6Q,oBAAoBC,qBAAqB9Q,KAAK+V,YAAYtP,GAAGtB,KAAM6L,GAMhI,IAAK,IAAIvK,EAAI,EAAGA,EAAIzG,KAAK+V,YAAY9Q,OAAQwB,IAE3C,GAAIzG,KAAK+V,YAAYtP,GAAGI,KAAOoP,EAC/B,CAGE,OAFyB,IAAIrF,GAAuB5Q,KAAK6Q,oBAAoBC,qBAAqB9Q,KAAK+V,YAAYtP,GAAGtB,KAAM6L,GAMhIrO,QAAQM,MAAM,0CAA2C+S,EAAiBC,GAI5EC,gBAAgBH,GAEd,IAAK,IAAItP,EAAI,EAAGA,EAAIsP,EAAY9Q,OAAQwB,IAEtCzG,KAAK+V,YAAYpP,KAAKoP,EAAYtP,IAItC0P,gBAAgBJ,GAEd/V,KAAK+V,YAAcA,EAGrBK,uBAAuBvF,GAErB7Q,KAAK6Q,mBAAqBA,GCK9B,IAAewF,GAAA,IArDf,MAEEjV,cAEEpB,KAAKsW,aAAe,CAAC,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,MAGtFvW,OAEEC,KAAKuW,QAAU,IAAIC,EACnBxW,KAAKyW,iBAAmB,EACxBzW,KAAK0W,eAAiB,EACtB1W,KAAK2W,iBAAmB,IAAIC,EAAQ,EAAG,GAEvC5W,KAAK6J,WAAa,KAGhBnB,mBAEF,OAAO1I,KAAK0W,eAGVG,kBAIF,OAFA7W,KAAK2W,iBAAiBrP,EAAItH,KAAK6J,WAC/B7J,KAAK2W,iBAAiBpP,EAAIvH,KAAK0I,aACvB1I,KAAK2W,iBAGfG,WAEE9W,KAAKyW,iBAAmBzW,KAAKuW,QAAQQ,WACrC/W,KAAK0W,eAAiB1W,KAAKuW,QAAQS,iBAEnChX,KAAKsW,aAAaW,QAClBjX,KAAKsW,aAAa3P,KAAK3G,KAAKyW,iBAAmB,IAAOzW,KAAKyW,iBAAmB,MAE9EzW,KAAKkX,yBAGPA,yBAEElX,KAAK6J,WAAa,EAElB,IAAK,IAAIpD,EAAI,EAAGA,EAAIzG,KAAKsW,aAAarR,OAAQwB,IAE5CzG,KAAK6J,YAAc7J,KAAKsW,aAAa7P,GAGvCzG,KAAK6J,WAAa7J,KAAK6J,WAAa7J,KAAKsW,aAAarR,SCpD3C,MAAMkS,GAEnB/V,YAAYV,GAEVV,KAAKU,KAAOA,EAGd0W,SAIAC,QAIAC,QAIAC,gBAIAC,YAIA5N,UAIA6N,wBAAwBC,EAAkBC,EAAqBC,GAG7D5X,KAAK6X,kBAAkBH,EAAkBC,EAAqBC,GAGhEE,uBAAuBJ,EAAkBC,EAAqBC,IAK9DC,kBAAkBH,EAAkBC,EAAqBC,IAIzDG,eAIAC,YC/Ca,MAAMC,GAEnB7W,YAAY8W,GAEVlY,KAAKmY,WAAa,IAAIhB,GACtBnX,KAAKoY,cAAgB,IAAIjB,GAEzBnX,KAAK6Q,mBAAqB,GAC1B7Q,KAAKqY,mBAAqB,GAE1BrY,KAAKkY,iBAAmBA,EAExBlY,KAAKsY,eAAgB,EAGvBC,YAAY/G,EAAO/H,GAAO,GAEpBzJ,KAAKsY,eAEPtY,KAAKwY,oBAGPxY,KAAKmY,WAAanY,KAAKoY,cACvBpY,KAAKoY,cAAgB5G,EAErBxR,KAAKmY,WAAWJ,cAChB/X,KAAKoY,cAAcf,OAEnBrX,KAAK4X,iBAAmB5X,KAAKkY,iBAAiBtT,IAAI5E,KAAKmY,WAAWzX,KAAMV,KAAKoY,cAAc1X,KAAMV,KAAKqY,oBACtGrY,KAAKoY,cAAcb,eAEnBvX,KAAK4X,iBAAiBtO,OAEtBtJ,KAAKsY,eAAgB,EAEjB7O,IAEFzJ,KAAK4X,iBAAiBnO,OACtBzJ,KAAK4J,UAITA,SAEM5J,KAAKsY,eAEPtY,KAAKyY,uBAEDzY,KAAK4X,iBAAiB1N,gBAExBlK,KAAKsY,eAAgB,EAErBtY,KAAKyY,uBAELzY,KAAKwY,oBAELxY,KAAKoY,cAAcZ,aAKrBxX,KAAKoY,cAAcxO,SAIvB8O,UAAUlH,GAERxR,KAAKoY,cAAgB5G,EAGvB4E,uBAAuBvF,GAErB1H,OAAOwP,OAAO3Y,KAAK6Q,mBAAoBA,GACvC1H,OAAOwP,OAAO3Y,KAAKqY,mBAAoBxH,GAGzC4H,uBAEEzY,KAAK4X,iBAAiBhO,OAAOgP,GAAK/O,YAClC7J,KAAKmY,WAAWL,uBAAuB9X,KAAKqY,mBAAoBrY,KAAK4X,iBAAiB3N,eAAgBjK,KAAK4X,kBAC3G5X,KAAKoY,cAAcX,wBAAwBzX,KAAKqY,mBAAoBrY,KAAK4X,iBAAiB3N,eAAgBjK,KAAK4X,kBAGjHY,oBAEMxY,KAAKmY,WAAWzX,OAASV,KAAKoY,cAAc1X,MAE9CV,KAAKmY,WAAWb,OAGlBtX,KAAKmY,WAAWH,WCsFpB,IAAea,GAAA,IAhLf,MAEEzX,cAEEpB,KAAK8Y,MAAQ,GAEb9Y,KAAKkY,iBAAmB,IAAIpC,GAC5B9V,KAAK+Y,mBAAqB,IAAId,GAA2BjY,KAAKkY,kBAE9DlY,KAAKgZ,wBAA0B,GAE/BhZ,KAAKiZ,qBAAuB,GAG9BrP,SAEE5J,KAAK+Y,mBAAmBnP,SAExB5J,KAAKkZ,wBAGPC,WAAWC,EAAWC,GAAa,EAAM5P,GAAO,GAE9C,MAAM5B,EAAI7H,KAAK4E,IAAIwU,GACnBpZ,KAAK+Y,mBAAmBR,YAAY1Q,EAAG4B,GAEnC4P,IAEFrZ,KAAKsZ,qBAAqBzR,EAAE7F,KAC5BhC,KAAKuZ,uBAAuB1R,EAAE7F,MAGhChC,KAAKwZ,mBAAmBJ,GAG1BK,yBAAyBC,GAEvB1Z,KAAKgZ,wBAAwBrS,KAAK+S,GAGpCF,mBAAmBJ,GAEjB,IAAK,IAAI3S,EAAI,EAAGA,EAAIzG,KAAKgZ,wBAAwB/T,OAAQwB,IACzD,CACqBzG,KAAKgZ,wBAAwBvS,GACrCkT,eAAeP,IAI9BQ,cAAcC,GAEZ7Z,KAAK8Y,MAAMnS,KAAKkT,GAGlBC,SAASV,GAEP,IAAK,IAAI3S,EAAI,EAAGA,EAAIzG,KAAK8Y,MAAM7T,OAAQwB,IAErC,GAAIzG,KAAK8Y,MAAMrS,GAAG/F,OAAS0Y,EAEzB,OAAO,EAGX,OAAO,EAGTlD,gBAAgBH,GAEd/V,KAAKkY,iBAAiBhC,gBAAgBH,GAGxCI,gBAAgBJ,GAEd/V,KAAKkY,iBAAiB/B,gBAAgBJ,GAGxCgE,SAASX,GAEP,MAAMS,EAAO7Z,KAAK4E,IAAIwU,GAEtBpZ,KAAK+Y,mBAAmBL,UAAUmB,GAGpCG,yBAAyBC,GAEvBja,KAAKiZ,qBAAuBgB,EAG9BC,mBAEE,OAAOla,KAAK+Y,mBAAmBX,cAGjC+B,iBAAiBf,GAEfzW,QAAQC,KAAK,2CACb5C,KAAK4E,IAAIwU,GAGXxU,IAAIwU,GAEF,IAAK,IAAI3S,EAAI,EAAGA,EAAIzG,KAAK8Y,MAAM7T,OAAQwB,IAErC,GAAIzG,KAAK8Y,MAAMrS,GAAG/F,OAAS0Y,EAEzB,OAAOpZ,KAAK8Y,MAAMrS,GAGtB9D,QAAQM,MAAM,wCAAyCmW,GAIzDgB,gBAAgBpY,GAEdW,QAAQC,KAAK,kDACb5C,KAAKqa,WAAWrY,GAGlBqY,WAAWrY,GAET,IAAK,IAAIyE,EAAI,EAAGA,EAAIzG,KAAK8Y,MAAM7T,OAAQwB,IAErC,GAAIzG,KAAK8Y,MAAMrS,GAAGzE,MAAQA,EAExB,OAAOhC,KAAK8Y,MAAMrS,GAGtB9D,QAAQM,MAAM,+CAAgDjB,GAIhEoU,uBAAuBvF,GAErB7Q,KAAKkY,iBAAiB9B,uBAAuBvF,GAC7C7Q,KAAK+Y,mBAAmB3C,uBAAuBvF,GAGjDyI,qBAAqBtX,GAEnB7B,OAAOma,QAAQC,UAAU,GAAI,GAAIvY,GAGnCuX,uBAAuB7Y,GAErB,MAAM8Z,EAAQxa,KAAKya,aAAa/Z,GAEhCga,SAASF,MAAQA,EAAQ,GAAGA,OAAWxa,KAAKiZ,uBAAyBjZ,KAAKiZ,qBAG5EC,wBAEE,IAAK,IAAIzS,EAAI,EAAGA,EAAIzG,KAAK8Y,MAAM7T,OAAQwB,IAErCzG,KAAK8Y,MAAMrS,GAAGkU,YAAY3a,KAAK+Y,mBAAmBV,oBAItDoC,aAAaG,GAEX,IAAIC,EAAaD,EAAOE,cAAcC,QAAQ,IAAK,IAGnD,OAFAF,EAAa7a,KAAKgb,sBAAsBH,GAEjCA,EAGTG,sBAAsBJ,GAEpB,OAAOA,EAAOG,QACZ,gBACCE,GAAUA,EACRF,QAAQ,IAAK,KACbA,QAAQ,IAAK,SCzKP,MAAMG,WAAwB/D,GAE3C/V,aAAYV,KAAEA,EAAIsB,IAAEA,EAAGqT,UAAEA,IAEvB1G,MAAMjO,GAENV,KAAKqV,UAAYA,EACjBrV,KAAKgC,IAAMA,EAEX,IAAI2P,EAAkBwJ,GAAkBvW,IAAI,GAAGlE,UAE/CiR,EAAkBA,GAAmB,CACnCpC,iBAAkB,GAClBC,SAAU,IAGZ,MAAMuG,EAAc,CAClB,CACElP,GAAInG,EACJyE,KAAMwM,IAIVyJ,GAAYxB,cAAc5Z,MAC1Bob,GAAYlF,gBAAgBH,GAG9BsB,OAEErX,KAAKqV,UAAUgG,UAAUpT,IAAI,gBAC7BjI,KAAKqV,UAAUgG,UAAUC,OAAO,eAChCtb,KAAKqV,UAAUgG,UAAUC,OAAO,UAGlC9D,WAEExX,KAAKqV,UAAUgG,UAAUC,OAAO,gBAChCtb,KAAKqV,UAAUgG,UAAUC,OAAO,eAChCtb,KAAKqV,UAAUgG,UAAUC,OAAO,UAGlCvD,cAEE/X,KAAKqV,UAAUgG,UAAUpT,IAAI,eAC7BjI,KAAKqV,UAAUgG,UAAUC,OAAO,gBAChCtb,KAAKqV,UAAUgG,UAAUC,OAAO,UAGlChE,OAEEtX,KAAKqV,UAAUgG,UAAUpT,IAAI,UAC7BjI,KAAKqV,UAAUgG,UAAUC,OAAO,gBAChCtb,KAAKqV,UAAUgG,UAAUC,OAAO,eAGlCC,mBAEEnG,GAAcoG,YAAYxb,KAAKqV,WAGjCoG,mBAEErG,GAAcsG,YAAY1b,KAAKqV,WAGjCsF,YAAYtC,GAEVrY,KAAKqV,UAAUsG,MAAMC,QAAUvD,EAAmB,GAAGrY,KAAKU,iBCxE/C,MAAMmb,GAEnBC,iBAGAtE,YAGAQ,WAGApO,UAGAmS,kBAGAC,iBAGAC,iBCpBa,MAAMC,GAEnB9a,eAKA+a,UAKA3E,SAAS/O,EAAS2T,IAKlBpE,QAAQvP,EAAS2T,IAKjBC,UAKAC,gQCrBa,MAAMC,WAA2BC,EAE9Cpb,YAAYqb,EAAMC,EAAMC,GAEtBhO,MAAM,CACJiO,aAAcH,GAAUI,GACxBC,eAAgBJ,GAAQK,GACxBJ,SAAUA,GAAc,CACtBK,OAAQ,CAAEjY,MAAO,IAAIkY,EAAM,gBCNpB,MAAMC,WAAqBV,EAExCpb,YAAY+b,EAAaC,EAAaC,GAEpC1O,MAAM,CACJgO,SAAU,CACRW,SAAU,CAAEvY,MAAO,MACnBwY,YAAa,CAAExY,MAAO,IAAI6R,EAAQ,EAAG,IACrC4G,kBAAmB,CAAEzY,MAAO,IAAI6R,EAAQ,EAAG,KAE7CyG,QAASA,GAAW,GACpBT,aAAcQ,mGACdN,eAAgBK,uHAChBM,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXC,UAAWC,KCNjB,IAAeC,GAAA,IAlBf,MAEEhe,OAEEC,KAAKge,cAAW5a,EAGduI,YAAQsS,GAEVje,KAAKge,SAAWC,EAGdtS,cAEF,OAAO3L,KAAKge,WCJhB,IAAeE,GAAA,IAVf,MAEEne,OAEEC,KAAKme,eAAiB,EACtBne,KAAKoe,kCAAmC,EACxCpe,KAAKqe,uBAAwB,ICAlB,MAAMC,GAEnBld,YAAYmd,GAEVve,KAAKue,kBAAoBA,EACzBve,KAAKwe,aAAe,KAEpBxe,KAAKye,OAAS/D,SAASgE,cAAc,UACrC1e,KAAK2e,IAAM3e,KAAKye,OAAOG,WAAW,MAGpCC,cAAcC,EAAY,SAExB,GAAyB,MAArB9e,KAAKwe,cAAwBxe,KAAKue,kBACtC,CACE,MAAM/Z,EAAOkW,SAASqE,qBAAqB,QAAQ,GAC7CC,EAAQtE,SAASgE,cAAc,OAC/BO,EAAYvE,SAASwE,eAAe,eAC1CF,EAAMG,YAAYF,GAClBD,EAAMI,aAAa,QAAS,QAAQN,oCACpCta,EAAK2a,YAAYH,GACjBhf,KAAKwe,aAAeQ,EAAMK,aAC1B7a,EAAK8a,YAAYN,GAEnB,OAAOhf,KAAKwe,aAGde,cAAcC,EAAMC,EAAO,cAEzB,MAAMxd,EAAO,IAAI2U,EAIjB,OAHA5W,KAAK2e,IAAIc,KAAOA,EAChBxd,EAAKqF,EAAIvB,KAAK2Z,KAAK1f,KAAK2e,IAAIgB,YAAYH,GAAMI,OAC9C3d,EAAKsF,EAAIxB,KAAK2Z,KAAK1f,KAAK6e,cAAcY,IAC/Bxd,EAGT4d,YAAYL,EAAMM,EAAa,IAM7B,OAJAA,EAAWL,KAAOK,EAAWL,MAAQ,aACrCK,EAAWC,WAAaD,EAAWC,YAAc,UAEjD/f,KAAKggB,OAAOR,EAAMM,EAAY9f,KAAKye,OAAQze,KAAK2e,KACzC3e,KAAKye,OAGdwB,gBAAgBT,EAAMM,GAEpB,MAAMrB,EAASze,KAAK6f,YAAYL,EAAMM,GAChCI,EAAiB,IAAIC,EAAc1B,EAAQ2B,EAC/CC,EACAA,EACAC,EACAA,GAIF,OAHAJ,EAAeK,iBAAkB,EACjCL,EAAeM,aAAc,EAEtBN,EAGTF,OAAOR,EAAMM,IAGbW,UAAU9B,EAAKrX,EAAGC,EAAGqY,EAAOc,EAAQC,EAAQC,EAAMC,GAUhD,QARsB,IAAXA,IAETA,GAAS,QAEW,IAAXF,IAETA,EAAS,GAEW,iBAAXA,EAETA,EAAS,CAAEG,GAAIH,EAAQI,GAAIJ,EAAQK,GAAIL,EAAQM,GAAIN,OAGrD,CACE,MAAMO,EAAgB,CAAEJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACjD,IAAK,MAAME,KAAQD,EAEjBP,EAAOQ,GAAQR,EAAOQ,IAASD,EAAcC,GAGjDxC,EAAIyC,YACJzC,EAAI0C,OAAO/Z,EAAIqZ,EAAOG,GAAIvZ,GAC1BoX,EAAI2C,OAAOha,EAAIsY,EAAQe,EAAOI,GAAIxZ,GAClCoX,EAAI4C,iBAAiBja,EAAIsY,EAAOrY,EAAGD,EAAIsY,EAAOrY,EAAIoZ,EAAOI,IACzDpC,EAAI2C,OAAOha,EAAIsY,EAAOrY,EAAImZ,EAASC,EAAOK,IAC1CrC,EAAI4C,iBAAiBja,EAAIsY,EAAOrY,EAAImZ,EAAQpZ,EAAIsY,EAAQe,EAAOK,GAAIzZ,EAAImZ,GACvE/B,EAAI2C,OAAOha,EAAIqZ,EAAOM,GAAI1Z,EAAImZ,GAC9B/B,EAAI4C,iBAAiBja,EAAGC,EAAImZ,EAAQpZ,EAAGC,EAAImZ,EAASC,EAAOM,IAC3DtC,EAAI2C,OAAOha,EAAGC,EAAIoZ,EAAOG,IACzBnC,EAAI4C,iBAAiBja,EAAGC,EAAGD,EAAIqZ,EAAOG,GAAIvZ,GAC1CoX,EAAI6C,YACAZ,GAEFjC,EAAIiC,OAEFC,GAEFlC,EAAIkC,UCtFV,IAAeY,GAAA,IAff,MAEE1hB,KAAK2hB,EAAa,IAEhB1hB,KAAK2hB,IAAM,EAEX3hB,KAAK6O,IAAO,GAGd+S,UAAUC,MCfG,MAAMC,GAEnB1gB,eAII2gB,mBAEF,OAAO,EAGTvK,SAASqC,IAKTjQ,OAAOiQ,IAIP7B,QAAQ6B,KCfK,MAAMmI,GAEnB5gB,cAEEpB,KAAK+G,EAAI,EACT/G,KAAKiiB,kBAAoB,EAGvBF,mBAEF,OAAO,EAGTvK,SAAS0K,IAITtY,OAAOsY,GAELliB,KAAK+G,GAAK6R,GAAK/O,WAAaqY,EAAS7Y,SAErCrJ,KAAKiiB,kBAAoBC,EAAShX,gBAAgBlL,KAAK+G,GACvD/G,KAAKiiB,kBAAoBhb,EAAMsB,MAAMvI,KAAKiiB,kBAAmB,EAAG,GAEhEC,EAASC,mBAAmBlb,EAAMC,KAAKgb,EAAStb,KAAMsb,EAASrb,GAAI7G,KAAKiiB,oBAEpEjiB,KAAKiiB,mBAAqB,QAE5BC,EAASC,mBAAmBD,EAASrb,IAErCqb,EAASE,kBAAkB,IAAIN,IAC/BI,EAASG,kBAAkBH,IAI/BlK,QAAQ6B,KCpCK,MAAMyI,GAEnBlhB,aAAYiQ,QACVA,EAAOkR,aACPA,EAAY3b,KACZA,EAAO,EAACC,GACRA,EAAK,EAACwC,SACNA,EAAW,EAACmZ,aACZA,EAAe,GAAEC,aACjBA,EAAgB,GAAEvX,gBAClBA,EAAkBuD,GAAgBhC,kBAAiB4V,kBACnDA,EAAoB,WAIpBriB,KAAKqR,QAAUA,EACfrR,KAAKuiB,aAAeA,EACpBviB,KAAK4G,KAAOA,EACZ5G,KAAK6G,GAAKA,EACV7G,KAAKwiB,aAAeA,EACpBxiB,KAAKyiB,aAAeA,EACpBziB,KAAKqJ,SAAWA,EAChBrJ,KAAKkL,gBAAkBA,EACvBlL,KAAKqiB,kBAAoBA,EAEzBriB,KAAKoY,cAAgB,IAAI0J,GAG3BY,UAEE1iB,KAAKoiB,kBAAkB,IAAIJ,IAG7BzY,OAEEvJ,KAAKoiB,kBAAkB,IAAIN,IAG7BK,mBAAmBpd,GAEjB/E,KAAKqR,QAAQsK,MAAM3b,KAAKuiB,cAAgB,GAAGviB,KAAKwiB,eAAezd,IAAQ/E,KAAKyiB,eAG9E7Y,SAEE5J,KAAKoY,cAAcxO,OAAO5J,MAGxB+hB,mBAEF,OAAO/hB,KAAKoY,cAAc2J,aAG5BK,kBAAkB5Q,GAEhBxR,KAAKoY,cAAcJ,QAAQhY,MAC3BA,KAAKoY,cAAgB5G,EACrBxR,KAAKoY,cAAcZ,SAASxX,OCrDjB,MAAM2iB,WAAmBC,EAEtCxhB,YAAYyhB,EAAQ,GAElBlU,QAEA,MAAMmU,EAAc,GACpBA,EAAYnc,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IACnCuc,EAAYnc,KAAK,IAAIJ,EAAQ,EAAG,EAAG,MAEnC,MAAMwc,EAAgB,IAAIC,EAAkB,CAAEC,MAAO,QAAUpF,UAAWC,IACpEoF,GAAgB,IAAIC,GAAiBC,cAAcN,GACnDO,EAAiB,IAAIC,EAAKJ,EAAeH,GAC/CM,EAAeE,YAAc,IAE7B,MAAMC,EAAe,GACrBA,EAAa7c,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IACpCid,EAAa7c,KAAK,IAAIJ,EAAQ,EAAG,IAAM,IAEvC,MAAMkd,EAAiB,IAAIT,EAAkB,CAAEC,MAAO,QAAUpF,UAAWC,IACrE4F,GAAiB,IAAIP,GAAiBC,cAAcI,GACpDG,EAAkB,IAAIL,EAAKI,EAAgBD,GACjDE,EAAgBJ,YAAc,IAE9B,MAAMK,EAAa,GACnBA,EAAWjd,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IAClCqd,EAAWjd,KAAK,IAAIJ,EAAQ,IAAM,EAAG,IAErC,MAAMsd,EAAe,IAAIb,EAAkB,CAAEC,MAAO,SAAUpF,UAAWC,IACnEgG,GAAe,IAAIX,GAAiBC,cAAcQ,GAClDG,EAAgB,IAAIT,EAAKQ,EAAcD,GAC7CE,EAAcR,YAAc,IAE5BvjB,KAAKujB,YAAc,IAEnBvjB,KAAKiI,IAAIob,GACTrjB,KAAKiI,IAAI0b,GACT3jB,KAAKiI,IAAI8b,GAET/jB,KAAK6iB,MAAMmB,IAAInB,EAAOA,EAAOA,GAG/BjZ,UAIA0S,YCXF,IAAe2H,GAAA,IAzCf,MAEElkB,OAEEC,KAAKge,SAAW,IAAIkG,EACpBlkB,KAAKge,SAAStd,KAAO,gBAGvByjB,UAAUzjB,IAKNiL,cAEF,OAAO3L,KAAKge,SAGVrS,YAAQyY,GAEVpkB,KAAKge,SAAWoG,EAGlB9H,UAWE,IATAtc,KAAK2L,QAAQ0Y,UAASC,IAEhBA,EAAMC,WAERD,EAAMC,SAASjI,UACfgI,EAAME,SAASlI,cAIZtc,KAAK2L,QAAQ8Y,SAASxf,OAAS,GAEpCjF,KAAK2L,QAAQ2P,OAAOtb,KAAK2L,QAAQ8Y,SAAS,MCjCjC,MAAMC,WAAaC,EAEhCvjB,YAAYa,EAAM2iB,EAAU3B,GAE1BhhB,EAAWA,GAAQ,IAAIsE,EAAQ,EAAG,EAAG,GACrCqe,EAAWA,GAAY,IAAIre,EAAQ,EAAG,EAAG,GACzC0c,EAAWA,GAAS,SAGpBtU,MAFiB,IAAIkW,EAAY5iB,EAAKqF,EAAGrF,EAAKsF,EAAGtF,EAAK8F,EAAG6c,EAAStd,EAAGsd,EAASrd,EAAGqd,EAAS7c,GACzE,IAAI+c,EAAkB,CAAE7B,MAAOA,MCTrC,MAAM8B,WAAeJ,EAElCvjB,YAAYuf,EAAQsC,GAElBA,EAAQA,GAAS,UAIjBtU,MAFiB,IAAIqW,EADrBrE,EAASA,GAAU,EAC+B,GAAI,IACrC,IAAImE,EAAkB,CAAE7B,MAAOA,MCJrC,MAAMgC,WAAcN,EAEjCvjB,YAAY6hB,EAAOhe,EAAQigB,GAEzBjC,EAAQA,GAAS,UAGjB,MACMkC,GAHNlgB,EAASA,GAAU,GAEC,GAEdmgB,EAAe,IAAIC,EAAuB,IAAM,IAAMF,EAAiB,IAC7EC,EAAaE,UAAU,EAAGH,EAAkB,EAAG,GAE/C,MAAMI,EAAgB,IAAIC,EAAmB,GALzB,GAK2C,IAC/DD,EAAcD,UAAU,EAAGH,EAAkBM,GAAiB,GAE9D,MAAMC,EAAkBC,GAAoBC,sBAAsB,CAACR,EAAcG,IACjFG,EAAgBG,QAAQ,MAGxBlX,MAAM+W,EADW,IAAIZ,EAAkB,CAAE7B,MAAOA,KAG5CiC,GAEFllB,KAAK8lB,WAAWC,mBAAmB,IAAIxf,EAAQ,EAAG,EAAG,GAAI2e,GAG3DllB,KAAKgmB,KAAOd,EAGVA,QAAIA,GAENllB,KAAK8lB,WAAWC,mBAAmB,IAAIxf,EAAQ,EAAG,EAAG,GAAI2e,GACzDllB,KAAKgmB,KAAOd,EAGVA,UAEF,OAAOllB,KAAKgmB,KAGV/gB,WAAOF,GAET/E,KAAK6iB,MAAM9a,EAAIhD,EAGbE,aAEF,OAAOjF,KAAK6iB,MAAM9a,GCmBtB,IAAeke,GAAA,IAvEf,MAEElmB,OAEEC,KAAK4f,MAAQ,EACb5f,KAAK0gB,OAAS,EAEd1gB,KAAKkmB,SAAW,IAAItP,EAEpB5W,KAAKmmB,aAAe,EACpBnmB,KAAKomB,cAAgB,EACrBpmB,KAAKqmB,aAAe,IAAIzP,EAAQ5W,KAAK4f,MAAO5f,KAAK0gB,QAEjD1gB,KAAK2hB,IAAM,EACX3hB,KAAKsmB,WAAa,IAAI1P,EAAQ,EAAI5W,KAAK4f,MAAO,EAAI5f,KAAK0gB,QAGzD6F,gBAAgBjf,EAAGC,GAEjBvH,KAAKkmB,SAASlC,IAAI1c,EAAGC,GAGvBqC,SAEE5J,KAAKwmB,cAAe,EAGtBC,YAAY7G,EAAOc,GAEjB1gB,KAAK4f,MAAQA,EACb5f,KAAK0gB,OAASA,EAEd1gB,KAAKsmB,WAAa,IAAI1P,EAAQ,EAAI5W,KAAK4f,MAAO,EAAI5f,KAAK0gB,QAEvD1gB,KAAKqmB,aAAa/e,EAAIsY,EACtB5f,KAAKqmB,aAAa9e,EAAImZ,EAEtB1gB,KAAKmmB,aAAevG,EAAQ5f,KAAK2hB,IACjC3hB,KAAKomB,cAAgB1F,EAAS1gB,KAAK2hB,IAEnC3hB,KAAKwmB,cAAe,EAGtBE,uBAAuBC,GAIrB,OAFAA,EAAQze,eAAe,EAAIlI,KAAK2hB,KAEzBgF,EAGTC,oBAAoB7hB,GAElB,OAAOA,GAAS,EAAI/E,KAAK2hB,KAG3BkF,iBAEE,OAAO7mB,KAAKsmB,WAGVQ,mBAEF,OAAO9mB,KAAK4f,MAAQ5f,KAAK0gB,OAGvBqG,eAEF,OAAO/mB,KAAK4f,MAAQ5f,KAAK0gB,SCnEd,MAAMsG,WAAmCzK,GAEtDnb,YAAYkG,EAAGC,EAAGO,EAAGmf,GA4BnBtY,MA1Ba,ogBAiBA,8JASK,CAChB2O,SAAU,CAAEvY,WAAO3B,GACnB8jB,qBAAsB,CAAEniB,MAAO,IAAI6R,GACnCuQ,YAAa,CAAEpiB,MAAO,IAAI6R,GAC1BwQ,aAAc,CAAEriB,MAAO,IAAI6R,KAI/ByQ,aAAa/f,EAAGC,GAEdvH,KAAK2c,SAASuK,qBAAqBniB,MAAMif,IAAI1c,EAAGC,GAGlD+f,YAAYC,EAAKzf,EAAGmf,GAElBjnB,KAAK2c,SAASW,SAASvY,MAAQwiB,EAC/BvnB,KAAK2c,SAASyK,aAAariB,MAAMif,IAAIuD,EAAIhS,MAAMqK,MAAO2H,EAAIhS,MAAMmL,aAEtDtd,IAAN0E,IAEF9H,KAAK2c,SAASyK,aAAariB,MAAMuC,EAAIQ,QAE7B1E,IAAN6jB,IAEFjnB,KAAK2c,SAASyK,aAAariB,MAAMwC,EAAI0f,GAIzCO,gBAAgB1f,EAAGmf,GAEjBjnB,KAAK2c,SAASwK,YAAYpiB,MAAMif,IAAIlc,EAAGmf,IC3D5B,MAAMQ,WAA0BC,EAE7CtmB,YAAYumB,EAAKC,EAAQC,EAAMC,GAE7BnZ,MAAMgZ,EAAKC,EAAQC,EAAMC,GAEzB9nB,KAAK+nB,YAAc,IAAI9K,EAAM,WAC7Bjd,KAAKgoB,YAAc,GCyPvB,IAAeC,GAAA,IA1Of,MAEEloB,OAEEC,KAAKkoB,YAAc,IAAI3hB,EAAQ,EAAG,EAAG,GACrCvG,KAAKmoB,aAAe,IAAI5hB,EAAQ,EAAG,EAAG,GACtCvG,KAAKooB,qBAAkBhlB,EAEvBpD,KAAKqoB,uBAAyB,GAE9BroB,KAAK2e,SAAMvb,EACXpD,KAAKokB,MAAQ,IAAIF,EACjBlkB,KAAKie,OAAS,IAAIwJ,GAIpBa,WAAWC,EAAQrD,EAAKjC,EAAQ,UAE9B,MAAMuF,EAAQ,IAAIvD,GAAMhC,EAAOiC,EAAIjgB,SAAUigB,EAAI5gB,QAAQmkB,aAGzD,OAFAD,EAAMtC,SAASwC,KAAKH,GACpBI,GAAahd,QAAQ1D,IAAIugB,GAClBA,EAGTI,YAEE,MAAMC,EAAO,IAAIlG,GAEjB,OADAgG,GAAahd,QAAQ1D,IAAI4gB,GAClBA,EAGTC,aAAaC,GAEX/oB,KAAKgpB,SAAWD,EAGlBE,eAAeC,EAAatJ,EAAOc,EAAQuC,GAEzCrD,EAASA,GAAS,IAClBc,EAASA,GAAU,IACnB1gB,KAAK2e,IAAIwK,UAAalG,GAAS,qBAC/BjjB,KAAK2e,IAAIyK,SAASF,EAAY5hB,EAAIsY,EAAQ,EACvC5f,KAAK2e,IAAIF,OAAOiC,OAASwI,EAAY3hB,EAAKmZ,EAAS,EAAGd,EAAOc,GAGlE2I,QAEMrpB,KAAK2e,KAEP3e,KAAK2e,IAAI2K,UAAU,EAAG,EAAGtpB,KAAK2e,IAAIF,OAAOmB,MAAO5f,KAAK2e,IAAIF,OAAOiC,QAIpE6I,aAAa3iB,EAAMC,EAAIoc,GAErBjjB,KAAK2e,IAAI6K,YAAevG,GAAS,qBACjCjjB,KAAK2e,IAAIyC,YACTphB,KAAK2e,IAAI0C,OAAOza,EAAKU,EAAGV,EAAKW,GAC7BvH,KAAK2e,IAAI2C,OAAOza,EAAGS,EAAGT,EAAGU,GACzBvH,KAAK2e,IAAI6C,YACTxhB,KAAK2e,IAAIkC,SAGX4I,UAAUrjB,EAAQ6c,EAAQ,UAExB,MAAMuB,EAAW,IAAIxB,EAAkB,CACrCC,MAAOA,IAGHsB,GAAW,IAAIpB,GAAiBC,cAAchd,GAE9CsjB,EAAO,IAAIpG,EAAKiB,EAAUC,GAGhC,OAFAkF,EAAKC,eAAgB,EACrBhB,GAAahd,QAAQ1D,IAAIyhB,GAClBA,EAGTE,UAAUC,EAAK5nB,EAAMghB,GAEnBhhB,EAAOA,GAAQ,EACfghB,EAAQA,GAAS,SACjB4G,EAAMA,GAAO,IAAItjB,EAEjB,MAAMujB,EAAO,IAAIpF,GAAK,IAAIne,EAAQtE,EAAMA,EAAMA,QAAOmB,EAAW6f,GAGhE,OAFA6G,EAAK5D,SAASwC,KAAKmB,GACnBlB,GAAahd,QAAQ1D,IAAI6hB,GAClBA,EAGTC,mBAAmBnjB,EAAMC,EAAI6Z,EAAS,EAAGuC,EAAQ,UAAW+G,EAAQ,IAElE,MAAM/nB,EAAO2E,EAAKqjB,WAAWpjB,GACvBijB,EAAO,IAAIpF,GAAK,IAAIne,EAAQyjB,EAAOtJ,EAAQze,QAAOmB,EAAW6f,GAE7Djb,EAASnB,EAAGvC,QAAQ4lB,IAAItjB,GAAMsB,eAAe,IAC7CiiB,EAAcniB,EAAO1D,QAAQmkB,YAanC,OAZAzgB,EAAOC,IAAIrB,GAEXkjB,EAAK5D,SAASwC,KAAK1gB,GAOnB8hB,EAAKhE,WAAWC,mBAAmB,IAAIxf,EAAQ,EAAG,GAAI,GAAI4jB,GAE1DxB,GAAahd,QAAQ1D,IAAI6hB,GAClBA,EAGTM,WAAWxK,EAAOc,EAAQuC,GAExB,MAAMsB,EAAW,IAAI8F,EAAoBzK,EAAOc,GAC1C8D,EAAW,IAAIhI,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAEjY,MAAO,IAAIulB,EAAQ,EAAG,EAAG,EAAG,MAExC1N,aAAc2N,GACdzN,eAAgB0N,GAChBC,aAAa,EACbhN,YAAY,IAGRpX,EAAQ,IAAIse,EAAKJ,EAAUC,GAGjC,OAFAne,EAAMkd,aAAe,IACrBoF,GAAahd,QAAQ1D,IAAI5B,GAClBA,EAGTqkB,gBAAgBb,EAAK5nB,EAAMghB,GAEzBhhB,EAAOA,GAAQ,EACfghB,EAAQA,GAAS,SAEjB,MAAM0H,GAAM,IAAIC,GAAOC,qBAAqB,IAAItkB,EAAW,IAAIA,EAAQtE,EAAMA,EAAMA,IAC7E6oB,EAAS,IAAIC,EAAWJ,EAAK1H,GAEnC,OADA6H,EAAO5E,SAASwC,KAAKmB,GAAO,IAAItjB,GACzBukB,EAGTE,YAAYnB,EAAK5nB,EAAMghB,GAErBhhB,EAAOA,GAAQ,EACfghB,EAAQA,GAAS,SACjB4G,EAAMA,GAAO,IAAItjB,EAEjB,MAAM0kB,EAAS,IAAIlG,GAAO9iB,EAAMghB,GAGhC,OAFAgI,EAAO/E,SAASwC,KAAKmB,GACrBlB,GAAahd,QAAQ1D,IAAIgjB,GAClBA,EAGTC,iBAAiBC,EAAcC,GAAO,EAAOnI,EAAQ,UAEnD,MAAMoI,EAAU,IAAIC,EAAiBH,EAAcC,GACnDC,EAAQE,mBACR,MAAMnlB,EAASilB,EAAQG,gBAAgB,KAGvC,OAFoBxrB,KAAKypB,UAAUrjB,EAAQ,OAK7CqlB,mBAAmBR,EAAQhI,GAEzBA,EAAQA,GAAS,SACjB,MAAMsB,EAAW,IAAImH,EAAeT,EAAOtK,OAAQ,GAAI,IACjD6D,EAAW,IAAIM,EAAkB,CAAE7B,MAAOA,IAC1C0I,EAAc,IAAIhH,EAAKJ,EAAUC,GAGvC,OAFAmH,EAAYzF,SAASwC,KAAKuC,EAAOjjB,QACjC2gB,GAAahd,QAAQ1D,IAAI0jB,GAClBA,EAGTC,iBAAiBX,GAEf,MAAM1G,EAAW,IAAImH,EAAeT,EAAOtK,OAAQ,GAAI,IACjD6D,EAAW,IAAIhI,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAEjY,MAAO,IAAIulB,EAAQ,EAAG,EAAG,EAAG,MAExC1N,aAAc2N,GACdzN,eAAgB0N,GAChBC,aAAa,IAGToB,EAAU,IAAIlH,EAAKJ,EAAUC,GACnCqH,EAAQ3F,SAASwC,KAAKuC,EAAOjjB,QAC7B2gB,GAAahd,QAAQ1D,IAAI4jB,GAG3BC,kBAAkBC,GAEhB,MAAMjB,EAAS,IAAIC,EAAWgB,EAAI,UAClCpD,GAAahd,QAAQ1D,IAAI6iB,GAG3BkB,WAAWC,EAAOC,GAEhB,MAAMC,EAAS,IAAI5lB,EAAQ,EAAG,EAAG,GAC7B2lB,IAEFC,EAAO5kB,EAAI2kB,EAAQC,QAAU,GAG/B,IAAK,IAAI1lB,EAAI,EAAGA,EAAIwlB,EAAMhnB,OAAS,EAAGwB,IAEpCzG,KAAKypB,UAAUwC,EAAMxlB,GAAGnC,QAAQ2D,IAAIkkB,GAASF,EAAMxlB,EAAI,GAAGnC,QAAQ2D,IAAIkkB,IAI1EC,aAAa7E,EAAKzf,EAAGmf,GAEnB,MAAMoF,EAAO,IAAI1H,EAAK,IAAI0F,EAAoB,EAAG,GAAI,IAAIrD,IAKzD,OAJAhnB,KAAKqoB,uBAAuB1hB,KAAK0lB,GACjCrsB,KAAKokB,MAAMnc,IAAIokB,GAEfA,EAAK7H,SAAS8C,YAAYC,EAAKzf,EAAGmf,GAC3BoF,EAGTlQ,OAAOmQ,GAEL,IAAK,IAAI7lB,EAAI,EAAGA,EAAIzG,KAAKqoB,uBAAuBpjB,OAAQwB,IAEtDzG,KAAKqoB,uBAAuB5hB,GAAG+d,SAASgD,gBAAgB+E,GAAQ3M,MAAO2M,GAAQ7L,QAE7E1gB,KAAKokB,MAAMK,SAASxf,OAAS,GAE/BqnB,EAASnQ,OAAOnc,KAAKokB,MAAOpkB,KAAKie,UCzPxB,MAAMuO,WAAiCtP,GAEpD9b,YAAYqrB,EAAaC,GAEvB/d,2aACA3O,KAAK2c,SAASgQ,aAAe,CAAE5nB,MAAO,IAAIulB,EAAQmC,EAAaC,EAAaplB,EAAGolB,EAAanlB,EAAGmlB,EAAa3kB,KCLjG,MAAM6kB,WAA4BpQ,EAE/Cpb,cAEEuN,MAAM,CACJgO,SAAU,CACRkQ,UAAW,CAAE9nB,MAAO,IAEtB6X,6QACAE,+dAIAgQ,cAAU/nB,GAEZ/E,KAAK2c,SAASkQ,UAAU9nB,MAAQA,EAG9B+nB,gBAEF,OAAO9sB,KAAK2c,SAASkQ,UAAU9nB,OChBpB,MAAMgoB,GAEnB3rB,cAEEpB,KAAK+oB,GAAK,IAAIiE,EAAkBT,GAAQ3M,MAAO2M,GAAQ7L,QAEvD1gB,KAAKitB,uBAAyB,IAAIT,GAAyB,EAAG,IAAIjmB,EAAQ,EAAG,EAAG,IAChFvG,KAAKktB,sBAAwB,IAAIN,GAGnCzQ,OAAOmQ,GAELtsB,KAAKmtB,2BAELb,EAASjD,MAAMrpB,KAAK+oB,QAAI3lB,GAAW,GAAM,GAEzCkpB,EAASc,yBAAyBptB,KAAK+oB,GAAI/oB,KAAKitB,wBAEhDjtB,KAAKktB,sBAAsBJ,UAAYO,GAAc1hB,QAAQmc,IAE7DwE,EAASnQ,YAAO/Y,OAAWA,EAAWpD,KAAK+oB,GAAI/oB,KAAKktB,uBAGtDC,2BAEMntB,KAAK+oB,GAAGnJ,QAAU2M,GAAQ3M,OAAS5f,KAAK+oB,GAAGrI,SAAW6L,GAAQ7L,QAEhE1gB,KAAK+oB,GAAGuE,QAAQf,GAAQ3M,MAAO2M,GAAQ7L,QAIvC6M,oBAEF,OAAOvtB,KAAK+oB,ICnCD,MAAMyE,GAEnBpsB,YAAYgb,GAEVpc,KAAKoc,SAAWA,EAChBpc,KAAKytB,YAAc,IAAIvJ,EACvBlkB,KAAK0tB,eAAiB,IAAIxQ,GAC1Bld,KAAK2tB,WAAa,IAAIhJ,EACpB,IAAI0F,EAAoB,EAAG,GAAIrqB,KAAK0tB,gBACtC1tB,KAAKytB,YAAYxlB,IAAIjI,KAAK2tB,YAC1B3tB,KAAK4tB,aAAe,IAAIC,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAO,KAGnEC,KAAKrY,EAAKsY,GAER/tB,KAAK2tB,WAAWnJ,SAAWxkB,KAAK0tB,eAEhC,MAAMM,GAA0C,IAA5BvY,EAAIwY,oBAA+BxY,EAAIyY,QAAUzY,EAC/D0Y,GAA0C,IAA5B1Y,EAAIwY,oBAA+BxY,EAAImK,MAAUnK,EAAIF,MAAMqK,MACzEwO,GAA0C,IAA5B3Y,EAAIwY,oBAA+BxY,EAAIiL,OAAUjL,EAAIF,MAAMmL,OAE/E1gB,KAAK2tB,WAAWnJ,SAAS7H,SAASW,SAASvY,MAAQipB,EACnDhuB,KAAK2tB,WAAWnJ,SAAS7H,SAASY,YAAYxY,MAAMif,IAAImK,EAAWC,GAE/DL,EAEF/tB,KAAK2tB,WAAWnJ,SAAS7H,SAASa,kBAAkBzY,MAAMif,IAAI+J,EAAInO,MAAOmO,EAAIrN,QAI7E1gB,KAAKoc,SAASiS,QAAQruB,KAAK2tB,WAAWnJ,SAAS7H,SAASa,kBAAkBzY,OAG5E/E,KAAKsuB,SAASP,GAGhBQ,cAAcC,EAAKT,GAEjB/tB,KAAK2tB,WAAWnJ,SAAWgK,EAI3BxuB,KAAKsuB,SAASP,GAGhBU,mBAAmBhZ,EAAKsY,EAAKS,GAE3B,MAAMR,GAA0C,IAA5BvY,EAAIwY,oBAA+BxY,EAAIyY,QAAUzY,EAC/D0Y,GAA0C,IAA5B1Y,EAAIwY,oBAA+BxY,EAAImK,MAAUnK,EAAIF,MAAMqK,MACzEwO,GAA0C,IAA5B3Y,EAAIwY,oBAA+BxY,EAAIiL,OAAUjL,EAAIF,MAAMmL,OAE/E1gB,KAAK2tB,WAAWnJ,SAAWgK,EAC3BxuB,KAAK2tB,WAAWnJ,SAAS7H,SAASW,SAASvY,MAAQipB,EACnDhuB,KAAK2tB,WAAWnJ,SAAS7H,SAASY,YAAYxY,MAAMif,IAAImK,EAAWC,GAE/DL,EAEF/tB,KAAK2tB,WAAWnJ,SAAS7H,SAASa,kBAAkBzY,MAAMif,IAAI+J,EAAInO,MAAOmO,EAAIrN,QAI7E1gB,KAAKoc,SAASiS,QAAQruB,KAAK2tB,WAAWnJ,SAAS7H,SAASa,kBAAkBzY,OAG5E/E,KAAKsuB,SAASP,GAGhBX,yBAAyBsB,EAAQF,GAE/BxuB,KAAK2tB,WAAWnJ,SAAWgK,EAE3BxuB,KAAKsuB,SAASI,GAGhBpS,UAEEtc,KAAK2tB,WAAWpJ,SAASjI,UACzBtc,KAAK2tB,WAAWnJ,SAASlI,UAG3BgS,SAASvF,GAEPA,OAAY3lB,IAAP2lB,EAAmB,KAAOA,EAE/B,MAAM4F,EAAa3uB,KAAKoc,SAASwS,kBAEjC5uB,KAAKoc,SAASyS,qBAAuBzrB,IAAP2lB,EAAmB,KAAOA,GACxD/oB,KAAKoc,SAASD,OAAOnc,KAAKytB,YAAaztB,KAAK4tB,cAE5C5tB,KAAKoc,SAASyS,gBAAgBF,ICgPlC,IAAeG,GAAA,IArUf,MAEE/uB,KAAK0e,EAAQsQ,GAEX/uB,KAAKgvB,eAAY5rB,EACjBpD,KAAKivB,aAAU7rB,EACfpD,KAAKye,YAASrb,EACdpD,KAAKkvB,eAAY9rB,EACjBpD,KAAKmvB,yBAAsB/rB,EAC3BpD,KAAKovB,4BAA6B,EAClCpvB,KAAKqvB,gCAA6BjsB,EAElCpD,KAAKsvB,WAAY,EACjBtvB,KAAKuvB,oBAAiBnsB,EACtBpD,KAAK+uB,wBAAqB3rB,EAE1BpD,KAAK+uB,mBAAqB,CACxBS,OAAO,EACPxF,OAAO,EACPyF,gBAAgB,EAChBC,SAAS,EACTC,WAAW,EACXC,oBAAoB,EACpBC,uBAAuB,EACvBC,gBAAiB,mBACjBC,wBAAwB,EACxBC,cAAc,EACdC,YAAY,GAGd9mB,OAAOwP,OAAO3Y,KAAK+uB,mBAAoBA,GAEnC/uB,KAAK+uB,mBAAmBiB,aAE1BhwB,KAAKuvB,eAAiB9Q,EAAOG,WAAW,SAAU5e,KAAK+uB,qBACjCtQ,EAAOG,WAAW,QAAS5e,KAAK+uB,qBAChCtQ,EAAOG,WAAW,qBAAsB5e,KAAK+uB,oBAInE/uB,KAAKuvB,eAAiB9Q,EAAOG,WAAW,QAAS5e,KAAK+uB,qBAChCtQ,EAAOG,WAAW,qBAAsB5e,KAAK+uB,oBAGrE/uB,KAAKsvB,UAAqD,2BAAzCtvB,KAAKuvB,eAAenuB,YAAYV,KAIjDV,KAAKgvB,UAAY,IAAIkB,EAAc,CACjCzR,OAAQA,EACRhW,QAASzI,KAAKuvB,iBAGZvvB,KAAK+uB,mBAAmBkB,aAE1BjwB,KAAKgvB,UAAUmB,GAAGC,SAAU,GAG9BpwB,KAAKgvB,UAAUqB,WAAY,EAE3BrwB,KAAKgvB,UAAUsB,cAAc,GAE7B/D,GAAQ5K,IAAM4O,GAAc5O,IAEvB3hB,KAAKsvB,WAERtvB,KAAKgvB,UAAUwB,WAAW5rB,IAAI,0BAGhC5E,KAAKivB,QAAU,IAAIzB,GAAQxtB,KAAKgvB,WAEhChvB,KAAKye,OAASze,KAAKgvB,UAAUyB,WAE7BzwB,KAAKkvB,UAAY,IAAIhT,GAErBlc,KAAKmvB,oBAAsBnvB,KAAKkvB,UAChCwB,GAAavS,eAAiBne,KAAKgvB,UAAU2B,aAAaC,mBAC1DF,GAAatS,iCAAmCpe,KAAKgvB,UAAU2B,aAAaE,kBAAoB,EAChGH,GAAarS,sBAAwBre,KAAKgvB,UAAU2B,aAAaG,oBAEjE9wB,KAAKovB,4BAA6B,EAElCpvB,KAAKqvB,2BAA6B,IAAItC,GAEtC/sB,KAAK+wB,gBAAkB,IAAIC,eAAehxB,KAAKixB,UAAUltB,KAAK/D,OAC9DA,KAAK+wB,gBAAgBG,QAAQlxB,KAAKye,QAGhC0S,kBAEF,OAAOnxB,KAAKgvB,UAAUyB,WAGpBW,uBAEF,OAAOpxB,KAAKqvB,2BAA2B9B,cAGzC7U,UAAU2Y,GAIRrxB,KAAKmvB,oBAAoBnX,QAAQhY,KAAMA,KAAKgvB,WAC5ChvB,KAAKmvB,oBAAsBkC,EAC3BrxB,KAAKmvB,oBAAoB3X,SAASxX,KAAMA,KAAKgvB,WAG/CplB,SAEM5J,KAAKovB,4BAEPpvB,KAAKqvB,2BAA2BlT,OAAOnc,MAGzCA,KAAKsxB,0BAEDjE,GAAc1hB,SAEhB3L,KAAKmvB,oBAAoBhT,SAG3BoQ,GAAQ3iB,SAGV0nB,0BAEMjE,GAAc1hB,UAEhB0hB,GAAc1hB,QAAQic,OAAS2E,GAAQzF,aACvCuG,GAAc1hB,QAAQ4lB,yBACtBlE,GAAc1hB,QAAQ6lB,eACtBnE,GAAc1hB,QAAQ8lB,mBAAkB,IAI5CtV,OAAOiI,EAAOnG,EAAQ8K,EAAI2I,GAExB1xB,KAAK2xB,0BAA0BvN,EAAOsN,GAEtC1xB,KAAKgvB,UAAUH,qBAAuBzrB,IAAP2lB,EAAmB,KAAOA,GACzD/oB,KAAKgvB,UAAU7S,OAAOiI,GAAUuE,GAAahd,QAC3CsS,GAAUoP,GAAc1hB,SAE1B3L,KAAK2xB,0BAA0BvN,OAAOhhB,GAGxCwuB,aAAaxN,GAEPA,EAAMpI,eAERoI,EAAMpI,gBAGJoI,EAAMjI,OAERiI,EAAMjI,SAINnc,KAAKmc,OAAOiI,OAAOhhB,GAGjBghB,EAAMrI,gBAERqI,EAAMrI,iBAIV4V,0BAA0BvN,EAAOoK,GAE/BA,OAAcprB,IAARorB,EAAoB,KAAOA,EAC7BpK,EAEFA,EAAMyN,iBAAmBrD,EAIzB7F,GAAahd,QAAQkmB,iBAAmBrD,EAI5CsD,YAAY/I,EAAIgJ,GAEd/xB,KAAKgvB,UAAUgD,uBAAuBjJ,EAAI,EAAG,EAAGA,EAAGnJ,MAAOmJ,EAAGrI,OAAQqR,GAGvE1I,MAAMN,EAAI9K,EAAQwO,EAAawF,GAE7BjyB,KAAKgvB,UAAUH,qBAAuBzrB,IAAP2lB,EAAmB,KAAOA,GAErD9K,GAEFje,KAAKgvB,UAAUkD,cAAcjU,EAAO8J,YAAa9J,EAAO+J,aAG1DhoB,KAAKgvB,UAAU3F,QAAQpL,IACnBwO,IACAwF,GAGNhB,UAAUkB,GAER,IAAK,MAAMC,KAASD,EAElB5F,GAAQ5K,IAAM4O,GAAc5O,IAC5B4K,GAAQhG,gBAAgB6L,EAAMC,YAAY/qB,EAAG8qB,EAAMC,YAAY9qB,GAC/DglB,GAAQ9F,YAAY2L,EAAMC,YAAYzS,MAAOwS,EAAMC,YAAY3R,QAE/D1gB,KAAKye,OAAOmB,MAAS2M,GAAQpG,aAC7BnmB,KAAKye,OAAOiC,OAAS6L,GAAQnG,cAE7BpmB,KAAKgvB,UAAUsD,YAAY,EAAG,EAAG/F,GAAQpG,aAAcoG,GAAQnG,eAE/DpmB,KAAKsxB,0BAIT/C,cAAcC,EAAKT,GAEjB/tB,KAAKivB,QAAQV,cAAcC,EAAKT,GAGlCD,KAAKyE,EAAQ7D,EAAQF,GAEfA,EAEFxuB,KAAKivB,QAAQR,mBAAmB8D,EAAQ7D,EAAQF,GAIhDxuB,KAAKivB,QAAQnB,KAAKyE,EAAQ7D,GAI9BtB,yBAAyBsB,EAAQF,GAE/BxuB,KAAKivB,QAAQ7B,yBAAyBsB,EAAQF,GAGhDgE,gBAAgBC,EAAe7S,EAAQ2M,GAAQ3M,MAAOc,EAAS6L,GAAQ7L,QAIrE,MAAMgS,EAAYnG,GAAQ3M,MACpB+S,EAAapG,GAAQ7L,OAErBkS,EAAYhT,EACZiT,EAAanS,EAEboS,EAAa,KACbC,EAAc,KAEdC,EAAcC,SAASltB,KAAK2Z,KAAKkT,EAAYE,IAC7CI,EAAcD,SAASltB,KAAK2Z,KAAKmT,EAAaE,IAEpDxG,GAAQ9F,YAAYqM,EAAYC,GAChC,MAAMI,EAAUnzB,KAAKgvB,UAAUoE,gBAC/BpzB,KAAKgvB,UAAUsB,cAAc,GAE7BtwB,KAAKgvB,UAAU1B,QAAQwF,EAAYC,GAAa,GAEhD,MACMM,EADY3Y,SAASgE,cAAc,UAChBE,WAAW,MAEpCyU,EAAO5U,OAAOmB,MAASgT,EACvBS,EAAO5U,OAAOiC,OAASmS,EAEvBxF,GAAc1hB,QAAQic,OAAS2E,GAAQzF,aACvCuG,GAAc1hB,QAAQ6lB,eACtBnE,GAAc1hB,QAAQ8lB,mBAAkB,GAExC,IAAK,IAAInqB,EAAI,EAAGA,EAAI0rB,EAAa1rB,IAE/B,IAAK,IAAIC,EAAI,EAAGA,EAAI2rB,EAAa3rB,IAE/B8lB,GAAc1hB,QAAQ2nB,cAAcV,EAAuBC,EACzDtG,GAAQ3M,MAAQtY,EAAWilB,GAAQ7L,OAASnZ,EAC5CglB,GAAQ3M,MAAkB2M,GAAQ7L,QACpC1gB,KAAKmvB,oBAAoBhT,SAEzBkX,EAAOE,UAAUvzB,KAAKgvB,UAAUyB,WAAYlE,GAAQ3M,MAAQtY,EAAGilB,GAAQ7L,OAASnZ,GAMpF8rB,EAAO5U,OAAO+U,OAAOf,EAAe,qBAEpCpF,GAAc1hB,QAAQ8nB,kBAEtBlH,GAAQ9F,YAAYiM,EAAWC,GAC/B3yB,KAAKgvB,UAAUsB,cAAc6C,GAC7BnzB,KAAKgvB,UAAU1B,QAAQoF,EAAWC,GAAY,GAE9CtF,GAAc1hB,QAAQic,OAAS2E,GAAQzF,aACvCuG,GAAc1hB,QAAQ6lB,eACtBnE,GAAc1hB,QAAQ8lB,mBAAkB,GAG1CiC,oBAAoBC,GAElB,MAAMC,EAAOlZ,SAASgE,cAAc,KACpCkV,EAAKC,SAAW,eAEhBD,EAAKE,KAAOC,IAAIC,gBAAgBL,GAChCC,EAAKK,QAELL,EAAKM,QAAU,WAEbC,uBAAsB,WAEpBJ,IAAIK,gBAAgBR,EAAKE,SAE3BF,EAAKS,gBAAgB,SAIzB/X,UAEEtc,KAAKgvB,UAAU1S,UACftc,KAAKmvB,oBAAoB7S,UACzBtc,KAAKivB,QAAQ3S,YCvUF,MAAMgY,WAAuB9X,EAE1Cpb,cAEEuN,MAAM,CACJgO,SAAU,GAEVC,kLACAE,yHCPS,MAAMyX,WAA2BrY,GAE9C9a,cAEEuN,QAGFwN,SAEEqY,GAASnL,WAAMjmB,EAAWiqB,GAAc1hB,SAAS,GAAM,GAEvD6oB,GAASrY,OAAOwM,GAAahd,QAAS0hB,GAAc1hB,aAASvI,EAAW,IAAIkxB,KCjBjE,MAAMG,GAEnB10B,KAAKsV,GAEHrV,KAAK00B,eAAgB,EACrB10B,KAAK20B,aAAc,EAEnB30B,KAAKoJ,KAAO,GACZpJ,KAAK40B,UAAY,GACjB50B,KAAKqV,UAAYA,EAEjBrV,KAAKqV,UAAUwf,iBAAiB,UAAW70B,KAAK80B,YAAY/wB,KAAK/D,OAAO,GACxEA,KAAKqV,UAAUwf,iBAAiB,QAAS70B,KAAK+0B,UAAUhxB,KAAK/D,OAAO,GAGtE80B,YAAYjzB,GAEQ,KAAdA,EAAEmzB,SAAkBnzB,EAAEozB,UAAYj1B,KAAK20B,cAEzC30B,KAAK00B,eAAgB,EACrB10B,KAAK20B,aAAc,GAEjB9yB,EAAEqzB,KAEJl1B,KAAKm1B,UAAUtzB,EAAEqzB,KAIrBH,UAAUlzB,GAER7B,KAAKo1B,YAAYvzB,EAAEqzB,KAGrB7L,QAEErpB,KAAK00B,eAAgB,EAErB,IAAK,IAAIjuB,EAAI,EAAGA,EAAIzG,KAAK40B,UAAU3vB,OAAQwB,IAEzCzG,KAAKoJ,KAAKpJ,KAAK40B,UAAUnuB,IAAI4uB,SAAU,EACvCr1B,KAAKoJ,KAAKpJ,KAAK40B,UAAUnuB,IAAI6uB,UAAW,EAI5CF,YAAYG,GAEV,MAAML,EAAMl1B,KAAKoJ,KAAKmsB,GAClBL,IAEFA,EAAIM,OAAQ,EACZN,EAAIO,MAAO,EACXP,EAAII,UAAW,GAInBI,eAEE11B,KAAK20B,aAAc,EAEnB,IAAK,IAAIluB,EAAI,EAAGA,EAAIzG,KAAK40B,UAAU3vB,OAAQwB,IAEzCzG,KAAKoJ,KAAKpJ,KAAK40B,UAAUnuB,IAAI+uB,OAAQ,EACrCx1B,KAAKoJ,KAAKpJ,KAAK40B,UAAUnuB,IAAIgvB,MAAO,EAIxCN,UAAUI,GAER,MAAML,EAAMl1B,KAAKoJ,KAAKmsB,GAClBL,KAEe,IAAbA,EAAIO,OAENP,EAAIG,SAAU,GAEhBH,EAAIO,MAAO,EACXP,EAAIM,OAAQ,GAIhBG,eAAeJ,GAEb,MAAML,EAAMl1B,KAAKoJ,KAAKmsB,GACtB,QAAIL,GAEKA,EAAIG,QAKfO,YAAYL,GAEV,MAAML,EAAMl1B,KAAKoJ,KAAKmsB,GACtB,QAAIL,GAEKA,EAAIO,KAKfI,gBAAgBN,GAEd,MAAML,EAAMl1B,KAAKoJ,KAAKmsB,GACtB,QAAIL,GAEKA,EAAII,SAMfQ,aAAaZ,GAEXl1B,KAAKoJ,KAAK8rB,GACR,CACEK,SAAUL,EACVG,SAAS,EACTI,MAAM,EACND,OAAO,GAGXx1B,KAAK40B,UAAYzrB,OAAOC,KAAKpJ,KAAKoJ,MAGpC2sB,eAAeR,UAENv1B,KAAKoJ,KAAKmsB,GAGnBjZ,UAEEtc,KAAKqV,UAAU2gB,oBAAoB,UAAWh2B,KAAK80B,YAAY/wB,KAAK/D,OAAO,GAC3EA,KAAKqV,UAAU2gB,oBAAoB,QAASh2B,KAAK+0B,UAAUhxB,KAAK/D,OAAO,ICnE3E,IAAei2B,GAAA,IA9Df,cAAoBC,GAElB90B,cAEEuN,QAEA3O,KAAKm2B,SAAU,EACfn2B,KAAKo2B,aAAe,CAAE9uB,EAAG,EAAGC,EAAG,GAC/BvH,KAAKq2B,kBAAoB,CAAE/uB,EAAG,EAAGC,EAAG,GAEpCvH,KAAKs2B,SAAW,IAAI7B,GAGtB10B,KAAKsV,EAAWkhB,GAEd5nB,MAAM5O,KAAKsV,GAEXrV,KAAKs2B,SAASv2B,KAAKw2B,GAGrBja,UAEE3N,MAAM2N,UAENtc,KAAKs2B,SAASha,UAGhB1S,SAEM5J,KAAKw2B,4BAEPx2B,KAAKo2B,aAAa9uB,EAAItH,KAAKy2B,IAAInvB,EAC/BtH,KAAKo2B,aAAa7uB,EAAIvH,KAAKy2B,IAAIlvB,GAG7BvH,KAAK02B,yBAEP12B,KAAKq2B,kBAAkB/uB,GAAKvB,KAAKsB,IAAIrH,KAAK22B,UAAUrvB,GACpDtH,KAAKq2B,kBAAkB9uB,GAAKxB,KAAKsB,IAAIrH,KAAK22B,UAAUpvB,IAGlDvH,KAAK42B,8BAEH52B,KAAKq2B,kBAAkB/uB,EAAI,MAAStH,KAAKq2B,kBAAkB9uB,EAAI,QAEjEvH,KAAKm2B,SAAU,GAGjBn2B,KAAKq2B,kBAAoB,CAAE/uB,EAAG,EAAGC,EAAG,IAIxC8hB,QAEE1a,MAAM0a,QAENrpB,KAAKm2B,SAAU,EAEfn2B,KAAKs2B,SAASjN,UCJlB,IAAewN,GAAA,IAxDf,MAEE92B,OAEEC,KAAK82B,kBAAoB,CACvBC,QAAS,UACTC,IAAK,MACLC,MAAO,QACPC,IAAK,MACLC,QAAS,WAGXn3B,KAAKo3B,YAAeh3B,UAAUC,UAAUg3B,MAAM,+GAC9Cr3B,KAAKs3B,WAAal3B,UAAUC,UAAUg3B,MAAM,QAAUj3B,UAAUm3B,gBAAkBn3B,UAAUm3B,eAAiB,GAC7Gv3B,KAAKw3B,SAAWp3B,UAAUC,UAAUg3B,MAAM,uBAAyBr3B,KAAKs3B,QAExEt3B,KAAKy3B,WAAaz3B,KAAK03B,WAAa13B,KAAK82B,kBAAkBC,QAC3D/2B,KAAK23B,SAAW33B,KAAK03B,WAAa13B,KAAK82B,kBAAkBG,MACzDj3B,KAAK43B,OAAS53B,KAAK03B,WAAa13B,KAAK82B,kBAAkBI,IACvDl3B,KAAK63B,WAAa73B,KAAK03B,WAAa13B,KAAK82B,kBAAkBK,QAG7DO,SAEE,MAAMr3B,EAAYF,OAAOC,UAAUC,UAC7By3B,EAAW33B,OAAOC,UAAU03B,SAIlC,IAAIC,EAAK,KAuBT,OArB0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxCx3B,QAAQu3B,GAEzBC,EAAK/3B,KAAK82B,kBAAkBI,KAEe,IAPxB,CAAC,SAAU,OAAQ,QAOlB32B,QAAQu3B,GAE5BC,EAAK/3B,KAAK82B,kBAAkBE,KAEmB,IAZxB,CAAC,QAAS,QAAS,UAAW,SAY7Bz2B,QAAQu3B,GAEhCC,EAAK/3B,KAAK82B,kBAAkBK,QAErB,UAAUa,KAAK33B,GAEtB03B,EAAK/3B,KAAK82B,kBAAkBC,SAEpBgB,GAAM,QAAQC,KAAKF,KAE3BC,EAAK/3B,KAAK82B,kBAAkBG,OAGvBc,ICrCX,IAAeE,GAAA,IAdf,MAEEl4B,OAEEC,KAAKk4B,qBAAkB90B,EACvBpD,KAAKm4B,gBAAkB,IAAI5xB,EAG7B6xB,oBAAoB7T,GAElBvkB,KAAKk4B,gBAAkB3T,ICJZ,MAAM8T,GAEnBj3B,YAAYmjB,EAAU+T,GAEpBt4B,KAAKukB,SAAWA,EAEhBvkB,KAAKwkB,cAAWphB,EAChBpD,KAAK2c,SAAW,GAChB3c,KAAKs4B,YAAcA,EAEnBt4B,KAAKu4B,cAAgB,GAErBv4B,KAAKw4B,kBAAep1B,EAEpBpD,KAAKy4B,YAAc,IAAI7hB,EACvB5W,KAAK04B,aAAe,IAAI9hB,EAExB5W,KAAK24B,oBAAsB,EAE3B34B,KAAK44B,wBAA0B,EAGjC74B,KAAKy4B,EAAcpb,EAAaD,GAE9Bnd,KAAKwkB,SAAW,IAAIhI,EAAe,CACjCG,SAAU3c,KAAK2c,SACfC,aAAcQ,EACdN,eAAgBK,IAElBnd,KAAKw4B,aAAeA,EAGtBK,mBAAmBn4B,EAAMyE,GAEvBnF,KAAK2c,SAASjc,GAAQ,CAAEqE,MAAOI,GAC/BnF,KAAKwkB,SAAShE,aAAc,EAG9BsY,mBAAmBp4B,EAAMyE,GAEvBnF,KAAK2c,SAASjc,GAAMqE,MAAQI,EAG9B4zB,sBAAsBC,EAAcC,GAElC,MAAMC,EAAgBl5B,KAAKm5B,qBAAqBn5B,KAAKs4B,aAC/Cc,EAAgBp5B,KAAKm5B,qBAAqBn5B,KAAKs4B,aAC/Ce,EAAgBr5B,KAAKm5B,qBAAqB,GAE1CG,EAAet5B,KAAKu5B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEJ,GAEFj5B,KAAKw5B,yBAAyBF,EAAcL,GAIhDQ,sBAAsBT,EAAcU,GAElC,MAAMR,EAAgBl5B,KAAK25B,sBAAsB35B,KAAKs4B,aAChDc,EAAgBp5B,KAAK25B,sBAAsB35B,KAAKs4B,aAChDe,EAAgBr5B,KAAK25B,sBAAsB,GAE3CL,EAAet5B,KAAKu5B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEK,GAEF15B,KAAK45B,0BAA0BN,EAAcI,GAIjDG,4BAA4Bb,EAAcU,GAExC,MAAMR,EAAgBl5B,KAAK85B,4BAA4B95B,KAAKs4B,aACtDc,EAAgBp5B,KAAK85B,4BAA4B95B,KAAKs4B,aACtDe,EAAgBr5B,KAAK85B,4BAA4B,GAEjDR,EAAet5B,KAAKu5B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEK,GAEF15B,KAAK45B,0BAA0BN,EAAcI,GAIjDK,sBAAsBC,EAAahB,EAAciB,EAASC,EAAOC,EAAOC,GAEtE,MAAMC,EAAYr6B,KAAKs6B,mBAAmBN,GACpCO,EAAev6B,KAAKw6B,mBAAmBxB,GAE7Ch5B,KAAKy6B,gBAAgBF,EAAa9kB,IAAK4kB,EAAWJ,EAASC,EAAOC,EAAOC,GACzEp6B,KAAKy6B,gBAAgBF,EAAaG,UAAW,EAAGT,EAASC,EAAOC,EAAOC,GAEvEG,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfC,sBAAsBb,EAAahB,EAAc8B,EAASZ,EAAOC,EAAOC,EAAOW,GAE7E,MAAMV,EAAYr6B,KAAKs6B,mBAAmBN,GACpCO,EAAev6B,KAAKw6B,mBAAmBxB,GAE7Ch5B,KAAKg7B,iBAAiBT,EAAa9kB,IAAK4kB,EAAWS,EAASZ,EAAOC,EAAOC,EAAOW,GACjF/6B,KAAKg7B,iBAAiBT,EAAaG,UAAW,EAAGI,EAASZ,EAAOC,EAAOC,EAAOW,GAC/ER,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfK,oBAAoB7e,EAAU8e,GAE5B,IAAK,IAAIz0B,EAAI,EAAGA,EAAIzG,KAAKu4B,cAActzB,OAAQwB,IAEzCy0B,EAAgB,GAAKl7B,KAAKu4B,cAAc9xB,GAAGm0B,YAAc,IAEjB,IAAtC56B,KAAKu4B,cAAc9xB,GAAGm0B,aAExB56B,KAAKm7B,8BAA8B/e,EAAUpc,KAAKu4B,cAAc9xB,IAE9DzG,KAAKu4B,cAAc9xB,GAAGm0B,YAAc,GAEtC56B,KAAKo7B,2BAA2Bhf,EAAUpc,KAAKu4B,cAAc9xB,IAG/DzG,KAAKu4B,cAAc9xB,GAAGm0B,YAAc,EAEpCM,KAKNG,0BAEEr7B,KAAK24B,oBAAsB,EAC3B,IAAK,IAAIlyB,EAAI,EAAGA,EAAIzG,KAAKu4B,cAActzB,OAAQwB,IAEzCzG,KAAKu4B,cAAc9xB,GAAGm0B,YAAc,GAEtC56B,KAAK24B,sBAGT,OAAO34B,KAAK24B,oBAGdyC,2BAA2Bhf,EAAUkf,GAGnCA,EAAavN,IAAIvN,aAAc,EAC/BpE,EAASmf,qBACPv7B,KAAKy4B,YACL6C,EAAa7lB,IACb6lB,EAAavN,KAIjBoN,8BAA8B/e,EAAUkf,GAGtC,MAAME,EAAQF,EAAaX,qBACZ,IAAXa,IAKJx7B,KAAK04B,aAAanxB,EAAIxB,KAAKsC,MAAMmzB,EAAQx7B,KAAKs4B,aAC9Ct4B,KAAK04B,aAAapxB,EAAIk0B,EAAQx7B,KAAKs4B,YAAct4B,KAAK04B,aAAanxB,EACnE6U,EAASmf,qBACPv7B,KAAK04B,aACL4C,EAAaZ,UACbY,EAAavN,MAIjB0N,WAEE,OAAO,IAAI9W,EAAK3kB,KAAKukB,SAAUvkB,KAAKwkB,UAGtCiW,gBAAgBF,EAAciB,EAAOvB,EAASC,EAAOC,EAAOC,GAEtDF,IAEFK,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKvB,EAAQ3yB,GAE/C6yB,IAEFI,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKvB,EAAQ1yB,GAE/C6yB,IAEFG,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKvB,EAAQlyB,GAIrDizB,iBAAiBT,EAAciB,EAAOV,EAASZ,EAAOC,EAAOC,EAAOW,GAE9Db,IAEFK,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKV,EAAQxzB,GAE/C6yB,IAEFI,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKV,EAAQvzB,GAE/C6yB,IAEFG,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKV,EAAQ/yB,GAE/CgzB,IAEFR,EAAahlB,MAAMpQ,KAAa,EAARq2B,EAAY,GAAKV,EAAQhzB,GAIrD0xB,yBAAyBe,EAAcmB,GAErC,IAAK,IAAIj1B,EAAI,EAAGA,EAAIzG,KAAKs4B,YAAct4B,KAAKs4B,YAAa7xB,IAEvDzG,KAAKy6B,gBAAgBF,EAAa9kB,IAAKhP,EAAGi1B,GAAI,GAAM,GAAM,GAC1DnB,EAAaK,cAIjBhB,0BAA0BW,EAAcoB,GAEtC,IAAK,IAAIl1B,EAAI,EAAGA,EAAIzG,KAAKs4B,YAAct4B,KAAKs4B,YAAa7xB,IAEvDzG,KAAKg7B,iBAAiBT,EAAa9kB,IAAKhP,EAAGk1B,GAAI,GAAM,GAAM,GAAM,GACjEpB,EAAaK,cAIjBzB,qBAAqBvZ,GAEnB,MAAMza,EAAO,IAAIy2B,WAAW,EAAIhc,EAAQA,GACxC,OAAO,IAAIic,EAAY12B,EAAMya,EAAOA,EAAOkc,GAG7CnC,sBAAsB/Z,GAEpB,MAAMza,EAAO,IAAIy2B,WAAW,EAAIhc,EAAQA,GACxC,OAAO,IAAIic,EAAY12B,EAAMya,EAAOA,EAAOmc,GAG7CjC,4BAA4Bla,GAE1B,MAAMza,EAAO,IAAI62B,aAAa,EAAIpc,EAAQA,GAC1C,OAAO,IAAIic,EAAY12B,EAAMya,EAAOA,EAAOmc,EAAYE,GAGzDzB,mBAAmBxB,GAEjB,IAAK,IAAIvyB,EAAI,EAAGA,EAAIzG,KAAKu4B,cAActzB,OAAQwB,IAE7C,GAAIzG,KAAKu4B,cAAc9xB,GAAG/F,OAASs4B,EAEjC,OAAOh5B,KAAKu4B,cAAc9xB,GAG9B9D,QAAQM,MAAM,gBAAkB+1B,EAAe,mBAIjDsB,mBAAmB55B,GAEjB,IAAK,IAAI+F,EAAI,EAAGA,EAAIzG,KAAKw4B,aAAavzB,OAAQwB,IAE5C,GAAIzG,KAAKw4B,aAAa/xB,KAAO/F,EAE3B,OAAO+F,EAGX9D,QAAQM,MAAM,YAAcvC,EAAO,mCAIrC64B,mBAAmBP,EAAchL,EAAakO,EAAaC,GAczD,OAZAD,EAAY1b,aAAc,EAE1BxgB,KAAKu4B,cAAc5xB,KAAK,CACtBjG,KAAMs4B,EACNvjB,IAAKuY,EACLD,IAAKmO,EACLxB,UAAWyB,EACXxB,qBAAsB,EACtBC,YAAa,IAGf56B,KAAK2c,SAASqc,GAAgB,CAAEj0B,MAAOm3B,GAChCl8B,KAAKu4B,cAAcv4B,KAAKu4B,cAActzB,OAAS,GAGxDqX,UAEE,IAAK,IAAI7V,EAAI,EAAGA,EAAIzG,KAAKu4B,cAActzB,OAAQwB,IAE7CzG,KAAKu4B,cAAc9xB,GAAGgP,IAAI6G,UAC1Btc,KAAKu4B,cAAc9xB,GAAGsnB,IAAIzR,UAC1Btc,KAAKu4B,cAAc9xB,GAAGi0B,UAAUpe,WCtPtC,IAAe8f,GAAA,IAvDf,MAEEr8B,OAEEC,KAAKq8B,QAAU,GAGjBC,MAAMC,GAEJ,MAAMC,EAAoB,GACpBC,EAAgBx1B,EAAMy1B,eAAe32B,KAAKwH,KAAKgvB,EAAkBt3B,SAGvEjF,KAAK28B,gBAAgBH,EAAmBC,GAExC,IAAIG,EAAW,EAEf,IAAK,IAAIn2B,EAAI,EAAGA,EAAI81B,EAAkBt3B,OAAQwB,IAC9C,CACE,MAAMo2B,EAAeN,EAAkB91B,GAAGmJ,aAAa,YAAYktB,MAC7Dv1B,EAAIxB,KAAKsC,MAAM5B,EAAIg2B,GACnBn1B,EAAIb,EAAIg2B,EAAgBl1B,EAC9B,IAAK,IAAIu1B,EAAQ,EAAGA,EAAQD,EAAcC,IAExCN,EAAkBI,GAAat1B,EAAIm1B,EAAiB,GAAMA,EAC1DD,EAAkBI,EAAW,GAAMr1B,EAAIk1B,EAAiB,GAAMA,EAC9DG,GAAY,EAIhB,MAAMG,EAAmB,IAAIC,EAAgB,IAAIhB,aAAaQ,GAAoB,GAC5E9W,EAAkBC,GAAoBC,sBAAsB2W,GAIlE,OAHA7W,EAAgBtG,aAAa,mBAAoB2d,GAEjD/8B,KAAKq8B,QAAQ11B,KAAK,IAAI0xB,GAAc3S,EAAiB+W,IAC9Cz8B,KAAKq8B,QAAQr8B,KAAKq8B,QAAQp3B,OAAS,GAG5Cg2B,oBAAoB7e,GAElB,IAAK,IAAI3V,EAAI,EAAGA,EAAIzG,KAAKq8B,QAAQp3B,OAAQwB,IAEvCzG,KAAKq8B,QAAQ51B,GAAGw0B,oBAAoB7e,EAAU,GAIlDugB,gBAAgBM,EAAKR,GAEnB,IAAK,IAAIh2B,EAAI,EAAGA,EAAIg2B,EAAgBA,EAAgB,EAAGh2B,IAErDw2B,EAAIt2B,KAAK,KCgCf,IAAeu2B,GAAA,IAjFf,MAEEn9B,OAEEC,KAAKm9B,YAAc,GACnBn9B,KAAKo9B,oBAAsB,IAAIxmB,EAC/B5W,KAAKq9B,SAAW,IAAInZ,EACpBlkB,KAAKq9B,SAASC,YAAa,EAC3Bt9B,KAAKq9B,SAAS1T,eAAgB,EAE9B3pB,KAAKu9B,SAAW,IAAIrZ,EACpBlkB,KAAKu9B,SAASD,YAAa,EAC3Bt9B,KAAKu9B,SAAS5T,eAAgB,EAE9B3pB,KAAKw9B,UAAY,IAAI3P,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAK,KAG9D4P,eAAeC,GAEb,MAAMlC,EAAQx7B,KAAKm9B,YAAY58B,QAAQm9B,GACnClC,GAAS,GAEXx7B,KAAKm9B,YAAYQ,OAAOnC,EAAO,GAGjCx7B,KAAKq9B,SAAS/hB,OAAOoiB,GACrB19B,KAAKu9B,SAASjiB,OAAOoiB,GAErBA,EAAKphB,UAGPshB,yBAAyBF,GAEvB19B,KAAKm9B,YAAYx2B,KAAK+2B,GACtB19B,KAAKq9B,SAASp1B,IAAIy1B,GAElBA,EAAKG,qCAGPC,wBAAwBJ,GAEtB19B,KAAKm9B,YAAYx2B,KAAK+2B,GACtB19B,KAAKu9B,SAASt1B,IAAIy1B,GAElBA,EAAKK,oCAGPn0B,SAME5J,KAAKw9B,UAAUjM,yBAEfvxB,KAAKo9B,oBAAoB1U,KAAKsV,GAAMvH,KACpC,IAAK,IAAIhwB,EAAI,EAAGA,EAAIzG,KAAKm9B,YAAYl4B,OAAQwB,IAE3CzG,KAAKm9B,YAAY12B,GAAGw3B,aAAaj+B,KAAKo9B,qBAI1CjhB,OAAOC,GAGDpc,KAAKq9B,SAAS5Y,SAASxf,OAAS,GAElCuvB,GAASrY,OAAOnc,KAAKq9B,SAAUr9B,KAAKw9B,WAElCx9B,KAAKu9B,SAAS9Y,SAASxf,OAAS,GAElCuvB,GAASrY,OAAOnc,KAAKu9B,SAAUlQ,GAAc1hB,SAIjD0d,QAEErpB,KAAKk+B,6BAA0B96B,IC4HnC,IAAe+6B,GAAA,IArMf,MAEEp+B,OAEEC,KAAKo+B,QAAU,IAAIC,EACnBr+B,KAAKqG,MAAQ,IAAIi4B,EACjBt+B,KAAKu+B,IAAM,IAAIC,EAEfx+B,KAAKy+B,SAAW,IAAIl4B,EACpBvG,KAAK0+B,WAAa,IAAIn4B,EAGxBo4B,WAAW1gB,GAETA,EAASA,GAAUoP,GAAc1hB,QACjC,MAAMizB,EAAU,IAAIr4B,EAKpB,OAHAq4B,EAAQ5a,IAAI,EAAG,EAAG,GAClB4a,EAAQC,gBAAgB5gB,EAAO6H,YAExB8Y,EAGTE,gBAAgB7gB,GAEdA,EAASA,GAAUoP,GAAc1hB,QACjC,MAAMizB,EAAU,IAAIr4B,EAKpB,OAHAq4B,EAAQ5a,IAAI,EAAG,GAAI,GACnB4a,EAAQC,gBAAgB5gB,EAAO6H,YAExB8Y,EAGTG,cAAc9gB,GAEZA,EAASA,GAAUoP,GAAc1hB,QACjC,MAAMizB,EAAU,IAAIr4B,EAIpB,OAFAq4B,EAAQ5a,IAAI,EAAG,EAAG,GAClB4a,EAAQC,gBAAgB5gB,EAAO6H,YACxB8Y,EAGTI,yBAAyBvI,EAAKxY,GAE5BA,EAASA,GAAUoP,GAAc1hB,QACjC,MAAMizB,EAAU,IAAIr4B,EAEd04B,EAAShhB,EAAO0J,IAAM,EAAK5hB,KAAK4B,GAAK,IACrCu3B,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAAShhB,EAAO2J,QAAW,EAE3DyX,EAAQt5B,KAAKq5B,IAAIH,GAAShhB,EAAO6J,IACjCwX,EAAQv5B,KAAKq5B,IAAIF,GAASjhB,EAAO6J,IAIvC,OAFA8W,EAAQ5a,IAAIsb,EAAQ7I,EAAInvB,EAAG+3B,EAAQ5I,EAAIlvB,GAAI0W,EAAO6J,KAAKW,YAEhDmW,EAAQC,gBAAgB5gB,EAAO6H,YAGxCyZ,uBAAuBC,EAAgBC,EAAchJ,EAAKxY,GAExDA,EAASA,GAAUoP,GAAc1hB,QACjC8qB,EAAMA,GAAOuH,GAAMvH,IAEnB,MAAMmI,EAAU,IAAIr4B,EAcpB,OAZAvG,KAAKqG,MAAMq5B,8BAA8BD,GAAgBz/B,KAAK8+B,gBAAgB7gB,GAASuhB,GACnFvhB,EAAO0hB,oBAET3/B,KAAKu+B,IAAIva,IAAI/F,EAAOiI,SAAUlmB,KAAKg/B,yBAAyBvI,EAAKxY,KAIjEje,KAAK0+B,WAAW1a,IAAIyS,EAAInvB,EAAGmvB,EAAIlvB,EAAG,GAAGq4B,UAAU3hB,GAC/Cje,KAAKu+B,IAAIva,IAAI/F,EAAOiI,SAAUlmB,KAAK0+B,aAGrC1+B,KAAKu+B,IAAIsB,eAAe7/B,KAAKqG,MAAOu4B,GAC7BA,EAGTkB,qBAAqB15B,EAAQ25B,EAAa,GAExC,MACMC,GADgB,IAAIjb,GAAS3B,cAAchd,GACR4B,OACnCi4B,EAAiBjgC,KAAK8+B,gBAAgBzR,GAAc1hB,SAASrH,QAE7D+B,GAAQ,IAAIi4B,GAAQoB,8BAA8BO,EAAgBD,GAElEx5B,EAAkBpB,GAAM86B,wBAAwB95B,EAAQC,GAExD85B,EAA0B,IAAI55B,EACpC,IAAIokB,GAAO,IAAIC,GAAOxH,cAAc5c,GACpCmkB,EAAIyV,UAAUD,GAEd,MAAME,EAAK,IAAI95B,EAAQ,EAAG,EAAG,GAAGs4B,gBAAgBxR,GAAc1hB,QAAQma,YAChEwa,EAAQD,EAAG/7B,QAAQi8B,MAAMN,GAAgBxX,YACzC+F,GAAM,IAAI6P,GAAUra,IAAIsc,EAAMh5B,EAAG+4B,EAAG/4B,EAAG24B,EAAe34B,EAAG04B,EAAmB14B,EAChFg5B,EAAM/4B,EAAG84B,EAAG94B,EAAG04B,EAAe14B,EAAGy4B,EAAmBz4B,EACpD+4B,EAAMv4B,EAAGs4B,EAAGt4B,EAAGk4B,EAAel4B,EAAGi4B,EAAmBj4B,EACpD,EAAM,EAAkB,EAAU,GAE9By4B,GAAc,IAAInC,GAAUoC,WAAWjS,GAC7C,IAAK,IAAI/nB,EAAI,EAAGA,EAAID,EAAgBvB,OAAQwB,IAE1CD,EAAgBC,GAAGi6B,aAAaF,GAGlC,MAAMv+B,EAAO,IAAIsE,EACjBokB,GAAO,IAAIC,GAAOxH,cAAc5c,GAChCmkB,EAAI0D,QAAQpsB,GACZA,EAAKiG,eAAe63B,GACpB,MAAMY,EAAmB,IAAIp6B,EAG7B,OAFAokB,EAAIyV,UAAUO,GAEP,CACLza,SAAUia,EACV7sB,KAAMtT,KAAK4gC,qBAAqB3+B,EAAKqF,EAAI,EAAGrF,EAAKsF,EAAI,IAIzDq5B,qBAAqBhhB,EAAOc,GAE1B,MAAMue,EAAS5R,GAAc1hB,QAAQgc,IAAM,EAAK5hB,KAAK4B,GAAK,IACpDu3B,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAAS5R,GAAc1hB,QAAQic,QAAW,EAE1EyX,EAAQ3e,EAAS3a,KAAKq5B,IAAIH,GAC1BK,EAAQ1f,EAAQ7Z,KAAKq5B,IAAIF,GAE/B,OAAOn5B,KAAKL,IAAIK,KAAKsB,IAAIi4B,GAAQv5B,KAAKsB,IAAIg4B,IAG5CwB,oBAAoB9U,EAAI9N,GAEtB,GAAIA,EAAO6iB,qBACX,CACE/U,EAAGsC,QAAQruB,KAAKy+B,UAEhB,MAAMsC,EAAQ/gC,KAAKy+B,SAASn3B,EACtB05B,EAAQhhC,KAAKy+B,SAASl3B,EACtB05B,EAAgBF,EAAQC,EAC9B,OAAIzU,GAAQzF,aAAema,EAAgB,EAElC1U,GAAQ7L,OAASsgB,EAIjBzU,GAAQ3M,MAAQmhB,EAI3B,CAEE,MAAM9+B,EAAO,IAAIsE,EAEjB,OADAwlB,EAAGsC,QAAQpsB,GACJjC,KAAK4gC,qBAAqB3+B,EAAKqF,EAAGrF,EAAKsF,IAIlD25B,oBAAoBC,EAAQljB,GAE1BA,EAASA,GAAUoP,GAAc1hB,QACjC,MAAMizB,EAAU,IAAIr4B,EAOpB,OALA46B,EAAOC,iBAAiBxC,GACxBA,EAAQyC,QAAQpjB,GAEhB2gB,EAAQt3B,GAAiB,GAAZs3B,EAAQt3B,EAAU,IAAQilB,GAAa,MACpDqS,EAAQr3B,GAAK,GAAiB,GAAZq3B,EAAQr3B,EAAU,KAAQglB,GAAQ7L,OAC7Cke,EAGT0C,oBAAoBzX,EAAK5L,GAEvBA,EAASA,GAAUoP,GAAc1hB,QACjC,MAAMizB,EAAU,IAAIr4B,EAOpB,OALAq4B,EAAQlW,KAAKmB,GACb+U,EAAQyC,QAAQpjB,GAEhB2gB,EAAQt3B,GAAiB,GAAZs3B,EAAQt3B,EAAU,IAAQilB,GAAa,MACpDqS,EAAQr3B,GAAK,GAAiB,GAAZq3B,EAAQr3B,EAAU,KAAQglB,GAAQ7L,OAC7Cke,EAGT2C,kBAAkBtjB,GAEhBA,EAAOujB,MAAUjV,GAAQ3M,MAAQ,EACjC3B,EAAOqiB,MAAS/T,GAAQ3M,MAAQ,EAChC3B,EAAOwjB,IAASlV,GAAQ7L,OAAS,EACjCzC,EAAOyjB,QAAUnV,GAAQ7L,OAAS,EAClCzC,EAAO2J,OAAS2E,GAAQzF,aACxB7I,EAAOsT,wBAAuB,KCrJlC,IAAeoQ,GAAA,IAtCf,MAEEvgC,eAIArB,KAAK0e,EAAQmjB,EAAe7S,EAAoBwH,EAA2B7b,UAEzE2S,GAActtB,OACd8hC,GAAgB9hC,OAChB2wB,GAAa3wB,OACbwwB,GAAcxwB,OACdmV,GAAanV,OACb+hC,GAAgB/hC,OAChBi+B,GAAMj+B,KAAK6hC,EAAerL,GAC1BwL,GAAGhiC,OACHwD,GAAQxD,OACRiiC,GAAuBjiC,OACvBob,GAAkBpb,OAClB4oB,GAAa5oB,OACbwsB,GAAQxsB,OACR6Y,GAAK7Y,OACLkiC,GAAGliC,OAEHy0B,GAASz0B,KAAK0e,EAAQsQ,GACtBmT,GAAMniC,OAGRuc,QAAQ6lB,GAEN3N,GAASlY,UACT0hB,GAAM1hB,UACNqM,GAAarM,UAEb6lB,EAAY7lB,kNCzCD,MAAM8lB,WAAqBllB,GAExC9b,cAEEuN,o2DAAY8N,IAEZzc,KAAK2c,SAAS0lB,mBAAqB,CAAEt9B,MAAO,IAAIs5B,GAChDr+B,KAAK2c,SAAS2lB,kBAAqB,CAAEv9B,MAAO,IAAIs5B,GAEhDr+B,KAAK2c,SAAS4lB,MAAY,CAAEx9B,MAAO,OACnC/E,KAAK2c,SAAS6lB,QAAY,CAAEz9B,MAAO,IACnC/E,KAAK2c,SAASkQ,UAAY,CAAE9nB,MAAO,KAEnC/E,KAAK2c,SAAS8lB,cAAgB,CAAE19B,MAAO/E,KAAK0iC,uBAC5C1iC,KAAK2c,SAASgmB,gBAAkB,CAAE59B,MAAO/E,KAAK4iC,yBAGhDF,sBAEE,MAAMG,EAAgB,GAGtB,IAAK,IAAIp8B,EAAI,EAAGA,EAFI,GAEaA,IACjC,CACE,MAAMye,EAAM,IAAI3e,EAAwB,EAAhBR,KAAKuC,SAAe,EAC1B,EAAhBvC,KAAKuC,SAAe,EACpBvC,KAAKuC,UACP4c,EAAIuD,YACJ,IAAI5F,EAAQpc,EARM,GASlBoc,EAAU5b,EAAMC,KAAK,GAAK,EAAK2b,EAAQA,GACvCqC,EAAIhd,eAAe2a,GAEnBggB,EAAcl8B,KAAKue,GAErB,OAAO2d,EAGTD,wBAEE,MAAME,EAAkB,IAAIlH,WAAW,IACvC,IAAK,IAAIn1B,EAAI,EAAGA,EAAI,GAAIA,IAEtBq8B,EAAoB,EAAJr8B,EAAQ,GAAKV,KAAKsC,MAAsB,IAAhBtC,KAAKuC,UAC7Cw6B,EAAoB,EAAJr8B,EAAQ,GAAKV,KAAKsC,MAAsB,IAAhBtC,KAAKuC,UAC7Cw6B,EAAoB,EAAJr8B,EAAQ,GAAK,EAG/B,MAAMs8B,EAAmB,IAAIlH,EAAYiH,EAAiB,EAAG,EAAGhH,GAKhE,OAJAiH,EAAiBC,MAAQC,EACzBF,EAAiBG,MAAQD,EAEzBF,EAAiBviB,aAAc,EACxBuiB,GC5DI,MAAMI,WAA4BjmB,GAE/C9b,cAEEuN,wPACA3O,KAAK2c,SAASymB,IAAM,CAAEr+B,WAAO3B,ICFlB,MAAMigC,WAAqCnmB,GAExD9b,cAEEuN,i5BAAY20B,IACZtjC,KAAK2c,SAASkQ,UAAqB,CAAE9nB,MAAO,GAC5C/E,KAAK2c,SAAS0lB,mBAAqB,CAAEt9B,MAAO,IAAIs5B,ICPrC,MAAMkF,WAAwBrmB,GAE3C9b,cAEEuN,6sBACA3O,KAAK2c,SAAS6mB,WAAa,CAAEz+B,MAAO,IAAI6R,ICL7B,MAAM6sB,GAEnBriC,YAAYgb,GAEVpc,KAAK0jC,IAAM,IAAI1W,EAAkB,EAAG,GACpChtB,KAAK2jC,IAAM,IAAI3W,EAAkB,EAAG,GACpChtB,KAAK4jC,aAAe,IAAIL,GAG1BM,KAAK9a,GAECA,EAAGnJ,QAAU5f,KAAK0jC,IAAI9jB,OAASmJ,EAAGrI,SAAW1gB,KAAK0jC,IAAIhjB,SAExD1gB,KAAK0jC,IAAIpW,QAAQvE,EAAGnJ,MAAOmJ,EAAGrI,QAC9B1gB,KAAK2jC,IAAIrW,QAAQvE,EAAGnJ,MAAOmJ,EAAGrI,SAGhC1gB,KAAK4jC,aAAajnB,SAAS6mB,WAAWz+B,MAAMif,IAAI,EAAG,GACnDwQ,GAAS1G,KAAK/E,EAAI/oB,KAAK0jC,IAAK1jC,KAAK4jC,cACjC5jC,KAAK4jC,aAAajnB,SAAS6mB,WAAWz+B,MAAMif,IAAI,EAAG,GACnDwQ,GAAS1G,KAAK9tB,KAAK0jC,IAAK3a,EAAI/oB,KAAK4jC,eCZtB,MAAME,WAAuB5nB,GAE1C9a,cAEEuN,QAEA3O,KAAK+jC,SAAW,IAAI3B,GACpBpiC,KAAKgkC,iBAAmB,IAAIb,GAC5BnjC,KAAKikC,cAAgB,IAAIZ,GAEzBrjC,KAAKkkC,KAAO3T,GAAc4T,SAAW,EAAI,EAEzCnkC,KAAKokC,QAAU,IAAIpX,EAAkBT,GAAQ3M,MAAQ5f,KAAKkkC,KAAM3X,GAAQ7L,OAAS1gB,KAAKkkC,MAEtFlkC,KAAKqkC,QAAU,IAAIrX,EAAkBT,GAAQ3M,MAAO2M,GAAQ7L,QAE5D1gB,KAAKskC,QAAU,IAAIb,GACnBjP,GAASpF,4BAA6B,EAGxCjT,SAEEnc,KAAKukC,kBAEL/P,GAASnL,MAAMrpB,KAAKokC,QAAS/W,GAAc1hB,SAAS,GAAM,GAC1D6oB,GAASrY,OAAOwM,GAAahd,QAAS0hB,GAAc1hB,QAAS3L,KAAKokC,SAElEpkC,KAAKwkC,oBAELhQ,GAAS1G,KAAK0G,GAASpD,iBAAkBpxB,KAAKqkC,QAASrkC,KAAK+jC,UAG5D/jC,KAAKskC,QAAQT,KAAK7jC,KAAKqkC,SACvB7P,GAAS1G,KAAK9tB,KAAKqkC,aAASjhC,GAG5BpD,KAAKgkC,iBAAiBrnB,SAASymB,IAAIr+B,MAAQ/E,KAAKqkC,QAAQnW,QACxDsG,GAAS1G,KAAK9tB,KAAKokC,aAAShhC,EAAWpD,KAAKgkC,kBAK9CQ,oBAEExkC,KAAK+jC,SAASpnB,SAAS0lB,mBAAmBt9B,MAAM07B,WAAWpT,GAAc1hB,QAAQ84B,kBACjFzkC,KAAK+jC,SAASpnB,SAAS2lB,kBAAkBv9B,MAAM2jB,KAAK2E,GAAc1hB,QAAQ84B,kBAC1EzkC,KAAK+jC,SAASpnB,SAASkQ,UAAU9nB,MAAQsoB,GAAc1hB,QAAQmc,IAGjEyc,kBAEMvkC,KAAKokC,QAAQxkB,QAAU2M,GAAQ3M,MAAQ5f,KAAKkkC,MAAQlkC,KAAKokC,QAAQ1jB,SAAW6L,GAAQ7L,OAAS1gB,KAAKkkC,OAEpGlkC,KAAKokC,QAAQ9W,QAAQf,GAAQ3M,MAAQ5f,KAAKkkC,KAAM3X,GAAQ7L,OAAS1gB,KAAKkkC,MACtElkC,KAAKqkC,QAAQ/W,QAAQf,GAAQ3M,MAAO2M,GAAQ7L,UC9DnC,MAAMgkB,WAAqBxoB,GAExC9a,cAEEuN,QAGFwN,SAEEqY,GAASnL,WAAMjmB,EAAWiqB,GAAc1hB,SAAS,GAAM,GAEnDgd,GAAahd,QAAQqQ,eAEvB2M,GAAahd,QAAQqQ,gBAGnB2M,GAAahd,QAAQwQ,OAEvBwM,GAAahd,QAAQwQ,SAIrBqY,GAASrY,OAAOwM,GAAahd,QAAS0hB,GAAc1hB,SAGlDgd,GAAahd,QAAQoQ,gBAEvB4M,GAAahd,QAAQoQ,kBC7BZ,MAAM4oB,WAAmCznB,GAEtD9b,YAAYwjC,GAEVj2B,m7BAAYvL,EAAW,CACrByhC,SAAUD,IAEZ5kC,KAAK2c,SAASW,SAAkB,CAAEvY,WAAO3B,GACzCpD,KAAK2c,SAASmoB,YAAkB,CAAE//B,WAAO3B,GACzCpD,KAAK2c,SAASooB,eAAkB,CAAEhgC,MAAO,GAEzC/E,KAAK2c,SAASqoB,aAAgB,CAAEjgC,MAAO,MACvC/E,KAAK2c,SAASsoB,aAAgB,CAAElgC,MAAO,MACvC/E,KAAK2c,SAASuoB,aAAgB,CAAEngC,MAAO,MACvC/E,KAAK2c,SAASwoB,aAAgB,CAAEpgC,MAAO,MACvC/E,KAAK2c,SAASyoB,aAAgB,CAAErgC,MAAO,MAEvC/E,KAAK2c,SAAS0oB,cAAgB,CAAEtgC,MAAO,GACvC/E,KAAK2c,SAAS2oB,aAAgB,CAAEvgC,MAAO,CAAC,EAAK,GAAK,GAAK,GAAK,KAC5D/E,KAAK2c,SAAS4oB,YAAgB,CAAExgC,MAAO,GAEvC,MAAMygC,EAAkB,CACtB,IAAIvoB,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,YAGZjd,KAAK2c,SAAS6oB,gBAAkB,CAAEzgC,MAAOygC,GAG3CC,SAASC,GAEP1lC,KAAK2c,SAASqoB,aAAajgC,MAAQ2gC,EAGrCC,SAASD,GAEP1lC,KAAK2c,SAASsoB,aAAalgC,MAAQ2gC,EAGrCE,SAASF,GAEP1lC,KAAK2c,SAASuoB,aAAangC,MAAQ2gC,EAGrCG,SAASH,GAEP1lC,KAAK2c,SAASwoB,aAAapgC,MAAQ2gC,EAGrCI,SAASJ,GAEP1lC,KAAK2c,SAASyoB,aAAargC,MAAQ2gC,EAGrCK,mBAAmBhhC,GAEjB/E,KAAK2c,SAAS0oB,cAActgC,MAAQA,EAGtCihC,iBAAiBjhC,GAEf/E,KAAK2c,SAAS4oB,YAAYxgC,MAAQA,EAGpCkhC,iBAAiBC,GAEflmC,KAAK2c,SAAS6oB,gBAAgBzgC,MAAM,GAAGif,IAAIkiB,GAG7CC,iBAAiBD,GAEflmC,KAAK2c,SAAS6oB,gBAAgBzgC,MAAM,GAAGif,IAAIkiB,GAG7CE,iBAAiBF,GAEflmC,KAAK2c,SAAS6oB,gBAAgBzgC,MAAM,GAAGif,IAAIkiB,GAG7CG,iBAAiBH,GAEflmC,KAAK2c,SAAS6oB,gBAAgBzgC,MAAM,GAAGif,IAAIkiB,GAG7CI,iBAAiBJ,GAEflmC,KAAK2c,SAAS6oB,gBAAgBzgC,MAAM,GAAGif,IAAIkiB,ICzFhC,MAAMK,WAAoBrpB,GAEvC9b,YAAYwjC,GAEVj2B,gMAEA3O,KAAK2c,SAAS6pB,WAAa,CAAEzhC,WAAO3B,GAGtCqjC,gBAAgBlf,GAEdvnB,KAAK2c,SAAS6pB,WAAWzhC,MAAQwiB,GCVtB,MAAMmf,WAA6BxpB,GAEhD9b,YAAYulC,GAEVh4B,6qBAAYvL,EAAW,CACrBwjC,cAAeD,EACfE,MAAOF,IAGT3mC,KAAK2c,SAASmqB,QAAU,CAAE/hC,MAAO,IAAI6R,EAAQ,GAAK,KAClD5W,KAAK2c,SAASoqB,UAAY,CAAEhiC,MAAO,IAAI6R,EAAQ,GAAK,KAGtDowB,SAASl/B,EAAGmf,GAEVjnB,KAAK2c,SAASmqB,QAAQ/hC,MAAMuC,EAAIQ,EAChC9H,KAAK2c,SAASmqB,QAAQ/hC,MAAMwC,EAAI0f,EAGlCggB,cAAc3/B,EAAGC,GAEfvH,KAAK2c,SAASoqB,UAAUhiC,MAAMif,IAAI1c,EAAGC,ICtB1B,MAAM2/B,WAAmChqB,GAEtD9b,YAAYulC,GAEVh4B,ydAEA3O,KAAK2c,SAASwqB,oBAAsB,CAAEpiC,MAAO,KAC7C/E,KAAK2c,SAASyqB,YAAsB,CAAEriC,MAAO,KAC7C/E,KAAK2c,SAAS0qB,aAAsB,CAAEtiC,MAAO,IAAIkY,EAAM,YACvDjd,KAAK2c,SAAS2qB,eAAsB,CAAEviC,MAAO,ICNlC,MAAMwiC,GAEnBnmC,YAAYwjC,EAAQ,GAElB5kC,KAAKwnC,cAAgB,EACrBxnC,KAAKynC,eAAiB,EAEtBznC,KAAK0nC,uBAAyB,GAC9B1nC,KAAK2nC,wBAA0B,GAC/B3nC,KAAK4nC,sBAAwB,GAE7B5nC,KAAK4kC,MAAQA,EACb5kC,KAAK6nC,gBAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,IACpC7nC,KAAK8nC,QAAU,CAAEC,UAAWC,EAAcC,UAAWD,EAAcE,OAAQnM,GAE3E/7B,KAAKmoC,mBAAqB,IAAInb,EAAkB,EAAG,EAAGhtB,KAAK8nC,SAC3D9nC,KAAKmoC,mBAAmBja,QAAQka,iBAAkB,EAElDpoC,KAAKqoC,iBACLroC,KAAKsoC,UAELtoC,KAAKuoC,yBAA2B,IAAIrB,GAGtCrD,KAAK9a,EAAIyf,GAEPxoC,KAAKyoC,UAAU1f,EAAGnJ,MAAOmJ,EAAGrI,QAExB8nB,EAEFhU,GAAS1G,KAAK/E,EAAI/oB,KAAKmoC,mBAAoBnoC,KAAKuoC,0BAIhD/T,GAAS1G,KAAK/E,EAAI/oB,KAAKmoC,oBAGzB,IAAIO,EAAoB1oC,KAAKmoC,mBAE7B,IAAK,IAAI1hC,EAAI,EAAGA,EAAIzG,KAAK4kC,MAAOn+B,IAChC,CACE,MAAM+nB,EAAMxuB,KAAK0nC,uBAAuBjhC,GAExC+nB,EAAIyY,cAAc,EAAG,GACrBzS,GAAS1G,KAAK4a,EAAmB1oC,KAAK2nC,wBAAwBlhC,GAAI+nB,GAElEA,EAAIyY,cAAc,EAAG,GACrBzS,GAAS1G,KAAK9tB,KAAK2nC,wBAAwBlhC,GAAIzG,KAAK4nC,sBAAsBnhC,GAAI+nB,GAE9Eka,EAAoB1oC,KAAK4nC,sBAAsBnhC,IAInDkiC,sBAEE,OAAO3oC,KAAK2nC,wBAAwB,GAAGzZ,QAGzC0a,iBAEE,OAAO5oC,KAAK2nC,wBAAwB,GAGtCW,UAEEtoC,KAAK6oC,aAEL7oC,KAAKmoC,mBAAmB7a,QAAQ,EAAG,GAEnC,IAAK,IAAI7mB,EAAI,EAAGA,EAAIzG,KAAK4kC,MAAOn+B,IAChC,CACE,MAAMqiC,EAAM,IAAI9b,EAAkB,EAAG,EAAGhtB,KAAK8nC,SACvCiB,EAAM,IAAI/b,EAAkB,EAAG,EAAGhtB,KAAK8nC,SAE7CgB,EAAI5a,QAAQka,iBAAkB,EAC9BW,EAAI7a,QAAQka,iBAAkB,EAE9BpoC,KAAK2nC,wBAAwBhhC,KAAKmiC,GAClC9oC,KAAK4nC,sBAAsBjhC,KAAKoiC,IAIpCN,UAAUhM,EAAeuM,GAEvB,GAAIhpC,KAAKwnC,gBAAkB/K,GAAiBz8B,KAAKynC,iBAAmBuB,EAElE,OAGFhpC,KAAKwnC,cAAgB/K,EACrBz8B,KAAKynC,eAAiBuB,EAEtB,IAAIppB,EAAQ7Z,KAAKC,MAAMy2B,EAAgB,GACnC/b,EAAS3a,KAAKC,MAAMgjC,EAAiB,GAEzChpC,KAAKmoC,mBAAmB7a,QAAQ1N,EAAOc,GAEvC,IAAK,IAAIja,EAAI,EAAGA,EAAIzG,KAAK4kC,MAAOn+B,IAE9BzG,KAAK4nC,sBAAsBnhC,GAAG6mB,QAAQ1N,EAAOc,GAC7C1gB,KAAK2nC,wBAAwBlhC,GAAG6mB,QAAQ1N,EAAOc,GAC/C1gB,KAAK0nC,uBAAuBjhC,GAAGugC,SAASpnB,EAAOc,GAE/Cd,EAAU7Z,KAAKC,MAAM4Z,EAAQ,GAC7Bc,EAAU3a,KAAKC,MAAM0a,EAAS,GAIlC2nB,eAAe5L,EAAeuM,GAE5BhpC,KAAKipC,oBAEL,IAAK,IAAIxiC,EAAI,EAAGA,EAAIzG,KAAK4kC,MAAOn+B,IAE9BzG,KAAK0nC,uBAAuB/gC,KAAK,IAAI+/B,GAAqB1mC,KAAK6nC,gBAAgBphC,KAInFwiC,oBAEE,IAAK,IAAIxiC,EAAI,EAAGA,EAAIzG,KAAK0nC,uBAAuBziC,OAAQwB,IAEtDzG,KAAK0nC,uBAAuBjhC,GAAG6V,UAEjCtc,KAAK0nC,uBAAuBziC,OAAS,EAGvC4jC,aAEE,IAAK,IAAIpiC,EAAI,EAAGA,EAAIzG,KAAK4nC,sBAAsB3iC,OAAQwB,IAErDzG,KAAK2nC,wBAAwBlhC,GAAG6V,UAChCtc,KAAK4nC,sBAAsBnhC,GAAG6V,UAEhCtc,KAAKmoC,mBAAmB7rB,UAExBtc,KAAK2nC,wBAAwB1iC,OAAS,EACtCjF,KAAK4nC,sBAAsB3iC,OAAS,GCnIzB,MAAMikC,WAA0BhtB,GAE7C9a,cAEEuN,QAEA3O,KAAKmpC,uBAAoB/lC,EAEzBpD,KAAKokC,aAAUhhC,EACfpD,KAAKopC,aAAUhmC,EACfpD,KAAKskC,aAAUlhC,EAEfpD,KAAKqpC,QAAU,IAAI9C,GAGrB/uB,WAEExX,KAAKskC,QAAU,IAAIiD,GACnBvnC,KAAKokC,QAAU,IAAIpX,EAAkBT,GAAQpG,aAAcoG,GAAQnG,eACnEpmB,KAAKopC,QAAU,IAAIpc,EAAkBT,GAAQpG,aAAcoG,GAAQnG,eAEnEpmB,KAAKmpC,kBAAoB,IAAIxE,GAA2B,GACxD3kC,KAAKskC,QAAU,IAAIiD,GAAgB,GAEnCvnC,KAAKmpC,kBAAkB1D,SAASzlC,KAAKskC,QAAQsD,sBAAsB,GAAG1Z,SACtEluB,KAAKmpC,kBAAkBxD,SAAS3lC,KAAKskC,QAAQsD,sBAAsB,GAAG1Z,SACtEluB,KAAKmpC,kBAAkBvD,SAAS5lC,KAAKskC,QAAQsD,sBAAsB,GAAG1Z,SACtEluB,KAAKmpC,kBAAkBtD,SAAS7lC,KAAKskC,QAAQsD,sBAAsB,GAAG1Z,SACtEluB,KAAKmpC,kBAAkBrD,SAAS9lC,KAAKskC,QAAQsD,sBAAsB,GAAG1Z,SAEtEluB,KAAKmpC,kBAAkBpD,mBAAmB,GAC1C/lC,KAAKmpC,kBAAkBnD,iBAAiB,GAExChmC,KAAKqpC,QAAQ5C,gBAAgBzmC,KAAKskC,QAAQqD,wBAAwB,GAAGzZ,SAGvE6X,mBAAmBuD,GAEjBtpC,KAAKmpC,kBAAkBpD,mBAAmBuD,GAG5CtD,iBAAiBsD,GAEftpC,KAAKmpC,kBAAkBnD,iBAAiBsD,GAG1CrD,iBAAiBC,GAEflmC,KAAKmpC,kBAAkBlD,iBAAiBC,GAG1CC,iBAAiBD,GAEflmC,KAAKmpC,kBAAkBhD,iBAAiBD,GAG1CE,iBAAiBF,GAEflmC,KAAKmpC,kBAAkB/C,iBAAiBF,GAG1CG,iBAAiBH,GAEflmC,KAAKmpC,kBAAkB9C,iBAAiBH,GAG1CI,iBAAiBJ,GAEflmC,KAAKmpC,kBAAkB7C,iBAAiBJ,GAG1C/pB,SAEEnc,KAAKukC,kBAEL/P,GAASnL,MAAMrpB,KAAKokC,QAAS/W,GAAc1hB,SAAS,GAAM,GAC1D6oB,GAASrY,OAAOwM,GAAahd,QAAS0hB,GAAc1hB,QAAS3L,KAAKokC,SAGlEpkC,KAAKskC,QAAQT,KAAK7jC,KAAKokC,SAAS,GAGhC5P,GAASjG,cAAcvuB,KAAKmpC,kBAAmBnpC,KAAKskC,QAAQqD,wBAAwB,IAGpFnT,GAAS1G,KAAK9tB,KAAKokC,aAAShhC,EAAWpD,KAAKqpC,SAG9C9E,kBAEMvkC,KAAKokC,QAAQxkB,QAAU2M,GAAQpG,cAAgBnmB,KAAKokC,QAAQ1jB,SAAW6L,GAAQnG,gBAEjFpmB,KAAKokC,QAAQ9W,QAAQf,GAAQpG,aAAcoG,GAAQnG,eACnDpmB,KAAKopC,QAAQ9b,QAAQf,GAAQpG,aAAcoG,GAAQnG,iBCtG1C,MAAMyH,WAA2B0b,EAE9CnoC,YAAYogC,EAAMlB,EAAOmB,EAAKC,EAAQ7Z,EAAMC,GAE1CnZ,MAAM6yB,EAAMlB,EAAOmB,EAAKC,EAAQ7Z,EAAMC,GAEtC9nB,KAAK+nB,YAAc,IAAI9K,EAAM,WAC7Bjd,KAAKgoB,YAAc,GCyDvB,IAAewhB,GAAA,IAjEf,MAEEpoC,cAEEpB,KAAKypC,WAAa,GAClBzpC,KAAK0pC,mBAAqB,IAAIC,IAGhC//B,SAEE5J,KAAK4pC,6BAEL,IAAK,MAAMC,KAAa7pC,KAAK0pC,mBAE3BG,EAAUjgC,OAAOwR,GAAYrC,mBAAmBV,oBAIpDyxB,mBAAmBD,GAEjB7pC,KAAKypC,WAAW9iC,KAAKkjC,GAGvBE,iBAAiBF,GAIf7pC,KAAK0pC,mBAAmBzhC,IAAI4hC,GAG9BG,kBAAkBH,GAIhB7pC,KAAK0pC,mBAAmBO,OAAOJ,GAGjCK,sBAAsBC,GAEpBxnC,QAAQC,KAAK,oDACb5C,KAAK4E,IAAIulC,GAGXvlC,IAAIulC,GAEF,IAAK,IAAI1jC,EAAI,EAAGA,EAAIzG,KAAKypC,WAAWxkC,OAAQwB,IAE1C,GAAIzG,KAAKypC,WAAWhjC,GAAG/F,OAASypC,EAE9B,OAAOnqC,KAAKypC,WAAWhjC,GAG3B9D,QAAQM,MAAM,sDAAuDknC,GAIvEP,6BAEE,IAAK,IAAInjC,EAAI,EAAGA,EAAIzG,KAAKypC,WAAWxkC,OAAQwB,IAE1CzG,KAAKypC,WAAWhjC,GAAGkU,YAAYS,GAAYrC,mBAAmBV,sBCtDrD,MAAM+xB,GAEnBhpC,YAAYipC,EAAoB/d,GAE9B+d,EAAqBA,GAAsB,IAAIxuB,GAE/C7b,KAAKqqC,mBAAqBA,EAC1BrqC,KAAKssB,SAAWA,EAEhBtsB,KAAKsqC,YAAa,EAClBtqC,KAAKuqC,cAAgB,EAGvB3gC,SAEO5J,KAAKsqC,aAIV1xB,GAAK9B,WAGsB,IAAvB9W,KAAKuqC,eAEPvqC,KAAKqqC,mBAAmBvuB,gBAG1BkiB,GAAMp0B,SAEN5J,KAAKqqC,mBAAmBzgC,SACxBwR,GAAYxR,SACZ4gC,GAAqB5gC,SAErB5J,KAAKqqC,mBAAmBruB,gBAExBhc,KAAKssB,SAAS1iB,SACdq4B,GAAGr4B,SACHq4B,GAAG9lB,OAAOnc,KAAKssB,UACftsB,KAAKqqC,mBAAmBtuB,iBAExBmmB,GAAM/lB,OAAOnc,KAAKssB,UAIlBtsB,KAAKqqC,mBAAmBpuB,eACxBjc,KAAKuqC,gBAELvM,GAAM3U,QACN4Y,GAAG5Y,QACH6Y,GAAM7Y,SAGRjS,QAEMpX,KAAKsqC,aAEkB,IAAvBtqC,KAAKuqC,eAEPvqC,KAAKqqC,mBAAmB7yB,WAG1BxX,KAAKsqC,YAAa,EAElBtqC,KAAKssB,SAAS0C,UAAUyb,iBAAiBzqC,KAAK4J,OAAO7F,KAAK/D,QAG5DuJ,QAE0B,IAApBvJ,KAAKsqC,aAETtqC,KAAKsqC,YAAa,EAClBtqC,KAAKqqC,mBAAmBryB,UAExBhY,KAAKssB,SAAS0C,UAAUyb,iBAAiB,OAG3C/xB,UAAU2Y,GAERrxB,KAAKqqC,mBAAmBryB,QAAQhY,MAChCA,KAAKqqC,mBAAqBhZ,EAC1BrxB,KAAKqqC,mBAAmB7yB,SAASxX,MAGnCsc,UAEEtc,KAAKuJ,OACLvJ,KAAKuqC,cAAgB,GCzCzB,IAAeG,GAAA,IAnDf,MAEE3qC,OAEE4C,QAAQC,KAAK,uDACb2pB,GAAQxsB,OAGVwmB,gBAAgBjf,EAAGC,GAEjB5E,QAAQC,KAAK,uDACb2pB,GAAQhG,gBAAgBjf,EAAGC,GAG7BqC,SAEEjH,QAAQC,KAAK,uDACb2pB,GAAQ3iB,SAGV6c,YAAY7G,EAAOc,GAEjB/d,QAAQC,KAAK,uDACb2pB,GAAQ9F,YAAY7G,EAAOc,GAG7BgG,uBAAuBC,GAGrB,OADAhkB,QAAQC,KAAK,uDACN2pB,GAAQ7F,uBAAuBC,GAGxCC,oBAAoB7hB,GAGlB,OADApC,QAAQC,KAAK,uDACN2pB,GAAQ3F,oBAAoB7hB,GAGrC8hB,iBAGE,OADAlkB,QAAQC,KAAK,uDACN2pB,GAAQ1F,iBAGbC,mBAGF,OADAnkB,QAAQC,KAAK,uDACN2pB,GAAQzF,eC5CJ,MAAM6jB,WAAyBrsB,GAE5Cld,cAEEuN,QACA3O,KAAK4qC,YAAc,IAAIh0B,EAAQ,EAAG,GAGpCoJ,OAAOR,EAAMM,EAAYrB,EAAQE,GAE/BA,EAAIc,KAAOK,EAAWL,KAEtB,MAAMorB,EAAY7qC,KAAKuf,cAAcC,EAAMM,EAAWL,MAGtDhB,EAAOmB,MAAQ7Z,KAAK2Z,KAAKmrB,EAAUvjC,EAAyB,EAArBtH,KAAK4qC,YAAYtjC,GACxDmX,EAAOiC,OAAS3a,KAAK2Z,KAAKmrB,EAAUtjC,EAAyB,EAArBvH,KAAK4qC,YAAYrjC,GACzDoX,EAAI2K,UAAU,EAAG,EAAG7K,EAAOmB,MAAOnB,EAAOiC,QAGzC/B,EAAImsB,YAAc,EAClBnsB,EAAIwK,UAAYrJ,EAAWC,YAAc,UACzCpB,EAAIyK,SAAS,EAAG,EAAG3K,EAAOmB,MAAOnB,EAAOiC,QACxC/B,EAAImsB,YAAc,EAElBnsB,EAAImsB,YAAc,EAElBnsB,EAAIc,KAAOK,EAAWL,KACtBd,EAAIwK,UAAYrJ,EAAWC,YAAc,UACzCpB,EAAIosB,aAAe,SAEnBpsB,EAAIqsB,UAAYlrB,EAAWkrB,WAAa,SAClB,WAAlBrsB,EAAIqsB,UAENrsB,EAAIssB,SAASzrB,EAAMf,EAAOmB,MAAQ,EAAGnB,EAAOiC,OAAS,GAIrD/B,EAAIssB,SAASzrB,EAAM,EAAGf,EAAOiC,OAAS,ICxC7B,MAAMwqB,GAEnB9pC,aAAYV,KAAEA,EAAI2U,UAAEA,IAElBrV,KAAKU,KAAOA,EACZV,KAAKqV,UAAYA,EACjBrV,KAAKmrC,QAAS,EAEdX,GAAqBV,mBAAmB9pC,MAG1CoX,SAIAI,WAEExX,KAAKqV,UAAUgG,UAAUC,OAAO,UAChCkvB,GAAqBT,iBAAiB/pC,MAEtCA,KAAKmrC,QAAS,EAGhBvhC,UAIAoO,UAEEhY,KAAKqV,UAAUgG,UAAUpT,IAAI,UAC7BuiC,GAAqBR,kBAAkBhqC,MAEvCA,KAAKmrC,QAAS,EAGhBxwB,YAAYtC,GAEVrY,KAAKqV,UAAUsG,MAAMC,QAAUvD,EAAmB,GAAGrY,KAAKU,gBAC1DV,KAAKorC,gBAGPA,gBAEMprC,KAAKqV,UAAUsG,MAAMC,QAAU,KAE7B5b,KAAKmrC,QAEPnrC,KAAKwX,WAKFxX,KAAKmrC,QAERnrC,KAAKgY,UAKXuD,mBAEEnG,GAAcoG,YAAYxb,KAAKqV,WAGjCoG,mBAEErG,GAAcsG,YAAY1b,KAAKqV,YCjEpB,MAAMg2B,WAAwB1mB,EAE3CvjB,YAAYwe,EAAOc,EAAQuC,EAAOuB,GAEhC5E,EAAQA,GAAS,EACjBc,EAASA,GAAU,EACnBuC,EAAQA,GAAS,UACjBuB,EAAWA,GAAY,IAAIM,EAAkB,CAAE7B,MAAOA,IAEtD,MAAMsB,EAAW,IAAI8F,EAAoBzK,EAAOc,GAChD6D,EAASsB,SAAQ,MACjBlX,MAAM4V,EAAUC,ICXL,MAAM8mB,WAAsB3mB,EAEzCvjB,YAAYwe,EAAOc,EAAQuC,EAAOuB,GAEhC5E,EAAQA,GAAS,EACjBc,EAASA,GAAU,EACnBuC,EAAQA,GAAS,UACjBuB,EAAWA,GAAY,IAAIM,EAAkB,CAAE7B,MAAOA,IAGtDtU,MADiB,IAAI0b,EAAoBzK,EAAOc,GAChC8D,ICdL,MAAM+mB,GAEnBnqC,eAGAC,qBAAqBmqC,EAAQ1kC,GAE3BA,EAAOH,KAAK8kC,MAAM3kC,EAAQ0kC,GAG5BnqC,yBAAyBqqC,EAAOzpC,GAE9B,MAAM0pC,EAAmB1pC,EAAOypC,EAAMzmC,OAEtC,IAAK,IAAIwB,EAAI,EAAGA,EAAIklC,EAAkBllC,IAEpCilC,EAAM/kC,KAAK+kC,EAAMjlC,GAAGnC,SAIxBjD,mBAAmBqqC,EAAOhO,GAExB,MAAMlC,EAAQkQ,EAAMnrC,QAAQm9B,GACxBlC,GAAS,GAEXkQ,EAAM/N,OAAOnC,EAAO,GAIxBn6B,yBAAyB+E,EAAQU,GAE/B,IAAI8kC,EAAgBxlC,EAAO,GACvBylC,EAAmBD,EAAc3hB,WAAWnjB,GAChD,IAAK,IAAIL,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAE7BL,EAAOK,GAAGwjB,WAAWnjB,GAAU+kC,IAEjCD,EAAgBxlC,EAAOK,GACvBolC,EAAmBzlC,EAAOK,GAAGwjB,WAAWnjB,IAG5C,OAAO8kC,EAGTvqC,8BAA8ByqC,GAE5B,MAAMC,EAAM5iC,OAAOC,KAAK0iC,GAClB3jC,EAAM,GACZ,IAAK,IAAI1B,EAAI,EAAGA,EAAIslC,EAAI9mC,OAAQwB,IAE9B0B,EAAIxB,KAAKmlC,EAAIC,EAAItlC,KAEnB,OAAO0B,GClDI,MAAM6jC,GAEnB5qC,cAEEpB,KAAKirB,OAAS,IAAIlG,EAGpBknB,WAAW7lC,EAAQ8lC,EAAmBC,EAAcvkB,GAElD5nB,KAAKirB,OAAO7H,cAAchd,GAE1B,MAAM64B,EAAQl5B,KAAKqmC,SAASD,EAAe,GACrCjN,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAASrX,GAAW,EAEpDykB,EAAkBrsC,KAAKssC,oBAAoBJ,EAAmBjN,GAC9DsN,EAAoBvsC,KAAKwsC,sBAAsBN,EAAmBjN,GAClEwN,EAAoBzsC,KAAK0sC,sBAAsBR,EAAmBhN,GAClEyN,EAAqB3sC,KAAK4sC,uBAAuBV,EAAmBhN,GAEpE2N,EAAqB,IAAItmC,EAAQ,EAAG,GAAI,GAAGs4B,gBAAgBqN,GAE3DY,EAAgB9sC,KAAKirB,OAAOjjB,OAAO1D,QAEnCyoC,EAAqB/sC,KAAKgtC,yBAA8C,EAArBhtC,KAAKirB,OAAOtK,OAAiC,EAArB3gB,KAAKirB,OAAOtK,OAAYwrB,EAAcvkB,GACjHqlB,EAAUH,EAAcxoC,QAAQ2D,IAAI4kC,EAAmBvoC,QAAQ4D,gBAAqC,EAAtB6kC,IAE9EG,GAAc,IAAI5O,GAAQoB,8BAA8B2M,EAAiBY,GACzEE,GAAc,IAAI7O,GAAQoB,8BAA8B6M,EAAmBU,GAE3EG,GAAe,IAAI9O,GAAQoB,8BAA8B+M,EAAmBQ,GAC5EI,GAAe,IAAI/O,GAAQoB,8BAA8BiN,EAAoBM,GAEnFjtC,KAAKstC,+BAA+BL,EAAS7mC,EAAQ8lC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAE1GH,EAASxN,8BAA8B2M,EAAiBY,GACxDE,EAAWzN,8BAA8B6M,EAAmBU,GAE5DG,EAAW1N,8BAA8B+M,EAAmBQ,GAC5DI,EAAY3N,8BAA8BiN,EAAoBM,GAE9D,IAAIpB,EAAmBjgC,EAAAA,EAEvB,MAAM2hC,EAAcV,EAAmBvoC,QAAQ4D,gBAAqC,EAAtB6kC,GAC9D,IAAK,IAAItmC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMijB,EAAO,IAAI8jB,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIslC,IAE1DE,EAAwB,IAAIlnC,EAC5BmnC,EAAyB,IAAInnC,EAE7BonC,EAA0B,IAAIpnC,EAC9BqnC,EAA0B,IAAIrnC,EAEpC2mC,EAASW,cAAcnkB,EAAO+jB,GAC9BN,EAAWU,cAAcnkB,EAAMgkB,GAE/BN,EAAWS,cAAcnkB,EAAOikB,GAChCN,EAAYQ,cAAcnkB,EAAMkkB,GAE5BH,EAAqBxoC,SAAW,MAElCtC,QAAQmrC,IAAI,4BAA6BrnC,GAEvCinC,EAAuBzoC,SAAW,MAEpCtC,QAAQmrC,IAAI,8BAA+BrnC,GAEzCknC,EAAuB1oC,SAAW,MAEpCtC,QAAQmrC,IAAI,8BAA+BrnC,GAEzCmnC,EAAwB3oC,SAAW,MAErCtC,QAAQmrC,IAAI,+BAAgCrnC,GAG9C,MAAMsnC,EAAoB3nC,EAAOK,GAAGnC,QAAQ4lB,IAAIujB,GAAsBxoC,SAChE+oC,EAAoB5nC,EAAOK,GAAGnC,QAAQ4lB,IAAIwjB,GAAwBzoC,SAElEgpC,EAAsB7nC,EAAOK,GAAGnC,QAAQ4lB,IAAIyjB,GAAwB1oC,SACpEipC,EAAsB9nC,EAAOK,GAAGnC,QAAQ4lB,IAAI0jB,GAAyB3oC,SAErEkpC,EAAkBpoC,KAAKN,IAAIsoC,EAAiBC,GAC5CI,EAAkBroC,KAAKN,IAAIwoC,EAAmBC,GAE9CzoC,EAAMM,KAAKN,IAAI0oC,EAAcC,GAE/B3oC,EAAMomC,IAERA,EAAmBpmC,GAIvB,MAAM4oC,EAAqBxB,EAAmBvoC,QAAQ4D,eAAe2jC,GAGrE,OAFyBoB,EAAQ3oC,QAAQ2D,IAAIomC,GAK/Cf,+BAA+BgB,EAAYloC,EAAQ8lC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBvuC,KAAKwuC,wBAAwBpoC,EAAQ+mC,EAAYD,EAAUhB,GAC7EuC,EAAoBzuC,KAAK0uC,0BAA0BtoC,EAAQgnC,EAAYC,EAAanB,GAE1FoC,EAAWrmC,IAAIsmC,GACfD,EAAWrmC,IAAIwmC,GAGjBD,wBAAwBpoC,EAAQ+mC,EAAYD,EAAUhB,GAEpD,IAEIyC,EACAC,EAHAC,EAA+BjjC,EAAAA,EAC/BkjC,EAAkCljC,EAAAA,EAItC,MAAMmjC,EAAS,IAAIxoC,EAAQ,EAAG,EAAG,GAAGs4B,gBAAgBqN,GACpD,IAAK,IAAIzlC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMuoC,EAAc,IAAIxB,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAI8mC,EAAOzqC,QAAQ4D,gBAAgB,OAChG+mC,EAAc,IAAIzB,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAI8mC,EAAOzqC,QAAQ4D,eAAe,OAE/FwlC,EAA0B,IAAInnC,EAC9BknC,EAAuB,IAAIlnC,EAEjC4mC,EAAWU,cAAcmB,EAAYtB,GACrCR,EAASW,cAAcoB,EAASxB,GAEhC,MAAMyB,EAAcxB,EAAuBzjB,WAAW7jB,EAAOK,IACvD0oC,EAAc1B,EAAqBxjB,WAAW7jB,EAAOK,IAEvDgnC,EAAqBxoC,SAAW,MAElCtC,QAAQmrC,IAAI,qCAAsCrnC,GAEhDinC,EAAuBzoC,SAAW,MAEpCtC,QAAQmrC,IAAI,uCAAwCrnC,GAGlDyoC,EAAYJ,IAEdA,EAAiCI,EACjCN,EAAqBxoC,EAAOK,IAE1B0oC,EAAUN,IAEZA,EAA+BM,EAC/BR,EAAmBvoC,EAAOK,IAI9B9D,QAAQmrC,IAAIa,EAAkBC,GAE9B,MAAMQ,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAOzqC,QAAQ4D,gBAAgBknC,GAGxCV,0BAA0BtoC,EAAQgnC,EAAYC,EAAanB,GAEzD,IAEImD,EACAC,EAHAC,EAAkC3jC,EAAAA,EAClC4jC,EAAkC5jC,EAAAA,EAItC,MAAM6jC,EAAY,IAAIlpC,EAAQ,EAAG,EAAG,GAAGs4B,gBAAgBqN,GAEvD,IAAK,IAAIzlC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMipC,EAAa,IAAIlC,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwnC,EAAUnrC,QAAQ4D,gBAAgB,OAClGynC,EAAa,IAAInC,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwnC,EAAUnrC,QAAQ4D,eAAe,OAEjGylC,EAA0B,IAAIpnC,EAC9BqnC,EAA0B,IAAIrnC,EAEpC6mC,EAAWS,cAAc6B,EAAY/B,GACrCN,EAAYQ,cAAc8B,EAAY/B,GAEtC,MAAMgC,EAAajC,EAAuB1jB,WAAW7jB,EAAOK,IACtDopC,EAAajC,EAAwB3jB,WAAW7jB,EAAOK,IAEzDknC,EAAuB1oC,SAAW,MAEpCtC,QAAQmrC,IAAI,8BAA+BrnC,GAEzCmnC,EAAwB3oC,SAAW,MAErCtC,QAAQmrC,IAAI,+BAAgCrnC,GAG1CmpC,EAAYJ,IAEdA,EAAiCI,EACjCN,EAAqBlpC,EAAOK,IAE1BopC,EAAaN,IAEfA,EAAkCM,EAClCR,EAAsBjpC,EAAOK,IAIjC,MAAM2oC,GAAcG,EAAkCC,GAAkC,EAKxF,OAFA7sC,QAAQmrC,IAAIuB,EAAqBC,GAE1BG,EAAUnrC,QAAQ4D,gBAAgBknC,GAG3C9C,oBAAoBJ,EAAmBjN,GAErC,MAAMoN,EAAkB,IAAI9lC,EAAQ,GAAI,EAAG,GAG3C,OAFA8lC,EAAgBxN,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,GAAI04B,IACxFoN,EAAgBxN,gBAAgBqN,GACzBG,EAGTG,sBAAsBN,EAAmBjN,GAEvC,MAAMsN,EAAoB,IAAIhmC,EAAQ,EAAG,EAAG,GAG5C,OAFAgmC,EAAkB1N,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,IAAK04B,IAC3FsN,EAAkB1N,gBAAgBqN,GAC3BK,EAGTG,sBAAsBR,EAAmBhN,GAEvC,MAAMuN,EAAoB,IAAIlmC,EAAQ,EAAG,EAAG,GAG5C,OAFAkmC,EAAkB5N,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,GAAI24B,IAC1FuN,EAAkB5N,gBAAgBqN,GAC3BO,EAGTG,uBAAuBV,EAAmBhN,GAExC,MAAMyN,EAAqB,IAAIpmC,GAAS,EAAG,EAAG,GAG9C,OAFAomC,EAAmB9N,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,IAAK24B,IAC5FyN,EAAmB9N,gBAAgBqN,GAC5BS,EAGTK,yBAAyBptB,EAAOc,EAAQyrB,EAAcvkB,GAEpD,MAAMqX,EAASkN,EAAe,EAAKpmC,KAAK4B,GAAK,IACvCu3B,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAASrX,GAAW,EAEpDyX,EAAQ3e,EAAS3a,KAAKq5B,IAAIH,GAC1BK,EAAQ1f,EAAQ7Z,KAAKq5B,IAAIF,GAC/B,OAAOn5B,KAAKL,IAAIK,KAAKsB,IAAIi4B,GAAQv5B,KAAKsB,IAAIg4B,KCzP/B,MAAM2Q,GAEnB3uC,uCAAuC4uC,GAErC,MAAMC,EAAUD,EAAgBzU,MAC1B2U,EAAYF,EAAgBrgC,aAAa,YAGzCwgC,EAAW,GAEjB,IAAK,IAAI3pC,EAAI,EAAGA,EAAIypC,EAAQpT,MAAOr2B,GAAK,EAGtC2pC,EAASzpC,KAAKwpC,EAAUE,KAAKH,EAAQxE,MAAMjlC,EAAI,KAC/C2pC,EAASzpC,KAAKwpC,EAAUG,KAAKJ,EAAQxE,MAAMjlC,EAAI,KAC/C2pC,EAASzpC,KAAKwpC,EAAUI,KAAKL,EAAQxE,MAAMjlC,EAAI,KAQ/C2pC,EAASzpC,KAAKwpC,EAAUE,KAAKH,EAAQxE,MAAMjlC,EAAI,KAC/C2pC,EAASzpC,KAAKwpC,EAAUG,KAAKJ,EAAQxE,MAAMjlC,EAAI,KAC/C2pC,EAASzpC,KAAKwpC,EAAUI,KAAKL,EAAQxE,MAAMjlC,EAAI,KAQ/C2pC,EAASzpC,KAAKwpC,EAAUE,KAAKH,EAAQxE,MAAMjlC,EAAI,KAC/C2pC,EAASzpC,KAAKwpC,EAAUG,KAAKJ,EAAQxE,MAAMjlC,EAAI,KAC/C2pC,EAASzpC,KAAKwpC,EAAUI,KAAKL,EAAQxE,MAAMjlC,EAAI,KAOjD,MAAM8d,EAAW,IAAIpB,EAIrB,OAFAoB,EAASnF,aAAa,WAAY,IAAI4d,EAAgB,IAAIhB,aAAaoU,GAAW,IAClFJ,GAAkBQ,0BAA0BjsB,GACrCA,EAGTljB,iCAAiCovC,GAE/B,MAAMC,EAAkB,GAClBP,EAAYM,EAA4B7gC,aAAa,YAE3D,IAAK,IAAInJ,EAAI,EAAGA,EAAI0pC,EAAUrT,MAAOr2B,GAAK,EAExCiqC,EAAgB/pC,KAAK,GACrB+pC,EAAgB/pC,KAAK,GACrB+pC,EAAgB/pC,KAAK,GAErB+pC,EAAgB/pC,KAAK,GACrB+pC,EAAgB/pC,KAAK,GACrB+pC,EAAgB/pC,KAAK,GAErB+pC,EAAgB/pC,KAAK,GACrB+pC,EAAgB/pC,KAAK,GACrB+pC,EAAgB/pC,KAAK,GAEvB8pC,EAA4BrxB,aAAa,cAAe,IAAI4d,EAAgB,IAAIhB,aAAa0U,GAAkB,KCrEpG,MAAMC,GAEnBvvC,eAGAC,sBAAsBkU,GAEpB,MAAMkJ,EAAS/D,SAASgE,cAAc,UACtCD,EAAOmB,MAAQrK,EAAMqK,MACrBnB,EAAOiC,OAASnL,EAAMmL,OAEtB,MAAMjY,EAAUgW,EAAOG,WAAW,MAGlC,OAFAnW,EAAQ8qB,UAAUhe,EAAO,EAAG,GAErB9M,EAAQmoC,aAAa,EAAG,EAAGr7B,EAAMqK,MAAOrK,EAAMmL,QAGvDrf,iBAAiBwvC,EAAWvpC,EAAGC,GAE7B,MAAM2e,EAAuC,GAA3B5e,EAAIupC,EAAUjxB,MAAQrY,GAClCpC,EAAO0rC,EAAU1rC,KACvB,OAAO,IAAImlB,EAAQnlB,EAAK+gB,EAAW,GAAI/gB,EAAK+gB,EAAW,GAAI/gB,EAAK+gB,EAAW,GAAI/gB,EAAK+gB,EAAW,KCgInG,IAAe4qB,GAAA,IAtJf,MAEE1vC,eAKA2vC,OAAOrrB,EAAiBsrB,GAEtB,MAAMC,EAAa,GAEnB,IAAIC,EAAW,SAEf,MAAMd,EAAW1qB,EAAgB9V,aAAa,YACxCuhC,EAAUzrB,EAAgB9V,aAAa,UACvCsgC,EAAWxqB,EAAgB8V,MAE3B4V,EAAQ,GAEd,IAAK,IAAI3qC,EAAI,EAAGA,EAAIypC,EAAQpT,MAAOr2B,GAAK,EACxC,CACE,MAAM4qC,EAAUnB,EAAQxE,MAAMjlC,EAAI,GAC5B6qC,EAAUpB,EAAQxE,MAAMjlC,EAAI,GAC5B8qC,EAAUrB,EAAQxE,MAAMjlC,EAAI,GAE5B+qC,EAAK,IAAIjrC,EACfirC,EAAGlqC,EAAI8oC,EAASC,KAAKgB,GACrBG,EAAGjqC,EAAI6oC,EAASE,KAAKe,GACrBG,EAAGzpC,EAAIqoC,EAASG,KAAKc,GAErB,MAAMI,EAAK,IAAIlrC,EACfkrC,EAAGnqC,EAAI8oC,EAASC,KAAKiB,GACrBG,EAAGlqC,EAAI6oC,EAASE,KAAKgB,GACrBG,EAAG1pC,EAAIqoC,EAASG,KAAKe,GAErB,MAAM5V,EAAK,IAAIn1B,EACfm1B,EAAGp0B,EAAI8oC,EAASC,KAAKkB,GACrB7V,EAAGn0B,EAAI6oC,EAASE,KAAKiB,GACrB7V,EAAG3zB,EAAIqoC,EAASG,KAAKgB,GAErB,MAAMG,EAAO,CACXhhC,EAAG8gC,EACHrrC,EAAGsrC,EACHE,EAAGjW,GAGL,GAAIyV,EACJ,CACE,MAAMhjC,EAAK,IAAI5H,EACf4H,EAAG7G,EAAI6pC,EAAQd,KAAKgB,GACpBljC,EAAG5G,EAAI4pC,EAAQb,KAAKe,GACpBljC,EAAGpG,EAAIopC,EAAQZ,KAAKc,GAEpB,MAAMO,EAAK,IAAIrrC,EACfqrC,EAAGtqC,EAAI6pC,EAAQd,KAAKiB,GACpBM,EAAGrqC,EAAI4pC,EAAQb,KAAKgB,GACpBM,EAAG7pC,EAAIopC,EAAQZ,KAAKe,GAEpB,MAAMO,EAAK,IAAItrC,EACfsrC,EAAGvqC,EAAI6pC,EAAQd,KAAKkB,GACpBM,EAAGtqC,EAAI4pC,EAAQb,KAAKiB,GACpBM,EAAG9pC,EAAIopC,EAAQZ,KAAKgB,GAEpB,MAAMO,EAAS3jC,EAAG7J,QAAQ2D,IAAI2pC,GAAI3pC,IAAI4pC,GAAIppB,YAC1CipB,EAAKI,OAASA,EAGhBV,EAAMzqC,KAAK+qC,GAEX,MAAMK,EAAO/xC,KAAKgyC,cAAcN,GAChCR,EAAWnrC,KAAKN,IAAIssC,EAAMb,GAC1BD,EAAWtqC,KAAKorC,GAGlB,MAAME,EAAyBjyC,KAAKkyC,8BAA8BjB,EAAYC,EAAUE,GAClFe,EAAiBnyC,KAAKoyC,oBAAoBH,EAAwBjB,GAExE,OADqBhxC,KAAKqyC,uBAAuBF,GAInDE,uBAAuBjB,GAErB,MAAMkB,EAAiB,GACjBC,EAAkB,GACxB,IAAK,IAAI9rC,EAAI,EAAGA,EAAI2qC,EAAMnsC,OAAQwB,IAClC,CACE,MAAMirC,EAAON,EAAM3qC,GAEb+rC,EAAKzsC,KAAKuC,SACVmqC,EAAK1sC,KAAKuC,SAEhBgqC,EAAe3rC,KAAK3G,KAAK0yC,qBAAqBF,EAAIC,EAAIf,EAAKhhC,EAAGghC,EAAKvrC,EAAGurC,EAAKC,GAAGrtC,SAC1EotC,EAAKI,QAEPS,EAAgB5rC,KAAK+qC,EAAKI,OAAOxtC,SAGrC,MAAO,CAAE8B,OAAQksC,EAAgBnB,QAASoB,GAG5CH,oBAAoBhB,EAAOuB,GAEzB,MAAMR,EAAiB,GACvB,IAAK,IAAI1rC,EAAI,EAAGA,EAAIksC,EAAQlsC,IAC5B,CACE,MACMmsC,EAAgBxB,EADPrrC,KAAKsC,MAAMtC,KAAKuC,SAAW8oC,EAAMnsC,SAGhDktC,EAAexrC,KAAKisC,GAGtB,OAAOT,EAGTD,8BAA8BjB,EAAY4B,EAAczB,GAEtD,MAAM0B,EAA4B,GAClC,IAAK,IAAIrsC,EAAI,EAAGA,EAAIwqC,EAAWhsC,OAAQwB,IACvC,CACEwqC,EAAWxqC,IAAMosC,EACjB,MAAME,EAAqBhtC,KAAKsC,MAAMtC,KAAKC,MAAMirC,EAAWxqC,KAC5D,IAAK,IAAIusC,EAAI,EAAGA,EAAID,EAAoBC,IAEtCF,EAA0BnsC,KAAKyqC,EAAM3qC,IAGzC,OAAOqsC,EAGTd,cAAcN,GAEZ,MAAMuB,EAAOvB,EAAKvrC,EAAE7B,QAAQ4lB,IAAIwnB,EAAKhhC,GAC/BwiC,EAAOxB,EAAKC,EAAErtC,QAAQ4lB,IAAIwnB,EAAKhhC,GACrC,OAAOuiC,EAAK1S,MAAM2S,GAAMjuC,SAAW,EAGrCytC,qBAAqBF,EAAIC,EAAIjB,EAAIC,EAAI/V,GAE/B8W,EAAKC,EAAK,IAEZD,EAAK,EAAMA,EACXC,EAAK,EAAMA,GAGb,MAAMU,EAAK,GAAOX,EAAKC,GAEvB,OAAOjB,EAAGltC,QAAQ4D,eAAesqC,GAAIvqC,IAAIwpC,EAAGntC,QAAQ4D,eAAeuqC,IAAKxqC,IAAIyzB,EAAGp3B,QAAQ4D,eAAeirC,MCa1G,IAAeC,GAAA,IA5Jf,MAEE3X,SAASrX,EAAOivB,GAEdjvB,EAAMC,UAAUC,IAEVA,aAAiBK,IAEfL,EAAMC,WAERD,EAAMC,UAAW,IAAIpB,GAAiBmwB,aAAahvB,EAAMC,WAE3D8uB,EAAgB/uB,OAKtBivB,eAAenvB,GAEb,MAAMovB,EAAa,GAMnB,OAJAxzC,KAAKy7B,SAASrX,GAAQE,IAEpBkvB,EAAW7sC,KAAK2d,EAAMC,aAEjBivB,EAGTC,gBAAgBrvB,EAAOI,EAAU9jB,GAE/B0jB,EAAMC,UAAUC,IAEVA,aAAiBK,SAGNvhB,IAAT1C,GAOE4jB,EAAM5jB,OAASA,KALnB4jB,EAAME,SAAWA,MAczBkvB,oBAAoBC,GAElB,MAAMrvC,EAAQ,CACZsvC,WAAYD,EAAKC,WACjBxvB,MAAOuvB,EAAKvvB,MAAM9f,OAAM,IAGpBuvC,EAAgB,GAEtBF,EAAKvvB,MAAMC,UAAS5U,IAEdA,EAAKqkC,gBAEPD,EAAcpkC,EAAK/O,MAAQ+O,MAI/B,MAAMskC,EAAa,GACbC,EAAqB,GAE3B1vC,EAAM8f,MAAMC,UAAS5U,IAEfA,EAAKwkC,SAEPF,EAAWtkC,EAAK/O,MAAQ+O,GAGtBA,EAAKqkC,gBAEPE,EAAmBvkC,EAAK/O,MAAQ+O,MAIpC,IAAK,MAAM/O,KAAQmzC,EACnB,CACE,MACMK,EADcL,EAAcnzC,GACLwzC,SACvBC,EAAmBH,EAAmBtzC,GAEtC0zC,EAAoB,GAE1B,IAAK,IAAI3tC,EAAI,EAAGA,EAAIytC,EAASG,MAAMpvC,SAAUwB,EAC7C,CACE,MAAM6tC,EAAYP,EAAWG,EAASG,MAAM5tC,GAAG/F,MAC/C0zC,EAAkBztC,KAAK2tC,GAGzBH,EAAiBpwC,KACf,IAAIwwC,EAASH,EAAmBF,EAASM,cACzCL,EAAiBM,aAGrB,OAAOnwC,EAGTowC,kBAAkBtwB,EAAOuwB,EAAMC,GAE7BxwB,EAAMC,UAAUC,IAEVA,aAAiBK,IAEnBL,EAAMuwB,WAAaF,EACnBrwB,EAAMwwB,cAAgBF,MAK5BG,cAAc3wB,EAAO4V,EAAaqZ,GAEhCjvB,EAAMC,UAAUynB,IAEVA,EAAIprC,OAASs5B,GAEfqZ,EAAgBvH,MAKtBkJ,WAAW5wB,EAAO4V,GAEhB,IAAImH,EAQJ,OAPA/c,EAAMC,UAAUynB,IAEVA,EAAIprC,OAASs5B,IAEfmH,EAAS2K,MAGN3K,EAGT8T,mBAAmB7wB,EAAO8wB,GAExB,IAAI/T,EAQJ,OAPA/c,EAAMC,UAAUynB,IAEVA,EAAI1qC,YAAYV,OAASw0C,IAE3B/T,EAAS2K,MAGN3K,IC5JI,MAAMgU,GAEnB9zC,iBAAiB+zC,GAEf,OAAQA,GAAwB,iBAATA,IAAsBC,MAAMC,QAAQF,GAG7D/zC,kBAAkByF,KAAWyuC,GAE3B,IAAKA,EAAQtwC,OAAQ,OAAO6B,EAC5B,MAAM0kC,EAAS+J,EAAQt+B,QAEvB,GAAIk+B,GAAgBK,UAAU1uC,IAAWquC,GAAgBK,UAAUhK,GAEjE,IAAK,MAAMtW,KAAOsW,EAEZ2J,GAAgBK,UAAUhK,EAAOtW,KAE9BpuB,EAAOouB,IAAM/rB,OAAOwP,OAAO7R,EAAQ,CAAEouB,CAACA,GAAM,KACjDigB,GAAgBM,WAAW3uC,EAAOouB,GAAMsW,EAAOtW,KAI/C/rB,OAAOwP,OAAO7R,EAAQ,CAAEouB,CAACA,GAAMsW,EAAOtW,KAK5C,OAAOigB,GAAgBM,WAAW3uC,KAAWyuC,GAG/Cl0C,mBAAmBqQ,GAGjB,IAAIo6B,EAAM,GAEV,GAAqB,IAAjBp6B,EAAIgkC,UAGN,GAAIhkC,EAAIikC,WAAW1wC,OAAS,EAC5B,CACE6mC,EAAI,eAAiB,GACrB,IAAK,IAAIkH,EAAI,EAAGA,EAAIthC,EAAIikC,WAAW1wC,OAAQ+tC,IAC3C,CACE,MAAM4C,EAAYlkC,EAAIikC,WAAWP,KAAKpC,GACtClH,EAAI,eAAe8J,EAAUC,UAAYD,EAAUE,iBAI/B,IAAjBpkC,EAAIgkC,WAEX5J,EAAMp6B,EAAIokC,WAIZ,GAAIpkC,EAAIqkC,gBAEN,IAAK,IAAItvC,EAAI,EAAGA,EAAIiL,EAAIskC,WAAW/wC,OAAQwB,IAC3C,CACE,MAAM2uC,EAAO1jC,EAAIskC,WAAWZ,KAAK3uC,GAC3BovC,EAAWT,EAAKS,SACtB,QAA+B,IAAnB/J,EAAI+J,GAEd/J,EAAI+J,GAAY71C,KAAKi2C,YAAYb,OAGnC,CACE,QAAoC,IAAxBtJ,EAAI+J,GAAc,KAC9B,CACE,MAAMK,EAAMpK,EAAI+J,GAChB/J,EAAI+J,GAAY,GAChB/J,EAAI+J,GAAUlvC,KAAKuvC,GAErBpK,EAAI+J,GAAUlvC,KAAK3G,KAAKi2C,YAAYb,KAI1C,OAAOtJ,GC7EI,MAAMqK,GAEnB/0C,eAGAC,kBAAkBuZ,GAEhB,MAAMw7B,EAAQx7B,EAAO3K,MAAM,KAE3B,IAAK,IAAIxJ,EAAI,EAAGA,EAAI2vC,EAAMnxC,OAAQwB,IAEhC2vC,EAAM3vC,GAAK2vC,EAAM3vC,GAAG,GAAGqU,cAAgBs7B,EAAM3vC,GAAG4vC,OAAO,GAGzD,OAAOD,EAAME,KAAK,KAGpBj1C,+BAA+BuZ,GAE7B,OAAOA,EAAO27B,OAAO,GAAGz7B,cAAgBF,EAAO47B,MAAM,GAGvDn1C,0BAA0BuZ,GAExB,OAAOA,EAAOG,QACZ,gBACCE,GAAUA,EAAMH,cACdC,QAAQ,IAAK,IACbA,QAAQ,IAAK,OC5BP,MAAM07B,GAEnBr1C,eAIAs1C,eAAeC,GAEbA,EAAWA,EAAS1mC,MAAM,KAE1B,IAAI2mC,EAAQr1C,OAAOo1C,EAAS,IAC5BC,EAAgB,GAARA,EAAa,GAAK,IAE1B,IAAIC,EAAUt1C,OAAOo1C,EAAS,IAC9BE,EAAoB,GAAVA,EAAe,IAEzB,IAAIC,EAAUv1C,OAAOo1C,EAAS,IAG9B,OAFAG,GAAoB,IAEbF,EAAQC,EAAUC,GClBd,MAAMC,GAEnB31C,cAEEpB,KAAKirB,OAAS,IAAIlG,EAGpBknB,WAAW7lC,EAAQ8lC,EAAmBC,EAAcvkB,GAElD5nB,KAAKirB,OAAO7H,cAAchd,GAE1B,MAAM64B,EAAQh4B,EAAMmlC,SAASD,EAAe,GACtCjN,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAASrX,GAAW,EAEpDykB,EAAkBrsC,KAAKssC,oBAAoBJ,EAAmBjN,GAC9DsN,EAAoBvsC,KAAKwsC,sBAAsBN,EAAmBjN,GAClEwN,EAAoBzsC,KAAK0sC,sBAAsBR,EAAmBhN,GAClEyN,EAAqB3sC,KAAK4sC,uBAAuBV,EAAmBhN,GAEpE2N,EAAqB,IAAItmC,EAAQ,EAAG,GAAI,GAAGs4B,gBAAgBqN,GAE3DY,EAAgB9sC,KAAKirB,OAAOjjB,OAAO1D,QAEnCyoC,EAAqB/sC,KAAKgtC,yBAA8C,EAArBhtC,KAAKirB,OAAOtK,OAAiC,EAArB3gB,KAAKirB,OAAOtK,OAAYwrB,EAAcvkB,GACjHqlB,EAAUH,EAAcxoC,QAAQ2D,IAAI4kC,EAAmBvoC,QAAQ4D,gBAAqC,EAAtB6kC,IAE9EG,GAAc,IAAI5O,GAAQoB,8BAA8B2M,EAAiBY,GACzEE,GAAc,IAAI7O,GAAQoB,8BAA8B6M,EAAmBU,GAE3EG,GAAe,IAAI9O,GAAQoB,8BAA8B+M,EAAmBQ,GAC5EI,GAAe,IAAI/O,GAAQoB,8BAA8BiN,EAAoBM,GAEnFjtC,KAAKstC,+BAA+BL,EAAS7mC,EAAQ8lC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAE1GH,EAASxN,8BAA8B2M,EAAiBY,GACxDE,EAAWzN,8BAA8B6M,EAAmBU,GAE5DG,EAAW1N,8BAA8B+M,EAAmBQ,GAC5DI,EAAY3N,8BAA8BiN,EAAoBM,GAE9D,IAAIpB,EAAmBjgC,EAAAA,EAEvB,MAAM2hC,EAAcV,EAAmBvoC,QAAQ4D,gBAAqC,EAAtB6kC,GAC9D,IAAK,IAAItmC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMijB,EAAO,IAAI8jB,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIslC,IAE1DE,EAAwB,IAAIlnC,EAC5BmnC,EAAyB,IAAInnC,EAE7BonC,EAA0B,IAAIpnC,EAC9BqnC,EAA0B,IAAIrnC,EAEpC2mC,EAASW,cAAcnkB,EAAO+jB,GAC9BN,EAAWU,cAAcnkB,EAAMgkB,GAE/BN,EAAWS,cAAcnkB,EAAOikB,GAChCN,EAAYQ,cAAcnkB,EAAMkkB,GAE5BH,EAAqBxoC,SAAW,MAElCtC,QAAQmrC,IAAI,4BAA6BrnC,GAEvCinC,EAAuBzoC,SAAW,MAEpCtC,QAAQmrC,IAAI,8BAA+BrnC,GAEzCknC,EAAuB1oC,SAAW,MAEpCtC,QAAQmrC,IAAI,8BAA+BrnC,GAEzCmnC,EAAwB3oC,SAAW,MAErCtC,QAAQmrC,IAAI,+BAAgCrnC,GAG9C,MAAMsnC,EAAoB3nC,EAAOK,GAAGnC,QAAQ4lB,IAAIujB,GAAsBxoC,SAChE+oC,EAAoB5nC,EAAOK,GAAGnC,QAAQ4lB,IAAIwjB,GAAwBzoC,SAElEgpC,EAAsB7nC,EAAOK,GAAGnC,QAAQ4lB,IAAIyjB,GAAwB1oC,SACpEipC,EAAsB9nC,EAAOK,GAAGnC,QAAQ4lB,IAAI0jB,GAAyB3oC,SAErEkpC,EAAkBpoC,KAAKN,IAAIsoC,EAAiBC,GAC5CI,EAAkBroC,KAAKN,IAAIwoC,EAAmBC,GAE9CzoC,EAAMM,KAAKN,IAAI0oC,EAAcC,GAE/B3oC,EAAMomC,IAERA,EAAmBpmC,GAIvB,MAAM4oC,EAAqBxB,EAAmBvoC,QAAQ4D,eAAe2jC,GAGrE,OAFyBoB,EAAQ3oC,QAAQ2D,IAAIomC,GAK/Cf,+BAA+BgB,EAAYloC,EAAQ8lC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBvuC,KAAKwuC,wBAAwBpoC,EAAQ+mC,EAAYD,EAAUhB,GAC7EuC,EAAoBzuC,KAAKg3C,0BAA0B5wC,EAAQgnC,EAAYC,EAAanB,GAE1FoC,EAAWrmC,IAAIsmC,GACfD,EAAWrmC,IAAIwmC,GAGjBD,wBAAwBpoC,EAAQ+mC,EAAYD,EAAUhB,GAEpD,IAAI2C,EAA+BjjC,EAAAA,EAC/BkjC,EAAkCljC,EAAAA,EAItC,MAAMmjC,EAAS,IAAIxoC,EAAQ,EAAG,EAAG,GAAGs4B,gBAAgBqN,GACpD,IAAK,IAAIzlC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMuoC,EAAc,IAAIxB,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAI8mC,EAAOzqC,QAAQ4D,gBAAgB,OAChG+mC,EAAc,IAAIzB,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAI8mC,EAAOzqC,QAAQ4D,eAAe,OAE/FwlC,EAA0B,IAAInnC,EAC9BknC,EAAuB,IAAIlnC,EAEjC4mC,EAAWU,cAAcmB,EAAYtB,GACrCR,EAASW,cAAcoB,EAASxB,GAEhC,MAAMyB,EAAcxB,EAAuBzjB,WAAW7jB,EAAOK,IACvD0oC,EAAc1B,EAAqBxjB,WAAW7jB,EAAOK,IAEvDgnC,EAAqBxoC,SAAW,MAElCtC,QAAQmrC,IAAI,qCAAsCrnC,GAEhDinC,EAAuBzoC,SAAW,MAEpCtC,QAAQmrC,IAAI,uCAAwCrnC,GAGlDyoC,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAUN,IAEZA,EAA+BM,GAKnC,MAAMC,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAOzqC,QAAQ4D,gBAAgBknC,GAGxC4H,0BAA0B5wC,EAAQgnC,EAAYC,EAAanB,GAEzD,IAAIqD,EAAkC3jC,EAAAA,EAClC4jC,EAAkC5jC,EAAAA,EAItC,MAAM6jC,EAAY,IAAIlpC,EAAQ,EAAG,EAAG,GAAGs4B,gBAAgBqN,GAEvD,IAAK,IAAIzlC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMipC,EAAa,IAAIlC,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwnC,EAAUnrC,QAAQ4D,gBAAgB,OAClGynC,EAAa,IAAInC,EAAMpnC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwnC,EAAUnrC,QAAQ4D,eAAe,OAEjGylC,EAA0B,IAAIpnC,EAC9BqnC,EAA0B,IAAIrnC,EAEpC6mC,EAAWS,cAAc6B,EAAY/B,GACrCN,EAAYQ,cAAc8B,EAAY/B,GAEtC,MAAMgC,EAAajC,EAAuB1jB,WAAW7jB,EAAOK,IACtDopC,EAAajC,EAAwB3jB,WAAW7jB,EAAOK,IAEzDknC,EAAuB1oC,SAAW,MAEpCtC,QAAQmrC,IAAI,8BAA+BrnC,GAEzCmnC,EAAwB3oC,SAAW,MAErCtC,QAAQmrC,IAAI,+BAAgCrnC,GAG1CmpC,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAaN,IAEfA,EAAkCM,GAKtC,MAAMT,GAAcG,EAAkCC,GAAkC,EAGxF,OAAOC,EAAUnrC,QAAQ4D,gBAAgBknC,GAG3C9C,oBAAoBJ,EAAmBjN,GAErC,MAAMoN,EAAkB,IAAI9lC,EAAQ,GAAI,EAAG,GAG3C,OAFA8lC,EAAgBxN,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,GAAI04B,IACxFoN,EAAgBxN,gBAAgBqN,GACzBG,EAGTG,sBAAsBN,EAAmBjN,GAEvC,MAAMsN,EAAoB,IAAIhmC,EAAQ,EAAG,EAAG,GAG5C,OAFAgmC,EAAkB1N,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,IAAK04B,IAC3FsN,EAAkB1N,gBAAgBqN,GAC3BK,EAGTG,sBAAsBR,EAAmBhN,GAEvC,MAAMuN,EAAoB,IAAIlmC,EAAQ,EAAG,EAAG,GAG5C,OAFAkmC,EAAkB5N,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,GAAI24B,IAC1FuN,EAAkB5N,gBAAgBqN,GAC3BO,EAGTG,uBAAuBV,EAAmBhN,GAExC,MAAMyN,EAAqB,IAAIpmC,GAAS,EAAG,EAAG,GAG9C,OAFAomC,EAAmB9N,iBAAgB,IAAIiR,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,IAAK24B,IAC5FyN,EAAmB9N,gBAAgBqN,GAC5BS,EAGTK,yBAAyBptB,EAAOc,EAAQyrB,EAAcvkB,GAEpD,MAAMqX,EAASkN,EAAe,EAAKpmC,KAAK4B,GAAK,IACvCu3B,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAASrX,GAAW,EAEpDyX,EAAQ3e,EAAS3a,KAAKq5B,IAAIH,GAC1BK,EAAQ1f,EAAQ7Z,KAAKq5B,IAAIF,GAC/B,OAAOn5B,KAAKL,IAAIK,KAAKsB,IAAIi4B,GAAQv5B,KAAKsB,IAAIg4B,KCrP/B,MAAM4X,GAEnB71C,eAKA6qC,WAAW7lC,EAAQ8lC,EAAmBC,EAAcvkB,GAElD,MAAMsvB,EAAsBhL,EAAkB5nC,QAAQ6yC,UAEhDC,EAAkB,GAExB,IAAK,IAAI3wC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjC2wC,EAAgBzwC,KAAKP,EAAOK,GAAGnC,QAAQu6B,gBAAgBqY,IAGzD,MAAMvsB,GAAM,IAAIC,GAAOxH,cAAcg0B,GAC/Bn1C,EAAO,IAAIsE,EACjBokB,EAAI0D,QAAQpsB,GAEZ,MAAM4J,EAAW7L,KAAKgtC,yBAAyB/qC,EAAKqF,EAAI,EAAGrF,EAAKsF,EAAI,EAAG4kC,EAAcvkB,GAE/E5f,EAAS,IAAIzB,EAKnB,OAJAokB,EAAIyV,UAAUp4B,GAEdA,EAAO62B,gBAAgBqN,GAEhB,CACLlkC,OAAQA,EACRqvC,mBAAoBxrC,GAIxBmhC,yBAAyBptB,EAAOc,EAAQyrB,EAAcvkB,GAEpD,MAAMqX,EAASkN,EAAe,EAAKpmC,KAAK4B,GAAK,IACvCu3B,EAAS,EAAIn5B,KAAKo5B,KAAKp5B,KAAKq5B,IAAIH,GAASrX,GAAW,EAEpDyX,EAAQ3e,EAAS3a,KAAKq5B,IAAIH,GAC1BK,EAAQ1f,EAAQ7Z,KAAKq5B,IAAIF,GAC/B,OAAOn5B,KAAKL,IAAIK,KAAKsB,IAAIi4B,GAAQv5B,KAAKsB,IAAIg4B,KCnC/B,MAAMiY,WAAa3yB,EAEhCvjB,cAEE,MAAMojB,EAAW,IAAIhI,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAEjY,MAAO,IAAIkY,EAAM,aAE7BL,6OACAE,0WACA0T,WAAY,CAAE+mB,aAAa,GAC3B9sB,aAAa,EACbhN,YAAY,IAGR+5B,EAAiB,IAAIntB,EAAoB,IAAK,IAAK,IAAK,KAI9D1b,MAF6BqhC,GAAkByH,gCAAgCD,GAEnDhzB,GAE5BxkB,KAAK03C,SAASpwC,GAAI,MCrBP,MAAMgc,WAAaqB,EAEhCvjB,YAAYgF,GAEV,MAAMme,EAAW,IAAIpB,EACrBoB,EAASnF,aAAa,WAAsB,IAAI4d,EAAgB,IAAIhB,aAAa,IAAK,IACtFzX,EAASnF,aAAa,gBAAsB,IAAI4d,EAAgB,IAAIhB,aAAa,IAAK,IACtFzX,EAASnF,aAAa,oBAAsB,IAAI4d,EAAgB,IAAIhB,aAAa,IAAK,IACtFzX,EAASnF,aAAa,cAAsB,IAAI4d,EAAgB,IAAIhB,aAAa,IAAK,IACtFzX,EAASnF,aAAa,WAAsB,IAAI4d,EAAgB,IAAIhB,aAAa,IAAK,IAiBtFrtB,MAAM4V,EAfW,IAAI/H,EAAe,CAClCG,SAAU,CACRg7B,WAAY,CAAE5yC,MAAO,IACrB6yC,QAAS,CAAE7yC,MAAO,GAClB8yC,aAAc,CAAE9yC,MAAO,GACvBiY,OAAQ,CAAEjY,MAAO,IAAIkY,EAAM,aAE7BL,+sBACAE,8jBACA2N,aAAa,EACbhN,YAAY,EACZ+S,WAAY,CAAE+mB,aAAa,MAMzBnxC,GAEFpG,KAAK83C,MAAM1xC,GAIf0xC,MAAM1xC,GAEJ,MAAMgqC,EAAW,GACX2H,EAAgB,GAChBC,EAAoB,GACpBC,EAAc,GACdC,EAAW,GACjB,IAAIC,EAAqB,EAEzB,IAAK,IAAI1xC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE2pC,EAASzpC,KAAKP,EAAOK,GAAGa,GACxB8oC,EAASzpC,KAAKP,EAAOK,GAAGc,GACxB6oC,EAASzpC,KAAKP,EAAOK,GAAGsB,GACxBkwC,EAAYtxC,KAAK,GAEjBypC,EAASzpC,KAAKP,EAAOK,GAAGa,GACxB8oC,EAASzpC,KAAKP,EAAOK,GAAGc,GACxB6oC,EAASzpC,KAAKP,EAAOK,GAAGsB,GACxBkwC,EAAYtxC,MAAM,GAElB,MAAMyxC,EAAap4C,KAAKq4C,oBAAoBjyC,EAAQK,GACpDsxC,EAAcpxC,KAAKyxC,EAAW9wC,GAC9BywC,EAAcpxC,KAAKyxC,EAAW7wC,GAC9BwwC,EAAcpxC,KAAKyxC,EAAWrwC,GAE9BgwC,EAAcpxC,KAAKyxC,EAAW9wC,GAC9BywC,EAAcpxC,KAAKyxC,EAAW7wC,GAC9BwwC,EAAcpxC,KAAKyxC,EAAWrwC,GAE9B,MAAMuwC,EAAiBt4C,KAAKu4C,wBAAwBnyC,EAAQK,GAC5DuxC,EAAkBrxC,KAAK2xC,EAAehxC,GACtC0wC,EAAkBrxC,KAAK2xC,EAAe/wC,GACtCywC,EAAkBrxC,KAAK2xC,EAAevwC,GAEtCiwC,EAAkBrxC,KAAK2xC,EAAehxC,GACtC0wC,EAAkBrxC,KAAK2xC,EAAe/wC,GACtCywC,EAAkBrxC,KAAK2xC,EAAevwC,GAEtCmwC,EAASvxC,KAAKwxC,GACdD,EAASvxC,KAAKwxC,GAEV1xC,EAAIL,EAAOnB,OAAS,IAEtBkzC,GAAsB/xC,EAAOK,GAAGwjB,WAAWmuB,IAG/C,MAAMI,EAAwB,IAAIxc,aAAaoU,GACzCqI,EAAwB,IAAIzc,aAAa+b,GACzCW,EAAwB,IAAI1c,aAAagc,GACzCW,EAAwB,IAAI3c,aAAaic,GACzCW,EAAwB,IAAI5c,aAAakc,GAEzChI,EAAU,GAChB,IAAK,IAAIzpC,EAAI,EAAGA,GAAM+xC,EAAWvzC,OAAS,EAAK,GAAK,EAAGwB,IACvD,CACE,MAAM+0B,EAAa,EAAJ/0B,EAAS,EACxBypC,EAAQvpC,KAAK60B,GACb0U,EAAQvpC,KAAK60B,EAAQ,GACrB0U,EAAQvpC,KAAK60B,EAAQ,GAErB0U,EAAQvpC,KAAK60B,GACb0U,EAAQvpC,KAAK60B,EAAQ,GACrB0U,EAAQvpC,KAAK60B,EAAQ,GAGvBx7B,KAAKukB,SAASs0B,SAAS3I,GACvBlwC,KAAKukB,SAAS3U,aAAa,YAAY8Y,KAAK,IAAIsU,EAAgBwb,EAAY,IAC5Ex4C,KAAKukB,SAAS3U,aAAa,iBAAiB8Y,KAAK,IAAIsU,EAAgByb,EAAkB,IACvFz4C,KAAKukB,SAAS3U,aAAa,qBAAqB8Y,KAAK,IAAIsU,EAAgB0b,EAAsB,IAC/F14C,KAAKukB,SAAS3U,aAAa,eAAe8Y,KAAK,IAAIsU,EAAgB2b,EAAiB,IACpF34C,KAAKukB,SAAS3U,aAAa,YAAY8Y,KAAK,IAAIsU,EAAgB4b,EAAc,IAE9E54C,KAAKukB,SAAS3U,aAAa,YAAY4Q,aAAc,EACrDxgB,KAAKukB,SAAS3U,aAAa,iBAAiB4Q,aAAc,EAC1DxgB,KAAKukB,SAAS3U,aAAa,qBAAqB4Q,aAAc,EAC9DxgB,KAAKukB,SAAS3U,aAAa,eAAe4Q,aAAc,EACxDxgB,KAAKukB,SAAS3U,aAAa,YAAY4Q,aAAc,EAErDxgB,KAAKwkB,SAAS7H,SAASi7B,QAAQ7yC,MAAQozC,EACvCn4C,KAAK84C,QAAUX,EAGbY,cAAUh0C,GAEZ/E,KAAKwkB,SAAS7H,SAASg7B,WAAW5yC,MAAQA,EAGxCg0C,gBAEF,OAAO/4C,KAAKwkB,SAAS7H,SAASg7B,WAAW5yC,MAG3CwzC,wBAAwBnyC,EAAQK,GAE9B,OAAU,IAANA,EAEKL,EAAO,GAAG9B,QAAQ4lB,IAAI9jB,EAAO,IAAI8B,gBAAgB,GAAGD,IAAI7B,EAAO,IAI/DA,EAAOK,EAAI,GAItB4xC,oBAAoBjyC,EAAQK,GAE1B,OAAIA,IAAML,EAAOnB,OAAS,EAEjBmB,EAAOA,EAAOnB,OAAS,GAAGX,QAAQ4lB,IAAI9jB,EAAOA,EAAOnB,OAAS,IAAIiD,gBAAgB,GAAGD,IAAI7B,EAAOA,EAAOnB,OAAS,IAI/GmB,EAAOK,EAAI,GAItBmD,UAIAiC,WAEE,OAAO7L,KAAKm4C,mBAGda,eAEE,OAAOh5C,KAAKm4C,mBAGd77B,UAEEtc,KAAKukB,SAASjI,UACdtc,KAAKwkB,SAASlI,UACVtc,KAAKi5C,QAEPj5C,KAAKi5C,OAAO39B,OAAOtb,MAInBijB,UAAM7a,GAERpI,KAAKwkB,SAAS7H,SAASK,OAAOjY,MAAMif,IAAI5b,GAGtC6a,YAEF,OAAOjjB,KAAKwkB,SAAS7H,SAASK,OAAOjY,MAGvCm0C,WAAW9wC,GAETpI,KAAKwkB,SAAS7H,SAASK,OAAOjY,MAAM2jB,KAAKtgB,IC1L9B,MAAM+wC,WAAmBx0B,EAEtCvjB,YAAY8sB,EAASkrB,GAEnBA,EAAQA,GAAS,IAAIxiC,EAAQ,EAAG,GAChC,MAAM4N,EAAW,IAAIhI,EAAe,CAClCG,SAAU,CACRW,SAAU,CAAEvY,MAAOmpB,GACnBmrB,eAAgB,CAAEt0C,MAAO,GACzBu0C,OAAQ,CAAEv0C,MAAO,GACjBw0C,SAAU,CAAEx0C,MAAO,IAErB6X,igBACAE,mLACA2N,aAAa,EACbhN,YAAY,EACZ0D,KAAMq4B,IAEFj1B,EAAW,IAAIk1B,EAAc,EAAG,EAAG,GACzCl1B,EAASe,WAAW8zB,EAAM9xC,EAAI,GAAI8xC,EAAM7xC,EAAI,EAAG,GAC/C,MAAMmyC,EAAgBxrB,EAAQ3Y,MAAMqK,MAAQsO,EAAQ3Y,MAAMmL,OAC1D6D,EAAS1B,MAAM62B,EAAe,EAAG,GACjC/qC,MAAM4V,EAAUC,GAChBxkB,KAAK05C,cAAgBA,EACrB15C,KAAKukB,SAASo1B,qBAEd35C,KAAK45C,YAAc,IAAIrzC,EACvBvG,KAAKukB,SAASs1B,YAAYxrB,QAAQruB,KAAK45C,aAGzCE,iBAEE95C,KAAKwkB,SAAS7H,SAASW,SAASvY,MAAMyb,aAAc,EACpD,MAAMu5B,EAAM/5C,KAAKwkB,SAAS7H,SAASW,SAASvY,MAAMwQ,MAElDvV,KAAKukB,SAAS1B,MAAM,EAAI7iB,KAAK05C,cAAe,EAAG,GAC/C15C,KAAK05C,cAAgBK,EAAIn6B,MAAQm6B,EAAIr5B,OACrC1gB,KAAKukB,SAAS1B,MAAM7iB,KAAK05C,cAAe,EAAG,GAC3C15C,KAAKukB,SAASo1B,qBACd35C,KAAKukB,SAASs1B,YAAYxrB,QAAQruB,KAAK45C,aAGrC33C,WAEF,OAAOjC,KAAK45C,YAAYt1C,QAAQ4D,eAAelI,KAAK6iB,MAAMvb,GAGxDrF,SAAK8C,GAEP/E,KAAK6iB,MAAMmB,IAAIjf,EAAOA,EAAOA,GAC7B/E,KAAKwkB,SAAS7H,SAAS28B,OAAOv0C,MAAQA,EAGpCi1C,mBAAeC,GAEjBj6C,KAAKwkB,SAAS7H,SAAS08B,eAAet0C,OAAoB,IAAZk1C,EAAmB,EAAI,EAGnED,qBAEF,OAAuD,IAAhDh6C,KAAKwkB,SAAS7H,SAAS08B,eAAet0C,MAG3C6W,YAAQA,GAEV5b,KAAKwkB,SAAS7H,SAAS48B,SAASx0C,MAAQ6W,EAGtCA,cAEF,OAAO5b,KAAKwkB,SAAS7H,SAAS48B,SAASx0C,MAGzCuX,UAEEtc,KAAKukB,SAASjI,UACdtc,KAAKi5C,OAAO39B,OAAOtb,MACnBA,KAAKwkB,SAAS7H,SAASW,SAASvY,MAAMuX,UACtCtc,KAAKwkB,SAASlI,WClFH,MAAM49B,WAAef,GAElC/3C,YAAYoe,EAAMC,EAAMwD,EAAOm2B,EAAOe,GAEpC,MAAMC,EAAqB,IAAIzP,GAAiBwP,GAE1CE,EAAgB,CACpB56B,KAAMA,EACNM,WAAYkD,GAAS,WAEjB/C,EAAiBk6B,EAAmBn6B,gBAAgBT,EAAM66B,GAEhEn6B,EAAe6nB,UAAYuS,EAC3Bp6B,EAAe6nB,UAAYC,EAC3B9nB,EAAeM,aAAc,EAC7B7R,MAAMuR,EAAgBk5B,GAEtBp5C,KAAKo6C,mBAAqBA,EAC1Bp6C,KAAKkgB,eAAiBA,EACtBlgB,KAAKq6C,cAAgBA,EAGnB76B,SAAKza,GAEP/E,KAAKo6C,mBAAmBv6B,YAAY9a,EAAO/E,KAAKq6C,eAChDr6C,KAAK85C,iBAGHt6B,WAEF,MAAO,mBC3BI,MAAM+6B,WAA0Bh+B,GAE7Cnb,YAAYo5C,EAAY,GAEtB7rC,w1BAAkB,CAChB2O,SAAU,CAAEvY,WAAO3B,GACnB+jB,YAAa,CAAEpiB,MAAO,IAAI6R,EAAQ2V,GAAQ3M,MAAO2M,GAAQ7L,SACzD0G,aAAc,CAAEriB,MAAO,IAAI6R,GAC3B6jC,aAAc,CAAE11C,MAAO,IAAI6R,EAAQ,EAAG,IACtC8jC,KAAM,CAAE31C,MAAO,IAAIwB,GACnBo0C,YAAa,CAAE51C,MAAO,IAAI6R,GAC1BgkC,aAAc,CAAE71C,MAAO,KAEzB/E,KAAKyqB,aAAc,EACnBzqB,KAAKyd,YAAa,EAClBzd,KAAK4d,WAAY,GCtBN,MAAMi9B,GAEnBz5C,cAEEpB,KAAK4+B,QAAU,IAAIhoB,EAGrBkkC,YAAY50B,GAEV,OAAOlmB,KAAK4+B,QAAQ5a,IAAIkC,EAAS5e,EAAG4e,EAAS3e,ICNlC,MAAMwzC,GAEnB35C,cAEEpB,KAAKg7C,SAAW,IAAIz0C,EACpBvG,KAAKi7C,SAAW,IAAIrkC,EAGtBkkC,YAAY50B,GAKV,OAHAlmB,KAAKg7C,SAAStyB,KAAKxC,GACnBlmB,KAAKg7C,SAAS3Z,QAAQhU,GAAc1hB,SAE7B3L,KAAKi7C,SAASj3B,IAAIhkB,KAAKg7C,SAAS1zC,EAAGtH,KAAKg7C,SAASzzC,IClB7C,MAAM2zC,GAEnB95C,eAKAwI,OAAOuxC,EAAYC,IAKnB5jC,SAAS2jC,IAGTnjC,QAAQmjC,KCbK,MAAME,WAAeH,GAElC95C,cAEEuN,QAGF/E,OAAOuxC,EAAYC,GAEbD,EAAWG,cAAcF,IAE3BD,EAAWziC,UAAUyiC,EAAWI,kBCXvB,MAAMC,WAAqBN,GAExC95C,cAEEuN,QAGF6I,SAAS2jC,GAEPA,EAAWM,iBAGb7xC,OAAOuxC,EAAYC,GAEbD,EAAWG,cAAcF,GAE3BD,EAAWziC,UAAUyiC,EAAWO,iBAIhCP,EAAWziC,UAAUyiC,EAAWQ,iBCpBvB,MAAMC,WAAoBV,GAEvC95C,cAEEuN,QAGF6I,SAAS2jC,GAEPA,EAAWU,gBACXV,EAAWziC,UAAUyiC,EAAWW,iBCVrB,MAAMC,WAAqBb,GAExC95C,cAEEuN,QAGF6I,SAAS2jC,GAEPn7C,KAAKg8C,mBAAmBb,GAG1BvxC,OAAOuxC,EAAYC,GAEbD,EAAWG,cAAcF,GAE3Bp7C,KAAKg8C,mBAAmBb,GAIxBA,EAAWziC,UAAUyiC,EAAWQ,gBAIpCK,mBAAmBb,GAEjBA,EAAWc,kBCRA,MAAMC,WAAkBv3B,EAErCvjB,YAAYqb,EAAMC,GAEhB/N,MAAM,IAAI8qC,EAAc,EAAG,GAAI,IAAIc,IAEnCv6C,KAAKm8C,cAAe,EAEpBn8C,KAAKo8C,kBAAoB,IAAIrB,GAC7B/6C,KAAKoY,cAAgB,IAAIijC,GAEzBr7C,KAAKq8C,UAAY,IAAI91C,EAErBvG,KAAK87C,eAAiB,IAAIT,GAC1Br7C,KAAKu7C,gBAAkB,IAAIC,GAC3Bx7C,KAAK27C,eAAiB,IAAIC,GAC1B57C,KAAK07C,gBAAkB,IAAIK,GAE3B/7C,KAAKwX,cAAWpU,EAChBpD,KAAKgY,aAAU5U,EACfpD,KAAKs8C,cAAWl5C,EAEhBpD,KAAKu8C,cAAgB,IAAI3lC,EACzB5W,KAAKw8C,oBAAsB,IAAI5lC,EAC/B5W,KAAKy8C,eAAiB,IAAI7lC,EAE1B5W,KAAK08C,aAAe,IAAI9lC,EAAQ,EAAG,GAEnC5W,KAAK2pB,eAAgB,EACrB3pB,KAAK28C,kBAAmB,EACxB38C,KAAKujB,YAAc,EAEnBvjB,KAAKiC,KAAO,EACZjC,KAAK48C,aAAe,IAAIhmC,EAG1BimC,iBAAiB93C,GAEf/E,KAAKujB,YAAcxe,EAGjB+3C,kBAEF,OAAO98C,KAAKwkB,SAAS7H,SAASg+B,YAAY51C,MAG5Cg4C,iBAAiB5wB,GAEfnsB,KAAK48C,aAAal0B,KAAKyD,GACvBnsB,KAAKwkB,SAAS7H,SAAS89B,aAAa11C,MAAM2jB,KAAKyD,GAGjDzT,UAAU2Y,GAERrxB,KAAKoY,cAAcJ,QAAQhY,MAC3BA,KAAKoY,cAAgBiZ,EACrBrxB,KAAKoY,cAAcZ,SAASxX,MAG1BkmB,eAEF,OAAOlmB,KAAKq8C,UAGVW,cAAU/C,GAEZj6C,KAAKwkB,SAAS5G,UAAYq8B,EAGxB+C,gBAEF,OAAOh9C,KAAKwkB,SAAS5G,UAGnBq/B,iBAAal4C,GAEf/E,KAAKwkB,SAAS7H,SAASi+B,aAAa71C,MAAQA,EAG1Ck4C,mBAEF,OAAOj9C,KAAKwkB,SAAS7H,SAASi+B,aAAa71C,MAG7Cm4C,cAEEl9C,KAAKm9C,SAAU,EAGjBpf,oCAEE/9B,KAAKo8C,kBAAoB,IAAIrB,GAG/Bld,qCAEE79B,KAAKo8C,kBAAoB,IAAIvB,GAG/BvzB,YAAY4G,GAEVA,EAAQ6Z,UAAYznB,EACpB4N,EAAQ+Z,UAAY3nB,EACpB4N,EAAQ1N,aAAc,EAEtBxgB,KAAK08C,aAAa14B,IAAIkK,EAAQ3Y,MAAMqK,MAAOsO,EAAQ3Y,MAAMmL,QAEzD1gB,KAAKwkB,SAAS7H,SAASW,SAASvY,MAAQmpB,EACxCluB,KAAKo9C,SAASp9C,KAAKwkB,SAAS7H,SAASyK,aAAariB,OAClD/E,KAAKm9C,SAAU,EAGjBlf,aAAaof,GAEXr9C,KAAKwkB,SAAS7H,SAASwK,YAAYpiB,MAAMif,IAAIuI,GAAQ3M,MAAO2M,GAAQ7L,QACpE1gB,KAAKo9C,SAASp9C,KAAKwkB,SAAS7H,SAASyK,aAAariB,OAElD/E,KAAKw8C,oBAAoB9zB,KAAK1oB,KAAKo8C,kBAAkBtB,YAAY96C,KAAKkmB,WACtElmB,KAAKwkB,SAAS7H,SAAS+9B,KAAK31C,MAAM2jB,KAAK1oB,KAAKkmB,UAC5ClmB,KAAKoY,cAAcxO,OAAO5J,KAAMq9C,GAGlC/B,cAAc+B,GAEZr9C,KAAKy8C,eAAe/zB,KAAK1oB,KAAKw8C,qBAC9Bx8C,KAAKs9C,mBAAmBt9C,KAAKy8C,gBAC7Bz8C,KAAKy8C,eAAen1C,GAAKtH,KAAK48C,aAAat1C,EAC3CtH,KAAKy8C,eAAel1C,GAAKvH,KAAK48C,aAAar1C,EAE3C,MAAMg2C,GAAO,IAAIC,GAAO3yB,qBAAqB7qB,KAAKy8C,eAAgBz8C,KAAKo9C,YAKvE,OAHAp9C,KAAKu8C,cAAc7zB,KAAK20B,GACxBr9C,KAAKs9C,mBAAmBt9C,KAAKu8C,eAEtBgB,EAAKE,cAAcz9C,KAAKu8C,eAGjCe,mBAAmBI,GAEjBA,EAAcp2C,GAAuB,GAAlBo2C,EAAcp2C,EAAU,IAAOilB,GAAQ3M,MAAS5f,KAAK48C,aAAat1C,EACrFo2C,EAAcn2C,GAAuB,GAAlBm2C,EAAcn2C,EAAU,IAAOglB,GAAQ7L,OAAS1gB,KAAK48C,aAAar1C,EAGvFo2C,4BAEE,MAAM9zB,EAAM7pB,KAAKw8C,oBAAoBl4C,QAErC,OADAtE,KAAKs9C,mBAAmBzzB,GACjBA,EAGT+zB,0BAA0BC,GAExB79C,KAAKkmB,SAAS5e,EAAKu2C,EAAWv2C,EAAIilB,GAAQ3M,MAAS,EAAI,EACvD5f,KAAKkmB,SAAS3e,EAAKs2C,EAAWt2C,EAAIglB,GAAQ7L,OAAU,EAAI,EAG1DpE,UAEMtc,KAAKwkB,SAAS7H,SAASW,SAASvY,OAElC/E,KAAKwkB,SAAS7H,SAASW,SAASvY,MAAMuX,UAGxCtc,KAAKukB,SAASjI,UACdtc,KAAKwkB,SAASlI,UAGhB8gC,SAASz2B,GAEP,OAAIA,EAEKA,EAAQ+B,KAAK1oB,KAAK08C,cAAcx0C,eAAelI,KAAKiC,KAAOsqB,GAAQ5K,MAInE,IAAI/K,GAAU8R,KAAK1oB,KAAK08C,cAAcx0C,eAAelI,KAAKiC,KAAOsqB,GAAQ5K,KAIpF85B,kBAGAI,iBAGAI,mBC3Ma,MAAM6B,WAA8Bn5B,EAEjDvjB,YAAYmjB,EAAUC,GAEpB7V,MAAM4V,EAAUC,GAEhB,MAAMu5B,EAAO/9C,KAEbA,KAAKg+C,eAAiB,KAEpBD,EAAKv5B,SAAS5a,WCVL,MAAMq0C,GAEnB78C,YAAY+qB,EAAQ+xB,EAAcC,GAEhC,MAAMv+B,EAAUs+B,EAAa5d,MAAQ4d,EAAa1c,KAC5C9gB,EAAUw9B,EAAazc,IAAQyc,EAAaxc,OAElD1hC,KAAK6iB,MAAW,IAAIjM,EAAQgJ,EAAOc,GACnC1gB,KAAKkmB,SAAW,IAAItP,EAAQuV,EAAS+xB,EAAa1c,KAAM0c,EAAaxc,QAErE1hC,KAAKm+C,aAAe,IAAI7zB,EAAQ6zB,EAAa3c,KAAM2c,EAAa7d,MAAO6d,EAAa1c,IAAK0c,EAAazc,SCT3F,MAAM0c,GAEnBh9C,YAAYi9C,EAAc7+B,EAAO,IAE/Bxf,KAAKq+C,aAAeA,EAEpBr+C,KAAKs+C,OAAS,GAEdt+C,KAAKu+C,gBAAkB,EACvBv+C,KAAKw+C,iBAAkB,EACvBx+C,KAAKy+C,gBAAkB,EAEvBz+C,KAAKkmB,SAAW,IAAI3f,EACpBvG,KAAK8lB,WAAa,IAAIgqB,EACtB9vC,KAAK6iB,MAAQ,IAAItc,EAAQ,EAAG,EAAG,GAC/BvG,KAAK0+C,OAAS,IAAIrgB,EAElBr+B,KAAKijB,MAAQ,IAAIhG,EAAM,WAEvBjd,KAAK88C,YAAc,IAAIlmC,EACvB5W,KAAK2+C,UAAY,EAEjB3+C,KAAK4+C,OAAWp/B,EAEhBxf,KAAK6+C,kBAAkBr/B,GAGrBA,SAAKza,GAEP/E,KAAK4+C,OAAS75C,EACd/E,KAAK6+C,kBAAkB95C,GACvB/E,KAAKw+C,iBAAkB,EAGrBh/B,WAEF,OAAOxf,KAAK4+C,OAGdE,gBAEE9+C,KAAK0+C,OAAOK,QAAQ/+C,KAAKkmB,SAAUlmB,KAAK8lB,WAAY9lB,KAAK6iB,OACzD7iB,KAAKw+C,iBAAkB,EACvBx+C,KAAKu+C,gBAAiB,EAGxBS,oBAEEh/C,KAAKu+C,gBAAiB,EAGxBU,oBAEEj/C,KAAKy+C,gBAAiB,EAGxBS,aAAajH,EAAc,EAAGkH,EAAO,GAEnC,MAAMC,GAAkB,IAAItP,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,GAAK0xC,EAAc,IAAOlyC,KAAK4B,GAAK,GAC1G03C,GAAW,IAAIvP,GAAaC,iBAAiB,IAAIxpC,EAAQ,EAAG,EAAG,IAAM44C,EAAO,IAAOp5C,KAAK4B,GAAK,GAEnG3H,KAAK8lB,WAAW4C,KAAK02B,EAAgBE,SAASD,IAC9Cr/C,KAAKw+C,iBAAkB,EAGzBn3B,aAAawC,GAEX7pB,KAAKkmB,SAASwC,KAAKmB,GACnB7pB,KAAKw+C,iBAAkB,EAGzBxX,SAAS/kC,GAEPjC,KAAK6iB,MAAMmB,IAAI/hB,EAAMA,EAAMA,GAC3BjC,KAAKw+C,iBAAkB,EAGzBe,UAAUn3C,GAERpI,KAAKijB,MAAMe,IAAI5b,GACfpI,KAAKy+C,gBAAiB,EAGxBe,UAAUpG,GAERp5C,KAAK88C,YAAYp0B,KAAK0wB,GACtBp5C,KAAKy/C,gBAGH7jC,YAAQ8jC,GAEV1/C,KAAK2+C,UAAYe,EACjB1/C,KAAKy+C,gBAAiB,EAGpB7iC,cAEF,OAAO5b,KAAK2+C,UAGdc,gBAEEz/C,KAAK6+C,kBAAkB7+C,KAAKwf,MAG9Bq/B,kBAAkBr/B,GAEhB,IAAImgC,EAAS,EAEb3/C,KAAKs+C,OAAOr5C,OAAS,EAErB,IAAK,IAAIwB,EAAI,EAAGA,EAAI+Y,EAAKva,OAAQwB,IACjC,CACE,MAAMm5C,EAAUpgC,EAAKqgC,WAAWp5C,GAC1Bq5C,EAAQ9/C,KAAKq+C,aAAajtC,MAAKC,GAAWA,EAAQuuC,UAAYA,IACpE,GAAIE,EACJ,CACE,GAAIA,EAAMC,YACV,CACE,MAAMC,EAAa,IAAI/B,GAAU0B,EAAQG,EAAMC,YAAaD,EAAMG,aAClEjgD,KAAKs+C,OAAO33C,KAAKq5C,GAEnBL,GAAUG,EAAMI,SAIpB,MAAMC,EAAO,IAAI3C,EACX4C,EAAcpgD,KAAKs+C,OAAO,GAChC6B,EAAKt1B,qBAAqBu1B,EAAYl6B,SAAS5hB,QAAQ2D,IAAI,IAAI2O,EAAQwpC,EAAYv9B,MAAMvb,EAAI,EAAG84C,EAAYv9B,MAAMtb,EAAI,IAAK64C,EAAYv9B,OAEvI,IAAK,IAAIpc,EAAI,EAAGA,EAAIzG,KAAKs+C,OAAOr5C,OAAQwB,IACxC,CACE,MAAMP,EAAIlG,KAAKs+C,OAAO73C,GAChBkkB,GAAM,IAAI6yB,GAAO3yB,qBAAqB3kB,EAAEggB,SAAS5hB,QAAQ2D,IAAI,IAAI2O,EAAQ1Q,EAAE2c,MAAMvb,EAAI,EAAGpB,EAAE2c,MAAMtb,EAAI,IAAKrB,EAAE2c,OACjHs9B,EAAKE,MAAM11B,GAGb,MAAM21B,EAAY,IAAI1pC,EACtBupC,EAAK9xB,QAAQiyB,GACb,IAAK,IAAI75C,EAAI,EAAGA,EAAIzG,KAAKs+C,OAAOr5C,OAAQwB,IAEtCzG,KAAKs+C,OAAO73C,GAAGyf,SAAS5e,GAAKg5C,EAAUh5C,EAAI,EAC3CtH,KAAKs+C,OAAO73C,GAAGyf,SAAS3e,GAAK+4C,EAAU/4C,EAAI,EAE3CvH,KAAKs+C,OAAO73C,GAAGyf,SAAS5e,GAAMg5C,EAAUh5C,EAAI,EAAKtH,KAAK88C,YAAYx1C,EAClEtH,KAAKs+C,OAAO73C,GAAGyf,SAAS3e,GAAM+4C,EAAU/4C,EAAI,EAAKvH,KAAK88C,YAAYv1C,EAGpEvH,KAAKu+C,gBAAiB,GCjJX,MAAMgC,WAAwBhkC,GAE3Cnb,YAAY8sB,GAEVvf,i6CAAkB,CAChB6xC,SAAU,CAAEz7C,MAAOmpB,GACnBuyB,UAAW,CAAE17C,MAAO,IACpB27C,WAAY,CAAE37C,MAAO,IAAI6R,EAAQ,EAAG,MAGtC5W,KAAKyqB,aAAc,EACnBzqB,KAAKwwB,WAAa,CAChB+mB,aAAa,GAEfv3C,KAAKyd,YAAa,EAClBzd,KAAKmhB,KAAOq4B,EACZtrB,EAAQ6Z,UAAYC,EACpB9Z,EAAQ+Z,UAAYD,EACpB9Z,EAAQ3N,iBAAkB,EAG5BogC,eAAe1+C,GAEbjC,KAAK2c,SAAS+jC,WAAW37C,MAAM2jB,KAAKzmB,GAGtC2+C,aAAa77C,GAEX/E,KAAK2c,SAAS8jC,UAAU17C,MAAQkC,EAAMC,KAAK,GAAK,GAAKnC,ICpB1C,MAAM87C,WAAqBl8B,EAExCvjB,YAAY0/C,EAAaC,GAEvB,MAEMC,EAAqB,IAAIC,EAC/BD,EAAmBE,cAAgB,EAEnC,MAAM38B,EAAW,IAAI8F,EAAoB,EAAG,GAC5C9F,EAASe,UAAU,GAAK,GAAK,GAC7B07B,EAAmB5hC,aAAa,WAAa,IAAI+hC,EAAuB58B,EAAS3U,aAAa,YAAY87B,MAAO,IACjHsV,EAAmB5hC,aAAa,KAAa,IAAI+hC,EAAuB58B,EAAS3U,aAAa,MAAM87B,MAAO,IAC3GsV,EAAmBxlB,MAAQjX,EAASiX,MAEpC,MAAM4lB,EAAiB,IAAIC,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GACxFC,EAAiB,IAAIF,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GACxFE,EAAiB,IAAIH,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GACxFG,EAAiB,IAAIJ,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GAExFI,EAAe,IAAIL,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GACtFpD,EAAe,IAAImD,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GAEtFr+B,EAAQ,IAAIo+B,EAAyB,IAAIrlB,aAAaslB,KAAsB,GAAG,GAErFF,EAAeO,MAASC,GACxBL,EAAeI,MAASC,GACxBJ,EAAeG,MAASC,GACxBH,EAAeE,MAASC,GACxBF,EAAaC,MAAWC,GACxB1D,EAAayD,MAAWC,GACxB3+B,EAAM0+B,MAAkBC,GAExBZ,EAAmB5hC,aAAa,iBAAkBgiC,GAClDJ,EAAmB5hC,aAAa,iBAAkBmiC,GAClDP,EAAmB5hC,aAAa,iBAAkBoiC,GAClDR,EAAmB5hC,aAAa,iBAAkBqiC,GAElDT,EAAmB5hC,aAAa,eAAgBsiC,GAChDV,EAAmB5hC,aAAa,eAAgB8+B,GAChD8C,EAAmB5hC,aAAa,QAAgB6D,GAEhDtU,MAAMqyC,EAAoB,IAAIT,GAAgBQ,IAE9C/gD,KAAK6hD,cAAgB,GACrB7hD,KAAK8gD,YAAcA,EAEnB9gD,KAAKwkB,SAASm8B,eAAe,IAAI/pC,EAAQkqC,EAAYgB,MAAMliC,MAAOkhC,EAAYgB,MAAMphC,SAEpF1gB,KAAK2pB,eAAgB,EAGvBi3B,aAAa77C,GAEX/E,KAAKwkB,SAASo8B,aAAa77C,GAG7Bg9C,SAASC,GAEP,MAAMtkB,EAAO,IAAI0gB,GAAQp+C,KAAK8gD,YAAYxC,OAAQ0D,GAElD,OADAhiD,KAAK6hD,cAAcl7C,KAAK+2B,GACjBA,EAGTukB,YAAYC,GAEV3W,GAAe4W,YAAYniD,KAAK6hD,cAAeK,GAC/CliD,KAAK4J,QAAO,GAGdA,OAAOw4C,GAEL,MAAMC,EAAmBriD,KAAKukB,SAAS3U,aAAa,gBAC9C0yC,EAAmBtiD,KAAKukB,SAAS3U,aAAa,gBAE9CwxC,EAAiBphD,KAAKukB,SAAS3U,aAAa,kBAC5C2xC,EAAiBvhD,KAAKukB,SAAS3U,aAAa,kBAC5C4xC,EAAiBxhD,KAAKukB,SAAS3U,aAAa,kBAC5C6xC,EAAiBzhD,KAAKukB,SAAS3U,aAAa,kBAE5C2yC,EAAYviD,KAAKukB,SAAS3U,aAAa,SAE7C,IAAI4yC,GAAuC,IAAjBJ,EACtBK,GAAuC,IAAjBL,EACtBM,GAAuC,IAAjBN,EAEtBO,EAAc,EAClB,IAAK,IAAIl8C,EAAI,EAAGA,EAAIzG,KAAK6hD,cAAc58C,OAAQwB,IAC/C,CACE,MAAM+Y,EAAOxf,KAAK6hD,cAAcp7C,GAE5B+Y,EAAKg/B,kBAEPgE,GAAsB,EACtBhjC,EAAKs/B,iBAGHt/B,EAAK++B,iBAEPkE,GAAqB,EACrBjjC,EAAKw/B,qBAGHx/B,EAAKi/B,iBAEPiE,GAAqB,EACrBljC,EAAKy/B,qBAGP,MAAMP,EAASl/B,EAAKk/B,OACdz7B,EAAQzD,EAAKyD,MACbrH,EAAU4D,EAAK5D,QAErB,IAAK,IAAIgnC,EAAU,EAAGA,EAAUpjC,EAAK8+B,OAAOr5C,OAAQ29C,IACpD,CACE,MAAM9C,EAAQtgC,EAAK8+B,OAAOsE,GAEpBC,EAAWF,EAEjBN,EAAiBS,QAAQD,EAAU/C,EAAM3B,aAAa72C,EAAGw4C,EAAM3B,aAAa52C,EAAGu4C,EAAM3B,aAAap2C,EAAG+3C,EAAM3B,aAAar2C,GACxHw6C,EAAiBQ,QAAQD,EAAU/C,EAAM55B,SAAS5e,EAAGw4C,EAAM55B,SAAS3e,EAAGu4C,EAAMj9B,MAAMvb,EAAGw4C,EAAMj9B,MAAMtb,GAElG65C,EAAe0B,QAAQD,EAAUnE,EAAO13C,SAAS,GAC/C03C,EAAO13C,SAAS,GAChB03C,EAAO13C,SAAS,GAChB03C,EAAO13C,SAAS,IAElBu6C,EAAeuB,QAAQD,EAAUnE,EAAO13C,SAAS,GAC/C03C,EAAO13C,SAAS,GAChB03C,EAAO13C,SAAS,GAChB03C,EAAO13C,SAAS,IAElBw6C,EAAesB,QAAQD,EAAUnE,EAAO13C,SAAS,GAC/C03C,EAAO13C,SAAS,GAChB03C,EAAO13C,SAAS,IAChB03C,EAAO13C,SAAS,KAElBy6C,EAAeqB,QAAQD,EAAUnE,EAAO13C,SAAS,IAC/C03C,EAAO13C,SAAS,IAChB03C,EAAO13C,SAAS,IAChB03C,EAAO13C,SAAS,KAElBu7C,EAAUO,QAAQD,EAAU5/B,EAAMnd,EAAGmd,EAAM/c,EAAG+c,EAAM9c,EAAGyV,GAEvD+mC,KAIJ3iD,KAAKukB,SAAS28B,cAAgByB,EAE1BA,EAAc3iD,KAAKshD,iBAErB3+C,QAAQM,MAAM,iEAAkEjD,KAAKshD,gBAAiBqB,EAAa3iD,MAGjHwiD,IAEFpB,EAAe5gC,aAAc,EAC7B+gC,EAAe/gC,aAAc,EAC7BghC,EAAehhC,aAAc,EAC7BihC,EAAejhC,aAAc,GAE3BiiC,IAEFJ,EAAiB7hC,aAAc,EAC/B8hC,EAAiB9hC,aAAc,GAE7BkiC,IAEFH,EAAU/hC,aAAc,GAI5BlE,UAEEtc,KAAKukB,SAASjI,UACdtc,KAAKwkB,SAASlI,WC5LH,MAAMymC,WAA2Bv0C,GAE9CpN,YAAYsJ,EAAgB9D,EAAO,EAAGC,EAAK,EAAGqE,EAAkB,UAE9DyD,MAAMzD,GAENlL,KAAK0K,eAAiBA,EACtB1K,KAAK4G,KAAOA,EACZ5G,KAAK6G,GAAKA,EAGZ+C,OAAOnB,EAAS1B,GAEd,MAAMi8C,EAAMhjD,KAAK4G,KAAKtC,QACtB0+C,EAAI97C,KAAKlH,KAAK6G,GAAI7G,KAAKkL,gBAAgBnE,IACvC0B,EAAQzI,KAAK0K,gBAAgBge,KAAKs6B,ICZvB,MAAMC,WAA6B/lC,GAEhD9b,cAEEuN,whEAAYvL,EAAW,CACrB8/C,WAAW,IAGbljD,KAAK2c,SAASwmC,WAAa,CAAEp+C,WAAO3B,GACpCpD,KAAK2c,SAASymC,eAAiB,CAAEr+C,MAAO,IAAI6R,EAAQ,EAAG,IAGzD0Q,YAAYC,GAEVvnB,KAAK2c,SAASwmC,WAAWp+C,MAAQwiB,EAEjC,MAAMtlB,EAAOjC,KAAKo9C,SAAS71B,GAC3BvnB,KAAK2c,SAASymC,eAAer+C,MAAM2jB,KAAKzmB,GAG1Cm7C,SAAS71B,GAEP,OAAIA,EAAI87B,eAEC,IAAIzsC,EAAQ7Q,KAAKL,IAAI,EAAG6hB,EAAIhS,MAAM+tC,YAAav9C,KAAKL,IAAI,EAAG6hB,EAAIhS,MAAMguC,cAE1Eh8B,EAAI0G,oBAEC,IAAIrX,EAAQ2Q,EAAI3H,MAAO2H,EAAI7G,QAEhC6G,EAAIi8B,UAEC,IAAI5sC,EAAQ2Q,EAAIhS,MAAMqK,MAAO2H,EAAIhS,MAAMmL,QAEzC,IAAI9J,EAAQ,EAAG,IClCX,MAAM6sC,GAEnBriD,YAAYgb,GAEVpc,KAAK+oB,GAAK,IAAIiE,EAAkB,EAAG,EAAG,CACpC02B,KAAMznB,EACNiM,OAAQnM,EACRgM,UAAWznB,EACX2nB,UAAW3nB,IAEbtgB,KAAK0jC,IAAM,IAAI1W,EAAkB,EAAG,EAAG,CACrC02B,KAAMznB,EACNiM,OAAQnM,EACRgM,UAAWznB,EACX2nB,UAAW3nB,IAGbtgB,KAAK2jD,kBAAoB,IAAIV,GAG/BW,OAAO11B,GAEL,MAAM21B,EAAW7jD,KAAKo9C,SAASlvB,GAC3B21B,EAASv8C,IAAMtH,KAAK+oB,GAAGnJ,OAASikC,EAASt8C,IAAMvH,KAAK+oB,GAAGrI,SAEzD1gB,KAAK+oB,GAAGuE,QAAQu2B,EAASv8C,EAAGu8C,EAASt8C,GACrCvH,KAAK0jC,IAAIpW,QAAQu2B,EAASv8C,EAAGu8C,EAASt8C,IAGxCvH,KAAK2jD,kBAAkBr8B,YAAY4G,GACnCsG,GAASjG,cAAcvuB,KAAK2jD,kBAAmB3jD,KAAK+oB,IAEpD,IAAK,IAAItiB,EAAI,EAAGA,EAAI,EAAGA,IAErBzG,KAAK2jD,kBAAkBr8B,YAAYtnB,KAAK+oB,GAAGmF,SAC3CsG,GAASjG,cAAcvuB,KAAK2jD,kBAAmB3jD,KAAK0jC,KAEpD1jC,KAAK2jD,kBAAkBr8B,YAAYtnB,KAAK0jC,IAAIxV,SAC5CsG,GAASjG,cAAcvuB,KAAK2jD,kBAAmB3jD,KAAK+oB,IAGtD,OAAO/oB,KAAK+oB,GAGdq0B,SAAS71B,GAEP,OAAIA,EAAI87B,eAEC,IAAIzsC,EAAQ7Q,KAAKL,IAAI,EAAG6hB,EAAIhS,MAAM+tC,YAAav9C,KAAKL,IAAI,EAAG6hB,EAAIhS,MAAMguC,cAE1Eh8B,EAAI0G,oBAEC,IAAIrX,EAAQ2Q,EAAI3H,MAAO2H,EAAI7G,QAEhC6G,EAAIi8B,UAEC,IAAI5sC,EAAQ2Q,EAAIhS,MAAMqK,MAAO2H,EAAIhS,MAAMmL,QAEzC,IAAI9J,EAAQ,EAAG,IC3DX,MAAMktC,WAAkC5mC,GAErD9b,YAAY2iD,GAEVp1C,MAAMo1C,ytCCLK,MAAMC,WAA4B9mC,GAE/C9b,YAAY6iD,EAAgBF,GAE1Bp1C,sLAGEwd,WAAOpnB,GAET/E,KAAK2c,SAASunC,QAAQn/C,MAAQA,EAG5BonB,aAEF,OAAOnsB,KAAK2c,SAASunC,QAAQn/C,OCblB,MAAMo/C,GAEnB/iD,YAAY6iD,GAEVjkD,KAAKwnC,cAAiB,EACtBxnC,KAAKynC,eAAiB,EACtBznC,KAAKokD,IAAM,IAAIp3B,EAAkB,EAAG,GACpChtB,KAAK0jC,IAAM,IAAI1W,EAAkB,EAAG,GACpChtB,KAAK2jC,IAAM,IAAI3W,EAAkB,EAAG,GACpChtB,KAAKqkD,IAAM,IAAIr3B,EAAkB,EAAG,GACpChtB,KAAKskD,IAAM,IAAIt3B,EAAkB,EAAG,GAEpChtB,KAAKukD,iBAAqB,IAAIT,IAA0B,GACxD9jD,KAAKwkD,mBAAqB,IAAIV,IAA0B,GAExD9jD,KAAKykD,iBAAmB,IAAIT,GAG9BngB,KAAK9a,GAEH/oB,KAAK0kD,gBAAgB37B,EAAGnJ,MAAOmJ,EAAGrI,QAClC8T,GAAS1G,KAAK/E,EAAU/oB,KAAK0jC,IAAK1jC,KAAKykD,kBAGvCjwB,GAAS1G,KAAK9tB,KAAK0jC,IAAK1jC,KAAK2jC,IAAK3jC,KAAKwkD,oBACvChwB,GAAS1G,KAAK9tB,KAAK2jC,IAAK3jC,KAAKqkD,IAAKrkD,KAAKwkD,oBACvChwB,GAAS1G,KAAK9tB,KAAKqkD,IAAKrkD,KAAKskD,IAAKtkD,KAAKwkD,oBAIvChwB,GAAS1G,KAAK9tB,KAAKskD,IAAKtkD,KAAKqkD,IAAKrkD,KAAKukD,kBACvC/vB,GAAS1G,KAAK9tB,KAAKqkD,IAAKrkD,KAAK2jC,IAAK3jC,KAAKukD,kBACvC/vB,GAAS1G,KAAK9tB,KAAK2jC,IAAK5a,EAAI/oB,KAAKukD,kBAMnCG,gBAAgB9kC,EAAOc,GAEjB1gB,KAAKwnC,gBAAkB5nB,GAAS5f,KAAKynC,iBAAmB/mB,IAE1D1gB,KAAKwnC,cAAgB5nB,EACrB5f,KAAKynC,eAAiB/mB,EACtB1gB,KAAKokD,IAAI92B,QAAQttB,KAAKwnC,cAAgB,EAAGxnC,KAAKynC,eAAiB,GAC/DznC,KAAK0jC,IAAIpW,QAAQttB,KAAKwnC,cAAgB,EAAGxnC,KAAKynC,eAAiB,GAC/DznC,KAAK2jC,IAAIrW,QAAQttB,KAAKwnC,cAAgB,EAAGxnC,KAAKynC,eAAiB,GAC/DznC,KAAKqkD,IAAI/2B,QAAQttB,KAAKwnC,cAAgB,EAAGxnC,KAAKynC,eAAiB,GAC/DznC,KAAKskD,IAAIh3B,QAAQttB,KAAKwnC,cAAgB,GAAIxnC,KAAKynC,eAAiB,MChDvD,MAAMkd,WAA0B/hC,EAE7CxhB,cAEEuN,QACA3O,KAAK21C,WAAa,GAElB31C,KAAK4kD,eAAYxhD,EAGnByhD,kBAAkBtgC,EAAUC,EAAUsgC,GAGpC,GAAIA,QAA8D1hD,IAAxCmhB,EAAS3U,aAAa,cAChD,CACE,MAAMm1C,EAAkB/kD,KAAKglD,2BAA2BzgC,EAAS3U,aAAa,YAAYktB,OAC1FvY,EAASnF,aAAa,aAAc2lC,GAOtC,MAAM3+C,EAAS,IAAI6+C,GAAO1gC,EAAUC,GACpCpe,EAAOujB,eAAgB,EACvB3pB,KAAK4kD,UAAYx+C,EAEjBpG,KAAKiI,IAAI7B,GAGX8+C,sBAAsBnoB,IAKtBooB,cAAczkD,EAAMq8B,IAKpBioB,2BAA2BI,GAEzB,MAAMC,EAAarlD,KAAKslD,qBAAqBF,GACvCnoB,EAAM,IAAIjB,aAA8B,EAAjBopB,GAC7B,IAAK,IAAI3+C,EAAI,EAAGusC,EAAI,EAAGvsC,EAAqB,EAAjB2+C,EAAoB3+C,GAAK,EAAGusC,IAErD/V,EAAIx2B,GAAOusC,EAAIqS,EAAcA,EAAe,GAAMA,EAClDpoB,EAAIx2B,EAAI,GAAMV,KAAKsC,MAAM2qC,EAAIqS,GAAcA,EAAe,GAAMA,EAGlE,OAAO,IAAIroB,EAAgBC,EAAK,GAGlCqoB,qBAAqBF,GAEnB,OAAOr/C,KAAK2Z,KAAK3Z,KAAKwH,KAAK63C,IAG7Bx7C,SAEE,IAAK,IAAInD,EAAI,EAAGA,EAAIzG,KAAK21C,WAAW1wC,OAAQwB,IAE1CzG,KAAK21C,WAAWlvC,GAAGmD,SAIvB27C,8BAA8B76C,EAAgB8jB,GAE5C,IAAK,IAAI/nB,EAAI,EAAGA,EAAIzG,KAAK21C,WAAW1wC,OAAQwB,IAEtCzG,KAAK21C,WAAWlvC,GAAG/F,OAASgK,IAE9B1K,KAAK21C,WAAWlvC,GAAG++C,gBAAkBh3B,GAK3ClS,UAEEtc,KAAK4kD,UAAUrgC,SAASjI,UACxBtc,KAAK4kD,UAAUpgC,SAASlI,WClFb,MAAMmpC,WAA0B5pB,EAE7Cz6B,YAAY+D,EAAMya,EAAOc,EAAQwnB,EAAQwb,GAEvC/0C,MAAMxJ,EAAMya,EAAOc,EAAQwnB,EAAQwb,GACnC1jD,KAAK0lD,WAAa,EAGpBC,SAASnqB,EAAO11B,EAAGI,EAAGC,EAAGuK,GAEvB1Q,KAAKmF,KAAa,EAARq2B,EAAY,GAAK11B,EAAI9F,KAAK0lD,WACpC1lD,KAAKmF,KAAa,EAARq2B,EAAY,GAAKt1B,EAAIlG,KAAK0lD,WACpC1lD,KAAKmF,KAAa,EAARq2B,EAAY,GAAKr1B,EAAInG,KAAK0lD,WACpC1lD,KAAKmF,KAAa,EAARq2B,EAAY,GAAK9qB,EAAI1Q,KAAK0lD,WACpC1lD,KAAKwgB,aAAc,EAGrBolC,QAAQpqB,EAAO11B,EAAGI,EAAGC,GAEnBnG,KAAKmF,KAAa,EAARq2B,EAAY,GAAK11B,EAAI9F,KAAK0lD,WACpC1lD,KAAKmF,KAAa,EAARq2B,EAAY,GAAKt1B,EAAIlG,KAAK0lD,WACpC1lD,KAAKmF,KAAa,EAARq2B,EAAY,GAAKr1B,EAAInG,KAAK0lD,WACpC1lD,KAAKwgB,aAAc,EAGrBqlC,MAAMrqB,EAAOz2B,GAEX/E,KAAKmF,KAAa,EAARq2B,EAAY,GAAKz2B,EAAQ/E,KAAK0lD,WACxC1lD,KAAKwgB,aAAc,EAGrBslC,MAAMtqB,EAAOz2B,GAEX/E,KAAKmF,KAAa,EAARq2B,EAAY,GAAKz2B,EAAQ/E,KAAK0lD,WACxC1lD,KAAKwgB,aAAc,EAGrBulC,MAAMvqB,EAAOz2B,GAEX/E,KAAKmF,KAAa,EAARq2B,EAAY,GAAKz2B,EAAQ/E,KAAK0lD,WACxC1lD,KAAKwgB,aAAc,EAGrBwlC,MAAMxqB,EAAOz2B,GAEX/E,KAAKmF,KAAa,EAARq2B,EAAY,GAAKz2B,EAAQ/E,KAAK0lD,WACxC1lD,KAAKwgB,aAAc,GC7CR,MAAMylC,WAAuBR,GAE1CrkD,YAAYwe,EAAOc,GAGjB/R,MADa,IAAIitB,WAAWhc,EAAQc,EAAS,GACjCd,EAAOc,EAAQob,GAC3B97B,KAAK0lD,WAAa,KCNP,MAAMQ,WAAwBT,GAE3CrkD,YAAYwe,EAAOc,GAGjB/R,MADa,IAAIitB,WAAWhc,EAAQc,EAAS,GACjCd,EAAOc,EAAQqb,GAC3B/7B,KAAK0lD,WAAa,KCLP,MAAMS,WAA4BV,GAE/CrkD,YAAYwe,EAAOc,GAGjB/R,MADa,IAAIqtB,aAAapc,EAAQc,EAAS,GACnCd,EAAOc,EAAQob,EAAWG,ICL3B,MAAMmqB,WAA6BX,GAEhDrkD,YAAYwe,EAAOc,GAGjB/R,MADa,IAAIqtB,aAAapc,EAAQc,EAAS,GACnCd,EAAOc,EAAQqb,EAAYE,ICH5B,MAAMoqB,WAAoB1hC,EAEvCvjB,YAAYklD,EAAU/hC,EAAUC,EAAU+hC,GAExC53C,MAAM4V,EAAUC,GAEhBxkB,KAAKsmD,SAAWA,EAChBtmD,KAAKwmD,cAAgBr9C,OAAOC,KAAKk9C,GAAUrhD,OAC3CjF,KAAKumD,kBAAoBA,EACzBvmD,KAAKs4B,YAAct4B,KAAKwmD,cAAgBD,EACxCvmD,KAAKymD,aAAe1gD,KAAK2Z,KAAK1f,KAAKwmD,cAAgBD,GAGrDG,mBAAmB1tB,GAEjBh5B,KAAKwkB,SAAS7H,SAASqc,GAAcj0B,MAAQ,IAAIkhD,GAAejmD,KAAKs4B,YAAat4B,KAAKymD,cAGzFE,oBAAoB3tB,GAElBh5B,KAAKwkB,SAAS7H,SAASqc,GAAcj0B,MAAQ,IAAImhD,GAAgBlmD,KAAKs4B,YAAat4B,KAAKymD,cAG1FG,yBAAyB5tB,GAEvBh5B,KAAKwkB,SAAS7H,SAASqc,GAAcj0B,MAAQ,IAAIohD,GAAoBnmD,KAAKs4B,YAAat4B,KAAKymD,cAG9FI,0BAA0B7tB,GAExBh5B,KAAKwkB,SAAS7H,SAASqc,GAAcj0B,MAAQ,IAAIqhD,GAAqBpmD,KAAKs4B,YAAat4B,KAAKymD,cAG/FK,eAAepmD,GAEb,OAAOV,KAAKsmD,SAAS5lD,GAGvBqmD,cAAc/tB,EAAcguB,EAAWlhD,EAAGI,EAAGC,GAE3CnG,KAAKwkB,SAAS7H,SAASqc,GAAc4sB,QAAQ5lD,KAAK8mD,eAAeE,GAAYlhD,EAAGI,EAAGC,GAGrF8gD,eAAejuB,EAAcguB,EAAWlhD,EAAGI,EAAGC,EAAGuK,GAE/C1Q,KAAKwkB,SAAS7H,SAASqc,GAAc2sB,SAAS3lD,KAAK8mD,eAAeE,GAAYlhD,EAAGI,EAAGC,EAAGuK,IC7C5E,MAAMw2C,GAEnB5qB,MAAM6qB,EAAQ3iC,GAEZ,MAMMgvB,EAAa,GACb8S,EAAW,GAEXc,EAAe,GAErB,IAAK,IAAI3gD,EAAI,EAAGA,EAAI0gD,EAAOliD,OAAQwB,IACnC,CACE,MAAM4lB,EAAO86B,EAAO1gD,GACdo2B,EAAexQ,EAAK9H,SAAS3U,aAAa,YAAYktB,MAE5D,IAAK,IAAIA,EAAQ,EAAGA,EAAQD,EAAcC,IAExCsqB,EAAazgD,KAAKF,GAGpB+sC,EAAW7sC,KAAK0lB,EAAK9H,eAEOnhB,IAAxBkjD,EAASj6B,EAAK3rB,MAEhB4lD,EAASj6B,EAAK3rB,MAAQ+F,EAItB9D,QAAQM,MAAM,4EAA6EopB,EAAK3rB,KAAM4lD,GAI1G,MAAM5gC,EAAkBC,GAAoBC,sBAAsB4tB,GAE5DzW,EAAmB,IAAIC,EAAgB,IAAIhB,aAAaorB,GAAe,GAG7E,OAFA1hC,EAAgBtG,aAAa,UAAW2d,GAEjC/8B,KAAKqnD,oBAAoBf,EAAU5gC,EAAiBlB,EAtCjC,MAyC5B6iC,oBAAoBf,EAAU5gC,EAAiBlB,EAAU+hC,GAEvD,OAAO,IAAIF,GAAYC,EAAU5gC,EAAiBlB,EAAU+hC,IClDjD,MAAMe,GAEnBlmD,YAAY2wB,EAAQw1B,GAAO,EAAMC,EAAS,EAAGC,GAAa,GAExDznD,KAAK+xB,OAASA,EACd/xB,KAAKunD,KAAOA,EACZvnD,KAAKwnD,OAASA,EACdxnD,KAAKynD,WAAaA,EAElBznD,KAAK0nD,WAAQtkD,EAGfrD,KAAK4nD,GAEC3nD,KAAKynD,WAEPznD,KAAK0nD,MAAQ,IAAIE,GAAiBD,GAIlC3nD,KAAK0nD,MAAQ,IAAIG,GAAOF,GAG1B3nD,KAAK0nD,MAAMI,UAAU9nD,KAAK+xB,QAC1B/xB,KAAK0nD,MAAMK,QAAQ/nD,KAAKunD,MAGxBvnD,KAAK0nD,MAAMM,KAAKA,KAAKjjD,MAAQ,EAE7B/E,KAAK0nD,MAAMO,UAAUjoD,KAAKunD,KAAO,EAAIvnD,KAAKwnD,QAG5Cl+C,OAEEtJ,KAAK0nD,MAAMp+C,OAGb4+C,QAEEloD,KAAK0nD,MAAMQ,QAGb3+C,OAEEvJ,KAAK0nD,MAAMn+C,OAGT4+C,iBAEF,OAAOnoD,KAAK0nD,MAAMU,WC9CP,MAAMC,WAAoBvmD,GAEvCV,YAAYW,EAAaC,EAAKulD,GAAO,EAAMC,EAAS,EAAGvlD,EAAMwlD,GAAa,GAExE94C,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAKunD,KAAOA,EACZvnD,KAAKwnD,OAASA,EACdxnD,KAAKynD,WAAaA,EAGpBviD,sBAAsB/B,EAAoBiB,GAEnCjE,OAAOmoD,gCAM4CllD,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKuoD,kBAAkBplD,EAAoBiB,IAI3CjB,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAbP2lD,WAAWxoD,KAAKkF,sBAAsBnB,KAAK/D,KAAMmD,EAAoBiB,GAAW,KAkBpFmkD,kBAAkBplD,EAAoBiB,GAEpCA,EAASqkD,cAAc5kD,MAAM6kD,IAEXC,GAAa/pC,aACrBgqC,gBAAgBF,GAAeG,IAErC1lD,EAAmBe,aACjBlE,KAAK+B,YACL/B,KAAKgC,IACL,IAAIslD,GAAUuB,EAAc7oD,KAAKunD,KAAMvnD,KAAKwnD,OAAQxnD,KAAKynD,aAG3DznD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,yBChDE,MAAMimD,WAAoBhnD,GAEvCV,YAAYW,EAAaC,EAAK+mD,EAAQ9mD,GAEpC0M,MAAM5M,EAAaC,EAAKC,GAExBjC,KAAK+oD,OAASA,EAGhB7jD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAMgnD,IAI1B7lD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKgnD,GAE5DhpD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,qLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCzCI,MAAMsmD,WAAsBrnD,GAEzCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIK,GAClBppD,KAAK+oD,OAAOM,QAAQrnD,EAAM,KAC1BhC,KAAKspD,KAAO,CACV,SACA,SACA,SACA,SACA,SACA,UAIJpkD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKspD,MAAO/zC,IAE3BpS,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKuT,GAE5DvV,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAhmD,IAECjD,KAAK8C,YAAY,+EAAsFG,GACvGjD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC/CI,MAAM0mD,WAAkBznD,GAErCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIS,GAAmBC,cAGvCvkD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM2xC,IAE1BxwC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK2xC,GAE5D3zC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,qLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAM6mD,WAAmB5nD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIY,GAGpBzkD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM4nD,IAE1BzmD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK4nD,GAE5D5pD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,GACjBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMgnD,WAAmB/nD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIe,GAGpB5kD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAMyd,IAE1Btc,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKyd,GAE5Dzf,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,iLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMknD,WAAmBjoD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIiB,GAAgBD,WAGpC7kD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM2xC,IAE1BxwC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK2xC,GAE5D3zC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QASAC,IAEClpD,KAAK8C,YAAYomD,EAAM,qLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMonD,WAAwBnoD,GAE3CV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIiB,GAAgBD,WAClC/pD,KAAKkqD,aAAe,IAAIC,GAAiBC,YAEzCpqD,KAAKkqD,aAAaG,eAAelqD,OAAOmqD,oBACxCtqD,KAAKkqD,aAAaK,iBAAiB,CAAE7G,KAAM,OAC3C1jD,KAAKkqD,aAAaM,eAAe,GAEjCxqD,KAAK+oD,OAAO0B,eAAezqD,KAAKkqD,cAGlChlD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM2xC,IAE1BxwC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK2xC,GAE5D3zC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,qLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC7CI,MAAM6nD,WAA6B5oD,GAEhDV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAI4B,GAA0BD,qBAC5C1qD,KAAK4qD,WAAa,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,WAG5E1lD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAOM,QAAQrpD,KAAKgC,KACtB6oD,YAAYC,IACZ5nD,KAAKlD,KAAK4qD,YAAaG,IAEtB5nD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK+oD,GAE5D/qD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,qLACvBlpD,KAAK6C,sBAKTM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC5CI,MAAMmoD,WAAmBlpD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,EAAoBiB,QAEchB,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3CoC,EAASyd,OAAOhe,MAAMge,IAEpB1e,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK6f,GAE5D7hB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtBI,MAAMooD,WAAkBnpD,GAErCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAImC,GAAeD,UAGnC/lD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM8pC,IAE1B3oC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK8pC,GAE5D9rC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,iLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCrCI,MAAMsoD,WAAyBrpD,GAE5CV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIY,GAGpBzkD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAMwd,IAE1Brc,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKhC,KAAKorD,WAAW5rC,IAE5Exf,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,GACjBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAITuoD,WAAWC,GAET,MAAMC,EAAeD,EAASp7C,MAAM,MAEU,KAA1Cq7C,EAAaA,EAAarmD,OAAS,IAErCqmD,EAAaC,MAGf,MAAMpb,EAAY,GAElB,IAAK,IAAI1pC,EAAI,EAAGA,EAAI6kD,EAAarmD,OAAQwB,GAAK,EAC9C,CACE,MAAMa,EAAIwI,WAAWw7C,EAAa7kD,EAAI,IAChCc,EAAIuI,WAAWw7C,EAAa7kD,EAAI,IAChCsB,EAAI+H,WAAWw7C,EAAa7kD,EAAI,IACtC0pC,EAAUxpC,KAAK,IAAI6kD,EAAalkD,EAAGC,EAAGQ,IAExC,OAAOooC,GC3DI,MAAMsb,WAA0B3pD,GAE7CV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAI2C,GAAgBC,WAClC3rD,KAAK+oD,OAAO8B,YAAYe,IAG1B1mD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM+oD,IAE1B5nD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK+oD,GAE5D/qD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,EAAM,qLACvBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCzCI,MAAMgpD,WAAmB/pD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GACxBjC,KAAK+oD,OAAS,IAAIY,GAGpBzkD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+oD,OAAO7lD,KAAKlD,KAAKgC,KAAM2xC,IAE1BxwC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK2xC,GAE5D3zC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAENomD,QAQAC,IAEClpD,KAAK8C,YAAYomD,GACjBlpD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMipD,WAA2BhqD,GAE9CV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,GAEpB,QAAsDC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAC7C,CACE,MAAMksB,EAAU,IAAI69B,GACdx2C,EAAQ,IAAIy2C,MAElBz2C,EAAME,IAAMzV,KAAKgC,IAEjBuT,EAAM02C,OAAS,KAEb/9B,EAAQ3Y,MAAQA,EAChB2Y,EAAQ1N,aAAc,EAEtBrd,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKksB,GAE5DluB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAGP0S,EAAM22C,QAAU,KAEdvpD,QAAQM,MAAM,6DAA8DjD,KAAKgC,IAAKhC,KAAKmsD,oBAK7FhpD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBCrCI,MAAMupD,WAAsBtqD,GAEzCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,EAAoBiB,QAEchB,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3CoC,EAASuvB,OAAO9vB,MAAM8vB,IAEpB,MAAMzF,EAAU,IAAI69B,GAEd/pD,EAAM+xB,IAAIC,gBAAgBL,GAE1Bpe,EAAQ,IAAIy2C,MAClBz2C,EAAME,IAAMzT,EAEZuT,EAAM02C,OAAS,KAEb/9B,EAAQ3Y,MAAQA,EAChB2Y,EAAQ1N,aAAc,EAEtBrd,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKksB,GAE5DluB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAGP0S,EAAM22C,QAAU,KAEdvpD,QAAQM,MAAM,6DAA8DjD,KAAKgC,UAMrFmB,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC5CI,MAAMwpD,WAAoBvqD,GAEvCV,YAAYW,EAAaC,EAAKC,GAE5B0M,MAAM5M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,EAAoBiB,QAEchB,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3CoC,EAASuvB,OAAO9vB,MAAM8vB,IAEpBxwB,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAK+xB,IAAIC,gBAAgBL,IAEhF3zB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCxBI,MAAMypD,GAEnBlrD,YAAYmrD,GAEVvsD,KAAKwsD,iBAAmB,GACxBxsD,KAAKusD,WAAaA,GAAc,gBAGlCE,WAAW1D,GAET/oD,KAAKwsD,iBAAiB7lD,KAAKoiD,GAG7B7lD,KAAKC,GAEH,IAAK,IAAIsD,EAAI,EAAGA,EAAIzG,KAAKwsD,iBAAiBvnD,OAAQwB,IAEhDzG,KAAKwsD,iBAAiB/lD,GAAGvD,KAAKC,GAAsBgY,IAIpDuxC,uBAEF,IAAIC,GAAW,EACf,IAAK,IAAIlmD,EAAI,EAAGA,EAAIzG,KAAKwsD,iBAAiBvnD,OAAQwB,IAEhDkmD,EAAWA,GAAY3sD,KAAKwsD,iBAAiB/lD,GAAGrE,aAElD,OAAOuqD,EAGLC,iBAEF,IAAIvqD,GAAY,EAChB,IAAK,IAAIoE,EAAI,EAAGA,EAAIzG,KAAKwsD,iBAAiBvnD,OAAQwB,IAEhDpE,EAAYA,GAAarC,KAAKwsD,iBAAiB/lD,GAAGpE,UAEpD,OAAOA,EAGTwqD,eAEElqD,QAAQM,MAAM,UAAYjD,KAAKusD,WAAa,iCAC5C,IAAK,IAAI9lD,EAAI,EAAGA,EAAIzG,KAAKwsD,iBAAiBvnD,OAAQwB,IAE5CzG,KAAKwsD,iBAAiB/lD,GAAGpE,WAE3BrC,KAAKwsD,iBAAiB/lD,GAAGzD,cAK/BiH,eAEE,OAAOjK,KAAK8sD,mBAAqB9sD,KAAK+sD,kBAGxCD,mBAEE,IAAI5qD,EAAe,EAEnB,IAAK,IAAIuE,EAAI,EAAGA,EAAIzG,KAAKwsD,iBAAiBvnD,OAAQwB,IAEhDvE,GAAgBlC,KAAKwsD,iBAAiB/lD,GAAGvE,aAG3C,OAAOA,EAGT6qD,kBAEE,IAAI5qD,EAAc,EAElB,IAAK,IAAIsE,EAAI,EAAGA,EAAIzG,KAAKwsD,iBAAiBvnD,OAAQwB,IAEhDtE,GAAenC,KAAKwsD,iBAAiB/lD,GAAGtE,YAG1C,OAAOA"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/Screen.js","../src/canvas_drawer/SimpleTextDrawer.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/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.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/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/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/GPUParticleSystem.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/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return this.is_chrome || this.is_firefox || this.is_edge_chromium;\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n}\n\nexport default new Browser();\n","export default class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n","import Browser from '../Browser';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default 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 = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.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 = Browser.is_safari ? 'no-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 this.on_preloaded_finished(resource_container, response_clone);\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","import { Vector3 } from 'three';\nimport { Math as TMath } from 'three';\n\nexport default class OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\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;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = TMath.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n","\nimport { Math as TMath } from 'three';\nimport OMath from '../utilities/OMath';\n\nexport default class ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = 1;\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = TMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.elapsed_time = TMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return TMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.evaluate(TMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n}\n","class EasingFunctions\n{\n constructor()\n { }\n\n linear(x)\n {\n return x;\n }\n\n triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n ease_in_quad(x)\n {\n return x * x;\n }\n\n ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n heartbeat(t)\n {\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;\n }\n}\n\nexport default new EasingFunctions();\n","import EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\nimport { Math as TMath } from 'three';\n\nexport default class NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = TMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return TMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nexport default new ViewContext();\n","import ViewContext from '../view_components/ViewContext';\n\nexport default class ActionEvent\n{\n constructor(name, method)\n {\n this.name = name;\n this.method = method;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method]();\n }\n}\n","export default class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n const animation_nodes = doc.querySelectorAll('mxGeometry');\n\n const animation_tracks = [];\n const triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n const node = animation_nodes[i];\n const parent_node = node.parentElement;\n const data = parent_node.getAttribute('value');\n\n const x_pos = this.get_node_x_position(node);\n\n const from = x_pos / 100;\n const duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n const split_data = data.split('.');\n const trigger_name = split_data[0];\n const trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n const split_data = data.split('=');\n\n const attribute_name = split_data[0];\n\n const value_data = split_data[1].split('--');\n const to_value = parseFloat(value_data[0]);\n const easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n const x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n","import ActionSequencer from '../../action_sequencer/ActionSequencer';\nimport NumberInterpolator from '../../action_sequencer/NumberInterpolator';\nimport ActionEvent from '../../action_sequencer/ActionEvent';\nimport DrawIOAnimationSheet from './DrawIOAnimationSheet';\n\nexport default class ActionSequencerBuilder\n{\n constructor(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.initial_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.initial_state_data);\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n current_context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: 1,\n to_value: state[keys[i]],\n initial: true,\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n}\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n const queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nexport default new EventManager();\n","import EventManager from './EventManager';\n\nclass ResourceContainer\n{\n init()\n {\n this.resources = {};\n this.resources_by_url = {};\n }\n\n set_resource(name, url, resource)\n {\n const urls = Object.keys(this.resources_by_url);\n\n if (urls.includes(url))\n {\n this.resources[name] = this.resources_by_url[url];\n }\n else\n {\n this.resources[name] = resource;\n this.resources_by_url[url] = resource;\n }\n\n EventManager.fire_resource_loaded({ name: name, value: resource });\n }\n\n get_resource(name)\n {\n return this.resources[name];\n }\n\n get(name)\n {\n return this.resources[name];\n }\n}\n\nexport default new ResourceContainer();\n","export default class HTMLUtilities\n{\n static load_images(container)\n {\n const images = container.querySelectorAll('img');\n\n for (let i = 0; i < images.length; i++)\n {\n const image = images[i];\n\n if (image.dataset.src)\n {\n image.src = image.dataset.src;\n }\n }\n\n const image_objects = container.querySelectorAll('object');\n\n for (let i = 0; i < image_objects.length; i++)\n {\n const image_object = image_objects[i];\n\n if (image_object.dataset.src)\n {\n image_object.data = image_object.dataset.src;\n }\n }\n }\n\n static load_videos(container)\n {\n const videos = container.querySelectorAll('video');\n\n for (let i = 0; i < videos.length; i++)\n {\n const video = videos[i];\n\n if (video.dataset.src)\n {\n video.src = video.dataset.src;\n }\n }\n }\n}\n","import ActionSequencerBuilder from './ActionSequencerBuilder';\n\nexport default class TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.initial_state_data = {};\n }\n\n get(from_state_name, to_state_name, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\n {\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n\n return action_sequencer;\n }\n }\n\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state_name)\n {\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\n return undefined;\n }\n\n add_transitions(transitions)\n {\n for (let i = 0; i < transitions.length; i++)\n {\n this.transitions.push(transitions[i]);\n }\n }\n\n set_transitions(transitions)\n {\n this.transitions = transitions;\n }\n\n set_initial_state_data(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n}\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n constructor()\n {\n this.delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\n }\n\n init()\n {\n this.___time = new Clock();\n this.__raw_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n\n this.delta_time = 0.016;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get shader_time()\n {\n this.__allocated_time.x = this.delta_time;\n this.__allocated_time.y = this.elapsed_time;\n return this.__allocated_time;\n }\n\n __update()\n {\n this.__raw_delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.delta_buffer.shift();\n this.delta_buffer.push(this.__raw_delta_time < 0.32 ? this.__raw_delta_time : 0.032);\n\n this.__calculate_delta_time();\n }\n\n __calculate_delta_time()\n {\n this.delta_time = 0;\n\n for (let i = 0; i < this.delta_buffer.length; i++)\n {\n this.delta_time += this.delta_buffer[i];\n }\n\n this.delta_time = this.delta_time / this.delta_buffer.length;\n }\n}\n\nexport default new Time();\n","export default class ViewState\n{\n constructor(name)\n {\n this.name = name;\n }\n\n start()\n {\n }\n\n show()\n {\n }\n\n hide()\n {\n }\n\n before_enter()\n {\n }\n\n on_enter()\n {\n }\n\n update()\n {\n }\n\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\n {\n // Backward compatibility. It will be removed in future releases.\n this.update_transition(global_view_data, transition_progress, action_sequencer);\n }\n\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n // Deprecated\n update_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n before_exit()\n {\n }\n\n on_exit()\n {\n }\n}\n","import Time from '../../Time';\nimport ViewState from '../ViewState';\n\nexport default class ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.initial_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\n this.current_state.before_enter();\n\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_initial_state_data(initial_state_data)\n {\n Object.assign(this.initial_state_data, initial_state_data);\n Object.assign(this.current_state_data, initial_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n","import TransitionTable from './transition/TransitionTable';\nimport ViewStateTransitionHandler from './transition/ViewStateTransitionHandler';\n\nclass ViewManager\n{\n constructor()\n {\n this.views = [];\n\n this.transition_table = new TransitionTable();\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\n\n this.view_change_subscribers = [];\n\n this.browser_title_suffix = '';\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n const v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n this.__change_browser_title(v.url);\n }\n\n this.notify_view_change(view_name);\n }\n\n subscribe_to_view_change(subscriber)\n {\n this.view_change_subscribers.push(subscriber);\n }\n\n notify_view_change(view_name)\n {\n for (let i = 0; i < this.view_change_subscribers.length; i++)\n {\n const subscriber = this.view_change_subscribers[i];\n subscriber.on_view_change(view_name);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n const view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n set_browser_title_suffix(title_suffix)\n {\n this.browser_title_suffix = title_suffix;\n }\n\n get_current_view()\n {\n return this.transition_handler.current_state;\n }\n\n get_view_by_name(view_name)\n {\n console.warn('DEPRECATED. Use ViewManager.get instead');\n this.get(view_name);\n }\n\n get(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get] no view found for: ', view_name);\n return undefined;\n }\n\n get_view_by_url(url)\n {\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\n this.get_by_url(url);\n }\n\n get_by_url(url)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].url === url)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get_by_url] no view found for: ', url);\n return undefined;\n }\n\n set_initial_state_data(initial_state_data)\n {\n this.transition_table.set_initial_state_data(initial_state_data);\n this.transition_handler.set_initial_state_data(initial_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __change_browser_title(name)\n {\n const title = this.__capitalize(name);\n\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n\n __capitalize(string)\n {\n let aux_string = string.toUpperCase().replace('/', '');\n aux_string = this.__snake_to_whitespace(aux_string);\n\n return aux_string;\n }\n\n __snake_to_whitespace(string)\n {\n return string.replace(\n /([-_][A-Z])/g,\n (group) => group\n .replace('-', ' ')\n .replace('_', ' ')\n );\n }\n}\n\nexport default new ViewManager();\n","import ResourceContainer from '../ResourceContainer';\nimport HTMLUtilities from '../utilities/HTMLUtilities';\nimport ViewManager from './ViewManager';\nimport ViewState from './ViewState';\n\nexport default class ApplicationView extends ViewState\n{\n constructor({ name, url, container })\n {\n super(name);\n\n this.container = container;\n this.url = url;\n\n let transition_data = ResourceContainer.get(`${name}_data`);\n\n transition_data = transition_data || {\n animation_tracks: [],\n triggers: []\n };\n\n const transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n","export default class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n","export default class BaseRender\n{\n constructor()\n {\n\n }\n\n render()\n {\n\n }\n\n on_enter(context, renderer)\n {\n\n }\n\n on_exit(context, renderer)\n {\n\n }\n\n resize()\n {\n\n }\n\n dispose()\n {\n\n }\n}\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class BaseShaderMaterial extends ShaderMaterial\n{\n constructor(vert, frag, uniforms)\n {\n super({\n vertexShader: vert || basic_vert,\n fragmentShader: frag || basic_frag,\n uniforms: uniforms || {\n _Color: { value: new Color('#FF0000') }\n }\n });\n }\n}\n","import vert from '../shaders/copy/copy.vert';\nimport frag from '../shaders/copy/copy.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Vector2 } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nexport default class BlitMaterial extends ShaderMaterial\n{\n constructor(frag_shader, vert_shader, defines)\n {\n super({\n uniforms: {\n _MainTex: { value: null },\n _Resolution: { value: new Vector2(0, 0) },\n _TargetResolution: { value: new Vector2(0, 0) }\n },\n defines: defines || {},\n vertexShader: vert_shader || vert,\n fragmentShader: frag_shader || frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n }\n\n set current(camera)\n {\n this._current = camera;\n }\n\n get current()\n {\n return this._current;\n }\n}\n\nexport default new CameraManager();\n","class Capabilities\n{\n init()\n {\n this.max_anisotropy = 0;\n this.vertex_texture_sampler_available = false;\n this.fp_textures_available = false;\n }\n}\n\nexport default new Capabilities();\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nexport default class CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n const body = document.getElementsByTagName('body')[0];\n const dummy = document.createElement('div');\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n const size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n const canvas = this.draw_canvas(text, ctxOptions);\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n","/*\n\n A configuration class used as a singleton\n\n*/\n\nclass Configuration\n{\n init(parameters = {})\n {\n this.dpr = 1;\n\n this.app = {}; // for arbitrary use in end application\n }\n\n from_json(json)\n {\n\n }\n}\n\nexport default new Configuration();\n","export default class Idle\n{\n constructor()\n {\n }\n\n get is_animating()\n {\n return false;\n }\n\n on_enter(view)\n {\n\n }\n\n update(view)\n {\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Time from '../../Time';\nimport Idle from './Idle';\n\nimport { Math as TMath } from 'three';\n\nexport default class Animating\n{\n constructor()\n {\n this.t = 0;\n this.easing_function_t = 0;\n }\n\n get is_animating()\n {\n return true;\n }\n\n on_enter(animator)\n {\n }\n\n update(animator)\n {\n this.t += Time.delta_time / animator.duration;\n\n this.easing_function_t = animator.easing_function(this.t);\n this.easing_function_t = TMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(TMath.lerp(animator.from, animator.to, this.easing_function_t));\n\n if (this.easing_function_t >= 0.9999)\n {\n animator.set_property_value(animator.to);\n\n animator.set_current_state(new Idle());\n animator.finished_callback(animator);\n }\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Animating from './css_animator_states/Animating';\nimport Idle from './css_animator_states/Idle';\nimport EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class CSSAnimator\n{\n constructor({\n element,\n css_property,\n from = 0,\n to = 1,\n duration = 1,\n value_prefix = '',\n value_suffix = '',\n easing_function = EasingFunctions.ease_in_out_cubic,\n finished_callback = () =>\n {}\n })\n {\n this.element = element;\n this.css_property = css_property;\n this.from = from;\n this.to = to;\n this.value_prefix = value_prefix;\n this.value_suffix = value_suffix;\n this.duration = duration;\n this.easing_function = easing_function;\n this.finished_callback = finished_callback;\n\n this.current_state = new Idle();\n }\n\n animate()\n {\n this.set_current_state(new Animating());\n }\n\n stop()\n {\n this.set_current_state(new Idle());\n }\n\n set_property_value(value)\n {\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\n }\n\n update()\n {\n this.current_state.update(this);\n }\n\n get is_animating()\n {\n return this.current_state.is_animating;\n }\n\n set_current_state(state)\n {\n this.current_state.on_exit(this);\n this.current_state = state;\n this.current_state.on_enter(this);\n }\n}\n","\nimport { Object3D } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { AlwaysDepth } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { Line } from 'three';\n\nexport default class AxisHelper extends Object3D\n{\n constructor(scale = 1.0)\n {\n super();\n\n const blue_points = [];\n blue_points.push(new Vector3(0, 0, 0));\n blue_points.push(new Vector3(0, 0, 1000));\n\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\n blue_axis_line.renderOrder = 50000;\n\n const green_points = [];\n green_points.push(new Vector3(0, 0, 0));\n green_points.push(new Vector3(0, 1000, 0));\n\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\n green_axis_line.renderOrder = 50000;\n\n const red_points = [];\n red_points.push(new Vector3(0, 0, 0));\n red_points.push(new Vector3(1000, 0, 0));\n\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\n red_axis_line.renderOrder = 50000;\n\n this.renderOrder = 100000;\n\n this.add(blue_axis_line);\n this.add(green_axis_line);\n this.add(red_axis_line);\n\n this.scale.set(scale, scale, scale);\n }\n\n update()\n {\n }\n\n dispose()\n {\n }\n}\n","import { Scene } from 'three';\n\nclass SceneManager\n{\n init()\n {\n this._current = new Scene();\n this._current.name = 'default_scene';\n }\n\n add_scene(name)\n {\n\n }\n\n get current()\n {\n return this._current;\n }\n\n set current(scene)\n {\n this._current = scene;\n }\n\n dispose()\n {\n this.current.traverse(child =>\n {\n if (child.geometry)\n {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n\n while (this.current.children.length > 0)\n {\n this.current.remove(this.current.children[0]);\n }\n }\n}\n\nexport default new SceneManager();\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nexport default class Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n const cone_height = 0.4;\n const cylinder_height = length - cone_height;\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n const material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n","import { Vector2 } from 'three';\n\nclass OScreen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n\n get portrait()\n {\n return this.width < this.height;\n }\n}\n\nexport default new OScreen();\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nexport default class ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n const vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n const frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n","import { Color } from 'three';\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\n\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\n{\n constructor(fov, aspect, near, far)\n {\n super(fov, aspect, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n}\n","import AxisHelper from './components/AxisHelper';\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\nimport SceneManager from './SceneManager';\nimport Cube from './primitives/Cube';\nimport Sphere from './primitives/Sphere';\nimport Arrow from './primitives/Arrow';\nimport OScreen from './OScreen';\nimport ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Vector4 } from 'three';\nimport { Mesh } from 'three';\nimport { Box3 } from 'three';\nimport { Box3Helper } from 'three';\nimport { Scene } from 'three';\nimport { CatmullRomCurve3 } from 'three';\nimport { SphereGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport PerspectiveCamera from './PerspectiveCamera';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera();\n // this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n SceneManager.current.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n SceneManager.current.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n SceneManager.current.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneBufferGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n SceneManager.current.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n SceneManager.current.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneBufferGeometry(1, 1), new ScreenSpaceTextureMaterial());\n this.display_texture_meshes.push(mesh);\n this.scene.add(mesh);\n\n mesh.material.set_texture(tex, w, h);\n return mesh;\n }\n\n render(graphics)\n {\n for (let i = 0; i < this.display_texture_meshes.length; i++)\n {\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, this.camera);\n }\n }\n}\n\nexport default new Debug();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nexport default class ClearDepthNormalMaterial extends BlitMaterial\n{\n constructor(clear_depth, clear_normal)\n {\n super(frag);\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\n }\n}\n","import vert from '../shaders/depth_normals/depth_normals.vert';\nimport frag from '../shaders/depth_normals/depth_normals.frag';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class DepthNormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n _FarPlane: { value: 1 }\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n\n set far_plane(value)\n {\n this.uniforms._FarPlane.value = value;\n }\n\n get far_plane()\n {\n return this.uniforms._FarPlane.value;\n }\n}\n","import CameraManager from '../CameraManager';\nimport OScreen from '../OScreen';\n\nimport ClearDepthNormalMaterial from '../materials/ClearDepthNormalMaterial';\nimport DepthNormalMaterial from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\n this.depth_normal_material = new DepthNormalMaterial();\n }\n\n render(graphics)\n {\n this.__resize_RT_if_necessary();\n\n graphics.clear(this.RT, undefined, true, true);\n\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\n\n this.depth_normal_material.far_plane = CameraManager.current.far;\n\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\n }\n\n __resize_RT_if_necessary()\n {\n if (this.RT.width !== OScreen.width || this.RT.height !== OScreen.height)\n {\n this.RT.setSize(OScreen.width, OScreen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nexport default class Blitter\n{\n constructor(renderer)\n {\n this.renderer = renderer;\n this._blit_scene = new Scene();\n this._blit_material = new BlitMaterial();\n this._blit_quad = new Mesh(\n new PlaneBufferGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n const current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n","import Configuration from './Configuration';\nimport BaseRender from './render_mode/BaseRender';\nimport OScreen from './OScreen';\nimport CameraManager from './CameraManager';\nimport SceneManager from './SceneManager';\nimport Capabilities from './Capabilities';\nimport DepthAndNormalsRenderer from './render_utilities/DepthAndNormalsRenderer';\nimport Blitter from './render_utilities/Blitter';\n\nimport { WebGLRenderer } from 'three';\n\nclass Graphics\n{\n init(canvas, context_attributes)\n {\n this._renderer = undefined;\n this.blitter = undefined;\n this.canvas = undefined;\n this.no_render = undefined;\n this.current_render_mode = undefined;\n this.generateDepthNormalTexture = false;\n this.depth_and_normals_renderer = undefined;\n\n this.is_webgl2 = false;\n this.canvas_context = undefined;\n this.context_attributes = undefined;\n\n this.context_attributes = {\n alpha: true,\n depth: true,\n desynchronized: false,\n stencil: false,\n antialias: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n powerPreference: 'high-performance',\n logarithmicDepthBuffer: false,\n force_webgl2: true,\n xr_enabled: false\n };\n\n Object.assign(this.context_attributes, context_attributes);\n\n if (this.context_attributes.force_webgl2)\n {\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\n canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n else\n {\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\n\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\n\n this._renderer = new WebGLRenderer({\n canvas: canvas,\n context: this.canvas_context\n });\n\n if (this.context_attributes.xr_enabled)\n {\n this._renderer.xr.enabled = true;\n }\n\n this._renderer.autoClear = false;\n\n this._renderer.setPixelRatio(1);\n\n OScreen.dpr = Configuration.dpr;\n\n if (!this.is_webgl2)\n {\n this._renderer.extensions.get('ANGLE_instanced_arrays');\n }\n\n this.blitter = new Blitter(this._renderer);\n\n this.canvas = this._renderer.domElement;\n\n this.no_render = new BaseRender();\n\n this.current_render_mode = this.no_render;\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\n Capabilities.fp_textures_available = this._renderer.capabilities.floatVertexTextures;\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n OScreen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (const entry of entries)\n {\n OScreen.dpr = Configuration.dpr;\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = OScreen.render_width;\n this.canvas.height = OScreen.render_height;\n\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\n {\n // const ctx = this;\n\n const old_width = OScreen.width;\n const old_height = OScreen.height;\n\n const new_width = width;\n const new_height = height;\n\n const tile_width = 1024;\n const tile_height = 1024;\n\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n OScreen.update_size(tile_width, tile_height);\n const old_dpr = this._renderer.getPixelRatio();\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n const canvas_2d = document.createElement('canvas');\n const ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n\n for (let x = 0; x < divisions_x; x++)\n {\n for (let y = 0; y < divisions_y; y++)\n {\n CameraManager.current.setViewOffset(new_width, new_height,\n OScreen.width * x, OScreen.height * y,\n OScreen.width, OScreen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.height * y);\n }\n }\n\n // transform the result canvas into a blob\n // from them the callback turns into a ULR and download it\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\n\n CameraManager.current.clearViewOffset();\n\n OScreen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(old_dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n const link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n}\n\nexport default new Graphics();\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\nimport NormalMaterial from '../materials/NormalMaterial';\n\nexport default class DebugNormalsRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\n }\n}\n","export default class KeyboardInput\n{\n init(container)\n {\n this.ctrlz_pressed = false;\n this.ctrlz_fired = false;\n\n this.keys = {};\n this.keys_keys = [];\n this.container = container;\n\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\n }\n\n on_key_down(e)\n {\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\n {\n this.ctrlz_pressed = true;\n this.ctrlz_fired = true;\n }\n if (e.key)\n {\n this.press_key(e.key);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.key);\n }\n\n clear()\n {\n this.ctrlz_pressed = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].pressed = false;\n this.keys[this.keys_keys[i]].released = false;\n }\n }\n\n release_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n key.fired = false;\n key.down = false;\n key.released = true;\n }\n }\n\n release_keys()\n {\n this.ctrlz_fired = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].fired = false;\n this.keys[this.keys_keys[i]].down = false;\n }\n }\n\n press_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n if (key.down === false)\n {\n key.pressed = true;\n }\n key.down = true;\n key.fired = true;\n }\n }\n\n is_key_pressed(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.pressed;\n }\n return false;\n }\n\n is_key_down(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.down;\n }\n return false;\n }\n\n is_key_released(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.released;\n }\n\n return false;\n }\n\n register_key(key)\n {\n this.keys[key] =\n {\n key_name: key,\n pressed: false,\n down: false,\n fired: false\n };\n\n this.keys_keys = Object.keys(this.keys);\n }\n\n unregister_key(key_name)\n {\n delete this.keys[key_name];\n }\n\n dispose()\n {\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\n }\n}\n","import { InputController } from 'pit-js';\nimport KeyboardInput from './KeyboardInput';\n\nclass Input extends InputController\n{\n constructor()\n {\n super();\n\n this.clicked = false;\n this.captured_NDC = { x: 0, y: 0 };\n this.current_NDC_delta = { x: 0, y: 0 };\n\n this.keyboard = new KeyboardInput();\n }\n\n init(container, keyboard_input_container)\n {\n super.init(container);\n\n this.keyboard.init(keyboard_input_container);\n }\n\n dispose()\n {\n super.dispose();\n\n this.keyboard.dispose();\n }\n\n update()\n {\n if (this.left_mouse_button_pressed)\n {\n this.captured_NDC.x = this.NDC.x;\n this.captured_NDC.y = this.NDC.y;\n }\n\n if (this.left_mouse_button_down)\n {\n this.current_NDC_delta.x += Math.abs(this.NDC_delta.x);\n this.current_NDC_delta.y += Math.abs(this.NDC_delta.y);\n }\n\n if (this.left_mouse_button_released)\n {\n if (this.current_NDC_delta.x < 0.001 || this.current_NDC_delta.y < 0.001)\n {\n this.clicked = true;\n }\n\n this.current_NDC_delta = { x: 0, y: 0 };\n }\n }\n\n clear()\n {\n super.clear();\n\n this.clicked = false;\n\n this.keyboard.clear();\n }\n}\n\nexport default new Input();\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nexport default new OS();\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nexport default new ReflectionPlaneContext();\n","import { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Mesh } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBAFormat } from 'three';\nimport { RGBFormat } from 'three';\nimport { FloatType } from 'three';\n\nexport default class GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n const src_tex = this.__create_rgb_texture(this.batch_width);\n const dst_tex = this.__create_rgb_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgb_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_texture(this.batch_width);\n const dst_tex = this.__create_rgba_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_float_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n const index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n const data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n const data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n const data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n","import GeometryBatch from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { Math as TMath } from 'three';\nimport { BufferAttribute } from 'three';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n const attr_accessor_uvs = [];\n const texture_width = TMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\n const y = Math.floor(i / texture_width);\n const x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nexport default new GeometryBatcher();\n","import Input from './Input';\nimport CameraManager from './CameraManager';\nimport Graphics from './Graphics';\n\nimport { Vector2 } from 'three';\nimport { Scene } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass UI\n{\n init()\n {\n this.ui_elements = [];\n this._tmp_normalized_pos = new Vector2();\n this.ss_scene = new Scene();\n this.ss_scene.autoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.autoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -OScreen.width / 2;\n // this.ss_camera.right = OScreen.width / 2;\n // this.ss_camera.top = OScreen.top / 2;\n // this.ss_camera.right = -OScreen.bottom / 2;\n this.ss_camera.updateProjectionMatrix();\n\n this._tmp_normalized_pos.copy(Input.NDC);\n for (let i = 0; i < this.ui_elements.length; i++)\n {\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\n }\n }\n\n render(renderer)\n {\n // renderer.render_ui(this.scene);\n if (this.ss_scene.children.length > 0)\n {\n Graphics.render(this.ss_scene, this.ss_camera);\n }\n if (this.ws_scene.children.length > 0)\n {\n Graphics.render(this.ws_scene, CameraManager.current);\n }\n }\n\n clear()\n {\n this.current_clicked_element = undefined;\n }\n}\n\nexport default new UI();\n","import CameraManager from '../CameraManager';\nimport Input from '../Input';\nimport OMath from '../utilities/OMath';\nimport OScreen from '../OScreen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\n\nclass CameraUtilities\n{\n init()\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || Input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (OScreen.aspect_ratio / object_aspect > 1)\n {\n return OScreen.height / obj_y;\n }\n else\n {\n return OScreen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -OScreen.width / 2;\n camera.right = OScreen.width / 2;\n camera.top = OScreen.height / 2;\n camera.bottom = -OScreen.height / 2;\n camera.aspect = OScreen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n}\n\nexport default new CameraUtilities();\n","import Browser from './Browser';\nimport CameraManager from './CameraManager';\nimport Capabilities from './Capabilities';\nimport Configuration from './Configuration';\nimport Debug from './Debug';\nimport EventManager from './EventManager';\nimport Graphics from './Graphics';\nimport Input from './Input';\nimport OS from './OS';\nimport OScreen from './OScreen';\nimport ReflectionPlaneContext from './ReflectionPlaneContext';\nimport ResourceContainer from './ResourceContainer';\nimport SceneManager from './SceneManager';\nimport GeometryBatcher from './static_batcher/GeometryBatcher';\nimport Time from './Time';\nimport UI from './UI';\nimport CameraUtilities from './utilities/CameraUtilities';\n\nclass Initializer\n{\n constructor()\n {\n }\n\n init(canvas, app_container, context_attributes, keyboard_input_container = document)\n {\n CameraManager.init();\n CameraUtilities.init();\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n Input.init(app_container, keyboard_input_container);\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.init();\n Time.init();\n UI.init();\n\n Graphics.init(canvas, context_attributes);\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.dispose();\n Input.dispose();\n SceneManager.dispose();\n\n render_loop.dispose();\n }\n}\n\nexport default new Initializer();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Math as TMath } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nexport default class SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n const sample_kernel = [];\n const kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n const dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = TMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n const rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nexport default class SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nexport default class DisplayNormalTextureMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, depth_normals_vert);\n this.uniforms._FarPlane = { value: 1 };\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class Blurrer\n{\n constructor(renderer)\n {\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.box_blur_mat = new BoxBlurMaterial();\n }\n\n blur(RT)\n {\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\n {\n this.RT1.setSize(RT.width, RT.height);\n this.RT2.setSize(RT.width, RT.height);\n }\n\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\n // return this.RT2;\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport OScreen from '../OScreen';\nimport BaseRender from '../render_mode/BaseRender';\nimport Configuration from '../Configuration';\nimport SSAOMaterial from '../materials/SSAOMaterial';\nimport SSAOComposeMaterial from '../materials/SSAOComposeMaterial';\nimport DisplayNormalTextureMaterial from '../materials/DisplayNormalTextureMaterial';\nimport Blurrer from '../render_utilities/Blurrer';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class NormalAORender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.ssao_mat = new SSAOMaterial();\n this.ssao_compose_mat = new SSAOComposeMaterial();\n this.debug_normals = new DisplayNormalTextureMaterial();\n\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\n\n this.main_RT = new WebGLRenderTarget(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.blurrer = new Blurrer();\n Graphics.generateDepthNormalTexture = true;\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n this.__update_uniforms();\n\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\n\n // // BLUR\n this.blurrer.blur(this.SSAO_RT);\n Graphics.blit(this.SSAO_RT, undefined);\n\n // // COMPOSE\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\n\n // Graphics.blit(this.SSAO_RT, undefined);\n }\n\n __update_uniforms()\n {\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\n {\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\n\nexport default class NormalRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current);\n }\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\nimport { Color } from 'three';\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n const bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/add/add.frag';\n\nexport default class AddMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag);\n\n this.uniforms._SecondTex = { value: undefined };\n }\n\n set_add_texture(tex)\n {\n this.uniforms._SecondTex.value = tex;\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\nimport { Vector2 } from 'three';\n\nexport default class GaussianBlurMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag, undefined, {\n KERNEL_RADIUS: kernel_radius,\n SIGMA: kernel_radius\n });\n\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\n }\n\n set_size(w, h)\n {\n this.uniforms.texSize.value.x = w;\n this.uniforms.texSize.value.y = h;\n }\n\n set_direction(x, y)\n {\n this.uniforms.direction.value.set(x, y);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\nimport { Color } from 'three';\nexport default class LuminosityHighPassMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag);\n\n this.uniforms.luminosityThreshold = { value: 0.23 };\n this.uniforms.smoothWidth = { value: 0.01 };\n this.uniforms.defaultColor = { value: new Color('#000000') };\n this.uniforms.defaultOpacity = { value: 0.0 };\n }\n}\n","import GaussianBlurMaterial from '../materials/GaussianBlurMaterial';\nimport LuminosityHighPassMaterial from '../materials/LuminosityHighPassMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nexport default class GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n const mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n","import OScreen from '../OScreen';\nimport BaseRender from '../render_mode/BaseRender';\nimport UnrealBloomComposeMaterial from '../materials/UnrealBloomComposeMaterial';\nimport AddMaterial from '../materials/AddMaterial';\n\nimport { WebGLRenderTarget } from 'three';\n\nimport GaussianBlurrer from '../render_utilities/GaussianBlurrer';\nimport Graphics from '../Graphics';\nimport CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\n\nexport default class UnrealBloomRender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.bloom_compose_mat = undefined;\n\n this.main_RT = undefined;\n this.blur_RT = undefined;\n this.blurrer = undefined;\n\n this.add_mat = new AddMaterial();\n }\n\n on_enter()\n {\n this.blurrer = new GaussianBlurrer();\n this.main_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\n this.blur_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.render_height);\n\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\n this.blurrer = new GaussianBlurrer(5);\n\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\n\n this.bloom_compose_mat.set_bloom_strength(1);\n this.bloom_compose_mat.set_bloom_radius(1);\n\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\n }\n\n set_bloom_strength(val)\n {\n this.bloom_compose_mat.set_bloom_strength(val);\n }\n\n set_bloom_radius(val)\n {\n this.bloom_compose_mat.set_bloom_radius(val);\n }\n\n set_tint_color_0(col_string)\n {\n this.bloom_compose_mat.set_tint_color_0(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.bloom_compose_mat.set_tint_color_1(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.bloom_compose_mat.set_tint_color_2(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.bloom_compose_mat.set_tint_color_3(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.bloom_compose_mat.set_tint_color_4(col_string);\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n // // BLUR\n this.blurrer.blur(this.main_RT, true);\n\n // Blur compose\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\n\n // Additive blend\n Graphics.blit(this.main_RT, undefined, this.add_mat);\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.render_width || this.main_RT.height !== OScreen.render_height)\n {\n this.main_RT.setSize(OScreen.render_width, OScreen.render_height);\n this.blur_RT.setSize(OScreen.render_width, OScreen.render_height);\n }\n }\n}\n","import { Color } from 'three';\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\n\nexport default class OrthographicCamera extends THREEOrthographicCamera\n{\n constructor(left, right, top, bottom, near, far)\n {\n super(left, right, top, bottom, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n}\n","import ViewManager from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n this.__set_components_opacities();\n\n for (const component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n\n __set_components_opacities()\n {\n for (let i = 0; i < this.components.length; i++)\n {\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\n }\n }\n}\n\nexport default new ViewComponentManager();\n","import Time from './Time';\nimport Input from './Input';\nimport UI from './UI';\nimport Debug from './Debug';\nimport BaseApplication from './BaseApplication';\nimport ViewManager from './view_components/ViewManager';\nimport ViewComponentManager from './view_components/ViewComponentManager';\n\nexport default class RenderLoop\n{\n constructor(target_application, graphics)\n {\n target_application = target_application || new BaseApplication();\n\n this.target_application = target_application;\n this.graphics = graphics;\n\n this.is_running = false;\n this.frames_passed = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n Input.update();\n\n this.target_application.update();\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n Input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\n }\n\n stop()\n {\n if (this.is_running === false) return; // sanity check\n\n this.is_running = false;\n this.target_application.on_exit();\n\n this.graphics._renderer.setAnimationLoop(null);\n }\n\n set_state(new_state)\n {\n this.target_application.on_exit(this);\n this.target_application = new_state;\n this.target_application.on_enter(this);\n }\n\n dispose()\n {\n this.stop();\n this.frames_passed = 0;\n }\n}\n","import OScreen from './OScreen';\n\nclass Screen\n{\n init()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.init();\n }\n\n update_position(x, y)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_position(x, y);\n }\n\n update()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update();\n }\n\n update_size(width, height)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_size(width, height);\n }\n\n apply_pixel_density_v2(vector2)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density_v2(vector2);\n }\n\n apply_pixel_density(value)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density(value);\n }\n\n get_pixel_size()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.get_pixel_size();\n }\n\n get aspect_ratio()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.aspect_ratio;\n }\n}\n\nexport default new Screen();\n","\nimport CanvasDrawer from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nexport default class SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n const text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n","import HTMLUtilities from '../utilities/HTMLUtilities';\nimport ViewComponentManager from './ViewComponentManager';\n\nexport default class ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n this.hidden = true;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n\n this.hidden = false;\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n\n this.hidden = true;\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n this.toggle_hidden();\n }\n\n toggle_hidden()\n {\n if (this.container.style.opacity > 0.001)\n {\n if (this.hidden)\n {\n this.on_enter();\n }\n }\n else\n {\n if (!this.hidden)\n {\n this.on_exit();\n }\n }\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n}\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneBufferGeometry } from 'three';\n\nexport default class HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneBufferGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneBufferGeometry(width, height);\n super(geometry, material);\n }\n}\n","export default class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n const items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n const index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n const ids = Object.keys(obj);\n const arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nexport default class FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = Math.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nexport default class GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n const indices = geometry_buffer.index;\n const positions = geometry_buffer.getAttribute('position');\n\n const bar_coordinates = [];\n const vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n const geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n const bar_coordinates = [];\n const positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n","import { Vector4 } from 'three';\n\nexport default class ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n const canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n const context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n const position = (x + imagedata.width * y) * 4;\n const data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n","import { Vector3 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n const face_areas = [];\n\n let min_area = 99999999;\n\n const vertices = buffer_geometry.getAttribute('position');\n const normals = buffer_geometry.getAttribute('normal');\n const indices = buffer_geometry.index;\n\n const faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n const index_0 = indices.array[i + 0];\n const index_1 = indices.array[i + 1];\n const index_2 = indices.array[i + 2];\n\n const v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n const v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n const v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n const face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n const n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n const normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n faces.push(face);\n\n const area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n const sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n const sampled_points = [];\n const sampled_normals = [];\n for (let i = 0; i < faces.length; i++)\n {\n const face = faces[i];\n\n const w1 = Math.random();\n const w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals };\n }\n\n select_random_faces(faces, amount)\n {\n const selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n const random = Math.floor(Math.random() * faces.length);\n const selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n const extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n const vec1 = face.b.clone().sub(face.a);\n const vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n const w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nexport default new MeshSampler();\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n const geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (const name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nexport default new ModelUtilities();\n","export default 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","export default class StringUtilities\n{\n constructor()\n {}\n\n static capitalize(string)\n {\n const words = string.split(' ');\n\n for (let i = 0; i < words.length; i++)\n {\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\n }\n\n return words.join(' ');\n }\n\n static capitalize_first_letter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static snake_to_camelcase(string)\n {\n return string.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase()\n .replace('-', '')\n .replace('_', '')\n );\n }\n}\n","export default class TimeUtilities\n{\n constructor()\n {}\n\n // Converts a time string (00:00:00.45) into miliseconds\n time_str_to_ms(time_str)\n {\n time_str = time_str.split(':');\n\n let hours = Number(time_str[0]);\n hours = hours * 60 * 60 * 1000;\n\n let minutes = Number(time_str[1]);\n minutes = minutes * 60 * 1000;\n\n let seconds = Number(time_str[2]);\n seconds = seconds * 1000;\n\n return hours + minutes + seconds;\n }\n}\n","import { Vector3, Plane, Quaternion, Sphere, Math as TMath, Line3 } from 'three';\nexport default class PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = TMath.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import { Vector3, Box3 } from 'three';\n\nexport default class OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n const inverse_camera_quat = camera_quaternion.clone().inverse();\n\n const inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n const box = new Box3().setFromPoints(inverted_points);\n const size = new Vector3();\n box.getSize(size);\n\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n const center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\nimport GeometryUtilities from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneBufferGeometry } from 'three';\n\nexport default class Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneBufferGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n","import WorldImage from './WorldImage';\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nexport default class Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\nimport BaseShaderMaterial from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport OScreen from '../OScreen';\n\nexport default class UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n","import { Vector2 } from 'three';\n\nexport default class ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n","import CameraManager from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n","export default class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n","\nimport OScreen from '../OScreen';\n\nimport UIElementMaterial from '../materials/UIElementMaterial';\n\nimport ScreenSpacePosition from '../ui/ui_element_position/ScreenSpacePosition';\nimport WorldSpacePosition from '../ui/ui_element_position/WorldSpacePosition';\n\nimport OnIdle from '../ui/ui_element_state/OnIdle';\nimport OnMouseEnter from '../ui/ui_element_state/OnMouseEnter';\nimport OnMouseExit from '../ui/ui_element_state/OnMouseExit';\nimport OnMouseHover from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nexport default class UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n // OScreen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n","import { Mesh } from 'three';\n\nexport default class UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n","import { Vector2, Vector4 } from 'three';\n\nexport default class TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport TextGlyph from './TextGlyph';\n\nexport default class SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter, Math as TMath } from 'three';\n\nexport default class SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = TMath.lerp(0.5, 0.2, value);\n }\n}\n","import SDFText from './SDFText';\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneBufferGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nexport default class SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneBufferGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\n\nexport default class VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nexport default class MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nexport default class DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nexport default class AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n","import DualFilteringBlurMaterial from '../materials/DualFilteringBlurMaterial';\nimport AlphaFilterMaterial from '../materials/AlphaFilterMaterial';\nimport Graphics from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nexport default class DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { Points } from 'three';\n\nexport default class GPUParticleSystem extends Object3D\n{\n constructor()\n {\n super();\n this.attributes = [];\n\n this.particles = undefined;\n }\n\n set_from_geometry(geometry, material, init_attribute_uvs)\n {\n // let position = new ParticlePositionAttribute(\"_Position\");\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\n {\n const uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\n geometry.setAttribute('storage_uv', uv_storage_attr);\n }\n // position.init_from_geometry(geometry);\n // this.attributes.push(position);\n\n // material.uniforms._Position.value = position.read.texture;\n\n const points = new Points(geometry, material);\n points.frustumCulled = false;\n this.particles = points;\n\n this.add(points);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n\n }\n\n add_attribute(name, buffer_attribute)\n {\n\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const resolution = this.calculate_resolution(particle_count);\n const uvs = new Float32Array(particle_count * 2);\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\n {\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\n }\n\n return new BufferAttribute(uvs, 2);\n }\n\n calculate_resolution(particle_count)\n {\n return Math.ceil(Math.sqrt(particle_count));\n }\n\n update()\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update();\n }\n }\n\n set_attribute_update_material(attribute_name, mat)\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n if (this.attributes[i].name === attribute_name)\n {\n this.attributes[i].update_material = mat;\n }\n }\n }\n\n dispose()\n {\n this.particles.geometry.dispose();\n this.particles.material.dispose();\n }\n}\n","import { DataTexture } from 'three';\n\nexport default class CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nexport default class RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nexport default class RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nexport default class RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nexport default class RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n","import { Mesh } from 'three';\nimport RGBDataTexture from '../data_textures/RGBDataTexture';\nimport RGBADataTexture from '../data_textures/RGBADataTexture';\nimport RGBFloatDataTexture from '../data_textures/RGBFloatDataTexture';\nimport RGBAFloatDataTexture from '../data_textures/RGBAFloatDataTexture';\n\nexport default class BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n","import BatchedMesh from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nexport default class MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nexport default class AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport AudioClip from '../components/AudioClip';\r\n\r\nimport { AudioContext } from 'three';\r\n\r\nexport default class 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, response)\r\n {\r\n if (!window.user_interaction_for_audio)\r\n {\r\n setTimeout(this.on_preloaded_finished.bind(this, resource_container, response), 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, response);\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, response)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n const context = AudioContext.getContext();\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}\r\n","import AbstractLoader from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nexport default class BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\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');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader 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 THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class 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 THREEColladaLoader.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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class 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 THREEFileLoader();\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","import AbstractLoader from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nexport default class FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\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');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class 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 THREEGLTFLoader.GLTFLoader();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class 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 THREEGLTFLoader.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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader 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 THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\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.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (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","import AbstractLoader from './AbstractLoader';\n\nexport default class JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\n\nexport default class OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEOBJLoader.OBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\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');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport { Vector3 as THREEVector3 } from 'three';\nimport { FileLoader as THREEFileLoader } from 'three';\n\nexport default class PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEFileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new THREEVector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\n\nimport { UnsignedByteType as THREEUnsignedByteType } from 'three';\n\nexport default class RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREERGBELoader.RGBELoader();\n this.loader.setDataType(THREEUnsignedByteType);\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\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');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class 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 THREEFileLoader();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class AsyncTextureLoader 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 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.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, 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\nimport { Texture } from 'three';\r\n\r\nexport default class 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","import AbstractLoader from './AbstractLoader';\n\nexport default class VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n","import ResourceContainer from '../ResourceContainer';\r\n\r\nexport default class 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"],"names":["init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","constructor","static","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","TMath","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","get_keyframes","channel_name","is_channel_redefined","initial","saturate","current","Infinity","distance","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","EasingFunctions","NumberInterpolator","super","app","set_app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","initial_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","find","element","sequencer","action_event","state","from_draw_io","xml","transition_data","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","fire","event","payload","on","callback","fire_zoom_changed","zoom","fire_store_selected","store_id","fire_point_selected","hit_data","fire_config_changed","fire_path_substep_completed","step_number","fire_path_completed","fire_step_selected","step_index","fire_go_to_store_requested","fire_resource_loaded","resource","fire_service_clicked","service","fire_unit_position_updated","unit_data","fire_floor_switched","floor_id","fire_on_enter_floor_navigation","fire_on_exit_floor_navigation","fire_on_enter_floor_selection","fire_on_exit_floor_selection","fire_on_enter_outside_navigation","fire_on_exit_outside_navigation","resources","EventManager","get_resource","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_initial_state_data","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","__update","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_images","load_html_videos","load_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","_current","camera","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","parameters","dpr","from_json","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","animate","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","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","set","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","tex","set_screen_size","PerspectiveCamera","THREEPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","copy","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneBufferGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","SphereGeometry","sphere_mesh","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","OScreen","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","blit","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","material_pass","mat","blit_with_material","dst_RT","current_rt","getRenderTarget","setRenderTarget","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","xr_enabled","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","key","press_key","release_key","pressed","released","key_name","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","left_mouse_button_pressed","NDC","left_mouse_button_down","NDC_delta","left_mouse_button_released","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","os","test","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","index","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","ui_elements","_tmp_normalized_pos","ss_scene","autoUpdate","ws_scene","ss_camera","delete_element","elem","splice","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","Input","update_state","current_clicked_element","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","applyQuaternion","get_forward_dir","get_right_dir","unproject_mouse_position","v_fov","h_fov","atan","tan","distV","distH","get_plane_intersection","plane_position","plane_normal","setFromNormalAndCoplanarPoint","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","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","AddMaterial","_SecondTex","set_add_texture","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","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","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","val","THREEOrthographicCamera","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","is_running","frames_passed","ViewComponentManager","setAnimationLoop","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","fit_points","camera_quaternion","vertical_fov","degToRad","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","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","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_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","sample","sample_count","face_areas","min_area","normals","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","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","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","words","substr","join","charAt","slice","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance_to_center","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","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","PlaneGeometry","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","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","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","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","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","remove_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","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","type","median_filter_mat","filter","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","GPUParticleSystem","particles","set_from_geometry","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","add_texture_attribute","add_attribute","particle_count","resolution","calculate_resolution","set_attribute_update_material","update_material","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","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","user_interaction_for_audio","instantiate_audio","setTimeout","arrayBuffer","array_buffer","AudioContext","decodeAudioData","audio_buffer","BasisLoader","loader","basis","xhr","msg","CubemapLoader","THREECubeTextureLoader","setPath","urls","DAELoader","THREEColladaLoader","ColladaLoader","FileLoader","THREEFileLoader","file","FontLoader","TFontLoader","GLTFLoader","THREEGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","THREEOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","THREEVector3","RGBETextureLoader","THREERGBELoader","RGBELoader","THREEUnsignedByteType","TextLoader","AsyncTextureLoader","Texture","Image","onload","onerror","original_url","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"woDA8EA,OAAe,IA7Ef,MAEEA,OAKE,OAHAC,KAAKC,aAAe,GACpBD,KAAKE,MAAQC,OAAOC,UAAUC,UAAUC,eAEhC,GAER,KAAKN,KAAKE,MAAMK,QAAQ,SAAW,EACjCP,KAAKC,aAAe,UACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,QAAU,EAChCP,KAAKC,aAAe,gBACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,QAAU,KAAOJ,OAAOK,IAC9CR,KAAKC,aAAe,QACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,WAAa,KAAOJ,OAAOM,OACjDT,KAAKC,aAAe,SACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,YAAc,EACpCP,KAAKC,aAAe,YACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,YAAc,EACpCP,KAAKC,aAAe,UACpB,MACF,KAAKD,KAAKE,MAAMK,QAAQ,WAAa,EACnCP,KAAKC,aAAe,SACpB,MACF,QACED,KAAKC,aAAe,SAKpBS,WAEF,OAAOV,KAAKC,aAGVU,gBAEF,MAA6B,WAAtBX,KAAKC,aAGVW,gBAEF,MAA6B,WAAtBZ,KAAKC,aAGVY,cAEF,MAA6B,YAAtBb,KAAKC,aAGVa,uBAEF,MAA6B,kBAAtBd,KAAKC,aAGVc,eAEF,OAAOf,KAAKY,WAAaZ,KAAKgB,YAAchB,KAAKc,iBAG/CG,eAEF,OAAOjB,KAAKW,UAGVO,gCAEF,OAAOlB,KAAKe,SAAW,OAASf,KAAKiB,SAAW,WAAa,QC1ElD,MAAME,GAEnBC,eAGAC,cAAcC,GAEZ,OAAOC,OAAOD,KAAOA,GAAKA,EAAI,GAAM,EAGtCD,gBAAgBC,GAEd,OAAOC,OAAOD,KAAOA,GAAKA,EAAI,GAAM,EAGtCD,iBAAiBC,GAEf,OAAOtB,KAAKwB,OAAOF,IAAMtB,KAAKyB,SAASH,GAGzCD,eAAeK,GAEb,IAEEC,KAAKC,MAAMF,GAEb,MAAOG,GAEL,OAAO,EAGT,OAAO,GC5BI,MAAMC,GAEnBV,YAAYW,EAAaC,EAAKC,EAAO,GAEnCjC,KAAK+B,YAAcA,EACnB/B,KAAKgC,IAAMA,EACXhC,KAAKkC,aAAe,EACpBlC,KAAKmC,YAAcF,EAEnBjC,KAAKoC,cAAe,EACpBpC,KAAKqC,WAAY,EACjBrC,KAAKsC,cAAgB,OAGvBC,0BAA0BC,EAAQC,GAEhCD,EAASrB,GAAWuB,UAAUF,GAAUA,EAAS,EACjDC,EAAStB,GAAWuB,UAAUD,GAAUA,EAAS,EAEjDzC,KAAKkC,aAAeM,EAEhBC,EAAQ,IAEVzC,KAAKmC,YAAcM,GAGjBzC,KAAKkC,aAAelC,KAAKmC,aAE3BQ,QAAQC,KAAK,8EAA+E5C,KAAKgC,KAIrGa,kBAEE7C,KAAKoC,cAAe,EAGtBU,YAAYC,GAEV/C,KAAKqC,WAAY,EACjBrC,KAAKsC,cAAgBS,EAGvBC,cAEEL,QAAQM,MAAM,uBAAyBjD,KAAK+B,YAAc,cAAgB/B,KAAKgC,IAAM,SAAWhC,KAAKsC,eAGvGY,KAAKC,GAEH,QAAsDC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAC7C,CACE,MAAMsB,EAAQC,GAAQ5C,UAAY,WAAa,UAE/C6C,MAAMxD,KAAKgC,IAAK,CACdyB,OAAQ,MACRC,KAAM,OACNJ,MAAOA,EACPK,YAAa,cACbC,SAAU,WAETC,KAAK7D,KAAK8D,YAAYC,KAAK/D,KAAMmD,IACjCa,MAAMhE,KAAKiE,WAAWF,KAAK/D,YAI9BmD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,kBAITsB,kBAAkBhB,EAAoBiB,GAEpC,MAAMC,EAAiBD,EAASE,QAC1BC,EAASH,EAASI,KAAKC,YAGvBC,GAAiBN,EAASO,QAAQC,IAAI,kBAG5C,IAAIC,EAAiB,EAErB,OACA,CACE,MAAMC,KAAEA,EAAIC,MAAEA,SAAgBR,EAAOS,OAErC,GAAIF,EAEF,MAGFD,GAAkBE,EAAME,OAExBjF,KAAKuC,0BAA0BsC,EAAgBH,GAIjD1E,KAAKkF,sBAAsB/B,EAAoBkB,GAGjDa,sBAAsB/B,EAAoBiB,IAI1CH,WAAWkB,GAETxC,QAAQM,MAAMkC,IC5GH,MAAMC,GAEnBhE,eAGAC,kBAAkB0D,EAChBM,EACAC,EACAC,EACAC,GAEA,OAAST,EAAQM,IAA2BC,EAAuBD,IAA4BG,EAAqBD,GAAwBA,EAG9IlE,eAAe0D,EAAOU,EAAKC,GAEzB,OAAQX,GAASU,GAAOV,GAASW,EAGnCrE,WAAWsE,EAAQC,GAEjB,OAASD,EAASC,EAAWA,GAAWA,EAG1CvE,kBAAkBwE,GAmBhB,OAjBAA,EAAIC,EAAIC,KAAKC,MAAc,IAARH,EAAIC,GAASG,SAAS,IACzCJ,EAAIK,EAAIH,KAAKC,MAAc,IAARH,EAAIK,GAASD,SAAS,IACzCJ,EAAIM,EAAIJ,KAAKC,MAAc,IAARH,EAAIM,GAASF,SAAS,IAEpB,IAAjBJ,EAAIC,EAAEb,SAERY,EAAIC,EAAI,IAAMD,EAAIC,GAEC,IAAjBD,EAAIK,EAAEjB,SAERY,EAAIK,EAAI,IAAML,EAAIK,GAEC,IAAjBL,EAAIM,EAAElB,SAERY,EAAIM,EAAI,IAAMN,EAAIM,GAGb,IAAMN,EAAIC,EAAID,EAAIK,EAAIL,EAAIM,EAGnC9E,+BAA+B+E,EAAQC,GAErC,MAAMC,EAAkB,IAAIC,EACtBC,EAAkB,GACxB,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCJ,EAAMK,aAAaN,EAAOK,GAAIH,GAC9BE,EAAgBG,KAAKL,EAAgBhC,SAGvC,OAAOkC,EAGTnF,oBAAoBuF,EAAMC,EAAIC,EAAQC,GAEpC,IAAK,IAAIN,EAAI,EAAGA,EAAI,GAAIA,IAEtBK,EAAOE,SAASP,GAAKQ,EAAMC,KAAKN,EAAKI,SAASP,GAAII,EAAGG,SAASP,GAAIM,GAItE1F,cAAc8F,EAAIC,GAEhB,OAAOrB,KAAKsB,IAAIF,EAAKC,GAAM,KAG7B/F,YAAYiG,EAAGC,EAAGR,GAEhB,OAAQ,EAAIA,GAAKO,EAAIP,EAAIQ,EAG3BlG,aAAa0D,EAAOU,EAAKC,GAEvB,OAAOK,KAAKL,IAAID,EAAKM,KAAKN,IAAIC,EAAKX,IAGrC1D,uBAAuBC,EAAGkG,GAExB,OAASlG,EAAIkG,EAAKA,GAAKA,EAGzBnG,gBAAgBiG,EAAGrC,EAAS,GAE1B,OAAOA,EAASc,KAAKsB,IAAIjC,GAAMqC,gBAAgBH,EAAY,EAATrC,GAAcA,GAGlE5D,gBAAgBqG,GAEd,OAAOA,GAAW3B,KAAK4B,GAAK,KAG9BtG,gBAAgBuG,GAEd,OAAOA,GAAW,IAAM7B,KAAK4B,IAG/BtG,kBAAkBqG,GAEhB,OAAOA,GAAW3B,KAAK4B,GAAK,KAG9BtG,kBAAkBuG,GAEhB,OAAOA,GAAW,IAAM7B,KAAK4B,IAG/BtG,0BAA0BwG,GAKxB,OAHAA,EAAEP,GAAKO,EAAEC,EACTD,EAAEN,GAAKM,EAAEC,EACTD,EAAEE,GAAKF,EAAEC,EACFD,EAGTxG,sBAAsB+E,GAEpB,MAAM4B,EAAS5B,EAAO,GAAG9B,QACzB,IAAK,IAAImC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCuB,EAAOC,IAAI7B,EAAOK,IAGpB,OADAuB,EAAOE,eAAe,EAAI9B,EAAOnB,QAC1B+C,EAGT3G,0BAEE,MAAM8G,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAEpE,IAAIC,EAAM,IASV,OARAA,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAC3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAE3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAC3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAE3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WAC3BF,GAAOD,EAAIpC,KAAKsC,MAAsB,GAAhBtC,KAAKuC,WACpBF,EAGT/G,gBAAgBiG,GAEd,OAAOlC,GAAMmD,MAAMjB,EAAG,EAAG,ICpJd,MAAMkB,GAEnBpH,YAAYqH,GAEVzI,KAAK0I,cAAgB,KACrB1I,KAAK2I,eAAiB,EACtB3I,KAAK4I,SAAU,EAEf5I,KAAK6I,cAAgB,GACrB7I,KAAKyI,QAAUA,EAEfzI,KAAK8I,gBAAkBnH,KAAKC,MAAMD,KAAKoH,UAAUN,IAEjDzI,KAAKgJ,MAAQ,EAEbhJ,KAAKiJ,SAAW,GAEhB,MAAMC,EAAgBC,OAAOC,KAAKX,GAClC,IAAK,IAAIhC,EAAI,EAAGA,EAAIyC,EAAcjE,OAAQwB,IAExCzG,KAAKiJ,SAASC,EAAczC,IAAM,GAGpCzG,KAAKqJ,SAAW,EAGlBC,OAEEtJ,KAAK4I,SAAU,EAGjBW,OAEEvJ,KAAK4I,SAAU,EAGjBY,QAEExJ,KAAK0I,cAAgB,KAGvBe,OAEE,MAAMJ,EAAWrJ,KAAK0J,eACtB1J,KAAK2J,aAAa3J,KAAK0I,aAAcW,EAAW,MAChDrJ,KAAK0I,aAAeW,EAGtBO,OAAOC,GAED7J,KAAK4I,UAEP5I,KAAK2J,aAAa3J,KAAK0I,aAAc1I,KAAK0I,aAAemB,EAAa7J,KAAK2I,gBAC3E3I,KAAK0I,aAAe1I,KAAK0I,aAAemB,EAAa7J,KAAK2I,gBAI9DmB,aAAaC,GAEX/J,KAAK0I,aAAezB,EAAMsB,MAAMwB,EAAM,EAAG/J,KAAKqJ,UAC9CrJ,KAAK2J,aAAa3J,KAAK0I,aAAc1I,KAAK0I,cAG5CsB,wBAAwBjD,GAEtB/G,KAAK0I,aAAezB,EAAMsB,MAAMxB,EAAG,EAAG,GAAK/G,KAAKqJ,SAChDrJ,KAAK2J,aAAa3J,KAAK0I,aAAc1I,KAAK0I,cAG5CuB,eAEE,OAAOhD,EAAMsB,MAAMvI,KAAK0I,aAAe1I,KAAK0J,eAAgB,EAAG,GAGjEQ,cAEE,OAAOlK,KAAK0I,aAAe1I,KAAK0J,eAGlCS,iBAAiBC,EAAcC,GAE7BrK,KAAK6I,cAAclC,KAAK,CACtByD,aAAcA,EACdC,OAAQA,IAGVrK,KAAKqJ,SAAWtD,KAAKL,IAAI1F,KAAKqJ,SAAUe,GAG1CE,wBAAwB1D,EAAMC,EAAI0D,EAAcC,GAAyB,GAEvE,GAAIA,EACJ,CACE,MAAMC,EAAYzK,KAAKiJ,SAASsB,EAAaG,qBAE3BtH,IAAdqH,GAEF9H,QAAQM,MAAM,GAAGsH,EAAaG,iDAGP,IAArBD,EAAUxF,OAEZsF,EAAa3D,KAAO5G,KAAK8I,gBAAgByB,EAAaG,gBAItDH,EAAa3D,KAAO6D,EAAUA,EAAUxF,OAAS,GAAGsF,aAAa1D,GAIrE,MAAM8D,EAAW,CACf/D,KAAMA,EACNC,GAAIA,EACJ0D,aAAcA,GAGhBvK,KAAKqJ,SAAWtD,KAAKL,IAAI1F,KAAKqJ,SAAUxC,GACxC7G,KAAKiJ,SAASsB,EAAaG,gBAAgB/D,KAAKgE,GAGlDC,yBAAyBlK,GAEvB,MAAMiK,EAAW3K,KAAK6K,uBAAuBnK,EAAMV,KAAK0I,cAExD,OAAI1I,KAAK0I,aAAeiC,EAAS/D,KAExB+D,EAASJ,aAAaO,SAAS,GAGjCH,EAASJ,aAAaO,SAAS,GAGxCC,2BAA2BrK,GAIzB,OAFiBV,KAAK6K,uBAAuBnK,EAAMV,KAAK0I,cAExC6B,aAAaO,SAAS,GAGxCE,qBAAqBtK,GAEnB,MAAMiK,EAAW3K,KAAK6K,uBAAuBnK,EAAMV,KAAK0I,cAClD3B,EAAI/G,KAAKiL,gBAAgBjL,KAAK0I,aAAciC,EAAS/D,KAAM+D,EAAS9D,IAE1E,OAAO8D,EAASJ,aAAaW,gBAAgBnE,GAG/C2C,eAEE,OAAO1J,KAAKqJ,SAGdM,aAAa/C,EAAMC,GAEjB,IAAK,IAAIJ,EAAI,EAAGA,EAAIzG,KAAK6I,cAAc5D,OAAQwB,IAEzCzG,KAAK6I,cAAcpC,GAAG2D,aAAexD,EAAOrF,OAAO4J,SACnDnL,KAAK6I,cAAcpC,GAAG2D,aAAevD,EAAOtF,OAAO4J,SAGrDnL,KAAK6I,cAAcpC,GAAG4D,OAAOe,UAGjC,MAAMlC,EAAgBC,OAAOC,KAAKpJ,KAAK8I,iBAEvC,IAAK,IAAIrC,EAAI,EAAGA,EAAIyC,EAAcjE,OAAQwB,IAC1C,CACE,MAAM/F,EAAOwI,EAAczC,GACrBkE,EAAW3K,KAAK6K,uBAAuBnK,EAAMkG,GAEnD5G,KAAKyI,QAAQ/H,GAAQV,KAAKqL,kBAAkBV,EAAU/D,IAI1DyE,kBAAkBV,EAAUZ,GAI1B,OAFA/J,KAAKgJ,MAAQhJ,KAAKiL,gBAAgBlB,EAAMY,EAAS/D,KAAM+D,EAAS9D,IAEzD8D,EAASJ,aAAaO,SAAS7D,EAAMsB,MAAMvI,KAAKgJ,MAAO,EAAG,IAGnEsC,cAAcC,GAEZ,OAAOvL,KAAKiJ,SAASsC,GAGvBC,qBAAqBD,GAEnB,IAAK,IAAI9E,EAAI,EAAGA,EAAIzG,KAAKiJ,SAASsC,GAActG,OAAQwB,IACxD,CAGE,GAFiBzG,KAAKiJ,SAASsC,GAAc9E,GAEhC8D,aAAakB,QAExB,OAAO,EAIX,OAAO,EAGTR,gBAAgBlG,EACdM,EACAC,GAEA,OAAOF,GAAMsG,UAAW3G,EAAQM,IAA2BC,EAAuBD,KAAqC,GAGzHwF,uBAAuBU,EAAcxB,GAEnC,IAAI4B,EAEJ,MAAMlB,EAAYzK,KAAKiJ,SAASsC,GAEhC,IAAK,IAAI9E,EAAI,EAAGA,EAAIgE,EAAUxF,OAAQwB,IACtC,CACE,MAAMkE,EAAWF,EAAUhE,GAE3B,GAAIsD,GAAQY,EAAS/D,MAAQmD,GAAQY,EAAS9D,GAG5C,OADA8E,EAAUhB,EACHgB,EAIX,IAAIlG,EAAMmG,EAAAA,EAEV,IAAK,IAAInF,EAAI,EAAGA,EAAIgE,EAAUxF,OAAQwB,IACtC,CACE,MAAMkE,EAAWF,EAAUhE,GACrBoF,EAAW9F,KAAKsB,IAAIsD,EAAS9D,GAAKkD,GAEpC8B,EAAWpG,IAEbkG,EAAUhB,EACVlF,EAAMoG,GAIV,OAAOF,GClBX,OAAe,IAjOf,MAEEvK,eAGA0K,OAAOxE,GAEL,OAAOA,EAGTyE,WAAWzE,GAET,OAAO,EAAIvB,KAAKsB,IAAS,EAAJC,IAAmB,GAG1C0E,aAAa1E,GAEX,OAAO,EAAIvB,KAAKkG,IAAQ,UAAJ3E,EAAgB,GAGtC4E,cAAc5E,GAEZ,OAAOvB,KAAKoG,IAAQ,UAAJ7E,EAAgB,GAGlC8E,iBAAiB9E,GAEf,QAASvB,KAAKkG,IAAI,UAAY3E,GAAK,GAAK,EAG1C+E,cAAc/E,GAEZ,OAAOA,EAAIA,EAAIA,EAGjBgF,eAAehF,GAEb,OAAO,EAAIvB,KAAKwG,IAAI,EAAIjF,EAAG,GAG7BkF,kBAAkBlF,GAEhB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EACZ,EAAIvB,KAAKwG,KAAK,EAAIjF,EAAI,EAAG,GAAK,EAGpCmF,aAAanF,GAEX,OAAOA,EAAIA,EAGboF,cAAcpF,GAEZ,OAAO,GAAK,EAAIA,IAAM,EAAIA,GAG5BqF,iBAAiBrF,GAEf,OAAOA,EAAI,GACP,EAAIA,EAAIA,EACR,EAAIvB,KAAKwG,KAAK,EAAIjF,EAAI,EAAG,GAAK,EAGpCsF,cAActF,GAEZ,OAAOA,EAAIA,EAAIA,EAAIA,EAGrBuF,eAAevF,GAEb,OAAO,EAAIvB,KAAKwG,IAAI,EAAIjF,EAAG,GAG7BwF,kBAAkBxF,GAEhB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EAAIA,EAChB,EAAIvB,KAAKwG,KAAK,EAAIjF,EAAI,EAAG,GAAK,EAGpCyF,cAAczF,GAEZ,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,EAGzB0F,eAAe1F,GAEb,OAAO,EAAIvB,KAAKwG,IAAI,EAAIjF,EAAG,GAG7B2F,kBAAkB3F,GAEhB,OAAOA,EAAI,GACP,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EACrB,EAAIvB,KAAKwG,KAAK,EAAIjF,EAAI,EAAG,GAAK,EAGpC4F,aAAa5F,GAEX,OAAa,IAANA,EAAU,EAAIvB,KAAKwG,IAAI,EAAG,GAAKjF,EAAI,IAG5C6F,cAAc7F,GAEZ,OAAa,IAANA,EAAU,EAAI,EAAIvB,KAAKwG,IAAI,GAAI,GAAKjF,GAG7C8F,iBAAiB9F,GAEf,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,GACFvB,KAAKwG,IAAI,EAAG,GAAKjF,EAAI,IAAM,GAC1B,EAAIvB,KAAKwG,IAAI,GAAI,GAAKjF,EAAI,KAAO,EAG5C+F,aAAa/F,GAEX,OAAO,EAAIvB,KAAKuH,KAAK,EAAIvH,KAAKwG,IAAIjF,EAAG,IAGvCiG,cAAcjG,GAEZ,OAAOvB,KAAKuH,KAAK,EAAIvH,KAAKwG,IAAIjF,EAAI,EAAG,IAGvCkG,iBAAiBlG,GAEf,OAAOA,EAAI,IACN,EAAIvB,KAAKuH,KAAK,EAAIvH,KAAKwG,IAAI,EAAIjF,EAAG,KAAO,GACzCvB,KAAKuH,KAAK,EAAIvH,KAAKwG,KAAK,EAAIjF,EAAI,EAAG,IAAM,GAAK,EAGrDmG,aAAanG,GAEX,OAAO,OAASA,EAAIA,EAAIA,EAAI,OAASA,EAAIA,EAG3CoG,cAAcpG,GAEZ,OAAO,EAAI,OAASvB,KAAKwG,IAAIjF,EAAI,EAAG,GAAK,OAASvB,KAAKwG,IAAIjF,EAAI,EAAG,GAGpEqG,iBAAiBrG,GAEf,OAAOA,EAAI,GACNvB,KAAKwG,IAAI,EAAIjF,EAAG,IAAM,SAAsBA,EAAI,WAAc,GAC9DvB,KAAKwG,IAAI,EAAIjF,EAAI,EAAG,IAAM,WAAuB,EAAJA,EAAQ,GAAK,WAAa,GAAK,EAGnFsG,gBAAgBtG,GAEd,MAAMuG,EAAM,EAAI9H,KAAK4B,GAAM,EAE3B,OAAa,IAANL,EACH,EACM,IAANA,EACE,GACCvB,KAAKwG,IAAI,EAAG,GAAKjF,EAAI,IAAMvB,KAAKoG,KAAS,GAAJ7E,EAAS,OAASuG,GAGhEC,iBAAiBxG,GAEf,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAvB,KAAKwG,IAAI,GAAI,GAAKjF,GAAKvB,KAAKoG,IAAsB,UAAb,GAAJ7E,EAAS,MAAqB,EAGvEyG,oBAAoBzG,GAElB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,IACAvB,KAAKwG,IAAI,EAAG,GAAKjF,EAAI,IAAMvB,KAAKoG,IAAwB,WAAnB,GAAK7E,EAAI,SAAwB,EACxEvB,KAAKwG,IAAI,GAAI,GAAKjF,EAAI,IAAMvB,KAAKoG,IAAwB,WAAnB,GAAK7E,EAAI,SAAuB,EAAI,EAGpF0G,eAAe1G,GAEb,OAAO,EAAItH,KAAKiO,gBAAgB,EAAI3G,GAGtC2G,gBAAgB3G,GAEd,MAAM4G,EAAK,OACLC,EAAK,KAEX,OAAI7G,EAAI,EAAI6G,EAEHD,EAAK5G,EAAIA,EAETA,EAAI,EAAI6G,EAERD,GAAM5G,GAAK,IAAM6G,GAAM7G,EAAI,IAE3BA,EAAI,IAAM6G,EAEVD,GAAM5G,GAAK,KAAO6G,GAAM7G,EAAI,MAI5B4G,GAAM5G,GAAK,MAAQ6G,GAAM7G,EAAI,QAIxC8G,mBAAmB9G,GAEjB,OAAOA,EAAI,IACN,EAAItH,KAAKiO,gBAAgB,EAAI,EAAI3G,IAAM,GACvC,EAAItH,KAAKiO,gBAAgB,EAAI3G,EAAI,IAAM,EAG9C+G,UAAUtH,GAER,OAAO,EAAMhB,KAAKwG,IAAIxG,KAAKsB,IAAItB,KAAKoG,IAAIpF,EAAI,IAAO,IAAQhB,KAAKuI,KAAKvI,KAAKoG,IAAIpF,IAAMhB,KAAKoG,IAAIpF,EAAI,IAAM,GAAO,KC3NnG,MAAMwH,GAEnBnN,YAAY8J,EAAkB,UAE5BlL,KAAKkL,qBAAkB9H,EAIrBpD,KAAKkL,gBAFwB,iBAApBA,EAEcsD,GAAgBtD,GAIhBA,EAI3BtB,OAAOnB,EAAS1B,KCfH,MAAM0H,WAA2BF,GAE9CnN,YAAYsJ,EAAgB9D,EAAO,EAAGC,EAAK,EAAG4E,GAAU,EAAOP,EAAkB,UAE/EwD,MAAMxD,GAENlL,KAAK0K,eAAiBA,EACtB1K,KAAK4G,KAAOA,EACZ5G,KAAK6G,GAAKA,EACV7G,KAAKyL,QAAUA,EAGjB7B,OAAOnB,EAAS1B,GAEd0B,EAAQzI,KAAK0K,gBAAkBzD,EAAMC,KAAKlH,KAAK4G,KAAM5G,KAAK6G,GAAI7G,KAAKkL,gBAAgBnE,IAGrF+D,SAAS/D,GAEP,OAAOE,EAAMC,KAAKlH,KAAK4G,KAAM5G,KAAK6G,GAAI7G,KAAKkL,gBAAgBnE,KCT/D,OAAe,IAbf,MAEE3F,cAEEpB,KAAK2O,SAAMvL,EAGbwL,QAAQD,GAEN3O,KAAK2O,IAAMA,ICPA,MAAME,GAEnBzN,YAAYV,EAAM+C,GAEhBzD,KAAKU,KAAOA,EACZV,KAAKyD,OAASA,EAGhB2H,UAEE0D,GAAYH,IAAI3O,KAAKU,MAAMV,KAAKyD,WCZrB,MAAMsL,GAEnB3N,eAKAQ,MAAMoN,GAEJ,MAEMC,GAFM,IAAIC,WAAYC,gBAAgBH,EAAc,YAE9BI,iBAAiB,cAEvCC,EAAmB,GACnBC,EAAW,GAEjB,IAAK,IAAI7I,EAAI,EAAGA,EAAIwI,EAAgBhK,OAAQwB,IAC5C,CACE,MAAM8I,EAAON,EAAgBxI,GACvB+I,EAAcD,EAAKE,cACnBtK,EAAOqK,EAAYE,aAAa,SAIhC9I,EAFQ5G,KAAK2P,oBAAoBJ,GAElB,IACflG,EAAWuG,WAAWL,EAAKG,aAAa,UAAY,IAG1D,GAAIF,EAAYE,aAAa,SAASG,SAAS,YAC/C,CACE,MAAMC,EAAa3K,EAAK4K,MAAM,KACxBC,EAAeF,EAAW,GAC1BG,EAAiBH,EAAW,GAElCR,EAAS3I,KAAK,CACZjG,KAAMsP,EACNvM,OAAQwM,EACRC,QAAStJ,EAAkB,GAAXyC,IAOpB,GAHsBmG,EAAYE,aAAa,SAASG,SAAS,gBAC3CL,EAAYE,aAAa,SAASG,SAAS,UAEnC,KAAT1K,IAAgBA,EAAK0K,SAAS,KACnD,CACE,MAAMC,EAAa3K,EAAK4K,MAAM,KAExBrF,EAAiBoF,EAAW,GAE5BK,EAAaL,EAAW,GAAGC,MAAM,MACjCK,EAAWR,WAAWO,EAAW,IACjCjF,EAAkBiF,EAAW,GAET,IAAtBL,EAAW7K,QAEbtC,QAAQM,MAAM,4BAA6BkC,GAGnB,IAAtBgL,EAAWlL,QAEbtC,QAAQM,MAAM,4BAA6BkC,GAG7CkK,EAAiB1I,KAAK,CACpB+D,eAAgBA,EAChB2F,UAAWzJ,EACX0J,QAAS1J,EAAOyC,EAChB+G,SAAUA,EACVlF,gBAAiBA,KASvB,OAJAmE,EAAiBkB,MAAK,CAACC,EAAGrK,IAEjBqK,EAAEH,UAAYlK,EAAEkK,YAElB,CACLhB,iBAAkBA,EAClBC,SAAUA,GAIdK,oBAAoBJ,GAElB,MAAMkB,EAAQlB,EAAKG,aAAa,KAChC,OAAiB,OAAVe,EAAiB,EAAIb,WAAWa,IClF5B,MAAMC,GAEnBtP,YAAYuP,GAEV3Q,KAAK2Q,mBAAqBA,EAG5BC,qBAAqBC,EAAgBC,EAAiBhI,GAEpDA,EAAkBA,GAAmB9I,KAAK2Q,mBAC1C,MAAMI,EAASF,EAAexB,iBACxBC,EAAWuB,EAAevB,SAE1B0B,EAAiBhR,KAAKiR,gBAAgBjR,KAAK2Q,oBAEjD,IAAK,IAAIlK,EAAI,EAAGA,EAAIuK,EAAe/L,OAAQwB,SAEmDrD,IAAxF2N,EAAOG,MAAKC,GAAWA,EAAQzG,iBAAmBsG,EAAevK,GAAGiE,kBAEtEqG,EAAOpK,KAAKqK,EAAevK,IAI/B,MAAM2K,EAAY,IAAI5I,GAAgBsI,GAEtC,IAAK,IAAIrK,EAAI,EAAGA,EAAIsK,EAAO9L,OAAQwB,IACnC,CACE,MAAMM,EAAIgK,EAAOtK,GACX8D,EAAe,IAAIkE,GACvB1H,EAAE2D,eACFoG,EAAgB/J,EAAE2D,gBAClB3D,EAAEqJ,SACFrJ,EAAE0E,QACF1E,EAAEmE,iBAGJkG,EAAU9G,wBAAwBvD,EAAEsJ,UAAWtJ,EAAEuJ,QAAS/F,GAAc,GAG1E,IAAK,IAAI9D,EAAI,EAAGA,EAAI6I,EAASrK,OAAQwB,IACrC,CACE,MAAMM,EAAIuI,EAAS7I,GACb4K,EAAe,IAAIxC,GAAY9H,EAAErG,KAAMqG,EAAEtD,QAC/C2N,EAAUjH,iBAAiBpD,EAAEmJ,QAASmB,GAGxC,OAAOD,EAGTH,gBAAgBK,GAEd,MAAMP,EAAS,GAET3H,EAAOD,OAAOC,KAAKkI,GAEzB,IAAK,IAAI7K,EAAI,EAAGA,EAAI2C,EAAKnE,OAAQwB,IAE/BsK,EAAOpK,KAAK,CACV+D,eAAgBtB,EAAK3C,GACrB4J,UAAW,EACXC,QAAS,EACTF,SAAUkB,EAAMlI,EAAK3C,IACrBgF,SAAS,EACTP,gBAAiB,sBAIrB,OAAO6F,EAGTQ,aAAaC,EAAK/I,GAEhB,MAAMgJ,GAAkB,IAAK1C,IAAwBnN,MAAM4P,GACrDT,EAASU,EAAgBpC,iBACzBC,EAAWmC,EAAgBnC,SAC3B8B,EAAY,IAAI5I,GAAgBC,GAEtC,IAAK,IAAIhC,EAAI,EAAGA,EAAIsK,EAAO9L,OAAQwB,IACnC,CACE,MAAMM,EAAIgK,EAAOtK,GACX8D,EAAe,IAAIkE,GACvB1H,EAAE2D,eACFjC,EAAQ1B,EAAE2D,gBACV3D,EAAEqJ,SACFrJ,EAAE0E,QACF1E,EAAEmE,iBAGJkG,EAAU9G,wBAAwBvD,EAAEsJ,UAAWtJ,EAAEuJ,QAAS/F,GAAc,GAG1E,IAAK,IAAI9D,EAAI,EAAGA,EAAI6I,EAASrK,OAAQwB,IACrC,CACE,MAAMM,EAAIuI,EAAS7I,GACb4K,EAAe,IAAIxC,GAAY9H,EAAErG,KAAMqG,EAAEtD,QAC/C2N,EAAUjH,iBAAiBpD,EAAEmJ,QAASmB,GAGxC,OAAOD,GC8CX,OAAe,IArJf,MAEErR,OAEEC,KAAK0R,MAAQ,GAEb1R,KAAK2R,iBAA6B,eAClC3R,KAAK4R,iBAA6B,gBAClC5R,KAAK6R,mBAA6B,iBAClC7R,KAAK8R,eAA6B,iBAElC9R,KAAK+R,uBAA6B,yBAClC/R,KAAKgS,eAA6B,iBAClChS,KAAKiS,0BAA6B,wBAElCjS,KAAKkS,oBAA6B,kBAClClS,KAAKmS,oBAA6B,kBAClCnS,KAAKoS,qBAA6B,wBAElCpS,KAAKqS,kBAA6B,gBAElCrS,KAAKsS,0BAA6B,4BAClCtS,KAAKuS,yBAA6B,2BAElCvS,KAAKwS,yBAA6B,2BAClCxS,KAAKyS,wBAA6B,0BAElCzS,KAAK0S,4BAA+B,8BACpC1S,KAAK2S,2BAA+B,6BAEpC3S,KAAK4S,kBAAoB,gBAG3BC,KAAKC,EAAOC,GAEV,MAAMrB,EAAQ1R,KAAK0R,MAAMoB,GAEzB,QAAc1P,IAAVsO,EAEF,OAEF,IAAIjL,EAAIiL,EAAMzM,OACd,KAAOwB,KAELiL,EAAMjL,GAAGsM,GAIbC,GAAGF,EAAOG,QAEyB,IAAtBjT,KAAK0R,MAAMoB,KAEpB9S,KAAK0R,MAAMoB,GAAS,IAGtB9S,KAAK0R,MAAMoB,GAAOnM,KAAKsM,GAGzBC,kBAAkBC,GAEhBnT,KAAK6S,KAAK7S,KAAK2R,iBAAkBwB,GAGnCC,oBAAoBC,GAElBrT,KAAK6S,KAAK7S,KAAK4R,iBAAkByB,GAGnCC,oBAAoBC,GAElBvT,KAAK6S,KAAK7S,KAAK6R,mBAAoB0B,GAGrCC,sBAEExT,KAAK6S,KAAK7S,KAAK8R,gBAGjB2B,4BAA4BC,GAE1B1T,KAAK6S,KAAK7S,KAAK+R,uBAAwB2B,GAGzCC,sBAEE3T,KAAK6S,KAAK7S,KAAKgS,gBAGjB4B,mBAAmBC,GAEjB7T,KAAK6S,KAAK7S,KAAK4S,kBAAmBiB,GAGpCC,2BAA2BT,GAEzBrT,KAAK6S,KAAK7S,KAAKiS,0BAA2BoB,GAG5CU,qBAAqBC,GAEnBhU,KAAK6S,KAAK7S,KAAKkS,oBAAqB8B,GAGtCC,qBAAqBC,GAEnBlU,KAAK6S,KAAK7S,KAAKmS,oBAAqB+B,GAGtCC,2BAA2BC,GAEzBpU,KAAK6S,KAAK7S,KAAKoS,qBAAsBgC,GAGvCC,oBAAoBC,GAElBtU,KAAK6S,KAAK7S,KAAKqS,kBAAmBiC,GAGpCC,+BAA+BjD,GAE7BtR,KAAK6S,KAAK7S,KAAKsS,0BAA2BhB,GAG5CkD,8BAA8BlD,GAE5BtR,KAAK6S,KAAK7S,KAAKuS,yBAA0BjB,GAG3CmD,8BAA8BnD,GAE5BtR,KAAK6S,KAAK7S,KAAKwS,yBAA0BlB,GAG3CoD,6BAA6BpD,GAE3BtR,KAAK6S,KAAK7S,KAAKyS,wBAAyBnB,GAG1CqD,iCAAiCrD,GAE/BtR,KAAK6S,KAAK7S,KAAK0S,4BAA6BpB,GAG9CsD,gCAAgCtD,GAE9BtR,KAAK6S,KAAK7S,KAAK2S,2BAA4BrB,KC3G/C,OAAe,IApCf,MAEEvR,OAEEC,KAAK6U,UAAY,GACjB7U,KAAKqD,iBAAmB,GAG1Ba,aAAaxD,EAAMsB,EAAKgS,GAET7K,OAAOC,KAAKpJ,KAAKqD,kBAErBwM,SAAS7N,GAEhBhC,KAAK6U,UAAUnU,GAAQV,KAAKqD,iBAAiBrB,IAI7ChC,KAAK6U,UAAUnU,GAAQsT,EACvBhU,KAAKqD,iBAAiBrB,GAAOgS,GAG/Bc,GAAaf,qBAAqB,CAAErT,KAAMA,EAAMqE,MAAOiP,IAGzDe,aAAarU,GAEX,OAAOV,KAAK6U,UAAUnU,GAGxBkE,IAAIlE,GAEF,OAAOV,KAAK6U,UAAUnU,KClCX,MAAMsU,GAEnB3T,mBAAmB4T,GAEjB,MAAMC,EAASD,EAAU7F,iBAAiB,OAE1C,IAAK,IAAI3I,EAAI,EAAGA,EAAIyO,EAAOjQ,OAAQwB,IACnC,CACE,MAAM0O,EAAQD,EAAOzO,GAEjB0O,EAAMC,QAAQC,MAEhBF,EAAME,IAAMF,EAAMC,QAAQC,KAI9B,MAAMC,EAAgBL,EAAU7F,iBAAiB,UAEjD,IAAK,IAAI3I,EAAI,EAAGA,EAAI6O,EAAcrQ,OAAQwB,IAC1C,CACE,MAAM8O,EAAeD,EAAc7O,GAE/B8O,EAAaH,QAAQC,MAEvBE,EAAapQ,KAAOoQ,EAAaH,QAAQC,MAK/ChU,mBAAmB4T,GAEjB,MAAMO,EAASP,EAAU7F,iBAAiB,SAE1C,IAAK,IAAI3I,EAAI,EAAGA,EAAI+O,EAAOvQ,OAAQwB,IACnC,CACE,MAAMgP,EAAQD,EAAO/O,GAEjBgP,EAAML,QAAQC,MAEhBI,EAAMJ,IAAMI,EAAML,QAAQC,OCrCnB,MAAMK,GAEnBtU,cAEEpB,KAAK2V,YAAc,GACnB3V,KAAK2Q,mBAAqB,GAG5B/L,IAAIgR,EAAiBC,EAAe/E,GAElC,IAAK,IAAIrK,EAAI,EAAGA,EAAIzG,KAAK2V,YAAY1Q,OAAQwB,IAE3C,GAAIzG,KAAK2V,YAAYlP,GAAGG,OAASgP,GAAmB5V,KAAK2V,YAAYlP,GAAGI,KAAOgP,EAC/E,CAGE,OAFyB,IAAInF,GAAuB1Q,KAAK2Q,oBAAoBC,qBAAqB5Q,KAAK2V,YAAYlP,GAAGtB,KAAM2L,GAMhI,IAAK,IAAIrK,EAAI,EAAGA,EAAIzG,KAAK2V,YAAY1Q,OAAQwB,IAE3C,GAAIzG,KAAK2V,YAAYlP,GAAGI,KAAOgP,EAC/B,CAGE,OAFyB,IAAInF,GAAuB1Q,KAAK2Q,oBAAoBC,qBAAqB5Q,KAAK2V,YAAYlP,GAAGtB,KAAM2L,GAMhInO,QAAQM,MAAM,0CAA2C2S,EAAiBC,GAI5EC,gBAAgBH,GAEd,IAAK,IAAIlP,EAAI,EAAGA,EAAIkP,EAAY1Q,OAAQwB,IAEtCzG,KAAK2V,YAAYhP,KAAKgP,EAAYlP,IAItCsP,gBAAgBJ,GAEd3V,KAAK2V,YAAcA,EAGrBK,uBAAuBrF,GAErB3Q,KAAK2Q,mBAAqBA,GCK9B,OAAe,IArDf,MAEEvP,cAEEpB,KAAKiW,aAAe,CAAC,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,MAGtFlW,OAEEC,KAAKkW,QAAU,IAAIC,EACnBnW,KAAKoW,iBAAmB,EACxBpW,KAAKqW,eAAiB,EACtBrW,KAAKsW,iBAAmB,IAAIC,EAAQ,EAAG,GAEvCvW,KAAK6J,WAAa,KAGhBnB,mBAEF,OAAO1I,KAAKqW,eAGVG,kBAIF,OAFAxW,KAAKsW,iBAAiBhP,EAAItH,KAAK6J,WAC/B7J,KAAKsW,iBAAiB/O,EAAIvH,KAAK0I,aACvB1I,KAAKsW,iBAGfG,WAEEzW,KAAKoW,iBAAmBpW,KAAKkW,QAAQQ,WACrC1W,KAAKqW,eAAiBrW,KAAKkW,QAAQS,iBAEnC3W,KAAKiW,aAAaW,QAClB5W,KAAKiW,aAAatP,KAAK3G,KAAKoW,iBAAmB,IAAOpW,KAAKoW,iBAAmB,MAE9EpW,KAAK6W,yBAGPA,yBAEE7W,KAAK6J,WAAa,EAElB,IAAK,IAAIpD,EAAI,EAAGA,EAAIzG,KAAKiW,aAAahR,OAAQwB,IAE5CzG,KAAK6J,YAAc7J,KAAKiW,aAAaxP,GAGvCzG,KAAK6J,WAAa7J,KAAK6J,WAAa7J,KAAKiW,aAAahR,SCpD3C,MAAM6R,GAEnB1V,YAAYV,GAEVV,KAAKU,KAAOA,EAGdqW,SAIAC,QAIAC,QAIAC,gBAIAC,YAIAvN,UAIAwN,wBAAwBC,EAAkBC,EAAqBC,GAG7DvX,KAAKwX,kBAAkBH,EAAkBC,EAAqBC,GAGhEE,uBAAuBJ,EAAkBC,EAAqBC,IAK9DC,kBAAkBH,EAAkBC,EAAqBC,IAIzDG,eAIAC,YC/Ca,MAAMC,GAEnBxW,YAAYyW,GAEV7X,KAAK8X,WAAa,IAAIhB,GACtB9W,KAAK+X,cAAgB,IAAIjB,GAEzB9W,KAAK2Q,mBAAqB,GAC1B3Q,KAAKgY,mBAAqB,GAE1BhY,KAAK6X,iBAAmBA,EAExB7X,KAAKiY,eAAgB,EAGvBC,YAAY5G,EAAO7H,GAAO,GAEpBzJ,KAAKiY,eAEPjY,KAAKmY,oBAGPnY,KAAK8X,WAAa9X,KAAK+X,cACvB/X,KAAK+X,cAAgBzG,EAErBtR,KAAK8X,WAAWJ,cAChB1X,KAAK+X,cAAcf,OAEnBhX,KAAKuX,iBAAmBvX,KAAK6X,iBAAiBjT,IAAI5E,KAAK8X,WAAWpX,KAAMV,KAAK+X,cAAcrX,KAAMV,KAAKgY,oBACtGhY,KAAK+X,cAAcb,eAEnBlX,KAAKuX,iBAAiBjO,OAEtBtJ,KAAKiY,eAAgB,EAEjBxO,IAEFzJ,KAAKuX,iBAAiB9N,OACtBzJ,KAAK4J,UAITA,SAEM5J,KAAKiY,eAEPjY,KAAKoY,uBAEDpY,KAAKuX,iBAAiBrN,gBAExBlK,KAAKiY,eAAgB,EAErBjY,KAAKoY,uBAELpY,KAAKmY,oBAELnY,KAAK+X,cAAcZ,aAKrBnX,KAAK+X,cAAcnO,SAIvByO,UAAU/G,GAERtR,KAAK+X,cAAgBzG,EAGvB0E,uBAAuBrF,GAErBxH,OAAOmP,OAAOtY,KAAK2Q,mBAAoBA,GACvCxH,OAAOmP,OAAOtY,KAAKgY,mBAAoBrH,GAGzCyH,uBAEEpY,KAAKuX,iBAAiB3N,OAAO2O,GAAK1O,YAClC7J,KAAK8X,WAAWL,uBAAuBzX,KAAKgY,mBAAoBhY,KAAKuX,iBAAiBtN,eAAgBjK,KAAKuX,kBAC3GvX,KAAK+X,cAAcX,wBAAwBpX,KAAKgY,mBAAoBhY,KAAKuX,iBAAiBtN,eAAgBjK,KAAKuX,kBAGjHY,oBAEMnY,KAAK8X,WAAWpX,OAASV,KAAK+X,cAAcrX,MAE9CV,KAAK8X,WAAWb,OAGlBjX,KAAK8X,WAAWH,WCsFpB,OAAe,IAhLf,MAEEvW,cAEEpB,KAAKwY,MAAQ,GAEbxY,KAAK6X,iBAAmB,IAAInC,GAC5B1V,KAAKyY,mBAAqB,IAAIb,GAA2B5X,KAAK6X,kBAE9D7X,KAAK0Y,wBAA0B,GAE/B1Y,KAAK2Y,qBAAuB,GAG9B/O,SAEE5J,KAAKyY,mBAAmB7O,SAExB5J,KAAK4Y,wBAGPC,WAAWC,EAAWC,GAAa,EAAMtP,GAAO,GAE9C,MAAM5B,EAAI7H,KAAK4E,IAAIkU,GACnB9Y,KAAKyY,mBAAmBP,YAAYrQ,EAAG4B,GAEnCsP,IAEF/Y,KAAKgZ,qBAAqBnR,EAAE7F,KAC5BhC,KAAKiZ,uBAAuBpR,EAAE7F,MAGhChC,KAAKkZ,mBAAmBJ,GAG1BK,yBAAyBC,GAEvBpZ,KAAK0Y,wBAAwB/R,KAAKyS,GAGpCF,mBAAmBJ,GAEjB,IAAK,IAAIrS,EAAI,EAAGA,EAAIzG,KAAK0Y,wBAAwBzT,OAAQwB,IACzD,CACqBzG,KAAK0Y,wBAAwBjS,GACrC4S,eAAeP,IAI9BQ,cAAcC,GAEZvZ,KAAKwY,MAAM7R,KAAK4S,GAGlBC,SAASV,GAEP,IAAK,IAAIrS,EAAI,EAAGA,EAAIzG,KAAKwY,MAAMvT,OAAQwB,IAErC,GAAIzG,KAAKwY,MAAM/R,GAAG/F,OAASoY,EAEzB,OAAO,EAGX,OAAO,EAGThD,gBAAgBH,GAEd3V,KAAK6X,iBAAiB/B,gBAAgBH,GAGxCI,gBAAgBJ,GAEd3V,KAAK6X,iBAAiB9B,gBAAgBJ,GAGxC8D,SAASX,GAEP,MAAMS,EAAOvZ,KAAK4E,IAAIkU,GAEtB9Y,KAAKyY,mBAAmBJ,UAAUkB,GAGpCG,yBAAyBC,GAEvB3Z,KAAK2Y,qBAAuBgB,EAG9BC,mBAEE,OAAO5Z,KAAKyY,mBAAmBV,cAGjC8B,iBAAiBf,GAEfnW,QAAQC,KAAK,2CACb5C,KAAK4E,IAAIkU,GAGXlU,IAAIkU,GAEF,IAAK,IAAIrS,EAAI,EAAGA,EAAIzG,KAAKwY,MAAMvT,OAAQwB,IAErC,GAAIzG,KAAKwY,MAAM/R,GAAG/F,OAASoY,EAEzB,OAAO9Y,KAAKwY,MAAM/R,GAGtB9D,QAAQM,MAAM,wCAAyC6V,GAIzDgB,gBAAgB9X,GAEdW,QAAQC,KAAK,kDACb5C,KAAK+Z,WAAW/X,GAGlB+X,WAAW/X,GAET,IAAK,IAAIyE,EAAI,EAAGA,EAAIzG,KAAKwY,MAAMvT,OAAQwB,IAErC,GAAIzG,KAAKwY,MAAM/R,GAAGzE,MAAQA,EAExB,OAAOhC,KAAKwY,MAAM/R,GAGtB9D,QAAQM,MAAM,+CAAgDjB,GAIhEgU,uBAAuBrF,GAErB3Q,KAAK6X,iBAAiB7B,uBAAuBrF,GAC7C3Q,KAAKyY,mBAAmBzC,uBAAuBrF,GAGjDqI,qBAAqBhX,GAEnB7B,OAAO6Z,QAAQC,UAAU,GAAI,GAAIjY,GAGnCiX,uBAAuBvY,GAErB,MAAMwZ,EAAQla,KAAKma,aAAazZ,GAEhC0Z,SAASF,MAAQA,EAAQ,GAAGA,OAAWla,KAAK2Y,uBAAyB3Y,KAAK2Y,qBAG5EC,wBAEE,IAAK,IAAInS,EAAI,EAAGA,EAAIzG,KAAKwY,MAAMvT,OAAQwB,IAErCzG,KAAKwY,MAAM/R,GAAG4T,YAAYra,KAAKyY,mBAAmBT,oBAItDmC,aAAaG,GAEX,IAAIC,EAAaD,EAAOE,cAAcC,QAAQ,IAAK,IAGnD,OAFAF,EAAava,KAAK0a,sBAAsBH,GAEjCA,EAGTG,sBAAsBJ,GAEpB,OAAOA,EAAOG,QACZ,gBACCE,GAAUA,EACRF,QAAQ,IAAK,KACbA,QAAQ,IAAK,SCzKP,MAAMG,WAAwB9D,GAE3C1V,aAAYV,KAAEA,EAAIsB,IAAEA,EAAGiT,UAAEA,IAEvBvG,MAAMhO,GAENV,KAAKiV,UAAYA,EACjBjV,KAAKgC,IAAMA,EAEX,IAAIyP,EAAkBoJ,GAAkBjW,IAAI,GAAGlE,UAE/C+Q,EAAkBA,GAAmB,CACnCpC,iBAAkB,GAClBC,SAAU,IAGZ,MAAMqG,EAAc,CAClB,CACE9O,GAAInG,EACJyE,KAAMsM,IAIVqJ,GAAYxB,cAActZ,MAC1B8a,GAAYhF,gBAAgBH,GAG9BqB,OAEEhX,KAAKiV,UAAU8F,UAAU9S,IAAI,gBAC7BjI,KAAKiV,UAAU8F,UAAUC,OAAO,eAChChb,KAAKiV,UAAU8F,UAAUC,OAAO,UAGlC7D,WAEEnX,KAAKiV,UAAU8F,UAAUC,OAAO,gBAChChb,KAAKiV,UAAU8F,UAAUC,OAAO,eAChChb,KAAKiV,UAAU8F,UAAUC,OAAO,UAGlCtD,cAEE1X,KAAKiV,UAAU8F,UAAU9S,IAAI,eAC7BjI,KAAKiV,UAAU8F,UAAUC,OAAO,gBAChChb,KAAKiV,UAAU8F,UAAUC,OAAO,UAGlC/D,OAEEjX,KAAKiV,UAAU8F,UAAU9S,IAAI,UAC7BjI,KAAKiV,UAAU8F,UAAUC,OAAO,gBAChChb,KAAKiV,UAAU8F,UAAUC,OAAO,eAGlCC,mBAEEjG,GAAckG,YAAYlb,KAAKiV,WAGjCkG,mBAEEnG,GAAcoG,YAAYpb,KAAKiV,WAGjCoF,YAAYrC,GAEVhY,KAAKiV,UAAUoG,MAAMC,QAAUtD,EAAmB,GAAGhY,KAAKU,iBCxE/C,MAAM6a,GAEnBC,iBAGArE,YAGAQ,WAGA/N,UAGA6R,kBAGAC,iBAGAC,iBCpBa,MAAMC,GAEnBxa,eAKAya,UAKA1E,SAAS1O,EAASqT,IAKlBnE,QAAQlP,EAASqT,IAKjBC,UAKAC,gQCrBa,MAAMC,WAA2BC,EAE9C9a,YAAY+a,EAAMC,EAAMC,GAEtB3N,MAAM,CACJ4N,aAAcH,GAAUI,GACxBC,eAAgBJ,GAAQK,GACxBJ,SAAUA,GAAc,CACtBK,OAAQ,CAAE3X,MAAO,IAAI4X,EAAM,gBCNpB,MAAMC,WAAqBV,EAExC9a,YAAYyb,EAAaC,EAAaC,GAEpCrO,MAAM,CACJ2N,SAAU,CACRW,SAAU,CAAEjY,MAAO,MACnBkY,YAAa,CAAElY,MAAO,IAAIwR,EAAQ,EAAG,IACrC2G,kBAAmB,CAAEnY,MAAO,IAAIwR,EAAQ,EAAG,KAE7CwG,QAASA,GAAW,GACpBT,aAAcQ,mGACdN,eAAgBK,uHAChBM,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXC,UAAWC,KCNjB,OAAe,IAlBf,MAEEzd,OAEEC,KAAKyd,cAAWra,EAGduI,YAAQ+R,GAEV1d,KAAKyd,SAAWC,EAGd/R,cAEF,OAAO3L,KAAKyd,WCJhB,OAAe,IAVf,MAEE1d,OAEEC,KAAK2d,eAAiB,EACtB3d,KAAK4d,kCAAmC,EACxC5d,KAAK6d,uBAAwB,ICAlB,MAAMC,GAEnB1c,YAAY2c,GAEV/d,KAAK+d,kBAAoBA,EACzB/d,KAAKge,aAAe,KAEpBhe,KAAKie,OAAS7D,SAAS8D,cAAc,UACrCle,KAAKme,IAAMne,KAAKie,OAAOG,WAAW,MAGpCC,cAAcC,EAAY,SAExB,GAAyB,MAArBte,KAAKge,cAAwBhe,KAAK+d,kBACtC,CACE,MAAMvZ,EAAO4V,SAASmE,qBAAqB,QAAQ,GAC7CC,EAAQpE,SAAS8D,cAAc,OAC/BO,EAAYrE,SAASsE,eAAe,eAC1CF,EAAMG,YAAYF,GAClBD,EAAMI,aAAa,QAAS,QAAQN,oCACpC9Z,EAAKma,YAAYH,GACjBxe,KAAKge,aAAeQ,EAAMK,aAC1Bra,EAAKsa,YAAYN,GAEnB,OAAOxe,KAAKge,aAGde,cAAcC,EAAMC,EAAO,cAEzB,MAAMhd,EAAO,IAAIsU,EAIjB,OAHAvW,KAAKme,IAAIc,KAAOA,EAChBhd,EAAKqF,EAAIvB,KAAKmZ,KAAKlf,KAAKme,IAAIgB,YAAYH,GAAMI,OAC9Cnd,EAAKsF,EAAIxB,KAAKmZ,KAAKlf,KAAKqe,cAAcY,IAC/Bhd,EAGTod,YAAYL,EAAMM,EAAa,IAM7B,OAJAA,EAAWL,KAAOK,EAAWL,MAAQ,aACrCK,EAAWC,WAAaD,EAAWC,YAAc,UAEjDvf,KAAKwf,OAAOR,EAAMM,EAAYtf,KAAKie,OAAQje,KAAKme,KACzCne,KAAKie,OAGdwB,gBAAgBT,EAAMM,GAEpB,MAAMrB,EAASje,KAAKqf,YAAYL,EAAMM,GAChCI,EAAiB,IAAIC,EAAc1B,EAAQ2B,EAC/CC,EACAA,EACAC,EACAA,GAIF,OAHAJ,EAAeK,iBAAkB,EACjCL,EAAeM,aAAc,EAEtBN,EAGTF,OAAOR,EAAMM,IAGbW,UAAU9B,EAAK7W,EAAGC,EAAG6X,EAAOc,EAAQC,EAAQC,EAAMC,GAUhD,QARsB,IAAXA,IAETA,GAAS,QAEW,IAAXF,IAETA,EAAS,GAEW,iBAAXA,EAETA,EAAS,CAAEG,GAAIH,EAAQI,GAAIJ,EAAQK,GAAIL,EAAQM,GAAIN,OAGrD,CACE,MAAMO,EAAgB,CAAEJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACjD,IAAK,MAAME,KAAQD,EAEjBP,EAAOQ,GAAQR,EAAOQ,IAASD,EAAcC,GAGjDxC,EAAIyC,YACJzC,EAAI0C,OAAOvZ,EAAI6Y,EAAOG,GAAI/Y,GAC1B4W,EAAI2C,OAAOxZ,EAAI8X,EAAQe,EAAOI,GAAIhZ,GAClC4W,EAAI4C,iBAAiBzZ,EAAI8X,EAAO7X,EAAGD,EAAI8X,EAAO7X,EAAI4Y,EAAOI,IACzDpC,EAAI2C,OAAOxZ,EAAI8X,EAAO7X,EAAI2Y,EAASC,EAAOK,IAC1CrC,EAAI4C,iBAAiBzZ,EAAI8X,EAAO7X,EAAI2Y,EAAQ5Y,EAAI8X,EAAQe,EAAOK,GAAIjZ,EAAI2Y,GACvE/B,EAAI2C,OAAOxZ,EAAI6Y,EAAOM,GAAIlZ,EAAI2Y,GAC9B/B,EAAI4C,iBAAiBzZ,EAAGC,EAAI2Y,EAAQ5Y,EAAGC,EAAI2Y,EAASC,EAAOM,IAC3DtC,EAAI2C,OAAOxZ,EAAGC,EAAI4Y,EAAOG,IACzBnC,EAAI4C,iBAAiBzZ,EAAGC,EAAGD,EAAI6Y,EAAOG,GAAI/Y,GAC1C4W,EAAI6C,YACAZ,GAEFjC,EAAIiC,OAEFC,GAEFlC,EAAIkC,UCtFV,OAAe,IAff,MAEEtgB,KAAKkhB,EAAa,IAEhBjhB,KAAKkhB,IAAM,EAEXlhB,KAAK2O,IAAO,GAGdwS,UAAUC,MCfG,MAAMC,GAEnBjgB,eAIIkgB,mBAEF,OAAO,EAGTnK,SAASoC,IAKT3P,OAAO2P,IAIP5B,QAAQ4B,KCfK,MAAMgI,GAEnBngB,cAEEpB,KAAK+G,EAAI,EACT/G,KAAKwhB,kBAAoB,EAGvBF,mBAEF,OAAO,EAGTnK,SAASsK,IAIT7X,OAAO6X,GAELzhB,KAAK+G,GAAKwR,GAAK1O,WAAa4X,EAASpY,SAErCrJ,KAAKwhB,kBAAoBC,EAASvW,gBAAgBlL,KAAK+G,GACvD/G,KAAKwhB,kBAAoBva,EAAMsB,MAAMvI,KAAKwhB,kBAAmB,EAAG,GAEhEC,EAASC,mBAAmBza,EAAMC,KAAKua,EAAS7a,KAAM6a,EAAS5a,GAAI7G,KAAKwhB,oBAEpExhB,KAAKwhB,mBAAqB,QAE5BC,EAASC,mBAAmBD,EAAS5a,IAErC4a,EAASE,kBAAkB,IAAIN,IAC/BI,EAASG,kBAAkBH,IAI/B9J,QAAQ4B,KCpCK,MAAMsI,GAEnBzgB,aAAY+P,QACVA,EAAO2Q,aACPA,EAAYlb,KACZA,EAAO,EAACC,GACRA,EAAK,EAACwC,SACNA,EAAW,EAAC0Y,aACZA,EAAe,GAAEC,aACjBA,EAAgB,GAAE9W,gBAClBA,EAAkBsD,GAAgBhC,kBAAiBoV,kBACnDA,EAAoB,WAIpB5hB,KAAKmR,QAAUA,EACfnR,KAAK8hB,aAAeA,EACpB9hB,KAAK4G,KAAOA,EACZ5G,KAAK6G,GAAKA,EACV7G,KAAK+hB,aAAeA,EACpB/hB,KAAKgiB,aAAeA,EACpBhiB,KAAKqJ,SAAWA,EAChBrJ,KAAKkL,gBAAkBA,EACvBlL,KAAK4hB,kBAAoBA,EAEzB5hB,KAAK+X,cAAgB,IAAIsJ,GAG3BY,UAEEjiB,KAAK2hB,kBAAkB,IAAIJ,IAG7BhY,OAEEvJ,KAAK2hB,kBAAkB,IAAIN,IAG7BK,mBAAmB3c,GAEjB/E,KAAKmR,QAAQkK,MAAMrb,KAAK8hB,cAAgB,GAAG9hB,KAAK+hB,eAAehd,IAAQ/E,KAAKgiB,eAG9EpY,SAEE5J,KAAK+X,cAAcnO,OAAO5J,MAGxBshB,mBAEF,OAAOthB,KAAK+X,cAAcuJ,aAG5BK,kBAAkBrQ,GAEhBtR,KAAK+X,cAAcJ,QAAQ3X,MAC3BA,KAAK+X,cAAgBzG,EACrBtR,KAAK+X,cAAcZ,SAASnX,OCrDjB,MAAMkiB,WAAmBC,EAEtC/gB,YAAYghB,EAAQ,GAElB1T,QAEA,MAAM2T,EAAc,GACpBA,EAAY1b,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IACnC8b,EAAY1b,KAAK,IAAIJ,EAAQ,EAAG,EAAG,MAEnC,MAAM+b,EAAgB,IAAIC,EAAkB,CAAEC,MAAO,QAAUjF,UAAWC,IACpEiF,GAAgB,IAAIC,GAAiBC,cAAcN,GACnDO,EAAiB,IAAIC,EAAKJ,EAAeH,GAC/CM,EAAeE,YAAc,IAE7B,MAAMC,EAAe,GACrBA,EAAapc,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IACpCwc,EAAapc,KAAK,IAAIJ,EAAQ,EAAG,IAAM,IAEvC,MAAMyc,EAAiB,IAAIT,EAAkB,CAAEC,MAAO,QAAUjF,UAAWC,IACrEyF,GAAiB,IAAIP,GAAiBC,cAAcI,GACpDG,EAAkB,IAAIL,EAAKI,EAAgBD,GACjDE,EAAgBJ,YAAc,IAE9B,MAAMK,EAAa,GACnBA,EAAWxc,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IAClC4c,EAAWxc,KAAK,IAAIJ,EAAQ,IAAM,EAAG,IAErC,MAAM6c,EAAe,IAAIb,EAAkB,CAAEC,MAAO,SAAUjF,UAAWC,IACnE6F,GAAe,IAAIX,GAAiBC,cAAcQ,GAClDG,EAAgB,IAAIT,EAAKQ,EAAcD,GAC7CE,EAAcR,YAAc,IAE5B9iB,KAAK8iB,YAAc,IAEnB9iB,KAAKiI,IAAI2a,GACT5iB,KAAKiI,IAAIib,GACTljB,KAAKiI,IAAIqb,GAETtjB,KAAKoiB,MAAMmB,IAAInB,EAAOA,EAAOA,GAG/BxY,UAIAoS,YCXF,OAAe,IAzCf,MAEEjc,OAEEC,KAAKyd,SAAW,IAAI+F,EACpBxjB,KAAKyd,SAAS/c,KAAO,gBAGvB+iB,UAAU/iB,IAKNiL,cAEF,OAAO3L,KAAKyd,SAGV9R,YAAQ+X,GAEV1jB,KAAKyd,SAAWiG,EAGlB1H,UAWE,IATAhc,KAAK2L,QAAQgY,UAASC,IAEhBA,EAAMC,WAERD,EAAMC,SAAS7H,UACf4H,EAAME,SAAS9H,cAIZhc,KAAK2L,QAAQoY,SAAS9e,OAAS,GAEpCjF,KAAK2L,QAAQqP,OAAOhb,KAAK2L,QAAQoY,SAAS,MCjCjC,MAAMC,WAAaC,EAEhC7iB,YAAYa,EAAMiiB,EAAU1B,GAE1BvgB,EAAWA,GAAQ,IAAIsE,EAAQ,EAAG,EAAG,GACrC2d,EAAWA,GAAY,IAAI3d,EAAQ,EAAG,EAAG,GACzCic,EAAWA,GAAS,SAGpB9T,MAFiB,IAAIyV,EAAYliB,EAAKqF,EAAGrF,EAAKsF,EAAGtF,EAAK8F,EAAGmc,EAAS5c,EAAG4c,EAAS3c,EAAG2c,EAASnc,GACzE,IAAIqc,EAAkB,CAAE5B,MAAOA,MCTrC,MAAM6B,WAAeJ,EAElC7iB,YAAY+e,EAAQqC,GAElBA,EAAQA,GAAS,UAIjB9T,MAFiB,IAAI4V,EADrBnE,EAASA,GAAU,EAC+B,GAAI,IACrC,IAAIiE,EAAkB,CAAE5B,MAAOA,MCJrC,MAAM+B,WAAcN,EAEjC7iB,YAAYohB,EAAOvd,EAAQuf,GAEzBhC,EAAQA,GAAS,UAGjB,MACMiC,GAHNxf,EAASA,GAAU,GAEC,GAEdyf,EAAe,IAAIC,EAAuB,IAAM,IAAMF,EAAiB,IAC7EC,EAAaE,UAAU,EAAGH,EAAkB,EAAG,GAE/C,MAAMI,EAAgB,IAAIC,EAAmB,GALzB,GAK2C,IAC/DD,EAAcD,UAAU,EAAGH,EAAkBM,GAAiB,GAE9D,MAAMC,EAAkBC,GAAoBC,sBAAsB,CAACR,EAAcG,IACjFG,EAAgBG,QAAQ,MAGxBzW,MAAMsW,EADW,IAAIZ,EAAkB,CAAE5B,MAAOA,KAG5CgC,GAEFxkB,KAAKolB,WAAWC,mBAAmB,IAAI9e,EAAQ,EAAG,EAAG,GAAIie,GAG3DxkB,KAAKslB,KAAOd,EAGVA,QAAIA,GAENxkB,KAAKolB,WAAWC,mBAAmB,IAAI9e,EAAQ,EAAG,EAAG,GAAIie,GACzDxkB,KAAKslB,KAAOd,EAGVA,UAEF,OAAOxkB,KAAKslB,KAGVrgB,WAAOF,GAET/E,KAAKoiB,MAAMra,EAAIhD,EAGbE,aAEF,OAAOjF,KAAKoiB,MAAMra,GCmBtB,OAAe,IAvEf,MAEEhI,OAEEC,KAAKof,MAAQ,EACbpf,KAAKkgB,OAAS,EAEdlgB,KAAKulB,SAAW,IAAIhP,EAEpBvW,KAAKwlB,aAAe,EACpBxlB,KAAKylB,cAAgB,EACrBzlB,KAAK0lB,aAAe,IAAInP,EAAQvW,KAAKof,MAAOpf,KAAKkgB,QAEjDlgB,KAAKkhB,IAAM,EACXlhB,KAAK2lB,WAAa,IAAIpP,EAAQ,EAAIvW,KAAKof,MAAO,EAAIpf,KAAKkgB,QAGzD0F,gBAAgBte,EAAGC,GAEjBvH,KAAKulB,SAAShC,IAAIjc,EAAGC,GAGvBqC,SAEE5J,KAAK6lB,cAAe,EAGtBC,YAAY1G,EAAOc,GAEjBlgB,KAAKof,MAAQA,EACbpf,KAAKkgB,OAASA,EAEdlgB,KAAK2lB,WAAa,IAAIpP,EAAQ,EAAIvW,KAAKof,MAAO,EAAIpf,KAAKkgB,QAEvDlgB,KAAK0lB,aAAape,EAAI8X,EACtBpf,KAAK0lB,aAAane,EAAI2Y,EAEtBlgB,KAAKwlB,aAAepG,EAAQpf,KAAKkhB,IACjClhB,KAAKylB,cAAgBvF,EAASlgB,KAAKkhB,IAEnClhB,KAAK6lB,cAAe,EAGtBE,uBAAuBC,GAIrB,OAFAA,EAAQ9d,eAAe,EAAIlI,KAAKkhB,KAEzB8E,EAGTC,oBAAoBlhB,GAElB,OAAOA,GAAS,EAAI/E,KAAKkhB,KAG3BgF,iBAEE,OAAOlmB,KAAK2lB,WAGVQ,mBAEF,OAAOnmB,KAAKof,MAAQpf,KAAKkgB,OAGvBkG,eAEF,OAAOpmB,KAAKof,MAAQpf,KAAKkgB,SCnEd,MAAMmG,WAAmCpK,GAEtD7a,YAAYkG,EAAGC,EAAGO,EAAGwe,GA4BnB5X,MA1Ba,ogBAiBA,8JASK,CAChBsO,SAAU,CAAEjY,WAAO3B,GACnBmjB,qBAAsB,CAAExhB,MAAO,IAAIwR,GACnCiQ,YAAa,CAAEzhB,MAAO,IAAIwR,GAC1BkQ,aAAc,CAAE1hB,MAAO,IAAIwR,KAI/BmQ,aAAapf,EAAGC,GAEdvH,KAAKqc,SAASkK,qBAAqBxhB,MAAMwe,IAAIjc,EAAGC,GAGlDof,YAAYC,EAAK9e,EAAGwe,GAElBtmB,KAAKqc,SAASW,SAASjY,MAAQ6hB,EAC/B5mB,KAAKqc,SAASoK,aAAa1hB,MAAMwe,IAAIqD,EAAIzR,MAAMiK,MAAOwH,EAAIzR,MAAM+K,aAEtD9c,IAAN0E,IAEF9H,KAAKqc,SAASoK,aAAa1hB,MAAMuC,EAAIQ,QAE7B1E,IAANkjB,IAEFtmB,KAAKqc,SAASoK,aAAa1hB,MAAMwC,EAAI+e,GAIzCO,gBAAgB/e,EAAGwe,GAEjBtmB,KAAKqc,SAASmK,YAAYzhB,MAAMwe,IAAIzb,EAAGwe,IC3D5B,MAAMQ,WAA0BC,EAE7C3lB,YAAY4lB,EAAKC,EAAQC,EAAMC,GAE7BzY,MAAMsY,EAAKC,EAAQC,EAAMC,GAEzBnnB,KAAKonB,YAAc,IAAIzK,EAAM,WAC7B3c,KAAKqnB,YAAc,GCyPvB,OAAe,IA1Of,MAEEtnB,OAEEC,KAAKsnB,YAAc,IAAI/gB,EAAQ,EAAG,EAAG,GACrCvG,KAAKunB,aAAe,IAAIhhB,EAAQ,EAAG,EAAG,GACtCvG,KAAKwnB,qBAAkBpkB,EAEvBpD,KAAKynB,uBAAyB,GAE9BznB,KAAKme,SAAM/a,EACXpD,KAAK0jB,MAAQ,IAAIF,EACjBxjB,KAAK0d,OAAS,IAAIoJ,GAIpBY,WAAWC,EAAQnD,EAAKhC,EAAQ,UAE9B,MAAMoF,EAAQ,IAAIrD,GAAM/B,EAAOgC,EAAIvf,SAAUuf,EAAIlgB,QAAQujB,aAGzD,OAFAD,EAAMrC,SAASuC,KAAKH,GACpBI,GAAapc,QAAQ1D,IAAI2f,GAClBA,EAGTI,YAEE,MAAMC,EAAO,IAAI/F,GAEjB,OADA6F,GAAapc,QAAQ1D,IAAIggB,GAClBA,EAGTC,aAAaC,GAEXnoB,KAAKooB,SAAWD,EAGlBE,eAAeC,EAAalJ,EAAOc,EAAQsC,GAEzCpD,EAASA,GAAS,IAClBc,EAASA,GAAU,IACnBlgB,KAAKme,IAAIoK,UAAa/F,GAAS,qBAC/BxiB,KAAKme,IAAIqK,SAASF,EAAYhhB,EAAI8X,EAAQ,EACvCpf,KAAKme,IAAIF,OAAOiC,OAASoI,EAAY/gB,EAAK2Y,EAAS,EAAGd,EAAOc,GAGlEuI,QAEMzoB,KAAKme,KAEPne,KAAKme,IAAIuK,UAAU,EAAG,EAAG1oB,KAAKme,IAAIF,OAAOmB,MAAOpf,KAAKme,IAAIF,OAAOiC,QAIpEyI,aAAa/hB,EAAMC,EAAI2b,GAErBxiB,KAAKme,IAAIyK,YAAepG,GAAS,qBACjCxiB,KAAKme,IAAIyC,YACT5gB,KAAKme,IAAI0C,OAAOja,EAAKU,EAAGV,EAAKW,GAC7BvH,KAAKme,IAAI2C,OAAOja,EAAGS,EAAGT,EAAGU,GACzBvH,KAAKme,IAAI6C,YACThhB,KAAKme,IAAIkC,SAGXwI,UAAUziB,EAAQoc,EAAQ,UAExB,MAAMsB,EAAW,IAAIvB,EAAkB,CACrCC,MAAOA,IAGHqB,GAAW,IAAInB,GAAiBC,cAAcvc,GAE9C0iB,EAAO,IAAIjG,EAAKgB,EAAUC,GAGhC,OAFAgF,EAAKC,eAAgB,EACrBhB,GAAapc,QAAQ1D,IAAI6gB,GAClBA,EAGTE,UAAUC,EAAKhnB,EAAMugB,GAEnBvgB,EAAOA,GAAQ,EACfugB,EAAQA,GAAS,SACjByG,EAAMA,GAAO,IAAI1iB,EAEjB,MAAM2iB,EAAO,IAAIlF,GAAK,IAAIzd,EAAQtE,EAAMA,EAAMA,QAAOmB,EAAWof,GAGhE,OAFA0G,EAAK3D,SAASuC,KAAKmB,GACnBlB,GAAapc,QAAQ1D,IAAIihB,GAClBA,EAGTC,mBAAmBviB,EAAMC,EAAIqZ,EAAS,EAAGsC,EAAQ,UAAW4G,EAAQ,IAElE,MAAMnnB,EAAO2E,EAAKyiB,WAAWxiB,GACvBqiB,EAAO,IAAIlF,GAAK,IAAIzd,EAAQ6iB,EAAOlJ,EAAQje,QAAOmB,EAAWof,GAE7Dxa,EAASnB,EAAGvC,QAAQglB,IAAI1iB,GAAMsB,eAAe,IAC7CqhB,EAAcvhB,EAAO1D,QAAQujB,YAanC,OAZA7f,EAAOC,IAAIrB,GAEXsiB,EAAK3D,SAASuC,KAAK9f,GAOnBkhB,EAAK9D,WAAWC,mBAAmB,IAAI9e,EAAQ,EAAG,GAAI,GAAIgjB,GAE1DxB,GAAapc,QAAQ1D,IAAIihB,GAClBA,EAGTM,WAAWpK,EAAOc,EAAQsC,GAExB,MAAMqB,EAAW,IAAI4F,EAAoBrK,EAAOc,GAC1C4D,EAAW,IAAI5H,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAE3X,MAAO,IAAI2kB,EAAQ,EAAG,EAAG,EAAG,MAExCpN,aAAcqN,GACdnN,eAAgBoN,GAChBC,aAAa,EACb1M,YAAY,IAGR9W,EAAQ,IAAI4d,EAAKJ,EAAUC,GAGjC,OAFAzd,EAAMyc,aAAe,IACrBiF,GAAapc,QAAQ1D,IAAI5B,GAClBA,EAGTyjB,gBAAgBb,EAAKhnB,EAAMugB,GAEzBvgB,EAAOA,GAAQ,EACfugB,EAAQA,GAAS,SAEjB,MAAMuH,GAAM,IAAIC,GAAOC,qBAAqB,IAAI1jB,EAAW,IAAIA,EAAQtE,EAAMA,EAAMA,IAC7EioB,EAAS,IAAIC,EAAWJ,EAAKvH,GAEnC,OADA0H,EAAO3E,SAASuC,KAAKmB,GAAO,IAAI1iB,GACzB2jB,EAGTE,YAAYnB,EAAKhnB,EAAMugB,GAErBvgB,EAAOA,GAAQ,EACfugB,EAAQA,GAAS,SACjByG,EAAMA,GAAO,IAAI1iB,EAEjB,MAAM8jB,EAAS,IAAIhG,GAAOpiB,EAAMugB,GAGhC,OAFA6H,EAAO9E,SAASuC,KAAKmB,GACrBlB,GAAapc,QAAQ1D,IAAIoiB,GAClBA,EAGTC,iBAAiBC,EAAcC,GAAO,EAAOhI,EAAQ,UAEnD,MAAMiI,EAAU,IAAIC,EAAiBH,EAAcC,GACnDC,EAAQE,mBACR,MAAMvkB,EAASqkB,EAAQG,gBAAgB,KAGvC,OAFoB5qB,KAAK6oB,UAAUziB,EAAQ,OAK7CykB,mBAAmBR,EAAQ7H,GAEzBA,EAAQA,GAAS,SACjB,MAAMqB,EAAW,IAAIiH,EAAeT,EAAOlK,OAAQ,GAAI,IACjD2D,EAAW,IAAIM,EAAkB,CAAE5B,MAAOA,IAC1CuI,EAAc,IAAI9G,EAAKJ,EAAUC,GAGvC,OAFAiH,EAAYxF,SAASuC,KAAKuC,EAAOriB,QACjC+f,GAAapc,QAAQ1D,IAAI8iB,GAClBA,EAGTC,iBAAiBX,GAEf,MAAMxG,EAAW,IAAIiH,EAAeT,EAAOlK,OAAQ,GAAI,IACjD2D,EAAW,IAAI5H,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAE3X,MAAO,IAAI2kB,EAAQ,EAAG,EAAG,EAAG,MAExCpN,aAAcqN,GACdnN,eAAgBoN,GAChBC,aAAa,IAGToB,EAAU,IAAIhH,EAAKJ,EAAUC,GACnCmH,EAAQ1F,SAASuC,KAAKuC,EAAOriB,QAC7B+f,GAAapc,QAAQ1D,IAAIgjB,GAG3BC,kBAAkBC,GAEhB,MAAMjB,EAAS,IAAIC,EAAWgB,EAAI,UAClCpD,GAAapc,QAAQ1D,IAAIiiB,GAG3BkB,WAAWC,EAAOC,GAEhB,MAAMC,EAAS,IAAIhlB,EAAQ,EAAG,EAAG,GAC7B+kB,IAEFC,EAAOhkB,EAAI+jB,EAAQC,QAAU,GAG/B,IAAK,IAAI9kB,EAAI,EAAGA,EAAI4kB,EAAMpmB,OAAS,EAAGwB,IAEpCzG,KAAK6oB,UAAUwC,EAAM5kB,GAAGnC,QAAQ2D,IAAIsjB,GAASF,EAAM5kB,EAAI,GAAGnC,QAAQ2D,IAAIsjB,IAI1EC,aAAa5E,EAAK9e,EAAGwe,GAEnB,MAAMmF,EAAO,IAAIxH,EAAK,IAAIwF,EAAoB,EAAG,GAAI,IAAIpD,IAKzD,OAJArmB,KAAKynB,uBAAuB9gB,KAAK8kB,GACjCzrB,KAAK0jB,MAAMzb,IAAIwjB,GAEfA,EAAK3H,SAAS6C,YAAYC,EAAK9e,EAAGwe,GAC3BmF,EAGT5P,OAAO6P,GAEL,IAAK,IAAIjlB,EAAI,EAAGA,EAAIzG,KAAKynB,uBAAuBxiB,OAAQwB,IAEtDzG,KAAKynB,uBAAuBhhB,GAAGqd,SAAS+C,gBAAgB8E,GAAQvM,MAAOuM,GAAQzL,QAE7ElgB,KAAK0jB,MAAMK,SAAS9e,OAAS,GAE/BymB,EAAS7P,OAAO7b,KAAK0jB,MAAO1jB,KAAK0d,UCzPxB,MAAMkO,WAAiChP,GAEpDxb,YAAYyqB,EAAaC,GAEvBpd,2aACA1O,KAAKqc,SAAS0P,aAAe,CAAEhnB,MAAO,IAAI2kB,EAAQmC,EAAaC,EAAaxkB,EAAGwkB,EAAavkB,EAAGukB,EAAa/jB,KCLjG,MAAMikB,WAA4B9P,EAE/C9a,cAEEsN,MAAM,CACJ2N,SAAU,CACR4P,UAAW,CAAElnB,MAAO,IAEtBuX,6QACAE,+dAIA0P,cAAUnnB,GAEZ/E,KAAKqc,SAAS4P,UAAUlnB,MAAQA,EAG9BmnB,gBAEF,OAAOlsB,KAAKqc,SAAS4P,UAAUlnB,OChBpB,MAAMonB,GAEnB/qB,cAEEpB,KAAKmoB,GAAK,IAAIiE,EAAkBT,GAAQvM,MAAOuM,GAAQzL,QAEvDlgB,KAAKqsB,uBAAyB,IAAIT,GAAyB,EAAG,IAAIrlB,EAAQ,EAAG,EAAG,IAChFvG,KAAKssB,sBAAwB,IAAIN,GAGnCnQ,OAAO6P,GAEL1rB,KAAKusB,2BAELb,EAASjD,MAAMzoB,KAAKmoB,QAAI/kB,GAAW,GAAM,GAEzCsoB,EAASc,yBAAyBxsB,KAAKmoB,GAAInoB,KAAKqsB,wBAEhDrsB,KAAKssB,sBAAsBJ,UAAYO,GAAc9gB,QAAQwb,IAE7DuE,EAAS7P,YAAOzY,OAAWA,EAAWpD,KAAKmoB,GAAInoB,KAAKssB,uBAGtDC,2BAEMvsB,KAAKmoB,GAAG/I,QAAUuM,GAAQvM,OAASpf,KAAKmoB,GAAGjI,SAAWyL,GAAQzL,QAEhElgB,KAAKmoB,GAAGuE,QAAQf,GAAQvM,MAAOuM,GAAQzL,QAIvCyM,oBAEF,OAAO3sB,KAAKmoB,ICnCD,MAAMyE,GAEnBxrB,YAAY0a,GAEV9b,KAAK8b,SAAWA,EAChB9b,KAAK6sB,YAAc,IAAIrJ,EACvBxjB,KAAK8sB,eAAiB,IAAIlQ,GAC1B5c,KAAK+sB,WAAa,IAAI9I,EACpB,IAAIwF,EAAoB,EAAG,GAAIzpB,KAAK8sB,gBACtC9sB,KAAK6sB,YAAY5kB,IAAIjI,KAAK+sB,YAC1B/sB,KAAKgtB,aAAe,IAAIC,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAO,KAGnEC,KAAK7X,EAAK8X,GAERntB,KAAK+sB,WAAWjJ,SAAW9jB,KAAK8sB,eAEhC,MAAMM,GAA0C,IAA5B/X,EAAIgY,oBAA+BhY,EAAIiY,QAAUjY,EAC/DkY,GAA0C,IAA5BlY,EAAIgY,oBAA+BhY,EAAI+J,MAAU/J,EAAIF,MAAMiK,MACzEoO,GAA0C,IAA5BnY,EAAIgY,oBAA+BhY,EAAI6K,OAAU7K,EAAIF,MAAM+K,OAE/ElgB,KAAK+sB,WAAWjJ,SAASzH,SAASW,SAASjY,MAAQqoB,EACnDptB,KAAK+sB,WAAWjJ,SAASzH,SAASY,YAAYlY,MAAMwe,IAAIgK,EAAWC,GAE/DL,EAEFntB,KAAK+sB,WAAWjJ,SAASzH,SAASa,kBAAkBnY,MAAMwe,IAAI4J,EAAI/N,MAAO+N,EAAIjN,QAI7ElgB,KAAK8b,SAAS2R,QAAQztB,KAAK+sB,WAAWjJ,SAASzH,SAASa,kBAAkBnY,OAG5E/E,KAAK0tB,SAASP,GAGhBQ,cAAcC,EAAKT,GAEjBntB,KAAK+sB,WAAWjJ,SAAW8J,EAI3B5tB,KAAK0tB,SAASP,GAGhBU,mBAAmBxY,EAAK8X,EAAKS,GAE3B,MAAMR,GAA0C,IAA5B/X,EAAIgY,oBAA+BhY,EAAIiY,QAAUjY,EAC/DkY,GAA0C,IAA5BlY,EAAIgY,oBAA+BhY,EAAI+J,MAAU/J,EAAIF,MAAMiK,MACzEoO,GAA0C,IAA5BnY,EAAIgY,oBAA+BhY,EAAI6K,OAAU7K,EAAIF,MAAM+K,OAE/ElgB,KAAK+sB,WAAWjJ,SAAW8J,EAC3B5tB,KAAK+sB,WAAWjJ,SAASzH,SAASW,SAASjY,MAAQqoB,EACnDptB,KAAK+sB,WAAWjJ,SAASzH,SAASY,YAAYlY,MAAMwe,IAAIgK,EAAWC,GAE/DL,EAEFntB,KAAK+sB,WAAWjJ,SAASzH,SAASa,kBAAkBnY,MAAMwe,IAAI4J,EAAI/N,MAAO+N,EAAIjN,QAI7ElgB,KAAK8b,SAAS2R,QAAQztB,KAAK+sB,WAAWjJ,SAASzH,SAASa,kBAAkBnY,OAG5E/E,KAAK0tB,SAASP,GAGhBX,yBAAyBsB,EAAQF,GAE/B5tB,KAAK+sB,WAAWjJ,SAAW8J,EAE3B5tB,KAAK0tB,SAASI,GAGhB9R,UAEEhc,KAAK+sB,WAAWlJ,SAAS7H,UACzBhc,KAAK+sB,WAAWjJ,SAAS9H,UAG3B0R,SAASvF,GAEPA,OAAY/kB,IAAP+kB,EAAmB,KAAOA,EAE/B,MAAM4F,EAAa/tB,KAAK8b,SAASkS,kBAEjChuB,KAAK8b,SAASmS,qBAAuB7qB,IAAP+kB,EAAmB,KAAOA,GACxDnoB,KAAK8b,SAASD,OAAO7b,KAAK6sB,YAAa7sB,KAAKgtB,cAE5ChtB,KAAK8b,SAASmS,gBAAgBF,ICgPlC,OAAe,IArUf,MAEEhuB,KAAKke,EAAQiQ,GAEXluB,KAAKmuB,eAAY/qB,EACjBpD,KAAKouB,aAAUhrB,EACfpD,KAAKie,YAAS7a,EACdpD,KAAKquB,eAAYjrB,EACjBpD,KAAKsuB,yBAAsBlrB,EAC3BpD,KAAKuuB,4BAA6B,EAClCvuB,KAAKwuB,gCAA6BprB,EAElCpD,KAAKyuB,WAAY,EACjBzuB,KAAK0uB,oBAAiBtrB,EACtBpD,KAAKkuB,wBAAqB9qB,EAE1BpD,KAAKkuB,mBAAqB,CACxBS,OAAO,EACPvF,OAAO,EACPwF,gBAAgB,EAChBC,SAAS,EACTC,WAAW,EACXC,oBAAoB,EACpBC,uBAAuB,EACvBC,gBAAiB,mBACjBC,wBAAwB,EACxBC,cAAc,EACdC,YAAY,GAGdjmB,OAAOmP,OAAOtY,KAAKkuB,mBAAoBA,GAEnCluB,KAAKkuB,mBAAmBiB,aAE1BnvB,KAAK0uB,eAAiBzQ,EAAOG,WAAW,SAAUpe,KAAKkuB,qBACjCjQ,EAAOG,WAAW,QAASpe,KAAKkuB,qBAChCjQ,EAAOG,WAAW,qBAAsBpe,KAAKkuB,oBAInEluB,KAAK0uB,eAAiBzQ,EAAOG,WAAW,QAASpe,KAAKkuB,qBAChCjQ,EAAOG,WAAW,qBAAsBpe,KAAKkuB,oBAGrEluB,KAAKyuB,UAAqD,2BAAzCzuB,KAAK0uB,eAAettB,YAAYV,KAIjDV,KAAKmuB,UAAY,IAAIkB,EAAc,CACjCpR,OAAQA,EACRxV,QAASzI,KAAK0uB,iBAGZ1uB,KAAKkuB,mBAAmBkB,aAE1BpvB,KAAKmuB,UAAUmB,GAAGC,SAAU,GAG9BvvB,KAAKmuB,UAAUqB,WAAY,EAE3BxvB,KAAKmuB,UAAUsB,cAAc,GAE7B9D,GAAQzK,IAAMwO,GAAcxO,IAEvBlhB,KAAKyuB,WAERzuB,KAAKmuB,UAAUwB,WAAW/qB,IAAI,0BAGhC5E,KAAKouB,QAAU,IAAIxB,GAAQ5sB,KAAKmuB,WAEhCnuB,KAAKie,OAASje,KAAKmuB,UAAUyB,WAE7B5vB,KAAKquB,UAAY,IAAIzS,GAErB5b,KAAKsuB,oBAAsBtuB,KAAKquB,UAChCwB,GAAalS,eAAiB3d,KAAKmuB,UAAU2B,aAAaC,mBAC1DF,GAAajS,iCAAmC5d,KAAKmuB,UAAU2B,aAAaE,kBAAoB,EAChGH,GAAahS,sBAAwB7d,KAAKmuB,UAAU2B,aAAaG,oBAEjEjwB,KAAKuuB,4BAA6B,EAElCvuB,KAAKwuB,2BAA6B,IAAIrC,GAEtCnsB,KAAKkwB,gBAAkB,IAAIC,eAAenwB,KAAKowB,UAAUrsB,KAAK/D,OAC9DA,KAAKkwB,gBAAgBG,QAAQrwB,KAAKie,QAGhCqS,kBAEF,OAAOtwB,KAAKmuB,UAAUyB,WAGpBW,uBAEF,OAAOvwB,KAAKwuB,2BAA2B7B,cAGzCtU,UAAUmY,GAIRxwB,KAAKsuB,oBAAoB3W,QAAQ3X,KAAMA,KAAKmuB,WAC5CnuB,KAAKsuB,oBAAsBkC,EAC3BxwB,KAAKsuB,oBAAoBnX,SAASnX,KAAMA,KAAKmuB,WAG/CvkB,SAEM5J,KAAKuuB,4BAEPvuB,KAAKwuB,2BAA2B3S,OAAO7b,MAGzCA,KAAKywB,0BAEDhE,GAAc9gB,SAEhB3L,KAAKsuB,oBAAoBzS,SAG3B8P,GAAQ/hB,SAGV6mB,0BAEMhE,GAAc9gB,UAEhB8gB,GAAc9gB,QAAQsb,OAAS0E,GAAQxF,aACvCsG,GAAc9gB,QAAQ+kB,yBACtBjE,GAAc9gB,QAAQglB,eACtBlE,GAAc9gB,QAAQilB,mBAAkB,IAI5C/U,OAAO6H,EAAOhG,EAAQyK,EAAI0I,GAExB7wB,KAAK8wB,0BAA0BpN,EAAOmN,GAEtC7wB,KAAKmuB,UAAUF,qBAAuB7qB,IAAP+kB,EAAmB,KAAOA,GACzDnoB,KAAKmuB,UAAUtS,OAAO6H,GAAUqE,GAAapc,QAC3C+R,GAAU+O,GAAc9gB,SAE1B3L,KAAK8wB,0BAA0BpN,OAAOtgB,GAGxC2tB,aAAarN,GAEPA,EAAMhI,eAERgI,EAAMhI,gBAGJgI,EAAM7H,OAER6H,EAAM7H,SAIN7b,KAAK6b,OAAO6H,OAAOtgB,GAGjBsgB,EAAMjI,gBAERiI,EAAMjI,iBAIVqV,0BAA0BpN,EAAOkK,GAE/BA,OAAcxqB,IAARwqB,EAAoB,KAAOA,EAC7BlK,EAEFA,EAAMsN,iBAAmBpD,EAIzB7F,GAAapc,QAAQqlB,iBAAmBpD,EAI5CqD,YAAY9I,EAAI+I,GAEdlxB,KAAKmuB,UAAUgD,uBAAuBhJ,EAAI,EAAG,EAAGA,EAAG/I,MAAO+I,EAAGjI,OAAQgR,GAGvEzI,MAAMN,EAAIzK,EAAQmO,EAAauF,GAE7BpxB,KAAKmuB,UAAUF,qBAAuB7qB,IAAP+kB,EAAmB,KAAOA,GAErDzK,GAEF1d,KAAKmuB,UAAUkD,cAAc3T,EAAO0J,YAAa1J,EAAO2J,aAG1DrnB,KAAKmuB,UAAU1F,QAAQ/K,IACnBmO,IACAuF,GAGNhB,UAAUkB,GAER,IAAK,MAAMC,KAASD,EAElB3F,GAAQzK,IAAMwO,GAAcxO,IAC5ByK,GAAQ/F,gBAAgB2L,EAAMC,YAAYlqB,EAAGiqB,EAAMC,YAAYjqB,GAC/DokB,GAAQ7F,YAAYyL,EAAMC,YAAYpS,MAAOmS,EAAMC,YAAYtR,QAE/DlgB,KAAKie,OAAOmB,MAASuM,GAAQnG,aAC7BxlB,KAAKie,OAAOiC,OAASyL,GAAQlG,cAE7BzlB,KAAKmuB,UAAUsD,YAAY,EAAG,EAAG9F,GAAQnG,aAAcmG,GAAQlG,eAE/DzlB,KAAKywB,0BAIT9C,cAAcC,EAAKT,GAEjBntB,KAAKouB,QAAQT,cAAcC,EAAKT,GAGlCD,KAAKwE,EAAQ5D,EAAQF,GAEfA,EAEF5tB,KAAKouB,QAAQP,mBAAmB6D,EAAQ5D,EAAQF,GAIhD5tB,KAAKouB,QAAQlB,KAAKwE,EAAQ5D,GAI9BtB,yBAAyBsB,EAAQF,GAE/B5tB,KAAKouB,QAAQ5B,yBAAyBsB,EAAQF,GAGhD+D,gBAAgBC,EAAexS,EAAQuM,GAAQvM,MAAOc,EAASyL,GAAQzL,QAIrE,MAAM2R,EAAYlG,GAAQvM,MACpB0S,EAAanG,GAAQzL,OAErB6R,EAAY3S,EACZ4S,EAAa9R,EAEb+R,EAAa,KACbC,EAAc,KAEdC,EAAcC,SAASrsB,KAAKmZ,KAAK6S,EAAYE,IAC7CI,EAAcD,SAASrsB,KAAKmZ,KAAK8S,EAAaE,IAEpDvG,GAAQ7F,YAAYmM,EAAYC,GAChC,MAAMI,EAAUtyB,KAAKmuB,UAAUoE,gBAC/BvyB,KAAKmuB,UAAUsB,cAAc,GAE7BzvB,KAAKmuB,UAAUzB,QAAQuF,EAAYC,GAAa,GAEhD,MACMM,EADYpY,SAAS8D,cAAc,UAChBE,WAAW,MAEpCoU,EAAOvU,OAAOmB,MAAS2S,EACvBS,EAAOvU,OAAOiC,OAAS8R,EAEvBvF,GAAc9gB,QAAQsb,OAAS0E,GAAQxF,aACvCsG,GAAc9gB,QAAQglB,eACtBlE,GAAc9gB,QAAQilB,mBAAkB,GAExC,IAAK,IAAItpB,EAAI,EAAGA,EAAI6qB,EAAa7qB,IAE/B,IAAK,IAAIC,EAAI,EAAGA,EAAI8qB,EAAa9qB,IAE/BklB,GAAc9gB,QAAQ8mB,cAAcV,EAAuBC,EACzDrG,GAAQvM,MAAQ9X,EAAWqkB,GAAQzL,OAAS3Y,EAC5CokB,GAAQvM,MAAkBuM,GAAQzL,QACpClgB,KAAKsuB,oBAAoBzS,SAEzB2W,EAAOE,UAAU1yB,KAAKmuB,UAAUyB,WAAYjE,GAAQvM,MAAQ9X,EAAGqkB,GAAQzL,OAAS3Y,GAMpFirB,EAAOvU,OAAO0U,OAAOf,EAAe,qBAEpCnF,GAAc9gB,QAAQinB,kBAEtBjH,GAAQ7F,YAAY+L,EAAWC,GAC/B9xB,KAAKmuB,UAAUsB,cAAc6C,GAC7BtyB,KAAKmuB,UAAUzB,QAAQmF,EAAWC,GAAY,GAE9CrF,GAAc9gB,QAAQsb,OAAS0E,GAAQxF,aACvCsG,GAAc9gB,QAAQglB,eACtBlE,GAAc9gB,QAAQilB,mBAAkB,GAG1CiC,oBAAoBC,GAElB,MAAMC,EAAO3Y,SAAS8D,cAAc,KACpC6U,EAAKC,SAAW,eAEhBD,EAAKE,KAAOC,IAAIC,gBAAgBL,GAChCC,EAAKK,QAELL,EAAKM,QAAU,WAEbC,uBAAsB,WAEpBJ,IAAIK,gBAAgBR,EAAKE,SAE3BF,EAAKS,gBAAgB,SAIzBxX,UAEEhc,KAAKmuB,UAAUnS,UACfhc,KAAKsuB,oBAAoBtS,UACzBhc,KAAKouB,QAAQpS,YCvUF,MAAMyX,WAAuBvX,EAE1C9a,cAEEsN,MAAM,CACJ2N,SAAU,GAEVC,kLACAE,yHCPS,MAAMkX,WAA2B9X,GAE9Cxa,cAEEsN,QAGFmN,SAEE8X,GAASlL,WAAMrlB,EAAWqpB,GAAc9gB,SAAS,GAAM,GAEvDgoB,GAAS9X,OAAOkM,GAAapc,QAAS8gB,GAAc9gB,aAASvI,EAAW,IAAIqwB,KCjBjE,MAAMG,GAEnB7zB,KAAKkV,GAEHjV,KAAK6zB,eAAgB,EACrB7zB,KAAK8zB,aAAc,EAEnB9zB,KAAKoJ,KAAO,GACZpJ,KAAK+zB,UAAY,GACjB/zB,KAAKiV,UAAYA,EAEjBjV,KAAKiV,UAAU+e,iBAAiB,UAAWh0B,KAAKi0B,YAAYlwB,KAAK/D,OAAO,GACxEA,KAAKiV,UAAU+e,iBAAiB,QAASh0B,KAAKk0B,UAAUnwB,KAAK/D,OAAO,GAGtEi0B,YAAYpyB,GAEQ,KAAdA,EAAEsyB,SAAkBtyB,EAAEuyB,UAAYp0B,KAAK8zB,cAEzC9zB,KAAK6zB,eAAgB,EACrB7zB,KAAK8zB,aAAc,GAEjBjyB,EAAEwyB,KAEJr0B,KAAKs0B,UAAUzyB,EAAEwyB,KAIrBH,UAAUryB,GAER7B,KAAKu0B,YAAY1yB,EAAEwyB,KAGrB5L,QAEEzoB,KAAK6zB,eAAgB,EAErB,IAAK,IAAIptB,EAAI,EAAGA,EAAIzG,KAAK+zB,UAAU9uB,OAAQwB,IAEzCzG,KAAKoJ,KAAKpJ,KAAK+zB,UAAUttB,IAAI+tB,SAAU,EACvCx0B,KAAKoJ,KAAKpJ,KAAK+zB,UAAUttB,IAAIguB,UAAW,EAI5CF,YAAYG,GAEV,MAAML,EAAMr0B,KAAKoJ,KAAKsrB,GAClBL,IAEFA,EAAIM,OAAQ,EACZN,EAAIO,MAAO,EACXP,EAAII,UAAW,GAInBI,eAEE70B,KAAK8zB,aAAc,EAEnB,IAAK,IAAIrtB,EAAI,EAAGA,EAAIzG,KAAK+zB,UAAU9uB,OAAQwB,IAEzCzG,KAAKoJ,KAAKpJ,KAAK+zB,UAAUttB,IAAIkuB,OAAQ,EACrC30B,KAAKoJ,KAAKpJ,KAAK+zB,UAAUttB,IAAImuB,MAAO,EAIxCN,UAAUI,GAER,MAAML,EAAMr0B,KAAKoJ,KAAKsrB,GAClBL,KAEe,IAAbA,EAAIO,OAENP,EAAIG,SAAU,GAEhBH,EAAIO,MAAO,EACXP,EAAIM,OAAQ,GAIhBG,eAAeJ,GAEb,MAAML,EAAMr0B,KAAKoJ,KAAKsrB,GACtB,QAAIL,GAEKA,EAAIG,QAKfO,YAAYL,GAEV,MAAML,EAAMr0B,KAAKoJ,KAAKsrB,GACtB,QAAIL,GAEKA,EAAIO,KAKfI,gBAAgBN,GAEd,MAAML,EAAMr0B,KAAKoJ,KAAKsrB,GACtB,QAAIL,GAEKA,EAAII,SAMfQ,aAAaZ,GAEXr0B,KAAKoJ,KAAKirB,GACR,CACEK,SAAUL,EACVG,SAAS,EACTI,MAAM,EACND,OAAO,GAGX30B,KAAK+zB,UAAY5qB,OAAOC,KAAKpJ,KAAKoJ,MAGpC8rB,eAAeR,UAEN10B,KAAKoJ,KAAKsrB,GAGnB1Y,UAEEhc,KAAKiV,UAAUkgB,oBAAoB,UAAWn1B,KAAKi0B,YAAYlwB,KAAK/D,OAAO,GAC3EA,KAAKiV,UAAUkgB,oBAAoB,QAASn1B,KAAKk0B,UAAUnwB,KAAK/D,OAAO,ICnE3E,OAAe,IA9Df,cAAoBo1B,GAElBh0B,cAEEsN,QAEA1O,KAAKq1B,SAAU,EACfr1B,KAAKs1B,aAAe,CAAEhuB,EAAG,EAAGC,EAAG,GAC/BvH,KAAKu1B,kBAAoB,CAAEjuB,EAAG,EAAGC,EAAG,GAEpCvH,KAAKw1B,SAAW,IAAI5B,GAGtB7zB,KAAKkV,EAAWwgB,GAEd/mB,MAAM3O,KAAKkV,GAEXjV,KAAKw1B,SAASz1B,KAAK01B,GAGrBzZ,UAEEtN,MAAMsN,UAENhc,KAAKw1B,SAASxZ,UAGhBpS,SAEM5J,KAAK01B,4BAEP11B,KAAKs1B,aAAahuB,EAAItH,KAAK21B,IAAIruB,EAC/BtH,KAAKs1B,aAAa/tB,EAAIvH,KAAK21B,IAAIpuB,GAG7BvH,KAAK41B,yBAEP51B,KAAKu1B,kBAAkBjuB,GAAKvB,KAAKsB,IAAIrH,KAAK61B,UAAUvuB,GACpDtH,KAAKu1B,kBAAkBhuB,GAAKxB,KAAKsB,IAAIrH,KAAK61B,UAAUtuB,IAGlDvH,KAAK81B,8BAEH91B,KAAKu1B,kBAAkBjuB,EAAI,MAAStH,KAAKu1B,kBAAkBhuB,EAAI,QAEjEvH,KAAKq1B,SAAU,GAGjBr1B,KAAKu1B,kBAAoB,CAAEjuB,EAAG,EAAGC,EAAG,IAIxCkhB,QAEE/Z,MAAM+Z,QAENzoB,KAAKq1B,SAAU,EAEfr1B,KAAKw1B,SAAS/M,UCJlB,OAAe,IAxDf,MAEE1oB,OAEEC,KAAK+1B,kBAAoB,CACvBC,QAAS,UACTC,IAAK,MACLC,MAAO,QACPC,IAAK,MACLC,QAAS,WAGXp2B,KAAKq2B,YAAej2B,UAAUC,UAAUi2B,MAAM,+GAC9Ct2B,KAAKu2B,WAAan2B,UAAUC,UAAUi2B,MAAM,QAAUl2B,UAAUo2B,gBAAkBp2B,UAAUo2B,eAAiB,GAC7Gx2B,KAAKy2B,SAAWr2B,UAAUC,UAAUi2B,MAAM,uBAAyBt2B,KAAKu2B,QAExEv2B,KAAK02B,WAAa12B,KAAK22B,WAAa32B,KAAK+1B,kBAAkBC,QAC3Dh2B,KAAK42B,SAAW52B,KAAK22B,WAAa32B,KAAK+1B,kBAAkBG,MACzDl2B,KAAK62B,OAAS72B,KAAK22B,WAAa32B,KAAK+1B,kBAAkBI,IACvDn2B,KAAK82B,WAAa92B,KAAK22B,WAAa32B,KAAK+1B,kBAAkBK,QAG7DO,SAEE,MAAMt2B,EAAYF,OAAOC,UAAUC,UAC7B02B,EAAW52B,OAAOC,UAAU22B,SAIlC,IAAIC,EAAK,KAuBT,OArB0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxCz2B,QAAQw2B,GAEzBC,EAAKh3B,KAAK+1B,kBAAkBI,KAEe,IAPxB,CAAC,SAAU,OAAQ,QAOlB51B,QAAQw2B,GAE5BC,EAAKh3B,KAAK+1B,kBAAkBE,KAEmB,IAZxB,CAAC,QAAS,QAAS,UAAW,SAY7B11B,QAAQw2B,GAEhCC,EAAKh3B,KAAK+1B,kBAAkBK,QAErB,UAAUa,KAAK52B,GAEtB22B,EAAKh3B,KAAK+1B,kBAAkBC,SAEpBgB,GAAM,QAAQC,KAAKF,KAE3BC,EAAKh3B,KAAK+1B,kBAAkBG,OAGvBc,ICrCX,OAAe,IAdf,MAEEj3B,OAEEC,KAAKk3B,qBAAkB9zB,EACvBpD,KAAKm3B,gBAAkB,IAAI5wB,EAG7B6wB,oBAAoBvT,GAElB7jB,KAAKk3B,gBAAkBrT,ICJZ,MAAMwT,GAEnBj2B,YAAYyiB,EAAUyT,GAEpBt3B,KAAK6jB,SAAWA,EAEhB7jB,KAAK8jB,cAAW1gB,EAChBpD,KAAKqc,SAAW,GAChBrc,KAAKs3B,YAAcA,EAEnBt3B,KAAKu3B,cAAgB,GAErBv3B,KAAKw3B,kBAAep0B,EAEpBpD,KAAKy3B,YAAc,IAAIlhB,EACvBvW,KAAK03B,aAAe,IAAInhB,EAExBvW,KAAK23B,oBAAsB,EAE3B33B,KAAK43B,wBAA0B,EAGjC73B,KAAKy3B,EAAc1a,EAAaD,GAE9B7c,KAAK8jB,SAAW,IAAI5H,EAAe,CACjCG,SAAUrc,KAAKqc,SACfC,aAAcQ,EACdN,eAAgBK,IAElB7c,KAAKw3B,aAAeA,EAGtBK,mBAAmBn3B,EAAMyE,GAEvBnF,KAAKqc,SAAS3b,GAAQ,CAAEqE,MAAOI,GAC/BnF,KAAK8jB,SAAS9D,aAAc,EAG9B8X,mBAAmBp3B,EAAMyE,GAEvBnF,KAAKqc,SAAS3b,GAAMqE,MAAQI,EAG9B4yB,sBAAsBC,EAAcC,GAElC,MAAMC,EAAgBl4B,KAAKm4B,qBAAqBn4B,KAAKs3B,aAC/Cc,EAAgBp4B,KAAKm4B,qBAAqBn4B,KAAKs3B,aAC/Ce,EAAgBr4B,KAAKm4B,qBAAqB,GAE1CG,EAAet4B,KAAKu4B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEJ,GAEFj4B,KAAKw4B,yBAAyBF,EAAcL,GAIhDQ,sBAAsBT,EAAcU,GAElC,MAAMR,EAAgBl4B,KAAK24B,sBAAsB34B,KAAKs3B,aAChDc,EAAgBp4B,KAAK24B,sBAAsB34B,KAAKs3B,aAChDe,EAAgBr4B,KAAK24B,sBAAsB,GAE3CL,EAAet4B,KAAKu4B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEK,GAEF14B,KAAK44B,0BAA0BN,EAAcI,GAIjDG,4BAA4Bb,EAAcU,GAExC,MAAMR,EAAgBl4B,KAAK84B,4BAA4B94B,KAAKs3B,aACtDc,EAAgBp4B,KAAK84B,4BAA4B94B,KAAKs3B,aACtDe,EAAgBr4B,KAAK84B,4BAA4B,GAEjDR,EAAet4B,KAAKu4B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEK,GAEF14B,KAAK44B,0BAA0BN,EAAcI,GAIjDK,sBAAsBC,EAAahB,EAAciB,EAASC,EAAOC,EAAOC,GAEtE,MAAMC,EAAYr5B,KAAKs5B,mBAAmBN,GACpCO,EAAev5B,KAAKw5B,mBAAmBxB,GAE7Ch4B,KAAKy5B,gBAAgBF,EAAalkB,IAAKgkB,EAAWJ,EAASC,EAAOC,EAAOC,GACzEp5B,KAAKy5B,gBAAgBF,EAAaG,UAAW,EAAGT,EAASC,EAAOC,EAAOC,GAEvEG,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfC,sBAAsBb,EAAahB,EAAc8B,EAASZ,EAAOC,EAAOC,EAAOW,GAE7E,MAAMV,EAAYr5B,KAAKs5B,mBAAmBN,GACpCO,EAAev5B,KAAKw5B,mBAAmBxB,GAE7Ch4B,KAAKg6B,iBAAiBT,EAAalkB,IAAKgkB,EAAWS,EAASZ,EAAOC,EAAOC,EAAOW,GACjF/5B,KAAKg6B,iBAAiBT,EAAaG,UAAW,EAAGI,EAASZ,EAAOC,EAAOC,EAAOW,GAC/ER,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfK,oBAAoBne,EAAUoe,GAE5B,IAAK,IAAIzzB,EAAI,EAAGA,EAAIzG,KAAKu3B,cAActyB,OAAQwB,IAEzCyzB,EAAgB,GAAKl6B,KAAKu3B,cAAc9wB,GAAGmzB,YAAc,IAEjB,IAAtC55B,KAAKu3B,cAAc9wB,GAAGmzB,aAExB55B,KAAKm6B,8BAA8Bre,EAAU9b,KAAKu3B,cAAc9wB,IAE9DzG,KAAKu3B,cAAc9wB,GAAGmzB,YAAc,GAEtC55B,KAAKo6B,2BAA2Bte,EAAU9b,KAAKu3B,cAAc9wB,IAG/DzG,KAAKu3B,cAAc9wB,GAAGmzB,YAAc,EAEpCM,KAKNG,0BAEEr6B,KAAK23B,oBAAsB,EAC3B,IAAK,IAAIlxB,EAAI,EAAGA,EAAIzG,KAAKu3B,cAActyB,OAAQwB,IAEzCzG,KAAKu3B,cAAc9wB,GAAGmzB,YAAc,GAEtC55B,KAAK23B,sBAGT,OAAO33B,KAAK23B,oBAGdyC,2BAA2Bte,EAAUwe,GAGnCA,EAAanN,IAAInN,aAAc,EAC/BlE,EAASye,qBACPv6B,KAAKy3B,YACL6C,EAAajlB,IACbilB,EAAanN,KAIjBgN,8BAA8Bre,EAAUwe,GAGtC,MAAME,EAAQF,EAAaX,qBACZ,IAAXa,IAKJx6B,KAAK03B,aAAanwB,EAAIxB,KAAKsC,MAAMmyB,EAAQx6B,KAAKs3B,aAC9Ct3B,KAAK03B,aAAapwB,EAAIkzB,EAAQx6B,KAAKs3B,YAAct3B,KAAK03B,aAAanwB,EACnEuU,EAASye,qBACPv6B,KAAK03B,aACL4C,EAAaZ,UACbY,EAAanN,MAIjBsN,WAEE,OAAO,IAAIxW,EAAKjkB,KAAK6jB,SAAU7jB,KAAK8jB,UAGtC2V,gBAAgBF,EAAciB,EAAOvB,EAASC,EAAOC,EAAOC,GAEtDF,IAEFK,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKvB,EAAQ3xB,GAE/C6xB,IAEFI,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKvB,EAAQ1xB,GAE/C6xB,IAEFG,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKvB,EAAQlxB,GAIrDiyB,iBAAiBT,EAAciB,EAAOV,EAASZ,EAAOC,EAAOC,EAAOW,GAE9Db,IAEFK,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKV,EAAQxyB,GAE/C6xB,IAEFI,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKV,EAAQvyB,GAE/C6xB,IAEFG,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKV,EAAQ/xB,GAE/CgyB,IAEFR,EAAapkB,MAAMhQ,KAAa,EAARq1B,EAAY,GAAKV,EAAQhyB,GAIrD0wB,yBAAyBe,EAAcmB,GAErC,IAAK,IAAIj0B,EAAI,EAAGA,EAAIzG,KAAKs3B,YAAct3B,KAAKs3B,YAAa7wB,IAEvDzG,KAAKy5B,gBAAgBF,EAAalkB,IAAK5O,EAAGi0B,GAAI,GAAM,GAAM,GAC1DnB,EAAaK,cAIjBhB,0BAA0BW,EAAcoB,GAEtC,IAAK,IAAIl0B,EAAI,EAAGA,EAAIzG,KAAKs3B,YAAct3B,KAAKs3B,YAAa7wB,IAEvDzG,KAAKg6B,iBAAiBT,EAAalkB,IAAK5O,EAAGk0B,GAAI,GAAM,GAAM,GAAM,GACjEpB,EAAaK,cAIjBzB,qBAAqB/Y,GAEnB,MAAMja,EAAO,IAAIy1B,WAAW,EAAIxb,EAAQA,GACxC,OAAO,IAAIyb,EAAY11B,EAAMia,EAAOA,EAAO0b,GAG7CnC,sBAAsBvZ,GAEpB,MAAMja,EAAO,IAAIy1B,WAAW,EAAIxb,EAAQA,GACxC,OAAO,IAAIyb,EAAY11B,EAAMia,EAAOA,EAAO2b,GAG7CjC,4BAA4B1Z,GAE1B,MAAMja,EAAO,IAAI61B,aAAa,EAAI5b,EAAQA,GAC1C,OAAO,IAAIyb,EAAY11B,EAAMia,EAAOA,EAAO2b,EAAYE,GAGzDzB,mBAAmBxB,GAEjB,IAAK,IAAIvxB,EAAI,EAAGA,EAAIzG,KAAKu3B,cAActyB,OAAQwB,IAE7C,GAAIzG,KAAKu3B,cAAc9wB,GAAG/F,OAASs3B,EAEjC,OAAOh4B,KAAKu3B,cAAc9wB,GAG9B9D,QAAQM,MAAM,gBAAkB+0B,EAAe,mBAIjDsB,mBAAmB54B,GAEjB,IAAK,IAAI+F,EAAI,EAAGA,EAAIzG,KAAKw3B,aAAavyB,OAAQwB,IAE5C,GAAIzG,KAAKw3B,aAAa/wB,KAAO/F,EAE3B,OAAO+F,EAGX9D,QAAQM,MAAM,YAAcvC,EAAO,mCAIrC63B,mBAAmBP,EAAc5K,EAAa8N,EAAaC,GAczD,OAZAD,EAAYlb,aAAc,EAE1BhgB,KAAKu3B,cAAc5wB,KAAK,CACtBjG,KAAMs3B,EACN3iB,IAAK+X,EACLD,IAAK+N,EACLxB,UAAWyB,EACXxB,qBAAsB,EACtBC,YAAa,IAGf55B,KAAKqc,SAAS2b,GAAgB,CAAEjzB,MAAOm2B,GAChCl7B,KAAKu3B,cAAcv3B,KAAKu3B,cAActyB,OAAS,GAGxD+W,UAEE,IAAK,IAAIvV,EAAI,EAAGA,EAAIzG,KAAKu3B,cAActyB,OAAQwB,IAE7CzG,KAAKu3B,cAAc9wB,GAAG4O,IAAI2G,UAC1Bhc,KAAKu3B,cAAc9wB,GAAG0mB,IAAInR,UAC1Bhc,KAAKu3B,cAAc9wB,GAAGizB,UAAU1d,WCtPtC,OAAe,IAvDf,MAEEjc,OAEEC,KAAKo7B,QAAU,GAGjBC,MAAMC,GAEJ,MAAMC,EAAoB,GACpBC,EAAgBv0B,EAAMw0B,eAAe11B,KAAKuH,KAAKguB,EAAkBr2B,SAGvEjF,KAAK07B,gBAAgBH,EAAmBC,GAExC,IAAIG,EAAW,EAEf,IAAK,IAAIl1B,EAAI,EAAGA,EAAI60B,EAAkBr2B,OAAQwB,IAC9C,CACE,MAAMm1B,EAAeN,EAAkB70B,GAAGiJ,aAAa,YAAYmsB,MAC7Dt0B,EAAIxB,KAAKsC,MAAM5B,EAAI+0B,GACnBl0B,EAAIb,EAAI+0B,EAAgBj0B,EAC9B,IAAK,IAAIs0B,EAAQ,EAAGA,EAAQD,EAAcC,IAExCN,EAAkBI,GAAar0B,EAAIk0B,EAAiB,GAAMA,EAC1DD,EAAkBI,EAAW,GAAMp0B,EAAIi0B,EAAiB,GAAMA,EAC9DG,GAAY,EAIhB,MAAMG,EAAmB,IAAIC,EAAgB,IAAIf,aAAaO,GAAoB,GAC5EvW,EAAkBC,GAAoBC,sBAAsBoW,GAIlE,OAHAtW,EAAgBpG,aAAa,mBAAoBkd,GAEjD97B,KAAKo7B,QAAQz0B,KAAK,IAAI0wB,GAAcrS,EAAiBwW,IAC9Cx7B,KAAKo7B,QAAQp7B,KAAKo7B,QAAQn2B,OAAS,GAG5Cg1B,oBAAoBne,GAElB,IAAK,IAAIrV,EAAI,EAAGA,EAAIzG,KAAKo7B,QAAQn2B,OAAQwB,IAEvCzG,KAAKo7B,QAAQ30B,GAAGwzB,oBAAoBne,EAAU,GAIlD4f,gBAAgBM,EAAKR,GAEnB,IAAK,IAAI/0B,EAAI,EAAGA,EAAI+0B,EAAgBA,EAAgB,EAAG/0B,IAErDu1B,EAAIr1B,KAAK,KCgCf,OAAe,IAjFf,MAEE5G,OAEEC,KAAKi8B,YAAc,GACnBj8B,KAAKk8B,oBAAsB,IAAI3lB,EAC/BvW,KAAKm8B,SAAW,IAAI3Y,EACpBxjB,KAAKm8B,SAASC,YAAa,EAC3Bp8B,KAAKm8B,SAASpT,eAAgB,EAE9B/oB,KAAKq8B,SAAW,IAAI7Y,EACpBxjB,KAAKq8B,SAASD,YAAa,EAC3Bp8B,KAAKq8B,SAAStT,eAAgB,EAE9B/oB,KAAKs8B,UAAY,IAAIrP,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAK,KAG9DsP,eAAeC,GAEb,MAAMhC,EAAQx6B,KAAKi8B,YAAY17B,QAAQi8B,GACnChC,GAAS,GAEXx6B,KAAKi8B,YAAYQ,OAAOjC,EAAO,GAGjCx6B,KAAKm8B,SAASnhB,OAAOwhB,GACrBx8B,KAAKq8B,SAASrhB,OAAOwhB,GAErBA,EAAKxgB,UAGP0gB,yBAAyBF,GAEvBx8B,KAAKi8B,YAAYt1B,KAAK61B,GACtBx8B,KAAKm8B,SAASl0B,IAAIu0B,GAElBA,EAAKG,qCAGPC,wBAAwBJ,GAEtBx8B,KAAKi8B,YAAYt1B,KAAK61B,GACtBx8B,KAAKq8B,SAASp0B,IAAIu0B,GAElBA,EAAKK,oCAGPjzB,SAME5J,KAAKs8B,UAAU5L,yBAEf1wB,KAAKk8B,oBAAoBpU,KAAKgV,GAAMnH,KACpC,IAAK,IAAIlvB,EAAI,EAAGA,EAAIzG,KAAKi8B,YAAYh3B,OAAQwB,IAE3CzG,KAAKi8B,YAAYx1B,GAAGs2B,aAAa/8B,KAAKk8B,qBAI1CrgB,OAAOC,GAGD9b,KAAKm8B,SAASpY,SAAS9e,OAAS,GAElC0uB,GAAS9X,OAAO7b,KAAKm8B,SAAUn8B,KAAKs8B,WAElCt8B,KAAKq8B,SAAStY,SAAS9e,OAAS,GAElC0uB,GAAS9X,OAAO7b,KAAKq8B,SAAU5P,GAAc9gB,SAIjD8c,QAEEzoB,KAAKg9B,6BAA0B55B,IC4HnC,OAAe,IArMf,MAEErD,OAEEC,KAAKi9B,QAAU,IAAIC,EACnBl9B,KAAKqG,MAAQ,IAAI82B,EACjBn9B,KAAKo9B,IAAM,IAAIC,EAEfr9B,KAAKs9B,SAAW,IAAI/2B,EACpBvG,KAAKu9B,WAAa,IAAIh3B,EAGxBi3B,WAAW9f,GAETA,EAASA,GAAU+O,GAAc9gB,QACjC,MAAM8xB,EAAU,IAAIl3B,EAKpB,OAHAk3B,EAAQla,IAAI,EAAG,EAAG,GAClBka,EAAQC,gBAAgBhgB,EAAO0H,YAExBqY,EAGTE,gBAAgBjgB,GAEdA,EAASA,GAAU+O,GAAc9gB,QACjC,MAAM8xB,EAAU,IAAIl3B,EAKpB,OAHAk3B,EAAQla,IAAI,EAAG,GAAI,GACnBka,EAAQC,gBAAgBhgB,EAAO0H,YAExBqY,EAGTG,cAAclgB,GAEZA,EAASA,GAAU+O,GAAc9gB,QACjC,MAAM8xB,EAAU,IAAIl3B,EAIpB,OAFAk3B,EAAQla,IAAI,EAAG,EAAG,GAClBka,EAAQC,gBAAgBhgB,EAAO0H,YACxBqY,EAGTI,yBAAyBlI,EAAKjY,GAE5BA,EAASA,GAAU+O,GAAc9gB,QACjC,MAAM8xB,EAAU,IAAIl3B,EAEdu3B,EAASpgB,EAAOsJ,IAAM,EAAKjhB,KAAK4B,GAAK,IACrCo2B,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAASpgB,EAAOuJ,QAAW,EAE3DiX,EAAQn4B,KAAKk4B,IAAIH,GAASpgB,EAAOyJ,IACjCgX,EAAQp4B,KAAKk4B,IAAIF,GAASrgB,EAAOyJ,IAIvC,OAFAsW,EAAQla,IAAI4a,EAAQxI,EAAIruB,EAAG42B,EAAQvI,EAAIpuB,GAAImW,EAAOyJ,KAAKU,YAEhD4V,EAAQC,gBAAgBhgB,EAAO0H,YAGxCgZ,uBAAuBC,EAAgBC,EAAc3I,EAAKjY,GAExDA,EAASA,GAAU+O,GAAc9gB,QACjCgqB,EAAMA,GAAOmH,GAAMnH,IAEnB,MAAM8H,EAAU,IAAIl3B,EAcpB,OAZAvG,KAAKqG,MAAMk4B,8BAA8BD,GAAgBt+B,KAAK29B,gBAAgBjgB,GAAS2gB,GACnF3gB,EAAO8gB,oBAETx+B,KAAKo9B,IAAI7Z,IAAI7F,EAAO6H,SAAUvlB,KAAK69B,yBAAyBlI,EAAKjY,KAIjE1d,KAAKu9B,WAAWha,IAAIoS,EAAIruB,EAAGquB,EAAIpuB,EAAG,GAAGk3B,UAAU/gB,GAC/C1d,KAAKo9B,IAAI7Z,IAAI7F,EAAO6H,SAAUvlB,KAAKu9B,aAGrCv9B,KAAKo9B,IAAIsB,eAAe1+B,KAAKqG,MAAOo3B,GAC7BA,EAGTkB,qBAAqBv4B,EAAQw4B,EAAa,GAExC,MACMC,GADgB,IAAIxa,GAAS1B,cAAcvc,GACR4B,OACnC82B,EAAiB9+B,KAAK29B,gBAAgBlR,GAAc9gB,SAASrH,QAE7D+B,GAAQ,IAAI82B,GAAQoB,8BAA8BO,EAAgBD,GAElEr4B,EAAkBpB,GAAM25B,wBAAwB34B,EAAQC,GAExD24B,EAA0B,IAAIz4B,EACpC,IAAIwjB,GAAO,IAAIC,GAAOrH,cAAcnc,GACpCujB,EAAIkV,UAAUD,GAEd,MAAME,EAAK,IAAI34B,EAAQ,EAAG,EAAG,GAAGm3B,gBAAgBjR,GAAc9gB,QAAQyZ,YAChE+Z,EAAQD,EAAG56B,QAAQ86B,MAAMN,GAAgBjX,YACzC+F,GAAM,IAAIsP,GAAU3Z,IAAI4b,EAAM73B,EAAG43B,EAAG53B,EAAGw3B,EAAex3B,EAAGu3B,EAAmBv3B,EAChF63B,EAAM53B,EAAG23B,EAAG33B,EAAGu3B,EAAev3B,EAAGs3B,EAAmBt3B,EACpD43B,EAAMp3B,EAAGm3B,EAAGn3B,EAAG+2B,EAAe/2B,EAAG82B,EAAmB92B,EACpD,EAAM,EAAkB,EAAU,GAE9Bs3B,GAAc,IAAInC,GAAUoC,WAAW1R,GAC7C,IAAK,IAAInnB,EAAI,EAAGA,EAAID,EAAgBvB,OAAQwB,IAE1CD,EAAgBC,GAAG84B,aAAaF,GAGlC,MAAMp9B,EAAO,IAAIsE,EACjBwjB,GAAO,IAAIC,GAAOrH,cAAcnc,GAChCujB,EAAI0D,QAAQxrB,GACZA,EAAKiG,eAAe02B,GACpB,MAAMY,EAAmB,IAAIj5B,EAG7B,OAFAwjB,EAAIkV,UAAUO,GAEP,CACLja,SAAUyZ,EACV7rB,KAAMnT,KAAKy/B,qBAAqBx9B,EAAKqF,EAAI,EAAGrF,EAAKsF,EAAI,IAIzDk4B,qBAAqBrgB,EAAOc,GAE1B,MAAM4d,EAASrR,GAAc9gB,QAAQqb,IAAM,EAAKjhB,KAAK4B,GAAK,IACpDo2B,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAASrR,GAAc9gB,QAAQsb,QAAW,EAE1EiX,EAAQhe,EAASna,KAAKk4B,IAAIH,GAC1BK,EAAQ/e,EAAQrZ,KAAKk4B,IAAIF,GAE/B,OAAOh4B,KAAKL,IAAIK,KAAKsB,IAAI82B,GAAQp4B,KAAKsB,IAAI62B,IAG5CwB,oBAAoBvU,EAAIzN,GAEtB,GAAIA,EAAOiiB,qBACX,CACExU,EAAGsC,QAAQztB,KAAKs9B,UAEhB,MAAMsC,EAAQ5/B,KAAKs9B,SAASh2B,EACtBu4B,EAAQ7/B,KAAKs9B,SAAS/1B,EACtBu4B,EAAgBF,EAAQC,EAC9B,OAAIlU,GAAQxF,aAAe2Z,EAAgB,EAElCnU,GAAQzL,OAAS2f,EAIjBlU,GAAQvM,MAAQwgB,EAI3B,CAEE,MAAM39B,EAAO,IAAIsE,EAEjB,OADA4kB,EAAGsC,QAAQxrB,GACJjC,KAAKy/B,qBAAqBx9B,EAAKqF,EAAGrF,EAAKsF,IAIlDw4B,oBAAoBC,EAAQtiB,GAE1BA,EAASA,GAAU+O,GAAc9gB,QACjC,MAAM8xB,EAAU,IAAIl3B,EAOpB,OALAy5B,EAAOC,iBAAiBxC,GACxBA,EAAQyC,QAAQxiB,GAEhB+f,EAAQn2B,GAAiB,GAAZm2B,EAAQn2B,EAAU,IAAQqkB,GAAa,MACpD8R,EAAQl2B,GAAK,GAAiB,GAAZk2B,EAAQl2B,EAAU,KAAQokB,GAAQzL,OAC7Cud,EAGT0C,oBAAoBlX,EAAKvL,GAEvBA,EAASA,GAAU+O,GAAc9gB,QACjC,MAAM8xB,EAAU,IAAIl3B,EAOpB,OALAk3B,EAAQ3V,KAAKmB,GACbwU,EAAQyC,QAAQxiB,GAEhB+f,EAAQn2B,GAAiB,GAAZm2B,EAAQn2B,EAAU,IAAQqkB,GAAa,MACpD8R,EAAQl2B,GAAK,GAAiB,GAAZk2B,EAAQl2B,EAAU,KAAQokB,GAAQzL,OAC7Cud,EAGT2C,kBAAkB1iB,GAEhBA,EAAO2iB,MAAU1U,GAAQvM,MAAQ,EACjC1B,EAAOyhB,MAASxT,GAAQvM,MAAQ,EAChC1B,EAAO4iB,IAAS3U,GAAQzL,OAAS,EACjCxC,EAAO6iB,QAAU5U,GAAQzL,OAAS,EAClCxC,EAAOuJ,OAAS0E,GAAQxF,aACxBzI,EAAOgT,wBAAuB,KCrJlC,OAAe,IAtCf,MAEEtvB,eAIArB,KAAKke,EAAQuiB,EAAetS,EAAoBuH,EAA2Brb,UAEzEqS,GAAc1sB,OACd0gC,GAAgB1gC,OAChB8vB,GAAa9vB,OACb2vB,GAAc3vB,OACd+U,GAAa/U,OACb2gC,GAAgB3gC,OAChB+8B,GAAM/8B,KAAKygC,EAAe/K,GAC1BkL,GAAG5gC,OACHwD,GAAQxD,OACR6gC,GAAuB7gC,OACvB8a,GAAkB9a,OAClBgoB,GAAahoB,OACb4rB,GAAQ5rB,OACRwY,GAAKxY,OACL8gC,GAAG9gC,OAEH4zB,GAAS5zB,KAAKke,EAAQiQ,GACtB4S,GAAM/gC,OAGRic,QAAQ+kB,GAENpN,GAAS3X,UACT8gB,GAAM9gB,UACN+L,GAAa/L,UAEb+kB,EAAY/kB,kNCzCD,MAAMglB,WAAqBpkB,GAExCxb,cAEEsN,o2DAAYyN,IAEZnc,KAAKqc,SAAS4kB,mBAAqB,CAAEl8B,MAAO,IAAIm4B,GAChDl9B,KAAKqc,SAAS6kB,kBAAqB,CAAEn8B,MAAO,IAAIm4B,GAEhDl9B,KAAKqc,SAAS8kB,MAAY,CAAEp8B,MAAO,OACnC/E,KAAKqc,SAAS+kB,QAAY,CAAEr8B,MAAO,IACnC/E,KAAKqc,SAAS4P,UAAY,CAAElnB,MAAO,KAEnC/E,KAAKqc,SAASglB,cAAgB,CAAEt8B,MAAO/E,KAAKshC,uBAC5CthC,KAAKqc,SAASklB,gBAAkB,CAAEx8B,MAAO/E,KAAKwhC,yBAGhDF,sBAEE,MAAMG,EAAgB,GAGtB,IAAK,IAAIh7B,EAAI,EAAGA,EAFI,GAEaA,IACjC,CACE,MAAM+d,EAAM,IAAIje,EAAwB,EAAhBR,KAAKuC,SAAe,EAC1B,EAAhBvC,KAAKuC,SAAe,EACpBvC,KAAKuC,UACPkc,EAAIqD,YACJ,IAAIzF,EAAQ3b,EARM,GASlB2b,EAAUnb,EAAMC,KAAK,GAAK,EAAKkb,EAAQA,GACvCoC,EAAItc,eAAeka,GAEnBqf,EAAc96B,KAAK6d,GAErB,OAAOid,EAGTD,wBAEE,MAAME,EAAkB,IAAI9G,WAAW,IACvC,IAAK,IAAIn0B,EAAI,EAAGA,EAAI,GAAIA,IAEtBi7B,EAAoB,EAAJj7B,EAAQ,GAAKV,KAAKsC,MAAsB,IAAhBtC,KAAKuC,UAC7Co5B,EAAoB,EAAJj7B,EAAQ,GAAKV,KAAKsC,MAAsB,IAAhBtC,KAAKuC,UAC7Co5B,EAAoB,EAAJj7B,EAAQ,GAAK,EAG/B,MAAMk7B,EAAmB,IAAI9G,EAAY6G,EAAiB,EAAG,EAAG5G,GAKhE,OAJA6G,EAAiBC,MAAQC,EACzBF,EAAiBG,MAAQD,EAEzBF,EAAiB3hB,aAAc,EACxB2hB,GC5DI,MAAMI,WAA4BnlB,GAE/Cxb,cAEEsN,wPACA1O,KAAKqc,SAAS2lB,IAAM,CAAEj9B,WAAO3B,ICFlB,MAAM6+B,WAAqCrlB,GAExDxb,cAEEsN,i5BAAYwzB,IACZliC,KAAKqc,SAAS4P,UAAqB,CAAElnB,MAAO,GAC5C/E,KAAKqc,SAAS4kB,mBAAqB,CAAEl8B,MAAO,IAAIm4B,ICPrC,MAAMiF,WAAwBvlB,GAE3Cxb,cAEEsN,6sBACA1O,KAAKqc,SAAS+lB,WAAa,CAAEr9B,MAAO,IAAIwR,ICL7B,MAAM8rB,GAEnBjhC,YAAY0a,GAEV9b,KAAKsiC,IAAM,IAAIlW,EAAkB,EAAG,GACpCpsB,KAAKuiC,IAAM,IAAInW,EAAkB,EAAG,GACpCpsB,KAAKwiC,aAAe,IAAIL,GAG1BM,KAAKta,GAECA,EAAG/I,QAAUpf,KAAKsiC,IAAIljB,OAAS+I,EAAGjI,SAAWlgB,KAAKsiC,IAAIpiB,SAExDlgB,KAAKsiC,IAAI5V,QAAQvE,EAAG/I,MAAO+I,EAAGjI,QAC9BlgB,KAAKuiC,IAAI7V,QAAQvE,EAAG/I,MAAO+I,EAAGjI,SAGhClgB,KAAKwiC,aAAanmB,SAAS+lB,WAAWr9B,MAAMwe,IAAI,EAAG,GACnDoQ,GAASzG,KAAK/E,EAAInoB,KAAKsiC,IAAKtiC,KAAKwiC,cACjCxiC,KAAKwiC,aAAanmB,SAAS+lB,WAAWr9B,MAAMwe,IAAI,EAAG,GACnDoQ,GAASzG,KAAKltB,KAAKsiC,IAAKna,EAAInoB,KAAKwiC,eCZtB,MAAME,WAAuB9mB,GAE1Cxa,cAEEsN,QAEA1O,KAAK2iC,SAAW,IAAI3B,GACpBhhC,KAAK4iC,iBAAmB,IAAIb,GAC5B/hC,KAAK6iC,cAAgB,IAAIZ,GAEzBjiC,KAAK8iC,KAAOpT,GAAcqT,SAAW,EAAI,EAEzC/iC,KAAKgjC,QAAU,IAAI5W,EAAkBT,GAAQvM,MAAQpf,KAAK8iC,KAAMnX,GAAQzL,OAASlgB,KAAK8iC,MAEtF9iC,KAAKijC,QAAU,IAAI7W,EAAkBT,GAAQvM,MAAOuM,GAAQzL,QAE5DlgB,KAAKkjC,QAAU,IAAIb,GACnB1O,GAASpF,4BAA6B,EAGxC1S,SAEE7b,KAAKmjC,kBAELxP,GAASlL,MAAMzoB,KAAKgjC,QAASvW,GAAc9gB,SAAS,GAAM,GAC1DgoB,GAAS9X,OAAOkM,GAAapc,QAAS8gB,GAAc9gB,QAAS3L,KAAKgjC,SAElEhjC,KAAKojC,oBAELzP,GAASzG,KAAKyG,GAASpD,iBAAkBvwB,KAAKijC,QAASjjC,KAAK2iC,UAG5D3iC,KAAKkjC,QAAQT,KAAKziC,KAAKijC,SACvBtP,GAASzG,KAAKltB,KAAKijC,aAAS7/B,GAG5BpD,KAAK4iC,iBAAiBvmB,SAAS2lB,IAAIj9B,MAAQ/E,KAAKijC,QAAQ3V,QACxDqG,GAASzG,KAAKltB,KAAKgjC,aAAS5/B,EAAWpD,KAAK4iC,kBAK9CQ,oBAEEpjC,KAAK2iC,SAAStmB,SAAS4kB,mBAAmBl8B,MAAMu6B,WAAW7S,GAAc9gB,QAAQ03B,kBACjFrjC,KAAK2iC,SAAStmB,SAAS6kB,kBAAkBn8B,MAAM+iB,KAAK2E,GAAc9gB,QAAQ03B,kBAC1ErjC,KAAK2iC,SAAStmB,SAAS4P,UAAUlnB,MAAQ0nB,GAAc9gB,QAAQwb,IAGjEgc,kBAEMnjC,KAAKgjC,QAAQ5jB,QAAUuM,GAAQvM,MAAQpf,KAAK8iC,MAAQ9iC,KAAKgjC,QAAQ9iB,SAAWyL,GAAQzL,OAASlgB,KAAK8iC,OAEpG9iC,KAAKgjC,QAAQtW,QAAQf,GAAQvM,MAAQpf,KAAK8iC,KAAMnX,GAAQzL,OAASlgB,KAAK8iC,MACtE9iC,KAAKijC,QAAQvW,QAAQf,GAAQvM,MAAOuM,GAAQzL,UC9DnC,MAAMojB,WAAqB1nB,GAExCxa,cAEEsN,QAGFmN,SAEE8X,GAASlL,WAAMrlB,EAAWqpB,GAAc9gB,SAAS,GAAM,GAEnDoc,GAAapc,QAAQ+P,eAEvBqM,GAAapc,QAAQ+P,gBAGnBqM,GAAapc,QAAQkQ,OAEvBkM,GAAapc,QAAQkQ,SAIrB8X,GAAS9X,OAAOkM,GAAapc,QAAS8gB,GAAc9gB,SAGlDoc,GAAapc,QAAQ8P,gBAEvBsM,GAAapc,QAAQ8P,kBC7BZ,MAAM8nB,WAAmC3mB,GAEtDxb,YAAYoiC,GAEV90B,m7BAAYtL,EAAW,CACrBqgC,SAAUD,IAEZxjC,KAAKqc,SAASW,SAAkB,CAAEjY,WAAO3B,GACzCpD,KAAKqc,SAASqnB,YAAkB,CAAE3+B,WAAO3B,GACzCpD,KAAKqc,SAASsnB,eAAkB,CAAE5+B,MAAO,GAEzC/E,KAAKqc,SAASunB,aAAgB,CAAE7+B,MAAO,MACvC/E,KAAKqc,SAASwnB,aAAgB,CAAE9+B,MAAO,MACvC/E,KAAKqc,SAASynB,aAAgB,CAAE/+B,MAAO,MACvC/E,KAAKqc,SAAS0nB,aAAgB,CAAEh/B,MAAO,MACvC/E,KAAKqc,SAAS2nB,aAAgB,CAAEj/B,MAAO,MAEvC/E,KAAKqc,SAAS4nB,cAAgB,CAAEl/B,MAAO,GACvC/E,KAAKqc,SAAS6nB,aAAgB,CAAEn/B,MAAO,CAAC,EAAK,GAAK,GAAK,GAAK,KAC5D/E,KAAKqc,SAAS8nB,YAAgB,CAAEp/B,MAAO,GAEvC,MAAMq/B,EAAkB,CACtB,IAAIznB,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,YAGZ3c,KAAKqc,SAAS+nB,gBAAkB,CAAEr/B,MAAOq/B,GAG3CC,SAASC,GAEPtkC,KAAKqc,SAASunB,aAAa7+B,MAAQu/B,EAGrCC,SAASD,GAEPtkC,KAAKqc,SAASwnB,aAAa9+B,MAAQu/B,EAGrCE,SAASF,GAEPtkC,KAAKqc,SAASynB,aAAa/+B,MAAQu/B,EAGrCG,SAASH,GAEPtkC,KAAKqc,SAAS0nB,aAAah/B,MAAQu/B,EAGrCI,SAASJ,GAEPtkC,KAAKqc,SAAS2nB,aAAaj/B,MAAQu/B,EAGrCK,mBAAmB5/B,GAEjB/E,KAAKqc,SAAS4nB,cAAcl/B,MAAQA,EAGtC6/B,iBAAiB7/B,GAEf/E,KAAKqc,SAAS8nB,YAAYp/B,MAAQA,EAGpC8/B,iBAAiBC,GAEf9kC,KAAKqc,SAAS+nB,gBAAgBr/B,MAAM,GAAGwe,IAAIuhB,GAG7CC,iBAAiBD,GAEf9kC,KAAKqc,SAAS+nB,gBAAgBr/B,MAAM,GAAGwe,IAAIuhB,GAG7CE,iBAAiBF,GAEf9kC,KAAKqc,SAAS+nB,gBAAgBr/B,MAAM,GAAGwe,IAAIuhB,GAG7CG,iBAAiBH,GAEf9kC,KAAKqc,SAAS+nB,gBAAgBr/B,MAAM,GAAGwe,IAAIuhB,GAG7CI,iBAAiBJ,GAEf9kC,KAAKqc,SAAS+nB,gBAAgBr/B,MAAM,GAAGwe,IAAIuhB,ICzFhC,MAAMK,WAAoBvoB,GAEvCxb,YAAYoiC,GAEV90B,gMAEA1O,KAAKqc,SAAS+oB,WAAa,CAAErgC,WAAO3B,GAGtCiiC,gBAAgBze,GAEd5mB,KAAKqc,SAAS+oB,WAAWrgC,MAAQ6hB,GCVtB,MAAM0e,WAA6B1oB,GAEhDxb,YAAYmkC,GAEV72B,6qBAAYtL,EAAW,CACrBoiC,cAAeD,EACfE,MAAOF,IAGTvlC,KAAKqc,SAASqpB,QAAU,CAAE3gC,MAAO,IAAIwR,EAAQ,GAAK,KAClDvW,KAAKqc,SAASspB,UAAY,CAAE5gC,MAAO,IAAIwR,EAAQ,GAAK,KAGtDqvB,SAAS99B,EAAGwe,GAEVtmB,KAAKqc,SAASqpB,QAAQ3gC,MAAMuC,EAAIQ,EAChC9H,KAAKqc,SAASqpB,QAAQ3gC,MAAMwC,EAAI+e,EAGlCuf,cAAcv+B,EAAGC,GAEfvH,KAAKqc,SAASspB,UAAU5gC,MAAMwe,IAAIjc,EAAGC,ICtB1B,MAAMu+B,WAAmClpB,GAEtDxb,YAAYmkC,GAEV72B,ydAEA1O,KAAKqc,SAAS0pB,oBAAsB,CAAEhhC,MAAO,KAC7C/E,KAAKqc,SAAS2pB,YAAsB,CAAEjhC,MAAO,KAC7C/E,KAAKqc,SAAS4pB,aAAsB,CAAElhC,MAAO,IAAI4X,EAAM,YACvD3c,KAAKqc,SAAS6pB,eAAsB,CAAEnhC,MAAO,ICNlC,MAAMohC,GAEnB/kC,YAAYoiC,EAAQ,GAElBxjC,KAAKomC,cAAgB,EACrBpmC,KAAKqmC,eAAiB,EAEtBrmC,KAAKsmC,uBAAyB,GAC9BtmC,KAAKumC,wBAA0B,GAC/BvmC,KAAKwmC,sBAAwB,GAE7BxmC,KAAKwjC,MAAQA,EACbxjC,KAAKymC,gBAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,IACpCzmC,KAAK0mC,QAAU,CAAEC,UAAWC,EAAcC,UAAWD,EAAcE,OAAQ/L,GAE3E/6B,KAAK+mC,mBAAqB,IAAI3a,EAAkB,EAAG,EAAGpsB,KAAK0mC,SAC3D1mC,KAAK+mC,mBAAmBzZ,QAAQ0Z,iBAAkB,EAElDhnC,KAAKinC,iBACLjnC,KAAKknC,UAELlnC,KAAKmnC,yBAA2B,IAAIrB,GAGtCrD,KAAKta,EAAIif,GAEPpnC,KAAKqnC,UAAUlf,EAAG/I,MAAO+I,EAAGjI,QAExBknB,EAEFzT,GAASzG,KAAK/E,EAAInoB,KAAK+mC,mBAAoB/mC,KAAKmnC,0BAIhDxT,GAASzG,KAAK/E,EAAInoB,KAAK+mC,oBAGzB,IAAIO,EAAoBtnC,KAAK+mC,mBAE7B,IAAK,IAAItgC,EAAI,EAAGA,EAAIzG,KAAKwjC,MAAO/8B,IAChC,CACE,MAAMmnB,EAAM5tB,KAAKsmC,uBAAuB7/B,GAExCmnB,EAAIiY,cAAc,EAAG,GACrBlS,GAASzG,KAAKoa,EAAmBtnC,KAAKumC,wBAAwB9/B,GAAImnB,GAElEA,EAAIiY,cAAc,EAAG,GACrBlS,GAASzG,KAAKltB,KAAKumC,wBAAwB9/B,GAAIzG,KAAKwmC,sBAAsB//B,GAAImnB,GAE9E0Z,EAAoBtnC,KAAKwmC,sBAAsB//B,IAInD8gC,sBAEE,OAAOvnC,KAAKumC,wBAAwB,GAAGjZ,QAGzCka,iBAEE,OAAOxnC,KAAKumC,wBAAwB,GAGtCW,UAEElnC,KAAKynC,aAELznC,KAAK+mC,mBAAmBra,QAAQ,EAAG,GAEnC,IAAK,IAAIjmB,EAAI,EAAGA,EAAIzG,KAAKwjC,MAAO/8B,IAChC,CACE,MAAMihC,EAAM,IAAItb,EAAkB,EAAG,EAAGpsB,KAAK0mC,SACvCiB,EAAM,IAAIvb,EAAkB,EAAG,EAAGpsB,KAAK0mC,SAE7CgB,EAAIpa,QAAQ0Z,iBAAkB,EAC9BW,EAAIra,QAAQ0Z,iBAAkB,EAE9BhnC,KAAKumC,wBAAwB5/B,KAAK+gC,GAClC1nC,KAAKwmC,sBAAsB7/B,KAAKghC,IAIpCN,UAAU7L,EAAeoM,GAEvB,GAAI5nC,KAAKomC,gBAAkB5K,GAAiBx7B,KAAKqmC,iBAAmBuB,EAElE,OAGF5nC,KAAKomC,cAAgB5K,EACrBx7B,KAAKqmC,eAAiBuB,EAEtB,IAAIxoB,EAAQrZ,KAAKC,MAAMw1B,EAAgB,GACnCtb,EAASna,KAAKC,MAAM4hC,EAAiB,GAEzC5nC,KAAK+mC,mBAAmBra,QAAQtN,EAAOc,GAEvC,IAAK,IAAIzZ,EAAI,EAAGA,EAAIzG,KAAKwjC,MAAO/8B,IAE9BzG,KAAKwmC,sBAAsB//B,GAAGimB,QAAQtN,EAAOc,GAC7ClgB,KAAKumC,wBAAwB9/B,GAAGimB,QAAQtN,EAAOc,GAC/ClgB,KAAKsmC,uBAAuB7/B,GAAGm/B,SAASxmB,EAAOc,GAE/Cd,EAAUrZ,KAAKC,MAAMoZ,EAAQ,GAC7Bc,EAAUna,KAAKC,MAAMka,EAAS,GAIlC+mB,eAAezL,EAAeoM,GAE5B5nC,KAAK6nC,oBAEL,IAAK,IAAIphC,EAAI,EAAGA,EAAIzG,KAAKwjC,MAAO/8B,IAE9BzG,KAAKsmC,uBAAuB3/B,KAAK,IAAI2+B,GAAqBtlC,KAAKymC,gBAAgBhgC,KAInFohC,oBAEE,IAAK,IAAIphC,EAAI,EAAGA,EAAIzG,KAAKsmC,uBAAuBrhC,OAAQwB,IAEtDzG,KAAKsmC,uBAAuB7/B,GAAGuV,UAEjChc,KAAKsmC,uBAAuBrhC,OAAS,EAGvCwiC,aAEE,IAAK,IAAIhhC,EAAI,EAAGA,EAAIzG,KAAKwmC,sBAAsBvhC,OAAQwB,IAErDzG,KAAKumC,wBAAwB9/B,GAAGuV,UAChChc,KAAKwmC,sBAAsB//B,GAAGuV,UAEhChc,KAAK+mC,mBAAmB/qB,UAExBhc,KAAKumC,wBAAwBthC,OAAS,EACtCjF,KAAKwmC,sBAAsBvhC,OAAS,GCnIzB,MAAM6iC,WAA0BlsB,GAE7Cxa,cAEEsN,QAEA1O,KAAK+nC,uBAAoB3kC,EAEzBpD,KAAKgjC,aAAU5/B,EACfpD,KAAKgoC,aAAU5kC,EACfpD,KAAKkjC,aAAU9/B,EAEfpD,KAAKioC,QAAU,IAAI9C,GAGrBhuB,WAEEnX,KAAKkjC,QAAU,IAAIiD,GACnBnmC,KAAKgjC,QAAU,IAAI5W,EAAkBT,GAAQnG,aAAcmG,GAAQlG,eACnEzlB,KAAKgoC,QAAU,IAAI5b,EAAkBT,GAAQnG,aAAcmG,GAAQlG,eAEnEzlB,KAAK+nC,kBAAoB,IAAIxE,GAA2B,GACxDvjC,KAAKkjC,QAAU,IAAIiD,GAAgB,GAEnCnmC,KAAK+nC,kBAAkB1D,SAASrkC,KAAKkjC,QAAQsD,sBAAsB,GAAGlZ,SACtEttB,KAAK+nC,kBAAkBxD,SAASvkC,KAAKkjC,QAAQsD,sBAAsB,GAAGlZ,SACtEttB,KAAK+nC,kBAAkBvD,SAASxkC,KAAKkjC,QAAQsD,sBAAsB,GAAGlZ,SACtEttB,KAAK+nC,kBAAkBtD,SAASzkC,KAAKkjC,QAAQsD,sBAAsB,GAAGlZ,SACtEttB,KAAK+nC,kBAAkBrD,SAAS1kC,KAAKkjC,QAAQsD,sBAAsB,GAAGlZ,SAEtEttB,KAAK+nC,kBAAkBpD,mBAAmB,GAC1C3kC,KAAK+nC,kBAAkBnD,iBAAiB,GAExC5kC,KAAKioC,QAAQ5C,gBAAgBrlC,KAAKkjC,QAAQqD,wBAAwB,GAAGjZ,SAGvEqX,mBAAmBuD,GAEjBloC,KAAK+nC,kBAAkBpD,mBAAmBuD,GAG5CtD,iBAAiBsD,GAEfloC,KAAK+nC,kBAAkBnD,iBAAiBsD,GAG1CrD,iBAAiBC,GAEf9kC,KAAK+nC,kBAAkBlD,iBAAiBC,GAG1CC,iBAAiBD,GAEf9kC,KAAK+nC,kBAAkBhD,iBAAiBD,GAG1CE,iBAAiBF,GAEf9kC,KAAK+nC,kBAAkB/C,iBAAiBF,GAG1CG,iBAAiBH,GAEf9kC,KAAK+nC,kBAAkB9C,iBAAiBH,GAG1CI,iBAAiBJ,GAEf9kC,KAAK+nC,kBAAkB7C,iBAAiBJ,GAG1CjpB,SAEE7b,KAAKmjC,kBAELxP,GAASlL,MAAMzoB,KAAKgjC,QAASvW,GAAc9gB,SAAS,GAAM,GAC1DgoB,GAAS9X,OAAOkM,GAAapc,QAAS8gB,GAAc9gB,QAAS3L,KAAKgjC,SAGlEhjC,KAAKkjC,QAAQT,KAAKziC,KAAKgjC,SAAS,GAGhCrP,GAAShG,cAAc3tB,KAAK+nC,kBAAmB/nC,KAAKkjC,QAAQqD,wBAAwB,IAGpF5S,GAASzG,KAAKltB,KAAKgjC,aAAS5/B,EAAWpD,KAAKioC,SAG9C9E,kBAEMnjC,KAAKgjC,QAAQ5jB,QAAUuM,GAAQnG,cAAgBxlB,KAAKgjC,QAAQ9iB,SAAWyL,GAAQlG,gBAEjFzlB,KAAKgjC,QAAQtW,QAAQf,GAAQnG,aAAcmG,GAAQlG,eACnDzlB,KAAKgoC,QAAQtb,QAAQf,GAAQnG,aAAcmG,GAAQlG,iBCtG1C,MAAMwH,WAA2Bkb,EAE9C/mC,YAAYi/B,EAAMlB,EAAOmB,EAAKC,EAAQrZ,EAAMC,GAE1CzY,MAAM2xB,EAAMlB,EAAOmB,EAAKC,EAAQrZ,EAAMC,GAEtCnnB,KAAKonB,YAAc,IAAIzK,EAAM,WAC7B3c,KAAKqnB,YAAc,GCyDvB,OAAe,IAjEf,MAEEjmB,cAEEpB,KAAKooC,WAAa,GAClBpoC,KAAKqoC,mBAAqB,IAAIC,IAGhC1+B,SAEE5J,KAAKuoC,6BAEL,IAAK,MAAMC,KAAaxoC,KAAKqoC,mBAE3BG,EAAU5+B,OAAOkR,GAAYrC,mBAAmBT,oBAIpDywB,mBAAmBD,GAEjBxoC,KAAKooC,WAAWzhC,KAAK6hC,GAGvBE,iBAAiBF,GAIfxoC,KAAKqoC,mBAAmBpgC,IAAIugC,GAG9BG,kBAAkBH,GAIhBxoC,KAAKqoC,mBAAmBO,OAAOJ,GAGjCK,sBAAsBC,GAEpBnmC,QAAQC,KAAK,oDACb5C,KAAK4E,IAAIkkC,GAGXlkC,IAAIkkC,GAEF,IAAK,IAAIriC,EAAI,EAAGA,EAAIzG,KAAKooC,WAAWnjC,OAAQwB,IAE1C,GAAIzG,KAAKooC,WAAW3hC,GAAG/F,OAASooC,EAE9B,OAAO9oC,KAAKooC,WAAW3hC,GAG3B9D,QAAQM,MAAM,sDAAuD6lC,GAIvEP,6BAEE,IAAK,IAAI9hC,EAAI,EAAGA,EAAIzG,KAAKooC,WAAWnjC,OAAQwB,IAE1CzG,KAAKooC,WAAW3hC,GAAG4T,YAAYS,GAAYrC,mBAAmBT,sBCtDrD,MAAM+wB,GAEnB3nC,YAAY4nC,EAAoBtd,GAE9Bsd,EAAqBA,GAAsB,IAAIztB,GAE/Cvb,KAAKgpC,mBAAqBA,EAC1BhpC,KAAK0rB,SAAWA,EAEhB1rB,KAAKipC,YAAa,EAClBjpC,KAAKkpC,cAAgB,EAGvBt/B,SAEO5J,KAAKipC,aAIV1wB,GAAK9B,WAGsB,IAAvBzW,KAAKkpC,eAEPlpC,KAAKgpC,mBAAmBxtB,gBAG1BshB,GAAMlzB,SAEN5J,KAAKgpC,mBAAmBp/B,SACxBkR,GAAYlR,SACZu/B,GAAqBv/B,SAErB5J,KAAKgpC,mBAAmBttB,gBAExB1b,KAAK0rB,SAAS9hB,SACdi3B,GAAGj3B,SACHi3B,GAAGhlB,OAAO7b,KAAK0rB,UACf1rB,KAAKgpC,mBAAmBvtB,iBAExBqlB,GAAMjlB,OAAO7b,KAAK0rB,UAIlB1rB,KAAKgpC,mBAAmBrtB,eACxB3b,KAAKkpC,gBAELpM,GAAMrU,QACNoY,GAAGpY,QACHqY,GAAMrY,SAGR1R,QAEM/W,KAAKipC,aAEkB,IAAvBjpC,KAAKkpC,eAEPlpC,KAAKgpC,mBAAmB7xB,WAG1BnX,KAAKipC,YAAa,EAElBjpC,KAAK0rB,SAASyC,UAAUib,iBAAiBppC,KAAK4J,OAAO7F,KAAK/D,QAG5DuJ,QAE0B,IAApBvJ,KAAKipC,aAETjpC,KAAKipC,YAAa,EAClBjpC,KAAKgpC,mBAAmBrxB,UAExB3X,KAAK0rB,SAASyC,UAAUib,iBAAiB,OAG3C/wB,UAAUmY,GAERxwB,KAAKgpC,mBAAmBrxB,QAAQ3X,MAChCA,KAAKgpC,mBAAqBxY,EAC1BxwB,KAAKgpC,mBAAmB7xB,SAASnX,MAGnCgc,UAEEhc,KAAKuJ,OACLvJ,KAAKkpC,cAAgB,GCzCzB,OAAe,IAnDf,MAEEnpC,OAEE4C,QAAQC,KAAK,uDACb+oB,GAAQ5rB,OAGV6lB,gBAAgBte,EAAGC,GAEjB5E,QAAQC,KAAK,uDACb+oB,GAAQ/F,gBAAgBte,EAAGC,GAG7BqC,SAEEjH,QAAQC,KAAK,uDACb+oB,GAAQ/hB,SAGVkc,YAAY1G,EAAOc,GAEjBvd,QAAQC,KAAK,uDACb+oB,GAAQ7F,YAAY1G,EAAOc,GAG7B6F,uBAAuBC,GAGrB,OADArjB,QAAQC,KAAK,uDACN+oB,GAAQ5F,uBAAuBC,GAGxCC,oBAAoBlhB,GAGlB,OADApC,QAAQC,KAAK,uDACN+oB,GAAQ1F,oBAAoBlhB,GAGrCmhB,iBAGE,OADAvjB,QAAQC,KAAK,uDACN+oB,GAAQzF,iBAGbC,mBAGF,OADAxjB,QAAQC,KAAK,uDACN+oB,GAAQxF,eC5CJ,MAAMkjB,WAAyBvrB,GAE5C1c,cAEEsN,QACA1O,KAAKspC,YAAc,IAAI/yB,EAAQ,EAAG,GAGpCiJ,OAAOR,EAAMM,EAAYrB,EAAQE,GAE/BA,EAAIc,KAAOK,EAAWL,KAEtB,MAAMsqB,EAAYvpC,KAAK+e,cAAcC,EAAMM,EAAWL,MAGtDhB,EAAOmB,MAAQrZ,KAAKmZ,KAAKqqB,EAAUjiC,EAAyB,EAArBtH,KAAKspC,YAAYhiC,GACxD2W,EAAOiC,OAASna,KAAKmZ,KAAKqqB,EAAUhiC,EAAyB,EAArBvH,KAAKspC,YAAY/hC,GACzD4W,EAAIuK,UAAU,EAAG,EAAGzK,EAAOmB,MAAOnB,EAAOiC,QAGzC/B,EAAIqrB,YAAc,EAClBrrB,EAAIoK,UAAYjJ,EAAWC,YAAc,UACzCpB,EAAIqK,SAAS,EAAG,EAAGvK,EAAOmB,MAAOnB,EAAOiC,QACxC/B,EAAIqrB,YAAc,EAElBrrB,EAAIqrB,YAAc,EAElBrrB,EAAIc,KAAOK,EAAWL,KACtBd,EAAIoK,UAAYjJ,EAAWC,YAAc,UACzCpB,EAAIsrB,aAAe,SAEnBtrB,EAAIurB,UAAYpqB,EAAWoqB,WAAa,SAClB,WAAlBvrB,EAAIurB,UAENvrB,EAAIwrB,SAAS3qB,EAAMf,EAAOmB,MAAQ,EAAGnB,EAAOiC,OAAS,GAIrD/B,EAAIwrB,SAAS3qB,EAAM,EAAGf,EAAOiC,OAAS,ICxC7B,MAAM0pB,GAEnBxoC,aAAYV,KAAEA,EAAIuU,UAAEA,IAElBjV,KAAKU,KAAOA,EACZV,KAAKiV,UAAYA,EACjBjV,KAAK6pC,QAAS,EAEdV,GAAqBV,mBAAmBzoC,MAG1C+W,SAIAI,WAEEnX,KAAKiV,UAAU8F,UAAUC,OAAO,UAChCmuB,GAAqBT,iBAAiB1oC,MAEtCA,KAAK6pC,QAAS,EAGhBjgC,UAIA+N,UAEE3X,KAAKiV,UAAU8F,UAAU9S,IAAI,UAC7BkhC,GAAqBR,kBAAkB3oC,MAEvCA,KAAK6pC,QAAS,EAGhBxvB,YAAYrC,GAEVhY,KAAKiV,UAAUoG,MAAMC,QAAUtD,EAAmB,GAAGhY,KAAKU,gBAC1DV,KAAK8pC,gBAGPA,gBAEM9pC,KAAKiV,UAAUoG,MAAMC,QAAU,KAE7Btb,KAAK6pC,QAEP7pC,KAAKmX,WAKFnX,KAAK6pC,QAER7pC,KAAK2X,UAKXsD,mBAEEjG,GAAckG,YAAYlb,KAAKiV,WAGjCkG,mBAEEnG,GAAcoG,YAAYpb,KAAKiV,YCjEpB,MAAM80B,WAAwB9lB,EAE3C7iB,YAAYge,EAAOc,EAAQsC,EAAOsB,GAEhC1E,EAAQA,GAAS,EACjBc,EAASA,GAAU,EACnBsC,EAAQA,GAAS,UACjBsB,EAAWA,GAAY,IAAIM,EAAkB,CAAE5B,MAAOA,IAEtD,MAAMqB,EAAW,IAAI4F,EAAoBrK,EAAOc,GAChD2D,EAASsB,SAAQ,MACjBzW,MAAMmV,EAAUC,ICXL,MAAMkmB,WAAsB/lB,EAEzC7iB,YAAYge,EAAOc,EAAQsC,EAAOsB,GAEhC1E,EAAQA,GAAS,EACjBc,EAASA,GAAU,EACnBsC,EAAQA,GAAS,UACjBsB,EAAWA,GAAY,IAAIM,EAAkB,CAAE5B,MAAOA,IAGtD9T,MADiB,IAAI+a,EAAoBrK,EAAOc,GAChC4D,ICdL,MAAMmmB,GAEnB7oC,eAGAC,qBAAqB6oC,EAAQpjC,GAE3BA,EAAOH,KAAKwjC,MAAMrjC,EAAQojC,GAG5B7oC,yBAAyB+oC,EAAOnoC,GAE9B,MAAMooC,EAAmBpoC,EAAOmoC,EAAMnlC,OAEtC,IAAK,IAAIwB,EAAI,EAAGA,EAAI4jC,EAAkB5jC,IAEpC2jC,EAAMzjC,KAAKyjC,EAAM3jC,GAAGnC,SAIxBjD,mBAAmB+oC,EAAO5N,GAExB,MAAMhC,EAAQ4P,EAAM7pC,QAAQi8B,GACxBhC,GAAS,GAEX4P,EAAM3N,OAAOjC,EAAO,GAIxBn5B,yBAAyB+E,EAAQU,GAE/B,IAAIwjC,EAAgBlkC,EAAO,GACvBmkC,EAAmBD,EAAcjhB,WAAWviB,GAChD,IAAK,IAAIL,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAE7BL,EAAOK,GAAG4iB,WAAWviB,GAAUyjC,IAEjCD,EAAgBlkC,EAAOK,GACvB8jC,EAAmBnkC,EAAOK,GAAG4iB,WAAWviB,IAG5C,OAAOwjC,EAGTjpC,8BAA8BmpC,GAE5B,MAAMC,EAAMthC,OAAOC,KAAKohC,GAClBriC,EAAM,GACZ,IAAK,IAAI1B,EAAI,EAAGA,EAAIgkC,EAAIxlC,OAAQwB,IAE9B0B,EAAIxB,KAAK6jC,EAAIC,EAAIhkC,KAEnB,OAAO0B,GClDI,MAAMuiC,GAEnBtpC,cAEEpB,KAAKqqB,OAAS,IAAIhG,EAGpBsmB,WAAWvkC,EAAQwkC,EAAmBC,EAAc5jB,GAElDjnB,KAAKqqB,OAAO1H,cAAcvc,GAE1B,MAAM03B,EAAQ/3B,KAAK+kC,SAASD,EAAe,GACrC9M,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAAS7W,GAAW,EAEpD8jB,EAAkB/qC,KAAKgrC,oBAAoBJ,EAAmB9M,GAC9DmN,EAAoBjrC,KAAKkrC,sBAAsBN,EAAmB9M,GAClEqN,EAAoBnrC,KAAKorC,sBAAsBR,EAAmB7M,GAClEsN,EAAqBrrC,KAAKsrC,uBAAuBV,EAAmB7M,GAEpEwN,EAAqB,IAAIhlC,EAAQ,EAAG,GAAI,GAAGm3B,gBAAgBkN,GAE3DY,EAAgBxrC,KAAKqqB,OAAOriB,OAAO1D,QAEnCmnC,EAAqBzrC,KAAK0rC,yBAA8C,EAArB1rC,KAAKqqB,OAAOlK,OAAiC,EAArBngB,KAAKqqB,OAAOlK,OAAY0qB,EAAc5jB,GACjH0kB,EAAUH,EAAclnC,QAAQ2D,IAAIsjC,EAAmBjnC,QAAQ4D,gBAAqC,EAAtBujC,IAE9EG,GAAc,IAAIzO,GAAQoB,8BAA8BwM,EAAiBY,GACzEE,GAAc,IAAI1O,GAAQoB,8BAA8B0M,EAAmBU,GAE3EG,GAAe,IAAI3O,GAAQoB,8BAA8B4M,EAAmBQ,GAC5EI,GAAe,IAAI5O,GAAQoB,8BAA8B8M,EAAoBM,GAEnF3rC,KAAKgsC,+BAA+BL,EAASvlC,EAAQwkC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAE1GH,EAASrN,8BAA8BwM,EAAiBY,GACxDE,EAAWtN,8BAA8B0M,EAAmBU,GAE5DG,EAAWvN,8BAA8B4M,EAAmBQ,GAC5DI,EAAYxN,8BAA8B8M,EAAoBM,GAE9D,IAAIpB,EAAmB3+B,EAAAA,EAEvB,MAAMqgC,EAAcV,EAAmBjnC,QAAQ4D,gBAAqC,EAAtBujC,GAC9D,IAAK,IAAIhlC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMqiB,EAAO,IAAIojB,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIgkC,IAE1DE,EAAwB,IAAI5lC,EAC5B6lC,EAAyB,IAAI7lC,EAE7B8lC,EAA0B,IAAI9lC,EAC9B+lC,EAA0B,IAAI/lC,EAEpCqlC,EAASW,cAAczjB,EAAOqjB,GAC9BN,EAAWU,cAAczjB,EAAMsjB,GAE/BN,EAAWS,cAAczjB,EAAOujB,GAChCN,EAAYQ,cAAczjB,EAAMwjB,GAE5BH,EAAqBlnC,SAAW,MAElCtC,QAAQ6pC,IAAI,4BAA6B/lC,GAEvC2lC,EAAuBnnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,8BAA+B/lC,GAEzC4lC,EAAuBpnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,8BAA+B/lC,GAEzC6lC,EAAwBrnC,SAAW,MAErCtC,QAAQ6pC,IAAI,+BAAgC/lC,GAG9C,MAAMgmC,EAAoBrmC,EAAOK,GAAGnC,QAAQglB,IAAI6iB,GAAsBlnC,SAChEynC,EAAoBtmC,EAAOK,GAAGnC,QAAQglB,IAAI8iB,GAAwBnnC,SAElE0nC,EAAsBvmC,EAAOK,GAAGnC,QAAQglB,IAAI+iB,GAAwBpnC,SACpE2nC,EAAsBxmC,EAAOK,GAAGnC,QAAQglB,IAAIgjB,GAAyBrnC,SAErE4nC,EAAkB9mC,KAAKN,IAAIgnC,EAAiBC,GAC5CI,EAAkB/mC,KAAKN,IAAIknC,EAAmBC,GAE9CnnC,EAAMM,KAAKN,IAAIonC,EAAcC,GAE/BrnC,EAAM8kC,IAERA,EAAmB9kC,GAIvB,MAAMsnC,EAAqBxB,EAAmBjnC,QAAQ4D,eAAeqiC,GAGrE,OAFyBoB,EAAQrnC,QAAQ2D,IAAI8kC,GAK/Cf,+BAA+BgB,EAAY5mC,EAAQwkC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBjtC,KAAKktC,wBAAwB9mC,EAAQylC,EAAYD,EAAUhB,GAC7EuC,EAAoBntC,KAAKotC,0BAA0BhnC,EAAQ0lC,EAAYC,EAAanB,GAE1FoC,EAAW/kC,IAAIglC,GACfD,EAAW/kC,IAAIklC,GAGjBD,wBAAwB9mC,EAAQylC,EAAYD,EAAUhB,GAEpD,IAEIyC,EACAC,EAHAC,EAA+B3hC,EAAAA,EAC/B4hC,EAAkC5hC,EAAAA,EAItC,MAAM6hC,EAAS,IAAIlnC,EAAQ,EAAG,EAAG,GAAGm3B,gBAAgBkN,GACpD,IAAK,IAAInkC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMinC,EAAc,IAAIxB,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwlC,EAAOnpC,QAAQ4D,gBAAgB,OAChGylC,EAAc,IAAIzB,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwlC,EAAOnpC,QAAQ4D,eAAe,OAE/FkkC,EAA0B,IAAI7lC,EAC9B4lC,EAAuB,IAAI5lC,EAEjCslC,EAAWU,cAAcmB,EAAYtB,GACrCR,EAASW,cAAcoB,EAASxB,GAEhC,MAAMyB,EAAcxB,EAAuB/iB,WAAWjjB,EAAOK,IACvDonC,EAAc1B,EAAqB9iB,WAAWjjB,EAAOK,IAEvD0lC,EAAqBlnC,SAAW,MAElCtC,QAAQ6pC,IAAI,qCAAsC/lC,GAEhD2lC,EAAuBnnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,uCAAwC/lC,GAGlDmnC,EAAYJ,IAEdA,EAAiCI,EACjCN,EAAqBlnC,EAAOK,IAE1BonC,EAAUN,IAEZA,EAA+BM,EAC/BR,EAAmBjnC,EAAOK,IAI9B9D,QAAQ6pC,IAAIa,EAAkBC,GAE9B,MAAMQ,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAOnpC,QAAQ4D,gBAAgB4lC,GAGxCV,0BAA0BhnC,EAAQ0lC,EAAYC,EAAanB,GAEzD,IAEImD,EACAC,EAHAC,EAAkCriC,EAAAA,EAClCsiC,EAAkCtiC,EAAAA,EAItC,MAAMuiC,EAAY,IAAI5nC,EAAQ,EAAG,EAAG,GAAGm3B,gBAAgBkN,GAEvD,IAAK,IAAInkC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAM2nC,EAAa,IAAIlC,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIkmC,EAAU7pC,QAAQ4D,gBAAgB,OAClGmmC,EAAa,IAAInC,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIkmC,EAAU7pC,QAAQ4D,eAAe,OAEjGmkC,EAA0B,IAAI9lC,EAC9B+lC,EAA0B,IAAI/lC,EAEpCulC,EAAWS,cAAc6B,EAAY/B,GACrCN,EAAYQ,cAAc8B,EAAY/B,GAEtC,MAAMgC,EAAajC,EAAuBhjB,WAAWjjB,EAAOK,IACtD8nC,EAAajC,EAAwBjjB,WAAWjjB,EAAOK,IAEzD4lC,EAAuBpnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,8BAA+B/lC,GAEzC6lC,EAAwBrnC,SAAW,MAErCtC,QAAQ6pC,IAAI,+BAAgC/lC,GAG1C6nC,EAAYJ,IAEdA,EAAiCI,EACjCN,EAAqB5nC,EAAOK,IAE1B8nC,EAAaN,IAEfA,EAAkCM,EAClCR,EAAsB3nC,EAAOK,IAIjC,MAAMqnC,GAAcG,EAAkCC,GAAkC,EAKxF,OAFAvrC,QAAQ6pC,IAAIuB,EAAqBC,GAE1BG,EAAU7pC,QAAQ4D,gBAAgB4lC,GAG3C9C,oBAAoBJ,EAAmB9M,GAErC,MAAMiN,EAAkB,IAAIxkC,EAAQ,GAAI,EAAG,GAG3C,OAFAwkC,EAAgBrN,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,GAAIu3B,IACxFiN,EAAgBrN,gBAAgBkN,GACzBG,EAGTG,sBAAsBN,EAAmB9M,GAEvC,MAAMmN,EAAoB,IAAI1kC,EAAQ,EAAG,EAAG,GAG5C,OAFA0kC,EAAkBvN,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,IAAKu3B,IAC3FmN,EAAkBvN,gBAAgBkN,GAC3BK,EAGTG,sBAAsBR,EAAmB7M,GAEvC,MAAMoN,EAAoB,IAAI5kC,EAAQ,EAAG,EAAG,GAG5C,OAFA4kC,EAAkBzN,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,GAAIw3B,IAC1FoN,EAAkBzN,gBAAgBkN,GAC3BO,EAGTG,uBAAuBV,EAAmB7M,GAExC,MAAMsN,EAAqB,IAAI9kC,GAAS,EAAG,EAAG,GAG9C,OAFA8kC,EAAmB3N,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,IAAKw3B,IAC5FsN,EAAmB3N,gBAAgBkN,GAC5BS,EAGTK,yBAAyBtsB,EAAOc,EAAQ2qB,EAAc5jB,GAEpD,MAAM6W,EAAS+M,EAAe,EAAK9kC,KAAK4B,GAAK,IACvCo2B,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAAS7W,GAAW,EAEpDiX,EAAQhe,EAASna,KAAKk4B,IAAIH,GAC1BK,EAAQ/e,EAAQrZ,KAAKk4B,IAAIF,GAC/B,OAAOh4B,KAAKL,IAAIK,KAAKsB,IAAI82B,GAAQp4B,KAAKsB,IAAI62B,KCzP/B,MAAMwQ,GAEnBrtC,uCAAuCstC,GAErC,MAAMC,EAAUD,EAAgBnU,MAC1BqU,EAAYF,EAAgBj/B,aAAa,YAGzCo/B,EAAW,GAEjB,IAAK,IAAIroC,EAAI,EAAGA,EAAImoC,EAAQ/S,MAAOp1B,GAAK,EAGtCqoC,EAASnoC,KAAKkoC,EAAUE,KAAKH,EAAQxE,MAAM3jC,EAAI,KAC/CqoC,EAASnoC,KAAKkoC,EAAUG,KAAKJ,EAAQxE,MAAM3jC,EAAI,KAC/CqoC,EAASnoC,KAAKkoC,EAAUI,KAAKL,EAAQxE,MAAM3jC,EAAI,KAQ/CqoC,EAASnoC,KAAKkoC,EAAUE,KAAKH,EAAQxE,MAAM3jC,EAAI,KAC/CqoC,EAASnoC,KAAKkoC,EAAUG,KAAKJ,EAAQxE,MAAM3jC,EAAI,KAC/CqoC,EAASnoC,KAAKkoC,EAAUI,KAAKL,EAAQxE,MAAM3jC,EAAI,KAQ/CqoC,EAASnoC,KAAKkoC,EAAUE,KAAKH,EAAQxE,MAAM3jC,EAAI,KAC/CqoC,EAASnoC,KAAKkoC,EAAUG,KAAKJ,EAAQxE,MAAM3jC,EAAI,KAC/CqoC,EAASnoC,KAAKkoC,EAAUI,KAAKL,EAAQxE,MAAM3jC,EAAI,KAOjD,MAAMod,EAAW,IAAInB,EAIrB,OAFAmB,EAASjF,aAAa,WAAY,IAAImd,EAAgB,IAAIf,aAAa8T,GAAW,IAClFJ,GAAkBQ,0BAA0BrrB,GACrCA,EAGTxiB,iCAAiC8tC,GAE/B,MAAMC,EAAkB,GAClBP,EAAYM,EAA4Bz/B,aAAa,YAE3D,IAAK,IAAIjJ,EAAI,EAAGA,EAAIooC,EAAUhT,MAAOp1B,GAAK,EAExC2oC,EAAgBzoC,KAAK,GACrByoC,EAAgBzoC,KAAK,GACrByoC,EAAgBzoC,KAAK,GAErByoC,EAAgBzoC,KAAK,GACrByoC,EAAgBzoC,KAAK,GACrByoC,EAAgBzoC,KAAK,GAErByoC,EAAgBzoC,KAAK,GACrByoC,EAAgBzoC,KAAK,GACrByoC,EAAgBzoC,KAAK,GAEvBwoC,EAA4BvwB,aAAa,cAAe,IAAImd,EAAgB,IAAIf,aAAaoU,GAAkB,KCrEpG,MAAMC,GAEnBjuC,eAGAC,sBAAsB8T,GAEpB,MAAM8I,EAAS7D,SAAS8D,cAAc,UACtCD,EAAOmB,MAAQjK,EAAMiK,MACrBnB,EAAOiC,OAAS/K,EAAM+K,OAEtB,MAAMzX,EAAUwV,EAAOG,WAAW,MAGlC,OAFA3V,EAAQiqB,UAAUvd,EAAO,EAAG,GAErB1M,EAAQ6mC,aAAa,EAAG,EAAGn6B,EAAMiK,MAAOjK,EAAM+K,QAGvD7e,iBAAiBkuC,EAAWjoC,EAAGC,GAE7B,MAAMge,EAAuC,GAA3Bje,EAAIioC,EAAUnwB,MAAQ7X,GAClCpC,EAAOoqC,EAAUpqC,KACvB,OAAO,IAAIukB,EAAQvkB,EAAKogB,EAAW,GAAIpgB,EAAKogB,EAAW,GAAIpgB,EAAKogB,EAAW,GAAIpgB,EAAKogB,EAAW,KCgInG,OAAe,IAtJf,MAEEnkB,eAKAouC,OAAOxqB,EAAiByqB,GAEtB,MAAMC,EAAa,GAEnB,IAAIC,EAAW,SAEf,MAAMb,EAAW9pB,EAAgBtV,aAAa,YACxCkgC,EAAU5qB,EAAgBtV,aAAa,UACvCk/B,EAAW5pB,EAAgBwV,MAE3BqV,EAAQ,GAEd,IAAK,IAAIppC,EAAI,EAAGA,EAAImoC,EAAQ/S,MAAOp1B,GAAK,EACxC,CACE,MAAMqpC,EAAUlB,EAAQxE,MAAM3jC,EAAI,GAC5BspC,EAAUnB,EAAQxE,MAAM3jC,EAAI,GAC5BupC,EAAUpB,EAAQxE,MAAM3jC,EAAI,GAE5BwpC,EAAK,IAAI1pC,EACf0pC,EAAG3oC,EAAIwnC,EAASC,KAAKe,GACrBG,EAAG1oC,EAAIunC,EAASE,KAAKc,GACrBG,EAAGloC,EAAI+mC,EAASG,KAAKa,GAErB,MAAMI,EAAK,IAAI3pC,EACf2pC,EAAG5oC,EAAIwnC,EAASC,KAAKgB,GACrBG,EAAG3oC,EAAIunC,EAASE,KAAKe,GACrBG,EAAGnoC,EAAI+mC,EAASG,KAAKc,GAErB,MAAMrV,EAAK,IAAIn0B,EACfm0B,EAAGpzB,EAAIwnC,EAASC,KAAKiB,GACrBtV,EAAGnzB,EAAIunC,EAASE,KAAKgB,GACrBtV,EAAG3yB,EAAI+mC,EAASG,KAAKe,GAErB,MAAMG,EAAO,CACX3/B,EAAGy/B,EACH9pC,EAAG+pC,EACHE,EAAG1V,GAGL,GAAIkV,EACJ,CACE,MAAM1hC,EAAK,IAAI3H,EACf2H,EAAG5G,EAAIsoC,EAAQb,KAAKe,GACpB5hC,EAAG3G,EAAIqoC,EAAQZ,KAAKc,GACpB5hC,EAAGnG,EAAI6nC,EAAQX,KAAKa,GAEpB,MAAMO,EAAK,IAAI9pC,EACf8pC,EAAG/oC,EAAIsoC,EAAQb,KAAKgB,GACpBM,EAAG9oC,EAAIqoC,EAAQZ,KAAKe,GACpBM,EAAGtoC,EAAI6nC,EAAQX,KAAKc,GAEpB,MAAMO,EAAK,IAAI/pC,EACf+pC,EAAGhpC,EAAIsoC,EAAQb,KAAKiB,GACpBM,EAAG/oC,EAAIqoC,EAAQZ,KAAKgB,GACpBM,EAAGvoC,EAAI6nC,EAAQX,KAAKe,GAEpB,MAAMO,EAASriC,EAAG5J,QAAQ2D,IAAIooC,GAAIpoC,IAAIqoC,GAAIzoB,YAC1CsoB,EAAKI,OAASA,EAGhBV,EAAMlpC,KAAKwpC,GAEX,MAAMK,EAAOxwC,KAAKywC,cAAcN,GAChCR,EAAW5pC,KAAKN,IAAI+qC,EAAMb,GAC1BD,EAAW/oC,KAAK6pC,GAGlB,MAAME,EAAyB1wC,KAAK2wC,8BAA8BjB,EAAYC,EAAUE,GAClFe,EAAiB5wC,KAAK6wC,oBAAoBH,EAAwBjB,GAExE,OADqBzvC,KAAK8wC,uBAAuBF,GAInDE,uBAAuBjB,GAErB,MAAMkB,EAAiB,GACjBC,EAAkB,GACxB,IAAK,IAAIvqC,EAAI,EAAGA,EAAIopC,EAAM5qC,OAAQwB,IAClC,CACE,MAAM0pC,EAAON,EAAMppC,GAEbwqC,EAAKlrC,KAAKuC,SACV4oC,EAAKnrC,KAAKuC,SAEhByoC,EAAepqC,KAAK3G,KAAKmxC,qBAAqBF,EAAIC,EAAIf,EAAK3/B,EAAG2/B,EAAKhqC,EAAGgqC,EAAKC,GAAG9rC,SAC1E6rC,EAAKI,QAEPS,EAAgBrqC,KAAKwpC,EAAKI,OAAOjsC,SAGrC,MAAO,CAAE8B,OAAQ2qC,EAAgBnB,QAASoB,GAG5CH,oBAAoBhB,EAAOuB,GAEzB,MAAMR,EAAiB,GACvB,IAAK,IAAInqC,EAAI,EAAGA,EAAI2qC,EAAQ3qC,IAC5B,CACE,MACM4qC,EAAgBxB,EADP9pC,KAAKsC,MAAMtC,KAAKuC,SAAWunC,EAAM5qC,SAGhD2rC,EAAejqC,KAAK0qC,GAGtB,OAAOT,EAGTD,8BAA8BjB,EAAY4B,EAAczB,GAEtD,MAAM0B,EAA4B,GAClC,IAAK,IAAI9qC,EAAI,EAAGA,EAAIipC,EAAWzqC,OAAQwB,IACvC,CACEipC,EAAWjpC,IAAM6qC,EACjB,MAAME,EAAqBzrC,KAAKsC,MAAMtC,KAAKC,MAAM0pC,EAAWjpC,KAC5D,IAAK,IAAIgrC,EAAI,EAAGA,EAAID,EAAoBC,IAEtCF,EAA0B5qC,KAAKkpC,EAAMppC,IAGzC,OAAO8qC,EAGTd,cAAcN,GAEZ,MAAMuB,EAAOvB,EAAKhqC,EAAE7B,QAAQglB,IAAI6mB,EAAK3/B,GAC/BmhC,EAAOxB,EAAKC,EAAE9rC,QAAQglB,IAAI6mB,EAAK3/B,GACrC,OAAOkhC,EAAKtS,MAAMuS,GAAM1sC,SAAW,EAGrCksC,qBAAqBF,EAAIC,EAAIjB,EAAIC,EAAIxV,GAE/BuW,EAAKC,EAAK,IAEZD,EAAK,EAAMA,EACXC,EAAK,EAAMA,GAGb,MAAMU,EAAK,GAAOX,EAAKC,GAEvB,OAAOjB,EAAG3rC,QAAQ4D,eAAe+oC,GAAIhpC,IAAIioC,EAAG5rC,QAAQ4D,eAAegpC,IAAKjpC,IAAIyyB,EAAGp2B,QAAQ4D,eAAe0pC,MCa1G,OAAe,IA5Jf,MAEEnX,SAAS/W,EAAOmuB,GAEdnuB,EAAMC,UAAUC,IAEVA,aAAiBK,IAEfL,EAAMC,WAERD,EAAMC,UAAW,IAAInB,GAAiBovB,aAAaluB,EAAMC,WAE3DguB,EAAgBjuB,OAKtBmuB,eAAeruB,GAEb,MAAMsuB,EAAa,GAMnB,OAJAhyC,KAAKy6B,SAAS/W,GAAQE,IAEpBouB,EAAWrrC,KAAKid,EAAMC,aAEjBmuB,EAGTC,gBAAgBvuB,EAAOI,EAAUpjB,GAE/BgjB,EAAMC,UAAUC,IAEVA,aAAiBK,SAGN7gB,IAAT1C,GAOEkjB,EAAMljB,OAASA,KALnBkjB,EAAME,SAAWA,MAczBouB,oBAAoBC,GAElB,MAAM7tC,EAAQ,CACZ8tC,WAAYD,EAAKC,WACjB1uB,MAAOyuB,EAAKzuB,MAAMpf,OAAM,IAGpB+tC,EAAgB,GAEtBF,EAAKzuB,MAAMC,UAASpU,IAEdA,EAAK+iC,gBAEPD,EAAc9iC,EAAK7O,MAAQ6O,MAI/B,MAAMgjC,EAAa,GACbC,EAAqB,GAE3BluC,EAAMof,MAAMC,UAASpU,IAEfA,EAAKkjC,SAEPF,EAAWhjC,EAAK7O,MAAQ6O,GAGtBA,EAAK+iC,gBAEPE,EAAmBjjC,EAAK7O,MAAQ6O,MAIpC,IAAK,MAAM7O,KAAQ2xC,EACnB,CACE,MACMK,EADcL,EAAc3xC,GACLgyC,SACvBC,EAAmBH,EAAmB9xC,GAEtCkyC,EAAoB,GAE1B,IAAK,IAAInsC,EAAI,EAAGA,EAAIisC,EAASG,MAAM5tC,SAAUwB,EAC7C,CACE,MAAMqsC,EAAYP,EAAWG,EAASG,MAAMpsC,GAAG/F,MAC/CkyC,EAAkBjsC,KAAKmsC,GAGzBH,EAAiB5uC,KACf,IAAIgvC,EAASH,EAAmBF,EAASM,cACzCL,EAAiBM,aAGrB,OAAO3uC,EAGT4uC,kBAAkBxvB,EAAOyvB,EAAMC,GAE7B1vB,EAAMC,UAAUC,IAEVA,aAAiBK,IAEnBL,EAAMyvB,WAAaF,EACnBvvB,EAAM0vB,cAAgBF,MAK5BG,cAAc7vB,EAAOsV,EAAa6Y,GAEhCnuB,EAAMC,UAAU6mB,IAEVA,EAAI9pC,OAASs4B,GAEf6Y,EAAgBrH,MAKtBgJ,WAAW9vB,EAAOsV,GAEhB,IAAIgH,EAQJ,OAPAtc,EAAMC,UAAU6mB,IAEVA,EAAI9pC,OAASs4B,IAEfgH,EAASwK,MAGNxK,EAGTyT,mBAAmB/vB,EAAOgwB,GAExB,IAAI1T,EAQJ,OAPAtc,EAAMC,UAAU6mB,IAEVA,EAAIppC,YAAYV,OAASgzC,IAE3B1T,EAASwK,MAGNxK,IC5JI,MAAM2T,GAEnBtyC,iBAAiBuyC,GAEf,OAAQA,GAAwB,iBAATA,IAAsBC,MAAMC,QAAQF,GAG7DvyC,kBAAkByF,KAAWitC,GAE3B,IAAKA,EAAQ9uC,OAAQ,OAAO6B,EAC5B,MAAMojC,EAAS6J,EAAQn9B,QAEvB,GAAI+8B,GAAgBK,UAAUltC,IAAW6sC,GAAgBK,UAAU9J,GAEjE,IAAK,MAAM7V,KAAO6V,EAEZyJ,GAAgBK,UAAU9J,EAAO7V,KAE9BvtB,EAAOutB,IAAMlrB,OAAOmP,OAAOxR,EAAQ,CAAEutB,CAACA,GAAM,KACjDsf,GAAgBM,WAAWntC,EAAOutB,GAAM6V,EAAO7V,KAI/ClrB,OAAOmP,OAAOxR,EAAQ,CAAEutB,CAACA,GAAM6V,EAAO7V,KAK5C,OAAOsf,GAAgBM,WAAWntC,KAAWitC,GAG/C1yC,mBAAmBmQ,GAGjB,IAAIg5B,EAAM,GAEV,GAAqB,IAAjBh5B,EAAI0iC,UAGN,GAAI1iC,EAAI2iC,WAAWlvC,OAAS,EAC5B,CACEulC,EAAI,eAAiB,GACrB,IAAK,IAAIiH,EAAI,EAAGA,EAAIjgC,EAAI2iC,WAAWlvC,OAAQwsC,IAC3C,CACE,MAAM2C,EAAY5iC,EAAI2iC,WAAWP,KAAKnC,GACtCjH,EAAI,eAAe4J,EAAUC,UAAYD,EAAUE,iBAI/B,IAAjB9iC,EAAI0iC,WAEX1J,EAAMh5B,EAAI8iC,WAIZ,GAAI9iC,EAAI+iC,gBAEN,IAAK,IAAI9tC,EAAI,EAAGA,EAAI+K,EAAIgjC,WAAWvvC,OAAQwB,IAC3C,CACE,MAAMmtC,EAAOpiC,EAAIgjC,WAAWZ,KAAKntC,GAC3B4tC,EAAWT,EAAKS,SACtB,QAA+B,IAAnB7J,EAAI6J,GAEd7J,EAAI6J,GAAYr0C,KAAKy0C,YAAYb,OAGnC,CACE,QAAoC,IAAxBpJ,EAAI6J,GAAc,KAC9B,CACE,MAAMK,EAAMlK,EAAI6J,GAChB7J,EAAI6J,GAAY,GAChB7J,EAAI6J,GAAU1tC,KAAK+tC,GAErBlK,EAAI6J,GAAU1tC,KAAK3G,KAAKy0C,YAAYb,KAI1C,OAAOpJ,GC7EI,MAAMmK,GAEnBvzC,eAGAC,kBAAkBiZ,GAEhB,MAAMs6B,EAAQt6B,EAAOvK,MAAM,KAE3B,IAAK,IAAItJ,EAAI,EAAGA,EAAImuC,EAAM3vC,OAAQwB,IAEhCmuC,EAAMnuC,GAAKmuC,EAAMnuC,GAAG,GAAG+T,cAAgBo6B,EAAMnuC,GAAGouC,OAAO,GAGzD,OAAOD,EAAME,KAAK,KAGpBzzC,+BAA+BiZ,GAE7B,OAAOA,EAAOy6B,OAAO,GAAGv6B,cAAgBF,EAAO06B,MAAM,GAGvD3zC,0BAA0BiZ,GAExB,OAAOA,EAAOG,QACZ,gBACCE,GAAUA,EAAMH,cACdC,QAAQ,IAAK,IACbA,QAAQ,IAAK,OC5BP,MAAMw6B,GAEnB7zC,eAIA8zC,eAAeC,GAEbA,EAAWA,EAASplC,MAAM,KAE1B,IAAIqlC,EAAQ7zC,OAAO4zC,EAAS,IAC5BC,EAAgB,GAARA,EAAa,GAAK,IAE1B,IAAIC,EAAU9zC,OAAO4zC,EAAS,IAC9BE,EAAoB,GAAVA,EAAe,IAEzB,IAAIC,EAAU/zC,OAAO4zC,EAAS,IAG9B,OAFAG,GAAoB,IAEbF,EAAQC,EAAUC,GClBd,MAAMC,GAEnBn0C,cAEEpB,KAAKqqB,OAAS,IAAIhG,EAGpBsmB,WAAWvkC,EAAQwkC,EAAmBC,EAAc5jB,GAElDjnB,KAAKqqB,OAAO1H,cAAcvc,GAE1B,MAAM03B,EAAQ72B,EAAM6jC,SAASD,EAAe,GACtC9M,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAAS7W,GAAW,EAEpD8jB,EAAkB/qC,KAAKgrC,oBAAoBJ,EAAmB9M,GAC9DmN,EAAoBjrC,KAAKkrC,sBAAsBN,EAAmB9M,GAClEqN,EAAoBnrC,KAAKorC,sBAAsBR,EAAmB7M,GAClEsN,EAAqBrrC,KAAKsrC,uBAAuBV,EAAmB7M,GAEpEwN,EAAqB,IAAIhlC,EAAQ,EAAG,GAAI,GAAGm3B,gBAAgBkN,GAE3DY,EAAgBxrC,KAAKqqB,OAAOriB,OAAO1D,QAEnCmnC,EAAqBzrC,KAAK0rC,yBAA8C,EAArB1rC,KAAKqqB,OAAOlK,OAAiC,EAArBngB,KAAKqqB,OAAOlK,OAAY0qB,EAAc5jB,GACjH0kB,EAAUH,EAAclnC,QAAQ2D,IAAIsjC,EAAmBjnC,QAAQ4D,gBAAqC,EAAtBujC,IAE9EG,GAAc,IAAIzO,GAAQoB,8BAA8BwM,EAAiBY,GACzEE,GAAc,IAAI1O,GAAQoB,8BAA8B0M,EAAmBU,GAE3EG,GAAe,IAAI3O,GAAQoB,8BAA8B4M,EAAmBQ,GAC5EI,GAAe,IAAI5O,GAAQoB,8BAA8B8M,EAAoBM,GAEnF3rC,KAAKgsC,+BAA+BL,EAASvlC,EAAQwkC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAE1GH,EAASrN,8BAA8BwM,EAAiBY,GACxDE,EAAWtN,8BAA8B0M,EAAmBU,GAE5DG,EAAWvN,8BAA8B4M,EAAmBQ,GAC5DI,EAAYxN,8BAA8B8M,EAAoBM,GAE9D,IAAIpB,EAAmB3+B,EAAAA,EAEvB,MAAMqgC,EAAcV,EAAmBjnC,QAAQ4D,gBAAqC,EAAtBujC,GAC9D,IAAK,IAAIhlC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMqiB,EAAO,IAAIojB,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIgkC,IAE1DE,EAAwB,IAAI5lC,EAC5B6lC,EAAyB,IAAI7lC,EAE7B8lC,EAA0B,IAAI9lC,EAC9B+lC,EAA0B,IAAI/lC,EAEpCqlC,EAASW,cAAczjB,EAAOqjB,GAC9BN,EAAWU,cAAczjB,EAAMsjB,GAE/BN,EAAWS,cAAczjB,EAAOujB,GAChCN,EAAYQ,cAAczjB,EAAMwjB,GAE5BH,EAAqBlnC,SAAW,MAElCtC,QAAQ6pC,IAAI,4BAA6B/lC,GAEvC2lC,EAAuBnnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,8BAA+B/lC,GAEzC4lC,EAAuBpnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,8BAA+B/lC,GAEzC6lC,EAAwBrnC,SAAW,MAErCtC,QAAQ6pC,IAAI,+BAAgC/lC,GAG9C,MAAMgmC,EAAoBrmC,EAAOK,GAAGnC,QAAQglB,IAAI6iB,GAAsBlnC,SAChEynC,EAAoBtmC,EAAOK,GAAGnC,QAAQglB,IAAI8iB,GAAwBnnC,SAElE0nC,EAAsBvmC,EAAOK,GAAGnC,QAAQglB,IAAI+iB,GAAwBpnC,SACpE2nC,EAAsBxmC,EAAOK,GAAGnC,QAAQglB,IAAIgjB,GAAyBrnC,SAErE4nC,EAAkB9mC,KAAKN,IAAIgnC,EAAiBC,GAC5CI,EAAkB/mC,KAAKN,IAAIknC,EAAmBC,GAE9CnnC,EAAMM,KAAKN,IAAIonC,EAAcC,GAE/BrnC,EAAM8kC,IAERA,EAAmB9kC,GAIvB,MAAMsnC,EAAqBxB,EAAmBjnC,QAAQ4D,eAAeqiC,GAGrE,OAFyBoB,EAAQrnC,QAAQ2D,IAAI8kC,GAK/Cf,+BAA+BgB,EAAY5mC,EAAQwkC,EAAmBgB,EAAUC,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBjtC,KAAKktC,wBAAwB9mC,EAAQylC,EAAYD,EAAUhB,GAC7EuC,EAAoBntC,KAAKw1C,0BAA0BpvC,EAAQ0lC,EAAYC,EAAanB,GAE1FoC,EAAW/kC,IAAIglC,GACfD,EAAW/kC,IAAIklC,GAGjBD,wBAAwB9mC,EAAQylC,EAAYD,EAAUhB,GAEpD,IAAI2C,EAA+B3hC,EAAAA,EAC/B4hC,EAAkC5hC,EAAAA,EAItC,MAAM6hC,EAAS,IAAIlnC,EAAQ,EAAG,EAAG,GAAGm3B,gBAAgBkN,GACpD,IAAK,IAAInkC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMinC,EAAc,IAAIxB,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwlC,EAAOnpC,QAAQ4D,gBAAgB,OAChGylC,EAAc,IAAIzB,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIwlC,EAAOnpC,QAAQ4D,eAAe,OAE/FkkC,EAA0B,IAAI7lC,EAC9B4lC,EAAuB,IAAI5lC,EAEjCslC,EAAWU,cAAcmB,EAAYtB,GACrCR,EAASW,cAAcoB,EAASxB,GAEhC,MAAMyB,EAAcxB,EAAuB/iB,WAAWjjB,EAAOK,IACvDonC,EAAc1B,EAAqB9iB,WAAWjjB,EAAOK,IAEvD0lC,EAAqBlnC,SAAW,MAElCtC,QAAQ6pC,IAAI,qCAAsC/lC,GAEhD2lC,EAAuBnnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,uCAAwC/lC,GAGlDmnC,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAUN,IAEZA,EAA+BM,GAKnC,MAAMC,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAOnpC,QAAQ4D,gBAAgB4lC,GAGxC0H,0BAA0BpvC,EAAQ0lC,EAAYC,EAAanB,GAEzD,IAAIqD,EAAkCriC,EAAAA,EAClCsiC,EAAkCtiC,EAAAA,EAItC,MAAMuiC,EAAY,IAAI5nC,EAAQ,EAAG,EAAG,GAAGm3B,gBAAgBkN,GAEvD,IAAK,IAAInkC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAM2nC,EAAa,IAAIlC,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIkmC,EAAU7pC,QAAQ4D,gBAAgB,OAClGmmC,EAAa,IAAInC,EAAM9lC,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ2D,IAAIkmC,EAAU7pC,QAAQ4D,eAAe,OAEjGmkC,EAA0B,IAAI9lC,EAC9B+lC,EAA0B,IAAI/lC,EAEpCulC,EAAWS,cAAc6B,EAAY/B,GACrCN,EAAYQ,cAAc8B,EAAY/B,GAEtC,MAAMgC,EAAajC,EAAuBhjB,WAAWjjB,EAAOK,IACtD8nC,EAAajC,EAAwBjjB,WAAWjjB,EAAOK,IAEzD4lC,EAAuBpnC,SAAW,MAEpCtC,QAAQ6pC,IAAI,8BAA+B/lC,GAEzC6lC,EAAwBrnC,SAAW,MAErCtC,QAAQ6pC,IAAI,+BAAgC/lC,GAG1C6nC,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAaN,IAEfA,EAAkCM,GAKtC,MAAMT,GAAcG,EAAkCC,GAAkC,EAGxF,OAAOC,EAAU7pC,QAAQ4D,gBAAgB4lC,GAG3C9C,oBAAoBJ,EAAmB9M,GAErC,MAAMiN,EAAkB,IAAIxkC,EAAQ,GAAI,EAAG,GAG3C,OAFAwkC,EAAgBrN,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,GAAIu3B,IACxFiN,EAAgBrN,gBAAgBkN,GACzBG,EAGTG,sBAAsBN,EAAmB9M,GAEvC,MAAMmN,EAAoB,IAAI1kC,EAAQ,EAAG,EAAG,GAG5C,OAFA0kC,EAAkBvN,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,IAAKu3B,IAC3FmN,EAAkBvN,gBAAgBkN,GAC3BK,EAGTG,sBAAsBR,EAAmB7M,GAEvC,MAAMoN,EAAoB,IAAI5kC,EAAQ,EAAG,EAAG,GAG5C,OAFA4kC,EAAkBzN,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,GAAIw3B,IAC1FoN,EAAkBzN,gBAAgBkN,GAC3BO,EAGTG,uBAAuBV,EAAmB7M,GAExC,MAAMsN,EAAqB,IAAI9kC,GAAS,EAAG,EAAG,GAG9C,OAFA8kC,EAAmB3N,iBAAgB,IAAI8Q,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,IAAKw3B,IAC5FsN,EAAmB3N,gBAAgBkN,GAC5BS,EAGTK,yBAAyBtsB,EAAOc,EAAQ2qB,EAAc5jB,GAEpD,MAAM6W,EAAS+M,EAAe,EAAK9kC,KAAK4B,GAAK,IACvCo2B,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAAS7W,GAAW,EAEpDiX,EAAQhe,EAASna,KAAKk4B,IAAIH,GAC1BK,EAAQ/e,EAAQrZ,KAAKk4B,IAAIF,GAC/B,OAAOh4B,KAAKL,IAAIK,KAAKsB,IAAI82B,GAAQp4B,KAAKsB,IAAI62B,KCrP/B,MAAMuX,GAEnBr0C,eAKAupC,WAAWvkC,EAAQwkC,EAAmBC,EAAc5jB,GAElD,MAAMyuB,EAAsB9K,EAAkBtmC,QAAQqxC,UAEhDC,EAAkB,GAExB,IAAK,IAAInvC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCmvC,EAAgBjvC,KAAKP,EAAOK,GAAGnC,QAAQo5B,gBAAgBgY,IAGzD,MAAM3rB,GAAM,IAAIC,GAAOrH,cAAcizB,GAC/B3zC,EAAO,IAAIsE,EACjBwjB,EAAI0D,QAAQxrB,GAEZ,MAAM4J,EAAW7L,KAAK0rC,yBAAyBzpC,EAAKqF,EAAI,EAAGrF,EAAKsF,EAAI,EAAGsjC,EAAc5jB,GAE/Ejf,EAAS,IAAIzB,EAKnB,OAJAwjB,EAAIkV,UAAUj3B,GAEdA,EAAO01B,gBAAgBkN,GAEhB,CACL5iC,OAAQA,EACR6tC,mBAAoBhqC,GAIxB6/B,yBAAyBtsB,EAAOc,EAAQ2qB,EAAc5jB,GAEpD,MAAM6W,EAAS+M,EAAe,EAAK9kC,KAAK4B,GAAK,IACvCo2B,EAAS,EAAIh4B,KAAKi4B,KAAKj4B,KAAKk4B,IAAIH,GAAS7W,GAAW,EAEpDiX,EAAQhe,EAASna,KAAKk4B,IAAIH,GAC1BK,EAAQ/e,EAAQrZ,KAAKk4B,IAAIF,GAC/B,OAAOh4B,KAAKL,IAAIK,KAAKsB,IAAI82B,GAAQp4B,KAAKsB,IAAI62B,KCnC/B,MAAM4X,WAAa7xB,EAEhC7iB,cAEE,MAAM0iB,EAAW,IAAI5H,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAE3X,MAAO,IAAI4X,EAAM,aAE7BL,6OACAE,0WACAmT,WAAY,CAAEomB,aAAa,GAC3BlsB,aAAa,EACb1M,YAAY,IAGR64B,EAAiB,IAAIvsB,EAAoB,IAAK,IAAK,IAAK,KAI9D/a,MAF6BggC,GAAkBuH,gCAAgCD,GAEnDlyB,GAE5B9jB,KAAKk2C,SAAS5uC,GAAI,MCrBP,MAAMub,WAAaoB,EAEhC7iB,YAAYgF,GAEV,MAAMyd,EAAW,IAAInB,EACrBmB,EAASjF,aAAa,WAAsB,IAAImd,EAAgB,IAAIf,aAAa,IAAK,IACtFnX,EAASjF,aAAa,gBAAsB,IAAImd,EAAgB,IAAIf,aAAa,IAAK,IACtFnX,EAASjF,aAAa,oBAAsB,IAAImd,EAAgB,IAAIf,aAAa,IAAK,IACtFnX,EAASjF,aAAa,cAAsB,IAAImd,EAAgB,IAAIf,aAAa,IAAK,IACtFnX,EAASjF,aAAa,WAAsB,IAAImd,EAAgB,IAAIf,aAAa,IAAK,IAiBtFtsB,MAAMmV,EAfW,IAAI3H,EAAe,CAClCG,SAAU,CACR85B,WAAY,CAAEpxC,MAAO,IACrBqxC,QAAS,CAAErxC,MAAO,GAClBsxC,aAAc,CAAEtxC,MAAO,GACvB2X,OAAQ,CAAE3X,MAAO,IAAI4X,EAAM,aAE7BL,+sBACAE,8jBACAqN,aAAa,EACb1M,YAAY,EACZwS,WAAY,CAAEomB,aAAa,MAMzB3vC,GAEFpG,KAAKs2C,MAAMlwC,GAIfkwC,MAAMlwC,GAEJ,MAAM0oC,EAAW,GACXyH,EAAgB,GAChBC,EAAoB,GACpBC,EAAc,GACdC,EAAW,GACjB,IAAIC,EAAqB,EAEzB,IAAK,IAAIlwC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACEqoC,EAASnoC,KAAKP,EAAOK,GAAGa,GACxBwnC,EAASnoC,KAAKP,EAAOK,GAAGc,GACxBunC,EAASnoC,KAAKP,EAAOK,GAAGsB,GACxB0uC,EAAY9vC,KAAK,GAEjBmoC,EAASnoC,KAAKP,EAAOK,GAAGa,GACxBwnC,EAASnoC,KAAKP,EAAOK,GAAGc,GACxBunC,EAASnoC,KAAKP,EAAOK,GAAGsB,GACxB0uC,EAAY9vC,MAAM,GAElB,MAAMiwC,EAAa52C,KAAK62C,oBAAoBzwC,EAAQK,GACpD8vC,EAAc5vC,KAAKiwC,EAAWtvC,GAC9BivC,EAAc5vC,KAAKiwC,EAAWrvC,GAC9BgvC,EAAc5vC,KAAKiwC,EAAW7uC,GAE9BwuC,EAAc5vC,KAAKiwC,EAAWtvC,GAC9BivC,EAAc5vC,KAAKiwC,EAAWrvC,GAC9BgvC,EAAc5vC,KAAKiwC,EAAW7uC,GAE9B,MAAM+uC,EAAiB92C,KAAK+2C,wBAAwB3wC,EAAQK,GAC5D+vC,EAAkB7vC,KAAKmwC,EAAexvC,GACtCkvC,EAAkB7vC,KAAKmwC,EAAevvC,GACtCivC,EAAkB7vC,KAAKmwC,EAAe/uC,GAEtCyuC,EAAkB7vC,KAAKmwC,EAAexvC,GACtCkvC,EAAkB7vC,KAAKmwC,EAAevvC,GACtCivC,EAAkB7vC,KAAKmwC,EAAe/uC,GAEtC2uC,EAAS/vC,KAAKgwC,GACdD,EAAS/vC,KAAKgwC,GAEVlwC,EAAIL,EAAOnB,OAAS,IAEtB0xC,GAAsBvwC,EAAOK,GAAG4iB,WAAWutB,IAG/C,MAAMI,EAAwB,IAAIhc,aAAa8T,GACzCmI,EAAwB,IAAIjc,aAAaub,GACzCW,EAAwB,IAAIlc,aAAawb,GACzCW,EAAwB,IAAInc,aAAayb,GACzCW,EAAwB,IAAIpc,aAAa0b,GAEzC9H,EAAU,GAChB,IAAK,IAAInoC,EAAI,EAAGA,GAAMuwC,EAAW/xC,OAAS,EAAK,GAAK,EAAGwB,IACvD,CACE,MAAM+zB,EAAa,EAAJ/zB,EAAS,EACxBmoC,EAAQjoC,KAAK6zB,GACboU,EAAQjoC,KAAK6zB,EAAQ,GACrBoU,EAAQjoC,KAAK6zB,EAAQ,GAErBoU,EAAQjoC,KAAK6zB,GACboU,EAAQjoC,KAAK6zB,EAAQ,GACrBoU,EAAQjoC,KAAK6zB,EAAQ,GAGvBx6B,KAAK6jB,SAASwzB,SAASzI,GACvB5uC,KAAK6jB,SAASnU,aAAa,YAAYoY,KAAK,IAAIiU,EAAgBib,EAAY,IAC5Eh3C,KAAK6jB,SAASnU,aAAa,iBAAiBoY,KAAK,IAAIiU,EAAgBkb,EAAkB,IACvFj3C,KAAK6jB,SAASnU,aAAa,qBAAqBoY,KAAK,IAAIiU,EAAgBmb,EAAsB,IAC/Fl3C,KAAK6jB,SAASnU,aAAa,eAAeoY,KAAK,IAAIiU,EAAgBob,EAAiB,IACpFn3C,KAAK6jB,SAASnU,aAAa,YAAYoY,KAAK,IAAIiU,EAAgBqb,EAAc,IAE9Ep3C,KAAK6jB,SAASnU,aAAa,YAAYsQ,aAAc,EACrDhgB,KAAK6jB,SAASnU,aAAa,iBAAiBsQ,aAAc,EAC1DhgB,KAAK6jB,SAASnU,aAAa,qBAAqBsQ,aAAc,EAC9DhgB,KAAK6jB,SAASnU,aAAa,eAAesQ,aAAc,EACxDhgB,KAAK6jB,SAASnU,aAAa,YAAYsQ,aAAc,EAErDhgB,KAAK8jB,SAASzH,SAAS+5B,QAAQrxC,MAAQ4xC,EACvC32C,KAAKs3C,QAAUX,EAGbY,cAAUxyC,GAEZ/E,KAAK8jB,SAASzH,SAAS85B,WAAWpxC,MAAQA,EAGxCwyC,gBAEF,OAAOv3C,KAAK8jB,SAASzH,SAAS85B,WAAWpxC,MAG3CgyC,wBAAwB3wC,EAAQK,GAE9B,OAAU,IAANA,EAEKL,EAAO,GAAG9B,QAAQglB,IAAIljB,EAAO,IAAI8B,gBAAgB,GAAGD,IAAI7B,EAAO,IAI/DA,EAAOK,EAAI,GAItBowC,oBAAoBzwC,EAAQK,GAE1B,OAAIA,IAAML,EAAOnB,OAAS,EAEjBmB,EAAOA,EAAOnB,OAAS,GAAGX,QAAQglB,IAAIljB,EAAOA,EAAOnB,OAAS,IAAIiD,gBAAgB,GAAGD,IAAI7B,EAAOA,EAAOnB,OAAS,IAI/GmB,EAAOK,EAAI,GAItBmD,UAIAiC,WAEE,OAAO7L,KAAK22C,mBAGda,eAEE,OAAOx3C,KAAK22C,mBAGd36B,UAEEhc,KAAK6jB,SAAS7H,UACdhc,KAAK8jB,SAAS9H,UACVhc,KAAKy3C,QAEPz3C,KAAKy3C,OAAOz8B,OAAOhb,MAInBwiB,UAAMpa,GAERpI,KAAK8jB,SAASzH,SAASK,OAAO3X,MAAMwe,IAAInb,GAGtCoa,YAEF,OAAOxiB,KAAK8jB,SAASzH,SAASK,OAAO3X,MAGvC2yC,WAAWtvC,GAETpI,KAAK8jB,SAASzH,SAASK,OAAO3X,MAAM+iB,KAAK1f,IC1L9B,MAAMuvC,WAAmB1zB,EAEtC7iB,YAAYksB,EAASsqB,GAEnBA,EAAQA,GAAS,IAAIrhC,EAAQ,EAAG,GAChC,MAAMuN,EAAW,IAAI5H,EAAe,CAClCG,SAAU,CACRW,SAAU,CAAEjY,MAAOuoB,GACnBuqB,eAAgB,CAAE9yC,MAAO,GACzB+yC,OAAQ,CAAE/yC,MAAO,GACjBgzC,SAAU,CAAEhzC,MAAO,IAErBuX,igBACAE,mLACAqN,aAAa,EACb1M,YAAY,EACZwD,KAAMq3B,IAEFn0B,EAAW,IAAIo0B,EAAc,EAAG,EAAG,GACzCp0B,EAASe,WAAWgzB,EAAMtwC,EAAI,GAAIswC,EAAMrwC,EAAI,EAAG,GAC/C,MAAM2wC,EAAgB5qB,EAAQnY,MAAMiK,MAAQkO,EAAQnY,MAAM+K,OAC1D2D,EAASzB,MAAM81B,EAAe,EAAG,GACjCxpC,MAAMmV,EAAUC,GAChB9jB,KAAKk4C,cAAgBA,EACrBl4C,KAAK6jB,SAASs0B,qBAEdn4C,KAAKo4C,YAAc,IAAI7xC,EACvBvG,KAAK6jB,SAASw0B,YAAY5qB,QAAQztB,KAAKo4C,aAGzCE,iBAEEt4C,KAAK8jB,SAASzH,SAASW,SAASjY,MAAMib,aAAc,EACpD,MAAMu4B,EAAMv4C,KAAK8jB,SAASzH,SAASW,SAASjY,MAAMoQ,MAElDnV,KAAK6jB,SAASzB,MAAM,EAAIpiB,KAAKk4C,cAAe,EAAG,GAC/Cl4C,KAAKk4C,cAAgBK,EAAIn5B,MAAQm5B,EAAIr4B,OACrClgB,KAAK6jB,SAASzB,MAAMpiB,KAAKk4C,cAAe,EAAG,GAC3Cl4C,KAAK6jB,SAASs0B,qBACdn4C,KAAK6jB,SAASw0B,YAAY5qB,QAAQztB,KAAKo4C,aAGrCn2C,WAEF,OAAOjC,KAAKo4C,YAAY9zC,QAAQ4D,eAAelI,KAAKoiB,MAAM9a,GAGxDrF,SAAK8C,GAEP/E,KAAKoiB,MAAMmB,IAAIxe,EAAOA,EAAOA,GAC7B/E,KAAK8jB,SAASzH,SAASy7B,OAAO/yC,MAAQA,EAGpCyzC,mBAAeC,GAEjBz4C,KAAK8jB,SAASzH,SAASw7B,eAAe9yC,OAAoB,IAAZ0zC,EAAmB,EAAI,EAGnED,qBAEF,OAAuD,IAAhDx4C,KAAK8jB,SAASzH,SAASw7B,eAAe9yC,MAG3CuW,YAAQA,GAEVtb,KAAK8jB,SAASzH,SAAS07B,SAAShzC,MAAQuW,EAGtCA,cAEF,OAAOtb,KAAK8jB,SAASzH,SAAS07B,SAAShzC,MAGzCiX,UAEEhc,KAAK6jB,SAAS7H,UACdhc,KAAKy3C,OAAOz8B,OAAOhb,MACnBA,KAAK8jB,SAASzH,SAASW,SAASjY,MAAMiX,UACtChc,KAAK8jB,SAAS9H,WClFH,MAAM08B,WAAef,GAElCv2C,YAAY4d,EAAMC,EAAMuD,EAAOo1B,EAAOe,GAEpC,MAAMC,EAAqB,IAAIvP,GAAiBsP,GAE1CE,EAAgB,CACpB55B,KAAMA,EACNM,WAAYiD,GAAS,WAEjB9C,EAAiBk5B,EAAmBn5B,gBAAgBT,EAAM65B,GAEhEn5B,EAAeinB,UAAYmS,EAC3Bp5B,EAAeinB,UAAYC,EAC3BlnB,EAAeM,aAAc,EAC7BtR,MAAMgR,EAAgBk4B,GAEtB53C,KAAK44C,mBAAqBA,EAC1B54C,KAAK0f,eAAiBA,EACtB1f,KAAK64C,cAAgBA,EAGnB75B,SAAKja,GAEP/E,KAAK44C,mBAAmBv5B,YAAYta,EAAO/E,KAAK64C,eAChD74C,KAAKs4C,iBAGHt5B,WAEF,MAAO,mBC3BI,MAAM+5B,WAA0B98B,GAE7C7a,YAAY43C,EAAY,GAEtBtqC,w1BAAkB,CAChBsO,SAAU,CAAEjY,WAAO3B,GACnBojB,YAAa,CAAEzhB,MAAO,IAAIwR,EAAQoV,GAAQvM,MAAOuM,GAAQzL,SACzDuG,aAAc,CAAE1hB,MAAO,IAAIwR,GAC3B0iC,aAAc,CAAEl0C,MAAO,IAAIwR,EAAQ,EAAG,IACtC2iC,KAAM,CAAEn0C,MAAO,IAAIwB,GACnB4yC,YAAa,CAAEp0C,MAAO,IAAIwR,GAC1B6iC,aAAc,CAAEr0C,MAAO,KAEzB/E,KAAK6pB,aAAc,EACnB7pB,KAAKmd,YAAa,EAClBnd,KAAKsd,WAAY,GCtBN,MAAM+7B,GAEnBj4C,cAEEpB,KAAKy9B,QAAU,IAAIlnB,EAGrB+iC,YAAY/zB,GAEV,OAAOvlB,KAAKy9B,QAAQla,IAAIgC,EAASje,EAAGie,EAAShe,ICNlC,MAAMgyC,GAEnBn4C,cAEEpB,KAAKw5C,SAAW,IAAIjzC,EACpBvG,KAAKy5C,SAAW,IAAIljC,EAGtB+iC,YAAY/zB,GAKV,OAHAvlB,KAAKw5C,SAAS1xB,KAAKvC,GACnBvlB,KAAKw5C,SAAStZ,QAAQzT,GAAc9gB,SAE7B3L,KAAKy5C,SAASl2B,IAAIvjB,KAAKw5C,SAASlyC,EAAGtH,KAAKw5C,SAASjyC,IClB7C,MAAMmyC,GAEnBt4C,eAKAwI,OAAO+vC,EAAYC,IAKnBziC,SAASwiC,IAGThiC,QAAQgiC,KCbK,MAAME,WAAeH,GAElCt4C,cAEEsN,QAGF9E,OAAO+vC,EAAYC,GAEbD,EAAWG,cAAcF,IAE3BD,EAAWthC,UAAUshC,EAAWI,kBCXvB,MAAMC,WAAqBN,GAExCt4C,cAEEsN,QAGFyI,SAASwiC,GAEPA,EAAWM,iBAGbrwC,OAAO+vC,EAAYC,GAEbD,EAAWG,cAAcF,GAE3BD,EAAWthC,UAAUshC,EAAWO,iBAIhCP,EAAWthC,UAAUshC,EAAWQ,iBCpBvB,MAAMC,WAAoBV,GAEvCt4C,cAEEsN,QAGFyI,SAASwiC,GAEPA,EAAWU,gBACXV,EAAWthC,UAAUshC,EAAWW,iBCVrB,MAAMC,WAAqBb,GAExCt4C,cAEEsN,QAGFyI,SAASwiC,GAEP35C,KAAKw6C,mBAAmBb,GAG1B/vC,OAAO+vC,EAAYC,GAEbD,EAAWG,cAAcF,GAE3B55C,KAAKw6C,mBAAmBb,GAIxBA,EAAWthC,UAAUshC,EAAWQ,gBAIpCK,mBAAmBb,GAEjBA,EAAWc,kBCRA,MAAMC,WAAkBz2B,EAErC7iB,YAAY+a,EAAMC,GAEhB1N,MAAM,IAAIupC,EAAc,EAAG,GAAI,IAAIc,IAEnC/4C,KAAK26C,cAAe,EAEpB36C,KAAK46C,kBAAoB,IAAIrB,GAC7Bv5C,KAAK+X,cAAgB,IAAI8hC,GAEzB75C,KAAK66C,UAAY,IAAIt0C,EAErBvG,KAAKs6C,eAAiB,IAAIT,GAC1B75C,KAAK+5C,gBAAkB,IAAIC,GAC3Bh6C,KAAKm6C,eAAiB,IAAIC,GAC1Bp6C,KAAKk6C,gBAAkB,IAAIK,GAE3Bv6C,KAAKmX,cAAW/T,EAChBpD,KAAK2X,aAAUvU,EACfpD,KAAK86C,cAAW13C,EAEhBpD,KAAK+6C,cAAgB,IAAIxkC,EACzBvW,KAAKg7C,oBAAsB,IAAIzkC,EAC/BvW,KAAKi7C,eAAiB,IAAI1kC,EAE1BvW,KAAKk7C,aAAe,IAAI3kC,EAAQ,EAAG,GAEnCvW,KAAK+oB,eAAgB,EACrB/oB,KAAKm7C,kBAAmB,EACxBn7C,KAAK8iB,YAAc,EAEnB9iB,KAAKiC,KAAO,EACZjC,KAAKo7C,aAAe,IAAI7kC,EAG1B8kC,iBAAiBt2C,GAEf/E,KAAK8iB,YAAc/d,EAGjBu2C,kBAEF,OAAOt7C,KAAK8jB,SAASzH,SAAS88B,YAAYp0C,MAG5Cw2C,iBAAiBhwB,GAEfvrB,KAAKo7C,aAAatzB,KAAKyD,GACvBvrB,KAAK8jB,SAASzH,SAAS48B,aAAal0C,MAAM+iB,KAAKyD,GAGjDlT,UAAUmY,GAERxwB,KAAK+X,cAAcJ,QAAQ3X,MAC3BA,KAAK+X,cAAgByY,EACrBxwB,KAAK+X,cAAcZ,SAASnX,MAG1BulB,eAEF,OAAOvlB,KAAK66C,UAGVW,cAAU/C,GAEZz4C,KAAK8jB,SAASxG,UAAYm7B,EAGxB+C,gBAEF,OAAOx7C,KAAK8jB,SAASxG,UAGnBm+B,iBAAa12C,GAEf/E,KAAK8jB,SAASzH,SAAS+8B,aAAar0C,MAAQA,EAG1C02C,mBAEF,OAAOz7C,KAAK8jB,SAASzH,SAAS+8B,aAAar0C,MAG7C22C,cAEE17C,KAAK27C,SAAU,EAGjB9e,oCAEE78B,KAAK46C,kBAAoB,IAAIrB,GAG/B5c,qCAEE38B,KAAK46C,kBAAoB,IAAIvB,GAG/B1yB,YAAY2G,GAEVA,EAAQqZ,UAAY7mB,EACpBwN,EAAQuZ,UAAY/mB,EACpBwN,EAAQtN,aAAc,EAEtBhgB,KAAKk7C,aAAa33B,IAAI+J,EAAQnY,MAAMiK,MAAOkO,EAAQnY,MAAM+K,QAEzDlgB,KAAK8jB,SAASzH,SAASW,SAASjY,MAAQuoB,EACxCttB,KAAK47C,SAAS57C,KAAK8jB,SAASzH,SAASoK,aAAa1hB,OAClD/E,KAAK27C,SAAU,EAGjB5e,aAAa8e,GAEX77C,KAAK8jB,SAASzH,SAASmK,YAAYzhB,MAAMwe,IAAIoI,GAAQvM,MAAOuM,GAAQzL,QACpElgB,KAAK47C,SAAS57C,KAAK8jB,SAASzH,SAASoK,aAAa1hB,OAElD/E,KAAKg7C,oBAAoBlzB,KAAK9nB,KAAK46C,kBAAkBtB,YAAYt5C,KAAKulB,WACtEvlB,KAAK8jB,SAASzH,SAAS68B,KAAKn0C,MAAM+iB,KAAK9nB,KAAKulB,UAC5CvlB,KAAK+X,cAAcnO,OAAO5J,KAAM67C,GAGlC/B,cAAc+B,GAEZ77C,KAAKi7C,eAAenzB,KAAK9nB,KAAKg7C,qBAC9Bh7C,KAAK87C,mBAAmB97C,KAAKi7C,gBAC7Bj7C,KAAKi7C,eAAe3zC,GAAKtH,KAAKo7C,aAAa9zC,EAC3CtH,KAAKi7C,eAAe1zC,GAAKvH,KAAKo7C,aAAa7zC,EAE3C,MAAMw0C,GAAO,IAAIC,GAAO/xB,qBAAqBjqB,KAAKi7C,eAAgBj7C,KAAK47C,YAKvE,OAHA57C,KAAK+6C,cAAcjzB,KAAK+zB,GACxB77C,KAAK87C,mBAAmB97C,KAAK+6C,eAEtBgB,EAAKE,cAAcj8C,KAAK+6C,eAGjCe,mBAAmBI,GAEjBA,EAAc50C,GAAuB,GAAlB40C,EAAc50C,EAAU,IAAOqkB,GAAQvM,MAASpf,KAAKo7C,aAAa9zC,EACrF40C,EAAc30C,GAAuB,GAAlB20C,EAAc30C,EAAU,IAAOokB,GAAQzL,OAASlgB,KAAKo7C,aAAa7zC,EAGvF40C,4BAEE,MAAMlzB,EAAMjpB,KAAKg7C,oBAAoB12C,QAErC,OADAtE,KAAK87C,mBAAmB7yB,GACjBA,EAGTmzB,0BAA0BC,GAExBr8C,KAAKulB,SAASje,EAAK+0C,EAAW/0C,EAAIqkB,GAAQvM,MAAS,EAAI,EACvDpf,KAAKulB,SAAShe,EAAK80C,EAAW90C,EAAIokB,GAAQzL,OAAU,EAAI,EAG1DlE,UAEMhc,KAAK8jB,SAASzH,SAASW,SAASjY,OAElC/E,KAAK8jB,SAASzH,SAASW,SAASjY,MAAMiX,UAGxChc,KAAK6jB,SAAS7H,UACdhc,KAAK8jB,SAAS9H,UAGhB4/B,SAAS51B,GAEP,OAAIA,EAEKA,EAAQ8B,KAAK9nB,KAAKk7C,cAAchzC,eAAelI,KAAKiC,KAAO0pB,GAAQzK,MAInE,IAAI3K,GAAUuR,KAAK9nB,KAAKk7C,cAAchzC,eAAelI,KAAKiC,KAAO0pB,GAAQzK,KAIpF+4B,kBAGAI,iBAGAI,mBC3Ma,MAAM6B,WAA8Br4B,EAEjD7iB,YAAYyiB,EAAUC,GAEpBpV,MAAMmV,EAAUC,GAEhB,MAAMy4B,EAAOv8C,KAEbA,KAAKw8C,eAAiB,KAEpBD,EAAKz4B,SAASla,WCVL,MAAM6yC,GAEnBr7C,YAAYmqB,EAAQmxB,EAAcC,GAEhC,MAAMv9B,EAAUs9B,EAAavd,MAAQud,EAAarc,KAC5CngB,EAAUw8B,EAAapc,IAAQoc,EAAanc,OAElDvgC,KAAKoiB,MAAW,IAAI7L,EAAQ6I,EAAOc,GACnClgB,KAAKulB,SAAW,IAAIhP,EAAQgV,EAASmxB,EAAarc,KAAMqc,EAAanc,QAErEvgC,KAAK28C,aAAe,IAAIjzB,EAAQizB,EAAatc,KAAMsc,EAAaxd,MAAOwd,EAAarc,IAAKqc,EAAapc,SCT3F,MAAMqc,GAEnBx7C,YAAYy7C,EAAc79B,EAAO,IAE/Bhf,KAAK68C,aAAeA,EAEpB78C,KAAK88C,OAAS,GAEd98C,KAAK+8C,gBAAkB,EACvB/8C,KAAKg9C,iBAAkB,EACvBh9C,KAAKi9C,gBAAkB,EAEvBj9C,KAAKulB,SAAW,IAAIhf,EACpBvG,KAAKolB,WAAa,IAAIopB,EACtBxuC,KAAKoiB,MAAQ,IAAI7b,EAAQ,EAAG,EAAG,GAC/BvG,KAAKk9C,OAAS,IAAIhgB,EAElBl9B,KAAKwiB,MAAQ,IAAI7F,EAAM,WAEvB3c,KAAKs7C,YAAc,IAAI/kC,EACvBvW,KAAKm9C,UAAY,EAEjBn9C,KAAKo9C,OAAWp+B,EAEhBhf,KAAKq9C,kBAAkBr+B,GAGrBA,SAAKja,GAEP/E,KAAKo9C,OAASr4C,EACd/E,KAAKq9C,kBAAkBt4C,GACvB/E,KAAKg9C,iBAAkB,EAGrBh+B,WAEF,OAAOhf,KAAKo9C,OAGdE,gBAEEt9C,KAAKk9C,OAAOK,QAAQv9C,KAAKulB,SAAUvlB,KAAKolB,WAAYplB,KAAKoiB,OACzDpiB,KAAKg9C,iBAAkB,EACvBh9C,KAAK+8C,gBAAiB,EAGxBS,oBAEEx9C,KAAK+8C,gBAAiB,EAGxBU,oBAEEz9C,KAAKi9C,gBAAiB,EAGxBS,aAAajH,EAAc,EAAGkH,EAAO,GAEnC,MAAMC,GAAkB,IAAIpP,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,GAAKkwC,EAAc,IAAO1wC,KAAK4B,GAAK,GAC1Gk2C,GAAW,IAAIrP,GAAaC,iBAAiB,IAAIloC,EAAQ,EAAG,EAAG,IAAMo3C,EAAO,IAAO53C,KAAK4B,GAAK,GAEnG3H,KAAKolB,WAAW0C,KAAK81B,EAAgBE,SAASD,IAC9C79C,KAAKg9C,iBAAkB,EAGzBt2B,aAAauC,GAEXjpB,KAAKulB,SAASuC,KAAKmB,GACnBjpB,KAAKg9C,iBAAkB,EAGzBpX,SAAS3jC,GAEPjC,KAAKoiB,MAAMmB,IAAIthB,EAAMA,EAAMA,GAC3BjC,KAAKg9C,iBAAkB,EAGzBe,UAAU31C,GAERpI,KAAKwiB,MAAMe,IAAInb,GACfpI,KAAKi9C,gBAAiB,EAGxBe,UAAUpG,GAER53C,KAAKs7C,YAAYxzB,KAAK8vB,GACtB53C,KAAKi+C,gBAGH3iC,YAAQ4iC,GAEVl+C,KAAKm9C,UAAYe,EACjBl+C,KAAKi9C,gBAAiB,EAGpB3hC,cAEF,OAAOtb,KAAKm9C,UAGdc,gBAEEj+C,KAAKq9C,kBAAkBr9C,KAAKgf,MAG9Bq+B,kBAAkBr+B,GAEhB,IAAIm/B,EAAS,EAEbn+C,KAAK88C,OAAO73C,OAAS,EAErB,IAAK,IAAIwB,EAAI,EAAGA,EAAIuY,EAAK/Z,OAAQwB,IACjC,CACE,MAAM23C,EAAUp/B,EAAKq/B,WAAW53C,GAC1B63C,EAAQt+C,KAAK68C,aAAa3rC,MAAKC,GAAWA,EAAQitC,UAAYA,IACpE,GAAIE,EACJ,CACE,GAAIA,EAAMC,YACV,CACE,MAAMC,EAAa,IAAI/B,GAAU0B,EAAQG,EAAMC,YAAaD,EAAMG,aAClEz+C,KAAK88C,OAAOn2C,KAAK63C,GAEnBL,GAAUG,EAAMI,SAIpB,MAAMC,EAAO,IAAI3C,EACX4C,EAAc5+C,KAAK88C,OAAO,GAChC6B,EAAK10B,qBAAqB20B,EAAYr5B,SAASjhB,QAAQ2D,IAAI,IAAIsO,EAAQqoC,EAAYx8B,MAAM9a,EAAI,EAAGs3C,EAAYx8B,MAAM7a,EAAI,IAAKq3C,EAAYx8B,OAEvI,IAAK,IAAI3b,EAAI,EAAGA,EAAIzG,KAAK88C,OAAO73C,OAAQwB,IACxC,CACE,MAAMP,EAAIlG,KAAK88C,OAAOr2C,GAChBsjB,GAAM,IAAIiyB,GAAO/xB,qBAAqB/jB,EAAEqf,SAASjhB,QAAQ2D,IAAI,IAAIsO,EAAQrQ,EAAEkc,MAAM9a,EAAI,EAAGpB,EAAEkc,MAAM7a,EAAI,IAAKrB,EAAEkc,OACjHu8B,EAAKE,MAAM90B,GAGb,MAAM+0B,EAAY,IAAIvoC,EACtBooC,EAAKlxB,QAAQqxB,GACb,IAAK,IAAIr4C,EAAI,EAAGA,EAAIzG,KAAK88C,OAAO73C,OAAQwB,IAEtCzG,KAAK88C,OAAOr2C,GAAG8e,SAASje,GAAKw3C,EAAUx3C,EAAI,EAC3CtH,KAAK88C,OAAOr2C,GAAG8e,SAAShe,GAAKu3C,EAAUv3C,EAAI,EAE3CvH,KAAK88C,OAAOr2C,GAAG8e,SAASje,GAAMw3C,EAAUx3C,EAAI,EAAKtH,KAAKs7C,YAAYh0C,EAClEtH,KAAK88C,OAAOr2C,GAAG8e,SAAShe,GAAMu3C,EAAUv3C,EAAI,EAAKvH,KAAKs7C,YAAY/zC,EAGpEvH,KAAK+8C,gBAAiB,GCjJX,MAAMgC,WAAwB9iC,GAE3C7a,YAAYksB,GAEV5e,i6CAAkB,CAChBswC,SAAU,CAAEj6C,MAAOuoB,GACnB2xB,UAAW,CAAEl6C,MAAO,IACpBm6C,WAAY,CAAEn6C,MAAO,IAAIwR,EAAQ,EAAG,MAGtCvW,KAAK6pB,aAAc,EACnB7pB,KAAK2vB,WAAa,CAChBomB,aAAa,GAEf/1C,KAAKmd,YAAa,EAClBnd,KAAK2gB,KAAOq3B,EACZ1qB,EAAQqZ,UAAYC,EACpBtZ,EAAQuZ,UAAYD,EACpBtZ,EAAQvN,iBAAkB,EAG5Bo/B,eAAel9C,GAEbjC,KAAKqc,SAAS6iC,WAAWn6C,MAAM+iB,KAAK7lB,GAGtCm9C,aAAar6C,GAEX/E,KAAKqc,SAAS4iC,UAAUl6C,MAAQkC,EAAMC,KAAK,GAAK,GAAKnC,ICpB1C,MAAMs6C,WAAqBp7B,EAExC7iB,YAAYk+C,EAAaC,GAEvB,MAEMC,EAAqB,IAAIC,EAC/BD,EAAmBE,cAAgB,EAEnC,MAAM77B,EAAW,IAAI4F,EAAoB,EAAG,GAC5C5F,EAASe,UAAU,GAAK,GAAK,GAC7B46B,EAAmB5gC,aAAa,WAAa,IAAI+gC,EAAuB97B,EAASnU,aAAa,YAAY06B,MAAO,IACjHoV,EAAmB5gC,aAAa,KAAa,IAAI+gC,EAAuB97B,EAASnU,aAAa,MAAM06B,MAAO,IAC3GoV,EAAmBhlB,MAAQ3W,EAAS2W,MAEpC,MAAMolB,EAAiB,IAAIC,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GACxFC,EAAiB,IAAIF,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GACxFE,EAAiB,IAAIH,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GACxFG,EAAiB,IAAIJ,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GAExFI,EAAe,IAAIL,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GACtFpD,EAAe,IAAImD,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GAEtFt9B,EAAQ,IAAIq9B,EAAyB,IAAI7kB,aAAa8kB,KAAsB,GAAG,GAErFF,EAAeO,MAASC,GACxBL,EAAeI,MAASC,GACxBJ,EAAeG,MAASC,GACxBH,EAAeE,MAASC,GACxBF,EAAaC,MAAWC,GACxB1D,EAAayD,MAAWC,GACxB59B,EAAM29B,MAAkBC,GAExBZ,EAAmB5gC,aAAa,iBAAkBghC,GAClDJ,EAAmB5gC,aAAa,iBAAkBmhC,GAClDP,EAAmB5gC,aAAa,iBAAkBohC,GAClDR,EAAmB5gC,aAAa,iBAAkBqhC,GAElDT,EAAmB5gC,aAAa,eAAgBshC,GAChDV,EAAmB5gC,aAAa,eAAgB89B,GAChD8C,EAAmB5gC,aAAa,QAAgB4D,GAEhD9T,MAAM8wC,EAAoB,IAAIT,GAAgBQ,IAE9Cv/C,KAAKqgD,cAAgB,GACrBrgD,KAAKs/C,YAAcA,EAEnBt/C,KAAK8jB,SAASq7B,eAAe,IAAI5oC,EAAQ+oC,EAAYgB,MAAMlhC,MAAOkgC,EAAYgB,MAAMpgC,SAEpFlgB,KAAK+oB,eAAgB,EAGvBq2B,aAAar6C,GAEX/E,KAAK8jB,SAASs7B,aAAar6C,GAG7Bw7C,SAASC,GAEP,MAAMhkB,EAAO,IAAIogB,GAAQ58C,KAAKs/C,YAAYxC,OAAQ0D,GAElD,OADAxgD,KAAKqgD,cAAc15C,KAAK61B,GACjBA,EAGTikB,YAAYC,GAEVzW,GAAe0W,YAAY3gD,KAAKqgD,cAAeK,GAC/C1gD,KAAK4J,QAAO,GAGdA,OAAOg3C,GAEL,MAAMC,EAAmB7gD,KAAK6jB,SAASnU,aAAa,gBAC9CoxC,EAAmB9gD,KAAK6jB,SAASnU,aAAa,gBAE9CkwC,EAAiB5/C,KAAK6jB,SAASnU,aAAa,kBAC5CqwC,EAAiB//C,KAAK6jB,SAASnU,aAAa,kBAC5CswC,EAAiBhgD,KAAK6jB,SAASnU,aAAa,kBAC5CuwC,EAAiBjgD,KAAK6jB,SAASnU,aAAa,kBAE5CqxC,EAAY/gD,KAAK6jB,SAASnU,aAAa,SAE7C,IAAIsxC,GAAuC,IAAjBJ,EACtBK,GAAuC,IAAjBL,EACtBM,GAAuC,IAAjBN,EAEtBO,EAAc,EAClB,IAAK,IAAI16C,EAAI,EAAGA,EAAIzG,KAAKqgD,cAAcp7C,OAAQwB,IAC/C,CACE,MAAMuY,EAAOhf,KAAKqgD,cAAc55C,GAE5BuY,EAAKg+B,kBAEPgE,GAAsB,EACtBhiC,EAAKs+B,iBAGHt+B,EAAK+9B,iBAEPkE,GAAqB,EACrBjiC,EAAKw+B,qBAGHx+B,EAAKi+B,iBAEPiE,GAAqB,EACrBliC,EAAKy+B,qBAGP,MAAMP,EAASl+B,EAAKk+B,OACd16B,EAAQxD,EAAKwD,MACblH,EAAU0D,EAAK1D,QAErB,IAAK,IAAI8lC,EAAU,EAAGA,EAAUpiC,EAAK89B,OAAO73C,OAAQm8C,IACpD,CACE,MAAM9C,EAAQt/B,EAAK89B,OAAOsE,GAEpBC,EAAWF,EAEjBN,EAAiBS,QAAQD,EAAU/C,EAAM3B,aAAar1C,EAAGg3C,EAAM3B,aAAap1C,EAAG+2C,EAAM3B,aAAa50C,EAAGu2C,EAAM3B,aAAa70C,GACxHg5C,EAAiBQ,QAAQD,EAAU/C,EAAM/4B,SAASje,EAAGg3C,EAAM/4B,SAAShe,EAAG+2C,EAAMl8B,MAAM9a,EAAGg3C,EAAMl8B,MAAM7a,GAElGq4C,EAAe0B,QAAQD,EAAUnE,EAAOl2C,SAAS,GAC/Ck2C,EAAOl2C,SAAS,GAChBk2C,EAAOl2C,SAAS,GAChBk2C,EAAOl2C,SAAS,IAElB+4C,EAAeuB,QAAQD,EAAUnE,EAAOl2C,SAAS,GAC/Ck2C,EAAOl2C,SAAS,GAChBk2C,EAAOl2C,SAAS,GAChBk2C,EAAOl2C,SAAS,IAElBg5C,EAAesB,QAAQD,EAAUnE,EAAOl2C,SAAS,GAC/Ck2C,EAAOl2C,SAAS,GAChBk2C,EAAOl2C,SAAS,IAChBk2C,EAAOl2C,SAAS,KAElBi5C,EAAeqB,QAAQD,EAAUnE,EAAOl2C,SAAS,IAC/Ck2C,EAAOl2C,SAAS,IAChBk2C,EAAOl2C,SAAS,IAChBk2C,EAAOl2C,SAAS,KAElB+5C,EAAUO,QAAQD,EAAU7+B,EAAM1c,EAAG0c,EAAMtc,EAAGsc,EAAMrc,EAAGmV,GAEvD6lC,KAIJnhD,KAAK6jB,SAAS67B,cAAgByB,EAE1BA,EAAcnhD,KAAK8/C,iBAErBn9C,QAAQM,MAAM,iEAAkEjD,KAAK8/C,gBAAiBqB,EAAanhD,MAGjHghD,IAEFpB,EAAe5/B,aAAc,EAC7B+/B,EAAe//B,aAAc,EAC7BggC,EAAehgC,aAAc,EAC7BigC,EAAejgC,aAAc,GAE3BihC,IAEFJ,EAAiB7gC,aAAc,EAC/B8gC,EAAiB9gC,aAAc,GAE7BkhC,IAEFH,EAAU/gC,aAAc,GAI5BhE,UAEEhc,KAAK6jB,SAAS7H,UACdhc,KAAK8jB,SAAS9H,WC5LH,MAAMulC,WAA2BhzC,GAE9CnN,YAAYsJ,EAAgB9D,EAAO,EAAGC,EAAK,EAAGqE,EAAkB,UAE9DwD,MAAMxD,GAENlL,KAAK0K,eAAiBA,EACtB1K,KAAK4G,KAAOA,EACZ5G,KAAK6G,GAAKA,EAGZ+C,OAAOnB,EAAS1B,GAEd,MAAMy6C,EAAMxhD,KAAK4G,KAAKtC,QACtBk9C,EAAIt6C,KAAKlH,KAAK6G,GAAI7G,KAAKkL,gBAAgBnE,IACvC0B,EAAQzI,KAAK0K,gBAAgBod,KAAK05B,ICZvB,MAAMC,WAA6B7kC,GAEhDxb,cAEEsN,whEAAYtL,EAAW,CACrBs+C,WAAW,IAGb1hD,KAAKqc,SAASslC,WAAa,CAAE58C,WAAO3B,GACpCpD,KAAKqc,SAASulC,eAAiB,CAAE78C,MAAO,IAAIwR,EAAQ,EAAG,IAGzDoQ,YAAYC,GAEV5mB,KAAKqc,SAASslC,WAAW58C,MAAQ6hB,EAEjC,MAAM3kB,EAAOjC,KAAK47C,SAASh1B,GAC3B5mB,KAAKqc,SAASulC,eAAe78C,MAAM+iB,KAAK7lB,GAG1C25C,SAASh1B,GAEP,OAAIA,EAAIi7B,eAEC,IAAItrC,EAAQxQ,KAAKL,IAAI,EAAGkhB,EAAIzR,MAAM2sC,YAAa/7C,KAAKL,IAAI,EAAGkhB,EAAIzR,MAAM4sC,cAE1En7B,EAAIyG,oBAEC,IAAI9W,EAAQqQ,EAAIxH,MAAOwH,EAAI1G,QAEhC0G,EAAIo7B,UAEC,IAAIzrC,EAAQqQ,EAAIzR,MAAMiK,MAAOwH,EAAIzR,MAAM+K,QAEzC,IAAI3J,EAAQ,EAAG,IClCX,MAAM0rC,GAEnB7gD,YAAY0a,GAEV9b,KAAKmoB,GAAK,IAAIiE,EAAkB,EAAG,EAAG,CACpC81B,KAAMjnB,EACN6L,OAAQ/L,EACR4L,UAAW7mB,EACX+mB,UAAW/mB,IAEb9f,KAAKsiC,IAAM,IAAIlW,EAAkB,EAAG,EAAG,CACrC81B,KAAMjnB,EACN6L,OAAQ/L,EACR4L,UAAW7mB,EACX+mB,UAAW/mB,IAGb9f,KAAKmiD,kBAAoB,IAAIV,GAG/BW,OAAO90B,GAEL,MAAM+0B,EAAWriD,KAAK47C,SAAStuB,GAC3B+0B,EAAS/6C,IAAMtH,KAAKmoB,GAAG/I,OAASijC,EAAS96C,IAAMvH,KAAKmoB,GAAGjI,SAEzDlgB,KAAKmoB,GAAGuE,QAAQ21B,EAAS/6C,EAAG+6C,EAAS96C,GACrCvH,KAAKsiC,IAAI5V,QAAQ21B,EAAS/6C,EAAG+6C,EAAS96C,IAGxCvH,KAAKmiD,kBAAkBx7B,YAAY2G,GACnCqG,GAAShG,cAAc3tB,KAAKmiD,kBAAmBniD,KAAKmoB,IAEpD,IAAK,IAAI1hB,EAAI,EAAGA,EAAI,EAAGA,IAErBzG,KAAKmiD,kBAAkBx7B,YAAY3mB,KAAKmoB,GAAGmF,SAC3CqG,GAAShG,cAAc3tB,KAAKmiD,kBAAmBniD,KAAKsiC,KAEpDtiC,KAAKmiD,kBAAkBx7B,YAAY3mB,KAAKsiC,IAAIhV,SAC5CqG,GAAShG,cAAc3tB,KAAKmiD,kBAAmBniD,KAAKmoB,IAGtD,OAAOnoB,KAAKmoB,GAGdyzB,SAASh1B,GAEP,OAAIA,EAAIi7B,eAEC,IAAItrC,EAAQxQ,KAAKL,IAAI,EAAGkhB,EAAIzR,MAAM2sC,YAAa/7C,KAAKL,IAAI,EAAGkhB,EAAIzR,MAAM4sC,cAE1En7B,EAAIyG,oBAEC,IAAI9W,EAAQqQ,EAAIxH,MAAOwH,EAAI1G,QAEhC0G,EAAIo7B,UAEC,IAAIzrC,EAAQqQ,EAAIzR,MAAMiK,MAAOwH,EAAIzR,MAAM+K,QAEzC,IAAI3J,EAAQ,EAAG,IC3DX,MAAM+rC,WAAkC1lC,GAErDxb,YAAYmhD,GAEV7zC,MAAM6zC,ytCCLK,MAAMC,WAA4B5lC,GAE/Cxb,YAAYqhD,EAAgBF,GAE1B7zC,sLAGE6c,WAAOxmB,GAET/E,KAAKqc,SAASqmC,QAAQ39C,MAAQA,EAG5BwmB,aAEF,OAAOvrB,KAAKqc,SAASqmC,QAAQ39C,OCblB,MAAM49C,GAEnBvhD,YAAYqhD,GAEVziD,KAAKomC,cAAiB,EACtBpmC,KAAKqmC,eAAiB,EACtBrmC,KAAK4iD,IAAM,IAAIx2B,EAAkB,EAAG,GACpCpsB,KAAKsiC,IAAM,IAAIlW,EAAkB,EAAG,GACpCpsB,KAAKuiC,IAAM,IAAInW,EAAkB,EAAG,GACpCpsB,KAAK6iD,IAAM,IAAIz2B,EAAkB,EAAG,GACpCpsB,KAAK8iD,IAAM,IAAI12B,EAAkB,EAAG,GAEpCpsB,KAAK+iD,iBAAqB,IAAIT,IAA0B,GACxDtiD,KAAKgjD,mBAAqB,IAAIV,IAA0B,GAExDtiD,KAAKijD,iBAAmB,IAAIT,GAG9B/f,KAAKta,GAEHnoB,KAAKkjD,gBAAgB/6B,EAAG/I,MAAO+I,EAAGjI,QAClCyT,GAASzG,KAAK/E,EAAUnoB,KAAKsiC,IAAKtiC,KAAKijD,kBAGvCtvB,GAASzG,KAAKltB,KAAKsiC,IAAKtiC,KAAKuiC,IAAKviC,KAAKgjD,oBACvCrvB,GAASzG,KAAKltB,KAAKuiC,IAAKviC,KAAK6iD,IAAK7iD,KAAKgjD,oBACvCrvB,GAASzG,KAAKltB,KAAK6iD,IAAK7iD,KAAK8iD,IAAK9iD,KAAKgjD,oBAIvCrvB,GAASzG,KAAKltB,KAAK8iD,IAAK9iD,KAAK6iD,IAAK7iD,KAAK+iD,kBACvCpvB,GAASzG,KAAKltB,KAAK6iD,IAAK7iD,KAAKuiC,IAAKviC,KAAK+iD,kBACvCpvB,GAASzG,KAAKltB,KAAKuiC,IAAKpa,EAAInoB,KAAK+iD,kBAMnCG,gBAAgB9jC,EAAOc,GAEjBlgB,KAAKomC,gBAAkBhnB,GAASpf,KAAKqmC,iBAAmBnmB,IAE1DlgB,KAAKomC,cAAgBhnB,EACrBpf,KAAKqmC,eAAiBnmB,EACtBlgB,KAAK4iD,IAAIl2B,QAAQ1sB,KAAKomC,cAAgB,EAAGpmC,KAAKqmC,eAAiB,GAC/DrmC,KAAKsiC,IAAI5V,QAAQ1sB,KAAKomC,cAAgB,EAAGpmC,KAAKqmC,eAAiB,GAC/DrmC,KAAKuiC,IAAI7V,QAAQ1sB,KAAKomC,cAAgB,EAAGpmC,KAAKqmC,eAAiB,GAC/DrmC,KAAK6iD,IAAIn2B,QAAQ1sB,KAAKomC,cAAgB,EAAGpmC,KAAKqmC,eAAiB,GAC/DrmC,KAAK8iD,IAAIp2B,QAAQ1sB,KAAKomC,cAAgB,GAAIpmC,KAAKqmC,eAAiB,MChDvD,MAAM8c,WAA0BhhC,EAE7C/gB,cAEEsN,QACA1O,KAAKm0C,WAAa,GAElBn0C,KAAKojD,eAAYhgD,EAGnBigD,kBAAkBx/B,EAAUC,EAAUw/B,GAGpC,GAAIA,QAA8DlgD,IAAxCygB,EAASnU,aAAa,cAChD,CACE,MAAM6zC,EAAkBvjD,KAAKwjD,2BAA2B3/B,EAASnU,aAAa,YAAYmsB,OAC1FhY,EAASjF,aAAa,aAAc2kC,GAOtC,MAAMn9C,EAAS,IAAIq9C,GAAO5/B,EAAUC,GACpC1d,EAAO2iB,eAAgB,EACvB/oB,KAAKojD,UAAYh9C,EAEjBpG,KAAKiI,IAAI7B,GAGXs9C,sBAAsB5nB,IAKtB6nB,cAAcjjD,EAAMo7B,IAKpB0nB,2BAA2BI,GAEzB,MAAMC,EAAa7jD,KAAK8jD,qBAAqBF,GACvC5nB,EAAM,IAAIhB,aAA8B,EAAjB4oB,GAC7B,IAAK,IAAIn9C,EAAI,EAAGgrC,EAAI,EAAGhrC,EAAqB,EAAjBm9C,EAAoBn9C,GAAK,EAAGgrC,IAErDzV,EAAIv1B,GAAOgrC,EAAIoS,EAAcA,EAAe,GAAMA,EAClD7nB,EAAIv1B,EAAI,GAAMV,KAAKsC,MAAMopC,EAAIoS,GAAcA,EAAe,GAAMA,EAGlE,OAAO,IAAI9nB,EAAgBC,EAAK,GAGlC8nB,qBAAqBF,GAEnB,OAAO79C,KAAKmZ,KAAKnZ,KAAKuH,KAAKs2C,IAG7Bh6C,SAEE,IAAK,IAAInD,EAAI,EAAGA,EAAIzG,KAAKm0C,WAAWlvC,OAAQwB,IAE1CzG,KAAKm0C,WAAW1tC,GAAGmD,SAIvBm6C,8BAA8Br5C,EAAgBkjB,GAE5C,IAAK,IAAInnB,EAAI,EAAGA,EAAIzG,KAAKm0C,WAAWlvC,OAAQwB,IAEtCzG,KAAKm0C,WAAW1tC,GAAG/F,OAASgK,IAE9B1K,KAAKm0C,WAAW1tC,GAAGu9C,gBAAkBp2B,GAK3C5R,UAEEhc,KAAKojD,UAAUv/B,SAAS7H,UACxBhc,KAAKojD,UAAUt/B,SAAS9H,WClFb,MAAMioC,WAA0BppB,EAE7Cz5B,YAAY+D,EAAMia,EAAOc,EAAQ4mB,EAAQob,GAEvCxzC,MAAMvJ,EAAMia,EAAOc,EAAQ4mB,EAAQob,GACnCliD,KAAKkkD,WAAa,EAGpBC,SAAS3pB,EAAO10B,EAAGI,EAAGC,EAAGqK,GAEvBxQ,KAAKmF,KAAa,EAARq1B,EAAY,GAAK10B,EAAI9F,KAAKkkD,WACpClkD,KAAKmF,KAAa,EAARq1B,EAAY,GAAKt0B,EAAIlG,KAAKkkD,WACpClkD,KAAKmF,KAAa,EAARq1B,EAAY,GAAKr0B,EAAInG,KAAKkkD,WACpClkD,KAAKmF,KAAa,EAARq1B,EAAY,GAAKhqB,EAAIxQ,KAAKkkD,WACpClkD,KAAKggB,aAAc,EAGrBokC,QAAQ5pB,EAAO10B,EAAGI,EAAGC,GAEnBnG,KAAKmF,KAAa,EAARq1B,EAAY,GAAK10B,EAAI9F,KAAKkkD,WACpClkD,KAAKmF,KAAa,EAARq1B,EAAY,GAAKt0B,EAAIlG,KAAKkkD,WACpClkD,KAAKmF,KAAa,EAARq1B,EAAY,GAAKr0B,EAAInG,KAAKkkD,WACpClkD,KAAKggB,aAAc,EAGrBqkC,MAAM7pB,EAAOz1B,GAEX/E,KAAKmF,KAAa,EAARq1B,EAAY,GAAKz1B,EAAQ/E,KAAKkkD,WACxClkD,KAAKggB,aAAc,EAGrBskC,MAAM9pB,EAAOz1B,GAEX/E,KAAKmF,KAAa,EAARq1B,EAAY,GAAKz1B,EAAQ/E,KAAKkkD,WACxClkD,KAAKggB,aAAc,EAGrBukC,MAAM/pB,EAAOz1B,GAEX/E,KAAKmF,KAAa,EAARq1B,EAAY,GAAKz1B,EAAQ/E,KAAKkkD,WACxClkD,KAAKggB,aAAc,EAGrBwkC,MAAMhqB,EAAOz1B,GAEX/E,KAAKmF,KAAa,EAARq1B,EAAY,GAAKz1B,EAAQ/E,KAAKkkD,WACxClkD,KAAKggB,aAAc,GC7CR,MAAMykC,WAAuBR,GAE1C7iD,YAAYge,EAAOc,GAGjBxR,MADa,IAAIksB,WAAWxb,EAAQc,EAAS,GACjCd,EAAOc,EAAQ4a,GAC3B96B,KAAKkkD,WAAa,KCNP,MAAMQ,WAAwBT,GAE3C7iD,YAAYge,EAAOc,GAGjBxR,MADa,IAAIksB,WAAWxb,EAAQc,EAAS,GACjCd,EAAOc,EAAQ6a,GAC3B/6B,KAAKkkD,WAAa,KCLP,MAAMS,WAA4BV,GAE/C7iD,YAAYge,EAAOc,GAGjBxR,MADa,IAAIssB,aAAa5b,EAAQc,EAAS,GACnCd,EAAOc,EAAQ4a,EAAWG,ICL3B,MAAM2pB,WAA6BX,GAEhD7iD,YAAYge,EAAOc,GAGjBxR,MADa,IAAIssB,aAAa5b,EAAQc,EAAS,GACnCd,EAAOc,EAAQ6a,EAAYE,ICH5B,MAAM4pB,WAAoB5gC,EAEvC7iB,YAAY0jD,EAAUjhC,EAAUC,EAAUihC,GAExCr2C,MAAMmV,EAAUC,GAEhB9jB,KAAK8kD,SAAWA,EAChB9kD,KAAKglD,cAAgB77C,OAAOC,KAAK07C,GAAU7/C,OAC3CjF,KAAK+kD,kBAAoBA,EACzB/kD,KAAKs3B,YAAct3B,KAAKglD,cAAgBD,EACxC/kD,KAAKilD,aAAel/C,KAAKmZ,KAAKlf,KAAKglD,cAAgBD,GAGrDG,mBAAmBltB,GAEjBh4B,KAAK8jB,SAASzH,SAAS2b,GAAcjzB,MAAQ,IAAI0/C,GAAezkD,KAAKs3B,YAAat3B,KAAKilD,cAGzFE,oBAAoBntB,GAElBh4B,KAAK8jB,SAASzH,SAAS2b,GAAcjzB,MAAQ,IAAI2/C,GAAgB1kD,KAAKs3B,YAAat3B,KAAKilD,cAG1FG,yBAAyBptB,GAEvBh4B,KAAK8jB,SAASzH,SAAS2b,GAAcjzB,MAAQ,IAAI4/C,GAAoB3kD,KAAKs3B,YAAat3B,KAAKilD,cAG9FI,0BAA0BrtB,GAExBh4B,KAAK8jB,SAASzH,SAAS2b,GAAcjzB,MAAQ,IAAI6/C,GAAqB5kD,KAAKs3B,YAAat3B,KAAKilD,cAG/FK,eAAe5kD,GAEb,OAAOV,KAAK8kD,SAASpkD,GAGvB6kD,cAAcvtB,EAAcwtB,EAAW1/C,EAAGI,EAAGC,GAE3CnG,KAAK8jB,SAASzH,SAAS2b,GAAcosB,QAAQpkD,KAAKslD,eAAeE,GAAY1/C,EAAGI,EAAGC,GAGrFs/C,eAAeztB,EAAcwtB,EAAW1/C,EAAGI,EAAGC,EAAGqK,GAE/CxQ,KAAK8jB,SAASzH,SAAS2b,GAAcmsB,SAASnkD,KAAKslD,eAAeE,GAAY1/C,EAAGI,EAAGC,EAAGqK,IC7C5E,MAAMk1C,GAEnBrqB,MAAMsqB,EAAQ7hC,GAEZ,MAMMkuB,EAAa,GACb8S,EAAW,GAEXc,EAAe,GAErB,IAAK,IAAIn/C,EAAI,EAAGA,EAAIk/C,EAAO1gD,OAAQwB,IACnC,CACE,MAAMglB,EAAOk6B,EAAOl/C,GACdm1B,EAAenQ,EAAK5H,SAASnU,aAAa,YAAYmsB,MAE5D,IAAK,IAAIA,EAAQ,EAAGA,EAAQD,EAAcC,IAExC+pB,EAAaj/C,KAAKF,GAGpBurC,EAAWrrC,KAAK8kB,EAAK5H,eAEOzgB,IAAxB0hD,EAASr5B,EAAK/qB,MAEhBokD,EAASr5B,EAAK/qB,MAAQ+F,EAItB9D,QAAQM,MAAM,4EAA6EwoB,EAAK/qB,KAAMokD,GAI1G,MAAM9/B,EAAkBC,GAAoBC,sBAAsB8sB,GAE5DlW,EAAmB,IAAIC,EAAgB,IAAIf,aAAa4qB,GAAe,GAG7E,OAFA5gC,EAAgBpG,aAAa,UAAWkd,GAEjC97B,KAAK6lD,oBAAoBf,EAAU9/B,EAAiBlB,EAtCjC,MAyC5B+hC,oBAAoBf,EAAU9/B,EAAiBlB,EAAUihC,GAEvD,OAAO,IAAIF,GAAYC,EAAU9/B,EAAiBlB,EAAUihC,IClDjD,MAAMe,GAEnB1kD,YAAY8vB,EAAQ60B,GAAO,EAAMC,EAAS,EAAGC,GAAa,GAExDjmD,KAAKkxB,OAASA,EACdlxB,KAAK+lD,KAAOA,EACZ/lD,KAAKgmD,OAASA,EACdhmD,KAAKimD,WAAaA,EAElBjmD,KAAKkmD,WAAQ9iD,EAGfrD,KAAKomD,GAECnmD,KAAKimD,WAEPjmD,KAAKkmD,MAAQ,IAAIE,GAAiBD,GAIlCnmD,KAAKkmD,MAAQ,IAAIG,GAAOF,GAG1BnmD,KAAKkmD,MAAMI,UAAUtmD,KAAKkxB,QAC1BlxB,KAAKkmD,MAAMK,QAAQvmD,KAAK+lD,MAGxB/lD,KAAKkmD,MAAMM,KAAKA,KAAKzhD,MAAQ,EAE7B/E,KAAKkmD,MAAMO,UAAUzmD,KAAK+lD,KAAO,EAAI/lD,KAAKgmD,QAG5C18C,OAEEtJ,KAAKkmD,MAAM58C,OAGbo9C,QAEE1mD,KAAKkmD,MAAMQ,QAGbn9C,OAEEvJ,KAAKkmD,MAAM38C,OAGTo9C,iBAEF,OAAO3mD,KAAKkmD,MAAMU,WC9CP,MAAMC,WAAoB/kD,GAEvCV,YAAYW,EAAaC,EAAK+jD,GAAO,EAAMC,EAAS,EAAG/jD,EAAMgkD,GAAa,GAExEv3C,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAK+lD,KAAOA,EACZ/lD,KAAKgmD,OAASA,EACdhmD,KAAKimD,WAAaA,EAGpB/gD,sBAAsB/B,EAAoBiB,GAEnCjE,OAAO2mD,gCAM4C1jD,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAK+mD,kBAAkB5jD,EAAoBiB,IAI3CjB,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAbPmkD,WAAWhnD,KAAKkF,sBAAsBnB,KAAK/D,KAAMmD,EAAoBiB,GAAW,KAkBpF2iD,kBAAkB5jD,EAAoBiB,GAEpCA,EAAS6iD,cAAcpjD,MAAMqjD,IAEXC,GAAa/oC,aACrBgpC,gBAAgBF,GAAeG,IAErClkD,EAAmBe,aACjBlE,KAAK+B,YACL/B,KAAKgC,IACL,IAAI8jD,GAAUuB,EAAcrnD,KAAK+lD,KAAM/lD,KAAKgmD,OAAQhmD,KAAKimD,aAG3DjmD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,yBChDE,MAAMykD,WAAoBxlD,GAEvCV,YAAYW,EAAaC,EAAKulD,EAAQtlD,GAEpCyM,MAAM3M,EAAaC,EAAKC,GAExBjC,KAAKunD,OAASA,EAGhBriD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMwlD,IAI1BrkD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKwlD,GAE5DxnD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,qLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCzCI,MAAM8kD,WAAsB7lD,GAEzCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIK,GAClB5nD,KAAKunD,OAAOM,QAAQ7lD,EAAM,KAC1BhC,KAAK8nD,KAAO,CACV,SACA,SACA,SACA,SACA,SACA,UAIJ5iD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAK8nD,MAAO3yC,IAE3BhS,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmT,GAE5DnV,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAxkD,IAECjD,KAAK8C,YAAY,+EAAsFG,GACvGjD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC/CI,MAAMklD,WAAkBjmD,GAErCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIS,GAAmBC,cAGvC/iD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMmwC,IAE1BhvC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmwC,GAE5DnyC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,qLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMqlD,WAAmBpmD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIY,GAGpBjjD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMomD,IAE1BjlD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKomD,GAE5DpoD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,GACjB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMwlD,WAAmBvmD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIe,GAGpBpjD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMid,IAE1B9b,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKid,GAE5Djf,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,iLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAM0lD,WAAmBzmD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIiB,GAAgBD,WAGpCrjD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMmwC,IAE1BhvC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmwC,GAE5DnyC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QASAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,qLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCvCI,MAAM4lD,WAAwB3mD,GAE3CV,YAAYW,EAAaC,EAAKulD,EAAQtlD,GAEpCyM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIiB,GAAgBD,WAElCvoD,KAAKunD,OAAOmB,eAAenB,GAG7BriD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMmwC,IAE1BhvC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmwC,GAE5DnyC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,qLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCvCI,MAAM8lD,WAA6B7mD,GAEhDV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIqB,GAA0BD,qBAC5C3oD,KAAK6oD,WAAa,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,WAG5E3jD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOM,QAAQ7nD,KAAKgC,KACtB8mD,YAAYC,IACZ7lD,KAAKlD,KAAK6oD,YAAaG,IAEtB7lD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKgnD,GAE5DhpD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,qLACvB1nD,KAAK6C,sBAKTM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC5CI,MAAMomD,WAAmBnnD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,EAAoBiB,QAEchB,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3CoC,EAASgd,OAAOvd,MAAMud,IAEpBje,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKof,GAE5DphB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtBI,MAAMqmD,WAAkBpnD,GAErCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAI4B,GAAeD,UAGnChkD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMwoC,IAE1BrnC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKwoC,GAE5DxqC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,iLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCrCI,MAAMumD,WAAyBtnD,GAE5CV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIY,GAGpBjjD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMgd,IAE1B7b,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKhC,KAAKqpD,WAAWrqC,IAE5Ehf,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,GACjB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAITwmD,WAAWC,GAET,MAAMC,EAAeD,EAASv5C,MAAM,MAEU,KAA1Cw5C,EAAaA,EAAatkD,OAAS,IAErCskD,EAAaC,MAGf,MAAM3a,EAAY,GAElB,IAAK,IAAIpoC,EAAI,EAAGA,EAAI8iD,EAAatkD,OAAQwB,GAAK,EAC9C,CACE,MAAMa,EAAIsI,WAAW25C,EAAa9iD,EAAI,IAChCc,EAAIqI,WAAW25C,EAAa9iD,EAAI,IAChCsB,EAAI6H,WAAW25C,EAAa9iD,EAAI,IACtCooC,EAAUloC,KAAK,IAAI8iD,EAAaniD,EAAGC,EAAGQ,IAExC,OAAO8mC,GC3DI,MAAM6a,WAA0B5nD,GAE7CV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIoC,GAAgBC,WAClC5pD,KAAKunD,OAAOuB,YAAYe,IAG1B3kD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMgnD,IAE1B7lD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKgnD,GAE5DhpD,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,EAAM,qLACvB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCzCI,MAAMinD,WAAmBhoD,GAEtCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GACxBjC,KAAKunD,OAAS,IAAIY,GAGpBjjD,sBAAsB/B,QAEkCC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3ChC,KAAKunD,OAAOrkD,KAAKlD,KAAKgC,KAAMmwC,IAE1BhvC,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmwC,GAE5DnyC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,qBAEN4kD,QAQAC,IAEC1nD,KAAK8C,YAAY4kD,GACjB1nD,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCtCI,MAAMknD,WAA2BjoD,GAE9CV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,GAEpB,QAAsDC,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAC7C,CACE,MAAMsrB,EAAU,IAAI08B,GACd70C,EAAQ,IAAI80C,MAElB90C,EAAME,IAAMrV,KAAKgC,IAEjBmT,EAAM+0C,OAAS,KAEb58B,EAAQnY,MAAQA,EAChBmY,EAAQtN,aAAc,EAEtB7c,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKsrB,GAE5DttB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAGPsS,EAAMg1C,QAAU,KAEdxnD,QAAQM,MAAM,6DAA8DjD,KAAKgC,IAAKhC,KAAKoqD,oBAK7FjnD,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBCrCI,MAAMwnD,WAAsBvoD,GAEzCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,EAAoBiB,QAEchB,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3CoC,EAAS0uB,OAAOjvB,MAAMivB,IAEpB,MAAMxF,EAAU,IAAI08B,GAEdhoD,EAAMkxB,IAAIC,gBAAgBL,GAE1B3d,EAAQ,IAAI80C,MAClB90C,EAAME,IAAMrT,EAEZmT,EAAM+0C,OAAS,KAEb58B,EAAQnY,MAAQA,EAChBmY,EAAQtN,aAAc,EAEtB7c,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKsrB,GAE5DttB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,mBAGPsS,EAAMg1C,QAAU,KAEdxnD,QAAQM,MAAM,6DAA8DjD,KAAKgC,UAMrFmB,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBC5CI,MAAMynD,WAAoBxoD,GAEvCV,YAAYW,EAAaC,EAAKC,GAE5ByM,MAAM3M,EAAaC,EAAKC,GAG1BiD,sBAAsB/B,EAAoBiB,QAEchB,IAAlDD,EAAmBE,iBAAiBrD,KAAKgC,KAE3CoC,EAAS0uB,OAAOjvB,MAAMivB,IAEpB3vB,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKkxB,IAAIC,gBAAgBL,IAEhF9yB,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,sBAKPM,EAAmBe,aAAalE,KAAK+B,YAAa/B,KAAKgC,IAAKmB,EAAmBE,iBAAiBrD,KAAKgC,MAErGhC,KAAKuC,0BAA0B,EAAG,GAClCvC,KAAK6C,oBCxBI,MAAM0nD,GAEnBnpD,YAAYopD,GAEVxqD,KAAKyqD,iBAAmB,GACxBzqD,KAAKwqD,WAAaA,GAAc,gBAGlCE,WAAWnD,GAETvnD,KAAKyqD,iBAAiB9jD,KAAK4gD,GAG7BrkD,KAAKC,GAEH,IAAK,IAAIsD,EAAI,EAAGA,EAAIzG,KAAKyqD,iBAAiBxlD,OAAQwB,IAEhDzG,KAAKyqD,iBAAiBhkD,GAAGvD,KAAKC,GAAsB0X,IAIpD8vC,uBAEF,IAAIC,GAAW,EACf,IAAK,IAAInkD,EAAI,EAAGA,EAAIzG,KAAKyqD,iBAAiBxlD,OAAQwB,IAEhDmkD,EAAWA,GAAY5qD,KAAKyqD,iBAAiBhkD,GAAGrE,aAElD,OAAOwoD,EAGLC,iBAEF,IAAIxoD,GAAY,EAChB,IAAK,IAAIoE,EAAI,EAAGA,EAAIzG,KAAKyqD,iBAAiBxlD,OAAQwB,IAEhDpE,EAAYA,GAAarC,KAAKyqD,iBAAiBhkD,GAAGpE,UAEpD,OAAOA,EAGTyoD,eAEEnoD,QAAQM,MAAM,UAAYjD,KAAKwqD,WAAa,iCAC5C,IAAK,IAAI/jD,EAAI,EAAGA,EAAIzG,KAAKyqD,iBAAiBxlD,OAAQwB,IAE5CzG,KAAKyqD,iBAAiBhkD,GAAGpE,WAE3BrC,KAAKyqD,iBAAiBhkD,GAAGzD,cAK/BiH,eAEE,OAAOjK,KAAK+qD,mBAAqB/qD,KAAKgrD,kBAGxCD,mBAEE,IAAI7oD,EAAe,EAEnB,IAAK,IAAIuE,EAAI,EAAGA,EAAIzG,KAAKyqD,iBAAiBxlD,OAAQwB,IAEhDvE,GAAgBlC,KAAKyqD,iBAAiBhkD,GAAGvE,aAG3C,OAAOA,EAGT8oD,kBAEE,IAAI7oD,EAAc,EAElB,IAAK,IAAIsE,EAAI,EAAGA,EAAIzG,KAAKyqD,iBAAiBxlD,OAAQwB,IAEhDtE,GAAenC,KAAKyqD,iBAAiBhkD,GAAGtE,YAG1C,OAAOA"}