BankliPlus/temparea/solarbank/frontend/node_modules/.cache/babel-loader/e533dc2084612e8c46af975c74f834fa6a78c3cbd4d65831a70bd9213fab49f7.json
2025-08-13 18:05:26 +02:00

1 line
56 KiB
JSON

{"ast":null,"code":"import React,{useState,useEffect}from'react';import{FiActivity,FiBattery,FiWifi,FiMapPin,FiServer,FiAlertTriangle,FiRefreshCw,FiClock,FiSun,FiDroplet,FiZap}from'react-icons/fi';import{Link}from'react-router-dom';import{useAuth}from'../contexts/AuthContext';// Fallback dummy data for demonstration when API fails\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";const fallbackDevices=[{id:'device-001',name:'LILYGO-001',model:'LILYGO T-A7670G',status:'online',battery:{level:85,status:'good',voltage:3.8},signal:{strength:-65,status:'good'},location:{latitude:47.3769,longitude:8.5417,altitude:408},sensors:{temperature:24.5,humidity:65.2,solar_voltage:12.8},gps_fixed:true,last_seen:new Date().toISOString()},{id:'device-002',name:'LILYGO-002',model:'LILYGO T-A7670G',status:'idle',battery:{level:42,status:'low',voltage:3.4},signal:{strength:-85,status:'fair'},location:{latitude:47.3780,longitude:8.5390,altitude:410},sensors:{temperature:22.1,humidity:58.9,solar_voltage:8.2},gps_fixed:false,last_seen:new Date(Date.now()-3600000).toISOString()// 1 hour ago\n}];const Dashboard=()=>{var _stats$devices,_stats$devices2,_stats$telemetry,_stats$telemetry2,_stats$telemetry3,_stats$alerts,_stats$devices3,_stats$devices4;const[devices,setDevices]=useState([]);const[stats,setStats]=useState({});const[loading,setLoading]=useState(true);const[refreshing,setRefreshing]=useState(false);const[error,setError]=useState('');const[lastUpdated,setLastUpdated]=useState(null);const{user}=useAuth();useEffect(()=>{fetchDashboardData();},[]);const fetchDashboardData=async()=>{try{setLoading(true);setError('');const token=localStorage.getItem('token');// Fetch devices from API\nconst devicesResponse=await fetch('/api/devices/',{headers:{'Authorization':`Bearer ${token}`}});if(devicesResponse.ok){const devicesData=await devicesResponse.json();// Transform backend data to include frontend display properties\nconst transformedDevices=devicesData.map(device=>({...device,status:getDeviceStatus(device),battery:getBatteryInfo(device),signal:getSignalInfo(device),sensors:{temperature:device.temperature||null,humidity:device.humidity||null,solar_voltage:device.solar_voltage||null},location:{latitude:device.latitude||47.3769,// Default location if none set\nlongitude:device.longitude||8.5417,altitude:device.altitude||408},gps_fixed:device.gps_fixed||false}));setDevices(transformedDevices);// Calculate statistics from real data\nconst calculatedStats=calculateStats(transformedDevices);setStats(calculatedStats);setLastUpdated(new Date());}else{throw new Error('Failed to fetch devices');}}catch(error){console.error('Error fetching dashboard data:',error);setError('Failed to load dashboard data');// Fall back to sample data for demo purposes\nconst transformedFallback=fallbackDevices.map(device=>({...device// Add any additional transformation needed\n}));setDevices(transformedFallback);setStats(calculateStats(transformedFallback));setLastUpdated(new Date());}finally{setLoading(false);}};// Handle refresh\nconst handleRefresh=async()=>{setRefreshing(true);await fetchDashboardData();setRefreshing(false);};// Helper functions to transform backend data\nconst getDeviceStatus=device=>{if(!device.is_active)return'offline';if(!device.last_seen)return'offline';const lastSeen=new Date(device.last_seen);const now=new Date();const diffMinutes=(now-lastSeen)/(1000*60);if(diffMinutes<5)return'online';if(diffMinutes<30)return'idle';return'offline';};const getBatteryInfo=device=>{const level=device.battery_level||0;const voltage=device.battery_voltage||null;let status='good';if(level<20)status='critical';else if(level<50)status='low';return{level,status,voltage};};const getSignalInfo=device=>{const strength=device.signal_strength||-100;let status='poor';if(strength>-70)status='good';else if(strength>-85)status='fair';return{strength,status};};// Calculate statistics from device data\nconst calculateStats=deviceList=>{const now=new Date();const activeDevices=deviceList.filter(device=>device.is_active!==false).length;const onlineDevices=deviceList.filter(device=>device.status==='online').length;const criticalBatteryDevices=deviceList.filter(device=>device.battery.level<20).length;const lowBatteryDevices=deviceList.filter(device=>device.battery.level<50&&device.battery.level>=20).length;const gpsFixedDevices=deviceList.filter(device=>device.gps_fixed).length;// Calculate average values\nconst avgBattery=deviceList.length>0?Math.round(deviceList.reduce((sum,device)=>sum+device.battery.level,0)/deviceList.length):0;const avgTemperature=deviceList.length>0?Math.round(deviceList.filter(d=>{var _d$sensors;return(_d$sensors=d.sensors)===null||_d$sensors===void 0?void 0:_d$sensors.temperature;}).reduce((sum,device)=>sum+(device.sensors.temperature||0),0)/deviceList.filter(d=>{var _d$sensors2;return(_d$sensors2=d.sensors)===null||_d$sensors2===void 0?void 0:_d$sensors2.temperature;}).length*10)/10:0;const avgSolarVoltage=deviceList.length>0?Math.round(deviceList.filter(d=>{var _d$sensors3;return(_d$sensors3=d.sensors)===null||_d$sensors3===void 0?void 0:_d$sensors3.solar_voltage;}).reduce((sum,device)=>sum+(device.sensors.solar_voltage||0),0)/deviceList.filter(d=>{var _d$sensors4;return(_d$sensors4=d.sensors)===null||_d$sensors4===void 0?void 0:_d$sensors4.solar_voltage;}).length*10)/10:0;// Find latest telemetry (simulate based on last_seen)\nconst latestTelemetry=deviceList.reduce((latest,device)=>{if(!device.last_seen)return latest;const deviceTime=new Date(device.last_seen);return deviceTime>latest?deviceTime:latest;},new Date(0));return{devices:{total:deviceList.length,active:activeDevices,online:onlineDevices,offline:deviceList.length-onlineDevices,gps_fixed:gpsFixedDevices},telemetry:{total:deviceList.length*24,// Simulate: ~24 data points per device\nlatest:latestTelemetry.toISOString(),avgBattery:avgBattery,avgTemperature:avgTemperature,avgSolarVoltage:avgSolarVoltage},alerts:{critical:criticalBatteryDevices,warning:lowBatteryDevices,total:criticalBatteryDevices+lowBatteryDevices},system_time:now.toISOString()};};// Helper function to format date\nconst formatDate=dateString=>{const date=new Date(dateString);return date.toLocaleString();};// Helper function to get status color\nconst getStatusColor=status=>{switch(status){case'online':return'text-success-500';case'idle':return'text-warning-500';case'offline':return'text-danger-500';default:return'text-gray-500';}};// Helper function to get battery color\nconst getBatteryColor=status=>{switch(status){case'good':return'text-success-500';case'low':return'text-warning-500';case'critical':return'text-danger-500';default:return'text-gray-500';}};// Helper function to get signal color\nconst getSignalColor=status=>{switch(status){case'good':return'text-success-500';case'fair':return'text-warning-500';case'poor':return'text-danger-500';default:return'text-gray-500';}};if(loading){return/*#__PURE__*/_jsx(\"div\",{className:\"flex items-center justify-center h-full\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"text-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto\"}),/*#__PURE__*/_jsx(\"p\",{className:\"mt-4 text-gray-600\",children:\"Loading dashboard data...\"})]})});}return/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-start\",children:[/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"h1\",{className:\"text-2xl font-semibold text-gray-800\",children:\"Dashboard\"}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-sm text-gray-500 mt-1\",children:[\"Welcome back, \",(user===null||user===void 0?void 0:user.username)||'User',\"! Here's your LILYGO IoT overview.\"]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center gap-4\",children:[lastUpdated&&/*#__PURE__*/_jsxs(\"div\",{className:\"text-right\",children:[/*#__PURE__*/_jsxs(\"p\",{className:\"text-sm text-gray-500 flex items-center gap-1\",children:[/*#__PURE__*/_jsx(FiClock,{size:14}),\"Last updated: \",formatDate(lastUpdated.toISOString())]}),error&&/*#__PURE__*/_jsx(\"p\",{className:\"text-xs text-red-500 mt-1\",children:error})]}),/*#__PURE__*/_jsxs(\"button\",{onClick:handleRefresh,disabled:refreshing,className:`flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors ${refreshing?'opacity-50 cursor-not-allowed':''}`,children:[/*#__PURE__*/_jsx(FiRefreshCw,{className:refreshing?'animate-spin':'',size:16}),/*#__PURE__*/_jsx(\"span\",{children:refreshing?'Refreshing...':'Refresh'})]})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"p-3 rounded-full bg-primary-100 text-primary-600\",children:/*#__PURE__*/_jsx(FiServer,{className:\"w-6 h-6\"})}),/*#__PURE__*/_jsxs(\"div\",{className:\"ml-4\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-gray-500\",children:\"Total Devices\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-lg font-semibold text-gray-800\",children:((_stats$devices=stats.devices)===null||_stats$devices===void 0?void 0:_stats$devices.total)||0})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"mt-4\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"GPS Fixed\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-success-500\",children:((_stats$devices2=stats.devices)===null||_stats$devices2===void 0?void 0:_stats$devices2.gps_fixed)||0})]})})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"p-3 rounded-full bg-secondary-100 text-secondary-600\",children:/*#__PURE__*/_jsx(FiActivity,{className:\"w-6 h-6\"})}),/*#__PURE__*/_jsxs(\"div\",{className:\"ml-4\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-gray-500\",children:\"Avg Temperature\"}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-lg font-semibold text-gray-800\",children:[((_stats$telemetry=stats.telemetry)===null||_stats$telemetry===void 0?void 0:_stats$telemetry.avgTemperature)||0,\"\\xB0C\"]})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"mt-4\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Avg Battery\"}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-sm font-medium text-gray-600\",children:[((_stats$telemetry2=stats.telemetry)===null||_stats$telemetry2===void 0?void 0:_stats$telemetry2.avgBattery)||0,\"%\"]})]})})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"p-3 rounded-full bg-warning-100 text-warning-600\",children:/*#__PURE__*/_jsx(FiSun,{className:\"w-6 h-6\"})}),/*#__PURE__*/_jsxs(\"div\",{className:\"ml-4\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-gray-500\",children:\"Avg Solar\"}),/*#__PURE__*/_jsxs(\"p\",{className:\"text-lg font-semibold text-gray-800\",children:[((_stats$telemetry3=stats.telemetry)===null||_stats$telemetry3===void 0?void 0:_stats$telemetry3.avgSolarVoltage)||0,\"V\"]})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"mt-4\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Battery Alerts\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-danger-500\",children:((_stats$alerts=stats.alerts)===null||_stats$alerts===void 0?void 0:_stats$alerts.total)||0})]})})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"p-3 rounded-full bg-success-100 text-success-600\",children:/*#__PURE__*/_jsx(FiWifi,{className:\"w-6 h-6\"})}),/*#__PURE__*/_jsxs(\"div\",{className:\"ml-4\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-gray-500\",children:\"Online Devices\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-lg font-semibold text-gray-800\",children:((_stats$devices3=stats.devices)===null||_stats$devices3===void 0?void 0:_stats$devices3.online)||0})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"mt-4\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center\",children:[/*#__PURE__*/_jsx(\"p\",{className:\"text-sm text-gray-500\",children:\"Offline Devices\"}),/*#__PURE__*/_jsx(\"p\",{className:\"text-sm font-medium text-danger-500\",children:((_stats$devices4=stats.devices)===null||_stats$devices4===void 0?void 0:_stats$devices4.offline)||0})]})})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center mb-4\",children:[/*#__PURE__*/_jsx(\"h2\",{className:\"text-lg font-semibold text-gray-800\",children:\"Device Status\"}),/*#__PURE__*/_jsx(Link,{to:\"/devices\",className:\"text-sm text-primary-600 hover:text-primary-700\",children:\"View All\"})]}),/*#__PURE__*/_jsx(\"div\",{className:\"overflow-x-auto\",children:/*#__PURE__*/_jsxs(\"table\",{className:\"min-w-full divide-y divide-gray-200\",children:[/*#__PURE__*/_jsx(\"thead\",{className:\"bg-gray-50\",children:/*#__PURE__*/_jsxs(\"tr\",{children:[/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Device\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Status\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Battery\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Signal\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Sensors\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Location\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Last Seen\"})]})}),/*#__PURE__*/_jsx(\"tbody\",{className:\"bg-white divide-y divide-gray-200\",children:devices.map(device=>{var _device$sensors,_device$sensors2,_device$sensors3;return/*#__PURE__*/_jsxs(\"tr\",{className:\"hover:bg-gray-50\",children:[/*#__PURE__*/_jsxs(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:[/*#__PURE__*/_jsx(Link,{to:`/devices/${device.id}`,className:\"text-primary-600 hover:text-primary-700\",children:device.name}),/*#__PURE__*/_jsx(\"p\",{className:\"text-xs text-gray-500\",children:device.model||'LILYGO T-A7670G'})]}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:`h-2.5 w-2.5 rounded-full mr-2 ${getStatusColor(device.status).replace('text-','bg-')}`}),/*#__PURE__*/_jsx(\"span\",{className:`capitalize ${getStatusColor(device.status)}`,children:device.status})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiBattery,{className:`mr-2 ${getBatteryColor(device.battery.status)}`}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsxs(\"span\",{className:getBatteryColor(device.battery.status),children:[device.battery.level,\"%\"]}),device.battery.voltage&&/*#__PURE__*/_jsxs(\"p\",{className:\"text-xs text-gray-500\",children:[device.battery.voltage,\"V\"]})]})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiWifi,{className:`mr-2 ${getSignalColor(device.signal.status)}`}),/*#__PURE__*/_jsxs(\"span\",{className:getSignalColor(device.signal.status),children:[device.signal.strength,\" dBm\"]})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"text-sm\",children:[((_device$sensors=device.sensors)===null||_device$sensors===void 0?void 0:_device$sensors.temperature)&&/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center text-gray-500\",children:[/*#__PURE__*/_jsx(FiActivity,{className:\"mr-1\",size:12}),/*#__PURE__*/_jsxs(\"span\",{children:[device.sensors.temperature,\"\\xB0C\"]})]}),((_device$sensors2=device.sensors)===null||_device$sensors2===void 0?void 0:_device$sensors2.humidity)&&/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center text-blue-500\",children:[/*#__PURE__*/_jsx(FiDroplet,{className:\"mr-1\",size:12}),/*#__PURE__*/_jsxs(\"span\",{children:[device.sensors.humidity,\"%\"]})]}),((_device$sensors3=device.sensors)===null||_device$sensors3===void 0?void 0:_device$sensors3.solar_voltage)&&/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center text-yellow-500\",children:[/*#__PURE__*/_jsx(FiZap,{className:\"mr-1\",size:12}),/*#__PURE__*/_jsxs(\"span\",{children:[device.sensors.solar_voltage,\"V\"]})]})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"flex items-center\",children:[/*#__PURE__*/_jsx(FiMapPin,{className:`mr-2 ${device.gps_fixed?'text-success-500':'text-gray-400'}`}),/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsxs(\"span\",{className:\"text-gray-500\",children:[device.location.latitude.toFixed(4),\", \",device.location.longitude.toFixed(4)]}),/*#__PURE__*/_jsx(\"p\",{className:\"text-xs text-gray-400\",children:device.gps_fixed?'GPS Fixed':'No GPS'})]})]})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-gray-500\",children:formatDate(device.last_seen)})]},device.id);})})]})})]})]});};export default Dashboard;","map":{"version":3,"names":["React","useState","useEffect","FiActivity","FiBattery","FiWifi","FiMapPin","FiServer","FiAlertTriangle","FiRefreshCw","FiClock","FiSun","FiDroplet","FiZap","Link","useAuth","jsx","_jsx","jsxs","_jsxs","fallbackDevices","id","name","model","status","battery","level","voltage","signal","strength","location","latitude","longitude","altitude","sensors","temperature","humidity","solar_voltage","gps_fixed","last_seen","Date","toISOString","now","Dashboard","_stats$devices","_stats$devices2","_stats$telemetry","_stats$telemetry2","_stats$telemetry3","_stats$alerts","_stats$devices3","_stats$devices4","devices","setDevices","stats","setStats","loading","setLoading","refreshing","setRefreshing","error","setError","lastUpdated","setLastUpdated","user","fetchDashboardData","token","localStorage","getItem","devicesResponse","fetch","headers","ok","devicesData","json","transformedDevices","map","device","getDeviceStatus","getBatteryInfo","getSignalInfo","calculatedStats","calculateStats","Error","console","transformedFallback","handleRefresh","is_active","lastSeen","diffMinutes","battery_level","battery_voltage","signal_strength","deviceList","activeDevices","filter","length","onlineDevices","criticalBatteryDevices","lowBatteryDevices","gpsFixedDevices","avgBattery","Math","round","reduce","sum","avgTemperature","d","_d$sensors","_d$sensors2","avgSolarVoltage","_d$sensors3","_d$sensors4","latestTelemetry","latest","deviceTime","total","active","online","offline","telemetry","alerts","critical","warning","system_time","formatDate","dateString","date","toLocaleString","getStatusColor","getBatteryColor","getSignalColor","className","children","username","size","onClick","disabled","to","_device$sensors","_device$sensors2","_device$sensors3","replace","toFixed"],"sources":["/home/m3mo/Desktop/temparea/solarbank/frontend/src/pages/Dashboard.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { FiActivity, FiBattery, FiWifi, FiMapPin, FiServer, FiAlertTriangle, FiRefreshCw, FiClock, FiSun, FiDroplet, FiZap } from 'react-icons/fi';\nimport { Link } from 'react-router-dom';\nimport { useAuth } from '../contexts/AuthContext';\n\n// Fallback dummy data for demonstration when API fails\nconst fallbackDevices = [\n {\n id: 'device-001',\n name: 'LILYGO-001',\n model: 'LILYGO T-A7670G',\n status: 'online',\n battery: { level: 85, status: 'good', voltage: 3.8 },\n signal: { strength: -65, status: 'good' },\n location: { latitude: 47.3769, longitude: 8.5417, altitude: 408 },\n sensors: { temperature: 24.5, humidity: 65.2, solar_voltage: 12.8 },\n gps_fixed: true,\n last_seen: new Date().toISOString()\n },\n {\n id: 'device-002',\n name: 'LILYGO-002',\n model: 'LILYGO T-A7670G',\n status: 'idle',\n battery: { level: 42, status: 'low', voltage: 3.4 },\n signal: { strength: -85, status: 'fair' },\n location: { latitude: 47.3780, longitude: 8.5390, altitude: 410 },\n sensors: { temperature: 22.1, humidity: 58.9, solar_voltage: 8.2 },\n gps_fixed: false,\n last_seen: new Date(Date.now() - 3600000).toISOString() // 1 hour ago\n }\n];\n\nconst Dashboard = () => {\n const [devices, setDevices] = useState([]);\n const [stats, setStats] = useState({});\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const [error, setError] = useState('');\n const [lastUpdated, setLastUpdated] = useState(null);\n const { user } = useAuth();\n\n useEffect(() => {\n fetchDashboardData();\n }, []);\n\n const fetchDashboardData = async () => {\n try {\n setLoading(true);\n setError('');\n const token = localStorage.getItem('token');\n \n // Fetch devices from API\n const devicesResponse = await fetch('/api/devices/', {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n });\n\n if (devicesResponse.ok) {\n const devicesData = await devicesResponse.json();\n \n // Transform backend data to include frontend display properties\n const transformedDevices = devicesData.map(device => ({\n ...device,\n status: getDeviceStatus(device),\n battery: getBatteryInfo(device),\n signal: getSignalInfo(device),\n sensors: {\n temperature: device.temperature || null,\n humidity: device.humidity || null,\n solar_voltage: device.solar_voltage || null\n },\n location: {\n latitude: device.latitude || 47.3769, // Default location if none set\n longitude: device.longitude || 8.5417,\n altitude: device.altitude || 408\n },\n gps_fixed: device.gps_fixed || false\n }));\n \n setDevices(transformedDevices);\n \n // Calculate statistics from real data\n const calculatedStats = calculateStats(transformedDevices);\n setStats(calculatedStats);\n setLastUpdated(new Date());\n } else {\n throw new Error('Failed to fetch devices');\n }\n } catch (error) {\n console.error('Error fetching dashboard data:', error);\n setError('Failed to load dashboard data');\n \n // Fall back to sample data for demo purposes\n const transformedFallback = fallbackDevices.map(device => ({\n ...device,\n // Add any additional transformation needed\n }));\n setDevices(transformedFallback);\n setStats(calculateStats(transformedFallback));\n setLastUpdated(new Date());\n } finally {\n setLoading(false);\n }\n };\n\n // Handle refresh\n const handleRefresh = async () => {\n setRefreshing(true);\n await fetchDashboardData();\n setRefreshing(false);\n };\n\n // Helper functions to transform backend data\n const getDeviceStatus = (device) => {\n if (!device.is_active) return 'offline';\n if (!device.last_seen) return 'offline';\n \n const lastSeen = new Date(device.last_seen);\n const now = new Date();\n const diffMinutes = (now - lastSeen) / (1000 * 60);\n \n if (diffMinutes < 5) return 'online';\n if (diffMinutes < 30) return 'idle';\n return 'offline';\n };\n\n const getBatteryInfo = (device) => {\n const level = device.battery_level || 0;\n const voltage = device.battery_voltage || null;\n let status = 'good';\n if (level < 20) status = 'critical';\n else if (level < 50) status = 'low';\n \n return { level, status, voltage };\n };\n\n const getSignalInfo = (device) => {\n const strength = device.signal_strength || -100;\n let status = 'poor';\n if (strength > -70) status = 'good';\n else if (strength > -85) status = 'fair';\n \n return { strength, status };\n };\n\n // Calculate statistics from device data\n const calculateStats = (deviceList) => {\n const now = new Date();\n const activeDevices = deviceList.filter(device => device.is_active !== false).length;\n const onlineDevices = deviceList.filter(device => device.status === 'online').length;\n const criticalBatteryDevices = deviceList.filter(device => device.battery.level < 20).length;\n const lowBatteryDevices = deviceList.filter(device => device.battery.level < 50 && device.battery.level >= 20).length;\n const gpsFixedDevices = deviceList.filter(device => device.gps_fixed).length;\n \n // Calculate average values\n const avgBattery = deviceList.length > 0 \n ? Math.round(deviceList.reduce((sum, device) => sum + device.battery.level, 0) / deviceList.length)\n : 0;\n \n const avgTemperature = deviceList.length > 0 \n ? Math.round(deviceList.filter(d => d.sensors?.temperature).reduce((sum, device) => sum + (device.sensors.temperature || 0), 0) / deviceList.filter(d => d.sensors?.temperature).length * 10) / 10\n : 0;\n \n const avgSolarVoltage = deviceList.length > 0 \n ? Math.round(deviceList.filter(d => d.sensors?.solar_voltage).reduce((sum, device) => sum + (device.sensors.solar_voltage || 0), 0) / deviceList.filter(d => d.sensors?.solar_voltage).length * 10) / 10\n : 0;\n \n // Find latest telemetry (simulate based on last_seen)\n const latestTelemetry = deviceList.reduce((latest, device) => {\n if (!device.last_seen) return latest;\n const deviceTime = new Date(device.last_seen);\n return deviceTime > latest ? deviceTime : latest;\n }, new Date(0));\n\n return {\n devices: { \n total: deviceList.length, \n active: activeDevices,\n online: onlineDevices,\n offline: deviceList.length - onlineDevices,\n gps_fixed: gpsFixedDevices\n },\n telemetry: { \n total: deviceList.length * 24, // Simulate: ~24 data points per device\n latest: latestTelemetry.toISOString(),\n avgBattery: avgBattery,\n avgTemperature: avgTemperature,\n avgSolarVoltage: avgSolarVoltage\n },\n alerts: {\n critical: criticalBatteryDevices,\n warning: lowBatteryDevices,\n total: criticalBatteryDevices + lowBatteryDevices\n },\n system_time: now.toISOString()\n };\n };\n\n // Helper function to format date\n const formatDate = (dateString) => {\n const date = new Date(dateString);\n return date.toLocaleString();\n };\n\n // Helper function to get status color\n const getStatusColor = (status) => {\n switch (status) {\n case 'online':\n return 'text-success-500';\n case 'idle':\n return 'text-warning-500';\n case 'offline':\n return 'text-danger-500';\n default:\n return 'text-gray-500';\n }\n };\n\n // Helper function to get battery color\n const getBatteryColor = (status) => {\n switch (status) {\n case 'good':\n return 'text-success-500';\n case 'low':\n return 'text-warning-500';\n case 'critical':\n return 'text-danger-500';\n default:\n return 'text-gray-500';\n }\n };\n\n // Helper function to get signal color\n const getSignalColor = (status) => {\n switch (status) {\n case 'good':\n return 'text-success-500';\n case 'fair':\n return 'text-warning-500';\n case 'poor':\n return 'text-danger-500';\n default:\n return 'text-gray-500';\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Loading dashboard data...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex justify-between items-start\">\n <div>\n <h1 className=\"text-2xl font-semibold text-gray-800\">Dashboard</h1>\n <p className=\"text-sm text-gray-500 mt-1\">\n Welcome back, {user?.username || 'User'}! Here's your LILYGO IoT overview.\n </p>\n </div>\n <div className=\"flex items-center gap-4\">\n {lastUpdated && (\n <div className=\"text-right\">\n <p className=\"text-sm text-gray-500 flex items-center gap-1\">\n <FiClock size={14} />\n Last updated: {formatDate(lastUpdated.toISOString())}\n </p>\n {error && (\n <p className=\"text-xs text-red-500 mt-1\">{error}</p>\n )}\n </div>\n )}\n <button\n onClick={handleRefresh}\n disabled={refreshing}\n className={`flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors ${\n refreshing ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <FiRefreshCw className={refreshing ? 'animate-spin' : ''} size={16} />\n <span>{refreshing ? 'Refreshing...' : 'Refresh'}</span>\n </button>\n </div>\n </div>\n\n {/* Stats Overview */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\">\n <div className=\"dashboard-card\">\n <div className=\"flex items-center\">\n <div className=\"p-3 rounded-full bg-primary-100 text-primary-600\">\n <FiServer className=\"w-6 h-6\" />\n </div>\n <div className=\"ml-4\">\n <p className=\"text-sm font-medium text-gray-500\">Total Devices</p>\n <p className=\"text-lg font-semibold text-gray-800\">{stats.devices?.total || 0}</p>\n </div>\n </div>\n <div className=\"mt-4\">\n <div className=\"flex justify-between items-center\">\n <p className=\"text-sm text-gray-500\">GPS Fixed</p>\n <p className=\"text-sm font-medium text-success-500\">{stats.devices?.gps_fixed || 0}</p>\n </div>\n </div>\n </div>\n\n <div className=\"dashboard-card\">\n <div className=\"flex items-center\">\n <div className=\"p-3 rounded-full bg-secondary-100 text-secondary-600\">\n <FiActivity className=\"w-6 h-6\" />\n </div>\n <div className=\"ml-4\">\n <p className=\"text-sm font-medium text-gray-500\">Avg Temperature</p>\n <p className=\"text-lg font-semibold text-gray-800\">{stats.telemetry?.avgTemperature || 0}°C</p>\n </div>\n </div>\n <div className=\"mt-4\">\n <div className=\"flex justify-between items-center\">\n <p className=\"text-sm text-gray-500\">Avg Battery</p>\n <p className=\"text-sm font-medium text-gray-600\">{stats.telemetry?.avgBattery || 0}%</p>\n </div>\n </div>\n </div>\n\n <div className=\"dashboard-card\">\n <div className=\"flex items-center\">\n <div className=\"p-3 rounded-full bg-warning-100 text-warning-600\">\n <FiSun className=\"w-6 h-6\" />\n </div>\n <div className=\"ml-4\">\n <p className=\"text-sm font-medium text-gray-500\">Avg Solar</p>\n <p className=\"text-lg font-semibold text-gray-800\">{stats.telemetry?.avgSolarVoltage || 0}V</p>\n </div>\n </div>\n <div className=\"mt-4\">\n <div className=\"flex justify-between items-center\">\n <p className=\"text-sm text-gray-500\">Battery Alerts</p>\n <p className=\"text-sm font-medium text-danger-500\">{stats.alerts?.total || 0}</p>\n </div>\n </div>\n </div>\n\n <div className=\"dashboard-card\">\n <div className=\"flex items-center\">\n <div className=\"p-3 rounded-full bg-success-100 text-success-600\">\n <FiWifi className=\"w-6 h-6\" />\n </div>\n <div className=\"ml-4\">\n <p className=\"text-sm font-medium text-gray-500\">Online Devices</p>\n <p className=\"text-lg font-semibold text-gray-800\">\n {stats.devices?.online || 0}\n </p>\n </div>\n </div>\n <div className=\"mt-4\">\n <div className=\"flex justify-between items-center\">\n <p className=\"text-sm text-gray-500\">Offline Devices</p>\n <p className=\"text-sm font-medium text-danger-500\">\n {stats.devices?.offline || 0}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Device List */}\n <div className=\"dashboard-card\">\n <div className=\"flex justify-between items-center mb-4\">\n <h2 className=\"text-lg font-semibold text-gray-800\">Device Status</h2>\n <Link to=\"/devices\" className=\"text-sm text-primary-600 hover:text-primary-700\">View All</Link>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Device</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Status</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Battery</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Signal</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Sensors</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Location</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Last Seen</th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {devices.map((device) => (\n <tr key={device.id} className=\"hover:bg-gray-50\">\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <Link to={`/devices/${device.id}`} className=\"text-primary-600 hover:text-primary-700\">\n {device.name}\n </Link>\n <p className=\"text-xs text-gray-500\">{device.model || 'LILYGO T-A7670G'}</p>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <div className={`h-2.5 w-2.5 rounded-full mr-2 ${getStatusColor(device.status).replace('text-', 'bg-')}`}></div>\n <span className={`capitalize ${getStatusColor(device.status)}`}>{device.status}</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <FiBattery className={`mr-2 ${getBatteryColor(device.battery.status)}`} />\n <div>\n <span className={getBatteryColor(device.battery.status)}>{device.battery.level}%</span>\n {device.battery.voltage && (\n <p className=\"text-xs text-gray-500\">{device.battery.voltage}V</p>\n )}\n </div>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <FiWifi className={`mr-2 ${getSignalColor(device.signal.status)}`} />\n <span className={getSignalColor(device.signal.status)}>{device.signal.strength} dBm</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"text-sm\">\n {device.sensors?.temperature && (\n <div className=\"flex items-center text-gray-500\">\n <FiActivity className=\"mr-1\" size={12} />\n <span>{device.sensors.temperature}°C</span>\n </div>\n )}\n {device.sensors?.humidity && (\n <div className=\"flex items-center text-blue-500\">\n <FiDroplet className=\"mr-1\" size={12} />\n <span>{device.sensors.humidity}%</span>\n </div>\n )}\n {device.sensors?.solar_voltage && (\n <div className=\"flex items-center text-yellow-500\">\n <FiZap className=\"mr-1\" size={12} />\n <span>{device.sensors.solar_voltage}V</span>\n </div>\n )}\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <FiMapPin className={`mr-2 ${device.gps_fixed ? 'text-success-500' : 'text-gray-400'}`} />\n <div>\n <span className=\"text-gray-500\">{device.location.latitude.toFixed(4)}, {device.location.longitude.toFixed(4)}</span>\n <p className=\"text-xs text-gray-400\">{device.gps_fixed ? 'GPS Fixed' : 'No GPS'}</p>\n </div>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-gray-500\">\n {formatDate(device.last_seen)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Dashboard;\n"],"mappings":"AAAA,MAAO,CAAAA,KAAK,EAAIC,QAAQ,CAAEC,SAAS,KAAQ,OAAO,CAClD,OAASC,UAAU,CAAEC,SAAS,CAAEC,MAAM,CAAEC,QAAQ,CAAEC,QAAQ,CAAEC,eAAe,CAAEC,WAAW,CAAEC,OAAO,CAAEC,KAAK,CAAEC,SAAS,CAAEC,KAAK,KAAQ,gBAAgB,CAClJ,OAASC,IAAI,KAAQ,kBAAkB,CACvC,OAASC,OAAO,KAAQ,yBAAyB,CAEjD;AAAA,OAAAC,GAAA,IAAAC,IAAA,CAAAC,IAAA,IAAAC,KAAA,yBACA,KAAM,CAAAC,eAAe,CAAG,CACtB,CACEC,EAAE,CAAE,YAAY,CAChBC,IAAI,CAAE,YAAY,CAClBC,KAAK,CAAE,iBAAiB,CACxBC,MAAM,CAAE,QAAQ,CAChBC,OAAO,CAAE,CAAEC,KAAK,CAAE,EAAE,CAAEF,MAAM,CAAE,MAAM,CAAEG,OAAO,CAAE,GAAI,CAAC,CACpDC,MAAM,CAAE,CAAEC,QAAQ,CAAE,CAAC,EAAE,CAAEL,MAAM,CAAE,MAAO,CAAC,CACzCM,QAAQ,CAAE,CAAEC,QAAQ,CAAE,OAAO,CAAEC,SAAS,CAAE,MAAM,CAAEC,QAAQ,CAAE,GAAI,CAAC,CACjEC,OAAO,CAAE,CAAEC,WAAW,CAAE,IAAI,CAAEC,QAAQ,CAAE,IAAI,CAAEC,aAAa,CAAE,IAAK,CAAC,CACnEC,SAAS,CAAE,IAAI,CACfC,SAAS,CAAE,GAAI,CAAAC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CACpC,CAAC,CACD,CACEpB,EAAE,CAAE,YAAY,CAChBC,IAAI,CAAE,YAAY,CAClBC,KAAK,CAAE,iBAAiB,CACxBC,MAAM,CAAE,MAAM,CACdC,OAAO,CAAE,CAAEC,KAAK,CAAE,EAAE,CAAEF,MAAM,CAAE,KAAK,CAAEG,OAAO,CAAE,GAAI,CAAC,CACnDC,MAAM,CAAE,CAAEC,QAAQ,CAAE,CAAC,EAAE,CAAEL,MAAM,CAAE,MAAO,CAAC,CACzCM,QAAQ,CAAE,CAAEC,QAAQ,CAAE,OAAO,CAAEC,SAAS,CAAE,MAAM,CAAEC,QAAQ,CAAE,GAAI,CAAC,CACjEC,OAAO,CAAE,CAAEC,WAAW,CAAE,IAAI,CAAEC,QAAQ,CAAE,IAAI,CAAEC,aAAa,CAAE,GAAI,CAAC,CAClEC,SAAS,CAAE,KAAK,CAChBC,SAAS,CAAE,GAAI,CAAAC,IAAI,CAACA,IAAI,CAACE,GAAG,CAAC,CAAC,CAAG,OAAO,CAAC,CAACD,WAAW,CAAC,CAAE;AAC1D,CAAC,CACF,CAED,KAAM,CAAAE,SAAS,CAAGA,CAAA,GAAM,KAAAC,cAAA,CAAAC,eAAA,CAAAC,gBAAA,CAAAC,iBAAA,CAAAC,iBAAA,CAAAC,aAAA,CAAAC,eAAA,CAAAC,eAAA,CACtB,KAAM,CAACC,OAAO,CAAEC,UAAU,CAAC,CAAGpD,QAAQ,CAAC,EAAE,CAAC,CAC1C,KAAM,CAACqD,KAAK,CAAEC,QAAQ,CAAC,CAAGtD,QAAQ,CAAC,CAAC,CAAC,CAAC,CACtC,KAAM,CAACuD,OAAO,CAAEC,UAAU,CAAC,CAAGxD,QAAQ,CAAC,IAAI,CAAC,CAC5C,KAAM,CAACyD,UAAU,CAAEC,aAAa,CAAC,CAAG1D,QAAQ,CAAC,KAAK,CAAC,CACnD,KAAM,CAAC2D,KAAK,CAAEC,QAAQ,CAAC,CAAG5D,QAAQ,CAAC,EAAE,CAAC,CACtC,KAAM,CAAC6D,WAAW,CAAEC,cAAc,CAAC,CAAG9D,QAAQ,CAAC,IAAI,CAAC,CACpD,KAAM,CAAE+D,IAAK,CAAC,CAAGjD,OAAO,CAAC,CAAC,CAE1Bb,SAAS,CAAC,IAAM,CACd+D,kBAAkB,CAAC,CAAC,CACtB,CAAC,CAAE,EAAE,CAAC,CAEN,KAAM,CAAAA,kBAAkB,CAAG,KAAAA,CAAA,GAAY,CACrC,GAAI,CACFR,UAAU,CAAC,IAAI,CAAC,CAChBI,QAAQ,CAAC,EAAE,CAAC,CACZ,KAAM,CAAAK,KAAK,CAAGC,YAAY,CAACC,OAAO,CAAC,OAAO,CAAC,CAE3C;AACA,KAAM,CAAAC,eAAe,CAAG,KAAM,CAAAC,KAAK,CAAC,eAAe,CAAE,CACnDC,OAAO,CAAE,CACP,eAAe,CAAE,UAAUL,KAAK,EAClC,CACF,CAAC,CAAC,CAEF,GAAIG,eAAe,CAACG,EAAE,CAAE,CACtB,KAAM,CAAAC,WAAW,CAAG,KAAM,CAAAJ,eAAe,CAACK,IAAI,CAAC,CAAC,CAEhD;AACA,KAAM,CAAAC,kBAAkB,CAAGF,WAAW,CAACG,GAAG,CAACC,MAAM,GAAK,CACpD,GAAGA,MAAM,CACTrD,MAAM,CAAEsD,eAAe,CAACD,MAAM,CAAC,CAC/BpD,OAAO,CAAEsD,cAAc,CAACF,MAAM,CAAC,CAC/BjD,MAAM,CAAEoD,aAAa,CAACH,MAAM,CAAC,CAC7B3C,OAAO,CAAE,CACPC,WAAW,CAAE0C,MAAM,CAAC1C,WAAW,EAAI,IAAI,CACvCC,QAAQ,CAAEyC,MAAM,CAACzC,QAAQ,EAAI,IAAI,CACjCC,aAAa,CAAEwC,MAAM,CAACxC,aAAa,EAAI,IACzC,CAAC,CACDP,QAAQ,CAAE,CACRC,QAAQ,CAAE8C,MAAM,CAAC9C,QAAQ,EAAI,OAAO,CAAE;AACtCC,SAAS,CAAE6C,MAAM,CAAC7C,SAAS,EAAI,MAAM,CACrCC,QAAQ,CAAE4C,MAAM,CAAC5C,QAAQ,EAAI,GAC/B,CAAC,CACDK,SAAS,CAAEuC,MAAM,CAACvC,SAAS,EAAI,KACjC,CAAC,CAAC,CAAC,CAEHe,UAAU,CAACsB,kBAAkB,CAAC,CAE9B;AACA,KAAM,CAAAM,eAAe,CAAGC,cAAc,CAACP,kBAAkB,CAAC,CAC1DpB,QAAQ,CAAC0B,eAAe,CAAC,CACzBlB,cAAc,CAAC,GAAI,CAAAvB,IAAI,CAAC,CAAC,CAAC,CAC5B,CAAC,IAAM,CACL,KAAM,IAAI,CAAA2C,KAAK,CAAC,yBAAyB,CAAC,CAC5C,CACF,CAAE,MAAOvB,KAAK,CAAE,CACdwB,OAAO,CAACxB,KAAK,CAAC,gCAAgC,CAAEA,KAAK,CAAC,CACtDC,QAAQ,CAAC,+BAA+B,CAAC,CAEzC;AACA,KAAM,CAAAwB,mBAAmB,CAAGjE,eAAe,CAACwD,GAAG,CAACC,MAAM,GAAK,CACzD,GAAGA,MACH;AACF,CAAC,CAAC,CAAC,CACHxB,UAAU,CAACgC,mBAAmB,CAAC,CAC/B9B,QAAQ,CAAC2B,cAAc,CAACG,mBAAmB,CAAC,CAAC,CAC7CtB,cAAc,CAAC,GAAI,CAAAvB,IAAI,CAAC,CAAC,CAAC,CAC5B,CAAC,OAAS,CACRiB,UAAU,CAAC,KAAK,CAAC,CACnB,CACF,CAAC,CAED;AACA,KAAM,CAAA6B,aAAa,CAAG,KAAAA,CAAA,GAAY,CAChC3B,aAAa,CAAC,IAAI,CAAC,CACnB,KAAM,CAAAM,kBAAkB,CAAC,CAAC,CAC1BN,aAAa,CAAC,KAAK,CAAC,CACtB,CAAC,CAED;AACA,KAAM,CAAAmB,eAAe,CAAID,MAAM,EAAK,CAClC,GAAI,CAACA,MAAM,CAACU,SAAS,CAAE,MAAO,SAAS,CACvC,GAAI,CAACV,MAAM,CAACtC,SAAS,CAAE,MAAO,SAAS,CAEvC,KAAM,CAAAiD,QAAQ,CAAG,GAAI,CAAAhD,IAAI,CAACqC,MAAM,CAACtC,SAAS,CAAC,CAC3C,KAAM,CAAAG,GAAG,CAAG,GAAI,CAAAF,IAAI,CAAC,CAAC,CACtB,KAAM,CAAAiD,WAAW,CAAG,CAAC/C,GAAG,CAAG8C,QAAQ,GAAK,IAAI,CAAG,EAAE,CAAC,CAElD,GAAIC,WAAW,CAAG,CAAC,CAAE,MAAO,QAAQ,CACpC,GAAIA,WAAW,CAAG,EAAE,CAAE,MAAO,MAAM,CACnC,MAAO,SAAS,CAClB,CAAC,CAED,KAAM,CAAAV,cAAc,CAAIF,MAAM,EAAK,CACjC,KAAM,CAAAnD,KAAK,CAAGmD,MAAM,CAACa,aAAa,EAAI,CAAC,CACvC,KAAM,CAAA/D,OAAO,CAAGkD,MAAM,CAACc,eAAe,EAAI,IAAI,CAC9C,GAAI,CAAAnE,MAAM,CAAG,MAAM,CACnB,GAAIE,KAAK,CAAG,EAAE,CAAEF,MAAM,CAAG,UAAU,CAAC,IAC/B,IAAIE,KAAK,CAAG,EAAE,CAAEF,MAAM,CAAG,KAAK,CAEnC,MAAO,CAAEE,KAAK,CAAEF,MAAM,CAAEG,OAAQ,CAAC,CACnC,CAAC,CAED,KAAM,CAAAqD,aAAa,CAAIH,MAAM,EAAK,CAChC,KAAM,CAAAhD,QAAQ,CAAGgD,MAAM,CAACe,eAAe,EAAI,CAAC,GAAG,CAC/C,GAAI,CAAApE,MAAM,CAAG,MAAM,CACnB,GAAIK,QAAQ,CAAG,CAAC,EAAE,CAAEL,MAAM,CAAG,MAAM,CAAC,IAC/B,IAAIK,QAAQ,CAAG,CAAC,EAAE,CAAEL,MAAM,CAAG,MAAM,CAExC,MAAO,CAAEK,QAAQ,CAAEL,MAAO,CAAC,CAC7B,CAAC,CAED;AACA,KAAM,CAAA0D,cAAc,CAAIW,UAAU,EAAK,CACrC,KAAM,CAAAnD,GAAG,CAAG,GAAI,CAAAF,IAAI,CAAC,CAAC,CACtB,KAAM,CAAAsD,aAAa,CAAGD,UAAU,CAACE,MAAM,CAAClB,MAAM,EAAIA,MAAM,CAACU,SAAS,GAAK,KAAK,CAAC,CAACS,MAAM,CACpF,KAAM,CAAAC,aAAa,CAAGJ,UAAU,CAACE,MAAM,CAAClB,MAAM,EAAIA,MAAM,CAACrD,MAAM,GAAK,QAAQ,CAAC,CAACwE,MAAM,CACpF,KAAM,CAAAE,sBAAsB,CAAGL,UAAU,CAACE,MAAM,CAAClB,MAAM,EAAIA,MAAM,CAACpD,OAAO,CAACC,KAAK,CAAG,EAAE,CAAC,CAACsE,MAAM,CAC5F,KAAM,CAAAG,iBAAiB,CAAGN,UAAU,CAACE,MAAM,CAAClB,MAAM,EAAIA,MAAM,CAACpD,OAAO,CAACC,KAAK,CAAG,EAAE,EAAImD,MAAM,CAACpD,OAAO,CAACC,KAAK,EAAI,EAAE,CAAC,CAACsE,MAAM,CACrH,KAAM,CAAAI,eAAe,CAAGP,UAAU,CAACE,MAAM,CAAClB,MAAM,EAAIA,MAAM,CAACvC,SAAS,CAAC,CAAC0D,MAAM,CAE5E;AACA,KAAM,CAAAK,UAAU,CAAGR,UAAU,CAACG,MAAM,CAAG,CAAC,CACpCM,IAAI,CAACC,KAAK,CAACV,UAAU,CAACW,MAAM,CAAC,CAACC,GAAG,CAAE5B,MAAM,GAAK4B,GAAG,CAAG5B,MAAM,CAACpD,OAAO,CAACC,KAAK,CAAE,CAAC,CAAC,CAAGmE,UAAU,CAACG,MAAM,CAAC,CACjG,CAAC,CAEL,KAAM,CAAAU,cAAc,CAAGb,UAAU,CAACG,MAAM,CAAG,CAAC,CACxCM,IAAI,CAACC,KAAK,CAACV,UAAU,CAACE,MAAM,CAACY,CAAC,OAAAC,UAAA,QAAAA,UAAA,CAAID,CAAC,CAACzE,OAAO,UAAA0E,UAAA,iBAATA,UAAA,CAAWzE,WAAW,GAAC,CAACqE,MAAM,CAAC,CAACC,GAAG,CAAE5B,MAAM,GAAK4B,GAAG,EAAI5B,MAAM,CAAC3C,OAAO,CAACC,WAAW,EAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAG0D,UAAU,CAACE,MAAM,CAACY,CAAC,OAAAE,WAAA,QAAAA,WAAA,CAAIF,CAAC,CAACzE,OAAO,UAAA2E,WAAA,iBAATA,WAAA,CAAW1E,WAAW,GAAC,CAAC6D,MAAM,CAAG,EAAE,CAAC,CAAG,EAAE,CAChM,CAAC,CAEL,KAAM,CAAAc,eAAe,CAAGjB,UAAU,CAACG,MAAM,CAAG,CAAC,CACzCM,IAAI,CAACC,KAAK,CAACV,UAAU,CAACE,MAAM,CAACY,CAAC,OAAAI,WAAA,QAAAA,WAAA,CAAIJ,CAAC,CAACzE,OAAO,UAAA6E,WAAA,iBAATA,WAAA,CAAW1E,aAAa,GAAC,CAACmE,MAAM,CAAC,CAACC,GAAG,CAAE5B,MAAM,GAAK4B,GAAG,EAAI5B,MAAM,CAAC3C,OAAO,CAACG,aAAa,EAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAGwD,UAAU,CAACE,MAAM,CAACY,CAAC,OAAAK,WAAA,QAAAA,WAAA,CAAIL,CAAC,CAACzE,OAAO,UAAA8E,WAAA,iBAATA,WAAA,CAAW3E,aAAa,GAAC,CAAC2D,MAAM,CAAG,EAAE,CAAC,CAAG,EAAE,CACtM,CAAC,CAEL;AACA,KAAM,CAAAiB,eAAe,CAAGpB,UAAU,CAACW,MAAM,CAAC,CAACU,MAAM,CAAErC,MAAM,GAAK,CAC5D,GAAI,CAACA,MAAM,CAACtC,SAAS,CAAE,MAAO,CAAA2E,MAAM,CACpC,KAAM,CAAAC,UAAU,CAAG,GAAI,CAAA3E,IAAI,CAACqC,MAAM,CAACtC,SAAS,CAAC,CAC7C,MAAO,CAAA4E,UAAU,CAAGD,MAAM,CAAGC,UAAU,CAAGD,MAAM,CAClD,CAAC,CAAE,GAAI,CAAA1E,IAAI,CAAC,CAAC,CAAC,CAAC,CAEf,MAAO,CACLY,OAAO,CAAE,CACPgE,KAAK,CAAEvB,UAAU,CAACG,MAAM,CACxBqB,MAAM,CAAEvB,aAAa,CACrBwB,MAAM,CAAErB,aAAa,CACrBsB,OAAO,CAAE1B,UAAU,CAACG,MAAM,CAAGC,aAAa,CAC1C3D,SAAS,CAAE8D,eACb,CAAC,CACDoB,SAAS,CAAE,CACTJ,KAAK,CAAEvB,UAAU,CAACG,MAAM,CAAG,EAAE,CAAE;AAC/BkB,MAAM,CAAED,eAAe,CAACxE,WAAW,CAAC,CAAC,CACrC4D,UAAU,CAAEA,UAAU,CACtBK,cAAc,CAAEA,cAAc,CAC9BI,eAAe,CAAEA,eACnB,CAAC,CACDW,MAAM,CAAE,CACNC,QAAQ,CAAExB,sBAAsB,CAChCyB,OAAO,CAAExB,iBAAiB,CAC1BiB,KAAK,CAAElB,sBAAsB,CAAGC,iBAClC,CAAC,CACDyB,WAAW,CAAElF,GAAG,CAACD,WAAW,CAAC,CAC/B,CAAC,CACH,CAAC,CAED;AACA,KAAM,CAAAoF,UAAU,CAAIC,UAAU,EAAK,CACjC,KAAM,CAAAC,IAAI,CAAG,GAAI,CAAAvF,IAAI,CAACsF,UAAU,CAAC,CACjC,MAAO,CAAAC,IAAI,CAACC,cAAc,CAAC,CAAC,CAC9B,CAAC,CAED;AACA,KAAM,CAAAC,cAAc,CAAIzG,MAAM,EAAK,CACjC,OAAQA,MAAM,EACZ,IAAK,QAAQ,CACX,MAAO,kBAAkB,CAC3B,IAAK,MAAM,CACT,MAAO,kBAAkB,CAC3B,IAAK,SAAS,CACZ,MAAO,iBAAiB,CAC1B,QACE,MAAO,eAAe,CAC1B,CACF,CAAC,CAED;AACA,KAAM,CAAA0G,eAAe,CAAI1G,MAAM,EAAK,CAClC,OAAQA,MAAM,EACZ,IAAK,MAAM,CACT,MAAO,kBAAkB,CAC3B,IAAK,KAAK,CACR,MAAO,kBAAkB,CAC3B,IAAK,UAAU,CACb,MAAO,iBAAiB,CAC1B,QACE,MAAO,eAAe,CAC1B,CACF,CAAC,CAED;AACA,KAAM,CAAA2G,cAAc,CAAI3G,MAAM,EAAK,CACjC,OAAQA,MAAM,EACZ,IAAK,MAAM,CACT,MAAO,kBAAkB,CAC3B,IAAK,MAAM,CACT,MAAO,kBAAkB,CAC3B,IAAK,MAAM,CACT,MAAO,iBAAiB,CAC1B,QACE,MAAO,eAAe,CAC1B,CACF,CAAC,CAED,GAAIgC,OAAO,CAAE,CACX,mBACEvC,IAAA,QAAKmH,SAAS,CAAC,yCAAyC,CAAAC,QAAA,cACtDlH,KAAA,QAAKiH,SAAS,CAAC,aAAa,CAAAC,QAAA,eAC1BpH,IAAA,QAAKmH,SAAS,CAAC,8FAA8F,CAAM,CAAC,cACpHnH,IAAA,MAAGmH,SAAS,CAAC,oBAAoB,CAAAC,QAAA,CAAC,2BAAyB,CAAG,CAAC,EAC5D,CAAC,CACH,CAAC,CAEV,CAEA,mBACElH,KAAA,QAAKiH,SAAS,CAAC,WAAW,CAAAC,QAAA,eACxBlH,KAAA,QAAKiH,SAAS,CAAC,kCAAkC,CAAAC,QAAA,eAC/ClH,KAAA,QAAAkH,QAAA,eACEpH,IAAA,OAAImH,SAAS,CAAC,sCAAsC,CAAAC,QAAA,CAAC,WAAS,CAAI,CAAC,cACnElH,KAAA,MAAGiH,SAAS,CAAC,4BAA4B,CAAAC,QAAA,EAAC,gBAC1B,CAAC,CAAArE,IAAI,SAAJA,IAAI,iBAAJA,IAAI,CAAEsE,QAAQ,GAAI,MAAM,CAAC,oCAC1C,EAAG,CAAC,EACD,CAAC,cACNnH,KAAA,QAAKiH,SAAS,CAAC,yBAAyB,CAAAC,QAAA,EACrCvE,WAAW,eACV3C,KAAA,QAAKiH,SAAS,CAAC,YAAY,CAAAC,QAAA,eACzBlH,KAAA,MAAGiH,SAAS,CAAC,+CAA+C,CAAAC,QAAA,eAC1DpH,IAAA,CAACP,OAAO,EAAC6H,IAAI,CAAE,EAAG,CAAE,CAAC,iBACP,CAACV,UAAU,CAAC/D,WAAW,CAACrB,WAAW,CAAC,CAAC,CAAC,EACnD,CAAC,CACHmB,KAAK,eACJ3C,IAAA,MAAGmH,SAAS,CAAC,2BAA2B,CAAAC,QAAA,CAAEzE,KAAK,CAAI,CACpD,EACE,CACN,cACDzC,KAAA,WACEqH,OAAO,CAAElD,aAAc,CACvBmD,QAAQ,CAAE/E,UAAW,CACrB0E,SAAS,CAAE,0GACT1E,UAAU,CAAG,+BAA+B,CAAG,EAAE,EAChD,CAAA2E,QAAA,eAEHpH,IAAA,CAACR,WAAW,EAAC2H,SAAS,CAAE1E,UAAU,CAAG,cAAc,CAAG,EAAG,CAAC6E,IAAI,CAAE,EAAG,CAAE,CAAC,cACtEtH,IAAA,SAAAoH,QAAA,CAAO3E,UAAU,CAAG,eAAe,CAAG,SAAS,CAAO,CAAC,EACjD,CAAC,EACN,CAAC,EACH,CAAC,cAGNvC,KAAA,QAAKiH,SAAS,CAAC,sDAAsD,CAAAC,QAAA,eACnElH,KAAA,QAAKiH,SAAS,CAAC,gBAAgB,CAAAC,QAAA,eAC7BlH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,QAAKmH,SAAS,CAAC,kDAAkD,CAAAC,QAAA,cAC/DpH,IAAA,CAACV,QAAQ,EAAC6H,SAAS,CAAC,SAAS,CAAE,CAAC,CAC7B,CAAC,cACNjH,KAAA,QAAKiH,SAAS,CAAC,MAAM,CAAAC,QAAA,eACnBpH,IAAA,MAAGmH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,CAAC,eAAa,CAAG,CAAC,cAClEpH,IAAA,MAAGmH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,CAAE,EAAAzF,cAAA,CAAAU,KAAK,CAACF,OAAO,UAAAR,cAAA,iBAAbA,cAAA,CAAewE,KAAK,GAAI,CAAC,CAAI,CAAC,EAC/E,CAAC,EACH,CAAC,cACNnG,IAAA,QAAKmH,SAAS,CAAC,MAAM,CAAAC,QAAA,cACnBlH,KAAA,QAAKiH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,eAChDpH,IAAA,MAAGmH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,CAAC,WAAS,CAAG,CAAC,cAClDpH,IAAA,MAAGmH,SAAS,CAAC,sCAAsC,CAAAC,QAAA,CAAE,EAAAxF,eAAA,CAAAS,KAAK,CAACF,OAAO,UAAAP,eAAA,iBAAbA,eAAA,CAAeP,SAAS,GAAI,CAAC,CAAI,CAAC,EACpF,CAAC,CACH,CAAC,EACH,CAAC,cAENnB,KAAA,QAAKiH,SAAS,CAAC,gBAAgB,CAAAC,QAAA,eAC7BlH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,QAAKmH,SAAS,CAAC,sDAAsD,CAAAC,QAAA,cACnEpH,IAAA,CAACd,UAAU,EAACiI,SAAS,CAAC,SAAS,CAAE,CAAC,CAC/B,CAAC,cACNjH,KAAA,QAAKiH,SAAS,CAAC,MAAM,CAAAC,QAAA,eACnBpH,IAAA,MAAGmH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,CAAC,iBAAe,CAAG,CAAC,cACpElH,KAAA,MAAGiH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,EAAE,EAAAvF,gBAAA,CAAAQ,KAAK,CAACkE,SAAS,UAAA1E,gBAAA,iBAAfA,gBAAA,CAAiB4D,cAAc,GAAI,CAAC,CAAC,OAAE,EAAG,CAAC,EAC5F,CAAC,EACH,CAAC,cACNzF,IAAA,QAAKmH,SAAS,CAAC,MAAM,CAAAC,QAAA,cACnBlH,KAAA,QAAKiH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,eAChDpH,IAAA,MAAGmH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,CAAC,aAAW,CAAG,CAAC,cACpDlH,KAAA,MAAGiH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,EAAE,EAAAtF,iBAAA,CAAAO,KAAK,CAACkE,SAAS,UAAAzE,iBAAA,iBAAfA,iBAAA,CAAiBsD,UAAU,GAAI,CAAC,CAAC,GAAC,EAAG,CAAC,EACrF,CAAC,CACH,CAAC,EACH,CAAC,cAENlF,KAAA,QAAKiH,SAAS,CAAC,gBAAgB,CAAAC,QAAA,eAC7BlH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,QAAKmH,SAAS,CAAC,kDAAkD,CAAAC,QAAA,cAC/DpH,IAAA,CAACN,KAAK,EAACyH,SAAS,CAAC,SAAS,CAAE,CAAC,CAC1B,CAAC,cACNjH,KAAA,QAAKiH,SAAS,CAAC,MAAM,CAAAC,QAAA,eACnBpH,IAAA,MAAGmH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,CAAC,WAAS,CAAG,CAAC,cAC9DlH,KAAA,MAAGiH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,EAAE,EAAArF,iBAAA,CAAAM,KAAK,CAACkE,SAAS,UAAAxE,iBAAA,iBAAfA,iBAAA,CAAiB8D,eAAe,GAAI,CAAC,CAAC,GAAC,EAAG,CAAC,EAC5F,CAAC,EACH,CAAC,cACN7F,IAAA,QAAKmH,SAAS,CAAC,MAAM,CAAAC,QAAA,cACnBlH,KAAA,QAAKiH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,eAChDpH,IAAA,MAAGmH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,CAAC,gBAAc,CAAG,CAAC,cACvDpH,IAAA,MAAGmH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,CAAE,EAAApF,aAAA,CAAAK,KAAK,CAACmE,MAAM,UAAAxE,aAAA,iBAAZA,aAAA,CAAcmE,KAAK,GAAI,CAAC,CAAI,CAAC,EAC9E,CAAC,CACH,CAAC,EACH,CAAC,cAENjG,KAAA,QAAKiH,SAAS,CAAC,gBAAgB,CAAAC,QAAA,eAC7BlH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,QAAKmH,SAAS,CAAC,kDAAkD,CAAAC,QAAA,cAC/DpH,IAAA,CAACZ,MAAM,EAAC+H,SAAS,CAAC,SAAS,CAAE,CAAC,CAC3B,CAAC,cACNjH,KAAA,QAAKiH,SAAS,CAAC,MAAM,CAAAC,QAAA,eACnBpH,IAAA,MAAGmH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,CAAC,gBAAc,CAAG,CAAC,cACnEpH,IAAA,MAAGmH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,CAC/C,EAAAnF,eAAA,CAAAI,KAAK,CAACF,OAAO,UAAAF,eAAA,iBAAbA,eAAA,CAAeoE,MAAM,GAAI,CAAC,CAC1B,CAAC,EACD,CAAC,EACH,CAAC,cACNrG,IAAA,QAAKmH,SAAS,CAAC,MAAM,CAAAC,QAAA,cACnBlH,KAAA,QAAKiH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,eAChDpH,IAAA,MAAGmH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,CAAC,iBAAe,CAAG,CAAC,cACxDpH,IAAA,MAAGmH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,CAC/C,EAAAlF,eAAA,CAAAG,KAAK,CAACF,OAAO,UAAAD,eAAA,iBAAbA,eAAA,CAAeoE,OAAO,GAAI,CAAC,CAC3B,CAAC,EACD,CAAC,CACH,CAAC,EACH,CAAC,EACH,CAAC,cAGNpG,KAAA,QAAKiH,SAAS,CAAC,gBAAgB,CAAAC,QAAA,eAC7BlH,KAAA,QAAKiH,SAAS,CAAC,wCAAwC,CAAAC,QAAA,eACrDpH,IAAA,OAAImH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,CAAC,eAAa,CAAI,CAAC,cACtEpH,IAAA,CAACH,IAAI,EAAC4H,EAAE,CAAC,UAAU,CAACN,SAAS,CAAC,iDAAiD,CAAAC,QAAA,CAAC,UAAQ,CAAM,CAAC,EAC5F,CAAC,cACNpH,IAAA,QAAKmH,SAAS,CAAC,iBAAiB,CAAAC,QAAA,cAC9BlH,KAAA,UAAOiH,SAAS,CAAC,qCAAqC,CAAAC,QAAA,eACpDpH,IAAA,UAAOmH,SAAS,CAAC,YAAY,CAAAC,QAAA,cAC3BlH,KAAA,OAAAkH,QAAA,eACEpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,QAAM,CAAI,CAAC,cAC1GpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,QAAM,CAAI,CAAC,cAC1GpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,SAAO,CAAI,CAAC,cAC3GpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,QAAM,CAAI,CAAC,cAC1GpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,SAAO,CAAI,CAAC,cAC3GpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,UAAQ,CAAI,CAAC,cAC5GpH,IAAA,OAAImH,SAAS,CAAC,gFAAgF,CAAAC,QAAA,CAAC,WAAS,CAAI,CAAC,EAC3G,CAAC,CACA,CAAC,cACRpH,IAAA,UAAOmH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,CACjDjF,OAAO,CAACwB,GAAG,CAAEC,MAAM,OAAA8D,eAAA,CAAAC,gBAAA,CAAAC,gBAAA,oBAClB1H,KAAA,OAAoBiH,SAAS,CAAC,kBAAkB,CAAAC,QAAA,eAC9ClH,KAAA,OAAIiH,SAAS,CAAC,6BAA6B,CAAAC,QAAA,eACzCpH,IAAA,CAACH,IAAI,EAAC4H,EAAE,CAAE,YAAY7D,MAAM,CAACxD,EAAE,EAAG,CAAC+G,SAAS,CAAC,yCAAyC,CAAAC,QAAA,CACnFxD,MAAM,CAACvD,IAAI,CACR,CAAC,cACPL,IAAA,MAAGmH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,CAAExD,MAAM,CAACtD,KAAK,EAAI,iBAAiB,CAAI,CAAC,EAC1E,CAAC,cACLN,IAAA,OAAImH,SAAS,CAAC,6BAA6B,CAAAC,QAAA,cACzClH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,QAAKmH,SAAS,CAAE,iCAAiCH,cAAc,CAACpD,MAAM,CAACrD,MAAM,CAAC,CAACsH,OAAO,CAAC,OAAO,CAAE,KAAK,CAAC,EAAG,CAAM,CAAC,cAChH7H,IAAA,SAAMmH,SAAS,CAAE,cAAcH,cAAc,CAACpD,MAAM,CAACrD,MAAM,CAAC,EAAG,CAAA6G,QAAA,CAAExD,MAAM,CAACrD,MAAM,CAAO,CAAC,EACnF,CAAC,CACJ,CAAC,cACLP,IAAA,OAAImH,SAAS,CAAC,6BAA6B,CAAAC,QAAA,cACzClH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,CAACb,SAAS,EAACgI,SAAS,CAAE,QAAQF,eAAe,CAACrD,MAAM,CAACpD,OAAO,CAACD,MAAM,CAAC,EAAG,CAAE,CAAC,cAC1EL,KAAA,QAAAkH,QAAA,eACElH,KAAA,SAAMiH,SAAS,CAAEF,eAAe,CAACrD,MAAM,CAACpD,OAAO,CAACD,MAAM,CAAE,CAAA6G,QAAA,EAAExD,MAAM,CAACpD,OAAO,CAACC,KAAK,CAAC,GAAC,EAAM,CAAC,CACtFmD,MAAM,CAACpD,OAAO,CAACE,OAAO,eACrBR,KAAA,MAAGiH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,EAAExD,MAAM,CAACpD,OAAO,CAACE,OAAO,CAAC,GAAC,EAAG,CAClE,EACE,CAAC,EACH,CAAC,CACJ,CAAC,cACLV,IAAA,OAAImH,SAAS,CAAC,6BAA6B,CAAAC,QAAA,cACzClH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,CAACZ,MAAM,EAAC+H,SAAS,CAAE,QAAQD,cAAc,CAACtD,MAAM,CAACjD,MAAM,CAACJ,MAAM,CAAC,EAAG,CAAE,CAAC,cACrEL,KAAA,SAAMiH,SAAS,CAAED,cAAc,CAACtD,MAAM,CAACjD,MAAM,CAACJ,MAAM,CAAE,CAAA6G,QAAA,EAAExD,MAAM,CAACjD,MAAM,CAACC,QAAQ,CAAC,MAAI,EAAM,CAAC,EACvF,CAAC,CACJ,CAAC,cACLZ,IAAA,OAAImH,SAAS,CAAC,6BAA6B,CAAAC,QAAA,cACzClH,KAAA,QAAKiH,SAAS,CAAC,SAAS,CAAAC,QAAA,EACrB,EAAAM,eAAA,CAAA9D,MAAM,CAAC3C,OAAO,UAAAyG,eAAA,iBAAdA,eAAA,CAAgBxG,WAAW,gBAC1BhB,KAAA,QAAKiH,SAAS,CAAC,iCAAiC,CAAAC,QAAA,eAC9CpH,IAAA,CAACd,UAAU,EAACiI,SAAS,CAAC,MAAM,CAACG,IAAI,CAAE,EAAG,CAAE,CAAC,cACzCpH,KAAA,SAAAkH,QAAA,EAAOxD,MAAM,CAAC3C,OAAO,CAACC,WAAW,CAAC,OAAE,EAAM,CAAC,EACxC,CACN,CACA,EAAAyG,gBAAA,CAAA/D,MAAM,CAAC3C,OAAO,UAAA0G,gBAAA,iBAAdA,gBAAA,CAAgBxG,QAAQ,gBACvBjB,KAAA,QAAKiH,SAAS,CAAC,iCAAiC,CAAAC,QAAA,eAC9CpH,IAAA,CAACL,SAAS,EAACwH,SAAS,CAAC,MAAM,CAACG,IAAI,CAAE,EAAG,CAAE,CAAC,cACxCpH,KAAA,SAAAkH,QAAA,EAAOxD,MAAM,CAAC3C,OAAO,CAACE,QAAQ,CAAC,GAAC,EAAM,CAAC,EACpC,CACN,CACA,EAAAyG,gBAAA,CAAAhE,MAAM,CAAC3C,OAAO,UAAA2G,gBAAA,iBAAdA,gBAAA,CAAgBxG,aAAa,gBAC5BlB,KAAA,QAAKiH,SAAS,CAAC,mCAAmC,CAAAC,QAAA,eAChDpH,IAAA,CAACJ,KAAK,EAACuH,SAAS,CAAC,MAAM,CAACG,IAAI,CAAE,EAAG,CAAE,CAAC,cACpCpH,KAAA,SAAAkH,QAAA,EAAOxD,MAAM,CAAC3C,OAAO,CAACG,aAAa,CAAC,GAAC,EAAM,CAAC,EACzC,CACN,EACE,CAAC,CACJ,CAAC,cACLpB,IAAA,OAAImH,SAAS,CAAC,6BAA6B,CAAAC,QAAA,cACzClH,KAAA,QAAKiH,SAAS,CAAC,mBAAmB,CAAAC,QAAA,eAChCpH,IAAA,CAACX,QAAQ,EAAC8H,SAAS,CAAE,QAAQvD,MAAM,CAACvC,SAAS,CAAG,kBAAkB,CAAG,eAAe,EAAG,CAAE,CAAC,cAC1FnB,KAAA,QAAAkH,QAAA,eACElH,KAAA,SAAMiH,SAAS,CAAC,eAAe,CAAAC,QAAA,EAAExD,MAAM,CAAC/C,QAAQ,CAACC,QAAQ,CAACgH,OAAO,CAAC,CAAC,CAAC,CAAC,IAAE,CAAClE,MAAM,CAAC/C,QAAQ,CAACE,SAAS,CAAC+G,OAAO,CAAC,CAAC,CAAC,EAAO,CAAC,cACpH9H,IAAA,MAAGmH,SAAS,CAAC,uBAAuB,CAAAC,QAAA,CAAExD,MAAM,CAACvC,SAAS,CAAG,WAAW,CAAG,QAAQ,CAAI,CAAC,EACjF,CAAC,EACH,CAAC,CACJ,CAAC,cACLrB,IAAA,OAAImH,SAAS,CAAC,2CAA2C,CAAAC,QAAA,CACtDR,UAAU,CAAChD,MAAM,CAACtC,SAAS,CAAC,CAC3B,CAAC,GA/DEsC,MAAM,CAACxD,EAgEZ,CAAC,EACN,CAAC,CACG,CAAC,EACH,CAAC,CACL,CAAC,EACH,CAAC,EACH,CAAC,CAEV,CAAC,CAED,cAAe,CAAAsB,SAAS","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}