@zendir/ui 0.6.0 → 0.6.1

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 (116) hide show
  1. package/CHANGELOG.md +419 -406
  2. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  3. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  4. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  5. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  6. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  7. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  8. package/dist/react/3d/threeLoader.js.map +1 -1
  9. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  10. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  11. package/dist/react/astro/MissionClock.js.map +1 -1
  12. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  13. package/dist/react/astro/Notification.js.map +1 -1
  14. package/dist/react/astro/Progress.js.map +1 -1
  15. package/dist/react/astro/SimulationControls.js.map +1 -1
  16. package/dist/react/astro/StatusIndicator.js.map +1 -1
  17. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  18. package/dist/react/cards/AccessCard.js.map +1 -1
  19. package/dist/react/cards/OrbitCard.js.map +1 -1
  20. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  21. package/dist/react/cards/TelemetryCard.js.map +1 -1
  22. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  23. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  24. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  25. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  26. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  27. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  28. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  29. package/dist/react/charts/unified/domain.js.map +1 -1
  30. package/dist/react/charts/unified/generators.js.map +1 -1
  31. package/dist/react/charts/unified/presets.js.map +1 -1
  32. package/dist/react/charts/unified/sync.js.map +1 -1
  33. package/dist/react/charts/unified/theme.js.map +1 -1
  34. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  35. package/dist/react/chatgpt/index.js.map +1 -1
  36. package/dist/react/context/CategoryContext.js.map +1 -1
  37. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  38. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  39. package/dist/react/core/data/DataTable.js.map +1 -1
  40. package/dist/react/core/data/DataValue.js.map +1 -1
  41. package/dist/react/core/data/propertyConfig.js.map +1 -1
  42. package/dist/react/core/display/AstroIcon.js.map +1 -1
  43. package/dist/react/core/display/Badge.js.map +1 -1
  44. package/dist/react/core/display/CardHeader.js.map +1 -1
  45. package/dist/react/core/display/Container.js.map +1 -1
  46. package/dist/react/core/display/CopyButton.js.map +1 -1
  47. package/dist/react/core/display/GlassCard.js.map +1 -1
  48. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  49. package/dist/react/core/display/Icon.js.map +1 -1
  50. package/dist/react/core/display/Typography.js.map +1 -1
  51. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  52. package/dist/react/core/feedback/Dialog.js.map +1 -1
  53. package/dist/react/core/feedback/Toast.js.map +1 -1
  54. package/dist/react/core/inputs/Button.js.map +1 -1
  55. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  56. package/dist/react/core/inputs/Input.js.map +1 -1
  57. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  58. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  59. package/dist/react/core/inputs/PinInput.js.map +1 -1
  60. package/dist/react/core/inputs/Select.js.map +1 -1
  61. package/dist/react/core/inputs/Toggle.js.map +1 -1
  62. package/dist/react/core/layout/Box.js.map +1 -1
  63. package/dist/react/core/layout/Center.js.map +1 -1
  64. package/dist/react/core/layout/Divider.js.map +1 -1
  65. package/dist/react/core/layout/Flex.js.map +1 -1
  66. package/dist/react/core/layout/Grid.js.map +1 -1
  67. package/dist/react/core/layout/Spacer.js.map +1 -1
  68. package/dist/react/core/layout/Stack.js.map +1 -1
  69. package/dist/react/core/layout/responsive.js.map +1 -1
  70. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  71. package/dist/react/core/navigation/AppBar.js.map +1 -1
  72. package/dist/react/core/navigation/Pagination.js.map +1 -1
  73. package/dist/react/core/navigation/SideNav.js.map +1 -1
  74. package/dist/react/core/navigation/Tabs.js.map +1 -1
  75. package/dist/react/core/overlays/Popover.js.map +1 -1
  76. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  77. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  78. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  79. package/dist/react/core/widgets/Capture.js.map +1 -1
  80. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  81. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  82. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  83. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  84. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  85. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  86. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  87. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  88. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  89. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  90. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  91. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  92. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  93. package/dist/react/hooks/useCompactMode.js.map +1 -1
  94. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  95. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  96. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  97. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  98. package/dist/react/shared/Skeleton.js.map +1 -1
  99. package/dist/react/theme/ThemeProvider.js +2 -1
  100. package/dist/react/theme/ThemeProvider.js.map +1 -1
  101. package/dist/react/theme/cardAccent.js.map +1 -1
  102. package/dist/react/theme/config.js.map +1 -1
  103. package/dist/react/theme/types.js.map +1 -1
  104. package/dist/react/types.js.map +1 -1
  105. package/dist/react/utils/categoryPalette.js.map +1 -1
  106. package/dist/react/utils/index.js.map +1 -1
  107. package/dist/style.css +216 -216
  108. package/dist/tokens/core.js.map +1 -1
  109. package/dist/tokens/index.js.map +1 -1
  110. package/dist/tokens/palettes/astro.js.map +1 -1
  111. package/dist/tokens/palettes/index.js.map +1 -1
  112. package/dist/tokens/palettes/tailwind.js.map +1 -1
  113. package/dist/tokens/palettes/zendir.js.map +1 -1
  114. package/dist/tokens/themes.js.map +1 -1
  115. package/dist/tokens/tokens.css +533 -533
  116. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ZenSpace3D.js","names":[],"sources":["../../../src/react/3d/ZenSpace3D.tsx"],"sourcesContent":["/**\n * @zendir/ui - ZenSpace3D Component (Optimized)\n *\n * Professional 3D space visualization with smooth interactions.\n * Optimized for performance with settings from EarthViewer.\n */\n\nimport React, {\n useRef,\n useEffect,\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useMemo,\n} from \"react\";\nimport { useTheme } from \"../theme\";\nimport { AstroIcon, type AstroIconName } from \"../core/display/AstroIcon\";\nimport type { GroundStation as _GroundStation } from \"../types\";\nimport type {\n ZenSpace3DProps,\n ZenSpace3DHandle,\n ViewMode,\n SpaceObject,\n Vector3D,\n CameraState,\n LayerVisibility,\n SelectionState,\n OverpassInfo,\n} from \"./ZenSpace3DTypes\";\nimport {\n latLonAltToCartesian,\n SCENE_EARTH_RADIUS,\n KM_TO_SCENE,\n easeOutCubic,\n} from \"./ZenSpace3DUtils\";\nimport { formatDuration } from \"../utils\";\n\n// Import shaders as raw text (like EarthViewer)\nimport atmosphereVertexShader from \"../../shaders/atmosphere.vert\";\nimport atmosphereFragmentShader from \"../../shaders/atmosphere.frag\";\nimport starsVertexShader from \"../../shaders/stars.vert\";\nimport starsFragmentShader from \"../../shaders/stars.frag\";\nimport { loadThree, ThreeModule } from \"./threeLoader\";\nimport { ZenSpace3DCesium } from \"./ZenSpace3DCesium\";\n\n// =============================================================================\n// Communication Link Types\n// =============================================================================\n\nexport interface CommunicationLink {\n id: string;\n fromId: string;\n toId: string;\n type: \"uplink\" | \"downlink\" | \"crosslink\" | \"relay\";\n status: \"active\" | \"idle\" | \"blocked\";\n color?: string;\n bandwidth?: number;\n latency?: number;\n signalStrength?: number;\n}\n\n// =============================================================================\n// Configuration - Optimized for smooth interactions\n// =============================================================================\n\nconst DEFAULT_LAYERS: LayerVisibility = {\n planets: true,\n moons: true,\n satellites: true,\n debris: false,\n stations: true,\n asteroids: false,\n groundStations: true,\n orbits: true,\n labels: true,\n constellations: false,\n coverage: true,\n atmosphere: true,\n stars: true,\n grid: false,\n terminator: true,\n};\n\nconst CAMERA_TRANSITION_DURATION = 2000;\nconst STARS_COUNT = 5000; // Reduced from 8000\nconst EARTH_SEGMENTS = 64; // Reduced from 128\nconst EARTH_SEGMENTS_V = 32; // Reduced from 64\nconst SPHERICAL_SUBDIVISIONS = 16; // Subdivisions for curved edges on coverage\n\nfunction checkWebGLCapabilities(): { available: boolean; version: number } {\n try {\n const canvas = document.createElement(\"canvas\");\n const gl2 = canvas.getContext(\"webgl2\");\n if (gl2) return { available: true, version: 2 };\n const gl = canvas.getContext(\"webgl\");\n if (gl) return { available: true, version: 1 };\n } catch {\n /* WebGL not available */\n }\n return { available: false, version: 0 };\n}\n\n// =============================================================================\n// Spherical Geometry Helpers - For realistic curved coverage on sphere\n// =============================================================================\n\n/**\n * Spherical linear interpolation (SLERP) between two unit vectors\n * Creates smooth arc along the sphere surface\n */\nfunction slerp(\n v1: { x: number; y: number; z: number },\n v2: { x: number; y: number; z: number },\n t: number,\n): { x: number; y: number; z: number } {\n // Normalize inputs\n const len1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z);\n const len2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z);\n\n // Handle zero-length vectors\n if (len1 < 0.0001 || len2 < 0.0001) {\n return { x: v1.x, y: v1.y, z: v1.z };\n }\n\n const n1 = { x: v1.x / len1, y: v1.y / len1, z: v1.z / len1 };\n const n2 = { x: v2.x / len2, y: v2.y / len2, z: v2.z / len2 };\n\n // Calculate angle between vectors\n let dot = n1.x * n2.x + n1.y * n2.y + n1.z * n2.z;\n dot = Math.max(-1, Math.min(1, dot)); // Clamp for numerical stability\n const theta = Math.acos(dot);\n\n if (theta < 0.001) {\n // Vectors are nearly parallel, use linear interpolation\n return {\n x: n1.x + t * (n2.x - n1.x),\n y: n1.y + t * (n2.y - n1.y),\n z: n1.z + t * (n2.z - n1.z),\n };\n }\n\n const sinTheta = Math.sin(theta);\n if (Math.abs(sinTheta) < 0.0001) {\n // Near zero sin, use linear interpolation\n return {\n x: n1.x + t * (n2.x - n1.x),\n y: n1.y + t * (n2.y - n1.y),\n z: n1.z + t * (n2.z - n1.z),\n };\n }\n\n const a = Math.sin((1 - t) * theta) / sinTheta;\n const b = Math.sin(t * theta) / sinTheta;\n\n return {\n x: a * n1.x + b * n2.x,\n y: a * n1.y + b * n2.y,\n z: a * n1.z + b * n2.z,\n };\n}\n\n/**\n * Subdivide polygon edges along great circles for spherical rendering\n * Takes corner points and returns a densely sampled spherical polygon\n */\nfunction subdivideSphericalPolygon(\n corners: Array<{ x: number; y: number; z: number }>,\n subdivisions: number,\n radius: number,\n): Array<{ x: number; y: number; z: number }> {\n if (corners.length < 3 || subdivisions < 1 || radius <= 0) {\n return corners; // Return as-is if invalid params\n }\n\n const result: Array<{ x: number; y: number; z: number }> = [];\n\n for (let i = 0; i < corners.length; i++) {\n const p1 = corners[i];\n const p2 = corners[(i + 1) % corners.length];\n\n // Validate points\n if (\n !isFinite(p1.x) ||\n !isFinite(p1.y) ||\n !isFinite(p1.z) ||\n !isFinite(p2.x) ||\n !isFinite(p2.y) ||\n !isFinite(p2.z)\n ) {\n continue; // Skip invalid points\n }\n\n // Add interpolated points along the great circle arc\n for (let j = 0; j < subdivisions; j++) {\n const t = j / subdivisions;\n const interpolated = slerp(p1, p2, t);\n\n // Validate interpolation result\n if (\n !isFinite(interpolated.x) ||\n !isFinite(interpolated.y) ||\n !isFinite(interpolated.z)\n ) {\n continue;\n }\n\n // Project onto sphere surface at given radius\n const len = Math.sqrt(\n interpolated.x ** 2 + interpolated.y ** 2 + interpolated.z ** 2,\n );\n if (len < 0.0001) continue; // Skip zero-length vectors\n\n result.push({\n x: (interpolated.x / len) * radius,\n y: (interpolated.y / len) * radius,\n z: (interpolated.z / len) * radius,\n });\n }\n }\n\n return result.length > 0 ? result : corners; // Fallback to original if all failed\n}\n\n// =============================================================================\n// Satellite Shape Builders (simplified for performance)\n// =============================================================================\n\nfunction createSatelliteShape(\n THREE: ThreeModule,\n category: string,\n size: number,\n): any {\n const group = new THREE.Group();\n\n if (category === \"station\") {\n // Simple station shape\n const geo = new THREE.BoxGeometry(size * 1.2, size * 0.6, size * 0.6);\n const mat = new THREE.MeshBasicMaterial({ color: 0xcccccc });\n group.add(new THREE.Mesh(geo, mat));\n\n // Solar panels\n const panelGeo = new THREE.BoxGeometry(size * 2.5, size * 0.03, size * 0.6);\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a4a7a });\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\n leftPanel.position.x = -size * 1.5;\n group.add(leftPanel);\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\n rightPanel.position.x = size * 1.5;\n group.add(rightPanel);\n } else if (category === \"satellite\") {\n // Simple satellite\n const geo = new THREE.BoxGeometry(size * 0.5, size * 0.5, size * 0.6);\n const mat = new THREE.MeshBasicMaterial({ color: 0xaaaaaa });\n group.add(new THREE.Mesh(geo, mat));\n\n const panelGeo = new THREE.BoxGeometry(size * 1.2, size * 0.02, size * 0.4);\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a3a6a });\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\n leftPanel.position.x = -size * 0.7;\n group.add(leftPanel);\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\n rightPanel.position.x = size * 0.7;\n group.add(rightPanel);\n } else if (category === \"debris\") {\n const geo = new THREE.IcosahedronGeometry(size * 0.3, 0);\n const mat = new THREE.MeshBasicMaterial({ color: 0x666666 });\n group.add(new THREE.Mesh(geo, mat));\n } else {\n const geo = new THREE.SphereGeometry(size * 0.4, 8, 6);\n const mat = new THREE.MeshBasicMaterial({ color: 0x888888 });\n group.add(new THREE.Mesh(geo, mat));\n }\n\n return group;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const ZenSpace3D = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\n function ZenSpace3D(props, ref) {\n // Prefer Cesium when available (default 3D backend); fall back to Three.js\n const [cesiumModule, setCesiumModule] = useState<unknown>(null);\n useEffect(() => {\n // Cesium is optional peer; fallback to Three.js when not installed\n import(\"cesium\")\n .then((m) => setCesiumModule(m))\n .catch(() => setCesiumModule(null));\n }, []);\n if (cesiumModule) {\n return <ZenSpace3DCesium ref={ref} cesium={cesiumModule} {...props} />;\n }\n return <ZenSpace3DThree ref={ref} {...props} />;\n },\n);\n\n// Three.js implementation — separate component so hook count is consistent (avoids React #300)\nconst ZenSpace3DThree = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\n function ZenSpace3DThree(props, ref) {\n const {\n satellites = [],\n debris = [],\n stations = [],\n groundStations = [],\n customObjects = [],\n view = \"earth-orbit\",\n focusedObjectId,\n initialCamera,\n sunDirection,\n planetPositions,\n visibilityCones = [],\n satelliteCoverages = [],\n overpasses: _overpasses = [],\n orbitPaths = [],\n orbitDesignArcs: _orbitDesignArcs = [],\n communicationLinks = [],\n showAxisHelper = false,\n layers: layerOverrides,\n showTools = true,\n showInfoPanel = true,\n width = \"100%\",\n height = 600,\n callbacks,\n maxObjects = 10000,\n className = \"\",\n style,\n } = props;\n\n const { tokens: _tokens } = useTheme();\n const [webglCapabilities] = useState(() => checkWebGLCapabilities());\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const rendererRef = useRef<any>(null);\n const sceneRef = useRef<any>(null);\n const cameraRef = useRef<any>(null);\n const controlsRef = useRef<any>(null);\n const animationRef = useRef<number | null>(null);\n const raycasterRef = useRef<any>(null);\n const mouseRef = useRef<any>(null);\n\n const earthRef = useRef<any>(null);\n const starsMaterialRef = useRef<any>(null);\n const atmosphereMaterialRef = useRef<any>(null);\n const objectsGroupRef = useRef<any>(null);\n const linksGroupRef = useRef<any>(null);\n const conesGroupRef = useRef<any>(null);\n const orbitsGroupRef = useRef<any>(null);\n const planetsGroupRef = useRef<any>(null);\n\n const timeRef = useRef(0);\n const focusTransitionRef = useRef<any>(null);\n const isUserInteractingRef = useRef(false);\n const objectMeshMapRef = useRef<Map<string, any>>(new Map());\n const isAnimatingRef = useRef(false); // Guard against multiple animation loops\n const _sceneInitializedRef = useRef(false); // Prevent duplicate initialization\n\n // State\n const [THREE, setTHREE] = useState<ThreeModule | null>(null);\n const threeRef = useRef<ThreeModule | null>(null);\n threeRef.current = THREE;\n const [OrbitControlsClass, setOrbitControlsClass] = useState<any>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [layers, setLayers] = useState<LayerVisibility>({\n ...DEFAULT_LAYERS,\n ...layerOverrides,\n });\n const [selection, setSelection] = useState<SelectionState>({\n selectedId: null,\n selectedObject: null,\n hoveredId: null,\n });\n const [hoverTooltip, setHoverTooltip] = useState<{\n visible: boolean;\n x: number;\n y: number;\n object: any;\n }>({ visible: false, x: 0, y: 0, object: null });\n const [currentView, setCurrentView] = useState<ViewMode>(view);\n\n // Ref for view to prevent initScene recreation (fixes flickering on view change)\n const currentViewRef = useRef<ViewMode>(view);\n\n const effectiveLayers = useMemo(\n () => ({ ...layers, ...layerOverrides }),\n [layers, layerOverrides],\n );\n\n useEffect(() => {\n setCurrentView(view);\n currentViewRef.current = view;\n }, [view]);\n\n // ==========================================================================\n // Load Three.js\n // ==========================================================================\n\n useEffect(() => {\n if (!webglCapabilities.available) {\n setIsLoading(false);\n return;\n }\n\n loadThree()\n .then(({ THREE: threeModule, OrbitControls: controls }) => {\n setTHREE(threeModule);\n setOrbitControlsClass(() => controls);\n })\n .catch((err) => {\n if (import.meta.env.DEV) {\n console.error(\"Failed to load Three.js:\", err);\n }\n setError(\"Failed to load 3D library\");\n setIsLoading(false);\n });\n }, [webglCapabilities.available]);\n\n // ==========================================================================\n // Initialize Scene (Optimized like EarthViewer)\n // ==========================================================================\n\n const initScene = useCallback(() => {\n if (!THREE || !containerRef.current || !OrbitControlsClass) return;\n\n // Clean up any existing scene first (prevents duplicates)\n if (rendererRef.current) {\n isAnimatingRef.current = false;\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n controlsRef.current?.dispose();\n rendererRef.current.dispose();\n if (containerRef.current?.contains(rendererRef.current.domElement)) {\n containerRef.current.removeChild(rendererRef.current.domElement);\n }\n }\n\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n const w = rect.width;\n const h = typeof height === \"number\" ? height : rect.height;\n\n // Scene\n const scene = new THREE.Scene();\n sceneRef.current = scene;\n\n // Use ref for view mode to prevent initScene recreation (fixes flickering)\n const viewMode = currentViewRef.current;\n\n // Camera (adjusted per view mode)\n const farClip = viewMode === \"solar-system\" ? 1000000 : 100000;\n const camera = new THREE.PerspectiveCamera(45, w / h, 1, farClip);\n // Solar system: position to see inner planets, Earth orbit view: standard distance\n const initialDistance = viewMode === \"solar-system\" ? 5000 : 10000;\n camera.position.set(0, initialDistance * 0.3, initialDistance);\n cameraRef.current = camera;\n\n if (initialCamera?.position) {\n camera.position.set(\n initialCamera.position.x,\n initialCamera.position.y,\n initialCamera.position.z,\n );\n }\n\n // Renderer (optimized settings - preserveDrawingBuffer prevents flickering)\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n alpha: true,\n powerPreference: \"high-performance\",\n preserveDrawingBuffer: true, // Prevents flickering from buffer swaps\n });\n renderer.setSize(w, h);\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // Controls (smooth damping, adjusted per view)\n const controls = new OrbitControlsClass(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.dampingFactor = 0.05;\n controls.rotateSpeed = 0.5;\n controls.minDistance = viewMode === \"solar-system\" ? 500 : 3050; // Very close to Earth/objects\n controls.maxDistance = viewMode === \"solar-system\" ? 100000 : 25000;\n controls.enablePan = viewMode === \"solar-system\"; // Allow pan in solar system\n let interactionTimer: ReturnType<typeof setTimeout>;\n const handleControlStart = () => {\n isUserInteractingRef.current = true;\n };\n const handleControlEnd = () => {\n clearTimeout(interactionTimer);\n interactionTimer = setTimeout(() => {\n isUserInteractingRef.current = false;\n }, 3000);\n };\n controls.addEventListener(\"start\", handleControlStart);\n controls.addEventListener(\"end\", handleControlEnd);\n controlsRef.current = controls;\n\n raycasterRef.current = new THREE.Raycaster();\n mouseRef.current = new THREE.Vector2();\n\n // Groups\n objectsGroupRef.current = new THREE.Group();\n objectsGroupRef.current.name = \"objects\";\n scene.add(objectsGroupRef.current);\n\n linksGroupRef.current = new THREE.Group();\n linksGroupRef.current.name = \"links\";\n scene.add(linksGroupRef.current);\n\n conesGroupRef.current = new THREE.Group();\n conesGroupRef.current.name = \"cones\";\n scene.add(conesGroupRef.current);\n\n orbitsGroupRef.current = new THREE.Group();\n orbitsGroupRef.current.name = \"orbits\";\n scene.add(orbitsGroupRef.current);\n\n planetsGroupRef.current = new THREE.Group();\n planetsGroupRef.current.name = \"planets\";\n scene.add(planetsGroupRef.current);\n\n if (viewMode === \"solar-system\") {\n createSolarSystem(THREE, scene);\n } else {\n createEarth(THREE, scene);\n createAtmosphere(THREE, scene);\n }\n\n createStars(THREE, scene);\n createLighting(THREE, scene);\n\n if (showAxisHelper && viewMode !== \"solar-system\") {\n createAxisHelper(THREE, scene);\n }\n\n setIsLoading(false);\n\n return () => {\n clearTimeout(interactionTimer);\n if (animationRef.current) cancelAnimationFrame(animationRef.current);\n controls.removeEventListener(\"start\", handleControlStart);\n controls.removeEventListener(\"end\", handleControlEnd);\n controls.dispose();\n renderer.dispose();\n if (container.contains(renderer.domElement))\n container.removeChild(renderer.domElement);\n };\n }, [THREE, OrbitControlsClass, height, initialCamera, showAxisHelper]); // Uses currentViewRef to prevent recreation\n\n // ==========================================================================\n // Create Solar System (scaled for visibility)\n // ==========================================================================\n\n const createSolarSystem = useCallback(\n (THREE: ThreeModule, _scene: unknown) => {\n const planetsGroup = planetsGroupRef.current;\n if (!planetsGroup) return;\n\n // Scale factor to make solar system viewable (1 unit = ~1000 km)\n const DISTANCE_SCALE = 0.000005;\n const SIZE_SCALE = 0.01;\n\n // Sun (emissive glow)\n const sunRadius = 696340 * SIZE_SCALE;\n const sunGeo = new THREE.SphereGeometry(sunRadius, 32, 24);\n const sunMat = new THREE.MeshBasicMaterial({ color: 0xffdd44 });\n const sunMesh = new THREE.Mesh(sunGeo, sunMat);\n sunMesh.name = \"sun\";\n sunMesh.userData = {\n objectId: \"sun\",\n planetId: \"sun\",\n isPlanet: true,\n isSelectable: true,\n };\n planetsGroup.add(sunMesh);\n\n // Sun glow\n const glowGeo = new THREE.SphereGeometry(sunRadius * 1.3, 24, 16);\n const glowMat = new THREE.MeshBasicMaterial({\n color: 0xffaa00,\n transparent: true,\n opacity: 0.2,\n });\n planetsGroup.add(new THREE.Mesh(glowGeo, glowMat));\n\n // Planets with proper scaling\n const configs = [\n {\n id: \"mercury\",\n color: 0x8c7853,\n radius: 2439.7,\n distance: 57900000,\n },\n { id: \"venus\", color: 0xffc649, radius: 6051.8, distance: 108200000 },\n { id: \"earth\", color: 0x6b93d6, radius: 6371, distance: 149600000 },\n { id: \"mars\", color: 0xc1440e, radius: 3389.5, distance: 227900000 },\n {\n id: \"jupiter\",\n color: 0xd8ca9d,\n radius: 69911,\n distance: 778500000,\n },\n {\n id: \"saturn\",\n color: 0xf4d59e,\n radius: 58232,\n distance: 1434000000,\n },\n {\n id: \"uranus\",\n color: 0xd1e7e7,\n radius: 25362,\n distance: 2871000000,\n },\n {\n id: \"neptune\",\n color: 0x5b5ddf,\n radius: 24622,\n distance: 4495000000,\n },\n ];\n\n configs.forEach((c) => {\n // Make inner planets larger for visibility\n const visualScale = c.distance < 300000000 ? 15 : 5;\n const planetRadius = c.radius * SIZE_SCALE * visualScale;\n const geo = new THREE.SphereGeometry(planetRadius, 24, 16);\n const mat = new THREE.MeshPhongMaterial({\n color: c.color,\n shininess: 30,\n });\n const mesh = new THREE.Mesh(geo, mat);\n\n const orbitDist = c.distance * DISTANCE_SCALE;\n mesh.position.x = orbitDist;\n mesh.name = c.id;\n mesh.userData = {\n objectId: c.id,\n planetId: c.id,\n isPlanet: true,\n isSelectable: true,\n data: {\n id: c.id,\n name: c.id.charAt(0).toUpperCase() + c.id.slice(1),\n category: \"planet\",\n },\n };\n planetsGroup.add(mesh);\n objectMeshMapRef.current.set(c.id, mesh);\n\n // Saturn's rings\n if (c.id === \"saturn\") {\n const ringGeo = new THREE.RingGeometry(\n planetRadius * 1.4,\n planetRadius * 2.2,\n 32,\n );\n const ringMat = new THREE.MeshBasicMaterial({\n color: 0xc9b896,\n transparent: true,\n opacity: 0.6,\n side: THREE.DoubleSide,\n });\n const ring = new THREE.Mesh(ringGeo, ringMat);\n ring.rotation.x = Math.PI / 2.5;\n ring.position.copy(mesh.position);\n planetsGroup.add(ring);\n }\n\n // Orbit line\n const points: any[] = [];\n for (let i = 0; i <= 64; i++) {\n const angle = (i / 64) * Math.PI * 2;\n points.push(\n new THREE.Vector3(\n orbitDist * Math.cos(angle),\n 0,\n orbitDist * Math.sin(angle),\n ),\n );\n }\n const orbitGeo = new THREE.BufferGeometry().setFromPoints(points);\n const orbitMat = new THREE.LineBasicMaterial({\n color: 0x444466,\n transparent: true,\n opacity: 0.3,\n });\n planetsGroup.add(new THREE.Line(orbitGeo, orbitMat));\n });\n\n // Add a point light at Sun\n const sunLight = new THREE.PointLight(0xffffee, 2, 100000);\n sunLight.position.set(0, 0, 0);\n planetsGroup.add(sunLight);\n },\n [],\n );\n\n // ==========================================================================\n // Create Earth (optimized segments like EarthViewer)\n // ==========================================================================\n\n const createEarth = useCallback((THREE: ThreeModule, scene: any) => {\n const earthGeometry = new THREE.SphereGeometry(\n SCENE_EARTH_RADIUS,\n EARTH_SEGMENTS,\n EARTH_SEGMENTS_V,\n );\n const earthMaterial = new THREE.MeshPhongMaterial({\n color: 0x2244aa,\n shininess: 10,\n });\n\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(\n \"/world.topo.jpg\",\n (texture: any) => {\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.ClampToEdgeWrapping;\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n earthMaterial.map = texture;\n earthMaterial.needsUpdate = true;\n },\n undefined,\n () => {},\n );\n\n const earth = new THREE.Mesh(earthGeometry, earthMaterial);\n earth.rotation.y = -Math.PI / 2 + Math.PI;\n earth.name = \"earth\";\n scene.add(earth);\n earthRef.current = earth;\n }, []);\n\n // ==========================================================================\n // Create Atmosphere (sun-reactive glow)\n // ==========================================================================\n\n const createAtmosphere = useCallback(\n (THREE: ThreeModule, scene: any) => {\n if (!effectiveLayers.atmosphere) return;\n\n // Default sun direction (can be updated via props)\n const defaultSunDir = new THREE.Vector3(1, 0.3, 0.5).normalize();\n\n const atmosphereGeometry = new THREE.SphereGeometry(\n SCENE_EARTH_RADIUS * 1.15,\n 32,\n 16,\n );\n const atmosphereMaterial = new THREE.ShaderMaterial({\n uniforms: {\n uSunDirection: { value: defaultSunDir },\n },\n vertexShader: atmosphereVertexShader,\n fragmentShader: atmosphereFragmentShader,\n blending: THREE.AdditiveBlending,\n side: THREE.BackSide,\n transparent: true,\n depthWrite: false,\n });\n const atmosphere = new THREE.Mesh(\n atmosphereGeometry,\n atmosphereMaterial,\n );\n atmosphere.rotation.y = -Math.PI / 2;\n atmosphere.name = \"atmosphere\";\n scene.add(atmosphere);\n\n // Store ref for dynamic updates\n atmosphereMaterialRef.current = atmosphereMaterial;\n },\n [effectiveLayers.atmosphere],\n );\n\n // ==========================================================================\n // Create Stars (optimized like EarthViewer)\n // ==========================================================================\n\n const createStars = useCallback(\n (THREE: ThreeModule, scene: any) => {\n const starsGeometry = new THREE.BufferGeometry();\n const starsDist = currentView === \"solar-system\" ? 50000000000 : 50000;\n const positions = new Float32Array(STARS_COUNT * 3);\n const opacities = new Float32Array(STARS_COUNT);\n\n for (let i = 0; i < STARS_COUNT; i++) {\n const radius = starsDist + Math.random() * starsDist;\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n\n positions[i * 3] = radius * Math.sin(phi) * Math.cos(theta);\n positions[i * 3 + 1] = radius * Math.sin(phi) * Math.sin(theta);\n positions[i * 3 + 2] = radius * Math.cos(phi);\n opacities[i] = Math.random();\n }\n\n starsGeometry.setAttribute(\n \"position\",\n new THREE.BufferAttribute(positions, 3),\n );\n starsGeometry.setAttribute(\n \"opacity\",\n new THREE.BufferAttribute(opacities, 1),\n );\n\n const starsMaterial = new THREE.ShaderMaterial({\n uniforms: { time: { value: 0 } },\n vertexShader: starsVertexShader,\n fragmentShader: starsFragmentShader,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n });\n\n scene.add(new THREE.Points(starsGeometry, starsMaterial));\n starsMaterialRef.current = starsMaterial;\n },\n [currentView],\n );\n\n // ==========================================================================\n // Create Lighting (simple like EarthViewer)\n // ==========================================================================\n\n const createLighting = useCallback((THREE: ThreeModule, scene: any) => {\n scene.add(new THREE.AmbientLight(0x404040, 0.6));\n const sunLight = new THREE.DirectionalLight(0xffffff, 1.2);\n sunLight.position.set(10000, 5000, 10000);\n scene.add(sunLight);\n }, []);\n\n // ==========================================================================\n // Create Axis Helper\n // ==========================================================================\n\n const createAxisHelper = useCallback((THREE: ThreeModule, scene: any) => {\n const len = SCENE_EARTH_RADIUS * 1.5;\n const group = new THREE.Group();\n\n [\n { color: 0xff3333, dir: [1, 0, 0] },\n { color: 0x33ff33, dir: [0, 1, 0] },\n { color: 0x3333ff, dir: [0, 0, 1] },\n ].forEach(({ color, dir }) => {\n const points = [\n new THREE.Vector3(0, 0, 0),\n new THREE.Vector3(dir[0] * len, dir[1] * len, dir[2] * len),\n ];\n const geo = new THREE.BufferGeometry().setFromPoints(points);\n const mat = new THREE.LineBasicMaterial({ color });\n group.add(new THREE.Line(geo, mat));\n });\n\n scene.add(group);\n }, []);\n\n // ==========================================================================\n // Update Objects\n // ==========================================================================\n\n const updateObjects = useCallback(() => {\n if (!THREE || !objectsGroupRef.current || currentView === \"solar-system\")\n return;\n\n const group = objectsGroupRef.current;\n const meshMap = objectMeshMapRef.current;\n\n // Clear\n while (group.children.length > 0) {\n const child = group.children[0];\n group.remove(child);\n }\n meshMap.clear();\n\n const allObjects: SpaceObject[] = [\n ...satellites,\n ...debris,\n ...stations,\n ...customObjects,\n ];\n\n allObjects.slice(0, maxObjects).forEach((obj) => {\n const categoryLayer =\n obj.category === \"satellite\"\n ? \"satellites\"\n : obj.category === \"debris\"\n ? \"debris\"\n : obj.category === \"station\"\n ? \"stations\"\n : \"satellites\";\n\n if (!effectiveLayers[categoryLayer]) return;\n\n let size = 50;\n if (obj.category === \"station\") size = 100;\n else if (obj.category === \"debris\") size = 25;\n\n const satelliteGroup = createSatelliteShape(THREE, obj.category, size);\n satelliteGroup.position.set(\n obj.position.x,\n obj.position.y,\n obj.position.z,\n );\n satelliteGroup.lookAt(0, 0, 0);\n satelliteGroup.userData = {\n objectId: obj.id,\n category: obj.category,\n data: obj,\n isSelectable: true,\n };\n satelliteGroup.name = obj.id;\n\n group.add(satelliteGroup);\n meshMap.set(obj.id, satelliteGroup);\n });\n }, [\n THREE,\n satellites,\n debris,\n stations,\n customObjects,\n maxObjects,\n effectiveLayers,\n currentView,\n ]);\n\n // ==========================================================================\n // Update Ground Stations\n // ==========================================================================\n\n const updateGroundStations = useCallback(() => {\n if (!THREE || !objectsGroupRef.current || currentView === \"solar-system\")\n return;\n if (!effectiveLayers.groundStations) return;\n\n groundStations.forEach((gs) => {\n const pos = latLonAltToCartesian(gs.latitude, gs.longitude, 0);\n\n // Simple marker\n const geo = new THREE.SphereGeometry(35, 8, 6);\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ffff });\n const marker = new THREE.Mesh(geo, mat);\n marker.position.set(pos.x, pos.y, pos.z);\n marker.userData = {\n objectId: gs.id,\n category: \"groundStation\",\n data: gs,\n isSelectable: true,\n };\n\n objectsGroupRef.current.add(marker);\n objectMeshMapRef.current.set(gs.id, marker);\n\n // Glow ring\n const ringGeo = new THREE.RingGeometry(45, 65, 16);\n const ringMat = new THREE.MeshBasicMaterial({\n color: 0x00ffff,\n transparent: true,\n opacity: 0.4,\n side: THREE.DoubleSide,\n });\n const ring = new THREE.Mesh(ringGeo, ringMat);\n ring.position.set(pos.x, pos.y, pos.z);\n ring.lookAt(0, 0, 0);\n objectsGroupRef.current.add(ring);\n });\n }, [THREE, groundStations, effectiveLayers.groundStations, currentView]);\n\n // ==========================================================================\n // Update Coverage (Realistic satellite-to-ground cones + legacy region cones)\n // ==========================================================================\n\n const updateCoverage = useCallback(() => {\n const T = threeRef.current;\n if (!T || !conesGroupRef.current || currentView === \"solar-system\")\n return;\n\n // Clear existing\n while (conesGroupRef.current.children.length > 0) {\n conesGroupRef.current.remove(conesGroupRef.current.children[0]);\n }\n\n if (!effectiveLayers.coverage) return;\n\n // ========================================\n // Satellite Coverage Visualization (NASA-style)\n // Renders coverage data provided by Zendir SDK\n // ========================================\n satelliteCoverages.forEach((coverage) => {\n // Get satellite position\n let satPos: any;\n if (coverage.satellitePosition) {\n satPos = new T.Vector3(\n coverage.satellitePosition.x,\n coverage.satellitePosition.y,\n coverage.satellitePosition.z,\n );\n } else {\n const satMesh = objectMeshMapRef.current.get(coverage.satelliteId);\n if (!satMesh) return;\n satPos = satMesh.position.clone();\n }\n\n const satDistance = satPos.length();\n const coneColor = new T.Color(coverage.color || \"#22d3ee\");\n const highlightColor = new T.Color(\n coverage.color || \"#22d3ee\",\n ).multiplyScalar(1.3);\n\n // ====== 1. Render footprint border only (no filled plane - it cuts through sphere) ======\n if (\n coverage.footprintPolygon &&\n coverage.footprintPolygon.length >= 3 &&\n coverage.showFootprint !== false\n ) {\n const cornerPoints = coverage.footprintPolygon.map((pt) =>\n latLonAltToCartesian(pt.latitude, pt.longitude, 0),\n );\n\n // Curved border (follows sphere curvature via SLERP)\n const borderPts = subdivideSphericalPolygon(\n cornerPoints,\n SPHERICAL_SUBDIVISIONS,\n SCENE_EARTH_RADIUS * 1.003,\n ).map((pt) => new T.Vector3(pt.x, pt.y, pt.z));\n borderPts.push(borderPts[0].clone());\n const borderGeo = new T.BufferGeometry().setFromPoints(borderPts);\n const borderMat = new T.LineBasicMaterial({\n color: highlightColor,\n transparent: true,\n opacity: 0.95,\n linewidth: 2,\n });\n conesGroupRef.current.add(new T.Line(borderGeo, borderMat));\n\n // Outer glow (slightly larger radius for glow effect)\n const glowPts = subdivideSphericalPolygon(\n cornerPoints,\n SPHERICAL_SUBDIVISIONS,\n SCENE_EARTH_RADIUS * 1.005,\n ).map((pt) => new T.Vector3(pt.x, pt.y, pt.z));\n glowPts.push(glowPts[0].clone());\n const glowGeo = new T.BufferGeometry().setFromPoints(glowPts);\n const glowMat = new T.LineBasicMaterial({\n color: coneColor,\n transparent: true,\n opacity: 0.4,\n });\n conesGroupRef.current.add(new T.Line(glowGeo, glowMat));\n\n // Cone lines from satellite to corners (lines only, no filled surface)\n if (coverage.showCone !== false) {\n for (const corner of cornerPoints) {\n const edgePt = new T.Vector3(corner.x, corner.y, corner.z)\n .normalize()\n .multiplyScalar(SCENE_EARTH_RADIUS);\n const lineGeo = new T.BufferGeometry().setFromPoints([\n satPos,\n edgePt,\n ]);\n const lineMat = new T.LineBasicMaterial({\n color: coneColor,\n transparent: true,\n opacity: 0.4,\n });\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\n }\n }\n }\n\n // ====== 2. Simple cone (when no polygon, just halfAngle) ======\n else if (coverage.halfAngle && coverage.showCone !== false) {\n const halfAngleRad = coverage.halfAngle * (Math.PI / 180);\n const coneHeight = satDistance - SCENE_EARTH_RADIUS * 0.98;\n const coneRadius = coneHeight * Math.tan(halfAngleRad);\n\n // Cone mesh\n const coneGeo = new T.ConeGeometry(\n coneRadius,\n coneHeight,\n 48,\n 1,\n true,\n );\n const coneMat = new T.MeshBasicMaterial({\n color: coneColor,\n transparent: true,\n opacity: 0.12,\n side: T.DoubleSide,\n depthWrite: false,\n });\n const cone = new T.Mesh(coneGeo, coneMat);\n cone.position.copy(satPos);\n cone.lookAt(0, 0, 0);\n cone.rotateX(Math.PI / 2);\n cone.translateY(-coneHeight / 2);\n conesGroupRef.current.add(cone);\n\n // Footprint circle\n if (coverage.showFootprint !== false) {\n const nadirDir = satPos.clone().normalize();\n const footprintPos = nadirDir\n .clone()\n .multiplyScalar(SCENE_EARTH_RADIUS * 1.003);\n const footprintRadius =\n coneRadius * (SCENE_EARTH_RADIUS / satDistance);\n\n // Filled circle\n const footGeo = new T.CircleGeometry(footprintRadius, 64);\n const footMat = new T.MeshBasicMaterial({\n color: coneColor,\n transparent: true,\n opacity: 0.3,\n side: T.DoubleSide,\n depthWrite: false,\n });\n const footprint = new T.Mesh(footGeo, footMat);\n footprint.position.copy(footprintPos);\n footprint.lookAt(satPos);\n conesGroupRef.current.add(footprint);\n\n // Edge ring\n const ringGeo = new T.RingGeometry(\n footprintRadius * 0.97,\n footprintRadius,\n 64,\n );\n const ringMat = new T.MeshBasicMaterial({\n color: highlightColor,\n transparent: true,\n opacity: 0.7,\n side: T.DoubleSide,\n });\n const ring = new T.Mesh(ringGeo, ringMat);\n ring.position.copy(footprintPos);\n ring.lookAt(satPos);\n conesGroupRef.current.add(ring);\n }\n }\n\n // ====== 3. Nadir line ======\n if (coverage.showNadirLine !== false) {\n let nadirGroundPoint: any;\n if (coverage.nadirPoint) {\n const np = latLonAltToCartesian(\n coverage.nadirPoint.latitude,\n coverage.nadirPoint.longitude,\n 0,\n );\n nadirGroundPoint = new T.Vector3(np.x, np.y, np.z);\n } else {\n nadirGroundPoint = satPos\n .clone()\n .normalize()\n .multiplyScalar(SCENE_EARTH_RADIUS);\n }\n const lineGeo = new T.BufferGeometry().setFromPoints([\n satPos,\n nadirGroundPoint,\n ]);\n const lineMat = new T.LineBasicMaterial({\n color: highlightColor,\n transparent: true,\n opacity: 0.7,\n });\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\n }\n });\n\n // ========================================\n // Legacy Region-based Visibility Cones\n // ========================================\n visibilityCones.forEach((cone) => {\n const pos = latLonAltToCartesian(\n cone.center.latitude,\n cone.center.longitude,\n 0,\n );\n\n const coneHeight = 1000 * KM_TO_SCENE;\n const minElev = cone.minElevation || 10;\n const coneRadius =\n coneHeight * Math.tan((90 - minElev) * (Math.PI / 180) * 0.4);\n const coneColor = new T.Color(cone.color || \"#22d3ee\");\n\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 24, 1, true);\n const coneMat = new T.MeshBasicMaterial({\n color: coneColor,\n transparent: true,\n opacity: cone.opacity || 0.12,\n side: T.DoubleSide,\n depthWrite: false,\n });\n\n const coneMesh = new T.Mesh(coneGeo, coneMat);\n coneMesh.position.set(pos.x, pos.y, pos.z);\n coneMesh.lookAt(0, 0, 0);\n coneMesh.rotateX(-Math.PI / 2);\n coneMesh.translateY(coneHeight / 2);\n conesGroupRef.current.add(coneMesh);\n\n // Footprint ring\n const footGeo = new T.RingGeometry(\n coneRadius * 0.7,\n coneRadius * 0.9,\n 32,\n );\n const footMat = new T.MeshBasicMaterial({\n color: coneColor,\n transparent: true,\n opacity: 0.3,\n side: T.DoubleSide,\n });\n const foot = new T.Mesh(footGeo, footMat);\n foot.position.set(pos.x * 1.002, pos.y * 1.002, pos.z * 1.002);\n foot.lookAt(0, 0, 0);\n conesGroupRef.current.add(foot);\n });\n }, [\n visibilityCones,\n satelliteCoverages,\n effectiveLayers.coverage,\n currentView,\n ]);\n\n // ==========================================================================\n // Update Communication Links\n // ==========================================================================\n\n const updateLinks = useCallback(() => {\n if (!THREE || !linksGroupRef.current || currentView === \"solar-system\")\n return;\n\n while (linksGroupRef.current.children.length > 0) {\n linksGroupRef.current.remove(linksGroupRef.current.children[0]);\n }\n\n communicationLinks.forEach((link) => {\n const fromMesh = objectMeshMapRef.current.get(link.fromId);\n const toMesh = objectMeshMapRef.current.get(link.toId);\n if (!fromMesh || !toMesh) return;\n\n const color =\n link.color || (link.status === \"active\" ? \"#00ff88\" : \"#666666\");\n const geo = new THREE.BufferGeometry().setFromPoints([\n fromMesh.position.clone(),\n toMesh.position.clone(),\n ]);\n\n // Dashed animated line\n const mat = new THREE.LineDashedMaterial({\n color: new THREE.Color(color),\n transparent: true,\n opacity: link.status === \"active\" ? 0.8 : 0.4,\n dashSize: 30,\n gapSize: 20,\n });\n\n const line = new THREE.Line(geo, mat);\n line.computeLineDistances(); // Required for dashed lines - must be on Line, not geometry\n line.userData = { isAnimatedLink: true };\n linksGroupRef.current.add(line);\n });\n }, [THREE, communicationLinks, currentView]);\n\n // ==========================================================================\n // Update Orbits\n // ==========================================================================\n\n const updateOrbits = useCallback(() => {\n if (!THREE || !orbitsGroupRef.current || currentView === \"solar-system\")\n return;\n\n while (orbitsGroupRef.current.children.length > 0) {\n orbitsGroupRef.current.remove(orbitsGroupRef.current.children[0]);\n }\n\n if (!effectiveLayers.orbits) return;\n\n orbitPaths.forEach((path) => {\n if (path.points.length < 2) return;\n const points = path.points.map((p) => new THREE.Vector3(p.x, p.y, p.z));\n const geo = new THREE.BufferGeometry().setFromPoints(points);\n const mat = new THREE.LineBasicMaterial({\n color: new THREE.Color(path.color || \"#888888\"),\n transparent: true,\n opacity: 0.5,\n });\n orbitsGroupRef.current.add(new THREE.Line(geo, mat));\n });\n }, [THREE, orbitPaths, effectiveLayers.orbits, currentView]);\n\n // ==========================================================================\n // Mouse Handlers\n // ==========================================================================\n\n const handleMouseMove = useCallback((event: MouseEvent) => {\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current)\n return;\n\n const rect = containerRef.current.getBoundingClientRect();\n mouseRef.current.set(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\n );\n\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\n\n const selectables: any[] = [];\n objectsGroupRef.current?.traverse((obj: any) => {\n if (obj.userData?.isSelectable) selectables.push(obj);\n });\n\n const intersects = raycasterRef.current.intersectObjects(\n selectables,\n true,\n );\n\n if (intersects.length > 0) {\n let hit = intersects[0].object;\n while (hit && !hit.userData?.objectId) hit = hit.parent;\n\n if (hit?.userData) {\n setHoverTooltip({\n visible: true,\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n object: hit.userData.data,\n });\n if (containerRef.current)\n containerRef.current.style.cursor = \"pointer\";\n return;\n }\n }\n\n setHoverTooltip({ visible: false, x: 0, y: 0, object: null });\n if (containerRef.current) containerRef.current.style.cursor = \"grab\";\n }, []);\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (\n !containerRef.current ||\n !raycasterRef.current ||\n !cameraRef.current\n )\n return;\n\n const rect = containerRef.current.getBoundingClientRect();\n mouseRef.current.set(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\n );\n\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\n\n // Check objects group\n const selectables: any[] = [];\n objectsGroupRef.current?.traverse((obj: any) => {\n if (obj.userData?.isSelectable) selectables.push(obj);\n });\n // Also check planets group for solar system view\n planetsGroupRef.current?.traverse((obj: any) => {\n if (obj.userData?.isSelectable) selectables.push(obj);\n });\n\n const intersects = raycasterRef.current.intersectObjects(\n selectables,\n true,\n );\n\n if (intersects.length > 0) {\n let hit = intersects[0].object;\n while (hit && !hit.userData?.objectId) hit = hit.parent;\n\n if (hit?.userData?.objectId) {\n const objectId = hit.userData.objectId;\n setSelection({\n selectedId: objectId,\n selectedObject: hit.userData.data,\n hoveredId: null,\n });\n callbacks?.onSelect?.(hit.userData.data);\n\n // Fly to the clicked object\n flyTo(objectId, { animate: true });\n return;\n }\n }\n\n setSelection({\n selectedId: null,\n selectedObject: null,\n hoveredId: null,\n });\n callbacks?.onSelect?.(null);\n },\n [callbacks],\n );\n\n // ==========================================================================\n // Fly To Object (comprehensive camera navigation)\n // ==========================================================================\n\n const flyTo = useCallback(\n (\n objectId: string,\n options?: {\n zoom?: number;\n animate?: boolean;\n distance?: number;\n offset?: Vector3D;\n },\n ) => {\n if (!THREE || !cameraRef.current || !controlsRef.current) return;\n\n const mesh = objectMeshMapRef.current.get(objectId);\n if (!mesh) {\n if (import.meta.env.DEV) {\n console.warn(`flyTo: Object \"${objectId}\" not found`);\n }\n return;\n }\n\n const targetPos = mesh.position.clone();\n const camera = cameraRef.current;\n const controls = controlsRef.current;\n const category = mesh.userData?.category;\n const isGroundStation = category === \"groundStation\";\n\n // Determine viewing distance based on object type\n let viewDistance: number;\n if (options?.distance) {\n viewDistance = options.distance;\n } else {\n // Auto-calculate based on object size/type\n const isPlanet = mesh.userData?.isPlanet;\n const targetDist = targetPos.length();\n\n if (isPlanet) {\n // For planets, get closer based on planet size\n const planetRadius = mesh.geometry?.parameters?.radius || 100;\n viewDistance = planetRadius * 5;\n } else if (isGroundStation) {\n // Ground stations - close view from above\n viewDistance = 200;\n } else if (category === \"station\") {\n // Space stations - extremely close side view\n viewDistance = 80;\n } else if (category === \"satellite\") {\n // Satellites - extremely close side view\n viewDistance = 60;\n } else if (targetDist > SCENE_EARTH_RADIUS * 2) {\n // Far object (high orbit) - close view\n viewDistance = 150;\n } else {\n // Near-Earth object - very close view\n viewDistance = 100 * (options?.zoom || 1);\n }\n }\n\n // Calculate camera position - offset from object\n let cameraTargetPos: any;\n if (options?.offset) {\n cameraTargetPos = targetPos\n .clone()\n .add(\n new THREE.Vector3(\n options.offset.x,\n options.offset.y,\n options.offset.z,\n ),\n );\n } else if (isGroundStation) {\n // Ground station: view from above (radially outward from Earth center)\n const upDir = targetPos.clone().normalize();\n cameraTargetPos = targetPos\n .clone()\n .add(upDir.multiplyScalar(viewDistance));\n } else {\n // Satellites/stations: view from the side\n const dir = targetPos.clone().normalize();\n const side = new THREE.Vector3(-dir.z, 0.2, dir.x).normalize();\n cameraTargetPos = targetPos\n .clone()\n .add(side.multiplyScalar(viewDistance));\n }\n\n if (options?.animate !== false) {\n focusTransitionRef.current = {\n startTime: Date.now(),\n startPos: {\n x: camera.position.x,\n y: camera.position.y,\n z: camera.position.z,\n },\n targetPos: {\n x: cameraTargetPos.x,\n y: cameraTargetPos.y,\n z: cameraTargetPos.z,\n },\n startTarget: {\n x: controls.target.x,\n y: controls.target.y,\n z: controls.target.z,\n },\n targetTarget: { x: targetPos.x, y: targetPos.y, z: targetPos.z },\n duration: CAMERA_TRANSITION_DURATION,\n isActive: true,\n };\n } else {\n camera.position.copy(cameraTargetPos);\n controls.target.copy(targetPos);\n controls.update();\n }\n\n // Fire callback\n callbacks?.onFocus?.(mesh.userData?.data || { id: objectId });\n },\n [THREE, callbacks],\n );\n\n // Alias for backward compatibility\n const focusOn = flyTo;\n\n // ==========================================================================\n // Animation\n // ==========================================================================\n\n const animate = useCallback(() => {\n // Guard: Only one animation loop should run at a time\n if (!isAnimatingRef.current) return;\n if (!rendererRef.current || !sceneRef.current || !cameraRef.current)\n return;\n\n const camera = cameraRef.current;\n const controls = controlsRef.current;\n\n // Transition\n if (focusTransitionRef.current?.isActive) {\n const t = focusTransitionRef.current;\n const progress = Math.min((Date.now() - t.startTime) / t.duration, 1);\n const e = easeOutCubic(progress);\n\n camera.position.x = t.startPos.x + (t.targetPos.x - t.startPos.x) * e;\n camera.position.y = t.startPos.y + (t.targetPos.y - t.startPos.y) * e;\n camera.position.z = t.startPos.z + (t.targetPos.z - t.startPos.z) * e;\n\n controls.target.x =\n t.startTarget.x + (t.targetTarget.x - t.startTarget.x) * e;\n controls.target.y =\n t.startTarget.y + (t.targetTarget.y - t.startTarget.y) * e;\n controls.target.z =\n t.startTarget.z + (t.targetTarget.z - t.startTarget.z) * e;\n\n if (progress >= 1) t.isActive = false;\n }\n\n if (controls) controls.update();\n\n timeRef.current += 0.016;\n if (starsMaterialRef.current)\n starsMaterialRef.current.uniforms.time.value = timeRef.current;\n\n // Animate communication link dashes (moving dotted lines)\n if (linksGroupRef.current) {\n linksGroupRef.current.children.forEach((child: any) => {\n if (child.userData?.isAnimatedLink && child.material) {\n child.material.dashOffset -= 1.5; // Speed of animation\n }\n });\n }\n\n rendererRef.current.render(sceneRef.current, camera);\n animationRef.current = requestAnimationFrame(animate);\n }, []);\n\n // ==========================================================================\n // Imperative Handle\n // ==========================================================================\n\n useImperativeHandle(\n ref,\n () => ({\n focusOn,\n flyTo,\n setView: (mode: ViewMode) => setCurrentView(mode),\n setTime: () => {},\n setTimeScale: () => {},\n togglePlay: () => {},\n setLayerVisibility: (layer: keyof LayerVisibility, visible: boolean) =>\n setLayers((prev) => ({ ...prev, [layer]: visible })),\n getCameraState: (): CameraState => {\n if (!cameraRef.current)\n return {\n position: { x: 0, y: 0, z: 10000 },\n target: { x: 0, y: 0, z: 0 },\n up: { x: 0, y: 1, z: 0 },\n fov: 45,\n near: 0.1,\n far: 100000,\n };\n const c = cameraRef.current;\n return {\n position: { x: c.position.x, y: c.position.y, z: c.position.z },\n target: {\n x: controlsRef.current?.target.x || 0,\n y: controlsRef.current?.target.y || 0,\n z: controlsRef.current?.target.z || 0,\n },\n up: { x: c.up.x, y: c.up.y, z: c.up.z },\n fov: c.fov,\n near: c.near,\n far: c.far,\n };\n },\n setCameraState: (state: Partial<CameraState>) => {\n if (!cameraRef.current) return;\n if (state.position)\n cameraRef.current.position.set(\n state.position.x,\n state.position.y,\n state.position.z,\n );\n if (state.target && controlsRef.current)\n controlsRef.current.target.set(\n state.target.x,\n state.target.y,\n state.target.z,\n );\n },\n exportImage: (format: \"png\" | \"jpeg\" = \"png\"): string =>\n rendererRef.current?.domElement.toDataURL(`image/${format}`) || \"\",\n exportScene: (): Blob => new Blob(),\n getVisibleObjects: (): SpaceObject[] => [\n ...satellites,\n ...debris,\n ...stations,\n ...customObjects,\n ],\n findObjects: (q: string): SpaceObject[] =>\n [...satellites, ...debris, ...stations, ...customObjects].filter(\n (obj) =>\n obj.name.toLowerCase().includes(q.toLowerCase()) ||\n obj.id.toLowerCase().includes(q.toLowerCase()),\n ),\n addObject: () => {},\n removeObject: () => {},\n updateObject: () => {},\n measureDistance: (\n _from: string | Vector3D,\n _to: string | Vector3D,\n ): number => 0,\n }),\n [satellites, debris, stations, customObjects, focusOn],\n );\n\n // ==========================================================================\n // Effects\n // ==========================================================================\n\n useEffect(() => {\n if (THREE && OrbitControlsClass) return initScene();\n }, [THREE, OrbitControlsClass, initScene]);\n\n useEffect(() => {\n if (!isLoading && THREE) {\n // Cancel any existing animation loop first (prevents stacking)\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n\n // Start animation loop with guard\n isAnimatingRef.current = true;\n animate();\n\n return () => {\n // Stop animation loop cleanly\n isAnimatingRef.current = false;\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n };\n }\n }, [isLoading, THREE, animate]);\n\n useEffect(() => {\n if (THREE && !isLoading) {\n updateObjects();\n updateGroundStations();\n updateCoverage();\n updateOrbits();\n updateLinks();\n }\n }, [\n THREE,\n isLoading,\n updateObjects,\n updateGroundStations,\n updateCoverage,\n updateOrbits,\n updateLinks,\n ]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || isLoading) return;\n container.addEventListener(\"mousemove\", handleMouseMove);\n container.addEventListener(\"click\", handleClick);\n return () => {\n container.removeEventListener(\"mousemove\", handleMouseMove);\n container.removeEventListener(\"click\", handleClick);\n };\n }, [isLoading, handleMouseMove, handleClick]);\n\n useEffect(() => {\n const handleResize = () => {\n if (!containerRef.current || !rendererRef.current || !cameraRef.current)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const h = typeof height === \"number\" ? height : rect.height;\n cameraRef.current.aspect = rect.width / h;\n cameraRef.current.updateProjectionMatrix();\n rendererRef.current.setSize(rect.width, h);\n };\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, [height]);\n\n useEffect(() => {\n if (focusedObjectId) focusOn(focusedObjectId, { animate: true });\n }, [focusedObjectId, focusOn]);\n\n // Update sun direction for atmosphere glow (from Zendir SDK)\n useEffect(() => {\n if (THREE && atmosphereMaterialRef.current && sunDirection) {\n const dir = new THREE.Vector3(\n sunDirection.x,\n sunDirection.y,\n sunDirection.z,\n ).normalize();\n atmosphereMaterialRef.current.uniforms.uSunDirection.value = dir;\n }\n }, [THREE, sunDirection]);\n\n // Update planet positions from Zendir SDK\n useEffect(() => {\n if (!THREE || !planetPositions || !planetsGroupRef.current) return;\n\n planetsGroupRef.current.traverse((child: any) => {\n if (\n child.userData?.planetId &&\n planetPositions[child.userData.planetId]\n ) {\n const pos = planetPositions[child.userData.planetId];\n child.position.set(pos.x, pos.y, pos.z);\n }\n });\n }, [THREE, planetPositions]);\n\n // ==========================================================================\n // Render\n // ==========================================================================\n\n if (!webglCapabilities.available) {\n return (\n <div\n className={`zenspace3d-fallback ${className}`}\n style={{\n width,\n height: typeof height === \"number\" ? height : 600,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#030508\",\n borderRadius: 8,\n fontFamily: \"ui-monospace, monospace\",\n ...style,\n }}\n >\n <div style={{ marginBottom: 16 }}>\n <AstroIcon\n name=\"public\"\n size=\"large\"\n label=\"Globe\"\n style={{ color: \"#22d3ee\", opacity: 0.5 }}\n />\n </div>\n <div\n style={{\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\n fontSize: 14,\n }}\n >\n WebGL is not available\n </div>\n </div>\n );\n }\n\n if (error)\n return (\n <div\n style={{\n width,\n height,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#0a0a0f\",\n color: \"#ff4444\",\n }}\n >\n <p>Error: {error}</p>\n </div>\n );\n\n return (\n <div\n className={`zenspace3d ${className}`}\n style={{\n width,\n height: typeof height === \"number\" ? height : \"100%\",\n position: \"relative\",\n backgroundColor: \"#000\",\n borderRadius: 8,\n overflow: \"hidden\",\n cursor: \"grab\",\n ...style,\n }}\n >\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\n\n {isLoading && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(0,0,0,0.9)\",\n }}\n >\n <div style={{ color: \"#22d3ee\", fontSize: 14 }}>Loading...</div>\n </div>\n )}\n\n {showTools && !isLoading && (\n <div\n style={{\n position: \"absolute\",\n top: 12,\n left: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n <LayerBtn\n icon=\"satellite\"\n label=\"Satellites\"\n active={layers.satellites}\n onClick={() =>\n setLayers((l) => ({ ...l, satellites: !l.satellites }))\n }\n />\n <LayerBtn\n icon=\"home\"\n label=\"Stations\"\n active={layers.stations}\n onClick={() =>\n setLayers((l) => ({ ...l, stations: !l.stations }))\n }\n />\n <LayerBtn\n icon=\"antenna\"\n label=\"Ground\"\n active={layers.groundStations}\n onClick={() =>\n setLayers((l) => ({ ...l, groundStations: !l.groundStations }))\n }\n />\n <LayerBtn\n icon=\"timeline\"\n label=\"Orbits\"\n active={layers.orbits}\n onClick={() => setLayers((l) => ({ ...l, orbits: !l.orbits }))}\n />\n <LayerBtn\n icon=\"signal-cellular-4-bar\"\n label=\"Coverage\"\n active={layers.coverage}\n onClick={() =>\n setLayers((l) => ({ ...l, coverage: !l.coverage }))\n }\n />\n </div>\n )}\n\n {!isLoading && (\n <ObjectLegend\n currentView={currentView}\n satellites={satellites}\n stations={stations}\n groundStations={groundStations}\n onObjectClick={(id, objectData) => {\n // Same behavior as clicking in 3D: select, callback, fly\n setSelection({\n selectedId: id,\n selectedObject: objectData,\n hoveredId: null,\n });\n callbacks?.onSelect?.(objectData);\n flyTo(id, { animate: true });\n }}\n />\n )}\n\n {hoverTooltip.visible && hoverTooltip.object && (\n <div\n style={{\n position: \"absolute\",\n left: hoverTooltip.x + 15,\n top: hoverTooltip.y - 10,\n backgroundColor: \"rgba(20, 25, 35, 0.95)\",\n color: \"#e4e4e7\",\n padding: \"10px 14px\",\n borderRadius: 4,\n fontSize: 12,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.5)\",\n pointerEvents: \"none\",\n zIndex: 100,\n minWidth: 140,\n }}\n >\n <div style={{ color: \"#ffffff\", fontWeight: 500, marginBottom: 4 }}>\n {hoverTooltip.object.name ||\n hoverTooltip.object.targetName ||\n \"Unknown\"}\n </div>\n {hoverTooltip.object.category && (\n <div style={{ color: \"#9ca3af\", fontSize: 11 }}>\n {hoverTooltip.object.category}\n </div>\n )}\n {hoverTooltip.object.overpassTime && (\n <div style={{ color: \"#9ca3af\", fontSize: 11, marginTop: 4 }}>\n Overpass time: {hoverTooltip.object.overpassTime}\n </div>\n )}\n </div>\n )}\n\n {/* Overpass labels removed - now shown only on hover */}\n\n {showInfoPanel && selection.selectedObject && (\n <div\n style={{\n position: \"absolute\",\n bottom: 16,\n right: 12,\n backgroundColor: \"rgba(0,0,0,0.9)\",\n color: \"#e4e4e7\",\n padding: \"14px 18px\",\n borderRadius: 10,\n fontSize: 12,\n fontFamily: \"ui-monospace, monospace\",\n border: \"1px solid rgba(34,211,238,0.3)\",\n minWidth: 180,\n }}\n >\n <div style={{ color: \"#22d3ee\", fontWeight: 500, marginBottom: 8 }}>\n {selection.selectedObject.name}\n </div>\n <div\n style={{\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\n fontSize: 10,\n }}\n >\n {selection.selectedObject.category}\n </div>\n <button\n onClick={() =>\n setSelection({\n selectedId: null,\n selectedObject: null,\n hoveredId: null,\n })\n }\n style={{\n marginTop: 10,\n padding: \"5px 10px\",\n backgroundColor: \"rgba(255,255,255,0.1)\",\n border: \"none\",\n borderRadius: 4,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n fontSize: 10,\n width: \"100%\",\n }}\n >\n Close\n </button>\n </div>\n )}\n\n {!isLoading && (\n <div\n style={{\n position: \"absolute\",\n bottom: 12,\n left: 12,\n backgroundColor: \"rgba(0,0,0,0.5)\",\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\n padding: \"5px 10px\",\n borderRadius: 6,\n fontSize: 10,\n }}\n >\n Drag to rotate • Scroll to zoom\n </div>\n )}\n </div>\n );\n },\n);\n\n// =============================================================================\n// Sub-Components\n// =============================================================================\n\nfunction LayerBtn({\n icon,\n label,\n active,\n onClick,\n}: {\n icon: AstroIconName;\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n onClick={onClick}\n aria-label={`Toggle ${label} layer`}\n aria-pressed={active}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 10px\",\n backgroundColor: active ? \"rgba(34,211,238,0.15)\" : \"rgba(0,0,0,0.7)\",\n border: active\n ? \"1px solid rgba(34,211,238,0.4)\"\n : \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 6,\n cursor: \"pointer\",\n fontSize: \"0.6875rem\", // 11px in rem\n color: active ? \"#22d3ee\" : \"#b8bcc8\", // WCAG: improved contrast from #71717a\n minWidth: 110,\n }}\n >\n <span aria-hidden=\"true\">\n <AstroIcon name={icon} size=\"extra-small\" label=\"\" />\n </span>\n <span>{label}</span>\n </button>\n );\n}\n\nfunction _OverpassLabel({\n overpass,\n index,\n}: {\n overpass: OverpassInfo;\n index: number;\n}) {\n return (\n <div\n style={{\n position: \"absolute\",\n top: 70 + index * 60,\n left: \"28%\",\n backgroundColor: \"rgba(0,0,0,0.85)\",\n color: \"#e4e4e7\",\n padding: \"8px 12px\",\n borderRadius: 6,\n fontSize: 11,\n fontFamily: \"ui-monospace, monospace\",\n border: \"1px solid rgba(34,211,238,0.3)\",\n pointerEvents: \"none\",\n }}\n >\n <div style={{ fontWeight: 500, marginBottom: 2 }}>\n {overpass.targetName}\n </div>\n <div style={{ color: \"#22d3ee\" }}>\n Overpass: {formatDuration(overpass.timeToOverpass)}\n </div>\n </div>\n );\n}\n\nfunction ObjectLegend({\n currentView,\n satellites,\n stations,\n groundStations,\n onObjectClick,\n}: {\n currentView: string;\n satellites: any[];\n stations: any[];\n groundStations: any[];\n onObjectClick: (id: string, objectData: any) => void;\n}) {\n const [hoveredSection, setHoveredSection] = React.useState<string | null>(\n null,\n );\n const [pinnedSection, setPinnedSection] = React.useState<string | null>(null);\n\n // Show section if hovered OR pinned\n const isExpanded = (section: string) =>\n hoveredSection === section || pinnedSection === section;\n\n // Click toggles pin state\n const togglePin = (section: string) => {\n setPinnedSection((prev) => (prev === section ? null : section));\n };\n\n const sectionStyle: React.CSSProperties = {\n cursor: \"pointer\",\n padding: \"4px 0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n transition: \"background-color 0.15s\",\n };\n\n const itemStyle: React.CSSProperties = {\n padding: \"3px 8px\",\n marginLeft: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n fontSize: 10,\n color: \"#a1a1aa\",\n transition: \"all 0.15s\",\n };\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: 12,\n right: 12,\n backgroundColor: \"rgba(0,0,0,0.85)\",\n color: \"#e4e4e7\",\n padding: \"10px 14px\",\n borderRadius: 8,\n fontSize: 11,\n fontFamily: \"ui-monospace, monospace\",\n minWidth: 160,\n maxHeight: 400,\n overflowY: \"auto\",\n }}\n >\n <div\n style={{\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\n fontSize: 10,\n marginBottom: 8,\n }}\n >\n {currentView === \"solar-system\" ? \"Solar System\" : \"Earth Orbit\"}\n </div>\n\n {satellites.length > 0 && (\n <div\n onMouseEnter={() => setHoveredSection(\"satellites\")}\n onMouseLeave={() => setHoveredSection(null)}\n >\n <div\n style={{\n ...sectionStyle,\n backgroundColor: isExpanded(\"satellites\")\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n }}\n onClick={() => togglePin(\"satellites\")}\n >\n <span>\n <span style={{ color: \"#00ff88\" }}>●</span> {satellites.length}{\" \"}\n Satellites\n </span>\n <span\n style={{\n color: pinnedSection === \"satellites\" ? \"#00ff88\" : \"#666\",\n fontSize: 9,\n }}\n >\n {isExpanded(\"satellites\") ? \"▼\" : \"▶\"}\n {pinnedSection === \"satellites\" ? (\n <>\n <AstroIcon\n name=\"bookmark\"\n size=\"extra-small\"\n label=\"\"\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\n />\n </>\n ) : null}\n </span>\n </div>\n {isExpanded(\"satellites\") && (\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\n {satellites.map((sat) => (\n <div\n key={sat.id}\n style={itemStyle}\n onClick={(e) => {\n e.stopPropagation();\n onObjectClick(sat.id, sat);\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n \"rgba(0,255,136,0.15)\";\n e.currentTarget.style.color = \"#00ff88\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n >\n {sat.name || sat.id}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {stations.length > 0 && (\n <div\n onMouseEnter={() => setHoveredSection(\"stations\")}\n onMouseLeave={() => setHoveredSection(null)}\n >\n <div\n style={{\n ...sectionStyle,\n backgroundColor: isExpanded(\"stations\")\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n }}\n onClick={() => togglePin(\"stations\")}\n >\n <span>\n <span style={{ color: \"#ffd700\" }}>●</span> {stations.length}{\" \"}\n Stations\n </span>\n <span\n style={{\n color: pinnedSection === \"stations\" ? \"#ffd700\" : \"#666\",\n fontSize: 9,\n }}\n >\n {isExpanded(\"stations\") ? \"▼\" : \"▶\"}\n {pinnedSection === \"stations\" ? (\n <>\n <AstroIcon\n name=\"bookmark\"\n size=\"extra-small\"\n label=\"\"\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\n />\n </>\n ) : null}\n </span>\n </div>\n {isExpanded(\"stations\") && (\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\n {stations.map((st) => (\n <div\n key={st.id}\n style={itemStyle}\n onClick={(e) => {\n e.stopPropagation();\n onObjectClick(st.id, st);\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n \"rgba(255,215,0,0.15)\";\n e.currentTarget.style.color = \"#ffd700\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n >\n {st.name || st.id}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {groundStations.length > 0 && (\n <div\n onMouseEnter={() => setHoveredSection(\"groundStations\")}\n onMouseLeave={() => setHoveredSection(null)}\n >\n <div\n style={{\n ...sectionStyle,\n backgroundColor: isExpanded(\"groundStations\")\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n }}\n onClick={() => togglePin(\"groundStations\")}\n >\n <span>\n <span style={{ color: \"#00ffff\" }}>▲</span>{\" \"}\n {groundStations.length} Ground Stations\n </span>\n <span\n style={{\n color: pinnedSection === \"groundStations\" ? \"#00ffff\" : \"#666\",\n fontSize: 9,\n }}\n >\n {isExpanded(\"groundStations\") ? \"▼\" : \"▶\"}\n {pinnedSection === \"groundStations\" ? (\n <>\n <AstroIcon\n name=\"bookmark\"\n size=\"extra-small\"\n label=\"\"\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\n />\n </>\n ) : null}\n </span>\n </div>\n {isExpanded(\"groundStations\") && (\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\n {groundStations.map((gs) => (\n <div\n key={gs.id}\n style={itemStyle}\n onClick={(e) => {\n e.stopPropagation();\n onObjectClick(gs.id, gs);\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n \"rgba(0,255,255,0.15)\";\n e.currentTarget.style.color = \"#00ffff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n >\n {gs.name || gs.id}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default ZenSpace3D;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ZenSpace3D.js","names":[],"sources":["../../../src/react/3d/ZenSpace3D.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ZenSpace3D Component (Optimized)\r\n *\r\n * Professional 3D space visualization with smooth interactions.\r\n * Optimized for performance with settings from EarthViewer.\r\n */\r\n\r\nimport React, {\r\n useRef,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useImperativeHandle,\r\n forwardRef,\r\n useMemo,\r\n} from \"react\";\r\nimport { useTheme } from \"../theme\";\r\nimport { AstroIcon, type AstroIconName } from \"../core/display/AstroIcon\";\r\nimport type { GroundStation as _GroundStation } from \"../types\";\r\nimport type {\r\n ZenSpace3DProps,\r\n ZenSpace3DHandle,\r\n ViewMode,\r\n SpaceObject,\r\n Vector3D,\r\n CameraState,\r\n LayerVisibility,\r\n SelectionState,\r\n OverpassInfo,\r\n} from \"./ZenSpace3DTypes\";\r\nimport {\r\n latLonAltToCartesian,\r\n SCENE_EARTH_RADIUS,\r\n KM_TO_SCENE,\r\n easeOutCubic,\r\n} from \"./ZenSpace3DUtils\";\r\nimport { formatDuration } from \"../utils\";\r\n\r\n// Import shaders as raw text (like EarthViewer)\r\nimport atmosphereVertexShader from \"../../shaders/atmosphere.vert\";\r\nimport atmosphereFragmentShader from \"../../shaders/atmosphere.frag\";\r\nimport starsVertexShader from \"../../shaders/stars.vert\";\r\nimport starsFragmentShader from \"../../shaders/stars.frag\";\r\nimport { loadThree, ThreeModule } from \"./threeLoader\";\r\nimport { ZenSpace3DCesium } from \"./ZenSpace3DCesium\";\r\n\r\n// =============================================================================\r\n// Communication Link Types\r\n// =============================================================================\r\n\r\nexport interface CommunicationLink {\r\n id: string;\r\n fromId: string;\r\n toId: string;\r\n type: \"uplink\" | \"downlink\" | \"crosslink\" | \"relay\";\r\n status: \"active\" | \"idle\" | \"blocked\";\r\n color?: string;\r\n bandwidth?: number;\r\n latency?: number;\r\n signalStrength?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Configuration - Optimized for smooth interactions\r\n// =============================================================================\r\n\r\nconst DEFAULT_LAYERS: LayerVisibility = {\r\n planets: true,\r\n moons: true,\r\n satellites: true,\r\n debris: false,\r\n stations: true,\r\n asteroids: false,\r\n groundStations: true,\r\n orbits: true,\r\n labels: true,\r\n constellations: false,\r\n coverage: true,\r\n atmosphere: true,\r\n stars: true,\r\n grid: false,\r\n terminator: true,\r\n};\r\n\r\nconst CAMERA_TRANSITION_DURATION = 2000;\r\nconst STARS_COUNT = 5000; // Reduced from 8000\r\nconst EARTH_SEGMENTS = 64; // Reduced from 128\r\nconst EARTH_SEGMENTS_V = 32; // Reduced from 64\r\nconst SPHERICAL_SUBDIVISIONS = 16; // Subdivisions for curved edges on coverage\r\n\r\nfunction checkWebGLCapabilities(): { available: boolean; version: number } {\r\n try {\r\n const canvas = document.createElement(\"canvas\");\r\n const gl2 = canvas.getContext(\"webgl2\");\r\n if (gl2) return { available: true, version: 2 };\r\n const gl = canvas.getContext(\"webgl\");\r\n if (gl) return { available: true, version: 1 };\r\n } catch {\r\n /* WebGL not available */\r\n }\r\n return { available: false, version: 0 };\r\n}\r\n\r\n// =============================================================================\r\n// Spherical Geometry Helpers - For realistic curved coverage on sphere\r\n// =============================================================================\r\n\r\n/**\r\n * Spherical linear interpolation (SLERP) between two unit vectors\r\n * Creates smooth arc along the sphere surface\r\n */\r\nfunction slerp(\r\n v1: { x: number; y: number; z: number },\r\n v2: { x: number; y: number; z: number },\r\n t: number,\r\n): { x: number; y: number; z: number } {\r\n // Normalize inputs\r\n const len1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z);\r\n const len2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z);\r\n\r\n // Handle zero-length vectors\r\n if (len1 < 0.0001 || len2 < 0.0001) {\r\n return { x: v1.x, y: v1.y, z: v1.z };\r\n }\r\n\r\n const n1 = { x: v1.x / len1, y: v1.y / len1, z: v1.z / len1 };\r\n const n2 = { x: v2.x / len2, y: v2.y / len2, z: v2.z / len2 };\r\n\r\n // Calculate angle between vectors\r\n let dot = n1.x * n2.x + n1.y * n2.y + n1.z * n2.z;\r\n dot = Math.max(-1, Math.min(1, dot)); // Clamp for numerical stability\r\n const theta = Math.acos(dot);\r\n\r\n if (theta < 0.001) {\r\n // Vectors are nearly parallel, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z),\r\n };\r\n }\r\n\r\n const sinTheta = Math.sin(theta);\r\n if (Math.abs(sinTheta) < 0.0001) {\r\n // Near zero sin, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z),\r\n };\r\n }\r\n\r\n const a = Math.sin((1 - t) * theta) / sinTheta;\r\n const b = Math.sin(t * theta) / sinTheta;\r\n\r\n return {\r\n x: a * n1.x + b * n2.x,\r\n y: a * n1.y + b * n2.y,\r\n z: a * n1.z + b * n2.z,\r\n };\r\n}\r\n\r\n/**\r\n * Subdivide polygon edges along great circles for spherical rendering\r\n * Takes corner points and returns a densely sampled spherical polygon\r\n */\r\nfunction subdivideSphericalPolygon(\r\n corners: Array<{ x: number; y: number; z: number }>,\r\n subdivisions: number,\r\n radius: number,\r\n): Array<{ x: number; y: number; z: number }> {\r\n if (corners.length < 3 || subdivisions < 1 || radius <= 0) {\r\n return corners; // Return as-is if invalid params\r\n }\r\n\r\n const result: Array<{ x: number; y: number; z: number }> = [];\r\n\r\n for (let i = 0; i < corners.length; i++) {\r\n const p1 = corners[i];\r\n const p2 = corners[(i + 1) % corners.length];\r\n\r\n // Validate points\r\n if (\r\n !isFinite(p1.x) ||\r\n !isFinite(p1.y) ||\r\n !isFinite(p1.z) ||\r\n !isFinite(p2.x) ||\r\n !isFinite(p2.y) ||\r\n !isFinite(p2.z)\r\n ) {\r\n continue; // Skip invalid points\r\n }\r\n\r\n // Add interpolated points along the great circle arc\r\n for (let j = 0; j < subdivisions; j++) {\r\n const t = j / subdivisions;\r\n const interpolated = slerp(p1, p2, t);\r\n\r\n // Validate interpolation result\r\n if (\r\n !isFinite(interpolated.x) ||\r\n !isFinite(interpolated.y) ||\r\n !isFinite(interpolated.z)\r\n ) {\r\n continue;\r\n }\r\n\r\n // Project onto sphere surface at given radius\r\n const len = Math.sqrt(\r\n interpolated.x ** 2 + interpolated.y ** 2 + interpolated.z ** 2,\r\n );\r\n if (len < 0.0001) continue; // Skip zero-length vectors\r\n\r\n result.push({\r\n x: (interpolated.x / len) * radius,\r\n y: (interpolated.y / len) * radius,\r\n z: (interpolated.z / len) * radius,\r\n });\r\n }\r\n }\r\n\r\n return result.length > 0 ? result : corners; // Fallback to original if all failed\r\n}\r\n\r\n// =============================================================================\r\n// Satellite Shape Builders (simplified for performance)\r\n// =============================================================================\r\n\r\nfunction createSatelliteShape(\r\n THREE: ThreeModule,\r\n category: string,\r\n size: number,\r\n): any {\r\n const group = new THREE.Group();\r\n\r\n if (category === \"station\") {\r\n // Simple station shape\r\n const geo = new THREE.BoxGeometry(size * 1.2, size * 0.6, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xcccccc });\r\n group.add(new THREE.Mesh(geo, mat));\r\n\r\n // Solar panels\r\n const panelGeo = new THREE.BoxGeometry(size * 2.5, size * 0.03, size * 0.6);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a4a7a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 1.5;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 1.5;\r\n group.add(rightPanel);\r\n } else if (category === \"satellite\") {\r\n // Simple satellite\r\n const geo = new THREE.BoxGeometry(size * 0.5, size * 0.5, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xaaaaaa });\r\n group.add(new THREE.Mesh(geo, mat));\r\n\r\n const panelGeo = new THREE.BoxGeometry(size * 1.2, size * 0.02, size * 0.4);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a3a6a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 0.7;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 0.7;\r\n group.add(rightPanel);\r\n } else if (category === \"debris\") {\r\n const geo = new THREE.IcosahedronGeometry(size * 0.3, 0);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x666666 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n } else {\r\n const geo = new THREE.SphereGeometry(size * 0.4, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x888888 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n }\r\n\r\n return group;\r\n}\r\n\r\n// =============================================================================\r\n// Component\r\n// =============================================================================\r\n\r\nexport const ZenSpace3D = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\r\n function ZenSpace3D(props, ref) {\r\n // Prefer Cesium when available (default 3D backend); fall back to Three.js\r\n const [cesiumModule, setCesiumModule] = useState<unknown>(null);\r\n useEffect(() => {\r\n // Cesium is optional peer; fallback to Three.js when not installed\r\n import(\"cesium\")\r\n .then((m) => setCesiumModule(m))\r\n .catch(() => setCesiumModule(null));\r\n }, []);\r\n if (cesiumModule) {\r\n return <ZenSpace3DCesium ref={ref} cesium={cesiumModule} {...props} />;\r\n }\r\n return <ZenSpace3DThree ref={ref} {...props} />;\r\n },\r\n);\r\n\r\n// Three.js implementation — separate component so hook count is consistent (avoids React #300)\r\nconst ZenSpace3DThree = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\r\n function ZenSpace3DThree(props, ref) {\r\n const {\r\n satellites = [],\r\n debris = [],\r\n stations = [],\r\n groundStations = [],\r\n customObjects = [],\r\n view = \"earth-orbit\",\r\n focusedObjectId,\r\n initialCamera,\r\n sunDirection,\r\n planetPositions,\r\n visibilityCones = [],\r\n satelliteCoverages = [],\r\n overpasses: _overpasses = [],\r\n orbitPaths = [],\r\n orbitDesignArcs: _orbitDesignArcs = [],\r\n communicationLinks = [],\r\n showAxisHelper = false,\r\n layers: layerOverrides,\r\n showTools = true,\r\n showInfoPanel = true,\r\n width = \"100%\",\r\n height = 600,\r\n callbacks,\r\n maxObjects = 10000,\r\n className = \"\",\r\n style,\r\n } = props;\r\n\r\n const { tokens: _tokens } = useTheme();\r\n const [webglCapabilities] = useState(() => checkWebGLCapabilities());\r\n\r\n // Refs\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const rendererRef = useRef<any>(null);\r\n const sceneRef = useRef<any>(null);\r\n const cameraRef = useRef<any>(null);\r\n const controlsRef = useRef<any>(null);\r\n const animationRef = useRef<number | null>(null);\r\n const raycasterRef = useRef<any>(null);\r\n const mouseRef = useRef<any>(null);\r\n\r\n const earthRef = useRef<any>(null);\r\n const starsMaterialRef = useRef<any>(null);\r\n const atmosphereMaterialRef = useRef<any>(null);\r\n const objectsGroupRef = useRef<any>(null);\r\n const linksGroupRef = useRef<any>(null);\r\n const conesGroupRef = useRef<any>(null);\r\n const orbitsGroupRef = useRef<any>(null);\r\n const planetsGroupRef = useRef<any>(null);\r\n\r\n const timeRef = useRef(0);\r\n const focusTransitionRef = useRef<any>(null);\r\n const isUserInteractingRef = useRef(false);\r\n const objectMeshMapRef = useRef<Map<string, any>>(new Map());\r\n const isAnimatingRef = useRef(false); // Guard against multiple animation loops\r\n const _sceneInitializedRef = useRef(false); // Prevent duplicate initialization\r\n\r\n // State\r\n const [THREE, setTHREE] = useState<ThreeModule | null>(null);\r\n const threeRef = useRef<ThreeModule | null>(null);\r\n threeRef.current = THREE;\r\n const [OrbitControlsClass, setOrbitControlsClass] = useState<any>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [layers, setLayers] = useState<LayerVisibility>({\r\n ...DEFAULT_LAYERS,\r\n ...layerOverrides,\r\n });\r\n const [selection, setSelection] = useState<SelectionState>({\r\n selectedId: null,\r\n selectedObject: null,\r\n hoveredId: null,\r\n });\r\n const [hoverTooltip, setHoverTooltip] = useState<{\r\n visible: boolean;\r\n x: number;\r\n y: number;\r\n object: any;\r\n }>({ visible: false, x: 0, y: 0, object: null });\r\n const [currentView, setCurrentView] = useState<ViewMode>(view);\r\n\r\n // Ref for view to prevent initScene recreation (fixes flickering on view change)\r\n const currentViewRef = useRef<ViewMode>(view);\r\n\r\n const effectiveLayers = useMemo(\r\n () => ({ ...layers, ...layerOverrides }),\r\n [layers, layerOverrides],\r\n );\r\n\r\n useEffect(() => {\r\n setCurrentView(view);\r\n currentViewRef.current = view;\r\n }, [view]);\r\n\r\n // ==========================================================================\r\n // Load Three.js\r\n // ==========================================================================\r\n\r\n useEffect(() => {\r\n if (!webglCapabilities.available) {\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n loadThree()\r\n .then(({ THREE: threeModule, OrbitControls: controls }) => {\r\n setTHREE(threeModule);\r\n setOrbitControlsClass(() => controls);\r\n })\r\n .catch((err) => {\r\n if (import.meta.env.DEV) {\r\n console.error(\"Failed to load Three.js:\", err);\r\n }\r\n setError(\"Failed to load 3D library\");\r\n setIsLoading(false);\r\n });\r\n }, [webglCapabilities.available]);\r\n\r\n // ==========================================================================\r\n // Initialize Scene (Optimized like EarthViewer)\r\n // ==========================================================================\r\n\r\n const initScene = useCallback(() => {\r\n if (!THREE || !containerRef.current || !OrbitControlsClass) return;\r\n\r\n // Clean up any existing scene first (prevents duplicates)\r\n if (rendererRef.current) {\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n controlsRef.current?.dispose();\r\n rendererRef.current.dispose();\r\n if (containerRef.current?.contains(rendererRef.current.domElement)) {\r\n containerRef.current.removeChild(rendererRef.current.domElement);\r\n }\r\n }\r\n\r\n const container = containerRef.current;\r\n const rect = container.getBoundingClientRect();\r\n const w = rect.width;\r\n const h = typeof height === \"number\" ? height : rect.height;\r\n\r\n // Scene\r\n const scene = new THREE.Scene();\r\n sceneRef.current = scene;\r\n\r\n // Use ref for view mode to prevent initScene recreation (fixes flickering)\r\n const viewMode = currentViewRef.current;\r\n\r\n // Camera (adjusted per view mode)\r\n const farClip = viewMode === \"solar-system\" ? 1000000 : 100000;\r\n const camera = new THREE.PerspectiveCamera(45, w / h, 1, farClip);\r\n // Solar system: position to see inner planets, Earth orbit view: standard distance\r\n const initialDistance = viewMode === \"solar-system\" ? 5000 : 10000;\r\n camera.position.set(0, initialDistance * 0.3, initialDistance);\r\n cameraRef.current = camera;\r\n\r\n if (initialCamera?.position) {\r\n camera.position.set(\r\n initialCamera.position.x,\r\n initialCamera.position.y,\r\n initialCamera.position.z,\r\n );\r\n }\r\n\r\n // Renderer (optimized settings - preserveDrawingBuffer prevents flickering)\r\n const renderer = new THREE.WebGLRenderer({\r\n antialias: true,\r\n alpha: true,\r\n powerPreference: \"high-performance\",\r\n preserveDrawingBuffer: true, // Prevents flickering from buffer swaps\r\n });\r\n renderer.setSize(w, h);\r\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n container.appendChild(renderer.domElement);\r\n rendererRef.current = renderer;\r\n\r\n // Controls (smooth damping, adjusted per view)\r\n const controls = new OrbitControlsClass(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n controls.rotateSpeed = 0.5;\r\n controls.minDistance = viewMode === \"solar-system\" ? 500 : 3050; // Very close to Earth/objects\r\n controls.maxDistance = viewMode === \"solar-system\" ? 100000 : 25000;\r\n controls.enablePan = viewMode === \"solar-system\"; // Allow pan in solar system\r\n let interactionTimer: ReturnType<typeof setTimeout>;\r\n const handleControlStart = () => {\r\n isUserInteractingRef.current = true;\r\n };\r\n const handleControlEnd = () => {\r\n clearTimeout(interactionTimer);\r\n interactionTimer = setTimeout(() => {\r\n isUserInteractingRef.current = false;\r\n }, 3000);\r\n };\r\n controls.addEventListener(\"start\", handleControlStart);\r\n controls.addEventListener(\"end\", handleControlEnd);\r\n controlsRef.current = controls;\r\n\r\n raycasterRef.current = new THREE.Raycaster();\r\n mouseRef.current = new THREE.Vector2();\r\n\r\n // Groups\r\n objectsGroupRef.current = new THREE.Group();\r\n objectsGroupRef.current.name = \"objects\";\r\n scene.add(objectsGroupRef.current);\r\n\r\n linksGroupRef.current = new THREE.Group();\r\n linksGroupRef.current.name = \"links\";\r\n scene.add(linksGroupRef.current);\r\n\r\n conesGroupRef.current = new THREE.Group();\r\n conesGroupRef.current.name = \"cones\";\r\n scene.add(conesGroupRef.current);\r\n\r\n orbitsGroupRef.current = new THREE.Group();\r\n orbitsGroupRef.current.name = \"orbits\";\r\n scene.add(orbitsGroupRef.current);\r\n\r\n planetsGroupRef.current = new THREE.Group();\r\n planetsGroupRef.current.name = \"planets\";\r\n scene.add(planetsGroupRef.current);\r\n\r\n if (viewMode === \"solar-system\") {\r\n createSolarSystem(THREE, scene);\r\n } else {\r\n createEarth(THREE, scene);\r\n createAtmosphere(THREE, scene);\r\n }\r\n\r\n createStars(THREE, scene);\r\n createLighting(THREE, scene);\r\n\r\n if (showAxisHelper && viewMode !== \"solar-system\") {\r\n createAxisHelper(THREE, scene);\r\n }\r\n\r\n setIsLoading(false);\r\n\r\n return () => {\r\n clearTimeout(interactionTimer);\r\n if (animationRef.current) cancelAnimationFrame(animationRef.current);\r\n controls.removeEventListener(\"start\", handleControlStart);\r\n controls.removeEventListener(\"end\", handleControlEnd);\r\n controls.dispose();\r\n renderer.dispose();\r\n if (container.contains(renderer.domElement))\r\n container.removeChild(renderer.domElement);\r\n };\r\n }, [THREE, OrbitControlsClass, height, initialCamera, showAxisHelper]); // Uses currentViewRef to prevent recreation\r\n\r\n // ==========================================================================\r\n // Create Solar System (scaled for visibility)\r\n // ==========================================================================\r\n\r\n const createSolarSystem = useCallback(\r\n (THREE: ThreeModule, _scene: unknown) => {\r\n const planetsGroup = planetsGroupRef.current;\r\n if (!planetsGroup) return;\r\n\r\n // Scale factor to make solar system viewable (1 unit = ~1000 km)\r\n const DISTANCE_SCALE = 0.000005;\r\n const SIZE_SCALE = 0.01;\r\n\r\n // Sun (emissive glow)\r\n const sunRadius = 696340 * SIZE_SCALE;\r\n const sunGeo = new THREE.SphereGeometry(sunRadius, 32, 24);\r\n const sunMat = new THREE.MeshBasicMaterial({ color: 0xffdd44 });\r\n const sunMesh = new THREE.Mesh(sunGeo, sunMat);\r\n sunMesh.name = \"sun\";\r\n sunMesh.userData = {\r\n objectId: \"sun\",\r\n planetId: \"sun\",\r\n isPlanet: true,\r\n isSelectable: true,\r\n };\r\n planetsGroup.add(sunMesh);\r\n\r\n // Sun glow\r\n const glowGeo = new THREE.SphereGeometry(sunRadius * 1.3, 24, 16);\r\n const glowMat = new THREE.MeshBasicMaterial({\r\n color: 0xffaa00,\r\n transparent: true,\r\n opacity: 0.2,\r\n });\r\n planetsGroup.add(new THREE.Mesh(glowGeo, glowMat));\r\n\r\n // Planets with proper scaling\r\n const configs = [\r\n {\r\n id: \"mercury\",\r\n color: 0x8c7853,\r\n radius: 2439.7,\r\n distance: 57900000,\r\n },\r\n { id: \"venus\", color: 0xffc649, radius: 6051.8, distance: 108200000 },\r\n { id: \"earth\", color: 0x6b93d6, radius: 6371, distance: 149600000 },\r\n { id: \"mars\", color: 0xc1440e, radius: 3389.5, distance: 227900000 },\r\n {\r\n id: \"jupiter\",\r\n color: 0xd8ca9d,\r\n radius: 69911,\r\n distance: 778500000,\r\n },\r\n {\r\n id: \"saturn\",\r\n color: 0xf4d59e,\r\n radius: 58232,\r\n distance: 1434000000,\r\n },\r\n {\r\n id: \"uranus\",\r\n color: 0xd1e7e7,\r\n radius: 25362,\r\n distance: 2871000000,\r\n },\r\n {\r\n id: \"neptune\",\r\n color: 0x5b5ddf,\r\n radius: 24622,\r\n distance: 4495000000,\r\n },\r\n ];\r\n\r\n configs.forEach((c) => {\r\n // Make inner planets larger for visibility\r\n const visualScale = c.distance < 300000000 ? 15 : 5;\r\n const planetRadius = c.radius * SIZE_SCALE * visualScale;\r\n const geo = new THREE.SphereGeometry(planetRadius, 24, 16);\r\n const mat = new THREE.MeshPhongMaterial({\r\n color: c.color,\r\n shininess: 30,\r\n });\r\n const mesh = new THREE.Mesh(geo, mat);\r\n\r\n const orbitDist = c.distance * DISTANCE_SCALE;\r\n mesh.position.x = orbitDist;\r\n mesh.name = c.id;\r\n mesh.userData = {\r\n objectId: c.id,\r\n planetId: c.id,\r\n isPlanet: true,\r\n isSelectable: true,\r\n data: {\r\n id: c.id,\r\n name: c.id.charAt(0).toUpperCase() + c.id.slice(1),\r\n category: \"planet\",\r\n },\r\n };\r\n planetsGroup.add(mesh);\r\n objectMeshMapRef.current.set(c.id, mesh);\r\n\r\n // Saturn's rings\r\n if (c.id === \"saturn\") {\r\n const ringGeo = new THREE.RingGeometry(\r\n planetRadius * 1.4,\r\n planetRadius * 2.2,\r\n 32,\r\n );\r\n const ringMat = new THREE.MeshBasicMaterial({\r\n color: 0xc9b896,\r\n transparent: true,\r\n opacity: 0.6,\r\n side: THREE.DoubleSide,\r\n });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.rotation.x = Math.PI / 2.5;\r\n ring.position.copy(mesh.position);\r\n planetsGroup.add(ring);\r\n }\r\n\r\n // Orbit line\r\n const points: any[] = [];\r\n for (let i = 0; i <= 64; i++) {\r\n const angle = (i / 64) * Math.PI * 2;\r\n points.push(\r\n new THREE.Vector3(\r\n orbitDist * Math.cos(angle),\r\n 0,\r\n orbitDist * Math.sin(angle),\r\n ),\r\n );\r\n }\r\n const orbitGeo = new THREE.BufferGeometry().setFromPoints(points);\r\n const orbitMat = new THREE.LineBasicMaterial({\r\n color: 0x444466,\r\n transparent: true,\r\n opacity: 0.3,\r\n });\r\n planetsGroup.add(new THREE.Line(orbitGeo, orbitMat));\r\n });\r\n\r\n // Add a point light at Sun\r\n const sunLight = new THREE.PointLight(0xffffee, 2, 100000);\r\n sunLight.position.set(0, 0, 0);\r\n planetsGroup.add(sunLight);\r\n },\r\n [],\r\n );\r\n\r\n // ==========================================================================\r\n // Create Earth (optimized segments like EarthViewer)\r\n // ==========================================================================\r\n\r\n const createEarth = useCallback((THREE: ThreeModule, scene: any) => {\r\n const earthGeometry = new THREE.SphereGeometry(\r\n SCENE_EARTH_RADIUS,\r\n EARTH_SEGMENTS,\r\n EARTH_SEGMENTS_V,\r\n );\r\n const earthMaterial = new THREE.MeshPhongMaterial({\r\n color: 0x2244aa,\r\n shininess: 10,\r\n });\r\n\r\n const textureLoader = new THREE.TextureLoader();\r\n textureLoader.load(\r\n \"/world.topo.jpg\",\r\n (texture: any) => {\r\n texture.wrapS = THREE.RepeatWrapping;\r\n texture.wrapT = THREE.ClampToEdgeWrapping;\r\n texture.minFilter = THREE.LinearFilter;\r\n texture.magFilter = THREE.LinearFilter;\r\n earthMaterial.map = texture;\r\n earthMaterial.needsUpdate = true;\r\n },\r\n undefined,\r\n () => {},\r\n );\r\n\r\n const earth = new THREE.Mesh(earthGeometry, earthMaterial);\r\n earth.rotation.y = -Math.PI / 2 + Math.PI;\r\n earth.name = \"earth\";\r\n scene.add(earth);\r\n earthRef.current = earth;\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Atmosphere (sun-reactive glow)\r\n // ==========================================================================\r\n\r\n const createAtmosphere = useCallback(\r\n (THREE: ThreeModule, scene: any) => {\r\n if (!effectiveLayers.atmosphere) return;\r\n\r\n // Default sun direction (can be updated via props)\r\n const defaultSunDir = new THREE.Vector3(1, 0.3, 0.5).normalize();\r\n\r\n const atmosphereGeometry = new THREE.SphereGeometry(\r\n SCENE_EARTH_RADIUS * 1.15,\r\n 32,\r\n 16,\r\n );\r\n const atmosphereMaterial = new THREE.ShaderMaterial({\r\n uniforms: {\r\n uSunDirection: { value: defaultSunDir },\r\n },\r\n vertexShader: atmosphereVertexShader,\r\n fragmentShader: atmosphereFragmentShader,\r\n blending: THREE.AdditiveBlending,\r\n side: THREE.BackSide,\r\n transparent: true,\r\n depthWrite: false,\r\n });\r\n const atmosphere = new THREE.Mesh(\r\n atmosphereGeometry,\r\n atmosphereMaterial,\r\n );\r\n atmosphere.rotation.y = -Math.PI / 2;\r\n atmosphere.name = \"atmosphere\";\r\n scene.add(atmosphere);\r\n\r\n // Store ref for dynamic updates\r\n atmosphereMaterialRef.current = atmosphereMaterial;\r\n },\r\n [effectiveLayers.atmosphere],\r\n );\r\n\r\n // ==========================================================================\r\n // Create Stars (optimized like EarthViewer)\r\n // ==========================================================================\r\n\r\n const createStars = useCallback(\r\n (THREE: ThreeModule, scene: any) => {\r\n const starsGeometry = new THREE.BufferGeometry();\r\n const starsDist = currentView === \"solar-system\" ? 50000000000 : 50000;\r\n const positions = new Float32Array(STARS_COUNT * 3);\r\n const opacities = new Float32Array(STARS_COUNT);\r\n\r\n for (let i = 0; i < STARS_COUNT; i++) {\r\n const radius = starsDist + Math.random() * starsDist;\r\n const theta = Math.random() * Math.PI * 2;\r\n const phi = Math.acos(2 * Math.random() - 1);\r\n\r\n positions[i * 3] = radius * Math.sin(phi) * Math.cos(theta);\r\n positions[i * 3 + 1] = radius * Math.sin(phi) * Math.sin(theta);\r\n positions[i * 3 + 2] = radius * Math.cos(phi);\r\n opacities[i] = Math.random();\r\n }\r\n\r\n starsGeometry.setAttribute(\r\n \"position\",\r\n new THREE.BufferAttribute(positions, 3),\r\n );\r\n starsGeometry.setAttribute(\r\n \"opacity\",\r\n new THREE.BufferAttribute(opacities, 1),\r\n );\r\n\r\n const starsMaterial = new THREE.ShaderMaterial({\r\n uniforms: { time: { value: 0 } },\r\n vertexShader: starsVertexShader,\r\n fragmentShader: starsFragmentShader,\r\n transparent: true,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending,\r\n });\r\n\r\n scene.add(new THREE.Points(starsGeometry, starsMaterial));\r\n starsMaterialRef.current = starsMaterial;\r\n },\r\n [currentView],\r\n );\r\n\r\n // ==========================================================================\r\n // Create Lighting (simple like EarthViewer)\r\n // ==========================================================================\r\n\r\n const createLighting = useCallback((THREE: ThreeModule, scene: any) => {\r\n scene.add(new THREE.AmbientLight(0x404040, 0.6));\r\n const sunLight = new THREE.DirectionalLight(0xffffff, 1.2);\r\n sunLight.position.set(10000, 5000, 10000);\r\n scene.add(sunLight);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Axis Helper\r\n // ==========================================================================\r\n\r\n const createAxisHelper = useCallback((THREE: ThreeModule, scene: any) => {\r\n const len = SCENE_EARTH_RADIUS * 1.5;\r\n const group = new THREE.Group();\r\n\r\n [\r\n { color: 0xff3333, dir: [1, 0, 0] },\r\n { color: 0x33ff33, dir: [0, 1, 0] },\r\n { color: 0x3333ff, dir: [0, 0, 1] },\r\n ].forEach(({ color, dir }) => {\r\n const points = [\r\n new THREE.Vector3(0, 0, 0),\r\n new THREE.Vector3(dir[0] * len, dir[1] * len, dir[2] * len),\r\n ];\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({ color });\r\n group.add(new THREE.Line(geo, mat));\r\n });\r\n\r\n scene.add(group);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Update Objects\r\n // ==========================================================================\r\n\r\n const updateObjects = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n const group = objectsGroupRef.current;\r\n const meshMap = objectMeshMapRef.current;\r\n\r\n // Clear\r\n while (group.children.length > 0) {\r\n const child = group.children[0];\r\n group.remove(child);\r\n }\r\n meshMap.clear();\r\n\r\n const allObjects: SpaceObject[] = [\r\n ...satellites,\r\n ...debris,\r\n ...stations,\r\n ...customObjects,\r\n ];\r\n\r\n allObjects.slice(0, maxObjects).forEach((obj) => {\r\n const categoryLayer =\r\n obj.category === \"satellite\"\r\n ? \"satellites\"\r\n : obj.category === \"debris\"\r\n ? \"debris\"\r\n : obj.category === \"station\"\r\n ? \"stations\"\r\n : \"satellites\";\r\n\r\n if (!effectiveLayers[categoryLayer]) return;\r\n\r\n let size = 50;\r\n if (obj.category === \"station\") size = 100;\r\n else if (obj.category === \"debris\") size = 25;\r\n\r\n const satelliteGroup = createSatelliteShape(THREE, obj.category, size);\r\n satelliteGroup.position.set(\r\n obj.position.x,\r\n obj.position.y,\r\n obj.position.z,\r\n );\r\n satelliteGroup.lookAt(0, 0, 0);\r\n satelliteGroup.userData = {\r\n objectId: obj.id,\r\n category: obj.category,\r\n data: obj,\r\n isSelectable: true,\r\n };\r\n satelliteGroup.name = obj.id;\r\n\r\n group.add(satelliteGroup);\r\n meshMap.set(obj.id, satelliteGroup);\r\n });\r\n }, [\r\n THREE,\r\n satellites,\r\n debris,\r\n stations,\r\n customObjects,\r\n maxObjects,\r\n effectiveLayers,\r\n currentView,\r\n ]);\r\n\r\n // ==========================================================================\r\n // Update Ground Stations\r\n // ==========================================================================\r\n\r\n const updateGroundStations = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n if (!effectiveLayers.groundStations) return;\r\n\r\n groundStations.forEach((gs) => {\r\n const pos = latLonAltToCartesian(gs.latitude, gs.longitude, 0);\r\n\r\n // Simple marker\r\n const geo = new THREE.SphereGeometry(35, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ffff });\r\n const marker = new THREE.Mesh(geo, mat);\r\n marker.position.set(pos.x, pos.y, pos.z);\r\n marker.userData = {\r\n objectId: gs.id,\r\n category: \"groundStation\",\r\n data: gs,\r\n isSelectable: true,\r\n };\r\n\r\n objectsGroupRef.current.add(marker);\r\n objectMeshMapRef.current.set(gs.id, marker);\r\n\r\n // Glow ring\r\n const ringGeo = new THREE.RingGeometry(45, 65, 16);\r\n const ringMat = new THREE.MeshBasicMaterial({\r\n color: 0x00ffff,\r\n transparent: true,\r\n opacity: 0.4,\r\n side: THREE.DoubleSide,\r\n });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.position.set(pos.x, pos.y, pos.z);\r\n ring.lookAt(0, 0, 0);\r\n objectsGroupRef.current.add(ring);\r\n });\r\n }, [THREE, groundStations, effectiveLayers.groundStations, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Coverage (Realistic satellite-to-ground cones + legacy region cones)\r\n // ==========================================================================\r\n\r\n const updateCoverage = useCallback(() => {\r\n const T = threeRef.current;\r\n if (!T || !conesGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n // Clear existing\r\n while (conesGroupRef.current.children.length > 0) {\r\n conesGroupRef.current.remove(conesGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.coverage) return;\r\n\r\n // ========================================\r\n // Satellite Coverage Visualization (NASA-style)\r\n // Renders coverage data provided by Zendir SDK\r\n // ========================================\r\n satelliteCoverages.forEach((coverage) => {\r\n // Get satellite position\r\n let satPos: any;\r\n if (coverage.satellitePosition) {\r\n satPos = new T.Vector3(\r\n coverage.satellitePosition.x,\r\n coverage.satellitePosition.y,\r\n coverage.satellitePosition.z,\r\n );\r\n } else {\r\n const satMesh = objectMeshMapRef.current.get(coverage.satelliteId);\r\n if (!satMesh) return;\r\n satPos = satMesh.position.clone();\r\n }\r\n\r\n const satDistance = satPos.length();\r\n const coneColor = new T.Color(coverage.color || \"#22d3ee\");\r\n const highlightColor = new T.Color(\r\n coverage.color || \"#22d3ee\",\r\n ).multiplyScalar(1.3);\r\n\r\n // ====== 1. Render footprint border only (no filled plane - it cuts through sphere) ======\r\n if (\r\n coverage.footprintPolygon &&\r\n coverage.footprintPolygon.length >= 3 &&\r\n coverage.showFootprint !== false\r\n ) {\r\n const cornerPoints = coverage.footprintPolygon.map((pt) =>\r\n latLonAltToCartesian(pt.latitude, pt.longitude, 0),\r\n );\r\n\r\n // Curved border (follows sphere curvature via SLERP)\r\n const borderPts = subdivideSphericalPolygon(\r\n cornerPoints,\r\n SPHERICAL_SUBDIVISIONS,\r\n SCENE_EARTH_RADIUS * 1.003,\r\n ).map((pt) => new T.Vector3(pt.x, pt.y, pt.z));\r\n borderPts.push(borderPts[0].clone());\r\n const borderGeo = new T.BufferGeometry().setFromPoints(borderPts);\r\n const borderMat = new T.LineBasicMaterial({\r\n color: highlightColor,\r\n transparent: true,\r\n opacity: 0.95,\r\n linewidth: 2,\r\n });\r\n conesGroupRef.current.add(new T.Line(borderGeo, borderMat));\r\n\r\n // Outer glow (slightly larger radius for glow effect)\r\n const glowPts = subdivideSphericalPolygon(\r\n cornerPoints,\r\n SPHERICAL_SUBDIVISIONS,\r\n SCENE_EARTH_RADIUS * 1.005,\r\n ).map((pt) => new T.Vector3(pt.x, pt.y, pt.z));\r\n glowPts.push(glowPts[0].clone());\r\n const glowGeo = new T.BufferGeometry().setFromPoints(glowPts);\r\n const glowMat = new T.LineBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.4,\r\n });\r\n conesGroupRef.current.add(new T.Line(glowGeo, glowMat));\r\n\r\n // Cone lines from satellite to corners (lines only, no filled surface)\r\n if (coverage.showCone !== false) {\r\n for (const corner of cornerPoints) {\r\n const edgePt = new T.Vector3(corner.x, corner.y, corner.z)\r\n .normalize()\r\n .multiplyScalar(SCENE_EARTH_RADIUS);\r\n const lineGeo = new T.BufferGeometry().setFromPoints([\r\n satPos,\r\n edgePt,\r\n ]);\r\n const lineMat = new T.LineBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.4,\r\n });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n }\r\n }\r\n\r\n // ====== 2. Simple cone (when no polygon, just halfAngle) ======\r\n else if (coverage.halfAngle && coverage.showCone !== false) {\r\n const halfAngleRad = coverage.halfAngle * (Math.PI / 180);\r\n const coneHeight = satDistance - SCENE_EARTH_RADIUS * 0.98;\r\n const coneRadius = coneHeight * Math.tan(halfAngleRad);\r\n\r\n // Cone mesh\r\n const coneGeo = new T.ConeGeometry(\r\n coneRadius,\r\n coneHeight,\r\n 48,\r\n 1,\r\n true,\r\n );\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n const cone = new T.Mesh(coneGeo, coneMat);\r\n cone.position.copy(satPos);\r\n cone.lookAt(0, 0, 0);\r\n cone.rotateX(Math.PI / 2);\r\n cone.translateY(-coneHeight / 2);\r\n conesGroupRef.current.add(cone);\r\n\r\n // Footprint circle\r\n if (coverage.showFootprint !== false) {\r\n const nadirDir = satPos.clone().normalize();\r\n const footprintPos = nadirDir\r\n .clone()\r\n .multiplyScalar(SCENE_EARTH_RADIUS * 1.003);\r\n const footprintRadius =\r\n coneRadius * (SCENE_EARTH_RADIUS / satDistance);\r\n\r\n // Filled circle\r\n const footGeo = new T.CircleGeometry(footprintRadius, 64);\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.3,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n const footprint = new T.Mesh(footGeo, footMat);\r\n footprint.position.copy(footprintPos);\r\n footprint.lookAt(satPos);\r\n conesGroupRef.current.add(footprint);\r\n\r\n // Edge ring\r\n const ringGeo = new T.RingGeometry(\r\n footprintRadius * 0.97,\r\n footprintRadius,\r\n 64,\r\n );\r\n const ringMat = new T.MeshBasicMaterial({\r\n color: highlightColor,\r\n transparent: true,\r\n opacity: 0.7,\r\n side: T.DoubleSide,\r\n });\r\n const ring = new T.Mesh(ringGeo, ringMat);\r\n ring.position.copy(footprintPos);\r\n ring.lookAt(satPos);\r\n conesGroupRef.current.add(ring);\r\n }\r\n }\r\n\r\n // ====== 3. Nadir line ======\r\n if (coverage.showNadirLine !== false) {\r\n let nadirGroundPoint: any;\r\n if (coverage.nadirPoint) {\r\n const np = latLonAltToCartesian(\r\n coverage.nadirPoint.latitude,\r\n coverage.nadirPoint.longitude,\r\n 0,\r\n );\r\n nadirGroundPoint = new T.Vector3(np.x, np.y, np.z);\r\n } else {\r\n nadirGroundPoint = satPos\r\n .clone()\r\n .normalize()\r\n .multiplyScalar(SCENE_EARTH_RADIUS);\r\n }\r\n const lineGeo = new T.BufferGeometry().setFromPoints([\r\n satPos,\r\n nadirGroundPoint,\r\n ]);\r\n const lineMat = new T.LineBasicMaterial({\r\n color: highlightColor,\r\n transparent: true,\r\n opacity: 0.7,\r\n });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n });\r\n\r\n // ========================================\r\n // Legacy Region-based Visibility Cones\r\n // ========================================\r\n visibilityCones.forEach((cone) => {\r\n const pos = latLonAltToCartesian(\r\n cone.center.latitude,\r\n cone.center.longitude,\r\n 0,\r\n );\r\n\r\n const coneHeight = 1000 * KM_TO_SCENE;\r\n const minElev = cone.minElevation || 10;\r\n const coneRadius =\r\n coneHeight * Math.tan((90 - minElev) * (Math.PI / 180) * 0.4);\r\n const coneColor = new T.Color(cone.color || \"#22d3ee\");\r\n\r\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 24, 1, true);\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: cone.opacity || 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n\r\n const coneMesh = new T.Mesh(coneGeo, coneMat);\r\n coneMesh.position.set(pos.x, pos.y, pos.z);\r\n coneMesh.lookAt(0, 0, 0);\r\n coneMesh.rotateX(-Math.PI / 2);\r\n coneMesh.translateY(coneHeight / 2);\r\n conesGroupRef.current.add(coneMesh);\r\n\r\n // Footprint ring\r\n const footGeo = new T.RingGeometry(\r\n coneRadius * 0.7,\r\n coneRadius * 0.9,\r\n 32,\r\n );\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.3,\r\n side: T.DoubleSide,\r\n });\r\n const foot = new T.Mesh(footGeo, footMat);\r\n foot.position.set(pos.x * 1.002, pos.y * 1.002, pos.z * 1.002);\r\n foot.lookAt(0, 0, 0);\r\n conesGroupRef.current.add(foot);\r\n });\r\n }, [\r\n visibilityCones,\r\n satelliteCoverages,\r\n effectiveLayers.coverage,\r\n currentView,\r\n ]);\r\n\r\n // ==========================================================================\r\n // Update Communication Links\r\n // ==========================================================================\r\n\r\n const updateLinks = useCallback(() => {\r\n if (!THREE || !linksGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n while (linksGroupRef.current.children.length > 0) {\r\n linksGroupRef.current.remove(linksGroupRef.current.children[0]);\r\n }\r\n\r\n communicationLinks.forEach((link) => {\r\n const fromMesh = objectMeshMapRef.current.get(link.fromId);\r\n const toMesh = objectMeshMapRef.current.get(link.toId);\r\n if (!fromMesh || !toMesh) return;\r\n\r\n const color =\r\n link.color || (link.status === \"active\" ? \"#00ff88\" : \"#666666\");\r\n const geo = new THREE.BufferGeometry().setFromPoints([\r\n fromMesh.position.clone(),\r\n toMesh.position.clone(),\r\n ]);\r\n\r\n // Dashed animated line\r\n const mat = new THREE.LineDashedMaterial({\r\n color: new THREE.Color(color),\r\n transparent: true,\r\n opacity: link.status === \"active\" ? 0.8 : 0.4,\r\n dashSize: 30,\r\n gapSize: 20,\r\n });\r\n\r\n const line = new THREE.Line(geo, mat);\r\n line.computeLineDistances(); // Required for dashed lines - must be on Line, not geometry\r\n line.userData = { isAnimatedLink: true };\r\n linksGroupRef.current.add(line);\r\n });\r\n }, [THREE, communicationLinks, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Orbits\r\n // ==========================================================================\r\n\r\n const updateOrbits = useCallback(() => {\r\n if (!THREE || !orbitsGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n while (orbitsGroupRef.current.children.length > 0) {\r\n orbitsGroupRef.current.remove(orbitsGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.orbits) return;\r\n\r\n orbitPaths.forEach((path) => {\r\n if (path.points.length < 2) return;\r\n const points = path.points.map((p) => new THREE.Vector3(p.x, p.y, p.z));\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({\r\n color: new THREE.Color(path.color || \"#888888\"),\r\n transparent: true,\r\n opacity: 0.5,\r\n });\r\n orbitsGroupRef.current.add(new THREE.Line(geo, mat));\r\n });\r\n }, [THREE, orbitPaths, effectiveLayers.orbits, currentView]);\r\n\r\n // ==========================================================================\r\n // Mouse Handlers\r\n // ==========================================================================\r\n\r\n const handleMouseMove = useCallback((event: MouseEvent) => {\r\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current)\r\n return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => {\r\n if (obj.userData?.isSelectable) selectables.push(obj);\r\n });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(\r\n selectables,\r\n true,\r\n );\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n\r\n if (hit?.userData) {\r\n setHoverTooltip({\r\n visible: true,\r\n x: event.clientX - rect.left,\r\n y: event.clientY - rect.top,\r\n object: hit.userData.data,\r\n });\r\n if (containerRef.current)\r\n containerRef.current.style.cursor = \"pointer\";\r\n return;\r\n }\r\n }\r\n\r\n setHoverTooltip({ visible: false, x: 0, y: 0, object: null });\r\n if (containerRef.current) containerRef.current.style.cursor = \"grab\";\r\n }, []);\r\n\r\n const handleClick = useCallback(\r\n (event: MouseEvent) => {\r\n if (\r\n !containerRef.current ||\r\n !raycasterRef.current ||\r\n !cameraRef.current\r\n )\r\n return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n // Check objects group\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => {\r\n if (obj.userData?.isSelectable) selectables.push(obj);\r\n });\r\n // Also check planets group for solar system view\r\n planetsGroupRef.current?.traverse((obj: any) => {\r\n if (obj.userData?.isSelectable) selectables.push(obj);\r\n });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(\r\n selectables,\r\n true,\r\n );\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n\r\n if (hit?.userData?.objectId) {\r\n const objectId = hit.userData.objectId;\r\n setSelection({\r\n selectedId: objectId,\r\n selectedObject: hit.userData.data,\r\n hoveredId: null,\r\n });\r\n callbacks?.onSelect?.(hit.userData.data);\r\n\r\n // Fly to the clicked object\r\n flyTo(objectId, { animate: true });\r\n return;\r\n }\r\n }\r\n\r\n setSelection({\r\n selectedId: null,\r\n selectedObject: null,\r\n hoveredId: null,\r\n });\r\n callbacks?.onSelect?.(null);\r\n },\r\n [callbacks],\r\n );\r\n\r\n // ==========================================================================\r\n // Fly To Object (comprehensive camera navigation)\r\n // ==========================================================================\r\n\r\n const flyTo = useCallback(\r\n (\r\n objectId: string,\r\n options?: {\r\n zoom?: number;\r\n animate?: boolean;\r\n distance?: number;\r\n offset?: Vector3D;\r\n },\r\n ) => {\r\n if (!THREE || !cameraRef.current || !controlsRef.current) return;\r\n\r\n const mesh = objectMeshMapRef.current.get(objectId);\r\n if (!mesh) {\r\n if (import.meta.env.DEV) {\r\n console.warn(`flyTo: Object \"${objectId}\" not found`);\r\n }\r\n return;\r\n }\r\n\r\n const targetPos = mesh.position.clone();\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n const category = mesh.userData?.category;\r\n const isGroundStation = category === \"groundStation\";\r\n\r\n // Determine viewing distance based on object type\r\n let viewDistance: number;\r\n if (options?.distance) {\r\n viewDistance = options.distance;\r\n } else {\r\n // Auto-calculate based on object size/type\r\n const isPlanet = mesh.userData?.isPlanet;\r\n const targetDist = targetPos.length();\r\n\r\n if (isPlanet) {\r\n // For planets, get closer based on planet size\r\n const planetRadius = mesh.geometry?.parameters?.radius || 100;\r\n viewDistance = planetRadius * 5;\r\n } else if (isGroundStation) {\r\n // Ground stations - close view from above\r\n viewDistance = 200;\r\n } else if (category === \"station\") {\r\n // Space stations - extremely close side view\r\n viewDistance = 80;\r\n } else if (category === \"satellite\") {\r\n // Satellites - extremely close side view\r\n viewDistance = 60;\r\n } else if (targetDist > SCENE_EARTH_RADIUS * 2) {\r\n // Far object (high orbit) - close view\r\n viewDistance = 150;\r\n } else {\r\n // Near-Earth object - very close view\r\n viewDistance = 100 * (options?.zoom || 1);\r\n }\r\n }\r\n\r\n // Calculate camera position - offset from object\r\n let cameraTargetPos: any;\r\n if (options?.offset) {\r\n cameraTargetPos = targetPos\r\n .clone()\r\n .add(\r\n new THREE.Vector3(\r\n options.offset.x,\r\n options.offset.y,\r\n options.offset.z,\r\n ),\r\n );\r\n } else if (isGroundStation) {\r\n // Ground station: view from above (radially outward from Earth center)\r\n const upDir = targetPos.clone().normalize();\r\n cameraTargetPos = targetPos\r\n .clone()\r\n .add(upDir.multiplyScalar(viewDistance));\r\n } else {\r\n // Satellites/stations: view from the side\r\n const dir = targetPos.clone().normalize();\r\n const side = new THREE.Vector3(-dir.z, 0.2, dir.x).normalize();\r\n cameraTargetPos = targetPos\r\n .clone()\r\n .add(side.multiplyScalar(viewDistance));\r\n }\r\n\r\n if (options?.animate !== false) {\r\n focusTransitionRef.current = {\r\n startTime: Date.now(),\r\n startPos: {\r\n x: camera.position.x,\r\n y: camera.position.y,\r\n z: camera.position.z,\r\n },\r\n targetPos: {\r\n x: cameraTargetPos.x,\r\n y: cameraTargetPos.y,\r\n z: cameraTargetPos.z,\r\n },\r\n startTarget: {\r\n x: controls.target.x,\r\n y: controls.target.y,\r\n z: controls.target.z,\r\n },\r\n targetTarget: { x: targetPos.x, y: targetPos.y, z: targetPos.z },\r\n duration: CAMERA_TRANSITION_DURATION,\r\n isActive: true,\r\n };\r\n } else {\r\n camera.position.copy(cameraTargetPos);\r\n controls.target.copy(targetPos);\r\n controls.update();\r\n }\r\n\r\n // Fire callback\r\n callbacks?.onFocus?.(mesh.userData?.data || { id: objectId });\r\n },\r\n [THREE, callbacks],\r\n );\r\n\r\n // Alias for backward compatibility\r\n const focusOn = flyTo;\r\n\r\n // ==========================================================================\r\n // Animation\r\n // ==========================================================================\r\n\r\n const animate = useCallback(() => {\r\n // Guard: Only one animation loop should run at a time\r\n if (!isAnimatingRef.current) return;\r\n if (!rendererRef.current || !sceneRef.current || !cameraRef.current)\r\n return;\r\n\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n\r\n // Transition\r\n if (focusTransitionRef.current?.isActive) {\r\n const t = focusTransitionRef.current;\r\n const progress = Math.min((Date.now() - t.startTime) / t.duration, 1);\r\n const e = easeOutCubic(progress);\r\n\r\n camera.position.x = t.startPos.x + (t.targetPos.x - t.startPos.x) * e;\r\n camera.position.y = t.startPos.y + (t.targetPos.y - t.startPos.y) * e;\r\n camera.position.z = t.startPos.z + (t.targetPos.z - t.startPos.z) * e;\r\n\r\n controls.target.x =\r\n t.startTarget.x + (t.targetTarget.x - t.startTarget.x) * e;\r\n controls.target.y =\r\n t.startTarget.y + (t.targetTarget.y - t.startTarget.y) * e;\r\n controls.target.z =\r\n t.startTarget.z + (t.targetTarget.z - t.startTarget.z) * e;\r\n\r\n if (progress >= 1) t.isActive = false;\r\n }\r\n\r\n if (controls) controls.update();\r\n\r\n timeRef.current += 0.016;\r\n if (starsMaterialRef.current)\r\n starsMaterialRef.current.uniforms.time.value = timeRef.current;\r\n\r\n // Animate communication link dashes (moving dotted lines)\r\n if (linksGroupRef.current) {\r\n linksGroupRef.current.children.forEach((child: any) => {\r\n if (child.userData?.isAnimatedLink && child.material) {\r\n child.material.dashOffset -= 1.5; // Speed of animation\r\n }\r\n });\r\n }\r\n\r\n rendererRef.current.render(sceneRef.current, camera);\r\n animationRef.current = requestAnimationFrame(animate);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Imperative Handle\r\n // ==========================================================================\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n focusOn,\r\n flyTo,\r\n setView: (mode: ViewMode) => setCurrentView(mode),\r\n setTime: () => {},\r\n setTimeScale: () => {},\r\n togglePlay: () => {},\r\n setLayerVisibility: (layer: keyof LayerVisibility, visible: boolean) =>\r\n setLayers((prev) => ({ ...prev, [layer]: visible })),\r\n getCameraState: (): CameraState => {\r\n if (!cameraRef.current)\r\n return {\r\n position: { x: 0, y: 0, z: 10000 },\r\n target: { x: 0, y: 0, z: 0 },\r\n up: { x: 0, y: 1, z: 0 },\r\n fov: 45,\r\n near: 0.1,\r\n far: 100000,\r\n };\r\n const c = cameraRef.current;\r\n return {\r\n position: { x: c.position.x, y: c.position.y, z: c.position.z },\r\n target: {\r\n x: controlsRef.current?.target.x || 0,\r\n y: controlsRef.current?.target.y || 0,\r\n z: controlsRef.current?.target.z || 0,\r\n },\r\n up: { x: c.up.x, y: c.up.y, z: c.up.z },\r\n fov: c.fov,\r\n near: c.near,\r\n far: c.far,\r\n };\r\n },\r\n setCameraState: (state: Partial<CameraState>) => {\r\n if (!cameraRef.current) return;\r\n if (state.position)\r\n cameraRef.current.position.set(\r\n state.position.x,\r\n state.position.y,\r\n state.position.z,\r\n );\r\n if (state.target && controlsRef.current)\r\n controlsRef.current.target.set(\r\n state.target.x,\r\n state.target.y,\r\n state.target.z,\r\n );\r\n },\r\n exportImage: (format: \"png\" | \"jpeg\" = \"png\"): string =>\r\n rendererRef.current?.domElement.toDataURL(`image/${format}`) || \"\",\r\n exportScene: (): Blob => new Blob(),\r\n getVisibleObjects: (): SpaceObject[] => [\r\n ...satellites,\r\n ...debris,\r\n ...stations,\r\n ...customObjects,\r\n ],\r\n findObjects: (q: string): SpaceObject[] =>\r\n [...satellites, ...debris, ...stations, ...customObjects].filter(\r\n (obj) =>\r\n obj.name.toLowerCase().includes(q.toLowerCase()) ||\r\n obj.id.toLowerCase().includes(q.toLowerCase()),\r\n ),\r\n addObject: () => {},\r\n removeObject: () => {},\r\n updateObject: () => {},\r\n measureDistance: (\r\n _from: string | Vector3D,\r\n _to: string | Vector3D,\r\n ): number => 0,\r\n }),\r\n [satellites, debris, stations, customObjects, focusOn],\r\n );\r\n\r\n // ==========================================================================\r\n // Effects\r\n // ==========================================================================\r\n\r\n useEffect(() => {\r\n if (THREE && OrbitControlsClass) return initScene();\r\n }, [THREE, OrbitControlsClass, initScene]);\r\n\r\n useEffect(() => {\r\n if (!isLoading && THREE) {\r\n // Cancel any existing animation loop first (prevents stacking)\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n\r\n // Start animation loop with guard\r\n isAnimatingRef.current = true;\r\n animate();\r\n\r\n return () => {\r\n // Stop animation loop cleanly\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n };\r\n }\r\n }, [isLoading, THREE, animate]);\r\n\r\n useEffect(() => {\r\n if (THREE && !isLoading) {\r\n updateObjects();\r\n updateGroundStations();\r\n updateCoverage();\r\n updateOrbits();\r\n updateLinks();\r\n }\r\n }, [\r\n THREE,\r\n isLoading,\r\n updateObjects,\r\n updateGroundStations,\r\n updateCoverage,\r\n updateOrbits,\r\n updateLinks,\r\n ]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || isLoading) return;\r\n container.addEventListener(\"mousemove\", handleMouseMove);\r\n container.addEventListener(\"click\", handleClick);\r\n return () => {\r\n container.removeEventListener(\"mousemove\", handleMouseMove);\r\n container.removeEventListener(\"click\", handleClick);\r\n };\r\n }, [isLoading, handleMouseMove, handleClick]);\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (!containerRef.current || !rendererRef.current || !cameraRef.current)\r\n return;\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const h = typeof height === \"number\" ? height : rect.height;\r\n cameraRef.current.aspect = rect.width / h;\r\n cameraRef.current.updateProjectionMatrix();\r\n rendererRef.current.setSize(rect.width, h);\r\n };\r\n window.addEventListener(\"resize\", handleResize);\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }, [height]);\r\n\r\n useEffect(() => {\r\n if (focusedObjectId) focusOn(focusedObjectId, { animate: true });\r\n }, [focusedObjectId, focusOn]);\r\n\r\n // Update sun direction for atmosphere glow (from Zendir SDK)\r\n useEffect(() => {\r\n if (THREE && atmosphereMaterialRef.current && sunDirection) {\r\n const dir = new THREE.Vector3(\r\n sunDirection.x,\r\n sunDirection.y,\r\n sunDirection.z,\r\n ).normalize();\r\n atmosphereMaterialRef.current.uniforms.uSunDirection.value = dir;\r\n }\r\n }, [THREE, sunDirection]);\r\n\r\n // Update planet positions from Zendir SDK\r\n useEffect(() => {\r\n if (!THREE || !planetPositions || !planetsGroupRef.current) return;\r\n\r\n planetsGroupRef.current.traverse((child: any) => {\r\n if (\r\n child.userData?.planetId &&\r\n planetPositions[child.userData.planetId]\r\n ) {\r\n const pos = planetPositions[child.userData.planetId];\r\n child.position.set(pos.x, pos.y, pos.z);\r\n }\r\n });\r\n }, [THREE, planetPositions]);\r\n\r\n // ==========================================================================\r\n // Render\r\n // ==========================================================================\r\n\r\n if (!webglCapabilities.available) {\r\n return (\r\n <div\r\n className={`zenspace3d-fallback ${className}`}\r\n style={{\r\n width,\r\n height: typeof height === \"number\" ? height : 600,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: \"#030508\",\r\n borderRadius: 8,\r\n fontFamily: \"ui-monospace, monospace\",\r\n ...style,\r\n }}\r\n >\r\n <div style={{ marginBottom: 16 }}>\r\n <AstroIcon\r\n name=\"public\"\r\n size=\"large\"\r\n label=\"Globe\"\r\n style={{ color: \"#22d3ee\", opacity: 0.5 }}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n fontSize: 14,\r\n }}\r\n >\r\n WebGL is not available\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error)\r\n return (\r\n <div\r\n style={{\r\n width,\r\n height,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: \"#0a0a0f\",\r\n color: \"#ff4444\",\r\n }}\r\n >\r\n <p>Error: {error}</p>\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n className={`zenspace3d ${className}`}\r\n style={{\r\n width,\r\n height: typeof height === \"number\" ? height : \"100%\",\r\n position: \"relative\",\r\n backgroundColor: \"#000\",\r\n borderRadius: 8,\r\n overflow: \"hidden\",\r\n cursor: \"grab\",\r\n ...style,\r\n }}\r\n >\r\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\r\n\r\n {isLoading && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: \"rgba(0,0,0,0.9)\",\r\n }}\r\n >\r\n <div style={{ color: \"#22d3ee\", fontSize: 14 }}>Loading...</div>\r\n </div>\r\n )}\r\n\r\n {showTools && !isLoading && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 12,\r\n left: 12,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 4,\r\n }}\r\n >\r\n <LayerBtn\r\n icon=\"satellite\"\r\n label=\"Satellites\"\r\n active={layers.satellites}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, satellites: !l.satellites }))\r\n }\r\n />\r\n <LayerBtn\r\n icon=\"home\"\r\n label=\"Stations\"\r\n active={layers.stations}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, stations: !l.stations }))\r\n }\r\n />\r\n <LayerBtn\r\n icon=\"antenna\"\r\n label=\"Ground\"\r\n active={layers.groundStations}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, groundStations: !l.groundStations }))\r\n }\r\n />\r\n <LayerBtn\r\n icon=\"timeline\"\r\n label=\"Orbits\"\r\n active={layers.orbits}\r\n onClick={() => setLayers((l) => ({ ...l, orbits: !l.orbits }))}\r\n />\r\n <LayerBtn\r\n icon=\"signal-cellular-4-bar\"\r\n label=\"Coverage\"\r\n active={layers.coverage}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, coverage: !l.coverage }))\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {!isLoading && (\r\n <ObjectLegend\r\n currentView={currentView}\r\n satellites={satellites}\r\n stations={stations}\r\n groundStations={groundStations}\r\n onObjectClick={(id, objectData) => {\r\n // Same behavior as clicking in 3D: select, callback, fly\r\n setSelection({\r\n selectedId: id,\r\n selectedObject: objectData,\r\n hoveredId: null,\r\n });\r\n callbacks?.onSelect?.(objectData);\r\n flyTo(id, { animate: true });\r\n }}\r\n />\r\n )}\r\n\r\n {hoverTooltip.visible && hoverTooltip.object && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: hoverTooltip.x + 15,\r\n top: hoverTooltip.y - 10,\r\n backgroundColor: \"rgba(20, 25, 35, 0.95)\",\r\n color: \"#e4e4e7\",\r\n padding: \"10px 14px\",\r\n borderRadius: 4,\r\n fontSize: 12,\r\n fontFamily: \"system-ui, -apple-system, sans-serif\",\r\n boxShadow: \"0 4px 20px rgba(0,0,0,0.5)\",\r\n pointerEvents: \"none\",\r\n zIndex: 100,\r\n minWidth: 140,\r\n }}\r\n >\r\n <div style={{ color: \"#ffffff\", fontWeight: 500, marginBottom: 4 }}>\r\n {hoverTooltip.object.name ||\r\n hoverTooltip.object.targetName ||\r\n \"Unknown\"}\r\n </div>\r\n {hoverTooltip.object.category && (\r\n <div style={{ color: \"#9ca3af\", fontSize: 11 }}>\r\n {hoverTooltip.object.category}\r\n </div>\r\n )}\r\n {hoverTooltip.object.overpassTime && (\r\n <div style={{ color: \"#9ca3af\", fontSize: 11, marginTop: 4 }}>\r\n Overpass time: {hoverTooltip.object.overpassTime}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Overpass labels removed - now shown only on hover */}\r\n\r\n {showInfoPanel && selection.selectedObject && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: 16,\r\n right: 12,\r\n backgroundColor: \"rgba(0,0,0,0.9)\",\r\n color: \"#e4e4e7\",\r\n padding: \"14px 18px\",\r\n borderRadius: 10,\r\n fontSize: 12,\r\n fontFamily: \"ui-monospace, monospace\",\r\n border: \"1px solid rgba(34,211,238,0.3)\",\r\n minWidth: 180,\r\n }}\r\n >\r\n <div style={{ color: \"#22d3ee\", fontWeight: 500, marginBottom: 8 }}>\r\n {selection.selectedObject.name}\r\n </div>\r\n <div\r\n style={{\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n fontSize: 10,\r\n }}\r\n >\r\n {selection.selectedObject.category}\r\n </div>\r\n <button\r\n onClick={() =>\r\n setSelection({\r\n selectedId: null,\r\n selectedObject: null,\r\n hoveredId: null,\r\n })\r\n }\r\n style={{\r\n marginTop: 10,\r\n padding: \"5px 10px\",\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n border: \"none\",\r\n borderRadius: 4,\r\n color: \"#a1a1aa\",\r\n cursor: \"pointer\",\r\n fontSize: 10,\r\n width: \"100%\",\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n )}\r\n\r\n {!isLoading && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: 12,\r\n left: 12,\r\n backgroundColor: \"rgba(0,0,0,0.5)\",\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n padding: \"5px 10px\",\r\n borderRadius: 6,\r\n fontSize: 10,\r\n }}\r\n >\r\n Drag to rotate • Scroll to zoom\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\n// =============================================================================\r\n// Sub-Components\r\n// =============================================================================\r\n\r\nfunction LayerBtn({\r\n icon,\r\n label,\r\n active,\r\n onClick,\r\n}: {\r\n icon: AstroIconName;\r\n label: string;\r\n active: boolean;\r\n onClick: () => void;\r\n}) {\r\n return (\r\n <button\r\n onClick={onClick}\r\n aria-label={`Toggle ${label} layer`}\r\n aria-pressed={active}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 6,\r\n padding: \"6px 10px\",\r\n backgroundColor: active ? \"rgba(34,211,238,0.15)\" : \"rgba(0,0,0,0.7)\",\r\n border: active\r\n ? \"1px solid rgba(34,211,238,0.4)\"\r\n : \"1px solid rgba(255,255,255,0.1)\",\r\n borderRadius: 6,\r\n cursor: \"pointer\",\r\n fontSize: \"0.6875rem\", // 11px in rem\r\n color: active ? \"#22d3ee\" : \"#b8bcc8\", // WCAG: improved contrast from #71717a\r\n minWidth: 110,\r\n }}\r\n >\r\n <span aria-hidden=\"true\">\r\n <AstroIcon name={icon} size=\"extra-small\" label=\"\" />\r\n </span>\r\n <span>{label}</span>\r\n </button>\r\n );\r\n}\r\n\r\nfunction _OverpassLabel({\r\n overpass,\r\n index,\r\n}: {\r\n overpass: OverpassInfo;\r\n index: number;\r\n}) {\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 70 + index * 60,\r\n left: \"28%\",\r\n backgroundColor: \"rgba(0,0,0,0.85)\",\r\n color: \"#e4e4e7\",\r\n padding: \"8px 12px\",\r\n borderRadius: 6,\r\n fontSize: 11,\r\n fontFamily: \"ui-monospace, monospace\",\r\n border: \"1px solid rgba(34,211,238,0.3)\",\r\n pointerEvents: \"none\",\r\n }}\r\n >\r\n <div style={{ fontWeight: 500, marginBottom: 2 }}>\r\n {overpass.targetName}\r\n </div>\r\n <div style={{ color: \"#22d3ee\" }}>\r\n Overpass: {formatDuration(overpass.timeToOverpass)}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectLegend({\r\n currentView,\r\n satellites,\r\n stations,\r\n groundStations,\r\n onObjectClick,\r\n}: {\r\n currentView: string;\r\n satellites: any[];\r\n stations: any[];\r\n groundStations: any[];\r\n onObjectClick: (id: string, objectData: any) => void;\r\n}) {\r\n const [hoveredSection, setHoveredSection] = React.useState<string | null>(\r\n null,\r\n );\r\n const [pinnedSection, setPinnedSection] = React.useState<string | null>(null);\r\n\r\n // Show section if hovered OR pinned\r\n const isExpanded = (section: string) =>\r\n hoveredSection === section || pinnedSection === section;\r\n\r\n // Click toggles pin state\r\n const togglePin = (section: string) => {\r\n setPinnedSection((prev) => (prev === section ? null : section));\r\n };\r\n\r\n const sectionStyle: React.CSSProperties = {\r\n cursor: \"pointer\",\r\n padding: \"4px 0\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n transition: \"background-color 0.15s\",\r\n };\r\n\r\n const itemStyle: React.CSSProperties = {\r\n padding: \"3px 8px\",\r\n marginLeft: 12,\r\n cursor: \"pointer\",\r\n borderRadius: 4,\r\n fontSize: 10,\r\n color: \"#a1a1aa\",\r\n transition: \"all 0.15s\",\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 12,\r\n right: 12,\r\n backgroundColor: \"rgba(0,0,0,0.85)\",\r\n color: \"#e4e4e7\",\r\n padding: \"10px 14px\",\r\n borderRadius: 8,\r\n fontSize: 11,\r\n fontFamily: \"ui-monospace, monospace\",\r\n minWidth: 160,\r\n maxHeight: 400,\r\n overflowY: \"auto\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n fontSize: 10,\r\n marginBottom: 8,\r\n }}\r\n >\r\n {currentView === \"solar-system\" ? \"Solar System\" : \"Earth Orbit\"}\r\n </div>\r\n\r\n {satellites.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection(\"satellites\")}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div\r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded(\"satellites\")\r\n ? \"rgba(255,255,255,0.05)\"\r\n : \"transparent\",\r\n }}\r\n onClick={() => togglePin(\"satellites\")}\r\n >\r\n <span>\r\n <span style={{ color: \"#00ff88\" }}>●</span> {satellites.length}{\" \"}\r\n Satellites\r\n </span>\r\n <span\r\n style={{\r\n color: pinnedSection === \"satellites\" ? \"#00ff88\" : \"#666\",\r\n fontSize: 9,\r\n }}\r\n >\r\n {isExpanded(\"satellites\") ? \"▼\" : \"▶\"}\r\n {pinnedSection === \"satellites\" ? (\r\n <>\r\n <AstroIcon\r\n name=\"bookmark\"\r\n size=\"extra-small\"\r\n label=\"\"\r\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\r\n />\r\n </>\r\n ) : null}\r\n </span>\r\n </div>\r\n {isExpanded(\"satellites\") && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {satellites.map((sat) => (\r\n <div\r\n key={sat.id}\r\n style={itemStyle}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onObjectClick(sat.id, sat);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"rgba(0,255,136,0.15)\";\r\n e.currentTarget.style.color = \"#00ff88\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n e.currentTarget.style.color = \"#a1a1aa\";\r\n }}\r\n >\r\n {sat.name || sat.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {stations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection(\"stations\")}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div\r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded(\"stations\")\r\n ? \"rgba(255,255,255,0.05)\"\r\n : \"transparent\",\r\n }}\r\n onClick={() => togglePin(\"stations\")}\r\n >\r\n <span>\r\n <span style={{ color: \"#ffd700\" }}>●</span> {stations.length}{\" \"}\r\n Stations\r\n </span>\r\n <span\r\n style={{\r\n color: pinnedSection === \"stations\" ? \"#ffd700\" : \"#666\",\r\n fontSize: 9,\r\n }}\r\n >\r\n {isExpanded(\"stations\") ? \"▼\" : \"▶\"}\r\n {pinnedSection === \"stations\" ? (\r\n <>\r\n <AstroIcon\r\n name=\"bookmark\"\r\n size=\"extra-small\"\r\n label=\"\"\r\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\r\n />\r\n </>\r\n ) : null}\r\n </span>\r\n </div>\r\n {isExpanded(\"stations\") && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {stations.map((st) => (\r\n <div\r\n key={st.id}\r\n style={itemStyle}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onObjectClick(st.id, st);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"rgba(255,215,0,0.15)\";\r\n e.currentTarget.style.color = \"#ffd700\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n e.currentTarget.style.color = \"#a1a1aa\";\r\n }}\r\n >\r\n {st.name || st.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {groundStations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection(\"groundStations\")}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div\r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded(\"groundStations\")\r\n ? \"rgba(255,255,255,0.05)\"\r\n : \"transparent\",\r\n }}\r\n onClick={() => togglePin(\"groundStations\")}\r\n >\r\n <span>\r\n <span style={{ color: \"#00ffff\" }}>▲</span>{\" \"}\r\n {groundStations.length} Ground Stations\r\n </span>\r\n <span\r\n style={{\r\n color: pinnedSection === \"groundStations\" ? \"#00ffff\" : \"#666\",\r\n fontSize: 9,\r\n }}\r\n >\r\n {isExpanded(\"groundStations\") ? \"▼\" : \"▶\"}\r\n {pinnedSection === \"groundStations\" ? (\r\n <>\r\n <AstroIcon\r\n name=\"bookmark\"\r\n size=\"extra-small\"\r\n label=\"\"\r\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\r\n />\r\n </>\r\n ) : null}\r\n </span>\r\n </div>\r\n {isExpanded(\"groundStations\") && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {groundStations.map((gs) => (\r\n <div\r\n key={gs.id}\r\n style={itemStyle}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onObjectClick(gs.id, gs);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"rgba(0,255,255,0.15)\";\r\n e.currentTarget.style.color = \"#00ffff\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n e.currentTarget.style.color = \"#a1a1aa\";\r\n }}\r\n >\r\n {gs.name || gs.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ZenSpace3D;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkEA,IAAM,iBAAkC;CACtC,SAAS;CACT,OAAO;CACP,YAAY;CACZ,QAAQ;CACR,UAAU;CACV,WAAW;CACX,gBAAgB;CAChB,QAAQ;CACR,QAAQ;CACR,gBAAgB;CAChB,UAAU;CACV,YAAY;CACZ,OAAO;CACP,MAAM;CACN,YAAY;AACd;AAEA,IAAM,6BAA6B;AACnC,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,yBAAyB;AAE/B,SAAS,yBAAkE;CACzE,IAAI;EACF,MAAM,SAAS,SAAS,cAAc,QAAQ;EAE9C,IADY,OAAO,WAAW,QAC1B,GAAK,OAAO;GAAE,WAAW;GAAM,SAAS;EAAE;EAE9C,IADW,OAAO,WAAW,OACzB,GAAI,OAAO;GAAE,WAAW;GAAM,SAAS;EAAE;CAC/C,QAAQ,CAER;CACA,OAAO;EAAE,WAAW;EAAO,SAAS;CAAE;AACxC;;;;;AAUA,SAAS,MACP,IACA,IACA,GACqC;CAErC,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;CAC9D,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;CAG9D,IAAI,OAAO,QAAU,OAAO,MAC1B,OAAO;EAAE,GAAG,GAAG;EAAG,GAAG,GAAG;EAAG,GAAG,GAAG;CAAE;CAGrC,MAAM,KAAK;EAAE,GAAG,GAAG,IAAI;EAAM,GAAG,GAAG,IAAI;EAAM,GAAG,GAAG,IAAI;CAAK;CAC5D,MAAM,KAAK;EAAE,GAAG,GAAG,IAAI;EAAM,GAAG,GAAG,IAAI;EAAM,GAAG,GAAG,IAAI;CAAK;CAG5D,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;CAChD,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,CAAC;CACnC,MAAM,QAAQ,KAAK,KAAK,GAAG;CAE3B,IAAI,QAAQ,MAEV,OAAO;EACL,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG;EACzB,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG;EACzB,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG;CAC3B;CAGF,MAAM,WAAW,KAAK,IAAI,KAAK;CAC/B,IAAI,KAAK,IAAI,QAAQ,IAAI,MAEvB,OAAO;EACL,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG;EACzB,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG;EACzB,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG;CAC3B;CAGF,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;CACtC,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;CAEhC,OAAO;EACL,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG;EACrB,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG;EACrB,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG;CACvB;AACF;;;;;AAMA,SAAS,0BACP,SACA,cACA,QAC4C;CAC5C,IAAI,QAAQ,SAAS,KAAK,eAAe,KAAK,UAAU,GACtD,OAAO;CAGT,MAAM,SAAqD,CAAC;CAE5D,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,KAAK,QAAQ;EACnB,MAAM,KAAK,SAAS,IAAI,KAAK,QAAQ;EAGrC,IACE,CAAC,SAAS,GAAG,CAAC,KACd,CAAC,SAAS,GAAG,CAAC,KACd,CAAC,SAAS,GAAG,CAAC,KACd,CAAC,SAAS,GAAG,CAAC,KACd,CAAC,SAAS,GAAG,CAAC,KACd,CAAC,SAAS,GAAG,CAAC,GAEd;EAIF,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,KAAK;GAErC,MAAM,eAAe,MAAM,IAAI,IADrB,IAAI,YACsB;GAGpC,IACE,CAAC,SAAS,aAAa,CAAC,KACxB,CAAC,SAAS,aAAa,CAAC,KACxB,CAAC,SAAS,aAAa,CAAC,GAExB;GAIF,MAAM,MAAM,KAAK,KACf,aAAa,KAAK,IAAI,aAAa,KAAK,IAAI,aAAa,KAAK,CAChE;GACA,IAAI,MAAM,MAAQ;GAElB,OAAO,KAAK;IACV,GAAI,aAAa,IAAI,MAAO;IAC5B,GAAI,aAAa,IAAI,MAAO;IAC5B,GAAI,aAAa,IAAI,MAAO;GAC9B,CAAC;EACH;CACF;CAEA,OAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAMA,SAAS,qBACP,OACA,UACA,MACK;CACL,MAAM,QAAQ,IAAI,MAAM,MAAM;CAE9B,IAAI,aAAa,WAAW;EAE1B,MAAM,MAAM,IAAI,MAAM,YAAY,OAAO,KAAK,OAAO,IAAK,OAAO,EAAG;EACpE,MAAM,MAAM,IAAI,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC;EAC3D,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;EAGlC,MAAM,WAAW,IAAI,MAAM,YAAY,OAAO,KAAK,OAAO,KAAM,OAAO,EAAG;EAC1E,MAAM,WAAW,IAAI,MAAM,kBAAkB,EAAE,OAAO,QAAS,CAAC;EAChE,MAAM,YAAY,IAAI,MAAM,KAAK,UAAU,QAAQ;EACnD,UAAU,SAAS,IAAI,CAAC,OAAO;EAC/B,MAAM,IAAI,SAAS;EACnB,MAAM,aAAa,IAAI,MAAM,KAAK,UAAU,QAAQ;EACpD,WAAW,SAAS,IAAI,OAAO;EAC/B,MAAM,IAAI,UAAU;CACtB,OAAO,IAAI,aAAa,aAAa;EAEnC,MAAM,MAAM,IAAI,MAAM,YAAY,OAAO,IAAK,OAAO,IAAK,OAAO,EAAG;EACpE,MAAM,MAAM,IAAI,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC;EAC3D,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;EAElC,MAAM,WAAW,IAAI,MAAM,YAAY,OAAO,KAAK,OAAO,KAAM,OAAO,EAAG;EAC1E,MAAM,WAAW,IAAI,MAAM,kBAAkB,EAAE,OAAO,QAAS,CAAC;EAChE,MAAM,YAAY,IAAI,MAAM,KAAK,UAAU,QAAQ;EACnD,UAAU,SAAS,IAAI,CAAC,OAAO;EAC/B,MAAM,IAAI,SAAS;EACnB,MAAM,aAAa,IAAI,MAAM,KAAK,UAAU,QAAQ;EACpD,WAAW,SAAS,IAAI,OAAO;EAC/B,MAAM,IAAI,UAAU;CACtB,OAAO,IAAI,aAAa,UAAU;EAChC,MAAM,MAAM,IAAI,MAAM,oBAAoB,OAAO,IAAK,CAAC;EACvD,MAAM,MAAM,IAAI,MAAM,kBAAkB,EAAE,OAAO,QAAS,CAAC;EAC3D,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;CACpC,OAAO;EACL,MAAM,MAAM,IAAI,MAAM,eAAe,OAAO,IAAK,GAAG,CAAC;EACrD,MAAM,MAAM,IAAI,MAAM,kBAAkB,EAAE,OAAO,QAAS,CAAC;EAC3D,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;CACpC;CAEA,OAAO;AACT;AAMA,IAAa,aAAa,WACxB,SAAS,WAAW,OAAO,KAAK;CAE9B,MAAM,CAAC,cAAc,mBAAmB,SAAkB,IAAI;CAC9D,gBAAgB;EAEd,OAAO,SAAS,CACb,MAAM,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAC/B,YAAY,gBAAgB,IAAI,CAAC;CACtC,GAAG,CAAC,CAAC;CACL,IAAI,cACF,OAAO,oBAAC,kBAAD;EAAuB;EAAK,QAAQ;EAAc,GAAI;CAAQ,CAAA;CAEvE,OAAO,oBAAC,iBAAD;EAAsB;EAAK,GAAI;CAAQ,CAAA;AAChD,CACF;AAGA,IAAM,kBAAkB,WACtB,SAAS,gBAAgB,OAAO,KAAK;CACnC,MAAM,EACJ,aAAa,CAAC,GACd,SAAS,CAAC,GACV,WAAW,CAAC,GACZ,iBAAiB,CAAC,GAClB,gBAAgB,CAAC,GACjB,OAAO,eACP,iBACA,eACA,cACA,iBACA,kBAAkB,CAAC,GACnB,qBAAqB,CAAC,GACtB,YAAY,cAAc,CAAC,GAC3B,aAAa,CAAC,GACd,iBAAiB,mBAAmB,CAAC,GACrC,qBAAqB,CAAC,GACtB,iBAAiB,OACjB,QAAQ,gBACR,YAAY,MACZ,gBAAgB,MAChB,QAAQ,QACR,SAAS,KACT,WACA,aAAa,KACb,YAAY,IACZ,UACE;CAEJ,MAAM,EAAE,QAAQ,YAAY,SAAS;CACrC,MAAM,CAAC,qBAAqB,eAAe,uBAAuB,CAAC;CAGnE,MAAM,eAAe,OAAuB,IAAI;CAChD,MAAM,cAAc,OAAY,IAAI;CACpC,MAAM,WAAW,OAAY,IAAI;CACjC,MAAM,YAAY,OAAY,IAAI;CAClC,MAAM,cAAc,OAAY,IAAI;CACpC,MAAM,eAAe,OAAsB,IAAI;CAC/C,MAAM,eAAe,OAAY,IAAI;CACrC,MAAM,WAAW,OAAY,IAAI;CAEjC,MAAM,WAAW,OAAY,IAAI;CACjC,MAAM,mBAAmB,OAAY,IAAI;CACzC,MAAM,wBAAwB,OAAY,IAAI;CAC9C,MAAM,kBAAkB,OAAY,IAAI;CACxC,MAAM,gBAAgB,OAAY,IAAI;CACtC,MAAM,gBAAgB,OAAY,IAAI;CACtC,MAAM,iBAAiB,OAAY,IAAI;CACvC,MAAM,kBAAkB,OAAY,IAAI;CAExC,MAAM,UAAU,OAAO,CAAC;CACxB,MAAM,qBAAqB,OAAY,IAAI;CAC3C,MAAM,uBAAuB,OAAO,KAAK;CACzC,MAAM,mBAAmB,uBAAyB,IAAI,IAAI,CAAC;CAC3D,MAAM,iBAAiB,OAAO,KAAK;CACN,OAAO,KAAK;CAGzC,MAAM,CAAC,OAAO,YAAY,SAA6B,IAAI;CAC3D,MAAM,WAAW,OAA2B,IAAI;CAChD,SAAS,UAAU;CACnB,MAAM,CAAC,oBAAoB,yBAAyB,SAAc,IAAI;CACtE,MAAM,CAAC,WAAW,gBAAgB,SAAS,IAAI;CAC/C,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CAEtD,MAAM,CAAC,QAAQ,aAAa,SAA0B;EACpD,GAAG;EACH,GAAG;CACL,CAAC;CACD,MAAM,CAAC,WAAW,gBAAgB,SAAyB;EACzD,YAAY;EACZ,gBAAgB;EAChB,WAAW;CACb,CAAC;CACD,MAAM,CAAC,cAAc,mBAAmB,SAKrC;EAAE,SAAS;EAAO,GAAG;EAAG,GAAG;EAAG,QAAQ;CAAK,CAAC;CAC/C,MAAM,CAAC,aAAa,kBAAkB,SAAmB,IAAI;CAG7D,MAAM,iBAAiB,OAAiB,IAAI;CAE5C,MAAM,kBAAkB,eACf;EAAE,GAAG;EAAQ,GAAG;CAAe,IACtC,CAAC,QAAQ,cAAc,CACzB;CAEA,gBAAgB;EACd,eAAe,IAAI;EACnB,eAAe,UAAU;CAC3B,GAAG,CAAC,IAAI,CAAC;CAMT,gBAAgB;EACd,IAAI,CAAC,kBAAkB,WAAW;GAChC,aAAa,KAAK;GAClB;EACF;EAEA,UAAU,CAAC,CACR,MAAM,EAAE,OAAO,aAAa,eAAe,eAAe;GACzD,SAAS,WAAW;GACpB,4BAA4B,QAAQ;EACtC,CAAC,CAAC,CACD,OAAO,QAAQ;GAId,SAAS,2BAA2B;GACpC,aAAa,KAAK;EACpB,CAAC;CACL,GAAG,CAAC,kBAAkB,SAAS,CAAC;CAMhC,MAAM,YAAY,kBAAkB;EAClC,IAAI,CAAC,SAAS,CAAC,aAAa,WAAW,CAAC,oBAAoB;EAG5D,IAAI,YAAY,SAAS;GACvB,eAAe,UAAU;GACzB,IAAI,aAAa,SAAS;IACxB,qBAAqB,aAAa,OAAO;IACzC,aAAa,UAAU;GACzB;GACA,YAAY,SAAS,QAAQ;GAC7B,YAAY,QAAQ,QAAQ;GAC5B,IAAI,aAAa,SAAS,SAAS,YAAY,QAAQ,UAAU,GAC/D,aAAa,QAAQ,YAAY,YAAY,QAAQ,UAAU;EAEnE;EAEA,MAAM,YAAY,aAAa;EAC/B,MAAM,OAAO,UAAU,sBAAsB;EAC7C,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,OAAO,WAAW,WAAW,SAAS,KAAK;EAGrD,MAAM,QAAQ,IAAI,MAAM,MAAM;EAC9B,SAAS,UAAU;EAGnB,MAAM,WAAW,eAAe;EAGhC,MAAM,UAAU,aAAa,iBAAiB,MAAU;EACxD,MAAM,SAAS,IAAI,MAAM,kBAAkB,IAAI,IAAI,GAAG,GAAG,OAAO;EAEhE,MAAM,kBAAkB,aAAa,iBAAiB,MAAO;EAC7D,OAAO,SAAS,IAAI,GAAG,kBAAkB,IAAK,eAAe;EAC7D,UAAU,UAAU;EAEpB,IAAI,eAAe,UACjB,OAAO,SAAS,IACd,cAAc,SAAS,GACvB,cAAc,SAAS,GACvB,cAAc,SAAS,CACzB;EAIF,MAAM,WAAW,IAAI,MAAM,cAAc;GACvC,WAAW;GACX,OAAO;GACP,iBAAiB;GACjB,uBAAuB;EACzB,CAAC;EACD,SAAS,QAAQ,GAAG,CAAC;EACrB,SAAS,cAAc,KAAK,IAAI,OAAO,kBAAkB,CAAC,CAAC;EAC3D,UAAU,YAAY,SAAS,UAAU;EACzC,YAAY,UAAU;EAGtB,MAAM,WAAW,IAAI,mBAAmB,QAAQ,SAAS,UAAU;EACnE,SAAS,gBAAgB;EACzB,SAAS,gBAAgB;EACzB,SAAS,cAAc;EACvB,SAAS,cAAc,aAAa,iBAAiB,MAAM;EAC3D,SAAS,cAAc,aAAa,iBAAiB,MAAS;EAC9D,SAAS,YAAY,aAAa;EAClC,IAAI;EACJ,MAAM,2BAA2B;GAC/B,qBAAqB,UAAU;EACjC;EACA,MAAM,yBAAyB;GAC7B,aAAa,gBAAgB;GAC7B,mBAAmB,iBAAiB;IAClC,qBAAqB,UAAU;GACjC,GAAG,GAAI;EACT;EACA,SAAS,iBAAiB,SAAS,kBAAkB;EACrD,SAAS,iBAAiB,OAAO,gBAAgB;EACjD,YAAY,UAAU;EAEtB,aAAa,UAAU,IAAI,MAAM,UAAU;EAC3C,SAAS,UAAU,IAAI,MAAM,QAAQ;EAGrC,gBAAgB,UAAU,IAAI,MAAM,MAAM;EAC1C,gBAAgB,QAAQ,OAAO;EAC/B,MAAM,IAAI,gBAAgB,OAAO;EAEjC,cAAc,UAAU,IAAI,MAAM,MAAM;EACxC,cAAc,QAAQ,OAAO;EAC7B,MAAM,IAAI,cAAc,OAAO;EAE/B,cAAc,UAAU,IAAI,MAAM,MAAM;EACxC,cAAc,QAAQ,OAAO;EAC7B,MAAM,IAAI,cAAc,OAAO;EAE/B,eAAe,UAAU,IAAI,MAAM,MAAM;EACzC,eAAe,QAAQ,OAAO;EAC9B,MAAM,IAAI,eAAe,OAAO;EAEhC,gBAAgB,UAAU,IAAI,MAAM,MAAM;EAC1C,gBAAgB,QAAQ,OAAO;EAC/B,MAAM,IAAI,gBAAgB,OAAO;EAEjC,IAAI,aAAa,gBACf,kBAAkB,OAAO,KAAK;OACzB;GACL,YAAY,OAAO,KAAK;GACxB,iBAAiB,OAAO,KAAK;EAC/B;EAEA,YAAY,OAAO,KAAK;EACxB,eAAe,OAAO,KAAK;EAE3B,IAAI,kBAAkB,aAAa,gBACjC,iBAAiB,OAAO,KAAK;EAG/B,aAAa,KAAK;EAElB,aAAa;GACX,aAAa,gBAAgB;GAC7B,IAAI,aAAa,SAAS,qBAAqB,aAAa,OAAO;GACnE,SAAS,oBAAoB,SAAS,kBAAkB;GACxD,SAAS,oBAAoB,OAAO,gBAAgB;GACpD,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,IAAI,UAAU,SAAS,SAAS,UAAU,GACxC,UAAU,YAAY,SAAS,UAAU;EAC7C;CACF,GAAG;EAAC;EAAO;EAAoB;EAAQ;EAAe;CAAc,CAAC;CAMrE,MAAM,oBAAoB,aACvB,OAAoB,WAAoB;EACvC,MAAM,eAAe,gBAAgB;EACrC,IAAI,CAAC,cAAc;EAGnB,MAAM,iBAAiB;EACvB,MAAM,aAAa;EAGnB,MAAM,YAAY,SAAS;EAC3B,MAAM,SAAS,IAAI,MAAM,eAAe,WAAW,IAAI,EAAE;EACzD,MAAM,SAAS,IAAI,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC;EAC9D,MAAM,UAAU,IAAI,MAAM,KAAK,QAAQ,MAAM;EAC7C,QAAQ,OAAO;EACf,QAAQ,WAAW;GACjB,UAAU;GACV,UAAU;GACV,UAAU;GACV,cAAc;EAChB;EACA,aAAa,IAAI,OAAO;EAGxB,MAAM,UAAU,IAAI,MAAM,eAAe,YAAY,KAAK,IAAI,EAAE;EAChE,MAAM,UAAU,IAAI,MAAM,kBAAkB;GAC1C,OAAO;GACP,aAAa;GACb,SAAS;EACX,CAAC;EACD,aAAa,IAAI,IAAI,MAAM,KAAK,SAAS,OAAO,CAAC;EAuCjD;GAnCE;IACE,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,UAAU;GACZ;GACA;IAAE,IAAI;IAAS,OAAO;IAAU,QAAQ;IAAQ,UAAU;GAAU;GACpE;IAAE,IAAI;IAAS,OAAO;IAAU,QAAQ;IAAM,UAAU;GAAU;GAClE;IAAE,IAAI;IAAQ,OAAO;IAAU,QAAQ;IAAQ,UAAU;GAAU;GACnE;IACE,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,UAAU;GACZ;GACA;IACE,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,UAAU;GACZ;GACA;IACE,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,UAAU;GACZ;GACA;IACE,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,UAAU;GACZ;EAGF,CAAA,CAAQ,SAAS,MAAM;GAErB,MAAM,cAAc,EAAE,WAAW,MAAY,KAAK;GAClD,MAAM,eAAe,EAAE,SAAS,aAAa;GAC7C,MAAM,MAAM,IAAI,MAAM,eAAe,cAAc,IAAI,EAAE;GACzD,MAAM,MAAM,IAAI,MAAM,kBAAkB;IACtC,OAAO,EAAE;IACT,WAAW;GACb,CAAC;GACD,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,GAAG;GAEpC,MAAM,YAAY,EAAE,WAAW;GAC/B,KAAK,SAAS,IAAI;GAClB,KAAK,OAAO,EAAE;GACd,KAAK,WAAW;IACd,UAAU,EAAE;IACZ,UAAU,EAAE;IACZ,UAAU;IACV,cAAc;IACd,MAAM;KACJ,IAAI,EAAE;KACN,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,GAAG,MAAM,CAAC;KACjD,UAAU;IACZ;GACF;GACA,aAAa,IAAI,IAAI;GACrB,iBAAiB,QAAQ,IAAI,EAAE,IAAI,IAAI;GAGvC,IAAI,EAAE,OAAO,UAAU;IACrB,MAAM,UAAU,IAAI,MAAM,aACxB,eAAe,KACf,eAAe,KACf,EACF;IACA,MAAM,UAAU,IAAI,MAAM,kBAAkB;KAC1C,OAAO;KACP,aAAa;KACb,SAAS;KACT,MAAM,MAAM;IACd,CAAC;IACD,MAAM,OAAO,IAAI,MAAM,KAAK,SAAS,OAAO;IAC5C,KAAK,SAAS,IAAI,KAAK,KAAK;IAC5B,KAAK,SAAS,KAAK,KAAK,QAAQ;IAChC,aAAa,IAAI,IAAI;GACvB;GAGA,MAAM,SAAgB,CAAC;GACvB,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,KAAK;IAC5B,MAAM,QAAS,IAAI,KAAM,KAAK,KAAK;IACnC,OAAO,KACL,IAAI,MAAM,QACR,YAAY,KAAK,IAAI,KAAK,GAC1B,GACA,YAAY,KAAK,IAAI,KAAK,CAC5B,CACF;GACF;GACA,MAAM,WAAW,IAAI,MAAM,eAAe,CAAC,CAAC,cAAc,MAAM;GAChE,MAAM,WAAW,IAAI,MAAM,kBAAkB;IAC3C,OAAO;IACP,aAAa;IACb,SAAS;GACX,CAAC;GACD,aAAa,IAAI,IAAI,MAAM,KAAK,UAAU,QAAQ,CAAC;EACrD,CAAC;EAGD,MAAM,WAAW,IAAI,MAAM,WAAW,UAAU,GAAG,GAAM;EACzD,SAAS,SAAS,IAAI,GAAG,GAAG,CAAC;EAC7B,aAAa,IAAI,QAAQ;CAC3B,GACA,CAAC,CACH;CAMA,MAAM,cAAc,aAAa,OAAoB,UAAe;EAClE,MAAM,gBAAgB,IAAI,MAAM,eAC9B,oBACA,gBACA,gBACF;EACA,MAAM,gBAAgB,IAAI,MAAM,kBAAkB;GAChD,OAAO;GACP,WAAW;EACb,CAAC;EAGD,IAD0B,MAAM,cAChC,CAAA,CAAc,KACZ,oBACC,YAAiB;GAChB,QAAQ,QAAQ,MAAM;GACtB,QAAQ,QAAQ,MAAM;GACtB,QAAQ,YAAY,MAAM;GAC1B,QAAQ,YAAY,MAAM;GAC1B,cAAc,MAAM;GACpB,cAAc,cAAc;EAC9B,GACA,KAAA,SACM,CAAC,CACT;EAEA,MAAM,QAAQ,IAAI,MAAM,KAAK,eAAe,aAAa;EACzD,MAAM,SAAS,IAAI,CAAC,KAAK,KAAK,IAAI,KAAK;EACvC,MAAM,OAAO;EACb,MAAM,IAAI,KAAK;EACf,SAAS,UAAU;CACrB,GAAG,CAAC,CAAC;CAML,MAAM,mBAAmB,aACtB,OAAoB,UAAe;EAClC,IAAI,CAAC,gBAAgB,YAAY;EAGjC,MAAM,gBAAgB,IAAI,MAAM,QAAQ,GAAG,IAAK,EAAG,CAAC,CAAC,UAAU;EAE/D,MAAM,qBAAqB,IAAI,MAAM,eACnC,qBAAqB,MACrB,IACA,EACF;EACA,MAAM,qBAAqB,IAAI,MAAM,eAAe;GAClD,UAAU,EACR,eAAe,EAAE,OAAO,cAAc,EACxC;GACA,cAAc;GACd,gBAAgB;GAChB,UAAU,MAAM;GAChB,MAAM,MAAM;GACZ,aAAa;GACb,YAAY;EACd,CAAC;EACD,MAAM,aAAa,IAAI,MAAM,KAC3B,oBACA,kBACF;EACA,WAAW,SAAS,IAAI,CAAC,KAAK,KAAK;EACnC,WAAW,OAAO;EAClB,MAAM,IAAI,UAAU;EAGpB,sBAAsB,UAAU;CAClC,GACA,CAAC,gBAAgB,UAAU,CAC7B;CAMA,MAAM,cAAc,aACjB,OAAoB,UAAe;EAClC,MAAM,gBAAgB,IAAI,MAAM,eAAe;EAC/C,MAAM,YAAY,gBAAgB,iBAAiB,OAAc;EACjE,MAAM,YAAY,IAAI,aAAa,cAAc,CAAC;EAClD,MAAM,YAAY,IAAI,aAAa,WAAW;EAE9C,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;GACpC,MAAM,SAAS,YAAY,KAAK,OAAO,IAAI;GAC3C,MAAM,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK;GACxC,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,OAAO,IAAI,CAAC;GAE3C,UAAU,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK;GAC1D,UAAU,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK;GAC9D,UAAU,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG;GAC5C,UAAU,KAAK,KAAK,OAAO;EAC7B;EAEA,cAAc,aACZ,YACA,IAAI,MAAM,gBAAgB,WAAW,CAAC,CACxC;EACA,cAAc,aACZ,WACA,IAAI,MAAM,gBAAgB,WAAW,CAAC,CACxC;EAEA,MAAM,gBAAgB,IAAI,MAAM,eAAe;GAC7C,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;GAC/B,cAAc;GACd,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,UAAU,MAAM;EAClB,CAAC;EAED,MAAM,IAAI,IAAI,MAAM,OAAO,eAAe,aAAa,CAAC;EACxD,iBAAiB,UAAU;CAC7B,GACA,CAAC,WAAW,CACd;CAMA,MAAM,iBAAiB,aAAa,OAAoB,UAAe;EACrE,MAAM,IAAI,IAAI,MAAM,aAAa,SAAU,EAAG,CAAC;EAC/C,MAAM,WAAW,IAAI,MAAM,iBAAiB,UAAU,GAAG;EACzD,SAAS,SAAS,IAAI,KAAO,KAAM,GAAK;EACxC,MAAM,IAAI,QAAQ;CACpB,GAAG,CAAC,CAAC;CAML,MAAM,mBAAmB,aAAa,OAAoB,UAAe;EACvE,MAAM,MAAM,qBAAqB;EACjC,MAAM,QAAQ,IAAI,MAAM,MAAM;EAE9B;GACE;IAAE,OAAO;IAAU,KAAK;KAAC;KAAG;KAAG;IAAC;GAAE;GAClC;IAAE,OAAO;IAAU,KAAK;KAAC;KAAG;KAAG;IAAC;GAAE;GAClC;IAAE,OAAO;IAAU,KAAK;KAAC;KAAG;KAAG;IAAC;GAAE;EACpC,CAAC,CAAC,SAAS,EAAE,OAAO,UAAU;GAC5B,MAAM,SAAS,CACb,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC,GACzB,IAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,CAC5D;GACA,MAAM,MAAM,IAAI,MAAM,eAAe,CAAC,CAAC,cAAc,MAAM;GAC3D,MAAM,MAAM,IAAI,MAAM,kBAAkB,EAAE,MAAM,CAAC;GACjD,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;EACpC,CAAC;EAED,MAAM,IAAI,KAAK;CACjB,GAAG,CAAC,CAAC;CAML,MAAM,gBAAgB,kBAAkB;EACtC,IAAI,CAAC,SAAS,CAAC,gBAAgB,WAAW,gBAAgB,gBACxD;EAEF,MAAM,QAAQ,gBAAgB;EAC9B,MAAM,UAAU,iBAAiB;EAGjC,OAAO,MAAM,SAAS,SAAS,GAAG;GAChC,MAAM,QAAQ,MAAM,SAAS;GAC7B,MAAM,OAAO,KAAK;EACpB;EACA,QAAQ,MAAM;EASd;GANE,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;EAGL,CAAA,CAAW,MAAM,GAAG,UAAU,CAAC,CAAC,SAAS,QAAQ;GAC/C,MAAM,gBACJ,IAAI,aAAa,cACb,eACA,IAAI,aAAa,WACf,WACA,IAAI,aAAa,YACf,aACA;GAEV,IAAI,CAAC,gBAAgB,gBAAgB;GAErC,IAAI,OAAO;GACX,IAAI,IAAI,aAAa,WAAW,OAAO;QAClC,IAAI,IAAI,aAAa,UAAU,OAAO;GAE3C,MAAM,iBAAiB,qBAAqB,OAAO,IAAI,UAAU,IAAI;GACrE,eAAe,SAAS,IACtB,IAAI,SAAS,GACb,IAAI,SAAS,GACb,IAAI,SAAS,CACf;GACA,eAAe,OAAO,GAAG,GAAG,CAAC;GAC7B,eAAe,WAAW;IACxB,UAAU,IAAI;IACd,UAAU,IAAI;IACd,MAAM;IACN,cAAc;GAChB;GACA,eAAe,OAAO,IAAI;GAE1B,MAAM,IAAI,cAAc;GACxB,QAAQ,IAAI,IAAI,IAAI,cAAc;EACpC,CAAC;CACH,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAMD,MAAM,uBAAuB,kBAAkB;EAC7C,IAAI,CAAC,SAAS,CAAC,gBAAgB,WAAW,gBAAgB,gBACxD;EACF,IAAI,CAAC,gBAAgB,gBAAgB;EAErC,eAAe,SAAS,OAAO;GAC7B,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,WAAW,CAAC;GAG7D,MAAM,MAAM,IAAI,MAAM,eAAe,IAAI,GAAG,CAAC;GAC7C,MAAM,MAAM,IAAI,MAAM,kBAAkB,EAAE,OAAO,MAAS,CAAC;GAC3D,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG;GACtC,OAAO,SAAS,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;GACvC,OAAO,WAAW;IAChB,UAAU,GAAG;IACb,UAAU;IACV,MAAM;IACN,cAAc;GAChB;GAEA,gBAAgB,QAAQ,IAAI,MAAM;GAClC,iBAAiB,QAAQ,IAAI,GAAG,IAAI,MAAM;GAG1C,MAAM,UAAU,IAAI,MAAM,aAAa,IAAI,IAAI,EAAE;GACjD,MAAM,UAAU,IAAI,MAAM,kBAAkB;IAC1C,OAAO;IACP,aAAa;IACb,SAAS;IACT,MAAM,MAAM;GACd,CAAC;GACD,MAAM,OAAO,IAAI,MAAM,KAAK,SAAS,OAAO;GAC5C,KAAK,SAAS,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;GACrC,KAAK,OAAO,GAAG,GAAG,CAAC;GACnB,gBAAgB,QAAQ,IAAI,IAAI;EAClC,CAAC;CACH,GAAG;EAAC;EAAO;EAAgB,gBAAgB;EAAgB;CAAW,CAAC;CAMvE,MAAM,iBAAiB,kBAAkB;EACvC,MAAM,IAAI,SAAS;EACnB,IAAI,CAAC,KAAK,CAAC,cAAc,WAAW,gBAAgB,gBAClD;EAGF,OAAO,cAAc,QAAQ,SAAS,SAAS,GAC7C,cAAc,QAAQ,OAAO,cAAc,QAAQ,SAAS,EAAE;EAGhE,IAAI,CAAC,gBAAgB,UAAU;EAM/B,mBAAmB,SAAS,aAAa;GAEvC,IAAI;GACJ,IAAI,SAAS,mBACX,SAAS,IAAI,EAAE,QACb,SAAS,kBAAkB,GAC3B,SAAS,kBAAkB,GAC3B,SAAS,kBAAkB,CAC7B;QACK;IACL,MAAM,UAAU,iBAAiB,QAAQ,IAAI,SAAS,WAAW;IACjE,IAAI,CAAC,SAAS;IACd,SAAS,QAAQ,SAAS,MAAM;GAClC;GAEA,MAAM,cAAc,OAAO,OAAO;GAClC,MAAM,YAAY,IAAI,EAAE,MAAM,SAAS,SAAS,SAAS;GACzD,MAAM,iBAAiB,IAAI,EAAE,MAC3B,SAAS,SAAS,SACpB,CAAC,CAAC,eAAe,GAAG;GAGpB,IACE,SAAS,oBACT,SAAS,iBAAiB,UAAU,KACpC,SAAS,kBAAkB,OAC3B;IACA,MAAM,eAAe,SAAS,iBAAiB,KAAK,OAClD,qBAAqB,GAAG,UAAU,GAAG,WAAW,CAAC,CACnD;IAGA,MAAM,YAAY,0BAChB,cACA,wBACA,qBAAqB,KACvB,CAAC,CAAC,KAAK,OAAO,IAAI,EAAE,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,UAAU,KAAK,UAAU,EAAE,CAAC,MAAM,CAAC;IACnC,MAAM,YAAY,IAAI,EAAE,eAAe,CAAC,CAAC,cAAc,SAAS;IAChE,MAAM,YAAY,IAAI,EAAE,kBAAkB;KACxC,OAAO;KACP,aAAa;KACb,SAAS;KACT,WAAW;IACb,CAAC;IACD,cAAc,QAAQ,IAAI,IAAI,EAAE,KAAK,WAAW,SAAS,CAAC;IAG1D,MAAM,UAAU,0BACd,cACA,wBACA,qBAAqB,KACvB,CAAC,CAAC,KAAK,OAAO,IAAI,EAAE,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,QAAQ,KAAK,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC/B,MAAM,UAAU,IAAI,EAAE,eAAe,CAAC,CAAC,cAAc,OAAO;IAC5D,MAAM,UAAU,IAAI,EAAE,kBAAkB;KACtC,OAAO;KACP,aAAa;KACb,SAAS;IACX,CAAC;IACD,cAAc,QAAQ,IAAI,IAAI,EAAE,KAAK,SAAS,OAAO,CAAC;IAGtD,IAAI,SAAS,aAAa,OACxB,KAAK,MAAM,UAAU,cAAc;KACjC,MAAM,SAAS,IAAI,EAAE,QAAQ,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CACvD,UAAU,CAAC,CACX,eAAe,kBAAkB;KACpC,MAAM,UAAU,IAAI,EAAE,eAAe,CAAC,CAAC,cAAc,CACnD,QACA,MACF,CAAC;KACD,MAAM,UAAU,IAAI,EAAE,kBAAkB;MACtC,OAAO;MACP,aAAa;MACb,SAAS;KACX,CAAC;KACD,cAAc,QAAQ,IAAI,IAAI,EAAE,KAAK,SAAS,OAAO,CAAC;IACxD;GAEJ,OAGK,IAAI,SAAS,aAAa,SAAS,aAAa,OAAO;IAC1D,MAAM,eAAe,SAAS,aAAa,KAAK,KAAK;IACrD,MAAM,aAAa,cAAc,qBAAqB;IACtD,MAAM,aAAa,aAAa,KAAK,IAAI,YAAY;IAGrD,MAAM,UAAU,IAAI,EAAE,aACpB,YACA,YACA,IACA,GACA,IACF;IACA,MAAM,UAAU,IAAI,EAAE,kBAAkB;KACtC,OAAO;KACP,aAAa;KACb,SAAS;KACT,MAAM,EAAE;KACR,YAAY;IACd,CAAC;IACD,MAAM,OAAO,IAAI,EAAE,KAAK,SAAS,OAAO;IACxC,KAAK,SAAS,KAAK,MAAM;IACzB,KAAK,OAAO,GAAG,GAAG,CAAC;IACnB,KAAK,QAAQ,KAAK,KAAK,CAAC;IACxB,KAAK,WAAW,CAAC,aAAa,CAAC;IAC/B,cAAc,QAAQ,IAAI,IAAI;IAG9B,IAAI,SAAS,kBAAkB,OAAO;KAEpC,MAAM,eADW,OAAO,MAAM,CAAC,CAAC,UACX,CAAA,CAClB,MAAM,CAAC,CACP,eAAe,qBAAqB,KAAK;KAC5C,MAAM,kBACJ,cAAc,qBAAqB;KAGrC,MAAM,UAAU,IAAI,EAAE,eAAe,iBAAiB,EAAE;KACxD,MAAM,UAAU,IAAI,EAAE,kBAAkB;MACtC,OAAO;MACP,aAAa;MACb,SAAS;MACT,MAAM,EAAE;MACR,YAAY;KACd,CAAC;KACD,MAAM,YAAY,IAAI,EAAE,KAAK,SAAS,OAAO;KAC7C,UAAU,SAAS,KAAK,YAAY;KACpC,UAAU,OAAO,MAAM;KACvB,cAAc,QAAQ,IAAI,SAAS;KAGnC,MAAM,UAAU,IAAI,EAAE,aACpB,kBAAkB,KAClB,iBACA,EACF;KACA,MAAM,UAAU,IAAI,EAAE,kBAAkB;MACtC,OAAO;MACP,aAAa;MACb,SAAS;MACT,MAAM,EAAE;KACV,CAAC;KACD,MAAM,OAAO,IAAI,EAAE,KAAK,SAAS,OAAO;KACxC,KAAK,SAAS,KAAK,YAAY;KAC/B,KAAK,OAAO,MAAM;KAClB,cAAc,QAAQ,IAAI,IAAI;IAChC;GACF;GAGA,IAAI,SAAS,kBAAkB,OAAO;IACpC,IAAI;IACJ,IAAI,SAAS,YAAY;KACvB,MAAM,KAAK,qBACT,SAAS,WAAW,UACpB,SAAS,WAAW,WACpB,CACF;KACA,mBAAmB,IAAI,EAAE,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACnD,OACE,mBAAmB,OAChB,MAAM,CAAC,CACP,UAAU,CAAC,CACX,eAAe,kBAAkB;IAEtC,MAAM,UAAU,IAAI,EAAE,eAAe,CAAC,CAAC,cAAc,CACnD,QACA,gBACF,CAAC;IACD,MAAM,UAAU,IAAI,EAAE,kBAAkB;KACtC,OAAO;KACP,aAAa;KACb,SAAS;IACX,CAAC;IACD,cAAc,QAAQ,IAAI,IAAI,EAAE,KAAK,SAAS,OAAO,CAAC;GACxD;EACF,CAAC;EAKD,gBAAgB,SAAS,SAAS;GAChC,MAAM,MAAM,qBACV,KAAK,OAAO,UACZ,KAAK,OAAO,WACZ,CACF;GAEA,MAAM,aAAa,MAAO;GAC1B,MAAM,UAAU,KAAK,gBAAgB;GACrC,MAAM,aACJ,aAAa,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK,OAAO,EAAG;GAC9D,MAAM,YAAY,IAAI,EAAE,MAAM,KAAK,SAAS,SAAS;GAErD,MAAM,UAAU,IAAI,EAAE,aAAa,YAAY,YAAY,IAAI,GAAG,IAAI;GACtE,MAAM,UAAU,IAAI,EAAE,kBAAkB;IACtC,OAAO;IACP,aAAa;IACb,SAAS,KAAK,WAAW;IACzB,MAAM,EAAE;IACR,YAAY;GACd,CAAC;GAED,MAAM,WAAW,IAAI,EAAE,KAAK,SAAS,OAAO;GAC5C,SAAS,SAAS,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;GACzC,SAAS,OAAO,GAAG,GAAG,CAAC;GACvB,SAAS,QAAQ,CAAC,KAAK,KAAK,CAAC;GAC7B,SAAS,WAAW,aAAa,CAAC;GAClC,cAAc,QAAQ,IAAI,QAAQ;GAGlC,MAAM,UAAU,IAAI,EAAE,aACpB,aAAa,IACb,aAAa,IACb,EACF;GACA,MAAM,UAAU,IAAI,EAAE,kBAAkB;IACtC,OAAO;IACP,aAAa;IACb,SAAS;IACT,MAAM,EAAE;GACV,CAAC;GACD,MAAM,OAAO,IAAI,EAAE,KAAK,SAAS,OAAO;GACxC,KAAK,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,KAAK;GAC7D,KAAK,OAAO,GAAG,GAAG,CAAC;GACnB,cAAc,QAAQ,IAAI,IAAI;EAChC,CAAC;CACH,GAAG;EACD;EACA;EACA,gBAAgB;EAChB;CACF,CAAC;CAMD,MAAM,cAAc,kBAAkB;EACpC,IAAI,CAAC,SAAS,CAAC,cAAc,WAAW,gBAAgB,gBACtD;EAEF,OAAO,cAAc,QAAQ,SAAS,SAAS,GAC7C,cAAc,QAAQ,OAAO,cAAc,QAAQ,SAAS,EAAE;EAGhE,mBAAmB,SAAS,SAAS;GACnC,MAAM,WAAW,iBAAiB,QAAQ,IAAI,KAAK,MAAM;GACzD,MAAM,SAAS,iBAAiB,QAAQ,IAAI,KAAK,IAAI;GACrD,IAAI,CAAC,YAAY,CAAC,QAAQ;GAE1B,MAAM,QACJ,KAAK,UAAU,KAAK,WAAW,WAAW,YAAY;GACxD,MAAM,MAAM,IAAI,MAAM,eAAe,CAAC,CAAC,cAAc,CACnD,SAAS,SAAS,MAAM,GACxB,OAAO,SAAS,MAAM,CACxB,CAAC;GAGD,MAAM,MAAM,IAAI,MAAM,mBAAmB;IACvC,OAAO,IAAI,MAAM,MAAM,KAAK;IAC5B,aAAa;IACb,SAAS,KAAK,WAAW,WAAW,KAAM;IAC1C,UAAU;IACV,SAAS;GACX,CAAC;GAED,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,GAAG;GACpC,KAAK,qBAAqB;GAC1B,KAAK,WAAW,EAAE,gBAAgB,KAAK;GACvC,cAAc,QAAQ,IAAI,IAAI;EAChC,CAAC;CACH,GAAG;EAAC;EAAO;EAAoB;CAAW,CAAC;CAM3C,MAAM,eAAe,kBAAkB;EACrC,IAAI,CAAC,SAAS,CAAC,eAAe,WAAW,gBAAgB,gBACvD;EAEF,OAAO,eAAe,QAAQ,SAAS,SAAS,GAC9C,eAAe,QAAQ,OAAO,eAAe,QAAQ,SAAS,EAAE;EAGlE,IAAI,CAAC,gBAAgB,QAAQ;EAE7B,WAAW,SAAS,SAAS;GAC3B,IAAI,KAAK,OAAO,SAAS,GAAG;GAC5B,MAAM,SAAS,KAAK,OAAO,KAAK,MAAM,IAAI,MAAM,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;GACtE,MAAM,MAAM,IAAI,MAAM,eAAe,CAAC,CAAC,cAAc,MAAM;GAC3D,MAAM,MAAM,IAAI,MAAM,kBAAkB;IACtC,OAAO,IAAI,MAAM,MAAM,KAAK,SAAS,SAAS;IAC9C,aAAa;IACb,SAAS;GACX,CAAC;GACD,eAAe,QAAQ,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;EACrD,CAAC;CACH,GAAG;EAAC;EAAO;EAAY,gBAAgB;EAAQ;CAAW,CAAC;CAM3D,MAAM,kBAAkB,aAAa,UAAsB;EACzD,IAAI,CAAC,aAAa,WAAW,CAAC,aAAa,WAAW,CAAC,UAAU,SAC/D;EAEF,MAAM,OAAO,aAAa,QAAQ,sBAAsB;EACxD,SAAS,QAAQ,KACb,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAS,IAAI,GACjD,GAAG,MAAM,UAAU,KAAK,OAAO,KAAK,UAAU,IAAI,CACpD;EAEA,aAAa,QAAQ,cAAc,SAAS,SAAS,UAAU,OAAO;EAEtE,MAAM,cAAqB,CAAC;EAC5B,gBAAgB,SAAS,UAAU,QAAa;GAC9C,IAAI,IAAI,UAAU,cAAc,YAAY,KAAK,GAAG;EACtD,CAAC;EAED,MAAM,aAAa,aAAa,QAAQ,iBACtC,aACA,IACF;EAEA,IAAI,WAAW,SAAS,GAAG;GACzB,IAAI,MAAM,WAAW,EAAE,CAAC;GACxB,OAAO,OAAO,CAAC,IAAI,UAAU,UAAU,MAAM,IAAI;GAEjD,IAAI,KAAK,UAAU;IACjB,gBAAgB;KACd,SAAS;KACT,GAAG,MAAM,UAAU,KAAK;KACxB,GAAG,MAAM,UAAU,KAAK;KACxB,QAAQ,IAAI,SAAS;IACvB,CAAC;IACD,IAAI,aAAa,SACf,aAAa,QAAQ,MAAM,SAAS;IACtC;GACF;EACF;EAEA,gBAAgB;GAAE,SAAS;GAAO,GAAG;GAAG,GAAG;GAAG,QAAQ;EAAK,CAAC;EAC5D,IAAI,aAAa,SAAS,aAAa,QAAQ,MAAM,SAAS;CAChE,GAAG,CAAC,CAAC;CAEL,MAAM,cAAc,aACjB,UAAsB;EACrB,IACE,CAAC,aAAa,WACd,CAAC,aAAa,WACd,CAAC,UAAU,SAEX;EAEF,MAAM,OAAO,aAAa,QAAQ,sBAAsB;EACxD,SAAS,QAAQ,KACb,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAS,IAAI,GACjD,GAAG,MAAM,UAAU,KAAK,OAAO,KAAK,UAAU,IAAI,CACpD;EAEA,aAAa,QAAQ,cAAc,SAAS,SAAS,UAAU,OAAO;EAGtE,MAAM,cAAqB,CAAC;EAC5B,gBAAgB,SAAS,UAAU,QAAa;GAC9C,IAAI,IAAI,UAAU,cAAc,YAAY,KAAK,GAAG;EACtD,CAAC;EAED,gBAAgB,SAAS,UAAU,QAAa;GAC9C,IAAI,IAAI,UAAU,cAAc,YAAY,KAAK,GAAG;EACtD,CAAC;EAED,MAAM,aAAa,aAAa,QAAQ,iBACtC,aACA,IACF;EAEA,IAAI,WAAW,SAAS,GAAG;GACzB,IAAI,MAAM,WAAW,EAAE,CAAC;GACxB,OAAO,OAAO,CAAC,IAAI,UAAU,UAAU,MAAM,IAAI;GAEjD,IAAI,KAAK,UAAU,UAAU;IAC3B,MAAM,WAAW,IAAI,SAAS;IAC9B,aAAa;KACX,YAAY;KACZ,gBAAgB,IAAI,SAAS;KAC7B,WAAW;IACb,CAAC;IACD,WAAW,WAAW,IAAI,SAAS,IAAI;IAGvC,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC;IACjC;GACF;EACF;EAEA,aAAa;GACX,YAAY;GACZ,gBAAgB;GAChB,WAAW;EACb,CAAC;EACD,WAAW,WAAW,IAAI;CAC5B,GACA,CAAC,SAAS,CACZ;CAMA,MAAM,QAAQ,aAEV,UACA,YAMG;EACH,IAAI,CAAC,SAAS,CAAC,UAAU,WAAW,CAAC,YAAY,SAAS;EAE1D,MAAM,OAAO,iBAAiB,QAAQ,IAAI,QAAQ;EAClD,IAAI,CAAC,MAIH;EAGF,MAAM,YAAY,KAAK,SAAS,MAAM;EACtC,MAAM,SAAS,UAAU;EACzB,MAAM,WAAW,YAAY;EAC7B,MAAM,WAAW,KAAK,UAAU;EAChC,MAAM,kBAAkB,aAAa;EAGrC,IAAI;EACJ,IAAI,SAAS,UACX,eAAe,QAAQ;OAClB;GAEL,MAAM,WAAW,KAAK,UAAU;GAChC,MAAM,aAAa,UAAU,OAAO;GAEpC,IAAI,UAGF,gBADqB,KAAK,UAAU,YAAY,UAAU,OAC5B;QACzB,IAAI,iBAET,eAAe;QACV,IAAI,aAAa,WAEtB,eAAe;QACV,IAAI,aAAa,aAEtB,eAAe;QACV,IAAI,aAAA,MAAkC,GAE3C,eAAe;QAGf,eAAe,OAAO,SAAS,QAAQ;EAE3C;EAGA,IAAI;EACJ,IAAI,SAAS,QACX,kBAAkB,UACf,MAAM,CAAC,CACP,IACC,IAAI,MAAM,QACR,QAAQ,OAAO,GACf,QAAQ,OAAO,GACf,QAAQ,OAAO,CACjB,CACF;OACG,IAAI,iBAAiB;GAE1B,MAAM,QAAQ,UAAU,MAAM,CAAC,CAAC,UAAU;GAC1C,kBAAkB,UACf,MAAM,CAAC,CACP,IAAI,MAAM,eAAe,YAAY,CAAC;EAC3C,OAAO;GAEL,MAAM,MAAM,UAAU,MAAM,CAAC,CAAC,UAAU;GACxC,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,GAAG,IAAK,IAAI,CAAC,CAAC,CAAC,UAAU;GAC7D,kBAAkB,UACf,MAAM,CAAC,CACP,IAAI,KAAK,eAAe,YAAY,CAAC;EAC1C;EAEA,IAAI,SAAS,YAAY,OACvB,mBAAmB,UAAU;GAC3B,WAAW,KAAK,IAAI;GACpB,UAAU;IACR,GAAG,OAAO,SAAS;IACnB,GAAG,OAAO,SAAS;IACnB,GAAG,OAAO,SAAS;GACrB;GACA,WAAW;IACT,GAAG,gBAAgB;IACnB,GAAG,gBAAgB;IACnB,GAAG,gBAAgB;GACrB;GACA,aAAa;IACX,GAAG,SAAS,OAAO;IACnB,GAAG,SAAS,OAAO;IACnB,GAAG,SAAS,OAAO;GACrB;GACA,cAAc;IAAE,GAAG,UAAU;IAAG,GAAG,UAAU;IAAG,GAAG,UAAU;GAAE;GAC/D,UAAU;GACV,UAAU;EACZ;OACK;GACL,OAAO,SAAS,KAAK,eAAe;GACpC,SAAS,OAAO,KAAK,SAAS;GAC9B,SAAS,OAAO;EAClB;EAGA,WAAW,UAAU,KAAK,UAAU,QAAQ,EAAE,IAAI,SAAS,CAAC;CAC9D,GACA,CAAC,OAAO,SAAS,CACnB;CAGA,MAAM,UAAU;CAMhB,MAAM,UAAU,kBAAkB;EAEhC,IAAI,CAAC,eAAe,SAAS;EAC7B,IAAI,CAAC,YAAY,WAAW,CAAC,SAAS,WAAW,CAAC,UAAU,SAC1D;EAEF,MAAM,SAAS,UAAU;EACzB,MAAM,WAAW,YAAY;EAG7B,IAAI,mBAAmB,SAAS,UAAU;GACxC,MAAM,IAAI,mBAAmB;GAC7B,MAAM,WAAW,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC;GACpE,MAAM,IAAI,aAAa,QAAQ;GAE/B,OAAO,SAAS,IAAI,EAAE,SAAS,KAAK,EAAE,UAAU,IAAI,EAAE,SAAS,KAAK;GACpE,OAAO,SAAS,IAAI,EAAE,SAAS,KAAK,EAAE,UAAU,IAAI,EAAE,SAAS,KAAK;GACpE,OAAO,SAAS,IAAI,EAAE,SAAS,KAAK,EAAE,UAAU,IAAI,EAAE,SAAS,KAAK;GAEpE,SAAS,OAAO,IACd,EAAE,YAAY,KAAK,EAAE,aAAa,IAAI,EAAE,YAAY,KAAK;GAC3D,SAAS,OAAO,IACd,EAAE,YAAY,KAAK,EAAE,aAAa,IAAI,EAAE,YAAY,KAAK;GAC3D,SAAS,OAAO,IACd,EAAE,YAAY,KAAK,EAAE,aAAa,IAAI,EAAE,YAAY,KAAK;GAE3D,IAAI,YAAY,GAAG,EAAE,WAAW;EAClC;EAEA,IAAI,UAAU,SAAS,OAAO;EAE9B,QAAQ,WAAW;EACnB,IAAI,iBAAiB,SACnB,iBAAiB,QAAQ,SAAS,KAAK,QAAQ,QAAQ;EAGzD,IAAI,cAAc,SAChB,cAAc,QAAQ,SAAS,SAAS,UAAe;GACrD,IAAI,MAAM,UAAU,kBAAkB,MAAM,UAC1C,MAAM,SAAS,cAAc;EAEjC,CAAC;EAGH,YAAY,QAAQ,OAAO,SAAS,SAAS,MAAM;EACnD,aAAa,UAAU,sBAAsB,OAAO;CACtD,GAAG,CAAC,CAAC;CAML,oBACE,YACO;EACL;EACA;EACA,UAAU,SAAmB,eAAe,IAAI;EAChD,eAAe,CAAC;EAChB,oBAAoB,CAAC;EACrB,kBAAkB,CAAC;EACnB,qBAAqB,OAA8B,YACjD,WAAW,UAAU;GAAE,GAAG;IAAO,QAAQ;EAAQ,EAAE;EACrD,sBAAmC;GACjC,IAAI,CAAC,UAAU,SACb,OAAO;IACL,UAAU;KAAE,GAAG;KAAG,GAAG;KAAG,GAAG;IAAM;IACjC,QAAQ;KAAE,GAAG;KAAG,GAAG;KAAG,GAAG;IAAE;IAC3B,IAAI;KAAE,GAAG;KAAG,GAAG;KAAG,GAAG;IAAE;IACvB,KAAK;IACL,MAAM;IACN,KAAK;GACP;GACF,MAAM,IAAI,UAAU;GACpB,OAAO;IACL,UAAU;KAAE,GAAG,EAAE,SAAS;KAAG,GAAG,EAAE,SAAS;KAAG,GAAG,EAAE,SAAS;IAAE;IAC9D,QAAQ;KACN,GAAG,YAAY,SAAS,OAAO,KAAK;KACpC,GAAG,YAAY,SAAS,OAAO,KAAK;KACpC,GAAG,YAAY,SAAS,OAAO,KAAK;IACtC;IACA,IAAI;KAAE,GAAG,EAAE,GAAG;KAAG,GAAG,EAAE,GAAG;KAAG,GAAG,EAAE,GAAG;IAAE;IACtC,KAAK,EAAE;IACP,MAAM,EAAE;IACR,KAAK,EAAE;GACT;EACF;EACA,iBAAiB,UAAgC;GAC/C,IAAI,CAAC,UAAU,SAAS;GACxB,IAAI,MAAM,UACR,UAAU,QAAQ,SAAS,IACzB,MAAM,SAAS,GACf,MAAM,SAAS,GACf,MAAM,SAAS,CACjB;GACF,IAAI,MAAM,UAAU,YAAY,SAC9B,YAAY,QAAQ,OAAO,IACzB,MAAM,OAAO,GACb,MAAM,OAAO,GACb,MAAM,OAAO,CACf;EACJ;EACA,cAAc,SAAyB,UACrC,YAAY,SAAS,WAAW,UAAU,SAAS,QAAQ,KAAK;EAClE,mBAAyB,IAAI,KAAK;EAClC,yBAAwC;GACtC,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;EACL;EACA,cAAc,MACZ;GAAC,GAAG;GAAY,GAAG;GAAQ,GAAG;GAAU,GAAG;EAAa,CAAC,CAAC,QACvD,QACC,IAAI,KAAK,YAAY,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,KAC/C,IAAI,GAAG,YAAY,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CACjD;EACF,iBAAiB,CAAC;EAClB,oBAAoB,CAAC;EACrB,oBAAoB,CAAC;EACrB,kBACE,OACA,QACW;CACf,IACA;EAAC;EAAY;EAAQ;EAAU;EAAe;CAAO,CACvD;CAMA,gBAAgB;EACd,IAAI,SAAS,oBAAoB,OAAO,UAAU;CACpD,GAAG;EAAC;EAAO;EAAoB;CAAS,CAAC;CAEzC,gBAAgB;EACd,IAAI,CAAC,aAAa,OAAO;GAEvB,IAAI,aAAa,SAAS;IACxB,qBAAqB,aAAa,OAAO;IACzC,aAAa,UAAU;GACzB;GAGA,eAAe,UAAU;GACzB,QAAQ;GAER,aAAa;IAEX,eAAe,UAAU;IACzB,IAAI,aAAa,SAAS;KACxB,qBAAqB,aAAa,OAAO;KACzC,aAAa,UAAU;IACzB;GACF;EACF;CACF,GAAG;EAAC;EAAW;EAAO;CAAO,CAAC;CAE9B,gBAAgB;EACd,IAAI,SAAS,CAAC,WAAW;GACvB,cAAc;GACd,qBAAqB;GACrB,eAAe;GACf,aAAa;GACb,YAAY;EACd;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,gBAAgB;EACd,MAAM,YAAY,aAAa;EAC/B,IAAI,CAAC,aAAa,WAAW;EAC7B,UAAU,iBAAiB,aAAa,eAAe;EACvD,UAAU,iBAAiB,SAAS,WAAW;EAC/C,aAAa;GACX,UAAU,oBAAoB,aAAa,eAAe;GAC1D,UAAU,oBAAoB,SAAS,WAAW;EACpD;CACF,GAAG;EAAC;EAAW;EAAiB;CAAW,CAAC;CAE5C,gBAAgB;EACd,MAAM,qBAAqB;GACzB,IAAI,CAAC,aAAa,WAAW,CAAC,YAAY,WAAW,CAAC,UAAU,SAC9D;GACF,MAAM,OAAO,aAAa,QAAQ,sBAAsB;GACxD,MAAM,IAAI,OAAO,WAAW,WAAW,SAAS,KAAK;GACrD,UAAU,QAAQ,SAAS,KAAK,QAAQ;GACxC,UAAU,QAAQ,uBAAuB;GACzC,YAAY,QAAQ,QAAQ,KAAK,OAAO,CAAC;EAC3C;EACA,OAAO,iBAAiB,UAAU,YAAY;EAC9C,aAAa,OAAO,oBAAoB,UAAU,YAAY;CAChE,GAAG,CAAC,MAAM,CAAC;CAEX,gBAAgB;EACd,IAAI,iBAAiB,QAAQ,iBAAiB,EAAE,SAAS,KAAK,CAAC;CACjE,GAAG,CAAC,iBAAiB,OAAO,CAAC;CAG7B,gBAAgB;EACd,IAAI,SAAS,sBAAsB,WAAW,cAAc;GAC1D,MAAM,MAAM,IAAI,MAAM,QACpB,aAAa,GACb,aAAa,GACb,aAAa,CACf,CAAC,CAAC,UAAU;GACZ,sBAAsB,QAAQ,SAAS,cAAc,QAAQ;EAC/D;CACF,GAAG,CAAC,OAAO,YAAY,CAAC;CAGxB,gBAAgB;EACd,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,gBAAgB,SAAS;EAE5D,gBAAgB,QAAQ,UAAU,UAAe;GAC/C,IACE,MAAM,UAAU,YAChB,gBAAgB,MAAM,SAAS,WAC/B;IACA,MAAM,MAAM,gBAAgB,MAAM,SAAS;IAC3C,MAAM,SAAS,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;GACxC;EACF,CAAC;CACH,GAAG,CAAC,OAAO,eAAe,CAAC;CAM3B,IAAI,CAAC,kBAAkB,WACrB,OACE,qBAAC,OAAD;EACE,WAAW,uBAAuB;EAClC,OAAO;GACL;GACA,QAAQ,OAAO,WAAW,WAAW,SAAS;GAC9C,SAAS;GACT,eAAe;GACf,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,YAAY;GACZ,GAAG;EACL;YAbF,CAeE,oBAAC,OAAD;GAAK,OAAO,EAAE,cAAc,GAAG;aAC7B,oBAAC,WAAD;IACE,MAAK;IACL,MAAK;IACL,OAAM;IACN,OAAO;KAAE,OAAO;KAAW,SAAS;IAAI;GACzC,CAAA;EACE,CAAA,GACL,oBAAC,OAAD;GACE,OAAO;IACL,OAAO;IACP,UAAU;GACZ;aACD;EAEI,CAAA,CACF;;CAIT,IAAI,OACF,OACE,oBAAC,OAAD;EACE,OAAO;GACL;GACA;GACA,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,OAAO;EACT;YAEA,qBAAC,KAAD,EAAA,UAAA,CAAG,WAAQ,KAAS,EAAA,CAAA;CACjB,CAAA;CAGT,OACE,qBAAC,OAAD;EACE,WAAW,cAAc;EACzB,OAAO;GACL;GACA,QAAQ,OAAO,WAAW,WAAW,SAAS;GAC9C,UAAU;GACV,iBAAiB;GACjB,cAAc;GACd,UAAU;GACV,QAAQ;GACR,GAAG;EACL;YAXF;GAaE,oBAAC,OAAD;IAAK,KAAK;IAAc,OAAO;KAAE,OAAO;KAAQ,QAAQ;IAAO;GAAI,CAAA;GAElE,aACC,oBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,KAAK;KACL,MAAM;KACN,OAAO;KACP,QAAQ;KACR,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,iBAAiB;IACnB;cAEA,oBAAC,OAAD;KAAK,OAAO;MAAE,OAAO;MAAW,UAAU;KAAG;eAAG;IAAe,CAAA;GAC5D,CAAA;GAGN,aAAa,CAAC,aACb,qBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,KAAK;KACL,MAAM;KACN,SAAS;KACT,eAAe;KACf,KAAK;IACP;cARF;KAUE,oBAAC,UAAD;MACE,MAAK;MACL,OAAM;MACN,QAAQ,OAAO;MACf,eACE,WAAW,OAAO;OAAE,GAAG;OAAG,YAAY,CAAC,EAAE;MAAW,EAAE;KAEzD,CAAA;KACD,oBAAC,UAAD;MACE,MAAK;MACL,OAAM;MACN,QAAQ,OAAO;MACf,eACE,WAAW,OAAO;OAAE,GAAG;OAAG,UAAU,CAAC,EAAE;MAAS,EAAE;KAErD,CAAA;KACD,oBAAC,UAAD;MACE,MAAK;MACL,OAAM;MACN,QAAQ,OAAO;MACf,eACE,WAAW,OAAO;OAAE,GAAG;OAAG,gBAAgB,CAAC,EAAE;MAAe,EAAE;KAEjE,CAAA;KACD,oBAAC,UAAD;MACE,MAAK;MACL,OAAM;MACN,QAAQ,OAAO;MACf,eAAe,WAAW,OAAO;OAAE,GAAG;OAAG,QAAQ,CAAC,EAAE;MAAO,EAAE;KAC9D,CAAA;KACD,oBAAC,UAAD;MACE,MAAK;MACL,OAAM;MACN,QAAQ,OAAO;MACf,eACE,WAAW,OAAO;OAAE,GAAG;OAAG,UAAU,CAAC,EAAE;MAAS,EAAE;KAErD,CAAA;IACE;;GAGN,CAAC,aACA,oBAAC,cAAD;IACe;IACD;IACF;IACM;IAChB,gBAAgB,IAAI,eAAe;KAEjC,aAAa;MACX,YAAY;MACZ,gBAAgB;MAChB,WAAW;KACb,CAAC;KACD,WAAW,WAAW,UAAU;KAChC,MAAM,IAAI,EAAE,SAAS,KAAK,CAAC;IAC7B;GACD,CAAA;GAGF,aAAa,WAAW,aAAa,UACpC,qBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,MAAM,aAAa,IAAI;KACvB,KAAK,aAAa,IAAI;KACtB,iBAAiB;KACjB,OAAO;KACP,SAAS;KACT,cAAc;KACd,UAAU;KACV,YAAY;KACZ,WAAW;KACX,eAAe;KACf,QAAQ;KACR,UAAU;IACZ;cAfF;KAiBE,oBAAC,OAAD;MAAK,OAAO;OAAE,OAAO;OAAW,YAAY;OAAK,cAAc;MAAE;gBAC9D,aAAa,OAAO,QACnB,aAAa,OAAO,cACpB;KACC,CAAA;KACJ,aAAa,OAAO,YACnB,oBAAC,OAAD;MAAK,OAAO;OAAE,OAAO;OAAW,UAAU;MAAG;gBAC1C,aAAa,OAAO;KAClB,CAAA;KAEN,aAAa,OAAO,gBACnB,qBAAC,OAAD;MAAK,OAAO;OAAE,OAAO;OAAW,UAAU;OAAI,WAAW;MAAE;gBAA3D,CAA8D,mBAC5C,aAAa,OAAO,YACjC;;IAEJ;;GAKN,iBAAiB,UAAU,kBAC1B,qBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,QAAQ;KACR,OAAO;KACP,iBAAiB;KACjB,OAAO;KACP,SAAS;KACT,cAAc;KACd,UAAU;KACV,YAAY;KACZ,QAAQ;KACR,UAAU;IACZ;cAbF;KAeE,oBAAC,OAAD;MAAK,OAAO;OAAE,OAAO;OAAW,YAAY;OAAK,cAAc;MAAE;gBAC9D,UAAU,eAAe;KACvB,CAAA;KACL,oBAAC,OAAD;MACE,OAAO;OACL,OAAO;OACP,UAAU;MACZ;gBAEC,UAAU,eAAe;KACvB,CAAA;KACL,oBAAC,UAAD;MACE,eACE,aAAa;OACX,YAAY;OACZ,gBAAgB;OAChB,WAAW;MACb,CAAC;MAEH,OAAO;OACL,WAAW;OACX,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,OAAO;OACP,QAAQ;OACR,UAAU;OACV,OAAO;MACT;gBACD;KAEO,CAAA;IACL;;GAGN,CAAC,aACA,oBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,QAAQ;KACR,MAAM;KACN,iBAAiB;KACjB,OAAO;KACP,SAAS;KACT,cAAc;KACd,UAAU;IACZ;cACD;GAEI,CAAA;EAEJ;;AAET,CACF;AAMA,SAAS,SAAS,EAChB,MACA,OACA,QACA,WAMC;CACD,OACE,qBAAC,UAAD;EACW;EACT,cAAY,UAAU,MAAM;EAC5B,gBAAc;EACd,OAAO;GACL,SAAS;GACT,YAAY;GACZ,KAAK;GACL,SAAS;GACT,iBAAiB,SAAS,0BAA0B;GACpD,QAAQ,SACJ,mCACA;GACJ,cAAc;GACd,QAAQ;GACR,UAAU;GACV,OAAO,SAAS,YAAY;GAC5B,UAAU;EACZ;YAlBF,CAoBE,oBAAC,QAAD;GAAM,eAAY;aAChB,oBAAC,WAAD;IAAW,MAAM;IAAM,MAAK;IAAc,OAAM;GAAI,CAAA;EAChD,CAAA,GACN,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA,CACb;;AAEZ;AAmCA,SAAS,aAAa,EACpB,aACA,YACA,UACA,gBACA,iBAOC;CACD,MAAM,CAAC,gBAAgB,qBAAqB,MAAM,SAChD,IACF;CACA,MAAM,CAAC,eAAe,oBAAoB,MAAM,SAAwB,IAAI;CAG5E,MAAM,cAAc,YAClB,mBAAmB,WAAW,kBAAkB;CAGlD,MAAM,aAAa,YAAoB;EACrC,kBAAkB,SAAU,SAAS,UAAU,OAAO,OAAQ;CAChE;CAEA,MAAM,eAAoC;EACxC,QAAQ;EACR,SAAS;EACT,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,YAAY;CACd;CAEA,MAAM,YAAiC;EACrC,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,cAAc;EACd,UAAU;EACV,OAAO;EACP,YAAY;CACd;CAEA,OACE,qBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK;GACL,OAAO;GACP,iBAAiB;GACjB,OAAO;GACP,SAAS;GACT,cAAc;GACd,UAAU;GACV,YAAY;GACZ,UAAU;GACV,WAAW;GACX,WAAW;EACb;YAdF;GAgBE,oBAAC,OAAD;IACE,OAAO;KACL,OAAO;KACP,UAAU;KACV,cAAc;IAChB;cAEC,gBAAgB,iBAAiB,iBAAiB;GAChD,CAAA;GAEJ,WAAW,SAAS,KACnB,qBAAC,OAAD;IACE,oBAAoB,kBAAkB,YAAY;IAClD,oBAAoB,kBAAkB,IAAI;cAF5C,CAIE,qBAAC,OAAD;KACE,OAAO;MACL,GAAG;MACH,iBAAiB,WAAW,YAAY,IACpC,2BACA;KACN;KACA,eAAe,UAAU,YAAY;eAPvC,CASE,qBAAC,QAAD,EAAA,UAAA;MACE,oBAAC,QAAD;OAAM,OAAO,EAAE,OAAO,UAAU;iBAAG;MAAO,CAAA;MAAC;MAAE,WAAW;MAAQ;MAAI;KAEhE,EAAA,CAAA,GACN,qBAAC,QAAD;MACE,OAAO;OACL,OAAO,kBAAkB,eAAe,YAAY;OACpD,UAAU;MACZ;gBAJF,CAMG,WAAW,YAAY,IAAI,MAAM,KACjC,kBAAkB,eACjB,oBAAA,UAAA,EAAA,UACE,oBAAC,WAAD;OACE,MAAK;OACL,MAAK;OACL,OAAM;OACN,OAAO;QAAE,YAAY;QAAG,eAAe;OAAS;MACjD,CAAA,EACD,CAAA,IACA,IACA;OACH;QACJ,WAAW,YAAY,KACtB,oBAAC,OAAD;KAAK,OAAO;MAAE,cAAc;MAAG,eAAe;KAAE;eAC7C,WAAW,KAAK,QACf,oBAAC,OAAD;MAEE,OAAO;MACP,UAAU,MAAM;OACd,EAAE,gBAAgB;OAClB,cAAc,IAAI,IAAI,GAAG;MAC3B;MACA,eAAe,MAAM;OACnB,EAAE,cAAc,MAAM,kBACpB;OACF,EAAE,cAAc,MAAM,QAAQ;MAChC;MACA,eAAe,MAAM;OACnB,EAAE,cAAc,MAAM,kBAAkB;OACxC,EAAE,cAAc,MAAM,QAAQ;MAChC;gBAEC,IAAI,QAAQ,IAAI;KACd,GAjBE,IAAI,EAiBN,CACN;IACE,CAAA,CAEJ;;GAGN,SAAS,SAAS,KACjB,qBAAC,OAAD;IACE,oBAAoB,kBAAkB,UAAU;IAChD,oBAAoB,kBAAkB,IAAI;cAF5C,CAIE,qBAAC,OAAD;KACE,OAAO;MACL,GAAG;MACH,iBAAiB,WAAW,UAAU,IAClC,2BACA;KACN;KACA,eAAe,UAAU,UAAU;eAPrC,CASE,qBAAC,QAAD,EAAA,UAAA;MACE,oBAAC,QAAD;OAAM,OAAO,EAAE,OAAO,UAAU;iBAAG;MAAO,CAAA;MAAC;MAAE,SAAS;MAAQ;MAAI;KAE9D,EAAA,CAAA,GACN,qBAAC,QAAD;MACE,OAAO;OACL,OAAO,kBAAkB,aAAa,YAAY;OAClD,UAAU;MACZ;gBAJF,CAMG,WAAW,UAAU,IAAI,MAAM,KAC/B,kBAAkB,aACjB,oBAAA,UAAA,EAAA,UACE,oBAAC,WAAD;OACE,MAAK;OACL,MAAK;OACL,OAAM;OACN,OAAO;QAAE,YAAY;QAAG,eAAe;OAAS;MACjD,CAAA,EACD,CAAA,IACA,IACA;OACH;QACJ,WAAW,UAAU,KACpB,oBAAC,OAAD;KAAK,OAAO;MAAE,cAAc;MAAG,eAAe;KAAE;eAC7C,SAAS,KAAK,OACb,oBAAC,OAAD;MAEE,OAAO;MACP,UAAU,MAAM;OACd,EAAE,gBAAgB;OAClB,cAAc,GAAG,IAAI,EAAE;MACzB;MACA,eAAe,MAAM;OACnB,EAAE,cAAc,MAAM,kBACpB;OACF,EAAE,cAAc,MAAM,QAAQ;MAChC;MACA,eAAe,MAAM;OACnB,EAAE,cAAc,MAAM,kBAAkB;OACxC,EAAE,cAAc,MAAM,QAAQ;MAChC;gBAEC,GAAG,QAAQ,GAAG;KACZ,GAjBE,GAAG,EAiBL,CACN;IACE,CAAA,CAEJ;;GAGN,eAAe,SAAS,KACvB,qBAAC,OAAD;IACE,oBAAoB,kBAAkB,gBAAgB;IACtD,oBAAoB,kBAAkB,IAAI;cAF5C,CAIE,qBAAC,OAAD;KACE,OAAO;MACL,GAAG;MACH,iBAAiB,WAAW,gBAAgB,IACxC,2BACA;KACN;KACA,eAAe,UAAU,gBAAgB;eAP3C,CASE,qBAAC,QAAD,EAAA,UAAA;MACE,oBAAC,QAAD;OAAM,OAAO,EAAE,OAAO,UAAU;iBAAG;MAAO,CAAA;MAAE;MAC3C,eAAe;MAAO;KACnB,EAAA,CAAA,GACN,qBAAC,QAAD;MACE,OAAO;OACL,OAAO,kBAAkB,mBAAmB,YAAY;OACxD,UAAU;MACZ;gBAJF,CAMG,WAAW,gBAAgB,IAAI,MAAM,KACrC,kBAAkB,mBACjB,oBAAA,UAAA,EAAA,UACE,oBAAC,WAAD;OACE,MAAK;OACL,MAAK;OACL,OAAM;OACN,OAAO;QAAE,YAAY;QAAG,eAAe;OAAS;MACjD,CAAA,EACD,CAAA,IACA,IACA;OACH;QACJ,WAAW,gBAAgB,KAC1B,oBAAC,OAAD;KAAK,OAAO;MAAE,cAAc;MAAG,eAAe;KAAE;eAC7C,eAAe,KAAK,OACnB,oBAAC,OAAD;MAEE,OAAO;MACP,UAAU,MAAM;OACd,EAAE,gBAAgB;OAClB,cAAc,GAAG,IAAI,EAAE;MACzB;MACA,eAAe,MAAM;OACnB,EAAE,cAAc,MAAM,kBACpB;OACF,EAAE,cAAc,MAAM,QAAQ;MAChC;MACA,eAAe,MAAM;OACnB,EAAE,cAAc,MAAM,kBAAkB;OACxC,EAAE,cAAc,MAAM,QAAQ;MAChC;gBAEC,GAAG,QAAQ,GAAG;KACZ,GAjBE,GAAG,EAiBL,CACN;IACE,CAAA,CAEJ;;EAEJ;;AAET"}