big-calendar 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CUSTOMIZATION.md +822 -0
- package/LICENSE +21 -0
- package/README.md +183 -0
- package/dist/big-calendar.cjs +2 -0
- package/dist/big-calendar.cjs.map +1 -0
- package/dist/big-calendar.mjs +2882 -0
- package/dist/big-calendar.mjs.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"big-calendar.cjs","sources":["../src/calendar/mocks.js","../src/calendar/contexts/calendar-context.jsx","../src/lib/utils.js","../src/calendar/components/dnd/custom-drag-layer.jsx","../src/calendar/components/dnd/dnd-provider.jsx","../src/components/ui/button.jsx","../src/components/ui/avatar-group.jsx","../src/components/ui/avatar.jsx","../src/components/ui/select.jsx","../src/calendar/components/header/user-select.jsx","../src/calendar/components/header/today-button.jsx","../src/components/ui/badge.jsx","../src/calendar/helpers.js","../src/calendar/components/header/date-navigator.jsx","../node_modules/zod/v4/core/core.js","../node_modules/zod/v4/core/util.js","../node_modules/zod/v4/core/errors.js","../node_modules/zod/v4/core/parse.js","../node_modules/@hookform/resolvers/zod/dist/zod.mjs","../src/hooks/use-disclosure.js","../src/components/ui/input.jsx","../src/components/ui/textarea.jsx","../src/components/ui/time-input.jsx","../src/components/ui/single-calendar.jsx","../src/components/ui/popover.jsx","../src/components/ui/single-day-picker.jsx","../src/components/ui/label.jsx","../src/components/ui/form.jsx","../src/components/ui/dialog.jsx","../src/calendar/schemas.js","../src/calendar/components/dialogs/add-event-dialog.jsx","../src/calendar/components/header/calendar-header.jsx","../src/calendar/components/year-view/year-view-day-cell.jsx","../src/calendar/components/year-view/year-view-month.jsx","../src/calendar/components/year-view/calendar-year-view.jsx","../src/calendar/components/month-view/event-bullet.jsx","../src/calendar/hooks/use-update-event.js","../src/calendar/components/dnd/draggable-event.jsx","../src/calendar/components/dnd/droppable-day-cell.jsx","../src/calendar/components/dialogs/edit-event-dialog.jsx","../src/calendar/components/dialogs/event-details-dialog.jsx","../src/calendar/components/month-view/month-event-badge.jsx","../src/calendar/components/month-view/day-cell.jsx","../src/calendar/components/month-view/calendar-month-view.jsx","../src/components/ui/scroll-area.jsx","../src/calendar/components/agenda-view/agenda-event-card.jsx","../src/calendar/components/agenda-view/agenda-day-group.jsx","../src/calendar/components/agenda-view/calendar-agenda-view.jsx","../src/calendar/components/week-and-day-view/event-block.jsx","../src/calendar/components/dnd/droppable-time-block.jsx","../src/calendar/components/week-and-day-view/calendar-time-line.jsx","../src/calendar/components/week-and-day-view/day-view-multi-day-events-row.jsx","../src/calendar/components/week-and-day-view/calendar-day-view.jsx","../src/calendar/components/week-and-day-view/week-view-multi-day-events-row.jsx","../src/calendar/components/week-and-day-view/calendar-week-view.jsx","../src/calendar/components/client-container.jsx","../src/calendar/components/change-badge-variant-input.jsx","../src/components/ui/tooltip.jsx","../src/calendar/components/change-visible-hours-input.jsx","../src/components/ui/switch.jsx","../src/calendar/components/change-working-hours-input.jsx","../src/components/ui/accordion.jsx","../src/components/ui/skeleton.jsx","../src/constants/cookies.const.js","../src/cookies/set.js","../src/components/layout/change-theme.jsx","../src/components/layout/header.jsx","../src/constants/theme.const.js","../src/cookies/get.js","../src/styles/fonts.js"],"sourcesContent":["// ================================== //\r\n\r\nexport const USERS_MOCK = [\r\n {\r\n id: \"dd503cf9-6c38-43cf-94cc-0d4032e2f77a\",\r\n name: \"Leonardo Ramos\",\r\n picturePath: null,\r\n },\r\n {\r\n id: \"f3b035ac-49f7-4e92-a715-35680bf63175\",\r\n name: \"Michael Doe\",\r\n picturePath: null,\r\n },\r\n {\r\n id: \"3e36ea6e-78f3-40dd-ab8c-a6c737c3c422\",\r\n name: \"Alice Johnson\",\r\n picturePath: null,\r\n },\r\n {\r\n id: \"a7aff6bd-a50a-4d6a-ab57-76f76bb27cf5\",\r\n name: \"Robert Smith\",\r\n picturePath: null,\r\n },\r\n];\r\n\r\nconst COLORS = [\"blue\", \"green\", \"red\", \"yellow\", \"purple\", \"orange\", \"gray\"];\r\n\r\nconst EVENTS = [\r\n \"Doctor's appointment\",\r\n \"Dental cleaning\",\r\n \"Eye exam\",\r\n \"Therapy session\",\r\n \"Business meeting\",\r\n \"Team stand-up\",\r\n \"Project deadline\",\r\n \"Weekly report submission\",\r\n \"Client presentation\",\r\n \"Marketing strategy review\",\r\n \"Networking event\",\r\n \"Sales call\",\r\n \"Investor pitch\",\r\n \"Board meeting\",\r\n \"Employee training\",\r\n \"Performance review\",\r\n \"One-on-one meeting\",\r\n \"Lunch with a colleague\",\r\n \"HR interview\",\r\n \"Conference call\",\r\n \"Web development sprint planning\",\r\n \"Software deployment\",\r\n \"Code review\",\r\n \"QA testing session\",\r\n \"Cybersecurity audit\",\r\n \"Server maintenance\",\r\n \"API integration update\",\r\n \"Data backup\",\r\n \"Cloud migration\",\r\n \"System upgrade\",\r\n \"Content planning session\",\r\n \"Product launch\",\r\n \"Customer support review\",\r\n \"Team building activity\",\r\n \"Legal consultation\",\r\n \"Budget review\",\r\n \"Financial planning session\",\r\n \"Tax filing deadline\",\r\n \"Investor relations update\",\r\n \"Partnership negotiation\",\r\n \"Medical check-up\",\r\n \"Vaccination appointment\",\r\n \"Blood donation\",\r\n \"Gym workout\",\r\n \"Yoga class\",\r\n \"Physical therapy session\",\r\n \"Nutrition consultation\",\r\n \"Personal trainer session\",\r\n \"Parent-teacher meeting\",\r\n \"School open house\",\r\n \"College application deadline\",\r\n \"Final exam\",\r\n \"Graduation ceremony\",\r\n \"Job interview\",\r\n \"Internship orientation\",\r\n \"Office relocation\",\r\n \"Business trip\",\r\n \"Flight departure\",\r\n \"Hotel check-in\",\r\n \"Vacation planning\",\r\n \"Birthday party\",\r\n \"Wedding anniversary\",\r\n \"Family reunion\",\r\n \"Housewarming party\",\r\n \"Community volunteer work\",\r\n \"Charity fundraiser\",\r\n \"Religious service\",\r\n \"Concert attendance\",\r\n \"Theater play\",\r\n \"Movie night\",\r\n \"Sporting event\",\r\n \"Football match\",\r\n \"Basketball game\",\r\n \"Tennis practice\",\r\n \"Marathon training\",\r\n \"Cycling event\",\r\n \"Fishing trip\",\r\n \"Camping weekend\",\r\n \"Hiking expedition\",\r\n \"Photography session\",\r\n \"Art workshop\",\r\n \"Cooking class\",\r\n \"Book club meeting\",\r\n \"Grocery shopping\",\r\n \"Car maintenance\",\r\n \"Home renovation meeting\",\r\n];\r\n\r\n// This was generated by AI -- minus the part where I added my wedding as an \"easter egg\" :)\r\nconst mockGenerator = (numberOfEvents) => {\r\n const result = [\r\n {\r\n id: 1204,\r\n startDate: new Date(\"2025-09-20T00:00:00-03:00\").toISOString(),\r\n endDate: new Date(\"2025-09-20T23:59:00-03:00\").toISOString(),\r\n title: \"My wedding :)\",\r\n color: \"red\",\r\n description: \"Can't wait to see the most beautiful woman in that dress!\",\r\n user: USERS_MOCK[0],\r\n },\r\n ];\r\n\r\n let currentId = 1;\r\n\r\n const randomUser = USERS_MOCK[Math.floor(Math.random() * USERS_MOCK.length)];\r\n\r\n // Date range: 30 days before and after now\r\n const now = new Date();\r\n const startRange = new Date(now);\r\n startRange.setDate(now.getDate() - 30);\r\n const endRange = new Date(now);\r\n endRange.setDate(now.getDate() + 30);\r\n\r\n // Create an event happening now\r\n const currentEvent = {\r\n id: currentId++,\r\n startDate: new Date(now.getTime() - 30 * 60000).toISOString(),\r\n endDate: new Date(now.getTime() + 30 * 60000).toISOString(),\r\n title: EVENTS[Math.floor(Math.random() * EVENTS.length)],\r\n color: COLORS[Math.floor(Math.random() * COLORS.length)],\r\n description: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n user: randomUser,\r\n };\r\n\r\n // Only add the current event if it's not on September 20th\r\n if (now.getMonth() !== 8 || now.getDate() !== 20) {\r\n // Month is 0-indexed (8 = September)\r\n result.push(currentEvent);\r\n }\r\n\r\n // Generate the remaining events\r\n let i = 0;\r\n let attempts = 0;\r\n const maxAttempts = numberOfEvents * 3; // Prevent infinite loop with a reasonable max attempts\r\n\r\n while (i < numberOfEvents - 1 && attempts < maxAttempts) {\r\n attempts++;\r\n\r\n // Determine if this is a multi-day event (10% chance)\r\n const isMultiDay = Math.random() < 0.1;\r\n\r\n const startDate = new Date(startRange.getTime() + Math.random() * (endRange.getTime() - startRange.getTime()));\r\n\r\n // Skip if the date is September 20th\r\n if (startDate.getMonth() === 8 && startDate.getDate() === 20) {\r\n continue;\r\n }\r\n\r\n // Set time between 8 AM and 8 PM\r\n startDate.setHours(8 + Math.floor(Math.random() * 8), Math.floor(Math.random() * 4) * 15, 0, 0);\r\n\r\n const endDate = new Date(startDate);\r\n\r\n if (isMultiDay) {\r\n // Multi-day event: Add 1-4 days\r\n const additionalDays = Math.floor(Math.random() * 4) + 1;\r\n endDate.setDate(startDate.getDate() + additionalDays);\r\n\r\n // Ensure multi-day events don't cross September 20th\r\n const endMonth = endDate.getMonth();\r\n const endDay = endDate.getDate();\r\n const startMonth = startDate.getMonth();\r\n const startDay = startDate.getDate();\r\n\r\n // Check if event spans across September 20th\r\n if (\r\n (startMonth === 8 && startDay < 20 && (endMonth > 8 || (endMonth === 8 && endDay >= 20))) ||\r\n (endMonth === 8 && endDay >= 20 && (startMonth < 8 || (startMonth === 8 && startDay < 20)))\r\n ) {\r\n continue;\r\n }\r\n\r\n endDate.setHours(8 + Math.floor(Math.random() * 12), Math.floor(Math.random() * 4) * 15, 0, 0);\r\n } else {\r\n const durationMinutes = (Math.floor(Math.random() * 11) + 2) * 15; // 30 to 180 minutes, multiple of 15\r\n endDate.setTime(endDate.getTime() + durationMinutes * 60 * 1000);\r\n }\r\n\r\n result.push({\r\n id: currentId++,\r\n startDate: startDate.toISOString(),\r\n endDate: endDate.toISOString(),\r\n title: EVENTS[Math.floor(Math.random() * EVENTS.length)],\r\n color: COLORS[Math.floor(Math.random() * COLORS.length)],\r\n description: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n user: USERS_MOCK[Math.floor(Math.random() * USERS_MOCK.length)],\r\n });\r\n\r\n i++;\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const CALENDAR_ITEMS_MOCK = mockGenerator(80);\r\n","import { createContext, useContext, useState, useEffect, useCallback } from \"react\";\r\nimport { CALENDAR_ITEMS_MOCK, USERS_MOCK } from \"@/calendar/mocks\";\r\n\r\nconst CalendarContext = createContext({});\r\n\r\nconst DEFAULT_WORKING_HOURS = {\r\n 0: { from: 0, to: 0 },\r\n 1: { from: 8, to: 17 },\r\n 2: { from: 8, to: 17 },\r\n 3: { from: 8, to: 17 },\r\n 4: { from: 8, to: 17 },\r\n 5: { from: 8, to: 17 },\r\n 6: { from: 8, to: 12 },\r\n};\r\n\r\nconst DEFAULT_VISIBLE_HOURS = { from: 7, to: 18 };\r\n\r\n/**\r\n * CalendarProvider - Highly customizable calendar context provider\r\n * \r\n * @param {Object} props\r\n * @param {React.ReactNode} props.children - Child components\r\n * @param {Array} [props.users] - Initial users array (optional if useMocks=true or api.getUsers provided)\r\n * @param {Array} [props.events] - Initial events array (optional if useMocks=true or api.getEvents provided)\r\n * @param {Object} [props.api] - API functions for calendar operations\r\n * @param {() => Promise<Array>} [props.api.getEvents] - Function to fetch events\r\n * @param {() => Promise<Array>} [props.api.getUsers] - Function to fetch users\r\n * @param {(event: Object) => Promise<Object>} [props.api.createEvent] - Function to create event\r\n * @param {(event: Object) => Promise<Object>} [props.api.updateEvent] - Function to update event\r\n * @param {(eventId: string|number) => Promise<void>} [props.api.deleteEvent] - Function to delete event\r\n * @param {boolean} [props.useMocks=false] - Whether to use mock data when API functions are not provided\r\n * @param {boolean} [props.singleUser=false] - Single-user mode: hides user selection UI and makes user field optional in forms\r\n * @param {Object} [props.currentUser] - Current user object for single-user mode (required if singleUser=true)\r\n * @param {string} [props.currentUser.id] - Current user ID\r\n * @param {string} [props.currentUser.name] - Current user name\r\n * @param {string} [props.currentUser.picturePath] - Current user avatar path\r\n * @param {Object} [props.defaultSettings] - Default calendar settings\r\n * @param {string} [props.defaultSettings.badgeVariant=\"colored\"] - Default badge variant\r\n * @param {{from: number, to: number}} [props.defaultSettings.visibleHours] - Default visible hours\r\n * @param {Record<number, {from: number, to: number}>} [props.defaultSettings.workingHours] - Default working hours\r\n * @param {Function} [props.onSettingsChange] - Callback when settings change\r\n * @param {Function} [props.onEventCreate] - Callback when event is created\r\n * @param {Function} [props.onEventUpdate] - Callback when event is updated\r\n * @param {Function} [props.onEventDelete] - Callback when event is deleted\r\n */\r\nexport function CalendarProvider({ \r\n children, \r\n users: initialUsers,\r\n events: initialEvents,\r\n api = {},\r\n useMocks = false,\r\n singleUser = false,\r\n currentUser,\r\n defaultSettings = {},\r\n onSettingsChange,\r\n onEventCreate,\r\n onEventUpdate,\r\n onEventDelete,\r\n}) {\r\n const [badgeVariant, setBadgeVariant] = useState(defaultSettings.badgeVariant || \"colored\");\r\n const [visibleHours, setVisibleHours] = useState(defaultSettings.visibleHours || DEFAULT_VISIBLE_HOURS);\r\n const [workingHours, setWorkingHours] = useState(defaultSettings.workingHours || DEFAULT_WORKING_HOURS);\r\n\r\n const [selectedDate, setSelectedDate] = useState(new Date());\r\n const [selectedUserId, setSelectedUserId] = useState(\"all\");\r\n\r\n // State for users and events\r\n const [users, setUsers] = useState(initialUsers || []);\r\n const [events, setEvents] = useState(initialEvents || []);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n // Single user mode: use currentUser if provided, otherwise use first user\r\n const effectiveCurrentUser = singleUser \r\n ? (currentUser || (users.length > 0 ? users[0] : null) || (initialUsers && initialUsers.length > 0 ? initialUsers[0] : null))\r\n : null;\r\n\r\n // Determine if we should use mocks\r\n const shouldUseMocks = useMocks || (!api.getEvents && !initialEvents);\r\n const shouldUseMockUsers = useMocks || (!api.getUsers && !initialUsers);\r\n\r\n // Load users\r\n useEffect(() => {\r\n if (shouldUseMockUsers && users.length === 0) {\r\n setUsers(USERS_MOCK);\r\n } else if (api.getUsers && !shouldUseMockUsers) {\r\n setIsLoading(true);\r\n api.getUsers()\r\n .then((fetchedUsers) => {\r\n setUsers(fetchedUsers);\r\n })\r\n .catch((error) => {\r\n console.error(\"Failed to fetch users:\", error);\r\n if (useMocks) {\r\n setUsers(USERS_MOCK);\r\n }\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }\r\n }, [api.getUsers, shouldUseMockUsers, useMocks]);\r\n\r\n // Load events\r\n useEffect(() => {\r\n if (shouldUseMocks && events.length === 0) {\r\n setEvents(CALENDAR_ITEMS_MOCK);\r\n } else if (api.getEvents && !shouldUseMocks) {\r\n setIsLoading(true);\r\n api.getEvents()\r\n .then((fetchedEvents) => {\r\n setEvents(fetchedEvents);\r\n })\r\n .catch((error) => {\r\n console.error(\"Failed to fetch events:\", error);\r\n if (useMocks) {\r\n setEvents(CALENDAR_ITEMS_MOCK);\r\n }\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }\r\n }, [api.getEvents, shouldUseMocks, useMocks]);\r\n\r\n const handleSelectDate = (date) => {\r\n if (!date) return;\r\n setSelectedDate(date);\r\n };\r\n\r\n const handleBadgeVariantChange = (variant) => {\r\n setBadgeVariant(variant);\r\n onSettingsChange?.({ badgeVariant: variant, visibleHours, workingHours });\r\n };\r\n\r\n const handleVisibleHoursChange = (hours) => {\r\n setVisibleHours(hours);\r\n onSettingsChange?.({ badgeVariant, visibleHours: hours, workingHours });\r\n };\r\n\r\n const handleWorkingHoursChange = (hours) => {\r\n setWorkingHours(hours);\r\n onSettingsChange?.({ badgeVariant, visibleHours, workingHours: hours });\r\n };\r\n\r\n // API wrapper functions\r\n const createEvent = useCallback(async (eventData) => {\r\n if (api.createEvent) {\r\n try {\r\n const newEvent = await api.createEvent(eventData);\r\n setEvents((prev) => [...prev, newEvent]);\r\n onEventCreate?.(newEvent);\r\n return newEvent;\r\n } catch (error) {\r\n console.error(\"Failed to create event:\", error);\r\n throw error;\r\n }\r\n } else {\r\n // Fallback: add to local state\r\n const newEvent = { ...eventData, id: Date.now() };\r\n setEvents((prev) => [...prev, newEvent]);\r\n onEventCreate?.(newEvent);\r\n return newEvent;\r\n }\r\n }, [api.createEvent, onEventCreate]);\r\n\r\n const updateEvent = useCallback(async (eventData) => {\r\n if (api.updateEvent) {\r\n try {\r\n const updatedEvent = await api.updateEvent(eventData);\r\n setEvents((prev) => {\r\n const index = prev.findIndex((e) => e.id === eventData.id);\r\n if (index === -1) return prev;\r\n return [...prev.slice(0, index), updatedEvent, ...prev.slice(index + 1)];\r\n });\r\n onEventUpdate?.(updatedEvent);\r\n return updatedEvent;\r\n } catch (error) {\r\n console.error(\"Failed to update event:\", error);\r\n throw error;\r\n }\r\n } else {\r\n // Fallback: update local state\r\n const updatedEvent = { ...eventData };\r\n setEvents((prev) => {\r\n const index = prev.findIndex((e) => e.id === eventData.id);\r\n if (index === -1) return prev;\r\n return [...prev.slice(0, index), updatedEvent, ...prev.slice(index + 1)];\r\n });\r\n onEventUpdate?.(updatedEvent);\r\n return updatedEvent;\r\n }\r\n }, [api.updateEvent, onEventUpdate]);\r\n\r\n const deleteEvent = useCallback(async (eventId) => {\r\n if (api.deleteEvent) {\r\n try {\r\n await api.deleteEvent(eventId);\r\n setEvents((prev) => prev.filter((e) => e.id !== eventId));\r\n onEventDelete?.(eventId);\r\n } catch (error) {\r\n console.error(\"Failed to delete event:\", error);\r\n throw error;\r\n }\r\n } else {\r\n // Fallback: remove from local state\r\n setEvents((prev) => prev.filter((e) => e.id !== eventId));\r\n onEventDelete?.(eventId);\r\n }\r\n }, [api.deleteEvent, onEventDelete]);\r\n\r\n const refetchEvents = useCallback(async () => {\r\n if (api.getEvents) {\r\n setIsLoading(true);\r\n try {\r\n const fetchedEvents = await api.getEvents();\r\n setEvents(fetchedEvents);\r\n } catch (error) {\r\n console.error(\"Failed to refetch events:\", error);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }\r\n }, [api.getEvents]);\r\n\r\n return (\r\n <CalendarContext.Provider\r\n value={{\r\n selectedDate,\r\n setSelectedDate: handleSelectDate,\r\n selectedUserId,\r\n setSelectedUserId,\r\n badgeVariant,\r\n setBadgeVariant: handleBadgeVariantChange,\r\n users,\r\n visibleHours,\r\n setVisibleHours: handleVisibleHoursChange,\r\n workingHours,\r\n setWorkingHours: handleWorkingHoursChange,\r\n events,\r\n setEvents,\r\n isLoading,\r\n // API functions\r\n createEvent,\r\n updateEvent,\r\n deleteEvent,\r\n refetchEvents,\r\n // API object for direct access\r\n api,\r\n useMocks: shouldUseMocks,\r\n // Single user mode\r\n singleUser,\r\n currentUser: effectiveCurrentUser,\r\n }}\r\n >\r\n {children}\r\n </CalendarContext.Provider>\r\n );\r\n}\r\n\r\nexport function useCalendar() {\r\n const context = useContext(CalendarContext);\r\n if (!context) throw new Error(\"useCalendar must be used within a CalendarProvider.\");\r\n return context;\r\n}\r\n","import { clsx } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport function cn(...inputs) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","import { useDragLayer } from \"react-dnd\";\r\n\r\nexport function CustomDragLayer() {\r\n const { isDragging, item, currentOffset, initialOffset, initialClientOffset } = useDragLayer(monitor => ({\r\n item: monitor.getItem(),\r\n itemType: monitor.getItemType(),\r\n isDragging: monitor.isDragging(),\r\n currentOffset: monitor.getClientOffset(),\r\n initialOffset: monitor.getInitialSourceClientOffset(),\r\n initialClientOffset: monitor.getInitialClientOffset(),\r\n }));\r\n\r\n if (!isDragging || !item || !currentOffset || !initialOffset || !initialClientOffset) {\r\n return null;\r\n }\r\n\r\n const offsetX = initialClientOffset.x - initialOffset.x;\r\n const offsetY = initialClientOffset.y - initialOffset.y;\r\n\r\n const layerStyles = {\r\n position: \"fixed\",\r\n pointerEvents: \"none\",\r\n zIndex: 100,\r\n left: currentOffset.x - offsetX,\r\n top: currentOffset.y - offsetY,\r\n };\r\n\r\n return (\r\n <div style={layerStyles}>\r\n <div\r\n className=\"\"\r\n style={{\r\n width: item.width,\r\n height: item.height,\r\n }}\r\n >\r\n {item.children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { DndProvider } from \"react-dnd\";\r\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\r\n\r\nimport { CustomDragLayer } from \"@/calendar/components/dnd/custom-drag-layer\";\r\n\r\nexport function DndProviderWrapper({ children }) {\r\n return (\r\n <DndProvider backend={HTML5Backend}>\r\n {children}\r\n <CustomDragLayer />\r\n </DndProvider>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { Slot } from \"@radix-ui/react-slot\";\r\nimport { cva } from \"class-variance-authority\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\r\n destructive: \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\r\n outline: \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\r\n secondary: \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\r\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n },\r\n size: {\r\n default: \"h-9 px-4 py-2\",\r\n sm: \"h-8 rounded-md px-3 text-xs\",\r\n lg: \"h-10 rounded-md px-8\",\r\n icon: \"size-9\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n);\r\n\r\nconst Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\";\r\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\r\n});\r\nButton.displayName = \"Button\";\r\n\r\nexport { Button, buttonVariants };\r\n","import { cloneElement, Children, forwardRef, useMemo } from \"react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n// ================================== //\r\n\r\nconst AvatarGroup = forwardRef(({ className, children, max = 1, spacing = 10, ...props }, ref) => {\r\n const avatarItems = Children.toArray(children);\r\n\r\n const renderContent = useMemo(() => {\r\n return (\r\n <>\r\n {avatarItems.slice(0, max).map((child, index) => {\r\n return cloneElement(child, {\r\n className: cn(child.props.className, \"border-2 border-background\"),\r\n style: { marginLeft: index === 0 ? 0 : -spacing, ...child.props.style },\r\n });\r\n })}\r\n\r\n {avatarItems.length > max && (\r\n <div\r\n className={cn(\"relative flex items-center justify-center rounded-full border-2 border-background bg-muted\", avatarItems[0].props.className)}\r\n style={{ marginLeft: -spacing }}\r\n >\r\n <p>+{avatarItems.length - max}</p>\r\n </div>\r\n )}\r\n </>\r\n );\r\n }, [avatarItems, max, spacing]);\r\n\r\n return (\r\n <div ref={ref} className={cn(\"relative flex\", className)} {...props}>\r\n {renderContent}\r\n </div>\r\n );\r\n});\r\n\r\nAvatarGroup.displayName = \"AvatarGroup\";\r\n\r\n// ================================== //\r\n\r\nexport { AvatarGroup };\r\n","import * as React from \"react\";\r\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Avatar = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Root ref={ref} className={cn(\"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\", className)} {...props} />\r\n )\r\n);\r\nAvatar.displayName = AvatarPrimitive.Root.displayName;\r\n\r\nconst AvatarImage = React.forwardRef(\r\n ({ className, ...props }, ref) => <AvatarPrimitive.Image ref={ref} className={cn(\"aspect-square h-full w-full\", className)} {...props} />\r\n);\r\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\r\n\r\nconst AvatarFallback = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Fallback ref={ref} className={cn(\"flex h-full w-full items-center justify-center rounded-full bg-muted\", className)} {...props} />\r\n )\r\n);\r\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback };\r\n","import * as React from \"react\";\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\r\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Select = SelectPrimitive.Root;\r\n\r\nconst SelectGroup = SelectPrimitive.Group;\r\n\r\nconst SelectValue = SelectPrimitive.Value;\r\n\r\nconst SelectTrigger = React.forwardRef(\r\n ({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"size-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n )\r\n);\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\r\n\r\nconst SelectScrollUpButton = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton ref={ref} className={cn(\"flex cursor-default items-center justify-center py-1\", className)} {...props}>\r\n <ChevronUp className=\"size-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n )\r\n);\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\r\n\r\nconst SelectScrollDownButton = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton ref={ref} className={cn(\"flex cursor-default items-center justify-center py-1\", className)} {...props}>\r\n <ChevronDown className=\"size-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n )\r\n);\r\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\r\n\r\nconst SelectContent = React.forwardRef(\r\n ({ className, children, position = \"popper\", ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] origin-[--radix-select-content-transform-origin] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n position={position}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\"p-1\", position === \"popper\" && \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\")}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n )\r\n);\r\nSelectContent.displayName = SelectPrimitive.Content.displayName;\r\n\r\nconst SelectLabel = React.forwardRef(\r\n ({ className, ...props }, ref) => <SelectPrimitive.Label ref={ref} className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)} {...props} />\r\n);\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\r\n\r\nconst SelectItem = React.forwardRef(\r\n ({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator>\r\n <Check className=\"size-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n )\r\n);\r\nSelectItem.displayName = SelectPrimitive.Item.displayName;\r\n\r\nconst SelectSeparator = React.forwardRef(\r\n ({ className, ...props }, ref) => <SelectPrimitive.Separator ref={ref} className={cn(\"-mx-1 my-1 h-px bg-muted\", className)} {...props} />\r\n);\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n};\r\n","import { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { AvatarGroup } from \"@/components/ui/avatar-group\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\r\n\r\nexport function UserSelect() {\r\n const { users, selectedUserId, setSelectedUserId } = useCalendar();\r\n\r\n return (\r\n <Select value={selectedUserId} onValueChange={setSelectedUserId}>\r\n <SelectTrigger className=\"flex-1 md:w-48\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n\r\n <SelectContent align=\"end\">\r\n <SelectItem value=\"all\">\r\n <div className=\"flex items-center gap-1\">\r\n <AvatarGroup max={2}>\r\n {users.map(user => (\r\n <Avatar key={user.id} className=\"size-6 text-xxs\">\r\n <AvatarImage src={user.picturePath ?? undefined} alt={user.name} />\r\n <AvatarFallback className=\"text-xxs\">{user.name[0]}</AvatarFallback>\r\n </Avatar>\r\n ))}\r\n </AvatarGroup>\r\n All\r\n </div>\r\n </SelectItem>\r\n\r\n {users.map(user => (\r\n <SelectItem key={user.id} value={user.id} className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <Avatar key={user.id} className=\"size-6\">\r\n <AvatarImage src={user.picturePath ?? undefined} alt={user.name} />\r\n <AvatarFallback className=\"text-xxs\">{user.name[0]}</AvatarFallback>\r\n </Avatar>\r\n\r\n <p className=\"truncate\">{user.name}</p>\r\n </div>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n );\r\n}\r\n","import { formatDate } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nexport function TodayButton() {\r\n const { setSelectedDate } = useCalendar();\r\n\r\n const today = new Date();\r\n const handleClick = () => setSelectedDate(today);\r\n\r\n return (\r\n <button\r\n className=\"flex size-14 flex-col items-start overflow-hidden rounded-lg border focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n onClick={handleClick}\r\n >\r\n <p className=\"flex h-6 w-full items-center justify-center bg-primary text-center text-xs font-semibold text-primary-foreground\">\r\n {formatDate(today, \"MMM\").toUpperCase()}\r\n </p>\r\n <p className=\"flex w-full items-center justify-center text-lg font-bold\">{today.getDate()}</p>\r\n </button>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { cva } from \"class-variance-authority\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst badgeVariants = cva(\r\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\r\n secondary: \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n destructive: \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\r\n outline: \"text-foreground\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n);\r\n\r\nfunction Badge({ className, variant, ...props }) {\r\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\r\n}\r\n\r\nexport { Badge, badgeVariants };\r\n","import {\r\n addDays,\r\n addMonths,\r\n addWeeks,\r\n subDays,\r\n subMonths,\r\n subWeeks,\r\n isSameWeek,\r\n isSameDay,\r\n isSameMonth,\r\n startOfWeek,\r\n startOfMonth,\r\n endOfMonth,\r\n endOfWeek,\r\n format,\r\n parseISO,\r\n differenceInMinutes,\r\n eachDayOfInterval,\r\n startOfDay,\r\n differenceInDays,\r\n endOfYear,\r\n startOfYear,\r\n subYears,\r\n addYears,\r\n isSameYear,\r\n isWithinInterval,\r\n} from \"date-fns\";\r\n\r\n// ================ Header helper functions ================ //\r\n\r\nexport function rangeText(view, date) {\r\n const formatString = \"MMM d, yyyy\";\r\n let start;\r\n let end;\r\n\r\n switch (view) {\r\n case \"agenda\":\r\n start = startOfMonth(date);\r\n end = endOfMonth(date);\r\n break;\r\n case \"year\":\r\n start = startOfYear(date);\r\n end = endOfYear(date);\r\n break;\r\n case \"month\":\r\n start = startOfMonth(date);\r\n end = endOfMonth(date);\r\n break;\r\n case \"week\":\r\n start = startOfWeek(date);\r\n end = endOfWeek(date);\r\n break;\r\n case \"day\":\r\n return format(date, formatString);\r\n default:\r\n return \"Error while formatting \";\r\n }\r\n\r\n return `${format(start, formatString)} - ${format(end, formatString)}`;\r\n}\r\n\r\nexport function navigateDate(date, view, direction) {\r\n const operations = {\r\n agenda: direction === \"next\" ? addMonths : subMonths,\r\n year: direction === \"next\" ? addYears : subYears,\r\n month: direction === \"next\" ? addMonths : subMonths,\r\n week: direction === \"next\" ? addWeeks : subWeeks,\r\n day: direction === \"next\" ? addDays : subDays,\r\n };\r\n\r\n return operations[view](date, 1);\r\n}\r\n\r\nexport function getEventsCount(events, date, view) {\r\n const compareFns = {\r\n agenda: isSameMonth,\r\n year: isSameYear,\r\n day: isSameDay,\r\n week: isSameWeek,\r\n month: isSameMonth,\r\n };\r\n\r\n return events.filter(event => compareFns[view](new Date(event.startDate), date)).length;\r\n}\r\n\r\n// ================ Week and day view helper functions ================ //\r\n\r\nexport function getCurrentEvents(events) {\r\n const now = new Date();\r\n return events.filter(event => isWithinInterval(now, { start: parseISO(event.startDate), end: parseISO(event.endDate) })) || null;\r\n}\r\n\r\nexport function groupEvents(dayEvents) {\r\n const sortedEvents = dayEvents.sort((a, b) => parseISO(a.startDate).getTime() - parseISO(b.startDate).getTime());\r\n const groups = [];\r\n\r\n for (const event of sortedEvents) {\r\n const eventStart = parseISO(event.startDate);\r\n\r\n let placed = false;\r\n for (const group of groups) {\r\n const lastEventInGroup = group[group.length - 1];\r\n const lastEventEnd = parseISO(lastEventInGroup.endDate);\r\n\r\n if (eventStart >= lastEventEnd) {\r\n group.push(event);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!placed) groups.push([event]);\r\n }\r\n\r\n return groups;\r\n}\r\n\r\nexport function getEventBlockStyle(event, day, groupIndex, groupSize, visibleHoursRange) {\r\n const startDate = parseISO(event.startDate);\r\n const dayStart = new Date(day.setHours(0, 0, 0, 0));\r\n const eventStart = startDate < dayStart ? dayStart : startDate;\r\n const startMinutes = differenceInMinutes(eventStart, dayStart);\r\n\r\n let top;\r\n\r\n if (visibleHoursRange) {\r\n const visibleStartMinutes = visibleHoursRange.from * 60;\r\n const visibleEndMinutes = visibleHoursRange.to * 60;\r\n const visibleRangeMinutes = visibleEndMinutes - visibleStartMinutes;\r\n top = ((startMinutes - visibleStartMinutes) / visibleRangeMinutes) * 100;\r\n } else {\r\n top = (startMinutes / 1440) * 100;\r\n }\r\n\r\n const width = 100 / groupSize;\r\n const left = groupIndex * width;\r\n\r\n return { top: `${top}%`, width: `${width}%`, left: `${left}%` };\r\n}\r\n\r\nexport function isWorkingHour(day, hour, workingHours) {\r\n const dayIndex = day.getDay();\r\n const dayHours = workingHours[dayIndex];\r\n return hour >= dayHours.from && hour < dayHours.to;\r\n}\r\n\r\nexport function getVisibleHours(visibleHours, singleDayEvents) {\r\n let earliestEventHour = visibleHours.from;\r\n let latestEventHour = visibleHours.to;\r\n\r\n singleDayEvents.forEach(event => {\r\n const startHour = parseISO(event.startDate).getHours();\r\n const endTime = parseISO(event.endDate);\r\n const endHour = endTime.getHours() + (endTime.getMinutes() > 0 ? 1 : 0);\r\n if (startHour < earliestEventHour) earliestEventHour = startHour;\r\n if (endHour > latestEventHour) latestEventHour = endHour;\r\n });\r\n\r\n latestEventHour = Math.min(latestEventHour, 24);\r\n\r\n const hours = Array.from({ length: latestEventHour - earliestEventHour }, (_, i) => i + earliestEventHour);\r\n\r\n return { hours, earliestEventHour, latestEventHour };\r\n}\r\n\r\n// ================ Month view helper functions ================ //\r\n\r\nexport function getCalendarCells(selectedDate) {\r\n const currentYear = selectedDate.getFullYear();\r\n const currentMonth = selectedDate.getMonth();\r\n\r\n const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();\r\n const getFirstDayOfMonth = (year, month) => new Date(year, month, 1).getDay();\r\n\r\n const daysInMonth = getDaysInMonth(currentYear, currentMonth);\r\n const firstDayOfMonth = getFirstDayOfMonth(currentYear, currentMonth);\r\n const daysInPrevMonth = getDaysInMonth(currentYear, currentMonth - 1);\r\n const totalDays = firstDayOfMonth + daysInMonth;\r\n\r\n const prevMonthCells = Array.from({ length: firstDayOfMonth }, (_, i) => ({\r\n day: daysInPrevMonth - firstDayOfMonth + i + 1,\r\n currentMonth: false,\r\n date: new Date(currentYear, currentMonth - 1, daysInPrevMonth - firstDayOfMonth + i + 1),\r\n }));\r\n\r\n const currentMonthCells = Array.from({ length: daysInMonth }, (_, i) => ({\r\n day: i + 1,\r\n currentMonth: true,\r\n date: new Date(currentYear, currentMonth, i + 1),\r\n }));\r\n\r\n const nextMonthCells = Array.from({ length: (7 - (totalDays % 7)) % 7 }, (_, i) => ({\r\n day: i + 1,\r\n currentMonth: false,\r\n date: new Date(currentYear, currentMonth + 1, i + 1),\r\n }));\r\n\r\n return [...prevMonthCells, ...currentMonthCells, ...nextMonthCells];\r\n}\r\n\r\nexport function calculateMonthEventPositions(multiDayEvents, singleDayEvents, selectedDate) {\r\n const monthStart = startOfMonth(selectedDate);\r\n const monthEnd = endOfMonth(selectedDate);\r\n\r\n const eventPositions = {};\r\n const occupiedPositions = {};\r\n\r\n eachDayOfInterval({ start: monthStart, end: monthEnd }).forEach(day => {\r\n occupiedPositions[day.toISOString()] = [false, false, false];\r\n });\r\n\r\n const sortedEvents = [\r\n ...multiDayEvents.sort((a, b) => {\r\n const aDuration = differenceInDays(parseISO(a.endDate), parseISO(a.startDate));\r\n const bDuration = differenceInDays(parseISO(b.endDate), parseISO(b.startDate));\r\n return bDuration - aDuration || parseISO(a.startDate).getTime() - parseISO(b.startDate).getTime();\r\n }),\r\n ...singleDayEvents.sort((a, b) => parseISO(a.startDate).getTime() - parseISO(b.startDate).getTime()),\r\n ];\r\n\r\n sortedEvents.forEach(event => {\r\n const eventStart = parseISO(event.startDate);\r\n const eventEnd = parseISO(event.endDate);\r\n const eventDays = eachDayOfInterval({\r\n start: eventStart < monthStart ? monthStart : eventStart,\r\n end: eventEnd > monthEnd ? monthEnd : eventEnd,\r\n });\r\n\r\n let position = -1;\r\n\r\n for (let i = 0; i < 3; i++) {\r\n if (\r\n eventDays.every(day => {\r\n const dayPositions = occupiedPositions[startOfDay(day).toISOString()];\r\n return dayPositions && !dayPositions[i];\r\n })\r\n ) {\r\n position = i;\r\n break;\r\n }\r\n }\r\n\r\n if (position !== -1) {\r\n eventDays.forEach(day => {\r\n const dayKey = startOfDay(day).toISOString();\r\n occupiedPositions[dayKey][position] = true;\r\n });\r\n eventPositions[event.id] = position;\r\n }\r\n });\r\n\r\n return eventPositions;\r\n}\r\n\r\nexport function getMonthCellEvents(date, events, eventPositions) {\r\n const eventsForDate = events.filter(event => {\r\n const eventStart = parseISO(event.startDate);\r\n const eventEnd = parseISO(event.endDate);\r\n return (date >= eventStart && date <= eventEnd) || isSameDay(date, eventStart) || isSameDay(date, eventEnd);\r\n });\r\n\r\n return eventsForDate\r\n .map(event => ({\r\n ...event,\r\n position: eventPositions[event.id] ?? -1,\r\n isMultiDay: event.startDate !== event.endDate,\r\n }))\r\n .sort((a, b) => {\r\n if (a.isMultiDay && !b.isMultiDay) return -1;\r\n if (!a.isMultiDay && b.isMultiDay) return 1;\r\n return a.position - b.position;\r\n });\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { formatDate } from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Button } from \"@/components/ui/button\";\r\n\r\nimport { getEventsCount, navigateDate, rangeText } from \"@/calendar/helpers\";\r\n\r\nexport function DateNavigator({ view, events }) {\r\n const { selectedDate, setSelectedDate } = useCalendar();\r\n\r\n const month = formatDate(selectedDate, \"MMMM\");\r\n const year = selectedDate.getFullYear();\r\n\r\n const eventCount = useMemo(() => getEventsCount(events, selectedDate, view), [events, selectedDate, view]);\r\n\r\n const handlePrevious = () => setSelectedDate(navigateDate(selectedDate, view, \"previous\"));\r\n const handleNext = () => setSelectedDate(navigateDate(selectedDate, view, \"next\"));\r\n\r\n return (\r\n <div className=\"space-y-0.5\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-lg font-semibold\">\r\n {month} {year}\r\n </span>\r\n <Badge variant=\"outline\" className=\"px-1.5\">\r\n {eventCount} events\r\n </Badge>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button variant=\"outline\" className=\"size-6.5 px-0 [&_svg]:size-4.5\" onClick={handlePrevious}>\r\n <ChevronLeft />\r\n </Button>\r\n\r\n <p className=\"text-sm text-muted-foreground\">{rangeText(view, selectedDate)}</p>\r\n\r\n <Button variant=\"outline\" className=\"size-6.5 px-0 [&_svg]:size-4.5\" onClick={handleNext}>\r\n <ChevronRight />\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n var _a;\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod ?? {},\n enumerable: false,\n });\n (_a = inst._zod).traits ?? (_a.traits = new Set());\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n for (const k in _.prototype) {\n if (!(k in inst))\n Object.defineProperty(inst, k, { value: _.prototype[k].bind(inst) });\n }\n inst._zod.constr = _;\n inst._zod.def = def;\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error();\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport function defineLazy(object, key, getter) {\n const set = false;\n Object.defineProperty(object, key, {\n get() {\n if (!set) {\n const value = getter();\n object[key] = value;\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport const captureStackTrace = Error.captureStackTrace\n ? Error.captureStackTrace\n : (..._args) => { };\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const newShape = {};\n const currDef = schema._zod.def; //.shape;\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // pick key\n newShape[key] = currDef.shape[key];\n }\n return clone(schema, {\n ...schema._zod.def,\n shape: newShape,\n checks: [],\n });\n}\nexport function omit(schema, mask) {\n const newShape = { ...schema._zod.def.shape };\n const currDef = schema._zod.def; //.shape;\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n return clone(schema, {\n ...schema._zod.def,\n shape: newShape,\n checks: [],\n });\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const def = {\n ...schema._zod.def,\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n checks: [], // delete existing checks\n };\n return clone(schema, def);\n}\nexport function merge(a, b) {\n return clone(a, {\n ...a._zod.def,\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n catchall: b._zod.def.catchall,\n checks: [], // delete existing checks\n });\n}\nexport function partial(Class, schema, mask) {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n return clone(schema, {\n ...schema._zod.def,\n shape,\n checks: [],\n });\n}\nexport function required(Class, schema, mask) {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n return clone(schema, {\n ...schema._zod.def,\n shape,\n // optional: [],\n checks: [],\n });\n}\nexport function aborted(x, startIndex = 0) {\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true)\n return true;\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n Object.defineProperty(inst, \"message\", {\n get() {\n return JSON.stringify(def, util.jsonStringifyReplacer, 2);\n },\n enumerable: true,\n // configurable: false,\n });\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, _mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, _mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(path) {\n const segs = [];\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => a.path.length - b.path.length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\n","import{validateFieldsNatively as r,toNestErrors as e}from\"@hookform/resolvers\";import{appendErrors as o}from\"react-hook-form\";import*as n from\"zod/v4/core\";function t(r,e){try{var o=r()}catch(r){return e(r)}return o&&o.then?o.then(void 0,e):o}function s(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"unionErrors\"in t){var u=t.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"unionErrors\"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n}function i(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"invalid_union\"===t.code&&t.errors.length>0){var u=t.errors[0][0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"invalid_union\"===t.code&&t.errors.forEach(function(e){return e.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n}function a(o,a,u){if(void 0===u&&(u={}),function(r){return\"_def\"in r&&\"object\"==typeof r._def&&\"typeName\"in r._def}(o))return function(n,i,c){try{return Promise.resolve(t(function(){return Promise.resolve(o[\"sync\"===u.mode?\"parse\":\"parseAsync\"](n,a)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:u.raw?Object.assign({},n):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(s(r.errors,!c.shouldUseNativeValidation&&\"all\"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return\"_zod\"in r&&\"object\"==typeof r._zod}(o))return function(s,c,f){try{return Promise.resolve(t(function(){return Promise.resolve((\"sync\"===u.mode?n.parse:n.parseAsync)(o,s,a)).then(function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:u.raw?Object.assign({},s):e}})},function(r){if(function(r){return r instanceof n.$ZodError}(r))return{values:{},errors:e(i(r.issues,!f.shouldUseNativeValidation&&\"all\"===f.criteriaMode),f)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error(\"Invalid input: not a Zod schema\")}export{a as zodResolver};\n//# sourceMappingURL=zod.module.js.map\n","import { useState } from \"react\";\r\n\r\nexport function useDisclosure({ defaultIsOpen = false } = {}) {\r\n const [isOpen, setIsOpen] = useState(defaultIsOpen);\r\n\r\n const onOpen = () => setIsOpen(true);\r\n const onClose = () => setIsOpen(false);\r\n const onToggle = () => setIsOpen(currentValue => !currentValue);\r\n\r\n return { onOpen, onClose, isOpen, onToggle };\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Input = React.forwardRef(({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n});\r\nInput.displayName = \"Input\";\r\n\r\nexport { Input };\r\n","import * as React from \"react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Textarea = React.forwardRef(({ className, ...props }, ref) => {\r\n return (\r\n <textarea\r\n className={cn(\r\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n});\r\nTextarea.displayName = \"Textarea\";\r\n\r\nexport { Textarea };\r\n","import { forwardRef } from \"react\";\r\nimport { DateInput, DateSegment, TimeField } from \"react-aria-components\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n// ================================== //\r\n\r\nconst TimeInput = forwardRef(\r\n ({ className, dateInputClassName, segmentClassName, disabled, \"data-invalid\": dataInvalid, ...props }, ref) => {\r\n return (\r\n <TimeField\r\n ref={ref}\r\n className={cn(\"relative\", className)}\r\n isDisabled={disabled}\r\n isInvalid={dataInvalid}\r\n {...props}\r\n aria-label=\"Time\"\r\n shouldForceLeadingZeros\r\n >\r\n <DateInput\r\n className={cn(\r\n \"peer inline-flex h-9 w-full items-center overflow-hidden whitespace-nowrap rounded-md border bg-background px-3 py-2 text-sm shadow-black\",\r\n \"data-[focus-within]:outline-none data-[focus-within]:ring-1 data-[focus-within]:ring-ring\",\r\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\r\n dateInputClassName\r\n )}\r\n >\r\n {segment => (\r\n <DateSegment\r\n segment={segment}\r\n className={cn(\r\n \"inline rounded p-0.5 caret-transparent outline outline-0\",\r\n \"data-[focused]:bg-foreground/10 data-[focused]:text-foreground\",\r\n \"data-[placeholder]:text-muted-foreground\",\r\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\r\n segmentClassName\r\n )}\r\n />\r\n )}\r\n </DateInput>\r\n </TimeField>\r\n );\r\n }\r\n);\r\n\r\nTimeInput.displayName = \"TimeInput\";\r\n\r\n// ================================== //\r\n\r\nexport { TimeInput };\r\n","import * as React from \"react\";\r\nimport { DayPicker } from \"react-day-picker\";\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\r\n\r\nimport { buttonVariants } from \"@/components/ui/button\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nfunction SingleCalendar({ className, classNames, showOutsideDays = true, selected, ...props }) {\r\n const [currentMonth, setCurrentMonth] = React.useState(selected instanceof Date ? selected : undefined);\r\n\r\n return (\r\n <DayPicker\r\n selected={selected}\r\n showOutsideDays={showOutsideDays}\r\n month={currentMonth}\r\n onMonthChange={setCurrentMonth}\r\n className={cn(\"p-3\", className)}\r\n classNames={{\r\n months: \"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0\",\r\n month: \"space-y-4\",\r\n caption: \"flex justify-center pt-1 relative items-center\",\r\n caption_label: \"text-sm font-medium\",\r\n nav: \"space-x-1 flex items-center\",\r\n nav_button: cn(buttonVariants({ variant: \"outline\" }), \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\"),\r\n nav_button_previous: \"absolute left-1\",\r\n nav_button_next: \"absolute right-1\",\r\n table: \"w-full border-collapse space-y-1\",\r\n head_row: \"flex\",\r\n head_cell: \"text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]\",\r\n row: \"flex w-full mt-2\",\r\n cell: cn(\r\n \"relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected].day-range-end)]:rounded-r-md\",\r\n \"[&:has([aria-selected])]:rounded-md\"\r\n ),\r\n day: cn(buttonVariants({ variant: \"ghost\" }), \"h-8 w-8 p-0 font-normal aria-selected:opacity-100\"),\r\n day_range_start: \"day-range-start\",\r\n day_range_end: \"day-range-end\",\r\n day_selected: \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\r\n day_today: \"bg-accent text-accent-foreground\",\r\n day_outside: \"day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground\",\r\n day_disabled: \"text-muted-foreground opacity-50\",\r\n day_range_middle: \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\r\n day_hidden: \"invisible\",\r\n ...classNames,\r\n }}\r\n components={{\r\n IconLeft: ({ className, ...props }) => <ChevronLeft className={cn(\"h-4 w-4\", className)} {...props} />,\r\n IconRight: ({ className, ...props }) => <ChevronRight className={cn(\"h-4 w-4\", className)} {...props} />,\r\n }}\r\n {...props}\r\n />\r\n );\r\n}\r\nSingleCalendar.displayName = \"Calendar\";\r\n\r\nexport { SingleCalendar };\r\n","import * as React from \"react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\n\r\nconst PopoverAnchor = PopoverPrimitive.Anchor;\r\n\r\nconst PopoverContent = React.forwardRef(\r\n ({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 w-72 origin-[--radix-popover-content-transform-origin] rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n )\r\n);\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\r\n","import { format } from \"date-fns\";\r\n\r\nimport { useDisclosure } from \"@/hooks/use-disclosure\";\r\n\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { SingleCalendar } from \"@/components/ui/single-calendar\";\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n// ================================== //\r\n\r\nfunction SingleDayPicker({ id, onSelect, className, placeholder, labelVariant = \"PPP\", value, ...props }) {\r\n const { isOpen, onClose, onToggle } = useDisclosure();\r\n\r\n const handleSelect = (date) => {\r\n onSelect(date);\r\n onClose();\r\n };\r\n\r\n return (\r\n <Popover open={isOpen} onOpenChange={onToggle} modal>\r\n <PopoverTrigger asChild>\r\n <Button\r\n id={id}\r\n variant=\"outline\"\r\n className={cn(\"group relative h-9 w-full justify-start whitespace-nowrap px-3 py-2 font-normal hover:bg-inherit\", className)}\r\n {...props}\r\n >\r\n {value && <span>{format(value, labelVariant)}</span>}\r\n {!value && <span className=\"text-muted-foreground\">{placeholder}</span>}\r\n </Button>\r\n </PopoverTrigger>\r\n\r\n <PopoverContent align=\"center\" className=\"w-fit p-0\">\r\n <SingleCalendar mode=\"single\" selected={value} onSelect={handleSelect} initialFocus />\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\n// ================================== //\r\n\r\nexport { SingleDayPicker };\r\n","import * as React from \"react\";\r\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\r\nimport { cva } from \"class-variance-authority\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst labelVariants = cva(\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\");\r\n\r\nconst Label = React.forwardRef(\r\n ({ className, ...props }, ref) => <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\r\n);\r\nLabel.displayName = LabelPrimitive.Root.displayName;\r\n\r\nexport { Label };\r\n","import * as React from \"react\";\r\nimport { Slot } from \"@radix-ui/react-slot\";\r\nimport { Controller, FormProvider, useFormContext } from \"react-hook-form\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Label } from \"@/components/ui/label\";\r\n\r\nconst Form = FormProvider;\r\n\r\nconst FormFieldContext = React.createContext({});\r\n\r\nfunction FormField({ ...props }) {\r\n return (\r\n <FormFieldContext.Provider value={{ name: props.name }}>\r\n <Controller {...props} />\r\n </FormFieldContext.Provider>\r\n );\r\n}\r\n\r\nconst useFormField = () => {\r\n const fieldContext = React.useContext(FormFieldContext);\r\n const itemContext = React.useContext(FormItemContext);\r\n const { getFieldState, formState } = useFormContext();\r\n\r\n const fieldState = getFieldState(fieldContext.name, formState);\r\n\r\n if (!fieldContext) {\r\n throw new Error(\"useFormField should be used within <FormField>\");\r\n }\r\n\r\n const { id } = itemContext;\r\n\r\n return {\r\n id,\r\n name: fieldContext.name,\r\n formItemId: `${id}-form-item`,\r\n formDescriptionId: `${id}-form-item-description`,\r\n formMessageId: `${id}-form-item-message`,\r\n ...fieldState,\r\n };\r\n};\r\n\r\nconst FormItemContext = React.createContext({});\r\n\r\nconst FormItem = React.forwardRef(({ className, ...props }, ref) => {\r\n const id = React.useId();\r\n\r\n return (\r\n <FormItemContext.Provider value={{ id }}>\r\n <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\r\n </FormItemContext.Provider>\r\n );\r\n});\r\nFormItem.displayName = \"FormItem\";\r\n\r\nconst FormLabel = React.forwardRef(\r\n ({ className, ...props }, ref) => {\r\n const { error, formItemId } = useFormField();\r\n\r\n return <Label ref={ref} className={cn(error && \"text-destructive\", className)} htmlFor={formItemId} {...props} />;\r\n }\r\n);\r\nFormLabel.displayName = \"FormLabel\";\r\n\r\nconst FormControl = React.forwardRef(({ ...props }, ref) => {\r\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\r\n\r\n return (\r\n <Slot\r\n ref={ref}\r\n id={formItemId}\r\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\r\n aria-invalid={!!error}\r\n {...props}\r\n />\r\n );\r\n});\r\nFormControl.displayName = \"FormControl\";\r\n\r\nconst FormDescription = React.forwardRef(({ className, ...props }, ref) => {\r\n const { formDescriptionId } = useFormField();\r\n\r\n return <p ref={ref} id={formDescriptionId} className={cn(\"text-[0.8rem] text-muted-foreground\", className)} {...props} />;\r\n});\r\nFormDescription.displayName = \"FormDescription\";\r\n\r\nconst FormMessage = React.forwardRef(({ className, children, ...props }, ref) => {\r\n const { error, formMessageId } = useFormField();\r\n const body = error ? String(error?.message ?? \"\") : children;\r\n\r\n if (!body) {\r\n return null;\r\n }\r\n\r\n return (\r\n <p ref={ref} id={formMessageId} className={cn(\"text-[0.8rem] font-medium text-destructive\", className)} {...props}>\r\n {body}\r\n </p>\r\n );\r\n});\r\nFormMessage.displayName = \"FormMessage\";\r\n\r\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField };\r\n","import * as React from \"react\";\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\r\nimport { X } from \"lucide-react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Dialog = DialogPrimitive.Root;\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger;\r\n\r\nconst DialogPortal = DialogPrimitive.Portal;\r\n\r\nconst DialogClose = DialogPrimitive.Close;\r\n\r\nconst DialogOverlay = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n);\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\r\n\r\nconst DialogContent = React.forwardRef(\r\n ({ className, children, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\r\n <X className=\"size-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n )\r\n);\r\nDialogContent.displayName = DialogPrimitive.Content.displayName;\r\n\r\nfunction DialogHeader({ className, ...props }) {\r\n return <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />;\r\n}\r\nDialogHeader.displayName = \"DialogHeader\";\r\n\r\nfunction DialogFooter({ className, ...props }) {\r\n return <div className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)} {...props} />;\r\n}\r\nDialogFooter.displayName = \"DialogFooter\";\r\n\r\nconst DialogTitle = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title ref={ref} className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)} {...props} />\r\n )\r\n);\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\r\n\r\nconst DialogDescription = React.forwardRef(\r\n ({ className, ...props }, ref) => <DialogPrimitive.Description ref={ref} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />\r\n);\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\r\n\r\nexport { Dialog, DialogPortal, DialogOverlay, DialogTrigger, DialogClose, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription };\r\n","import { z } from \"zod\";\r\n\r\n/**\r\n * Create event schema - user field is optional for single-user mode\r\n * @param {boolean} singleUser - Whether single-user mode is enabled\r\n */\r\nexport const createEventSchema = (singleUser = false) => z\r\n .object({\r\n user: singleUser ? z.string().optional() : z.string(),\r\n title: z.string().min(1, \"Title is required\"),\r\n description: z.string().min(1, \"Description is required\"),\r\n startDate: z.date({ required_error: \"Start date is required\" }),\r\n startTime: z.object({ hour: z.number(), minute: z.number() }, { required_error: \"Start time is required\" }),\r\n endDate: z.date({ required_error: \"End date is required\" }),\r\n endTime: z.object({ hour: z.number(), minute: z.number() }, { required_error: \"End time is required\" }),\r\n color: z.enum([\"blue\", \"green\", \"red\", \"yellow\", \"purple\", \"orange\", \"gray\"], { required_error: \"Color is required\" }),\r\n })\r\n .refine(\r\n data => {\r\n const startDateTime = new Date(data.startDate);\r\n startDateTime.setHours(data.startTime.hour, data.startTime.minute, 0, 0);\r\n\r\n const endDateTime = new Date(data.endDate);\r\n endDateTime.setHours(data.endTime.hour, data.endTime.minute, 0, 0);\r\n\r\n return startDateTime < endDateTime;\r\n },\r\n {\r\n message: \"Start date cannot be after end date\",\r\n path: [\"startDate\"],\r\n }\r\n );\r\n\r\n// Default export for backward compatibility\r\nexport const eventSchema = createEventSchema(false);\r\n","import { useEffect } from \"react\";\r\nimport { useForm } from \"react-hook-form\";\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\n\r\nimport { useDisclosure } from \"@/hooks/use-disclosure\";\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { Input } from \"@/components/ui/input\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Textarea } from \"@/components/ui/textarea\";\r\nimport { TimeInput } from \"@/components/ui/time-input\";\r\nimport { SingleDayPicker } from \"@/components/ui/single-day-picker\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\nimport { Form, FormField, FormLabel, FormItem, FormControl, FormMessage } from \"@/components/ui/form\";\r\nimport { Select, SelectItem, SelectContent, SelectTrigger, SelectValue } from \"@/components/ui/select\";\r\nimport { Dialog, DialogHeader, DialogClose, DialogContent, DialogTrigger, DialogTitle, DialogDescription, DialogFooter } from \"@/components/ui/dialog\";\r\n\r\nimport { createEventSchema } from \"@/calendar/schemas\";\r\n\r\n/**\r\n * AddEventDialog - Dialog for creating new events\r\n * \r\n * @param {Object} props\r\n * @param {React.ReactNode} props.children - Trigger element\r\n * @param {Date} [props.startDate] - Pre-filled start date\r\n * @param {{hour: number, minute: number}} [props.startTime] - Pre-filled start time\r\n * @param {Function} [props.onEventCreated] - Callback when event is successfully created\r\n * @param {boolean} [props.showFormDisclaimer=true] - Show form disclaimer/description\r\n */\r\nexport function AddEventDialog({ children, startDate, startTime, onEventCreated, showFormDisclaimer = true }) {\r\n const { users, createEvent, singleUser, currentUser } = useCalendar();\r\n\r\n const { isOpen, onClose, onToggle } = useDisclosure();\r\n\r\n const form = useForm({\r\n resolver: zodResolver(createEventSchema(singleUser)),\r\n defaultValues: {\r\n title: \"\",\r\n description: \"\",\r\n user: singleUser && currentUser ? currentUser.id : undefined,\r\n startDate: typeof startDate !== \"undefined\" ? startDate : undefined,\r\n startTime: typeof startTime !== \"undefined\" ? startTime : undefined,\r\n },\r\n });\r\n\r\n const onSubmit = async (values) => {\r\n try {\r\n // In single-user mode, use currentUser; otherwise find user from values\r\n const user = singleUser \r\n ? currentUser \r\n : users.find(user => user.id === values.user);\r\n\r\n if (!user) {\r\n if (!singleUser) {\r\n form.setError(\"user\", { message: \"User not found\" });\r\n }\r\n return;\r\n }\r\n\r\n const startDateTime = new Date(values.startDate);\r\n startDateTime.setHours(values.startTime.hour, values.startTime.minute, 0, 0);\r\n\r\n const endDateTime = new Date(values.endDate);\r\n endDateTime.setHours(values.endTime.hour, values.endTime.minute, 0, 0);\r\n\r\n const eventData = {\r\n user,\r\n title: values.title,\r\n color: values.color,\r\n description: values.description,\r\n startDate: startDateTime.toISOString(),\r\n endDate: endDateTime.toISOString(),\r\n };\r\n\r\n const newEvent = await createEvent(eventData);\r\n onEventCreated?.(newEvent);\r\n onClose();\r\n form.reset();\r\n } catch (error) {\r\n console.error(\"Failed to create event:\", error);\r\n // You can add error handling UI here if needed\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n form.reset({\r\n startDate,\r\n startTime,\r\n });\r\n }, [startDate, startTime, form]);\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={onToggle}>\r\n <DialogTrigger asChild>{children}</DialogTrigger>\r\n\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>Add New Event</DialogTitle>\r\n {showFormDisclaimer && (\r\n <DialogDescription className=\"mt-2\">\r\n Create a new calendar event. The event will be saved according to your API configuration.\r\n </DialogDescription>\r\n )}\r\n </DialogHeader>\r\n\r\n <Form {...form}>\r\n <form id=\"event-form\" onSubmit={form.handleSubmit(onSubmit)} className=\"grid gap-4 py-4\">\r\n {!singleUser && (\r\n <FormField\r\n control={form.control}\r\n name=\"user\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel>Responsible</FormLabel>\r\n <FormControl>\r\n <Select value={field.value} onValueChange={field.onChange}>\r\n <SelectTrigger data-invalid={fieldState.invalid}>\r\n <SelectValue placeholder=\"Select an option\" />\r\n </SelectTrigger>\r\n\r\n <SelectContent>\r\n {users.map(user => (\r\n <SelectItem key={user.id} value={user.id} className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <Avatar key={user.id} className=\"size-6\">\r\n <AvatarImage src={user.picturePath ?? undefined} alt={user.name} />\r\n <AvatarFallback className=\"text-xxs\">{user.name[0]}</AvatarFallback>\r\n </Avatar>\r\n\r\n <p className=\"truncate\">{user.name}</p>\r\n </div>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </FormControl>\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n )}\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"title\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel htmlFor=\"title\">Title</FormLabel>\r\n\r\n <FormControl>\r\n <Input id=\"title\" placeholder=\"Enter a title\" data-invalid={fieldState.invalid} {...field} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <FormField\r\n control={form.control}\r\n name=\"startDate\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel htmlFor=\"startDate\">Start Date</FormLabel>\r\n\r\n <FormControl>\r\n <SingleDayPicker\r\n id=\"startDate\"\r\n value={field.value}\r\n onSelect={date => field.onChange(date)}\r\n placeholder=\"Select a date\"\r\n data-invalid={fieldState.invalid}\r\n />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"startTime\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel>Start Time</FormLabel>\r\n\r\n <FormControl>\r\n <TimeInput value={field.value} onChange={field.onChange} hourCycle={12} data-invalid={fieldState.invalid} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <FormField\r\n control={form.control}\r\n name=\"endDate\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel>End Date</FormLabel>\r\n <FormControl>\r\n <SingleDayPicker\r\n value={field.value}\r\n onSelect={date => field.onChange(date)}\r\n placeholder=\"Select a date\"\r\n data-invalid={fieldState.invalid}\r\n />\r\n </FormControl>\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"endTime\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel>End Time</FormLabel>\r\n\r\n <FormControl>\r\n <TimeInput value={field.value} onChange={field.onChange} hourCycle={12} data-invalid={fieldState.invalid} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n </div>\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"color\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel>Color</FormLabel>\r\n <FormControl>\r\n <Select value={field.value} onValueChange={field.onChange}>\r\n <SelectTrigger data-invalid={fieldState.invalid}>\r\n <SelectValue placeholder=\"Select an option\" />\r\n </SelectTrigger>\r\n\r\n <SelectContent>\r\n <SelectItem value=\"blue\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-blue-600\" />\r\n Blue\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"green\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-green-600\" />\r\n Green\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"red\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-red-600\" />\r\n Red\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"yellow\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-yellow-600\" />\r\n Yellow\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"purple\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-purple-600\" />\r\n Purple\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"orange\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-orange-600\" />\r\n Orange\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"gray\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-neutral-600\" />\r\n Gray\r\n </div>\r\n </SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </FormControl>\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"description\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel>Description</FormLabel>\r\n\r\n <FormControl>\r\n <Textarea {...field} value={field.value} data-invalid={fieldState.invalid} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n </form>\r\n </Form>\r\n\r\n <DialogFooter>\r\n <DialogClose asChild>\r\n <Button type=\"button\" variant=\"outline\">\r\n Cancel\r\n </Button>\r\n </DialogClose>\r\n\r\n <Button form=\"event-form\" type=\"submit\">\r\n Create Event\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","import { Columns, Grid3x3, List, Plus, Grid2x2, CalendarRange } from \"lucide-react\";\r\n\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { UserSelect } from \"@/calendar/components/header/user-select\";\r\nimport { TodayButton } from \"@/calendar/components/header/today-button\";\r\nimport { DateNavigator } from \"@/calendar/components/header/date-navigator\";\r\nimport { AddEventDialog } from \"@/calendar/components/dialogs/add-event-dialog\";\r\n\r\n/**\r\n * CalendarHeader - Calendar header component with navigation and controls\r\n * \r\n * @param {Object} props\r\n * @param {string} props.view - Current view\r\n * @param {Array} props.events - Filtered events\r\n * @param {Function} props.onViewChange - Callback when view changes\r\n * @param {boolean} [props.showTodayButton=true] - Show today button\r\n * @param {boolean} [props.showDateNavigator=true] - Show date navigator\r\n * @param {boolean} [props.showViewSwitcher=true] - Show view switcher buttons\r\n * @param {boolean} [props.showUserSelect=true] - Show user filter select\r\n * @param {boolean} [props.showAddEventButton=true] - Show add event button\r\n * @param {Array} [props.availableViews] - Available views to show (default: all)\r\n * @param {string} [props.className] - Custom className for the header container\r\n * @param {string} [props.leftSectionClassName] - Custom className for left section (today button + navigator)\r\n * @param {string} [props.rightSectionClassName] - Custom className for right section (controls)\r\n * @param {string} [props.viewSwitcherClassName] - Custom className for view switcher buttons container\r\n * @param {string} [props.addButtonClassName] - Custom className for add event button\r\n */\r\nexport function CalendarHeader({ \r\n view, \r\n events, \r\n onViewChange,\r\n showTodayButton = true,\r\n showDateNavigator = true,\r\n showViewSwitcher = true,\r\n showUserSelect = true,\r\n showAddEventButton = true,\r\n availableViews = [\"day\", \"week\", \"month\", \"year\", \"agenda\"],\r\n className,\r\n leftSectionClassName,\r\n rightSectionClassName,\r\n viewSwitcherClassName,\r\n addButtonClassName,\r\n}) {\r\n const { singleUser } = useCalendar();\r\n \r\n const handleViewChange = (newView) => {\r\n if (onViewChange) {\r\n onViewChange(newView);\r\n }\r\n };\r\n \r\n // Hide user select in single-user mode\r\n const shouldShowUserSelect = showUserSelect && !singleUser;\r\n\r\n return (\r\n <div className={cn(\"flex flex-col gap-4 border-b p-4 lg:flex-row lg:items-center lg:justify-between\", className)}>\r\n {(showTodayButton || showDateNavigator) && (\r\n <div className={cn(\"flex items-center gap-3\", leftSectionClassName)}>\r\n {showTodayButton && <TodayButton />}\r\n {showDateNavigator && <DateNavigator view={view} events={events} />}\r\n </div>\r\n )}\r\n\r\n {(showViewSwitcher || showUserSelect || showAddEventButton) && (\r\n <div className={cn(\"flex flex-col items-center gap-1.5 sm:flex-row sm:justify-between\", rightSectionClassName)}>\r\n {(showViewSwitcher || showUserSelect) && (\r\n <div className=\"flex w-full items-center gap-1.5\">\r\n {showViewSwitcher && (\r\n <div className={cn(\"inline-flex first:rounded-r-none last:rounded-l-none [&:not(:first-child):not(:last-child)]:rounded-none\", viewSwitcherClassName)}>\r\n {availableViews.includes(\"day\") && (\r\n <Button \r\n aria-label=\"View by day\" \r\n size=\"icon\" \r\n variant={view === \"day\" ? \"default\" : \"outline\"} \r\n className=\"rounded-r-none [&_svg]:size-5\"\r\n onClick={() => handleViewChange(\"day\")}\r\n >\r\n <List strokeWidth={1.8} />\r\n </Button>\r\n )}\r\n\r\n {availableViews.includes(\"week\") && (\r\n <Button\r\n aria-label=\"View by week\"\r\n size=\"icon\"\r\n variant={view === \"week\" ? \"default\" : \"outline\"}\r\n className=\"-ml-px rounded-none [&_svg]:size-5\"\r\n onClick={() => handleViewChange(\"week\")}\r\n >\r\n <Columns strokeWidth={1.8} />\r\n </Button>\r\n )}\r\n\r\n {availableViews.includes(\"month\") && (\r\n <Button\r\n aria-label=\"View by month\"\r\n size=\"icon\"\r\n variant={view === \"month\" ? \"default\" : \"outline\"}\r\n className=\"-ml-px rounded-none [&_svg]:size-5\"\r\n onClick={() => handleViewChange(\"month\")}\r\n >\r\n <Grid2x2 strokeWidth={1.8} />\r\n </Button>\r\n )}\r\n\r\n {availableViews.includes(\"year\") && (\r\n <Button\r\n aria-label=\"View by year\"\r\n size=\"icon\"\r\n variant={view === \"year\" ? \"default\" : \"outline\"}\r\n className=\"-ml-px rounded-none [&_svg]:size-5\"\r\n onClick={() => handleViewChange(\"year\")}\r\n >\r\n <Grid3x3 strokeWidth={1.8} />\r\n </Button>\r\n )}\r\n\r\n {availableViews.includes(\"agenda\") && (\r\n <Button\r\n aria-label=\"View by agenda\"\r\n size=\"icon\"\r\n variant={view === \"agenda\" ? \"default\" : \"outline\"}\r\n className=\"-ml-px rounded-l-none [&_svg]:size-5\"\r\n onClick={() => handleViewChange(\"agenda\")}\r\n >\r\n <CalendarRange strokeWidth={1.8} />\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {shouldShowUserSelect && <UserSelect />}\r\n </div>\r\n )}\r\n\r\n {showAddEventButton && (\r\n <AddEventDialog>\r\n <Button className={cn(\"w-full sm:w-auto\", addButtonClassName)}>\r\n <Plus />\r\n Add Event\r\n </Button>\r\n </AddEventDialog>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { isToday } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nexport function YearViewDayCell({ day, date, events }) {\r\n const { setSelectedDate } = useCalendar();\r\n\r\n const maxIndicators = 3;\r\n const eventCount = events.length;\r\n\r\n const handleClick = () => {\r\n setSelectedDate(date);\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n type=\"button\"\r\n className=\"flex h-11 flex-1 flex-col items-center justify-start gap-0.5 rounded-md pt-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n >\r\n <div\r\n className={cn(\r\n \"flex size-6 items-center justify-center rounded-full text-xs font-medium\",\r\n isToday(date) && \"bg-primary font-semibold text-primary-foreground\"\r\n )}\r\n >\r\n {day}\r\n </div>\r\n\r\n {eventCount > 0 && (\r\n <div className=\"mt-0.5 flex gap-0.5\">\r\n {eventCount <= maxIndicators ? (\r\n events.map(event => (\r\n <div\r\n key={event.id}\r\n className={cn(\r\n \"size-1.5 rounded-full\",\r\n event.color === \"blue\" && \"bg-blue-600\",\r\n event.color === \"green\" && \"bg-green-600\",\r\n event.color === \"red\" && \"bg-red-600\",\r\n event.color === \"yellow\" && \"bg-yellow-600\",\r\n event.color === \"purple\" && \"bg-purple-600\",\r\n event.color === \"orange\" && \"bg-orange-600\",\r\n event.color === \"gray\" && \"bg-neutral-600\"\r\n )}\r\n />\r\n ))\r\n ) : (\r\n <>\r\n <div\r\n className={cn(\r\n \"size-1.5 rounded-full\",\r\n events[0].color === \"blue\" && \"bg-blue-600\",\r\n events[0].color === \"green\" && \"bg-green-600\",\r\n events[0].color === \"red\" && \"bg-red-600\",\r\n events[0].color === \"yellow\" && \"bg-yellow-600\",\r\n events[0].color === \"purple\" && \"bg-purple-600\",\r\n events[0].color === \"orange\" && \"bg-orange-600\"\r\n )}\r\n />\r\n <span className=\"text-[7px] text-muted-foreground\">+{eventCount - 1}</span>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </button>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { format, isSameDay, parseISO, getDaysInMonth, startOfMonth } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { YearViewDayCell } from \"@/calendar/components/year-view/year-view-day-cell\";\r\n\r\nexport function YearViewMonth({ month, events }) {\r\n const { setSelectedDate } = useCalendar();\r\n\r\n const monthName = format(month, \"MMMM\");\r\n\r\n const daysInMonth = useMemo(() => {\r\n const totalDays = getDaysInMonth(month);\r\n const firstDay = startOfMonth(month).getDay();\r\n\r\n const days = Array.from({ length: totalDays }, (_, i) => i + 1);\r\n const blanks = Array(firstDay).fill(null);\r\n\r\n return [...blanks, ...days];\r\n }, [month]);\r\n\r\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\r\n\r\n const handleClick = () => {\r\n setSelectedDate(new Date(month.getFullYear(), month.getMonth(), 1));\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className=\"w-full rounded-t-lg border px-3 py-2 text-sm font-semibold hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n >\r\n {monthName}\r\n </button>\r\n\r\n <div className=\"flex-1 space-y-2 rounded-b-lg border border-t-0 p-3\">\r\n <div className=\"grid grid-cols-7 gap-x-0.5 text-center\">\r\n {weekDays.map((day, index) => (\r\n <div key={index} className=\"text-xs font-medium text-muted-foreground\">\r\n {day}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-7 gap-x-0.5 gap-y-2\">\r\n {daysInMonth.map((day, index) => {\r\n if (day === null) return <div key={`blank-${index}`} className=\"h-10\" />;\r\n\r\n const date = new Date(month.getFullYear(), month.getMonth(), day);\r\n const dayEvents = events.filter(event => isSameDay(parseISO(event.startDate), date) || isSameDay(parseISO(event.endDate), date));\r\n\r\n return <YearViewDayCell key={`day-${day}`} day={day} date={date} events={dayEvents} />;\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { addMonths, startOfYear } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { YearViewMonth } from \"@/calendar/components/year-view/year-view-month\";\r\n\r\nexport function CalendarYearView({ allEvents }) {\r\n const { selectedDate } = useCalendar();\r\n\r\n const months = useMemo(() => {\r\n const yearStart = startOfYear(selectedDate);\r\n return Array.from({ length: 12 }, (_, i) => addMonths(yearStart, i));\r\n }, [selectedDate]);\r\n\r\n return (\r\n <div className=\"p-4\">\r\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\r\n {months.map(month => (\r\n <YearViewMonth key={month.toString()} month={month} events={allEvents} />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { cva } from \"class-variance-authority\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst eventBulletVariants = cva(\"size-2 rounded-full\", {\r\n variants: {\r\n color: {\r\n blue: \"bg-blue-600 dark:bg-blue-500\",\r\n green: \"bg-green-600 dark:bg-green-500\",\r\n red: \"bg-red-600 dark:bg-red-500\",\r\n yellow: \"bg-yellow-600 dark:bg-yellow-500\",\r\n purple: \"bg-purple-600 dark:bg-purple-500\",\r\n gray: \"bg-neutral-600 dark:bg-neutral-500\",\r\n orange: \"bg-orange-600 dark:bg-orange-500\",\r\n },\r\n },\r\n defaultVariants: {\r\n color: \"blue\",\r\n },\r\n});\r\n\r\nexport function EventBullet({ color, className }) {\r\n return <div className={cn(eventBulletVariants({ color, className }))} />;\r\n}\r\n","import { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\n/**\r\n * useUpdateEvent - Hook for updating events\r\n * \r\n * @deprecated Use useCalendar().updateEvent directly instead\r\n * This hook is kept for backward compatibility but now just returns the updateEvent from context\r\n * \r\n * @returns {{updateEvent: Function}} Object with updateEvent function\r\n */\r\nexport function useUpdateEvent() {\r\n const { updateEvent } = useCalendar();\r\n\r\n return { updateEvent };\r\n}\r\n","import { useDrag } from \"react-dnd\";\r\nimport { useRef, useEffect } from \"react\";\r\nimport { getEmptyImage } from \"react-dnd-html5-backend\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nexport const ItemTypes = {\r\n EVENT: \"event\",\r\n};\r\n\r\nexport function DraggableEvent({ event, children }) {\r\n const ref = useRef(null);\r\n\r\n const [{ isDragging }, drag, preview] = useDrag(() => ({\r\n type: ItemTypes.EVENT,\r\n item: () => {\r\n const width = ref.current?.offsetWidth || 0;\r\n const height = ref.current?.offsetHeight || 0;\r\n return { event, children, width, height };\r\n },\r\n collect: monitor => ({ isDragging: monitor.isDragging() }),\r\n }));\r\n\r\n // Hide the default drag preview\r\n useEffect(() => {\r\n preview(getEmptyImage(), { captureDraggingState: true });\r\n }, [preview]);\r\n\r\n drag(ref);\r\n\r\n return (\r\n <div ref={ref} className={cn(isDragging && \"opacity-40\")}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import { useDrop } from \"react-dnd\";\r\nimport { parseISO, differenceInMilliseconds } from \"date-fns\";\r\n\r\nimport { useUpdateEvent } from \"@/calendar/hooks/use-update-event\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { ItemTypes } from \"@/calendar/components/dnd/draggable-event\";\r\n\r\nexport function DroppableDayCell({ cell, children }) {\r\n const { updateEvent } = useUpdateEvent();\r\n\r\n const [{ isOver, canDrop }, drop] = useDrop(\r\n () => ({\r\n accept: ItemTypes.EVENT,\r\n drop: (item) => {\r\n const droppedEvent = item.event;\r\n\r\n const eventStartDate = parseISO(droppedEvent.startDate);\r\n const eventEndDate = parseISO(droppedEvent.endDate);\r\n\r\n const eventDurationMs = differenceInMilliseconds(eventEndDate, eventStartDate);\r\n\r\n const newStartDate = new Date(cell.date);\r\n newStartDate.setHours(eventStartDate.getHours(), eventStartDate.getMinutes(), eventStartDate.getSeconds(), eventStartDate.getMilliseconds());\r\n const newEndDate = new Date(newStartDate.getTime() + eventDurationMs);\r\n\r\n updateEvent({\r\n ...droppedEvent,\r\n startDate: newStartDate.toISOString(),\r\n endDate: newEndDate.toISOString(),\r\n });\r\n\r\n return { moved: true };\r\n },\r\n collect: monitor => ({\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n }),\r\n }),\r\n [cell.date, updateEvent]\r\n );\r\n\r\n return (\r\n <div ref={drop} className={cn(isOver && canDrop && \"bg-accent/50\")}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import { parseISO } from \"date-fns\";\r\nimport { useForm } from \"react-hook-form\";\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\n\r\nimport { useDisclosure } from \"@/hooks/use-disclosure\";\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { Input } from \"@/components/ui/input\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Textarea } from \"@/components/ui/textarea\";\r\nimport { TimeInput } from \"@/components/ui/time-input\";\r\nimport { SingleDayPicker } from \"@/components/ui/single-day-picker\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\nimport { Form, FormField, FormLabel, FormItem, FormControl, FormMessage } from \"@/components/ui/form\";\r\nimport { Select, SelectItem, SelectContent, SelectTrigger, SelectValue } from \"@/components/ui/select\";\r\nimport { Dialog, DialogHeader, DialogClose, DialogContent, DialogTrigger, DialogTitle, DialogDescription, DialogFooter } from \"@/components/ui/dialog\";\r\n\r\nimport { createEventSchema } from \"@/calendar/schemas\";\r\n\r\n/**\r\n * EditEventDialog - Dialog for editing existing events\r\n * \r\n * @param {Object} props\r\n * @param {React.ReactNode} props.children - Trigger element\r\n * @param {Object} props.event - Event to edit\r\n * @param {Function} [props.onEventUpdated] - Callback when event is successfully updated\r\n * @param {boolean} [props.showFormDisclaimer=true] - Show form disclaimer/description\r\n */\r\nexport function EditEventDialog({ children, event, onEventUpdated, showFormDisclaimer = true }) {\r\n const { isOpen, onClose, onToggle } = useDisclosure();\r\n\r\n const { users, updateEvent, singleUser, currentUser } = useCalendar();\r\n\r\n const form = useForm({\r\n resolver: zodResolver(createEventSchema(singleUser)),\r\n defaultValues: {\r\n user: singleUser ? (currentUser?.id || event.user.id) : event.user.id,\r\n title: event.title,\r\n description: event.description,\r\n startDate: parseISO(event.startDate),\r\n startTime: { hour: parseISO(event.startDate).getHours(), minute: parseISO(event.startDate).getMinutes() },\r\n endDate: parseISO(event.endDate),\r\n endTime: { hour: parseISO(event.endDate).getHours(), minute: parseISO(event.endDate).getMinutes() },\r\n color: event.color,\r\n },\r\n });\r\n\r\n const onSubmit = async (values) => {\r\n try {\r\n // In single-user mode, use currentUser; otherwise find user from values\r\n const user = singleUser \r\n ? currentUser \r\n : users.find(user => user.id === values.user);\r\n\r\n if (!user) {\r\n if (!singleUser) {\r\n form.setError(\"user\", { message: \"User not found\" });\r\n }\r\n return;\r\n }\r\n\r\n const startDateTime = new Date(values.startDate);\r\n startDateTime.setHours(values.startTime.hour, values.startTime.minute, 0, 0);\r\n\r\n const endDateTime = new Date(values.endDate);\r\n endDateTime.setHours(values.endTime.hour, values.endTime.minute, 0, 0);\r\n\r\n const updatedEvent = await updateEvent({\r\n ...event,\r\n user,\r\n title: values.title,\r\n color: values.color,\r\n description: values.description,\r\n startDate: startDateTime.toISOString(),\r\n endDate: endDateTime.toISOString(),\r\n });\r\n\r\n onEventUpdated?.(updatedEvent);\r\n onClose();\r\n } catch (error) {\r\n console.error(\"Failed to update event:\", error);\r\n // You can add error handling UI here if needed\r\n }\r\n };\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={onToggle}>\r\n <DialogTrigger asChild>{children}</DialogTrigger>\r\n\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>Edit Event</DialogTitle>\r\n {showFormDisclaimer && (\r\n <DialogDescription className=\"mt-2\">\r\n Update the event details. Changes will be saved according to your API configuration.\r\n </DialogDescription>\r\n )}\r\n </DialogHeader>\r\n\r\n <Form {...form}>\r\n <form id=\"event-form\" onSubmit={form.handleSubmit(onSubmit)} className=\"grid gap-4 py-4\">\r\n {!singleUser && (\r\n <FormField\r\n control={form.control}\r\n name=\"user\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel>Responsible</FormLabel>\r\n <FormControl>\r\n <Select value={field.value} onValueChange={field.onChange}>\r\n <SelectTrigger data-invalid={fieldState.invalid}>\r\n <SelectValue placeholder=\"Select an option\" />\r\n </SelectTrigger>\r\n\r\n <SelectContent>\r\n {users.map(user => (\r\n <SelectItem key={user.id} value={user.id} className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <Avatar key={user.id} className=\"size-6\">\r\n <AvatarImage src={user.picturePath ?? undefined} alt={user.name} />\r\n <AvatarFallback className=\"text-xxs\">{user.name[0]}</AvatarFallback>\r\n </Avatar>\r\n\r\n <p className=\"truncate\">{user.name}</p>\r\n </div>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </FormControl>\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n )}\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"title\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel htmlFor=\"title\">Title</FormLabel>\r\n\r\n <FormControl>\r\n <Input id=\"title\" placeholder=\"Enter a title\" data-invalid={fieldState.invalid} {...field} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <FormField\r\n control={form.control}\r\n name=\"startDate\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel htmlFor=\"startDate\">Start Date</FormLabel>\r\n\r\n <FormControl>\r\n <SingleDayPicker\r\n id=\"startDate\"\r\n value={field.value}\r\n onSelect={date => field.onChange(date)}\r\n placeholder=\"Select a date\"\r\n data-invalid={fieldState.invalid}\r\n />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"startTime\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel>Start Time</FormLabel>\r\n\r\n <FormControl>\r\n <TimeInput value={field.value} onChange={field.onChange} hourCycle={12} data-invalid={fieldState.invalid} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <FormField\r\n control={form.control}\r\n name=\"endDate\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel>End Date</FormLabel>\r\n <FormControl>\r\n <SingleDayPicker\r\n value={field.value}\r\n onSelect={date => field.onChange(date)}\r\n placeholder=\"Select a date\"\r\n data-invalid={fieldState.invalid}\r\n />\r\n </FormControl>\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"endTime\"\r\n render={({ field, fieldState }) => (\r\n <FormItem className=\"flex-1\">\r\n <FormLabel>End Time</FormLabel>\r\n\r\n <FormControl>\r\n <TimeInput value={field.value} onChange={field.onChange} hourCycle={12} data-invalid={fieldState.invalid} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n </div>\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"color\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel>Color</FormLabel>\r\n <FormControl>\r\n <Select value={field.value} onValueChange={field.onChange}>\r\n <SelectTrigger data-invalid={fieldState.invalid}>\r\n <SelectValue placeholder=\"Select an option\" />\r\n </SelectTrigger>\r\n\r\n <SelectContent>\r\n <SelectItem value=\"blue\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-blue-600\" />\r\n Blue\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"green\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-green-600\" />\r\n Green\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"red\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-red-600\" />\r\n Red\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"yellow\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-yellow-600\" />\r\n Yellow\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"purple\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-purple-600\" />\r\n Purple\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"orange\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-orange-600\" />\r\n Orange\r\n </div>\r\n </SelectItem>\r\n\r\n <SelectItem value=\"gray\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"size-3.5 rounded-full bg-neutral-600\" />\r\n Gray\r\n </div>\r\n </SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </FormControl>\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n\r\n <FormField\r\n control={form.control}\r\n name=\"description\"\r\n render={({ field, fieldState }) => (\r\n <FormItem>\r\n <FormLabel>Description</FormLabel>\r\n\r\n <FormControl>\r\n <Textarea {...field} value={field.value} data-invalid={fieldState.invalid} />\r\n </FormControl>\r\n\r\n <FormMessage />\r\n </FormItem>\r\n )}\r\n />\r\n </form>\r\n </Form>\r\n\r\n <DialogFooter>\r\n <DialogClose asChild>\r\n <Button type=\"button\" variant=\"outline\">\r\n Cancel\r\n </Button>\r\n </DialogClose>\r\n\r\n <Button form=\"event-form\" type=\"submit\">\r\n Save changes\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","import { format, parseISO } from \"date-fns\";\r\nimport { Calendar, Clock, Text, User } from \"lucide-react\";\r\n\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { EditEventDialog } from \"@/calendar/components/dialogs/edit-event-dialog\";\r\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from \"@/components/ui/dialog\";\r\n\r\nexport function EventDetailsDialog({ event, children }) {\r\n const startDate = parseISO(event.startDate);\r\n const endDate = parseISO(event.endDate);\r\n\r\n return (\r\n <>\r\n <Dialog>\r\n <DialogTrigger asChild>{children}</DialogTrigger>\r\n\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>{event.title}</DialogTitle>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-start gap-2\">\r\n <User className=\"mt-1 size-4 shrink-0\" />\r\n <div>\r\n <p className=\"text-sm font-medium\">Responsible</p>\r\n <p className=\"text-sm text-muted-foreground\">{event.user.name}</p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <Calendar className=\"mt-1 size-4 shrink-0\" />\r\n <div>\r\n <p className=\"text-sm font-medium\">Start Date</p>\r\n <p className=\"text-sm text-muted-foreground\">{format(startDate, \"MMM d, yyyy h:mm a\")}</p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <Clock className=\"mt-1 size-4 shrink-0\" />\r\n <div>\r\n <p className=\"text-sm font-medium\">End Date</p>\r\n <p className=\"text-sm text-muted-foreground\">{format(endDate, \"MMM d, yyyy h:mm a\")}</p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <Text className=\"mt-1 size-4 shrink-0\" />\r\n <div>\r\n <p className=\"text-sm font-medium\">Description</p>\r\n <p className=\"text-sm text-muted-foreground\">{event.description}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <DialogFooter>\r\n <EditEventDialog event={event}>\r\n <Button type=\"button\" variant=\"outline\">\r\n Edit\r\n </Button>\r\n </EditEventDialog>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n","import { cva } from \"class-variance-authority\";\r\nimport { endOfDay, format, isSameDay, parseISO, startOfDay } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { DraggableEvent } from \"@/calendar/components/dnd/draggable-event\";\r\nimport { EventDetailsDialog } from \"@/calendar/components/dialogs/event-details-dialog\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst eventBadgeVariants = cva(\r\n \"mx-1 flex size-auto h-6.5 select-none items-center justify-between gap-1.5 truncate whitespace-nowrap rounded-md border px-2 text-xs focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\r\n {\r\n variants: {\r\n color: {\r\n // Colored and mixed variants\r\n blue: \"border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-300 [&_.event-dot]:fill-blue-600\",\r\n green: \"border-green-200 bg-green-50 text-green-700 dark:border-green-800 dark:bg-green-950 dark:text-green-300 [&_.event-dot]:fill-green-600\",\r\n red: \"border-red-200 bg-red-50 text-red-700 dark:border-red-800 dark:bg-red-950 dark:text-red-300 [&_.event-dot]:fill-red-600\",\r\n yellow: \"border-yellow-200 bg-yellow-50 text-yellow-700 dark:border-yellow-800 dark:bg-yellow-950 dark:text-yellow-300 [&_.event-dot]:fill-yellow-600\",\r\n purple: \"border-purple-200 bg-purple-50 text-purple-700 dark:border-purple-800 dark:bg-purple-950 dark:text-purple-300 [&_.event-dot]:fill-purple-600\",\r\n orange: \"border-orange-200 bg-orange-50 text-orange-700 dark:border-orange-800 dark:bg-orange-950 dark:text-orange-300 [&_.event-dot]:fill-orange-600\",\r\n gray: \"border-neutral-200 bg-neutral-50 text-neutral-900 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-300 [&_.event-dot]:fill-neutral-600\",\r\n\r\n // Dot variants\r\n \"blue-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-blue-600\",\r\n \"green-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-green-600\",\r\n \"red-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-red-600\",\r\n \"yellow-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-yellow-600\",\r\n \"purple-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-purple-600\",\r\n \"orange-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-orange-600\",\r\n \"gray-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-neutral-600\",\r\n },\r\n multiDayPosition: {\r\n first: \"relative z-10 mr-0 w-[calc(100%_-_3px)] rounded-r-none border-r-0 [&>span]:mr-2.5\",\r\n middle: \"relative z-10 mx-0 w-[calc(100%_+_1px)] rounded-none border-x-0\",\r\n last: \"ml-0 rounded-l-none border-l-0\",\r\n none: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n color: \"blue-dot\",\r\n },\r\n }\r\n);\r\n\r\nexport function MonthEventBadge({ event, cellDate, eventCurrentDay, eventTotalDays, className, position: propPosition }) {\r\n const { badgeVariant } = useCalendar();\r\n\r\n const itemStart = startOfDay(parseISO(event.startDate));\r\n const itemEnd = endOfDay(parseISO(event.endDate));\r\n\r\n if (cellDate < itemStart || cellDate > itemEnd) return null;\r\n\r\n let position;\r\n\r\n if (propPosition) {\r\n position = propPosition;\r\n } else if (eventCurrentDay && eventTotalDays) {\r\n position = \"none\";\r\n } else if (isSameDay(itemStart, itemEnd)) {\r\n position = \"none\";\r\n } else if (isSameDay(cellDate, itemStart)) {\r\n position = \"first\";\r\n } else if (isSameDay(cellDate, itemEnd)) {\r\n position = \"last\";\r\n } else {\r\n position = \"middle\";\r\n }\r\n\r\n const renderBadgeText = [\"first\", \"none\"].includes(position);\r\n\r\n const color = badgeVariant === \"dot\" ? `${event.color}-dot` : event.color;\r\n\r\n const eventBadgeClasses = cn(eventBadgeVariants({ color, multiDayPosition: position, className }));\r\n\r\n const handleKeyDown = (e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n if (e.currentTarget instanceof HTMLElement) e.currentTarget.click();\r\n }\r\n };\r\n\r\n return (\r\n <DraggableEvent event={event}>\r\n <EventDetailsDialog event={event}>\r\n <div role=\"button\" tabIndex={0} className={eventBadgeClasses} onKeyDown={handleKeyDown}>\r\n <div className=\"flex items-center gap-1.5 truncate\">\r\n {![\"middle\", \"last\"].includes(position) && [\"mixed\", \"dot\"].includes(badgeVariant) && (\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" className=\"event-dot shrink-0\">\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\r\n </svg>\r\n )}\r\n\r\n {renderBadgeText && (\r\n <p className=\"flex-1 truncate font-semibold\">\r\n {eventCurrentDay && (\r\n <span className=\"text-xs\">\r\n Day {eventCurrentDay} of {eventTotalDays} •{\" \"}\r\n </span>\r\n )}\r\n {event.title}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {renderBadgeText && <span>{format(new Date(event.startDate), \"h:mm a\")}</span>}\r\n </div>\r\n </EventDetailsDialog>\r\n </DraggableEvent>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { isToday, startOfDay } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { EventBullet } from \"@/calendar/components/month-view/event-bullet\";\r\nimport { DroppableDayCell } from \"@/calendar/components/dnd/droppable-day-cell\";\r\nimport { MonthEventBadge } from \"@/calendar/components/month-view/month-event-badge\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { getMonthCellEvents } from \"@/calendar/helpers\";\r\n\r\nconst MAX_VISIBLE_EVENTS = 3;\r\n\r\nexport function DayCell({ cell, events, eventPositions }) {\r\n const { setSelectedDate } = useCalendar();\r\n\r\n const { day, currentMonth, date } = cell;\r\n\r\n const cellEvents = useMemo(() => getMonthCellEvents(date, events, eventPositions), [date, events, eventPositions]);\r\n const isSunday = date.getDay() === 0;\r\n\r\n const handleClick = () => {\r\n setSelectedDate(date);\r\n };\r\n\r\n return (\r\n <DroppableDayCell cell={cell}>\r\n <div className={cn(\"flex h-full flex-col gap-1 border-l border-t py-1.5 lg:pb-2 lg:pt-1\", isSunday && \"border-l-0\")}>\r\n <button\r\n onClick={handleClick}\r\n className={cn(\r\n \"flex size-6 translate-x-1 items-center justify-center rounded-full text-xs font-semibold hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring lg:px-2\",\r\n !currentMonth && \"opacity-20\",\r\n isToday(date) && \"bg-primary font-bold text-primary-foreground hover:bg-primary\"\r\n )}\r\n >\r\n {day}\r\n </button>\r\n\r\n <div className={cn(\"flex h-6 gap-1 px-2 lg:h-[94px] lg:flex-col lg:gap-2 lg:px-0\", !currentMonth && \"opacity-50\")}>\r\n {[0, 1, 2].map(position => {\r\n const event = cellEvents.find(e => e.position === position);\r\n const eventKey = event ? `event-${event.id}-${position}` : `empty-${position}`;\r\n\r\n return (\r\n <div key={eventKey} className=\"lg:flex-1\">\r\n {event && (\r\n <>\r\n <EventBullet className=\"lg:hidden\" color={event.color} />\r\n <MonthEventBadge className=\"hidden lg:flex\" event={event} cellDate={startOfDay(date)} />\r\n </>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {cellEvents.length > MAX_VISIBLE_EVENTS && (\r\n <p className={cn(\"h-4.5 px-1.5 text-xs font-semibold text-muted-foreground\", !currentMonth && \"opacity-50\")}>\r\n <span className=\"sm:hidden\">+{cellEvents.length - MAX_VISIBLE_EVENTS}</span>\r\n <span className=\"hidden sm:inline\"> {cellEvents.length - MAX_VISIBLE_EVENTS} more...</span>\r\n </p>\r\n )}\r\n </div>\r\n </DroppableDayCell>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { DayCell } from \"@/calendar/components/month-view/day-cell\";\r\n\r\nimport { getCalendarCells, calculateMonthEventPositions } from \"@/calendar/helpers\";\r\n\r\nconst WEEK_DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\r\n\r\nexport function CalendarMonthView({ singleDayEvents, multiDayEvents }) {\r\n const { selectedDate } = useCalendar();\r\n\r\n const allEvents = [...multiDayEvents, ...singleDayEvents];\r\n\r\n const cells = useMemo(() => getCalendarCells(selectedDate), [selectedDate]);\r\n\r\n const eventPositions = useMemo(\r\n () => calculateMonthEventPositions(multiDayEvents, singleDayEvents, selectedDate),\r\n [multiDayEvents, singleDayEvents, selectedDate]\r\n );\r\n\r\n return (\r\n <div>\r\n <div className=\"grid grid-cols-7 divide-x\">\r\n {WEEK_DAYS.map(day => (\r\n <div key={day} className=\"flex items-center justify-center py-2\">\r\n <span className=\"text-xs font-medium text-muted-foreground\">{day}</span>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-7 overflow-hidden\">\r\n {cells.map(cell => (\r\n <DayCell key={cell.date.toISOString()} cell={cell} events={allEvents} eventPositions={eventPositions} />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst ScrollArea = React.forwardRef(\r\n ({ className, children, ...props }, ref) => (\r\n <ScrollAreaPrimitive.Root ref={ref} className={cn(\"relative overflow-hidden\", className)} {...props}>\r\n <ScrollAreaPrimitive.Viewport className=\"size-full rounded-[inherit]\">{children}</ScrollAreaPrimitive.Viewport>\r\n <ScrollBar />\r\n <ScrollAreaPrimitive.Corner />\r\n </ScrollAreaPrimitive.Root>\r\n )\r\n);\r\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\r\n\r\nconst ScrollBar = React.forwardRef(\r\n ({ className, orientation = \"vertical\", ...props }, ref) => (\r\n <ScrollAreaPrimitive.ScrollAreaScrollbar\r\n ref={ref}\r\n orientation={orientation}\r\n className={cn(\r\n \"flex touch-none select-none transition-colors\",\r\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\r\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\r\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\r\n )\r\n);\r\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\r\n\r\nexport { ScrollArea, ScrollBar };\r\n","import { format, parseISO } from \"date-fns\";\r\nimport { cva } from \"class-variance-authority\";\r\nimport { Clock, Text, User } from \"lucide-react\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { EventDetailsDialog } from \"@/calendar/components/dialogs/event-details-dialog\";\r\n\r\nconst agendaEventCardVariants = cva(\r\n \"flex select-none items-center justify-between gap-3 rounded-md border p-3 text-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\r\n {\r\n variants: {\r\n color: {\r\n // Colored variants\r\n blue: \"border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-300 [&_.event-dot]:fill-blue-600\",\r\n green: \"border-green-200 bg-green-50 text-green-700 dark:border-green-800 dark:bg-green-950 dark:text-green-300 [&_.event-dot]:fill-green-600\",\r\n red: \"border-red-200 bg-red-50 text-red-700 dark:border-red-800 dark:bg-red-950 dark:text-red-300 [&_.event-dot]:fill-red-600\",\r\n yellow: \"border-yellow-200 bg-yellow-50 text-yellow-700 dark:border-yellow-800 dark:bg-yellow-950 dark:text-yellow-300 [&_.event-dot]:fill-yellow-600\",\r\n purple: \"border-purple-200 bg-purple-50 text-purple-700 dark:border-purple-800 dark:bg-purple-950 dark:text-purple-300 [&_.event-dot]:fill-purple-600\",\r\n orange: \"border-orange-200 bg-orange-50 text-orange-700 dark:border-orange-800 dark:bg-orange-950 dark:text-orange-300 [&_.event-dot]:fill-orange-600\",\r\n gray: \"border-neutral-200 bg-neutral-50 text-neutral-900 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-300 [&_.event-dot]:fill-neutral-600\",\r\n\r\n // Dot variants\r\n \"blue-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-blue-600\",\r\n \"green-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-green-600\",\r\n \"red-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-red-600\",\r\n \"orange-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-orange-600\",\r\n \"purple-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-purple-600\",\r\n \"yellow-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-yellow-600\",\r\n \"gray-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-neutral-600\",\r\n },\r\n },\r\n defaultVariants: {\r\n color: \"blue-dot\",\r\n },\r\n }\r\n);\r\n\r\nexport function AgendaEventCard({ event, eventCurrentDay, eventTotalDays, className }) {\r\n const { badgeVariant } = useCalendar();\r\n\r\n const startDate = parseISO(event.startDate);\r\n const endDate = parseISO(event.endDate);\r\n\r\n const color = badgeVariant === \"dot\" ? `${event.color}-dot` : event.color;\r\n\r\n const agendaEventCardClasses = agendaEventCardVariants({ color, className });\r\n\r\n const handleKeyDown = (e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n if (e.currentTarget instanceof HTMLElement) e.currentTarget.click();\r\n }\r\n };\r\n\r\n return (\r\n <EventDetailsDialog event={event}>\r\n <div role=\"button\" tabIndex={0} className={agendaEventCardClasses} onKeyDown={handleKeyDown}>\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex items-center gap-1.5\">\r\n {[\"mixed\", \"dot\"].includes(badgeVariant) && (\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" className=\"event-dot shrink-0\">\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\r\n </svg>\r\n )}\r\n\r\n <p className=\"font-medium\">\r\n {eventCurrentDay && eventTotalDays && (\r\n <span className=\"mr-1 text-xs\">\r\n Day {eventCurrentDay} of {eventTotalDays} •{\" \"}\r\n </span>\r\n )}\r\n {event.title}\r\n </p>\r\n </div>\r\n\r\n <div className=\"mt-1 flex items-center gap-1\">\r\n <User className=\"size-3 shrink-0\" />\r\n <p className=\"text-xs text-foreground\">{event.user.name}</p>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"size-3 shrink-0\" />\r\n <p className=\"text-xs text-foreground\">\r\n {format(startDate, \"h:mm a\")} - {format(endDate, \"h:mm a\")}\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <Text className=\"size-3 shrink-0\" />\r\n <p className=\"text-xs text-foreground\">{event.description}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </EventDetailsDialog>\r\n );\r\n}\r\n","import { differenceInDays, format, parseISO, startOfDay } from \"date-fns\";\r\n\r\nimport { AgendaEventCard } from \"@/calendar/components/agenda-view/agenda-event-card\";\r\n\r\nexport function AgendaDayGroup({ date, events, multiDayEvents }) {\r\n const sortedEvents = [...events].sort((a, b) => new Date(a.startDate).getTime() - new Date(b.startDate).getTime());\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"sticky top-0 flex items-center gap-4 bg-background py-2\">\r\n <p className=\"text-sm font-semibold\">{format(date, \"EEEE, MMMM d, yyyy\")}</p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n {multiDayEvents.length > 0 &&\r\n multiDayEvents.map(event => {\r\n const eventStart = startOfDay(parseISO(event.startDate));\r\n const eventEnd = startOfDay(parseISO(event.endDate));\r\n const currentDate = startOfDay(date);\r\n\r\n const eventTotalDays = differenceInDays(eventEnd, eventStart) + 1;\r\n const eventCurrentDay = differenceInDays(currentDate, eventStart) + 1;\r\n return <AgendaEventCard key={event.id} event={event} eventCurrentDay={eventCurrentDay} eventTotalDays={eventTotalDays} />;\r\n })}\r\n\r\n {sortedEvents.length > 0 && sortedEvents.map(event => <AgendaEventCard key={event.id} event={event} />)}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { CalendarX2 } from \"lucide-react\";\r\nimport { parseISO, format, endOfDay, startOfDay, isSameMonth } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\nimport { AgendaDayGroup } from \"@/calendar/components/agenda-view/agenda-day-group\";\r\n\r\nexport function CalendarAgendaView({ singleDayEvents, multiDayEvents }) {\r\n const { selectedDate } = useCalendar();\r\n\r\n const eventsByDay = useMemo(() => {\r\n const allDates = new Map();\r\n\r\n singleDayEvents.forEach(event => {\r\n const eventDate = parseISO(event.startDate);\r\n if (!isSameMonth(eventDate, selectedDate)) return;\r\n\r\n const dateKey = format(eventDate, \"yyyy-MM-dd\");\r\n\r\n if (!allDates.has(dateKey)) {\r\n allDates.set(dateKey, { date: startOfDay(eventDate), events: [], multiDayEvents: [] });\r\n }\r\n\r\n allDates.get(dateKey)?.events.push(event);\r\n });\r\n\r\n multiDayEvents.forEach(event => {\r\n const eventStart = parseISO(event.startDate);\r\n const eventEnd = parseISO(event.endDate);\r\n\r\n let currentDate = startOfDay(eventStart);\r\n const lastDate = endOfDay(eventEnd);\r\n\r\n while (currentDate <= lastDate) {\r\n if (isSameMonth(currentDate, selectedDate)) {\r\n const dateKey = format(currentDate, \"yyyy-MM-dd\");\r\n\r\n if (!allDates.has(dateKey)) {\r\n allDates.set(dateKey, { date: new Date(currentDate), events: [], multiDayEvents: [] });\r\n }\r\n\r\n allDates.get(dateKey)?.multiDayEvents.push(event);\r\n }\r\n currentDate = new Date(currentDate.setDate(currentDate.getDate() + 1));\r\n }\r\n });\r\n\r\n return Array.from(allDates.values()).sort((a, b) => a.date.getTime() - b.date.getTime());\r\n }, [singleDayEvents, multiDayEvents, selectedDate]);\r\n\r\n const hasAnyEvents = singleDayEvents.length > 0 || multiDayEvents.length > 0;\r\n\r\n return (\r\n <div className=\"h-[800px]\">\r\n <ScrollArea className=\"h-full\" type=\"always\">\r\n <div className=\"space-y-6 p-4\">\r\n {eventsByDay.map(dayGroup => (\r\n <AgendaDayGroup key={format(dayGroup.date, \"yyyy-MM-dd\")} date={dayGroup.date} events={dayGroup.events} multiDayEvents={dayGroup.multiDayEvents} />\r\n ))}\r\n\r\n {!hasAnyEvents && (\r\n <div className=\"flex flex-col items-center justify-center gap-2 py-20 text-muted-foreground\">\r\n <CalendarX2 className=\"size-10\" />\r\n <p className=\"text-sm md:text-base\">No events scheduled for the selected month</p>\r\n </div>\r\n )}\r\n </div>\r\n </ScrollArea>\r\n </div>\r\n );\r\n}\r\n","import { cva } from \"class-variance-authority\";\r\nimport { format, differenceInMinutes, parseISO } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { DraggableEvent } from \"@/calendar/components/dnd/draggable-event\";\r\nimport { EventDetailsDialog } from \"@/calendar/components/dialogs/event-details-dialog\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst calendarWeekEventCardVariants = cva(\r\n \"flex select-none flex-col gap-0.5 truncate whitespace-nowrap rounded-md border px-2 py-1.5 text-xs focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\r\n {\r\n variants: {\r\n color: {\r\n // Colored and mixed variants\r\n blue: \"border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-300 [&_.event-dot]:fill-blue-600\",\r\n green: \"border-green-200 bg-green-50 text-green-700 dark:border-green-800 dark:bg-green-950 dark:text-green-300 [&_.event-dot]:fill-green-600\",\r\n red: \"border-red-200 bg-red-50 text-red-700 dark:border-red-800 dark:bg-red-950 dark:text-red-300 [&_.event-dot]:fill-red-600\",\r\n yellow: \"border-yellow-200 bg-yellow-50 text-yellow-700 dark:border-yellow-800 dark:bg-yellow-950 dark:text-yellow-300 [&_.event-dot]:fill-yellow-600\",\r\n purple: \"border-purple-200 bg-purple-50 text-purple-700 dark:border-purple-800 dark:bg-purple-950 dark:text-purple-300 [&_.event-dot]:fill-purple-600\",\r\n orange: \"border-orange-200 bg-orange-50 text-orange-700 dark:border-orange-800 dark:bg-orange-950 dark:text-orange-300 [&_.event-dot]:fill-orange-600\",\r\n gray: \"border-neutral-200 bg-neutral-50 text-neutral-700 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-300 [&_.event-dot]:fill-neutral-600\",\r\n\r\n // Dot variants\r\n \"blue-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-blue-600\",\r\n \"green-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-green-600\",\r\n \"red-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-red-600\",\r\n \"orange-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-orange-600\",\r\n \"purple-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-purple-600\",\r\n \"yellow-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-yellow-600\",\r\n \"gray-dot\": \"bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-neutral-600\",\r\n },\r\n },\r\n defaultVariants: {\r\n color: \"blue-dot\",\r\n },\r\n }\r\n);\r\n\r\nexport function EventBlock({ event, className }) {\r\n const { badgeVariant } = useCalendar();\r\n\r\n const start = parseISO(event.startDate);\r\n const end = parseISO(event.endDate);\r\n const durationInMinutes = differenceInMinutes(end, start);\r\n const heightInPixels = (durationInMinutes / 60) * 96 - 8;\r\n\r\n const color = badgeVariant === \"dot\" ? `${event.color}-dot` : event.color;\r\n\r\n const calendarWeekEventCardClasses = cn(calendarWeekEventCardVariants({ color, className }), durationInMinutes < 35 && \"py-0 justify-center\");\r\n\r\n const handleKeyDown = (e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n if (e.currentTarget instanceof HTMLElement) e.currentTarget.click();\r\n }\r\n };\r\n\r\n return (\r\n <DraggableEvent event={event}>\r\n <EventDetailsDialog event={event}>\r\n <div role=\"button\" tabIndex={0} className={calendarWeekEventCardClasses} style={{ height: `${heightInPixels}px` }} onKeyDown={handleKeyDown}>\r\n <div className=\"flex items-center gap-1.5 truncate\">\r\n {[\"mixed\", \"dot\"].includes(badgeVariant) && (\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" className=\"event-dot shrink-0\">\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\r\n </svg>\r\n )}\r\n\r\n <p className=\"truncate font-semibold\">{event.title}</p>\r\n </div>\r\n\r\n {durationInMinutes > 25 && (\r\n <p>\r\n {format(start, \"h:mm a\")} - {format(end, \"h:mm a\")}\r\n </p>\r\n )}\r\n </div>\r\n </EventDetailsDialog>\r\n </DraggableEvent>\r\n );\r\n}\r\n","import { useDrop } from \"react-dnd\";\r\nimport { parseISO, differenceInMilliseconds } from \"date-fns\";\r\n\r\nimport { useUpdateEvent } from \"@/calendar/hooks/use-update-event\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { ItemTypes } from \"@/calendar/components/dnd/draggable-event\";\r\n\r\nexport function DroppableTimeBlock({ date, hour, minute, children }) {\r\n const { updateEvent } = useUpdateEvent();\r\n\r\n const [{ isOver, canDrop }, drop] = useDrop(\r\n () => ({\r\n accept: ItemTypes.EVENT,\r\n drop: (item) => {\r\n const droppedEvent = item.event;\r\n\r\n const eventStartDate = parseISO(droppedEvent.startDate);\r\n const eventEndDate = parseISO(droppedEvent.endDate);\r\n\r\n const eventDurationMs = differenceInMilliseconds(eventEndDate, eventStartDate);\r\n\r\n const newStartDate = new Date(date);\r\n newStartDate.setHours(hour, minute, 0, 0);\r\n const newEndDate = new Date(newStartDate.getTime() + eventDurationMs);\r\n\r\n updateEvent({\r\n ...droppedEvent,\r\n startDate: newStartDate.toISOString(),\r\n endDate: newEndDate.toISOString(),\r\n });\r\n\r\n return { moved: true };\r\n },\r\n collect: monitor => ({\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n }),\r\n }),\r\n [date, hour, minute, updateEvent]\r\n );\r\n\r\n return (\r\n <div ref={drop} className={cn(\"h-[24px]\", isOver && canDrop && \"bg-accent/50\")}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import { format } from \"date-fns\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\nexport function CalendarTimeline({ firstVisibleHour, lastVisibleHour }) {\r\n const [currentTime, setCurrentTime] = useState(new Date());\r\n\r\n useEffect(() => {\r\n const timer = setInterval(() => setCurrentTime(new Date()), 60 * 1000);\r\n return () => clearInterval(timer);\r\n }, []);\r\n\r\n const getCurrentTimePosition = () => {\r\n const minutes = currentTime.getHours() * 60 + currentTime.getMinutes();\r\n\r\n const visibleStartMinutes = firstVisibleHour * 60;\r\n const visibleEndMinutes = lastVisibleHour * 60;\r\n const visibleRangeMinutes = visibleEndMinutes - visibleStartMinutes;\r\n\r\n return ((minutes - visibleStartMinutes) / visibleRangeMinutes) * 100;\r\n };\r\n\r\n const formatCurrentTime = () => {\r\n return format(currentTime, \"h:mm a\");\r\n };\r\n\r\n const currentHour = currentTime.getHours();\r\n if (currentHour < firstVisibleHour || currentHour >= lastVisibleHour) return null;\r\n\r\n return (\r\n <div className=\"pointer-events-none absolute inset-x-0 z-50 border-t border-primary\" style={{ top: `${getCurrentTimePosition()}%` }}>\r\n <div className=\"absolute left-0 top-0 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary\"></div>\r\n <div className=\"absolute -left-18 flex w-16 -translate-y-1/2 justify-end bg-background pr-1 text-xs font-medium text-primary\">{formatCurrentTime()}</div>\r\n </div>\r\n );\r\n}\r\n","import { parseISO, isWithinInterval, differenceInDays, startOfDay, endOfDay } from \"date-fns\";\r\n\r\nimport { MonthEventBadge } from \"@/calendar/components/month-view/month-event-badge\";\r\n\r\nexport function DayViewMultiDayEventsRow({ selectedDate, multiDayEvents }) {\r\n const dayStart = startOfDay(selectedDate);\r\n const dayEnd = endOfDay(selectedDate);\r\n\r\n const multiDayEventsInDay = multiDayEvents\r\n .filter(event => {\r\n const eventStart = parseISO(event.startDate);\r\n const eventEnd = parseISO(event.endDate);\r\n\r\n const isOverlapping =\r\n isWithinInterval(dayStart, { start: eventStart, end: eventEnd }) ||\r\n isWithinInterval(dayEnd, { start: eventStart, end: eventEnd }) ||\r\n (eventStart <= dayStart && eventEnd >= dayEnd);\r\n\r\n return isOverlapping;\r\n })\r\n .sort((a, b) => {\r\n const durationA = differenceInDays(parseISO(a.endDate), parseISO(a.startDate));\r\n const durationB = differenceInDays(parseISO(b.endDate), parseISO(b.startDate));\r\n return durationB - durationA;\r\n });\r\n\r\n if (multiDayEventsInDay.length === 0) return null;\r\n\r\n return (\r\n <div className=\"flex border-b\">\r\n <div className=\"w-18\"></div>\r\n <div className=\"flex flex-1 flex-col gap-1 border-l py-1\">\r\n {multiDayEventsInDay.map(event => {\r\n const eventStart = startOfDay(parseISO(event.startDate));\r\n const eventEnd = startOfDay(parseISO(event.endDate));\r\n const currentDate = startOfDay(selectedDate);\r\n\r\n const eventTotalDays = differenceInDays(eventEnd, eventStart) + 1;\r\n const eventCurrentDay = differenceInDays(currentDate, eventStart) + 1;\r\n\r\n return <MonthEventBadge key={event.id} event={event} cellDate={selectedDate} eventCurrentDay={eventCurrentDay} eventTotalDays={eventTotalDays} />;\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { Calendar, Clock, User } from \"lucide-react\";\r\nimport { parseISO, areIntervalsOverlapping, format } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\nimport { SingleCalendar } from \"@/components/ui/single-calendar\";\r\n\r\nimport { AddEventDialog } from \"@/calendar/components/dialogs/add-event-dialog\";\r\nimport { EventBlock } from \"@/calendar/components/week-and-day-view/event-block\";\r\nimport { DroppableTimeBlock } from \"@/calendar/components/dnd/droppable-time-block\";\r\nimport { CalendarTimeline } from \"@/calendar/components/week-and-day-view/calendar-time-line\";\r\nimport { DayViewMultiDayEventsRow } from \"@/calendar/components/week-and-day-view/day-view-multi-day-events-row\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { groupEvents, getEventBlockStyle, isWorkingHour, getCurrentEvents, getVisibleHours } from \"@/calendar/helpers\";\r\n\r\nexport function CalendarDayView({ singleDayEvents, multiDayEvents }) {\r\n const { selectedDate, setSelectedDate, users, visibleHours, workingHours } = useCalendar();\r\n\r\n const { hours, earliestEventHour, latestEventHour } = getVisibleHours(visibleHours, singleDayEvents);\r\n\r\n const currentEvents = getCurrentEvents(singleDayEvents);\r\n\r\n const dayEvents = singleDayEvents.filter(event => {\r\n const eventDate = parseISO(event.startDate);\r\n return (\r\n eventDate.getDate() === selectedDate.getDate() &&\r\n eventDate.getMonth() === selectedDate.getMonth() &&\r\n eventDate.getFullYear() === selectedDate.getFullYear()\r\n );\r\n });\r\n\r\n const groupedEvents = groupEvents(dayEvents);\r\n\r\n return (\r\n <div className=\"flex\">\r\n <div className=\"flex flex-1 flex-col\">\r\n <div>\r\n <DayViewMultiDayEventsRow selectedDate={selectedDate} multiDayEvents={multiDayEvents} />\r\n\r\n {/* Day header */}\r\n <div className=\"relative z-20 flex border-b\">\r\n <div className=\"w-18\"></div>\r\n <span className=\"flex-1 border-l py-2 text-center text-xs font-medium text-muted-foreground\">\r\n {format(selectedDate, \"EE\")} <span className=\"font-semibold text-foreground\">{format(selectedDate, \"d\")}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ScrollArea className=\"h-[800px]\" type=\"always\">\r\n <div className=\"flex\">\r\n {/* Hours column */}\r\n <div className=\"relative w-18\">\r\n {hours.map((hour, index) => (\r\n <div key={hour} className=\"relative\" style={{ height: \"96px\" }}>\r\n <div className=\"absolute -top-3 right-2 flex h-6 items-center\">\r\n {index !== 0 && <span className=\"text-xs text-muted-foreground\">{format(new Date().setHours(hour, 0, 0, 0), \"hh a\")}</span>}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Day grid */}\r\n <div className=\"relative flex-1 border-l\">\r\n <div className=\"relative\">\r\n {hours.map((hour, index) => {\r\n const isDisabled = !isWorkingHour(selectedDate, hour, workingHours);\r\n\r\n return (\r\n <div key={hour} className={cn(\"relative\", isDisabled && \"bg-calendar-disabled-hour\")} style={{ height: \"96px\" }}>\r\n {index !== 0 && <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b\"></div>}\r\n\r\n <DroppableTimeBlock date={selectedDate} hour={hour} minute={0}>\r\n <AddEventDialog startDate={selectedDate} startTime={{ hour, minute: 0 }}>\r\n <div className=\"absolute inset-x-0 top-0 h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n\r\n <DroppableTimeBlock date={selectedDate} hour={hour} minute={15}>\r\n <AddEventDialog startDate={selectedDate} startTime={{ hour, minute: 15 }}>\r\n <div className=\"absolute inset-x-0 top-[24px] h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n\r\n <div className=\"pointer-events-none absolute inset-x-0 top-1/2 border-b border-dashed\"></div>\r\n\r\n <DroppableTimeBlock date={selectedDate} hour={hour} minute={30}>\r\n <AddEventDialog startDate={selectedDate} startTime={{ hour, minute: 30 }}>\r\n <div className=\"absolute inset-x-0 top-[48px] h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n\r\n <DroppableTimeBlock date={selectedDate} hour={hour} minute={45}>\r\n <AddEventDialog startDate={selectedDate} startTime={{ hour, minute: 45 }}>\r\n <div className=\"absolute inset-x-0 top-[72px] h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n </div>\r\n );\r\n })}\r\n\r\n {groupedEvents.map((group, groupIndex) =>\r\n group.map(event => {\r\n let style = getEventBlockStyle(event, selectedDate, groupIndex, groupedEvents.length, { from: earliestEventHour, to: latestEventHour });\r\n const hasOverlap = groupedEvents.some(\r\n (otherGroup, otherIndex) =>\r\n otherIndex !== groupIndex &&\r\n otherGroup.some(otherEvent =>\r\n areIntervalsOverlapping(\r\n { start: parseISO(event.startDate), end: parseISO(event.endDate) },\r\n { start: parseISO(otherEvent.startDate), end: parseISO(otherEvent.endDate) }\r\n )\r\n )\r\n );\r\n\r\n if (!hasOverlap) style = { ...style, width: \"100%\", left: \"0%\" };\r\n\r\n return (\r\n <div key={event.id} className=\"absolute p-1\" style={style}>\r\n <EventBlock event={event} />\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n <CalendarTimeline firstVisibleHour={earliestEventHour} lastVisibleHour={latestEventHour} />\r\n </div>\r\n </div>\r\n </ScrollArea>\r\n </div>\r\n\r\n <div className=\"hidden w-64 divide-y border-l md:block\">\r\n <SingleCalendar className=\"mx-auto w-fit\" mode=\"single\" selected={selectedDate} onSelect={setSelectedDate} initialFocus />\r\n\r\n <div className=\"flex-1 space-y-3\">\r\n {currentEvents.length > 0 ? (\r\n <div className=\"flex items-start gap-2 px-4 pt-4\">\r\n <span className=\"relative mt-[5px] flex size-2.5\">\r\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex size-2.5 rounded-full bg-green-600\"></span>\r\n </span>\r\n\r\n <p className=\"text-sm font-semibold text-foreground\">Happening now</p>\r\n </div>\r\n ) : (\r\n <p className=\"p-4 text-center text-sm italic text-muted-foreground\">No appointments or consultations at the moment</p>\r\n )}\r\n\r\n {currentEvents.length > 0 && (\r\n <ScrollArea className=\"h-[422px] px-4\" type=\"always\">\r\n <div className=\"space-y-6 pb-4\">\r\n {currentEvents.map(event => {\r\n const user = users.find(user => user.id === event.user.id);\r\n\r\n return (\r\n <div key={event.id} className=\"space-y-1.5\">\r\n <p className=\"line-clamp-2 text-sm font-semibold\">{event.title}</p>\r\n\r\n {user && (\r\n <div className=\"flex items-center gap-1.5 text-muted-foreground\">\r\n <User className=\"size-3.5\" />\r\n <span className=\"text-sm\">{user.name}</span>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-1.5 text-muted-foreground\">\r\n <Calendar className=\"size-3.5\" />\r\n <span className=\"text-sm\">{format(new Date(), \"MMM d, yyyy\")}</span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1.5 text-muted-foreground\">\r\n <Clock className=\"size-3.5\" />\r\n <span className=\"text-sm\">\r\n {format(parseISO(event.startDate), \"h:mm a\")} - {format(parseISO(event.endDate), \"h:mm a\")}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </ScrollArea>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { parseISO, startOfDay, startOfWeek, endOfWeek, addDays, differenceInDays, isBefore, isAfter } from \"date-fns\";\r\n\r\nimport { MonthEventBadge } from \"@/calendar/components/month-view/month-event-badge\";\r\n\r\nexport function WeekViewMultiDayEventsRow({ selectedDate, multiDayEvents }) {\r\n const weekStart = startOfWeek(selectedDate);\r\n const weekEnd = endOfWeek(selectedDate);\r\n const weekDays = Array.from({ length: 7 }, (_, i) => addDays(weekStart, i));\r\n\r\n const processedEvents = useMemo(() => {\r\n return multiDayEvents\r\n .map(event => {\r\n const start = parseISO(event.startDate);\r\n const end = parseISO(event.endDate);\r\n const adjustedStart = isBefore(start, weekStart) ? weekStart : start;\r\n const adjustedEnd = isAfter(end, weekEnd) ? weekEnd : end;\r\n const startIndex = differenceInDays(adjustedStart, weekStart);\r\n const endIndex = differenceInDays(adjustedEnd, weekStart);\r\n\r\n return {\r\n ...event,\r\n adjustedStart,\r\n adjustedEnd,\r\n startIndex,\r\n endIndex,\r\n };\r\n })\r\n .sort((a, b) => {\r\n const startDiff = a.adjustedStart.getTime() - b.adjustedStart.getTime();\r\n if (startDiff !== 0) return startDiff;\r\n return b.endIndex - b.startIndex - (a.endIndex - a.startIndex);\r\n });\r\n }, [multiDayEvents, weekStart, weekEnd]);\r\n\r\n const eventRows = useMemo(() => {\r\n const rows = [];\r\n\r\n processedEvents.forEach(event => {\r\n let rowIndex = rows.findIndex(row => row.every(e => e.endIndex < event.startIndex || e.startIndex > event.endIndex));\r\n\r\n if (rowIndex === -1) {\r\n rowIndex = rows.length;\r\n rows.push([]);\r\n }\r\n\r\n rows[rowIndex].push(event);\r\n });\r\n\r\n return rows;\r\n }, [processedEvents]);\r\n\r\n const hasEventsInWeek = useMemo(() => {\r\n return multiDayEvents.some(event => {\r\n const start = parseISO(event.startDate);\r\n const end = parseISO(event.endDate);\r\n\r\n return (\r\n // Event starts within the week\r\n (start >= weekStart && start <= weekEnd) ||\r\n // Event ends within the week\r\n (end >= weekStart && end <= weekEnd) ||\r\n // Event spans the entire week\r\n (start <= weekStart && end >= weekEnd)\r\n );\r\n });\r\n }, [multiDayEvents, weekStart, weekEnd]);\r\n\r\n if (!hasEventsInWeek) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"hidden overflow-hidden sm:flex\">\r\n <div className=\"w-18 border-b\"></div>\r\n <div className=\"grid flex-1 grid-cols-7 divide-x border-b border-l\">\r\n {weekDays.map((day, dayIndex) => (\r\n <div key={day.toISOString()} className=\"flex h-full flex-col gap-1 py-1\">\r\n {eventRows.map((row, rowIndex) => {\r\n const event = row.find(e => e.startIndex <= dayIndex && e.endIndex >= dayIndex);\r\n\r\n if (!event) {\r\n return <div key={`${rowIndex}-${dayIndex}`} className=\"h-6.5\" />;\r\n }\r\n\r\n let position = \"none\";\r\n\r\n if (dayIndex === event.startIndex && dayIndex === event.endIndex) {\r\n position = \"none\";\r\n } else if (dayIndex === event.startIndex) {\r\n position = \"first\";\r\n } else if (dayIndex === event.endIndex) {\r\n position = \"last\";\r\n } else {\r\n position = \"middle\";\r\n }\r\n\r\n return <MonthEventBadge key={`${event.id}-${dayIndex}`} event={event} cellDate={startOfDay(day)} position={position} />;\r\n })}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { startOfWeek, addDays, format, parseISO, isSameDay, areIntervalsOverlapping } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\n\r\nimport { AddEventDialog } from \"@/calendar/components/dialogs/add-event-dialog\";\r\nimport { EventBlock } from \"@/calendar/components/week-and-day-view/event-block\";\r\nimport { DroppableTimeBlock } from \"@/calendar/components/dnd/droppable-time-block\";\r\nimport { CalendarTimeline } from \"@/calendar/components/week-and-day-view/calendar-time-line\";\r\nimport { WeekViewMultiDayEventsRow } from \"@/calendar/components/week-and-day-view/week-view-multi-day-events-row\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { groupEvents, getEventBlockStyle, isWorkingHour, getVisibleHours } from \"@/calendar/helpers\";\r\n\r\nexport function CalendarWeekView({ singleDayEvents, multiDayEvents }) {\r\n const { selectedDate, workingHours, visibleHours } = useCalendar();\r\n\r\n const { hours, earliestEventHour, latestEventHour } = getVisibleHours(visibleHours, singleDayEvents);\r\n\r\n const weekStart = startOfWeek(selectedDate);\r\n const weekDays = Array.from({ length: 7 }, (_, i) => addDays(weekStart, i));\r\n\r\n return (\r\n <>\r\n <div className=\"flex flex-col items-center justify-center border-b py-4 text-sm text-muted-foreground sm:hidden\">\r\n <p>Weekly view is not available on smaller devices.</p>\r\n <p>Please switch to daily or monthly view.</p>\r\n </div>\r\n\r\n <div className=\"hidden flex-col sm:flex\">\r\n <div>\r\n <WeekViewMultiDayEventsRow selectedDate={selectedDate} multiDayEvents={multiDayEvents} />\r\n\r\n {/* Week header */}\r\n <div className=\"relative z-20 flex border-b\">\r\n <div className=\"w-18\"></div>\r\n <div className=\"grid flex-1 grid-cols-7 divide-x border-l\">\r\n {weekDays.map((day, index) => (\r\n <span key={index} className=\"py-2 text-center text-xs font-medium text-muted-foreground\">\r\n {format(day, \"EE\")} <span className=\"ml-1 font-semibold text-foreground\">{format(day, \"d\")}</span>\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ScrollArea className=\"h-[736px]\" type=\"always\">\r\n <div className=\"flex overflow-hidden\">\r\n {/* Hours column */}\r\n <div className=\"relative w-18\">\r\n {hours.map((hour, index) => (\r\n <div key={hour} className=\"relative\" style={{ height: \"96px\" }}>\r\n <div className=\"absolute -top-3 right-2 flex h-6 items-center\">\r\n {index !== 0 && <span className=\"text-xs text-muted-foreground\">{format(new Date().setHours(hour, 0, 0, 0), \"hh a\")}</span>}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Week grid */}\r\n <div className=\"relative flex-1 border-l\">\r\n <div className=\"grid grid-cols-7 divide-x\">\r\n {weekDays.map((day, dayIndex) => {\r\n const dayEvents = singleDayEvents.filter(event => isSameDay(parseISO(event.startDate), day) || isSameDay(parseISO(event.endDate), day));\r\n const groupedEvents = groupEvents(dayEvents);\r\n\r\n return (\r\n <div key={dayIndex} className=\"relative\">\r\n {hours.map((hour, index) => {\r\n const isDisabled = !isWorkingHour(day, hour, workingHours);\r\n\r\n return (\r\n <div key={hour} className={cn(\"relative\", isDisabled && \"bg-calendar-disabled-hour\")} style={{ height: \"96px\" }}>\r\n {index !== 0 && <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b\"></div>}\r\n\r\n <DroppableTimeBlock date={day} hour={hour} minute={0}>\r\n <AddEventDialog startDate={day} startTime={{ hour, minute: 0 }}>\r\n <div className=\"absolute inset-x-0 top-0 h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n\r\n <DroppableTimeBlock date={day} hour={hour} minute={15}>\r\n <AddEventDialog startDate={day} startTime={{ hour, minute: 15 }}>\r\n <div className=\"absolute inset-x-0 top-[24px] h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n\r\n <div className=\"pointer-events-none absolute inset-x-0 top-1/2 border-b border-dashed\"></div>\r\n\r\n <DroppableTimeBlock date={day} hour={hour} minute={30}>\r\n <AddEventDialog startDate={day} startTime={{ hour, minute: 30 }}>\r\n <div className=\"absolute inset-x-0 top-[48px] h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n\r\n <DroppableTimeBlock date={day} hour={hour} minute={45}>\r\n <AddEventDialog startDate={day} startTime={{ hour, minute: 45 }}>\r\n <div className=\"absolute inset-x-0 top-[72px] h-[24px] cursor-pointer transition-colors hover:bg-accent\" />\r\n </AddEventDialog>\r\n </DroppableTimeBlock>\r\n </div>\r\n );\r\n })}\r\n\r\n {groupedEvents.map((group, groupIndex) =>\r\n group.map(event => {\r\n let style = getEventBlockStyle(event, day, groupIndex, groupedEvents.length, { from: earliestEventHour, to: latestEventHour });\r\n const hasOverlap = groupedEvents.some(\r\n (otherGroup, otherIndex) =>\r\n otherIndex !== groupIndex &&\r\n otherGroup.some(otherEvent =>\r\n areIntervalsOverlapping(\r\n { start: parseISO(event.startDate), end: parseISO(event.endDate) },\r\n { start: parseISO(otherEvent.startDate), end: parseISO(otherEvent.endDate) }\r\n )\r\n )\r\n );\r\n\r\n if (!hasOverlap) style = { ...style, width: \"100%\", left: \"0%\" };\r\n\r\n return (\r\n <div key={event.id} className=\"absolute p-1\" style={style}>\r\n <EventBlock event={event} />\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <CalendarTimeline firstVisibleHour={earliestEventHour} lastVisibleHour={latestEventHour} />\r\n </div>\r\n </div>\r\n </ScrollArea>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { isSameDay, parseISO } from \"date-fns\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nimport { DndProviderWrapper } from \"@/calendar/components/dnd/dnd-provider\";\r\n\r\nimport { CalendarHeader } from \"@/calendar/components/header/calendar-header\";\r\nimport { CalendarYearView } from \"@/calendar/components/year-view/calendar-year-view\";\r\nimport { CalendarMonthView } from \"@/calendar/components/month-view/calendar-month-view\";\r\nimport { CalendarAgendaView } from \"@/calendar/components/agenda-view/calendar-agenda-view\";\r\nimport { CalendarDayView } from \"@/calendar/components/week-and-day-view/calendar-day-view\";\r\nimport { CalendarWeekView } from \"@/calendar/components/week-and-day-view/calendar-week-view\";\r\n\r\n/**\r\n * ClientContainer - Main calendar container component\r\n * \r\n * @param {Object} props\r\n * @param {string} props.view - Current view ('day' | 'week' | 'month' | 'year' | 'agenda')\r\n * @param {Function} props.onViewChange - Callback when view changes\r\n * @param {boolean} [props.showHeader=true] - Whether to show the calendar header\r\n * @param {Object} [props.headerProps] - Additional props to pass to CalendarHeader\r\n * @param {string} [props.className] - Custom className for the container\r\n * @param {string} [props.headerClassName] - Custom className for the header\r\n * @param {string} [props.contentClassName] - Custom className for the content area\r\n */\r\nexport function ClientContainer({ \r\n view, \r\n onViewChange, \r\n showHeader = true, \r\n headerProps = {},\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n}) {\r\n const { selectedDate, selectedUserId, events } = useCalendar();\r\n\r\n const filteredEvents = useMemo(() => {\r\n return events.filter(event => {\r\n const eventStartDate = parseISO(event.startDate);\r\n const eventEndDate = parseISO(event.endDate);\r\n\r\n if (view === \"year\") {\r\n const yearStart = new Date(selectedDate.getFullYear(), 0, 1);\r\n const yearEnd = new Date(selectedDate.getFullYear(), 11, 31, 23, 59, 59, 999);\r\n const isInSelectedYear = eventStartDate <= yearEnd && eventEndDate >= yearStart;\r\n const isUserMatch = selectedUserId === \"all\" || event.user.id === selectedUserId;\r\n return isInSelectedYear && isUserMatch;\r\n }\r\n\r\n if (view === \"month\" || view === \"agenda\") {\r\n const monthStart = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\r\n const monthEnd = new Date(selectedDate.getFullYear(), selectedDate.getMonth() + 1, 0, 23, 59, 59, 999);\r\n const isInSelectedMonth = eventStartDate <= monthEnd && eventEndDate >= monthStart;\r\n const isUserMatch = selectedUserId === \"all\" || event.user.id === selectedUserId;\r\n return isInSelectedMonth && isUserMatch;\r\n }\r\n\r\n if (view === \"week\") {\r\n const dayOfWeek = selectedDate.getDay();\r\n\r\n const weekStart = new Date(selectedDate);\r\n weekStart.setDate(selectedDate.getDate() - dayOfWeek);\r\n weekStart.setHours(0, 0, 0, 0);\r\n\r\n const weekEnd = new Date(weekStart);\r\n weekEnd.setDate(weekStart.getDate() + 6);\r\n weekEnd.setHours(23, 59, 59, 999);\r\n\r\n const isInSelectedWeek = eventStartDate <= weekEnd && eventEndDate >= weekStart;\r\n const isUserMatch = selectedUserId === \"all\" || event.user.id === selectedUserId;\r\n return isInSelectedWeek && isUserMatch;\r\n }\r\n\r\n if (view === \"day\") {\r\n const dayStart = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate(), 0, 0, 0);\r\n const dayEnd = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate(), 23, 59, 59);\r\n const isInSelectedDay = eventStartDate <= dayEnd && eventEndDate >= dayStart;\r\n const isUserMatch = selectedUserId === \"all\" || event.user.id === selectedUserId;\r\n return isInSelectedDay && isUserMatch;\r\n }\r\n });\r\n }, [selectedDate, selectedUserId, events, view]);\r\n\r\n const singleDayEvents = filteredEvents.filter(event => {\r\n const startDate = parseISO(event.startDate);\r\n const endDate = parseISO(event.endDate);\r\n return isSameDay(startDate, endDate);\r\n });\r\n\r\n const multiDayEvents = filteredEvents.filter(event => {\r\n const startDate = parseISO(event.startDate);\r\n const endDate = parseISO(event.endDate);\r\n return !isSameDay(startDate, endDate);\r\n });\r\n\r\n // For year view, we only care about the start date\r\n // by using the same date for both start and end,\r\n // we ensure only the start day will show a dot\r\n const eventStartDates = useMemo(() => {\r\n return filteredEvents.map(event => ({ ...event, endDate: event.startDate }));\r\n }, [filteredEvents]);\r\n\r\n return (\r\n <div className={cn(\"overflow-hidden rounded-xl border\", className)}>\r\n {showHeader && (\r\n <CalendarHeader \r\n view={view} \r\n events={filteredEvents} \r\n onViewChange={onViewChange} \r\n className={cn(headerClassName, headerProps.className)}\r\n {...headerProps}\r\n />\r\n )}\r\n\r\n <DndProviderWrapper>\r\n <div className={contentClassName}>\r\n {view === \"day\" && <CalendarDayView singleDayEvents={singleDayEvents} multiDayEvents={multiDayEvents} />}\r\n {view === \"month\" && <CalendarMonthView singleDayEvents={singleDayEvents} multiDayEvents={multiDayEvents} />}\r\n {view === \"week\" && <CalendarWeekView singleDayEvents={singleDayEvents} multiDayEvents={multiDayEvents} />}\r\n {view === \"year\" && <CalendarYearView allEvents={eventStartDates} />}\r\n {view === \"agenda\" && <CalendarAgendaView singleDayEvents={singleDayEvents} multiDayEvents={multiDayEvents} />}\r\n </div>\r\n </DndProviderWrapper>\r\n </div>\r\n );\r\n}\r\n","import { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\r\n\r\nexport function ChangeBadgeVariantInput() {\r\n const { badgeVariant, setBadgeVariant } = useCalendar();\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <p className=\"text-sm font-semibold\">Change badge variant</p>\r\n\r\n <Select value={badgeVariant} onValueChange={setBadgeVariant}>\r\n <SelectTrigger className=\"w-48\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n\r\n <SelectContent>\r\n <SelectItem value=\"dot\">Dot</SelectItem>\r\n <SelectItem value=\"colored\">Colored</SelectItem>\r\n <SelectItem value=\"mixed\">Mixed</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </TooltipPrimitive.Portal>\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import { useState } from \"react\";\r\nimport { Info } from \"lucide-react\";\r\n\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { TimeInput } from \"@/components/ui/time-input\";\r\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from \"@/components/ui/tooltip\";\r\n\r\nexport function ChangeVisibleHoursInput() {\r\n const { visibleHours, setVisibleHours } = useCalendar();\r\n\r\n const [from, setFrom] = useState({ hour: visibleHours.from, minute: 0 });\r\n const [to, setTo] = useState({ hour: visibleHours.to, minute: 0 });\r\n\r\n const handleApply = () => {\r\n const toHour = to.hour === 0 ? 24 : to.hour;\r\n setVisibleHours({ from: from.hour, to: toHour });\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <p className=\"text-sm font-semibold\">Change visible hours</p>\r\n\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <Info className=\"size-3\" />\r\n </TooltipTrigger>\r\n\r\n <TooltipContent className=\"max-w-80 text-center\">\r\n <p>If an event falls outside the specified visible hours, the visible hours will automatically adjust to include that event.</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n <p>From</p>\r\n <TimeInput id=\"start-time\" hourCycle={12} granularity=\"hour\" value={from} onChange={setFrom} />\r\n <p>To</p>\r\n <TimeInput id=\"end-time\" hourCycle={12} granularity=\"hour\" value={to} onChange={setTo} />\r\n </div>\r\n\r\n <Button className=\"mt-4 w-fit\" onClick={handleApply}>\r\n Apply\r\n </Button>\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\"\r\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Switch = React.forwardRef(\r\n ({ className, ...props }, ref) => (\r\n <SwitchPrimitives.Root\r\n className={cn(\r\n \"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n >\r\n <SwitchPrimitives.Thumb\r\n className={cn(\r\n \"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\r\n )}\r\n />\r\n </SwitchPrimitives.Root>\r\n ))\r\nSwitch.displayName = SwitchPrimitives.Root.displayName\r\n\r\nexport { Switch }\r\n","import { useState } from \"react\";\r\nimport { Info, Moon } from \"lucide-react\";\r\nimport { useCalendar } from \"@/calendar/contexts/calendar-context\";\r\n\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Switch } from \"@/components/ui/switch\";\r\nimport { TimeInput } from \"@/components/ui/time-input\";\r\n\r\nimport { TooltipContent } from \"@/components/ui/tooltip\";\r\nimport { Tooltip, TooltipTrigger } from \"@/components/ui/tooltip\";\r\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\r\n\r\nconst DAYS_OF_WEEK = [\r\n { index: 0, name: \"Sunday\" },\r\n { index: 1, name: \"Monday\" },\r\n { index: 2, name: \"Tuesday\" },\r\n { index: 3, name: \"Wednesday\" },\r\n { index: 4, name: \"Thursday\" },\r\n { index: 5, name: \"Friday\" },\r\n { index: 6, name: \"Saturday\" },\r\n];\r\n\r\nexport function ChangeWorkingHoursInput() {\r\n const { workingHours, setWorkingHours } = useCalendar();\r\n\r\n const [localWorkingHours, setLocalWorkingHours] = useState({ ...workingHours });\r\n\r\n const handleToggleDay = (dayId) => {\r\n setLocalWorkingHours(prev => ({\r\n ...prev,\r\n [dayId]: prev[dayId].from > 0 || prev[dayId].to > 0 ? { from: 0, to: 0 } : { from: 9, to: 17 },\r\n }));\r\n };\r\n\r\n const handleTimeChange = (dayId, timeType, value) => {\r\n if (!value) return;\r\n\r\n setLocalWorkingHours(prev => {\r\n const updatedDay = { ...prev[dayId], [timeType]: value.hour };\r\n if (timeType === \"to\" && value.hour === 0 && updatedDay.from === 0) updatedDay.to = 24;\r\n return { ...prev, [dayId]: updatedDay };\r\n });\r\n };\r\n\r\n const handleSave = () => {\r\n const updatedWorkingHours = { ...localWorkingHours };\r\n\r\n for (const dayId in updatedWorkingHours) {\r\n const day = updatedWorkingHours[parseInt(dayId)];\r\n const isDayActive = localWorkingHours[parseInt(dayId)].from > 0 || localWorkingHours[parseInt(dayId)].to > 0;\r\n\r\n if (isDayActive) {\r\n if (day.from === 0 && day.to === 0) {\r\n updatedWorkingHours[dayId] = { from: 0, to: 24 };\r\n } else if (day.to === 0 && day.from > 0) {\r\n updatedWorkingHours[dayId] = { ...day, to: 24 };\r\n }\r\n } else {\r\n updatedWorkingHours[dayId] = { from: 0, to: 0 };\r\n }\r\n }\r\n\r\n setWorkingHours(updatedWorkingHours);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <p className=\"text-sm font-semibold\">Change working hours</p>\r\n\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <Info className=\"size-3\" />\r\n </TooltipTrigger>\r\n\r\n <TooltipContent className=\"max-w-80 text-center\">\r\n <p>This will apply a dashed background to the hour cells that fall outside the working hours — only for week and day views.</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n {DAYS_OF_WEEK.map(day => {\r\n const isDayActive = localWorkingHours[day.index].from > 0 || localWorkingHours[day.index].to > 0;\r\n\r\n return (\r\n <div key={day.index} className=\"flex items-center gap-4\">\r\n <div className=\"flex w-40 items-center gap-2\">\r\n <Switch checked={isDayActive} onCheckedChange={() => handleToggleDay(day.index)} />\r\n <span className=\"text-sm font-medium\">{day.name}</span>\r\n </div>\r\n\r\n {isDayActive ? (\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span>From</span>\r\n <TimeInput\r\n id={`${day.name.toLowerCase()}-from`}\r\n hourCycle={12}\r\n granularity=\"hour\"\r\n value={{ hour: localWorkingHours[day.index].from, minute: 0 }}\r\n onChange={value => handleTimeChange(day.index, \"from\", value)}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <span>To</span>\r\n <TimeInput\r\n id={`${day.name.toLowerCase()}-to`}\r\n hourCycle={12}\r\n granularity=\"hour\"\r\n value={{ hour: localWorkingHours[day.index].to, minute: 0 }}\r\n onChange={value => handleTimeChange(day.index, \"to\", value)}\r\n />\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center gap-2 text-muted-foreground\">\r\n <Moon className=\"size-4\" />\r\n <span>Closed</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <Button className=\"mt-4 w-fit\" onClick={handleSave}>\r\n Apply\r\n </Button>\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\"\r\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\r\nimport { ChevronDown } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Accordion = AccordionPrimitive.Root\r\n\r\nconst AccordionItem = React.forwardRef(({ className, ...props }, ref) => (\r\n <AccordionPrimitive.Item\r\n ref={ref}\r\n className={cn(\"border-b\", className)}\r\n {...props}\r\n />\r\n))\r\nAccordionItem.displayName = \"AccordionItem\"\r\n\r\nconst AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => (\r\n <AccordionPrimitive.Header className=\"flex\">\r\n <AccordionPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n \"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\r\n </AccordionPrimitive.Trigger>\r\n </AccordionPrimitive.Header>\r\n))\r\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\r\n\r\nconst AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => (\r\n <AccordionPrimitive.Content\r\n ref={ref}\r\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\r\n {...props}\r\n >\r\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\r\n </AccordionPrimitive.Content>\r\n))\r\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\r\n\r\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\r\n","import { cn } from \"@/lib/utils\"\r\n\r\nfunction Skeleton({\r\n className,\r\n ...props\r\n}) {\r\n return (\r\n <div\r\n className={cn(\"animate-pulse rounded-md bg-primary/10\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }\r\n","export const THEME_COOKIE_NAME = \"big-calendar-theme\";\r\nexport const THEME_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\r\n\r\nexport const DEFAULT_VALUES = { theme: \"dark\" };\r\n","import { THEME_COOKIE_NAME, THEME_COOKIE_MAX_AGE } from \"@/constants/cookies.const\";\r\n\r\nexport function setTheme(theme) {\r\n document.cookie = `${THEME_COOKIE_NAME}=${theme}; path=/; max-age=${THEME_COOKIE_MAX_AGE}`;\r\n document.documentElement.classList.remove(\"light\", \"dark\");\r\n document.documentElement.classList.add(theme);\r\n}\r\n","import { Moon, Sun } from \"lucide-react\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Skeleton } from \"@/components/ui/skeleton\";\r\n\r\nimport { setTheme } from \"@/cookies/set\";\r\n\r\nexport function ToggleTheme() {\r\n const [currentTheme, setCurrentTheme] = useState();\r\n\r\n useEffect(() => {\r\n const currentTheme = document.documentElement.classList.contains(\"dark\") ? \"dark\" : \"light\";\r\n setCurrentTheme(currentTheme);\r\n }, []);\r\n\r\n const toggleTheme = () => {\r\n const newTheme = currentTheme === \"light\" ? \"dark\" : \"light\";\r\n setTheme(newTheme);\r\n setCurrentTheme(newTheme);\r\n };\r\n\r\n if (!currentTheme) return <Skeleton className=\"size-9\" />;\r\n\r\n return (\r\n <Button variant=\"ghost\" size=\"icon\" onClick={toggleTheme}>\r\n {currentTheme === \"light\" && <Sun />}\r\n {currentTheme === \"dark\" && <Moon />}\r\n </Button>\r\n );\r\n}\r\n","import { ArrowUpRight, Calendar } from \"lucide-react\";\r\n\r\nimport { ToggleTheme } from \"@/components/layout/change-theme\";\r\nimport { Button } from \"@/components/ui/button\";\r\n\r\nexport function Header() {\r\n return (\r\n <header className=\"mx-auto flex h-[88px] w-full max-w-screen-2xl items-center justify-center\">\r\n <div className=\"my-3 flex h-14 w-full items-center justify-between px-8\">\r\n <div className=\"flex items-center gap-3.5\">\r\n <div className=\"flex size-12 items-center justify-center rounded-full border p-3\">\r\n <Calendar className=\"size-6 text-foreground\" />\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <p className=\"text-lg font-medium leading-6\">Big calendar</p>\r\n <p className=\"text-sm text-foreground\">\r\n Built with React and Tailwind by{\" \"}\r\n <a\r\n href=\"https://github.com/lramos33\"\r\n target=\"_blank\"\r\n className=\"inline-flex gap-0.5 text-sm underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n >\r\n lramos33\r\n <ArrowUpRight size={12} className=\"text-foreground\" />\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"hidden items-center gap-4 md:flex\">\r\n <a\r\n href=\"https://github.com/lramos33/big-calendar\"\r\n target=\"_blank\"\r\n className=\"inline-flex gap-0.5 text-sm hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\r\n >\r\n View on GitHub\r\n <ArrowUpRight size={14} className=\"text-foreground\" />\r\n </a>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button size=\"icon\" asChild variant=\"ghost\">\r\n <a href=\"https://x.com/leoo_ramos1\" target=\"_blank\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M4 4l11.733 16h4.267l-11.733 -16z\" />\r\n <path d=\"M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772\" />\r\n </svg>\r\n </a>\r\n </Button>\r\n\r\n <ToggleTheme />\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n}\r\n","export const THEMES_VALUES = [\"light\", \"dark\"];\r\n","import { THEMES_VALUES } from \"@/constants/theme.const\";\r\nimport { DEFAULT_VALUES } from \"@/constants/cookies.const\";\r\nimport { THEME_COOKIE_NAME } from \"@/constants/cookies.const\";\r\n\r\nexport function getTheme() {\r\n if (typeof document === \"undefined\") {\r\n return DEFAULT_VALUES.theme;\r\n }\r\n \r\n const cookies = document.cookie.split(\";\");\r\n const themeCookie = cookies.find(cookie => cookie.trim().startsWith(`${THEME_COOKIE_NAME}=`));\r\n \r\n if (!themeCookie) {\r\n return DEFAULT_VALUES.theme;\r\n }\r\n \r\n const theme = themeCookie.split(\"=\")[1]?.trim();\r\n if (!THEMES_VALUES.includes(theme)) {\r\n return DEFAULT_VALUES.theme;\r\n }\r\n \r\n return theme;\r\n}\r\n","// Font loading should be handled by the consuming application\r\n// The CSS variable --font-inter can be set via CSS or the consuming app's font loading mechanism\r\nexport const inter = {\r\n variable: \"--font-inter\",\r\n};\r\n"],"names":["USERS_MOCK","COLORS","EVENTS","mockGenerator","numberOfEvents","result","currentId","randomUser","now","startRange","endRange","currentEvent","i","attempts","maxAttempts","isMultiDay","startDate","endDate","additionalDays","endMonth","endDay","startMonth","startDay","durationMinutes","CALENDAR_ITEMS_MOCK","CalendarContext","createContext","DEFAULT_WORKING_HOURS","DEFAULT_VISIBLE_HOURS","CalendarProvider","children","initialUsers","initialEvents","api","useMocks","singleUser","currentUser","defaultSettings","onSettingsChange","onEventCreate","onEventUpdate","onEventDelete","badgeVariant","setBadgeVariant","useState","visibleHours","setVisibleHours","workingHours","setWorkingHours","selectedDate","setSelectedDate","selectedUserId","setSelectedUserId","users","setUsers","events","setEvents","isLoading","setIsLoading","effectiveCurrentUser","shouldUseMocks","shouldUseMockUsers","useEffect","fetchedUsers","error","fetchedEvents","handleSelectDate","date","handleBadgeVariantChange","variant","handleVisibleHoursChange","hours","handleWorkingHoursChange","createEvent","useCallback","eventData","newEvent","prev","updateEvent","updatedEvent","index","e","deleteEvent","eventId","refetchEvents","jsx","useCalendar","context","useContext","cn","inputs","twMerge","clsx","CustomDragLayer","isDragging","item","currentOffset","initialOffset","initialClientOffset","useDragLayer","monitor","offsetX","offsetY","layerStyles","DndProviderWrapper","jsxs","DndProvider","HTML5Backend","buttonVariants","cva","Button","React","className","size","asChild","props","ref","Comp","Slot","AvatarGroup","forwardRef","max","spacing","avatarItems","Children","renderContent","useMemo","Fragment","child","cloneElement","Avatar","AvatarPrimitive","AvatarImage","AvatarFallback","Select","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","ChevronDown","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","Check","SelectSeparator","UserSelect","user","TodayButton","today","handleClick","formatDate","badgeVariants","Badge","rangeText","view","formatString","start","end","startOfMonth","endOfMonth","startOfYear","endOfYear","startOfWeek","endOfWeek","format","navigateDate","direction","addMonths","subMonths","addYears","subYears","addWeeks","subWeeks","addDays","subDays","getEventsCount","compareFns","isSameMonth","isSameYear","isSameDay","isSameWeek","event","getCurrentEvents","isWithinInterval","parseISO","groupEvents","dayEvents","sortedEvents","a","b","groups","eventStart","placed","group","lastEventInGroup","lastEventEnd","getEventBlockStyle","day","groupIndex","groupSize","visibleHoursRange","dayStart","startMinutes","differenceInMinutes","top","visibleStartMinutes","visibleRangeMinutes","width","left","isWorkingHour","hour","dayIndex","dayHours","getVisibleHours","singleDayEvents","earliestEventHour","latestEventHour","startHour","endTime","endHour","_","getCalendarCells","currentYear","currentMonth","getDaysInMonth","year","month","getFirstDayOfMonth","daysInMonth","firstDayOfMonth","daysInPrevMonth","totalDays","prevMonthCells","currentMonthCells","nextMonthCells","calculateMonthEventPositions","multiDayEvents","monthStart","monthEnd","eventPositions","occupiedPositions","eachDayOfInterval","aDuration","differenceInDays","eventEnd","eventDays","dayPositions","startOfDay","dayKey","getMonthCellEvents","DateNavigator","eventCount","handlePrevious","handleNext","ChevronLeft","ChevronRight","$constructor","name","initializer","params","init","inst","def","_a","k","Parent","Definition","fn","_b","$ZodAsyncError","globalConfig","config","newConfig","jsonStringifyReplacer","value","captureStackTrace","_args","unwrapMessage","message","finalizeIssue","iss","ctx","full","_c","_d","_e","_f","util.jsonStringifyReplacer","$ZodError","$ZodRealError","_parse","_Err","schema","_ctx","_params","core.$ZodAsyncError","util.finalizeIssue","core.config","util.captureStackTrace","parse","errors.$ZodRealError","_parseAsync","parseAsync","t","r","o","s","n","u","c","f","n.parse","n.parseAsync","n.$ZodError","useDisclosure","defaultIsOpen","isOpen","setIsOpen","currentValue","Input","type","Textarea","TimeInput","dateInputClassName","segmentClassName","disabled","dataInvalid","TimeField","DateInput","segment","DateSegment","SingleCalendar","classNames","showOutsideDays","selected","setCurrentMonth","DayPicker","Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverContent","align","sideOffset","SingleDayPicker","id","onSelect","placeholder","labelVariant","onClose","onToggle","handleSelect","labelVariants","Label","LabelPrimitive","Form","FormProvider","FormFieldContext","FormField","Controller","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","formState","useFormContext","fieldState","FormItem","FormLabel","formItemId","FormControl","formDescriptionId","formMessageId","FormDescription","FormMessage","body","Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","createEventSchema","z","data","startDateTime","endDateTime","eventSchema","AddEventDialog","startTime","onEventCreated","showFormDisclaimer","form","useForm","zodResolver","onSubmit","values","field","CalendarHeader","onViewChange","showTodayButton","showDateNavigator","showViewSwitcher","showUserSelect","showAddEventButton","availableViews","leftSectionClassName","rightSectionClassName","viewSwitcherClassName","addButtonClassName","handleViewChange","newView","shouldShowUserSelect","List","Columns","Grid2x2","Grid3x3","CalendarRange","Plus","YearViewDayCell","maxIndicators","isToday","YearViewMonth","monthName","firstDay","days","weekDays","CalendarYearView","allEvents","months","yearStart","eventBulletVariants","EventBullet","color","useUpdateEvent","ItemTypes","DraggableEvent","useRef","drag","preview","useDrag","height","getEmptyImage","DroppableDayCell","cell","isOver","canDrop","drop","useDrop","droppedEvent","eventStartDate","eventEndDate","eventDurationMs","differenceInMilliseconds","newStartDate","newEndDate","EditEventDialog","onEventUpdated","EventDetailsDialog","User","Calendar","Clock","Text","eventBadgeVariants","MonthEventBadge","cellDate","eventCurrentDay","eventTotalDays","propPosition","itemStart","itemEnd","endOfDay","renderBadgeText","eventBadgeClasses","handleKeyDown","MAX_VISIBLE_EVENTS","DayCell","cellEvents","isSunday","eventKey","WEEK_DAYS","CalendarMonthView","cells","ScrollArea","ScrollAreaPrimitive","ScrollBar","orientation","agendaEventCardVariants","AgendaEventCard","agendaEventCardClasses","AgendaDayGroup","currentDate","CalendarAgendaView","eventsByDay","allDates","eventDate","dateKey","lastDate","hasAnyEvents","dayGroup","CalendarX2","calendarWeekEventCardVariants","EventBlock","durationInMinutes","heightInPixels","calendarWeekEventCardClasses","DroppableTimeBlock","minute","CalendarTimeline","firstVisibleHour","lastVisibleHour","currentTime","setCurrentTime","timer","getCurrentTimePosition","minutes","formatCurrentTime","currentHour","DayViewMultiDayEventsRow","dayEnd","multiDayEventsInDay","durationA","CalendarDayView","currentEvents","groupedEvents","isDisabled","style","otherGroup","otherIndex","otherEvent","areIntervalsOverlapping","WeekViewMultiDayEventsRow","weekStart","weekEnd","processedEvents","adjustedStart","isBefore","adjustedEnd","isAfter","startIndex","endIndex","startDiff","eventRows","rows","rowIndex","row","CalendarWeekView","ClientContainer","showHeader","headerProps","headerClassName","contentClassName","filteredEvents","yearEnd","isInSelectedYear","isUserMatch","isInSelectedMonth","dayOfWeek","isInSelectedWeek","isInSelectedDay","eventStartDates","ChangeBadgeVariantInput","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","ChangeVisibleHoursInput","from","setFrom","to","setTo","handleApply","toHour","Info","Switch","SwitchPrimitives","DAYS_OF_WEEK","ChangeWorkingHoursInput","localWorkingHours","setLocalWorkingHours","handleToggleDay","dayId","handleTimeChange","timeType","updatedDay","handleSave","updatedWorkingHours","isDayActive","Moon","Accordion","AccordionPrimitive","AccordionItem","AccordionTrigger","AccordionContent","Skeleton","THEME_COOKIE_NAME","THEME_COOKIE_MAX_AGE","DEFAULT_VALUES","setTheme","theme","ToggleTheme","currentTheme","setCurrentTheme","toggleTheme","newTheme","Sun","Header","ArrowUpRight","THEMES_VALUES","getTheme","themeCookie","cookie","inter"],"mappings":"isCAEaA,EAAa,CACxB,CACE,GAAI,uCACJ,KAAM,iBACN,YAAa,IACjB,EACE,CACE,GAAI,uCACJ,KAAM,cACN,YAAa,IACjB,EACE,CACE,GAAI,uCACJ,KAAM,gBACN,YAAa,IACjB,EACE,CACE,GAAI,uCACJ,KAAM,eACN,YAAa,IACjB,CACA,EAEMC,GAAS,CAAC,OAAQ,QAAS,MAAO,SAAU,SAAU,SAAU,MAAM,EAEtEC,GAAS,CACb,uBACA,kBACA,WACA,kBACA,mBACA,gBACA,mBACA,2BACA,sBACA,4BACA,mBACA,aACA,iBACA,gBACA,oBACA,qBACA,qBACA,yBACA,eACA,kBACA,kCACA,sBACA,cACA,qBACA,sBACA,qBACA,yBACA,cACA,kBACA,iBACA,2BACA,iBACA,0BACA,yBACA,qBACA,gBACA,6BACA,sBACA,4BACA,0BACA,mBACA,0BACA,iBACA,cACA,aACA,2BACA,yBACA,2BACA,yBACA,oBACA,+BACA,aACA,sBACA,gBACA,yBACA,oBACA,gBACA,mBACA,iBACA,oBACA,iBACA,sBACA,iBACA,qBACA,2BACA,qBACA,oBACA,qBACA,eACA,cACA,iBACA,iBACA,kBACA,kBACA,oBACA,gBACA,eACA,kBACA,oBACA,sBACA,eACA,gBACA,oBACA,mBACA,kBACA,yBACF,EAGMC,GAAiBC,GAAmB,CACxC,MAAMC,EAAS,CACb,CACE,GAAI,KACJ,UAAW,IAAI,KAAK,2BAA2B,EAAE,YAAW,EAC5D,QAAS,IAAI,KAAK,2BAA2B,EAAE,YAAW,EAC1D,MAAO,gBACP,MAAO,MACP,YAAa,4DACb,KAAML,EAAW,CAAC,CACxB,CACA,EAEE,IAAIM,EAAY,EAEhB,MAAMC,EAAaP,EAAW,KAAK,MAAM,KAAK,SAAWA,EAAW,MAAM,CAAC,EAGrEQ,EAAM,IAAI,KACVC,EAAa,IAAI,KAAKD,CAAG,EAC/BC,EAAW,QAAQD,EAAI,QAAO,EAAK,EAAE,EACrC,MAAME,EAAW,IAAI,KAAKF,CAAG,EAC7BE,EAAS,QAAQF,EAAI,QAAO,EAAK,EAAE,EAGnC,MAAMG,EAAe,CACnB,GAAIL,IACJ,UAAW,IAAI,KAAKE,EAAI,QAAO,EAAK,GAAK,GAAK,EAAE,YAAW,EAC3D,QAAS,IAAI,KAAKA,EAAI,QAAO,EAAK,GAAK,GAAK,EAAE,YAAW,EACzD,MAAON,GAAO,KAAK,MAAM,KAAK,OAAM,EAAKA,GAAO,MAAM,CAAC,EACvD,MAAOD,GAAO,KAAK,MAAM,KAAK,OAAM,EAAKA,GAAO,MAAM,CAAC,EACvD,YAAa,8HACb,KAAMM,CACV,GAGMC,EAAI,aAAe,GAAKA,EAAI,QAAO,IAAO,KAE5CH,EAAO,KAAKM,CAAY,EAI1B,IAAIC,EAAI,EACJC,EAAW,EACf,MAAMC,EAAcV,EAAiB,EAErC,KAAOQ,EAAIR,EAAiB,GAAKS,EAAWC,GAAa,CACvDD,IAGA,MAAME,EAAa,KAAK,OAAM,EAAK,GAE7BC,EAAY,IAAI,KAAKP,EAAW,QAAO,EAAK,KAAK,OAAM,GAAMC,EAAS,QAAO,EAAKD,EAAW,QAAO,EAAG,EAG7G,GAAIO,EAAU,aAAe,GAAKA,EAAU,QAAO,IAAO,GACxD,SAIFA,EAAU,SAAS,EAAI,KAAK,MAAM,KAAK,OAAM,EAAK,CAAC,EAAG,KAAK,MAAM,KAAK,SAAW,CAAC,EAAI,GAAI,EAAG,CAAC,EAE9F,MAAMC,EAAU,IAAI,KAAKD,CAAS,EAElC,GAAID,EAAY,CAEd,MAAMG,EAAiB,KAAK,MAAM,KAAK,SAAW,CAAC,EAAI,EACvDD,EAAQ,QAAQD,EAAU,QAAO,EAAKE,CAAc,EAGpD,MAAMC,EAAWF,EAAQ,WACnBG,EAASH,EAAQ,UACjBI,EAAaL,EAAU,WACvBM,EAAWN,EAAU,UAG3B,GACGK,IAAe,GAAKC,EAAW,KAAOH,EAAW,GAAMA,IAAa,GAAKC,GAAU,KACnFD,IAAa,GAAKC,GAAU,KAAOC,EAAa,GAAMA,IAAe,GAAKC,EAAW,IAEtF,SAGFL,EAAQ,SAAS,EAAI,KAAK,MAAM,KAAK,OAAM,EAAK,EAAE,EAAG,KAAK,MAAM,KAAK,SAAW,CAAC,EAAI,GAAI,EAAG,CAAC,CAC/F,KAAO,CACL,MAAMM,GAAmB,KAAK,MAAM,KAAK,OAAM,EAAK,EAAE,EAAI,GAAK,GAC/DN,EAAQ,QAAQA,EAAQ,QAAO,EAAKM,EAAkB,GAAK,GAAI,CACjE,CAEAlB,EAAO,KAAK,CACV,GAAIC,IACJ,UAAWU,EAAU,YAAW,EAChC,QAASC,EAAQ,YAAW,EAC5B,MAAOf,GAAO,KAAK,MAAM,KAAK,OAAM,EAAKA,GAAO,MAAM,CAAC,EACvD,MAAOD,GAAO,KAAK,MAAM,KAAK,OAAM,EAAKA,GAAO,MAAM,CAAC,EACvD,YAAa,8HACb,KAAMD,EAAW,KAAK,MAAM,KAAK,OAAM,EAAKA,EAAW,MAAM,CAAC,CACpE,CAAK,EAEDY,GACF,CAEA,OAAOP,CACT,EAEamB,GAAsBrB,GAAc,EAAE,EC3N7CsB,GAAkBC,EAAAA,cAAc,EAAE,EAElCC,GAAwB,CAC5B,EAAG,CAAE,KAAM,EAAG,GAAI,CAAA,EAClB,EAAG,CAAE,KAAM,EAAG,GAAI,EAAA,EAClB,EAAG,CAAE,KAAM,EAAG,GAAI,EAAA,EAClB,EAAG,CAAE,KAAM,EAAG,GAAI,EAAA,EAClB,EAAG,CAAE,KAAM,EAAG,GAAI,EAAA,EAClB,EAAG,CAAE,KAAM,EAAG,GAAI,EAAA,EAClB,EAAG,CAAE,KAAM,EAAG,GAAI,EAAA,CACpB,EAEMC,GAAwB,CAAE,KAAM,EAAG,GAAI,EAAA,EA8BtC,SAASC,GAAiB,CAC/B,SAAAC,EACA,MAAOC,EACP,OAAQC,EACR,IAAAC,EAAM,CAAA,EACN,SAAAC,EAAW,GACX,WAAAC,EAAa,GACb,YAAAC,EACA,gBAAAC,EAAkB,CAAA,EAClB,iBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,cAAAC,CACF,EAAG,CACD,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAAA,SAASP,EAAgB,cAAgB,SAAS,EACpF,CAACQ,EAAcC,CAAe,EAAIF,EAAAA,SAASP,EAAgB,cAAgBT,EAAqB,EAChG,CAACmB,EAAcC,CAAe,EAAIJ,EAAAA,SAASP,EAAgB,cAAgBV,EAAqB,EAEhG,CAACsB,EAAcC,CAAe,EAAIN,EAAAA,SAAS,IAAI,IAAM,EACrD,CAACO,EAAgBC,EAAiB,EAAIR,EAAAA,SAAS,KAAK,EAGpD,CAACS,GAAOC,EAAQ,EAAIV,EAAAA,SAASb,GAAgB,CAAA,CAAE,EAC/C,CAACwB,GAAQC,CAAS,EAAIZ,EAAAA,SAASZ,GAAiB,CAAA,CAAE,EAClD,CAACyB,GAAWC,EAAY,EAAId,EAAAA,SAAS,EAAK,EAG1Ce,GAAuBxB,EACxBC,IAAgBiB,GAAM,OAAS,EAAIA,GAAM,CAAC,EAAI,QAAUtB,GAAgBA,EAAa,OAAS,EAAIA,EAAa,CAAC,EAAI,MACrH,KAGE6B,GAAiB1B,GAAa,CAACD,EAAI,WAAa,CAACD,EACjD6B,GAAqB3B,GAAa,CAACD,EAAI,UAAY,CAACF,EAG1D+B,EAAAA,UAAU,IAAM,CACVD,IAAsBR,GAAM,SAAW,EACzCC,GAAStD,CAAU,EACViC,EAAI,UAAY,CAAC4B,KAC1BH,GAAa,EAAI,EACjBzB,EAAI,SAAA,EACD,KAAM8B,GAAiB,CACtBT,GAASS,CAAY,CACvB,CAAC,EACA,MAAOC,GAAU,CAChB,QAAQ,MAAM,yBAA0BA,CAAK,EACzC9B,GACFoB,GAAStD,CAAU,CAEvB,CAAC,EACA,QAAQ,IAAM,CACb0D,GAAa,EAAK,CACpB,CAAC,EAEP,EAAG,CAACzB,EAAI,SAAU4B,GAAoB3B,CAAQ,CAAC,EAG/C4B,EAAAA,UAAU,IAAM,CACVF,IAAkBL,GAAO,SAAW,EACtCC,EAAUhC,EAAmB,EACpBS,EAAI,WAAa,CAAC2B,KAC3BF,GAAa,EAAI,EACjBzB,EAAI,UAAA,EACD,KAAMgC,GAAkB,CACvBT,EAAUS,CAAa,CACzB,CAAC,EACA,MAAOD,GAAU,CAChB,QAAQ,MAAM,0BAA2BA,CAAK,EAC1C9B,GACFsB,EAAUhC,EAAmB,CAEjC,CAAC,EACA,QAAQ,IAAM,CACbkC,GAAa,EAAK,CACpB,CAAC,EAEP,EAAG,CAACzB,EAAI,UAAW2B,GAAgB1B,CAAQ,CAAC,EAE5C,MAAMgC,GAAoBC,GAAS,CAC5BA,GACLjB,EAAgBiB,CAAI,CACtB,EAEMC,GAA4BC,GAAY,CAC5C1B,EAAgB0B,CAAO,EACvB/B,GAAA,MAAAA,EAAmB,CAAE,aAAc+B,EAAS,aAAAxB,EAAc,aAAAE,GAC5D,EAEMuB,GAA4BC,GAAU,CAC1CzB,EAAgByB,CAAK,EACrBjC,GAAA,MAAAA,EAAmB,CAAE,aAAAI,EAAc,aAAc6B,EAAO,aAAAxB,GAC1D,EAEMyB,GAA4BD,GAAU,CAC1CvB,EAAgBuB,CAAK,EACrBjC,GAAA,MAAAA,EAAmB,CAAE,aAAAI,EAAc,aAAAG,EAAc,aAAc0B,GACjE,EAGME,GAAcC,cAAY,MAAOC,GAAc,CACnD,GAAI1C,EAAI,YACN,GAAI,CACF,MAAM2C,EAAW,MAAM3C,EAAI,YAAY0C,CAAS,EAChD,OAAAnB,EAAWqB,GAAS,CAAC,GAAGA,EAAMD,CAAQ,CAAC,EACvCrC,GAAA,MAAAA,EAAgBqC,GACTA,CACT,OAASZ,EAAO,CACd,cAAQ,MAAM,0BAA2BA,CAAK,EACxCA,CACR,KACK,CAEL,MAAMY,EAAW,CAAE,GAAGD,EAAW,GAAI,KAAK,KAAI,EAC9C,OAAAnB,EAAWqB,GAAS,CAAC,GAAGA,EAAMD,CAAQ,CAAC,EACvCrC,GAAA,MAAAA,EAAgBqC,GACTA,CACT,CACF,EAAG,CAAC3C,EAAI,YAAaM,CAAa,CAAC,EAE7BuC,GAAcJ,cAAY,MAAOC,GAAc,CACnD,GAAI1C,EAAI,YACN,GAAI,CACF,MAAM8C,EAAe,MAAM9C,EAAI,YAAY0C,CAAS,EACpD,OAAAnB,EAAWqB,GAAS,CAClB,MAAMG,EAAQH,EAAK,UAAWI,IAAMA,GAAE,KAAON,EAAU,EAAE,EACzD,OAAIK,IAAU,GAAWH,EAClB,CAAC,GAAGA,EAAK,MAAM,EAAGG,CAAK,EAAGD,EAAc,GAAGF,EAAK,MAAMG,EAAQ,CAAC,CAAC,CACzE,CAAC,EACDxC,GAAA,MAAAA,EAAgBuC,GACTA,CACT,OAASf,EAAO,CACd,cAAQ,MAAM,0BAA2BA,CAAK,EACxCA,CACR,KACK,CAEL,MAAMe,EAAe,CAAE,GAAGJ,CAAA,EAC1B,OAAAnB,EAAWqB,GAAS,CAClB,MAAMG,EAAQH,EAAK,UAAWI,IAAMA,GAAE,KAAON,EAAU,EAAE,EACzD,OAAIK,IAAU,GAAWH,EAClB,CAAC,GAAGA,EAAK,MAAM,EAAGG,CAAK,EAAGD,EAAc,GAAGF,EAAK,MAAMG,EAAQ,CAAC,CAAC,CACzE,CAAC,EACDxC,GAAA,MAAAA,EAAgBuC,GACTA,CACT,CACF,EAAG,CAAC9C,EAAI,YAAaO,CAAa,CAAC,EAE7B0C,GAAcR,cAAY,MAAOS,GAAY,CACjD,GAAIlD,EAAI,YACN,GAAI,CACF,MAAMA,EAAI,YAAYkD,CAAO,EAC7B3B,EAAWqB,GAASA,EAAK,OAAQI,GAAMA,EAAE,KAAOE,CAAO,CAAC,EACxD1C,GAAA,MAAAA,EAAgB0C,EAClB,OAASnB,EAAO,CACd,cAAQ,MAAM,0BAA2BA,CAAK,EACxCA,CACR,MAGAR,EAAWqB,GAASA,EAAK,OAAQI,GAAMA,EAAE,KAAOE,CAAO,CAAC,EACxD1C,GAAA,MAAAA,EAAgB0C,EAEpB,EAAG,CAAClD,EAAI,YAAaQ,CAAa,CAAC,EAE7B2C,GAAgBV,EAAAA,YAAY,SAAY,CAC5C,GAAIzC,EAAI,UAAW,CACjByB,GAAa,EAAI,EACjB,GAAI,CACF,MAAMO,EAAgB,MAAMhC,EAAI,UAAA,EAChCuB,EAAUS,CAAa,CACzB,OAASD,EAAO,CACd,QAAQ,MAAM,4BAA6BA,CAAK,CAClD,QAAA,CACEN,GAAa,EAAK,CACpB,CACF,CACF,EAAG,CAACzB,EAAI,SAAS,CAAC,EAElB,OACEoD,EAAAA,IAAC5D,GAAgB,SAAhB,CACC,MAAO,CACL,aAAAwB,EACA,gBAAiBiB,GACjB,eAAAf,EACA,kBAAAC,GACA,aAAAV,EACA,gBAAiB0B,GACjB,MAAAf,GACA,aAAAR,EACA,gBAAiByB,GACjB,aAAAvB,EACA,gBAAiByB,GACjB,OAAAjB,GACA,UAAAC,EACA,UAAAC,GAEA,YAAAgB,GACA,YAAAK,GACA,YAAAI,GACA,cAAAE,GAEA,IAAAnD,EACA,SAAU2B,GAEV,WAAAzB,EACA,YAAawB,EAAA,EAGd,SAAA7B,CAAA,CAAA,CAGP,CAEO,SAASwD,GAAc,CAC5B,MAAMC,EAAUC,EAAAA,WAAW/D,EAAe,EAC1C,GAAI,CAAC8D,EAAS,MAAM,IAAI,MAAM,qDAAqD,EACnF,OAAOA,CACT,CCpQO,SAASE,KAAMC,EAAQ,CAC5B,OAAOC,GAAAA,QAAQC,QAAKF,CAAM,CAAC,CAC7B,CCHO,SAASG,IAAkB,CAChC,KAAM,CAAE,WAAAC,EAAY,KAAAC,EAAM,cAAAC,EAAe,cAAAC,EAAe,oBAAAC,CAAA,EAAwBC,gBAAaC,IAAY,CACvG,KAAMA,EAAQ,QAAA,EACd,SAAUA,EAAQ,YAAA,EAClB,WAAYA,EAAQ,WAAA,EACpB,cAAeA,EAAQ,gBAAA,EACvB,cAAeA,EAAQ,6BAAA,EACvB,oBAAqBA,EAAQ,uBAAA,CAAuB,EACpD,EAEF,GAAI,CAACN,GAAc,CAACC,GAAQ,CAACC,GAAiB,CAACC,GAAiB,CAACC,EAC/D,OAAO,KAGT,MAAMG,EAAUH,EAAoB,EAAID,EAAc,EAChDK,EAAUJ,EAAoB,EAAID,EAAc,EAEhDM,EAAc,CAClB,SAAU,QACV,cAAe,OACf,OAAQ,IACR,KAAMP,EAAc,EAAIK,EACxB,IAAKL,EAAc,EAAIM,CAAA,EAGzB,OACEjB,EAAAA,IAAC,MAAA,CAAI,MAAOkB,EACV,SAAAlB,EAAAA,IAAC,MAAA,CACC,UAAU,GACV,MAAO,CACL,MAAOU,EAAK,MACZ,OAAQA,EAAK,MAAA,EAGd,SAAAA,EAAK,QAAA,CAAA,EAEV,CAEJ,CCnCO,SAASS,GAAmB,CAAE,SAAA1E,GAAY,CAC/C,OACE2E,EAAAA,KAACC,GAAAA,YAAA,CAAY,QAASC,GAAAA,aACnB,SAAA,CAAA7E,QACA+D,GAAA,CAAA,CAAgB,CAAA,EACnB,CAEJ,CCNA,MAAMe,GAAiBC,GAAAA,IACrB,wSACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,gEACT,YAAa,+EACb,QAAS,2FACT,UAAW,yEACX,MAAO,+CACP,KAAM,iDAAA,EAER,KAAM,CACJ,QAAS,gBACT,GAAI,8BACJ,GAAI,uBACJ,KAAM,QAAA,CACR,EAEF,gBAAiB,CACf,QAAS,UACT,KAAM,SAAA,CACR,CAEJ,EAEMC,EAASC,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,QAAA3C,EAAS,KAAA4C,EAAM,QAAAC,EAAU,GAAO,GAAGC,CAAA,EAASC,IAAQ,CAChG,MAAMC,EAAOH,EAAUI,GAAAA,KAAO,SAC9B,OAAOjC,EAAAA,IAACgC,EAAA,CAAK,UAAW5B,EAAGmB,GAAe,CAAE,QAAAvC,EAAS,KAAA4C,EAAM,UAAAD,CAAA,CAAW,CAAC,EAAG,IAAAI,EAAW,GAAGD,CAAA,CAAO,CACjG,CAAC,EACDL,EAAO,YAAc,SC9BrB,MAAMS,GAAcC,EAAAA,WAAW,CAAC,CAAE,UAAAR,EAAW,SAAAlF,EAAU,IAAA2F,EAAM,EAAG,QAAAC,EAAU,GAAI,GAAGP,CAAA,EAASC,IAAQ,CAChG,MAAMO,EAAcC,EAAAA,SAAS,QAAQ9F,CAAQ,EAEvC+F,EAAgBC,EAAAA,QAAQ,IAE1BrB,EAAAA,KAAAsB,WAAA,CACG,SAAA,CAAAJ,EAAY,MAAM,EAAGF,CAAG,EAAE,IAAI,CAACO,EAAOhD,IAC9BiD,EAAAA,aAAaD,EAAO,CACzB,UAAWvC,EAAGuC,EAAM,MAAM,UAAW,4BAA4B,EACjE,MAAO,CAAE,WAAYhD,IAAU,EAAI,EAAI,CAAC0C,EAAS,GAAGM,EAAM,MAAM,KAAA,CAAM,CACvE,CACF,EAEAL,EAAY,OAASF,GACpBpC,EAAAA,IAAC,MAAA,CACC,UAAWI,EAAG,6FAA8FkC,EAAY,CAAC,EAAE,MAAM,SAAS,EAC1I,MAAO,CAAE,WAAY,CAACD,CAAA,EAEtB,gBAAC,IAAA,CAAE,SAAA,CAAA,IAAEC,EAAY,OAASF,CAAA,CAAA,CAAI,CAAA,CAAA,CAChC,EAEJ,EAED,CAACE,EAAaF,EAAKC,CAAO,CAAC,EAE9B,OACErC,EAAAA,IAAC,MAAA,CAAI,IAAA+B,EAAU,UAAW3B,EAAG,gBAAiBuB,CAAS,EAAI,GAAGG,EAC3D,SAAAU,CAAA,CACH,CAEJ,CAAC,EAEDN,GAAY,YAAc,cCjC1B,MAAMW,GAASnB,EAAM,WACnB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IACxB/B,EAAAA,IAAC8C,GAAgB,KAAhB,CAAqB,IAAAf,EAAU,UAAW3B,EAAG,gEAAiEuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CAE1I,EACAe,GAAO,YAAcC,GAAgB,KAAK,YAE1C,MAAMC,GAAcrB,EAAM,WACxB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ/B,EAAAA,IAAC8C,GAAgB,MAAhB,CAAsB,IAAAf,EAAU,UAAW3B,EAAG,8BAA+BuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CACzI,EACAiB,GAAY,YAAcD,GAAgB,MAAM,YAEhD,MAAME,GAAiBtB,EAAM,WAC3B,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IACxB/B,EAAAA,IAAC8C,GAAgB,SAAhB,CAAyB,IAAAf,EAAU,UAAW3B,EAAG,uEAAwEuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CAErJ,EACAkB,GAAe,YAAcF,GAAgB,SAAS,YChBtD,MAAMG,EAASC,EAAgB,KAEzBC,GAAcD,EAAgB,MAE9BE,EAAcF,EAAgB,MAE9BG,EAAgB3B,EAAM,WAC1B,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,CAAA,EAASC,IAClCX,EAAAA,KAAC8B,EAAgB,QAAhB,CACC,IAAAnB,EACA,UAAW3B,EACT,iUACAuB,CAAA,EAED,GAAGG,EAEH,SAAA,CAAArF,EACDuD,EAAAA,IAACkD,EAAgB,KAAhB,CAAqB,QAAO,GAC3B,SAAAlD,EAAAA,IAACsD,EAAAA,YAAA,CAAY,UAAU,mBAAA,CAAoB,CAAA,CAC7C,CAAA,CAAA,CAAA,CAGN,EACAD,EAAc,YAAcH,EAAgB,QAAQ,YAEpD,MAAMK,GAAuB7B,EAAM,WACjC,CAAC,CAAE,UAAAC,EAAW,GAAGG,GAASC,IACxB/B,EAAAA,IAACkD,EAAgB,eAAhB,CAA+B,IAAAnB,EAAU,UAAW3B,EAAG,uDAAwDuB,CAAS,EAAI,GAAGG,EAC9H,SAAA9B,MAACwD,EAAAA,UAAA,CAAU,UAAU,QAAA,CAAS,CAAA,CAChC,CAEJ,EACAD,GAAqB,YAAcL,EAAgB,eAAe,YAElE,MAAMO,GAAyB/B,EAAM,WACnC,CAAC,CAAE,UAAAC,EAAW,GAAGG,GAASC,IACxB/B,EAAAA,IAACkD,EAAgB,iBAAhB,CAAiC,IAAAnB,EAAU,UAAW3B,EAAG,uDAAwDuB,CAAS,EAAI,GAAGG,EAChI,SAAA9B,MAACsD,EAAAA,YAAA,CAAY,UAAU,QAAA,CAAS,CAAA,CAClC,CAEJ,EACAG,GAAuB,YAAcP,EAAgB,iBAAiB,YAEtE,MAAMQ,EAAgBhC,EAAM,WAC1B,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,SAAAkH,EAAW,SAAU,GAAG7B,GAASC,IACvD/B,EAAAA,IAACkD,EAAgB,OAAhB,CACC,SAAA9B,EAAAA,KAAC8B,EAAgB,QAAhB,CACC,IAAAnB,EACA,UAAW3B,EACT,gjBACAuD,IAAa,UACX,kIACFhC,CAAA,EAEF,SAAAgC,EACC,GAAG7B,EAEJ,SAAA,CAAA9B,EAAAA,IAACuD,GAAA,EAAqB,EACtBvD,EAAAA,IAACkD,EAAgB,SAAhB,CACC,UAAW9C,EAAG,MAAOuD,IAAa,UAAY,yFAAyF,EAEtI,SAAAlH,CAAA,CAAA,QAEFgH,GAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAC1B,CACF,CAEJ,EACAC,EAAc,YAAcR,EAAgB,QAAQ,YAEpD,MAAMU,GAAclC,EAAM,WACxB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ/B,EAAAA,IAACkD,EAAgB,MAAhB,CAAsB,IAAAnB,EAAU,UAAW3B,EAAG,oCAAqCuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CAC/I,EACA8B,GAAY,YAAcV,EAAgB,MAAM,YAEhD,MAAMW,EAAanC,EAAM,WACvB,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,CAAA,EAASC,IAClCX,EAAAA,KAAC8B,EAAgB,KAAhB,CACC,IAAAnB,EACA,UAAW3B,EACT,4NACAuB,CAAA,EAED,GAAGG,EAEJ,SAAA,CAAA9B,EAAAA,IAAC,OAAA,CAAK,UAAU,6DACd,SAAAA,EAAAA,IAACkD,EAAgB,cAAhB,CACC,SAAAlD,EAAAA,IAAC8D,QAAA,CAAM,UAAU,QAAA,CAAS,CAAA,CAC5B,EACF,EACA9D,EAAAA,IAACkD,EAAgB,SAAhB,CAA0B,SAAAzG,CAAA,CAAS,CAAA,CAAA,CAAA,CAG1C,EACAoH,EAAW,YAAcX,EAAgB,KAAK,YAE9C,MAAMa,GAAkBrC,EAAM,WAC5B,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ/B,EAAAA,IAACkD,EAAgB,UAAhB,CAA0B,IAAAnB,EAAU,UAAW3B,EAAG,2BAA4BuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CAC1I,EACAiC,GAAgB,YAAcb,EAAgB,UAAU,YCnGjD,SAASc,IAAa,CAC3B,KAAM,CAAE,MAAAhG,EAAO,eAAAF,EAAgB,kBAAAC,CAAA,EAAsBkC,EAAA,EAErD,OACEmB,EAAAA,KAAC6B,EAAA,CAAO,MAAOnF,EAAgB,cAAeC,EAC5C,SAAA,CAAAiC,MAACqD,EAAA,CAAc,UAAU,iBACvB,SAAArD,MAACoD,IAAY,EACf,EAEAhC,EAAAA,KAACsC,EAAA,CAAc,MAAM,MACnB,SAAA,CAAA1D,EAAAA,IAAC6D,GAAW,MAAM,MAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAACkC,GAAA,CAAY,IAAK,EACf,SAAAlE,EAAM,IAAIiG,GACT7C,EAAAA,KAACyB,GAAA,CAAqB,UAAU,kBAC9B,SAAA,CAAA7C,MAAC+C,IAAY,IAAKkB,EAAK,aAAe,OAAW,IAAKA,EAAK,KAAM,QAChEjB,GAAA,CAAe,UAAU,WAAY,SAAAiB,EAAK,KAAK,CAAC,CAAA,CAAE,CAAA,CAAA,EAFxCA,EAAK,EAGlB,CACD,EACH,EAAc,KAAA,CAAA,CAEhB,CAAA,CACF,EAECjG,EAAM,IAAIiG,GACTjE,EAAAA,IAAC6D,EAAA,CAAyB,MAAOI,EAAK,GAAI,UAAU,SAClD,SAAA7C,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAACyB,GAAA,CAAqB,UAAU,SAC9B,SAAA,CAAA7C,MAAC+C,IAAY,IAAKkB,EAAK,aAAe,OAAW,IAAKA,EAAK,KAAM,QAChEjB,GAAA,CAAe,UAAU,WAAY,SAAAiB,EAAK,KAAK,CAAC,CAAA,CAAE,CAAA,CAAA,EAFxCA,EAAK,EAGlB,EAEAjE,EAAAA,IAAC,IAAA,CAAE,UAAU,WAAY,WAAK,IAAA,CAAK,CAAA,EACrC,CAAA,EAReiE,EAAK,EAStB,CACD,CAAA,CAAA,CACH,CAAA,EACF,CAEJ,CCzCO,SAASC,IAAc,CAC5B,KAAM,CAAE,gBAAArG,CAAA,EAAoBoC,EAAA,EAEtBkE,MAAY,KACZC,EAAc,IAAMvG,EAAgBsG,CAAK,EAE/C,OACE/C,EAAAA,KAAC,SAAA,CACC,UAAU,8IACV,QAASgD,EAET,SAAA,CAAApE,EAAAA,IAAC,IAAA,CAAE,UAAU,mHACV,SAAAqE,EAAAA,WAAWF,EAAO,KAAK,EAAE,aAAY,CACxC,QACC,IAAA,CAAE,UAAU,4DAA6D,SAAAA,EAAM,SAAQ,CAAE,CAAA,CAAA,CAAA,CAGhG,CChBA,MAAMG,GAAgB9C,GAAAA,IACpB,uKACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,mFACT,UAAW,kFACX,YAAa,+FACb,QAAS,iBAAA,CACX,EAEF,gBAAiB,CACf,QAAS,SAAA,CACX,CAEJ,EAEA,SAAS+C,GAAM,CAAE,UAAA5C,EAAW,QAAA3C,EAAS,GAAG8C,GAAS,CAC/C,OAAO9B,MAAC,MAAA,CAAI,UAAWI,EAAGkE,GAAc,CAAE,QAAAtF,CAAA,CAAS,EAAG2C,CAAS,EAAI,GAAGG,CAAA,CAAO,CAC/E,CCMO,SAAS0C,GAAUC,EAAM3F,EAAM,CACpC,MAAM4F,EAAe,cACrB,IAAIC,EACAC,EAEJ,OAAQH,EAAI,CACV,IAAK,SACHE,EAAQE,EAAAA,aAAa/F,CAAI,EACzB8F,EAAME,EAAAA,WAAWhG,CAAI,EACrB,MACF,IAAK,OACH6F,EAAQI,EAAAA,YAAYjG,CAAI,EACxB8F,EAAMI,EAAAA,UAAUlG,CAAI,EACpB,MACF,IAAK,QACH6F,EAAQE,EAAAA,aAAa/F,CAAI,EACzB8F,EAAME,EAAAA,WAAWhG,CAAI,EACrB,MACF,IAAK,OACH6F,EAAQM,EAAAA,YAAYnG,CAAI,EACxB8F,EAAMM,EAAAA,UAAUpG,CAAI,EACpB,MACF,IAAK,MACH,OAAOqG,EAAAA,OAAOrG,EAAM4F,CAAY,EAClC,QACE,MAAO,yBACb,CAEE,MAAO,GAAGS,EAAAA,OAAOR,EAAOD,CAAY,CAAC,MAAMS,EAAAA,OAAOP,EAAKF,CAAY,CAAC,EACtE,CAEO,SAASU,GAAatG,EAAM2F,EAAMY,EAAW,CASlD,MARmB,CACjB,OAAQA,IAAc,OAASC,EAAAA,UAAYC,EAAAA,UAC3C,KAAMF,IAAc,OAASG,EAAAA,SAAWC,EAAAA,SACxC,MAAOJ,IAAc,OAASC,EAAAA,UAAYC,EAAAA,UAC1C,KAAMF,IAAc,OAASK,EAAAA,SAAWC,EAAAA,SACxC,IAAKN,IAAc,OAASO,EAAAA,QAAUC,EAAAA,OAC1C,EAEoBpB,CAAI,EAAE3F,EAAM,CAAC,CACjC,CAEO,SAASgH,GAAe5H,EAAQY,EAAM2F,EAAM,CACjD,MAAMsB,EAAa,CACjB,OAAQC,EAAAA,YACR,KAAMC,EAAAA,WACN,IAAKC,EAAAA,UACL,KAAMC,EAAAA,WACN,MAAOH,EAAAA,WACX,EAEE,OAAO9H,EAAO,OAAOkI,GAASL,EAAWtB,CAAI,EAAE,IAAI,KAAK2B,EAAM,SAAS,EAAGtH,CAAI,CAAC,EAAE,MACnF,CAIO,SAASuH,GAAiBnI,EAAQ,CACvC,MAAM/C,EAAM,IAAI,KAChB,OAAO+C,EAAO,OAAOkI,GAASE,EAAAA,iBAAiBnL,EAAK,CAAE,MAAOoL,WAASH,EAAM,SAAS,EAAG,IAAKG,WAASH,EAAM,OAAO,CAAC,CAAE,CAAC,GAAK,IAC9H,CAEO,SAASI,GAAYC,EAAW,CACrC,MAAMC,EAAeD,EAAU,KAAK,CAACE,EAAGC,IAAML,EAAAA,SAASI,EAAE,SAAS,EAAE,QAAO,EAAKJ,WAASK,EAAE,SAAS,EAAE,QAAO,CAAE,EACzGC,EAAS,CAAA,EAEf,UAAWT,KAASM,EAAc,CAChC,MAAMI,EAAaP,EAAAA,SAASH,EAAM,SAAS,EAE3C,IAAIW,EAAS,GACb,UAAWC,KAASH,EAAQ,CAC1B,MAAMI,EAAmBD,EAAMA,EAAM,OAAS,CAAC,EACzCE,EAAeX,EAAAA,SAASU,EAAiB,OAAO,EAEtD,GAAIH,GAAcI,EAAc,CAC9BF,EAAM,KAAKZ,CAAK,EAChBW,EAAS,GACT,KACF,CACF,CAEKA,GAAQF,EAAO,KAAK,CAACT,CAAK,CAAC,CAClC,CAEA,OAAOS,CACT,CAEO,SAASM,GAAmBf,EAAOgB,EAAKC,EAAYC,EAAWC,EAAmB,CACvF,MAAM5L,EAAY4K,EAAAA,SAASH,EAAM,SAAS,EACpCoB,EAAW,IAAI,KAAKJ,EAAI,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EAC5CN,EAAanL,EAAY6L,EAAWA,EAAW7L,EAC/C8L,EAAeC,EAAAA,oBAAoBZ,EAAYU,CAAQ,EAE7D,IAAIG,EAEJ,GAAIJ,EAAmB,CACrB,MAAMK,EAAsBL,EAAkB,KAAO,GAE/CM,EADoBN,EAAkB,GAAK,GACDK,EAChDD,GAAQF,EAAeG,GAAuBC,EAAuB,GACvE,MACEF,EAAOF,EAAe,KAAQ,IAGhC,MAAMK,EAAQ,IAAMR,EACdS,EAAOV,EAAaS,EAE1B,MAAO,CAAE,IAAK,GAAGH,CAAG,IAAK,MAAO,GAAGG,CAAK,IAAK,KAAM,GAAGC,CAAI,IAC5D,CAEO,SAASC,GAAcZ,EAAKa,EAAMvK,EAAc,CACrD,MAAMwK,EAAWd,EAAI,SACfe,EAAWzK,EAAawK,CAAQ,EACtC,OAAOD,GAAQE,EAAS,MAAQF,EAAOE,EAAS,EAClD,CAEO,SAASC,GAAgB5K,EAAc6K,EAAiB,CAC7D,IAAIC,EAAoB9K,EAAa,KACjC+K,EAAkB/K,EAAa,GAEnC,OAAA6K,EAAgB,QAAQjC,GAAS,CAC/B,MAAMoC,EAAYjC,EAAAA,SAASH,EAAM,SAAS,EAAE,SAAQ,EAC9CqC,EAAUlC,EAAAA,SAASH,EAAM,OAAO,EAChCsC,EAAUD,EAAQ,YAAcA,EAAQ,WAAU,EAAK,EAAI,EAAI,GACjED,EAAYF,IAAmBA,EAAoBE,GACnDE,EAAUH,IAAiBA,EAAkBG,EACnD,CAAC,EAEDH,EAAkB,KAAK,IAAIA,EAAiB,EAAE,EAIvC,CAAE,MAFK,MAAM,KAAK,CAAE,OAAQA,EAAkBD,CAAiB,EAAI,CAACK,EAAG,IAAM,EAAIL,CAAiB,EAEzF,kBAAAA,EAAmB,gBAAAC,EACrC,CAIO,SAASK,GAAiBhL,EAAc,CAC7C,MAAMiL,EAAcjL,EAAa,cAC3BkL,EAAelL,EAAa,WAE5BmL,EAAiB,CAACC,EAAMC,IAAU,IAAI,KAAKD,EAAMC,EAAQ,EAAG,CAAC,EAAE,QAAO,EACtEC,EAAqB,CAACF,EAAMC,IAAU,IAAI,KAAKD,EAAMC,EAAO,CAAC,EAAE,SAE/DE,EAAcJ,EAAeF,EAAaC,CAAY,EACtDM,EAAkBF,EAAmBL,EAAaC,CAAY,EAC9DO,EAAkBN,EAAeF,EAAaC,EAAe,CAAC,EAC9DQ,EAAYF,EAAkBD,EAE9BI,EAAiB,MAAM,KAAK,CAAE,OAAQH,CAAe,EAAI,CAACT,EAAGpN,KAAO,CACxE,IAAK8N,EAAkBD,EAAkB7N,EAAI,EAC7C,aAAc,GACd,KAAM,IAAI,KAAKsN,EAAaC,EAAe,EAAGO,EAAkBD,EAAkB7N,EAAI,CAAC,CAC3F,EAAI,EAEIiO,EAAoB,MAAM,KAAK,CAAE,OAAQL,CAAW,EAAI,CAACR,EAAGpN,KAAO,CACvE,IAAKA,EAAI,EACT,aAAc,GACd,KAAM,IAAI,KAAKsN,EAAaC,EAAcvN,EAAI,CAAC,CACnD,EAAI,EAEIkO,EAAiB,MAAM,KAAK,CAAE,QAAS,EAAKH,EAAY,GAAM,CAAC,EAAI,CAACX,EAAGpN,KAAO,CAClF,IAAKA,EAAI,EACT,aAAc,GACd,KAAM,IAAI,KAAKsN,EAAaC,EAAe,EAAGvN,EAAI,CAAC,CACvD,EAAI,EAEF,MAAO,CAAC,GAAGgO,EAAgB,GAAGC,EAAmB,GAAGC,CAAc,CACpE,CAEO,SAASC,GAA6BC,EAAgBtB,EAAiBzK,EAAc,CAC1F,MAAMgM,EAAa/E,eAAajH,CAAY,EACtCiM,EAAW/E,aAAWlH,CAAY,EAElCkM,EAAiB,CAAA,EACjBC,EAAoB,CAAA,EAE1BC,OAAAA,oBAAkB,CAAE,MAAOJ,EAAY,IAAKC,EAAU,EAAE,QAAQzC,GAAO,CACrE2C,EAAkB3C,EAAI,YAAW,CAAE,EAAI,CAAC,GAAO,GAAO,EAAK,CAC7D,CAAC,EAEoB,CACnB,GAAGuC,EAAe,KAAK,CAAChD,EAAGC,IAAM,CAC/B,MAAMqD,EAAYC,mBAAiB3D,EAAAA,SAASI,EAAE,OAAO,EAAGJ,WAASI,EAAE,SAAS,CAAC,EAE7E,OADkBuD,mBAAiB3D,EAAAA,SAASK,EAAE,OAAO,EAAGL,WAASK,EAAE,SAAS,CAAC,EAC1DqD,GAAa1D,WAASI,EAAE,SAAS,EAAE,QAAO,EAAKJ,EAAAA,SAASK,EAAE,SAAS,EAAE,QAAO,CACjG,CAAC,EACD,GAAGyB,EAAgB,KAAK,CAAC1B,EAAGC,IAAML,EAAAA,SAASI,EAAE,SAAS,EAAE,QAAO,EAAKJ,EAAAA,SAASK,EAAE,SAAS,EAAE,SAAS,CACvG,EAEe,QAAQR,GAAS,CAC5B,MAAMU,EAAaP,EAAAA,SAASH,EAAM,SAAS,EACrC+D,EAAW5D,EAAAA,SAASH,EAAM,OAAO,EACjCgE,EAAYJ,EAAAA,kBAAkB,CAClC,MAAOlD,EAAa8C,EAAaA,EAAa9C,EAC9C,IAAKqD,EAAWN,EAAWA,EAAWM,CAC5C,CAAK,EAED,IAAIxG,EAAW,GAEf,QAASpI,EAAI,EAAGA,EAAI,EAAGA,IACrB,GACE6O,EAAU,MAAMhD,GAAO,CACrB,MAAMiD,EAAeN,EAAkBO,EAAAA,WAAWlD,CAAG,EAAE,YAAW,CAAE,EACpE,OAAOiD,GAAgB,CAACA,EAAa9O,CAAC,CACxC,CAAC,EACD,CACAoI,EAAWpI,EACX,KACF,CAGEoI,IAAa,KACfyG,EAAU,QAAQhD,GAAO,CACvB,MAAMmD,EAASD,EAAAA,WAAWlD,CAAG,EAAE,YAAW,EAC1C2C,EAAkBQ,CAAM,EAAE5G,CAAQ,EAAI,EACxC,CAAC,EACDmG,EAAe1D,EAAM,EAAE,EAAIzC,EAE/B,CAAC,EAEMmG,CACT,CAEO,SAASU,GAAmB1L,EAAMZ,EAAQ4L,EAAgB,CAO/D,OANsB5L,EAAO,OAAOkI,GAAS,CAC3C,MAAMU,EAAaP,EAAAA,SAASH,EAAM,SAAS,EACrC+D,EAAW5D,EAAAA,SAASH,EAAM,OAAO,EACvC,OAAQtH,GAAQgI,GAAchI,GAAQqL,GAAajE,EAAAA,UAAUpH,EAAMgI,CAAU,GAAKZ,EAAAA,UAAUpH,EAAMqL,CAAQ,CAC5G,CAAC,EAGE,IAAI/D,IAAU,CACb,GAAGA,EACH,SAAU0D,EAAe1D,EAAM,EAAE,GAAK,GACtC,WAAYA,EAAM,YAAcA,EAAM,OAC5C,EAAM,EACD,KAAK,CAACO,EAAGC,IACJD,EAAE,YAAc,CAACC,EAAE,WAAmB,GACtC,CAACD,EAAE,YAAcC,EAAE,WAAmB,EACnCD,EAAE,SAAWC,EAAE,QACvB,CACL,CCrQO,SAAS6D,GAAc,CAAE,KAAAhG,EAAM,OAAAvG,GAAU,CAC9C,KAAM,CAAE,aAAAN,EAAc,gBAAAC,CAAA,EAAoBoC,EAAA,EAEpCgJ,EAAQ5E,EAAAA,WAAWzG,EAAc,MAAM,EACvCoL,EAAOpL,EAAa,YAAA,EAEpB8M,EAAajI,EAAAA,QAAQ,IAAMqD,GAAe5H,EAAQN,EAAc6G,CAAI,EAAG,CAACvG,EAAQN,EAAc6G,CAAI,CAAC,EAEnGkG,EAAiB,IAAM9M,EAAgBuH,GAAaxH,EAAc6G,EAAM,UAAU,CAAC,EACnFmG,EAAa,IAAM/M,EAAgBuH,GAAaxH,EAAc6G,EAAM,MAAM,CAAC,EAEjF,OACErD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,wBACb,SAAA,CAAA6H,EAAM,IAAED,CAAA,EACX,EACA5H,EAAAA,KAACmD,GAAA,CAAM,QAAQ,UAAU,UAAU,SAChC,SAAA,CAAAmG,EAAW,SAAA,CAAA,CACd,CAAA,EACF,EAEAtJ,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAACyB,EAAA,CAAO,QAAQ,UAAU,UAAU,iCAAiC,QAASkJ,EAC5E,SAAA3K,EAAAA,IAAC6K,EAAAA,YAAA,CAAA,CAAY,CAAA,CACf,QAEC,IAAA,CAAE,UAAU,gCAAiC,SAAArG,GAAUC,EAAM7G,CAAY,EAAE,EAE5EoC,EAAAA,IAACyB,EAAA,CAAO,QAAQ,UAAU,UAAU,iCAAiC,QAASmJ,EAC5E,SAAA5K,EAAAA,IAAC8K,EAAAA,aAAA,CAAA,CAAa,CAAA,CAChB,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CC1CgC,SAASC,GAAaC,EAAMC,EAAaC,EAAQ,CAC7E,SAASC,EAAKC,EAAMC,EAAK,CACrB,IAAIC,EACJ,OAAO,eAAeF,EAAM,OAAQ,CAChC,MAAOA,EAAK,MAAQ,CAAA,EACpB,WAAY,EACxB,CAAS,GACAE,EAAKF,EAAK,MAAM,SAAWE,EAAG,OAAS,IAAI,KAC5CF,EAAK,KAAK,OAAO,IAAIJ,CAAI,EACzBC,EAAYG,EAAMC,CAAG,EAErB,UAAWE,KAAK5C,EAAE,UACR4C,KAAKH,GACP,OAAO,eAAeA,EAAMG,EAAG,CAAE,MAAO5C,EAAE,UAAU4C,CAAC,EAAE,KAAKH,CAAI,CAAC,CAAE,EAE3EA,EAAK,KAAK,OAASzC,EACnByC,EAAK,KAAK,IAAMC,CACpB,CAEA,MAAMG,GAASN,GAAA,YAAAA,EAAQ,SAAU,OACjC,MAAMO,UAAmBD,CAAO,CACpC,CACI,OAAO,eAAeC,EAAY,OAAQ,CAAE,MAAOT,EAAM,EACzD,SAASrC,EAAE0C,EAAK,CACZ,IAAIC,EACJ,MAAMF,EAAOF,GAAA,MAAAA,EAAQ,OAAS,IAAIO,EAAe,KACjDN,EAAKC,EAAMC,CAAG,GACbC,EAAKF,EAAK,MAAM,WAAaE,EAAG,SAAW,IAC5C,UAAWI,KAAMN,EAAK,KAAK,SACvBM,EAAE,EAEN,OAAON,CACX,CACA,cAAO,eAAezC,EAAG,OAAQ,CAAE,MAAOwC,EAAM,EAChD,OAAO,eAAexC,EAAG,OAAO,YAAa,CACzC,MAAQyC,GAAS,SACb,OAAIF,GAAA,MAAAA,EAAQ,QAAUE,aAAgBF,EAAO,OAClC,IACJS,GAAAL,EAAAF,GAAA,YAAAA,EAAM,OAAN,YAAAE,EAAY,SAAZ,YAAAK,EAAoB,IAAIX,EACnC,CACR,CAAK,EACD,OAAO,eAAerC,EAAG,OAAQ,CAAE,MAAOqC,EAAM,EACzCrC,CACX,CAGO,MAAMiD,WAAuB,KAAM,CACtC,aAAc,CACV,MAAM,0EAA0E,CACpF,CACJ,CACO,MAAMC,GAAe,CAAA,EACrB,SAASC,GAAOC,EAAW,CAG9B,OAAOF,EACX,CCtCO,SAASG,GAAsBrD,EAAGsD,EAAO,CAC5C,OAAI,OAAOA,GAAU,SACVA,EAAM,SAAQ,EAClBA,CACX,CAsFO,MAAMC,GAAoB,MAAM,kBACjC,MAAM,kBACN,IAAIC,IAAU,CAAE,EA6Tf,SAASC,GAAcC,EAAS,CACnC,OAAO,OAAOA,GAAY,SAAWA,EAAUA,GAAA,YAAAA,EAAS,OAC5D,CACO,SAASC,GAAcC,EAAKC,EAAKV,EAAQ,iBAC5C,MAAMW,EAAO,CAAE,GAAGF,EAAK,KAAMA,EAAI,MAAQ,EAAE,EAE3C,GAAI,CAACA,EAAI,QAAS,CACd,MAAMF,EAAUD,IAAcM,GAAAf,GAAAL,EAAAiB,EAAI,OAAJ,YAAAjB,EAAU,KAAK,MAAf,YAAAK,EAAoB,QAApB,YAAAe,EAAA,KAAAf,EAA4BY,EAAI,GAC1DH,IAAcO,EAAAH,GAAA,YAAAA,EAAK,QAAL,YAAAG,EAAA,KAAAH,EAAaD,EAAI,GAC/BH,IAAcQ,EAAAd,EAAO,cAAP,YAAAc,EAAA,KAAAd,EAAqBS,EAAI,GACvCH,IAAcS,EAAAf,EAAO,cAAP,YAAAe,EAAA,KAAAf,EAAqBS,EAAI,GACvC,gBACJE,EAAK,QAAUJ,CACnB,CAEA,cAAOI,EAAK,KACZ,OAAOA,EAAK,SACPD,GAAA,MAAAA,EAAK,aACN,OAAOC,EAAK,MAETA,CACX,CClcA,MAAMxB,GAAc,CAACG,EAAMC,IAAQ,CAC/BD,EAAK,KAAO,YACZ,OAAO,eAAeA,EAAM,OAAQ,CAChC,MAAOA,EAAK,KACZ,WAAY,EACpB,CAAK,EACD,OAAO,eAAeA,EAAM,SAAU,CAClC,MAAOC,EACP,WAAY,EACpB,CAAK,EACD,OAAO,eAAeD,EAAM,UAAW,CACnC,KAAM,CACF,OAAO,KAAK,UAAUC,EAAKyB,GAA4B,CAAC,CAC5D,EACA,WAAY,EAEpB,CAAK,EACD,OAAO,eAAe1B,EAAM,WAAY,CACpC,MAAO,IAAMA,EAAK,QAClB,WAAY,EACpB,CAAK,CACL,EACa2B,GAAYhC,GAAa,YAAaE,EAAW,EACjD+B,GAAgBjC,GAAa,YAAaE,GAAa,CAAE,OAAQ,MAAO,ECtBxEgC,GAAUC,GAAS,CAACC,EAAQlB,EAAOmB,EAAMC,IAAY,CAC9D,MAAMb,EAAMY,EAAO,OAAO,OAAOA,EAAM,CAAE,MAAO,EAAK,CAAE,EAAI,CAAE,MAAO,EAAK,EACnEpS,EAASmS,EAAO,KAAK,IAAI,CAAE,MAAAlB,EAAO,OAAQ,EAAE,EAAIO,CAAG,EACzD,GAAIxR,aAAkB,QAClB,MAAM,IAAIsS,GAEd,GAAItS,EAAO,OAAO,OAAQ,CACtB,MAAM4E,EAAI,KAAKyN,GAAA,YAAAA,EAAS,MAAOH,GAAMlS,EAAO,OAAO,IAAKuR,GAAQgB,GAAmBhB,EAAKC,EAAKgB,GAAW,CAAE,CAAC,CAAC,EAC5GC,MAAAA,GAAuB7N,EAAGyN,GAAA,YAAAA,EAAS,MAAM,EACnCzN,CACV,CACA,OAAO5E,EAAO,KAClB,EACa0S,GAAuBT,GAAOU,EAAoB,EAClDC,GAAeV,GAAS,MAAOC,EAAQlB,EAAOmB,EAAMlC,IAAW,CACxE,MAAMsB,EAAMY,EAAO,OAAO,OAAOA,EAAM,CAAE,MAAO,EAAI,CAAE,EAAI,CAAE,MAAO,EAAI,EACvE,IAAIpS,EAASmS,EAAO,KAAK,IAAI,CAAE,MAAAlB,EAAO,OAAQ,EAAE,EAAIO,CAAG,EAGvD,GAFIxR,aAAkB,UAClBA,EAAS,MAAMA,GACfA,EAAO,OAAO,OAAQ,CACtB,MAAM4E,EAAI,KAAKsL,GAAA,YAAAA,EAAQ,MAAOgC,GAAMlS,EAAO,OAAO,IAAKuR,GAAQgB,GAAmBhB,EAAKC,EAAKgB,GAAW,CAAE,CAAC,CAAC,EAC3GC,MAAAA,GAAuB7N,EAAGsL,GAAA,YAAAA,EAAQ,MAAM,EAClCtL,CACV,CACA,OAAO5E,EAAO,KAClB,EACa6S,GAA4BD,GAAYD,EAAoB,EC7BmF,SAASG,GAAEC,EAAEnO,EAAE,CAAC,GAAG,CAAC,IAAIoO,EAAED,EAAC,CAAE,OAAOA,EAAE,CAAC,OAAOnO,EAAEmO,CAAC,CAAC,CAAC,OAAOC,GAAGA,EAAE,KAAKA,EAAE,KAAK,OAAOpO,CAAC,EAAEoO,CAAC,CAAC,SAASC,GAAEF,EAAEnO,EAAE,CAAC,QAAQsO,EAAE,CAAA,EAAGH,EAAE,QAAQ,CAAC,IAAID,EAAEC,EAAE,CAAC,EAAEE,EAAEH,EAAE,KAAKvS,EAAEuS,EAAE,QAAQnH,EAAEmH,EAAE,KAAK,KAAK,GAAG,EAAE,GAAG,CAACI,EAAEvH,CAAC,EAAE,GAAG,gBAAgBmH,EAAE,CAAC,IAAIK,EAAEL,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,EAAEI,EAAEvH,CAAC,EAAE,CAAC,QAAQwH,EAAE,QAAQ,KAAKA,EAAE,IAAI,CAAC,MAAMD,EAAEvH,CAAC,EAAE,CAAC,QAAQpL,EAAE,KAAK0S,CAAC,EAAE,GAAG,gBAAgBH,GAAGA,EAAE,YAAY,QAAQ,SAASlO,EAAE,CAAC,OAAOA,EAAE,OAAO,QAAQ,SAASA,EAAE,CAAC,OAAOmO,EAAE,KAAKnO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEA,EAAE,CAAC,IAAIwO,EAAEF,EAAEvH,CAAC,EAAE,MAAM0H,EAAED,GAAGA,EAAEN,EAAE,IAAI,EAAEI,EAAEvH,CAAC,EAAEqH,GAAAA,aAAErH,EAAE/G,EAAEsO,EAAED,EAAEI,EAAE,CAAA,EAAG,OAAOA,EAAEP,EAAE,OAAO,EAAEA,EAAE,OAAO,CAAC,CAACC,EAAE,MAAK,CAAE,CAAC,OAAOG,CAAC,CAAC,SAAS3S,GAAEwS,EAAEnO,EAAE,CAAC,QAAQsO,EAAE,CAAA,EAAGH,EAAE,QAAQ,CAAC,IAAID,EAAEC,EAAE,CAAC,EAAEE,EAAEH,EAAE,KAAKvS,EAAEuS,EAAE,QAAQnH,EAAEmH,EAAE,KAAK,KAAK,GAAG,EAAE,GAAG,CAACI,EAAEvH,CAAC,EAAE,GAAqBmH,EAAE,OAApB,iBAA0BA,EAAE,OAAO,OAAO,EAAE,CAAC,IAAIK,EAAEL,EAAE,OAAO,CAAC,EAAE,CAAC,EAAEI,EAAEvH,CAAC,EAAE,CAAC,QAAQwH,EAAE,QAAQ,KAAKA,EAAE,IAAI,CAAC,MAAMD,EAAEvH,CAAC,EAAE,CAAC,QAAQpL,EAAE,KAAK0S,CAAC,EAAE,GAAqBH,EAAE,OAApB,iBAA0BA,EAAE,OAAO,QAAQ,SAASlO,EAAE,CAAC,OAAOA,EAAE,QAAQ,SAASA,EAAE,CAAC,OAAOmO,EAAE,KAAKnO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEA,EAAE,CAAC,IAAIwO,EAAEF,EAAEvH,CAAC,EAAE,MAAM0H,EAAED,GAAGA,EAAEN,EAAE,IAAI,EAAEI,EAAEvH,CAAC,EAAEqH,gBAAErH,EAAE/G,EAAEsO,EAAED,EAAEI,EAAE,CAAA,EAAG,OAAOA,EAAEP,EAAE,OAAO,EAAEA,EAAE,OAAO,CAAC,CAACC,EAAE,MAAK,CAAE,CAAC,OAAOG,CAAC,CAAC,SAASvH,GAAEqH,EAAErH,EAAEwH,EAAE,CAAC,GAAYA,IAAT,SAAaA,EAAE,CAAA,GAAI,SAASJ,EAAE,CAAC,MAAM,SAASA,GAAa,OAAOA,EAAE,MAAnB,UAAyB,aAAaA,EAAE,IAAI,EAAEC,CAAC,EAAE,OAAO,SAAS,EAAEzS,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,QAAQ,QAAQuS,GAAE,UAAU,CAAC,OAAO,QAAQ,QAAQE,EAAWG,EAAE,OAAX,OAAgB,QAAQ,YAAY,EAAE,EAAExH,CAAC,CAAC,EAAE,KAAK,SAAS/G,EAAE,CAAC,OAAO,EAAE,2BAA2BmO,GAAAA,uBAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAA,EAAG,OAAOI,EAAE,IAAI,OAAO,OAAO,CAAA,EAAG,CAAC,EAAEvO,CAAC,CAAC,CAAC,CAAC,EAAE,SAASmO,EAAE,CAAC,GAAG,SAASA,EAAE,CAAC,OAAO,MAAM,QAAcA,GAAN,KAAQ,OAAOA,EAAE,MAAM,CAAC,EAAEA,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA,EAAG,OAAOnO,GAAAA,aAAEqO,GAAEF,EAAE,OAAO,CAAC,EAAE,2BAAmC,EAAE,eAAV,KAAsB,EAAE,CAAC,CAAC,EAAE,MAAMA,CAAC,CAAC,CAAC,CAAC,OAAOA,EAAE,CAAC,OAAO,QAAQ,OAAOA,CAAC,CAAC,CAAC,EAAE,GAAG,SAASA,EAAE,CAAC,MAAM,SAASA,GAAa,OAAOA,EAAE,MAAnB,QAAuB,EAAEC,CAAC,EAAE,OAAO,SAASC,EAAEG,EAAEC,EAAE,CAAC,GAAG,CAAC,OAAO,QAAQ,QAAQP,GAAE,UAAU,CAAC,OAAO,QAAQ,SAAkBK,EAAE,OAAX,OAAgBG,GAAQC,IAAcP,EAAEC,EAAEtH,CAAC,CAAC,EAAE,KAAK,SAAS/G,EAAE,CAAC,OAAOyO,EAAE,2BAA2BN,GAAAA,uBAAE,GAAGM,CAAC,EAAE,CAAC,OAAO,CAAA,EAAG,OAAOF,EAAE,IAAI,OAAO,OAAO,CAAA,EAAGF,CAAC,EAAErO,CAAC,CAAC,CAAC,CAAC,EAAE,SAASmO,EAAE,CAAC,GAAG,SAASA,EAAE,CAAC,OAAOA,aAAaS,EAAW,EAAET,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA,EAAG,OAAOnO,GAAAA,aAAErE,GAAEwS,EAAE,OAAO,CAACM,EAAE,2BAAmCA,EAAE,eAAV,KAAsB,EAAEA,CAAC,CAAC,EAAE,MAAMN,CAAC,CAAC,CAAC,CAAC,OAAOA,EAAE,CAAC,OAAO,QAAQ,OAAOA,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,MAAM,iCAAiC,CAAC,CCExtE,SAASU,GAAc,CAAE,cAAAC,EAAgB,EAAK,EAAK,CAAA,EAAI,CAC5D,KAAM,CAACC,EAAQC,CAAS,EAAIrR,EAAAA,SAASmR,CAAa,EAMlD,MAAO,CAAE,OAJM,IAAME,EAAU,EAAI,EAIlB,QAHD,IAAMA,EAAU,EAAK,EAGX,OAAAD,EAAQ,SAFjB,IAAMC,EAAUC,GAAgB,CAACA,CAAY,CAEpB,CAC5C,CCNA,MAAMC,GAAQpN,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,KAAAoN,EAAM,GAAGjN,CAAA,EAASC,IAE3D/B,EAAAA,IAAC,QAAA,CACC,KAAA+O,EACA,UAAW3O,EACT,0WACAuB,CAAA,EAEF,IAAAI,EACC,GAAGD,CAAA,CAAA,CAGT,EACDgN,GAAM,YAAc,QCbpB,MAAME,GAAWtN,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAExD/B,EAAAA,IAAC,WAAA,CACC,UAAWI,EACT,4QACAuB,CAAA,EAEF,IAAAI,EACC,GAAGD,CAAA,CAAA,CAGT,EACDkN,GAAS,YAAc,WCTvB,MAAMC,EAAY9M,EAAAA,WAChB,CAAC,CAAE,UAAAR,EAAW,mBAAAuN,EAAoB,iBAAAC,EAAkB,SAAAC,EAAU,eAAgBC,EAAa,GAAGvN,CAAA,EAASC,IAEnG/B,EAAAA,IAACsP,GAAAA,UAAA,CACC,IAAAvN,EACA,UAAW3B,EAAG,WAAYuB,CAAS,EACnC,WAAYyN,EACZ,UAAWC,EACV,GAAGvN,EACJ,aAAW,OACX,wBAAuB,GAEvB,SAAA9B,EAAAA,IAACuP,GAAAA,UAAA,CACC,UAAWnP,EACT,4IACA,4FACA,gEACA8O,CAAA,EAGD,SAAAM,GACCxP,EAAAA,IAACyP,GAAAA,YAAA,CACC,QAAAD,EACA,UAAWpP,EACT,2DACA,iEACA,2CACA,gEACA+O,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CAAA,CAIR,EAEAF,EAAU,YAAc,YCrCxB,SAASS,GAAe,CAAE,UAAA/N,EAAW,WAAAgO,EAAY,gBAAAC,EAAkB,GAAM,SAAAC,EAAU,GAAG/N,GAAS,CAC7F,KAAM,CAACgH,EAAcgH,CAAe,EAAIpO,EAAM,SAASmO,aAAoB,KAAOA,EAAW,MAAS,EAEtG,OACE7P,EAAAA,IAAC+P,GAAAA,UAAA,CACC,SAAAF,EACA,gBAAAD,EACA,MAAO9G,EACP,cAAegH,EACf,UAAW1P,EAAG,MAAOuB,CAAS,EAC9B,WAAY,CACV,OAAQ,gEACR,MAAO,YACP,QAAS,iDACT,cAAe,sBACf,IAAK,8BACL,WAAYvB,EAAGmB,GAAe,CAAE,QAAS,SAAA,CAAW,EAAG,yDAAyD,EAChH,oBAAqB,kBACrB,gBAAiB,mBACjB,MAAO,mCACP,SAAU,OACV,UAAW,iEACX,IAAK,mBACL,KAAMnB,EACJ,oNACA,qCAAA,EAEF,IAAKA,EAAGmB,GAAe,CAAE,QAAS,OAAA,CAAS,EAAG,mDAAmD,EACjG,gBAAiB,kBACjB,cAAe,gBACf,aAAc,mIACd,UAAW,mCACX,YAAa,mGACb,aAAc,mCACd,iBAAkB,+DAClB,WAAY,YACZ,GAAGoO,CAAA,EAEL,WAAY,CACV,SAAU,CAAC,CAAE,UAAAhO,EAAW,GAAGG,CAAAA,IAAY9B,EAAAA,IAAC6K,EAAAA,YAAA,CAAY,UAAWzK,EAAG,UAAWuB,CAAS,EAAI,GAAGG,EAAO,EACpG,UAAW,CAAC,CAAE,UAAAH,EAAW,GAAGG,CAAAA,IAAY9B,EAAAA,IAAC8K,EAAAA,aAAA,CAAa,UAAW1K,EAAG,UAAWuB,CAAS,EAAI,GAAGG,CAAAA,CAAO,CAAA,EAEvG,GAAGA,CAAA,CAAA,CAGV,CACA4N,GAAe,YAAc,WCjD7B,MAAMM,GAAUC,GAAiB,KAE3BC,GAAiBD,GAAiB,QAElCE,GAAgBF,GAAiB,OAEjCG,GAAiB1O,EAAM,WAC3B,CAAC,CAAE,UAAAC,EAAW,MAAA0O,EAAQ,SAAU,WAAAC,EAAa,EAAG,GAAGxO,CAAA,EAASC,IAC1D/B,EAAAA,IAACiQ,GAAiB,OAAjB,CACC,SAAAjQ,EAAAA,IAACiQ,GAAiB,QAAjB,CACC,IAAAlO,EACA,MAAAsO,EACA,WAAAC,EACA,UAAWlQ,EACT,+dACAuB,CAAA,EAED,GAAGG,CAAA,CAAA,CACN,CACF,CAEJ,EACAsO,GAAe,YAAcH,GAAiB,QAAQ,YCftD,SAASM,GAAgB,CAAE,GAAAC,EAAI,SAAAC,EAAU,UAAA9O,EAAW,YAAA+O,EAAa,aAAAC,EAAe,MAAO,MAAA1E,EAAO,GAAGnK,GAAS,CACxG,KAAM,CAAE,OAAA6M,EAAQ,QAAAiC,EAAS,SAAAC,CAAA,EAAapC,GAAA,EAEhCqC,EAAgBhS,GAAS,CAC7B2R,EAAS3R,CAAI,EACb8R,EAAA,CACF,EAEA,cACGZ,GAAA,CAAQ,KAAMrB,EAAQ,aAAckC,EAAU,MAAK,GAClD,SAAA,CAAA7Q,EAAAA,IAACkQ,GAAA,CAAe,QAAO,GACrB,SAAA9O,EAAAA,KAACK,EAAA,CACC,GAAA+O,EACA,QAAQ,UACR,UAAWpQ,EAAG,mGAAoGuB,CAAS,EAC1H,GAAGG,EAEH,SAAA,CAAAmK,GAASjM,EAAAA,IAAC,OAAA,CAAM,SAAAmF,EAAAA,OAAO8G,EAAO0E,CAAY,EAAE,EAC5C,CAAC1E,GAASjM,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAA0Q,CAAA,CAAY,CAAA,CAAA,CAAA,EAEpE,QAECN,GAAA,CAAe,MAAM,SAAS,UAAU,YACvC,SAAApQ,MAAC0P,GAAA,CAAe,KAAK,SAAS,SAAUzD,EAAO,SAAU6E,EAAc,aAAY,GAAC,CAAA,CACtF,CAAA,EACF,CAEJ,CCjCA,MAAMC,GAAgBvP,GAAAA,IAAI,4FAA4F,EAEhHwP,GAAQtP,EAAM,WAClB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ/B,EAAAA,IAACiR,GAAe,KAAf,CAAoB,IAAAlP,EAAU,UAAW3B,EAAG2Q,GAAA,EAAiBpP,CAAS,EAAI,GAAGG,CAAA,CAAO,CACzH,EACAkP,GAAM,YAAcC,GAAe,KAAK,YCJxC,MAAMC,GAAOC,GAAAA,aAEPC,GAAmB1P,EAAM,cAAc,EAAE,EAE/C,SAAS2P,EAAU,CAAE,GAAGvP,GAAS,CAC/B,OACE9B,EAAAA,IAACoR,GAAiB,SAAjB,CAA0B,MAAO,CAAE,KAAMtP,EAAM,IAAA,EAC9C,SAAA9B,EAAAA,IAACsR,GAAAA,WAAA,CAAY,GAAGxP,EAAO,EACzB,CAEJ,CAEA,MAAMyP,GAAe,IAAM,CACzB,MAAMC,EAAe9P,EAAM,WAAW0P,EAAgB,EAChDK,EAAc/P,EAAM,WAAWgQ,EAAe,EAC9C,CAAE,cAAAC,EAAe,UAAAC,CAAA,EAAcC,kBAAA,EAE/BC,EAAaH,EAAcH,EAAa,KAAMI,CAAS,EAE7D,GAAI,CAACJ,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,KAAM,CAAE,GAAAhB,GAAOiB,EAEf,MAAO,CACL,GAAAjB,EACA,KAAMgB,EAAa,KACnB,WAAY,GAAGhB,CAAE,aACjB,kBAAmB,GAAGA,CAAE,yBACxB,cAAe,GAAGA,CAAE,qBACpB,GAAGsB,CAAA,CAEP,EAEMJ,GAAkBhQ,EAAM,cAAc,EAAE,EAExCqQ,EAAWrQ,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ,CAClE,MAAMyO,EAAK9O,EAAM,MAAA,EAEjB,aACGgQ,GAAgB,SAAhB,CAAyB,MAAO,CAAE,GAAAlB,GACjC,SAAAxQ,EAAAA,IAAC,MAAA,CAAI,IAAA+B,EAAU,UAAW3B,EAAG,YAAauB,CAAS,EAAI,GAAGG,EAAO,EACnE,CAEJ,CAAC,EACDiQ,EAAS,YAAc,WAEvB,MAAMC,EAAYtQ,EAAM,WACtB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ,CAChC,KAAM,CAAE,MAAApD,EAAO,WAAAsT,CAAA,EAAeV,GAAA,EAE9B,OAAOvR,EAAAA,IAACgR,GAAA,CAAM,IAAAjP,EAAU,UAAW3B,EAAGzB,GAAS,mBAAoBgD,CAAS,EAAG,QAASsQ,EAAa,GAAGnQ,CAAA,CAAO,CACjH,CACF,EACAkQ,EAAU,YAAc,YAExB,MAAME,EAAcxQ,EAAM,WAAW,CAAC,CAAE,GAAGI,CAAA,EAASC,IAAQ,CAC1D,KAAM,CAAE,MAAApD,EAAO,WAAAsT,EAAY,kBAAAE,EAAmB,cAAAC,CAAA,EAAkBb,GAAA,EAEhE,OACEvR,EAAAA,IAACiC,GAAAA,KAAA,CACC,IAAAF,EACA,GAAIkQ,EACJ,mBAAmBtT,EAAiC,GAAGwT,CAAiB,IAAIC,CAAa,GAA9D,GAAGD,CAAiB,GAC/C,eAAc,CAAC,CAACxT,EACf,GAAGmD,CAAA,CAAA,CAGV,CAAC,EACDoQ,EAAY,YAAc,cAE1B,MAAMG,GAAkB3Q,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ,CACzE,KAAM,CAAE,kBAAAoQ,CAAA,EAAsBZ,GAAA,EAE9B,OAAOvR,EAAAA,IAAC,IAAA,CAAE,IAAA+B,EAAU,GAAIoQ,EAAmB,UAAW/R,EAAG,sCAAuCuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CACzH,CAAC,EACDuQ,GAAgB,YAAc,kBAE9B,MAAMC,EAAc5Q,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,CAAA,EAASC,IAAQ,CAC/E,KAAM,CAAE,MAAApD,EAAO,cAAAyT,CAAA,EAAkBb,GAAA,EAC3BgB,EAAO5T,EAAQ,QAAOA,GAAA,YAAAA,EAAO,UAAW,EAAE,EAAIlC,EAEpD,OAAK8V,EAKHvS,EAAAA,IAAC,IAAA,CAAE,IAAA+B,EAAU,GAAIqQ,EAAe,UAAWhS,EAAG,6CAA8CuB,CAAS,EAAI,GAAGG,EACzG,SAAAyQ,CAAA,CACH,EANO,IAQX,CAAC,EACDD,EAAY,YAAc,cC9F1B,MAAME,GAASC,EAAgB,KAEzBC,GAAgBD,EAAgB,QAEhCE,GAAeF,EAAgB,OAE/BG,GAAcH,EAAgB,MAE9BI,GAAgBnR,EAAM,WAC1B,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IACxB/B,EAAAA,IAACyS,EAAgB,QAAhB,CACC,IAAA1Q,EACA,UAAW3B,EACT,yJACAuB,CAAA,EAED,GAAGG,CAAA,CAAA,CAGV,EACA+Q,GAAc,YAAcJ,EAAgB,QAAQ,YAEpD,MAAMK,GAAgBpR,EAAM,WAC1B,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,CAAA,EAASC,IAClCX,EAAAA,KAACuR,GAAA,CACC,SAAA,CAAA3S,EAAAA,IAAC6S,GAAA,EAAc,EACfzR,EAAAA,KAACqR,EAAgB,QAAhB,CACC,IAAA1Q,EACA,UAAW3B,EACT,8fACAuB,CAAA,EAED,GAAGG,EAEH,SAAA,CAAArF,EACD2E,EAAAA,KAACqR,EAAgB,MAAhB,CAAsB,UAAU,gRAC/B,SAAA,CAAAzS,EAAAA,IAAC+S,EAAAA,EAAA,CAAE,UAAU,QAAA,CAAS,EACtB/S,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,OAAA,CAAK,CAAA,CAAA,CACjC,CAAA,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,EACA8S,GAAc,YAAcL,EAAgB,QAAQ,YAEpD,SAASO,GAAa,CAAE,UAAArR,EAAW,GAAGG,GAAS,CAC7C,OAAO9B,EAAAA,IAAC,OAAI,UAAWI,EAAG,qDAAsDuB,CAAS,EAAI,GAAGG,EAAO,CACzG,CACAkR,GAAa,YAAc,eAE3B,SAASC,GAAa,CAAE,UAAAtR,EAAW,GAAGG,GAAS,CAC7C,OAAO9B,EAAAA,IAAC,OAAI,UAAWI,EAAG,gEAAiEuB,CAAS,EAAI,GAAGG,EAAO,CACpH,CACAmR,GAAa,YAAc,eAE3B,MAAMC,GAAcxR,EAAM,WACxB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IACxB/B,EAAAA,IAACyS,EAAgB,MAAhB,CAAsB,IAAA1Q,EAAU,UAAW3B,EAAG,oDAAqDuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CAE/H,EACAoR,GAAY,YAAcT,EAAgB,MAAM,YAEhD,MAAMU,GAAoBzR,EAAM,WAC9B,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAAQ/B,EAAAA,IAACyS,EAAgB,YAAhB,CAA4B,IAAA1Q,EAAU,UAAW3B,EAAG,gCAAiCuB,CAAS,EAAI,GAAGG,CAAA,CAAO,CACjJ,EACAqR,GAAkB,YAAcV,EAAgB,YAAY,YCjErD,MAAMW,GAAoB,CAACtW,EAAa,KAAUuW,EAAAA,EACtD,OAAO,CACN,KAAMvW,EAAauW,IAAE,OAAM,EAAG,SAAQ,EAAKA,EAAAA,EAAE,OAAM,EACnD,MAAOA,EAAAA,EAAE,OAAM,EAAG,IAAI,EAAG,mBAAmB,EAC5C,YAAaA,EAAAA,EAAE,OAAM,EAAG,IAAI,EAAG,yBAAyB,EACxD,UAAWA,EAAAA,EAAE,KAAK,CAAE,eAAgB,wBAAwB,CAAE,EAC9D,UAAWA,EAAAA,EAAE,OAAO,CAAE,KAAMA,EAAAA,EAAE,OAAM,EAAI,OAAQA,EAAAA,EAAE,OAAM,CAAE,EAAI,CAAE,eAAgB,wBAAwB,CAAE,EAC1G,QAASA,EAAAA,EAAE,KAAK,CAAE,eAAgB,sBAAsB,CAAE,EAC1D,QAASA,EAAAA,EAAE,OAAO,CAAE,KAAMA,EAAAA,EAAE,OAAM,EAAI,OAAQA,EAAAA,EAAE,OAAM,CAAE,EAAI,CAAE,eAAgB,sBAAsB,CAAE,EACtG,MAAOA,EAAAA,EAAE,KAAK,CAAC,OAAQ,QAAS,MAAO,SAAU,SAAU,SAAU,MAAM,EAAG,CAAE,eAAgB,mBAAmB,CAAE,CACzH,CAAG,EACA,OACCC,GAAQ,CACN,MAAMC,EAAgB,IAAI,KAAKD,EAAK,SAAS,EAC7CC,EAAc,SAASD,EAAK,UAAU,KAAMA,EAAK,UAAU,OAAQ,EAAG,CAAC,EAEvE,MAAME,EAAc,IAAI,KAAKF,EAAK,OAAO,EACzC,OAAAE,EAAY,SAASF,EAAK,QAAQ,KAAMA,EAAK,QAAQ,OAAQ,EAAG,CAAC,EAE1DC,EAAgBC,CACzB,EACA,CACE,QAAS,sCACT,KAAM,CAAC,WAAW,CACxB,CACA,EAGaC,GAAcL,GAAkB,EAAK,ECL3C,SAASM,EAAe,CAAE,SAAAjX,EAAU,UAAAd,EAAW,UAAAgY,EAAW,eAAAC,EAAgB,mBAAAC,EAAqB,IAAQ,CAC5G,KAAM,CAAE,MAAA7V,EAAO,YAAAoB,EAAa,WAAAtC,EAAY,YAAAC,CAAA,EAAgBkD,EAAA,EAElD,CAAE,OAAA0O,EAAQ,QAAAiC,EAAS,SAAAC,CAAA,EAAapC,GAAA,EAEhCqF,EAAOC,GAAAA,QAAQ,CACnB,SAAUC,GAAYZ,GAAkBtW,CAAU,CAAC,EACnD,cAAe,CACb,MAAO,GACP,YAAa,GACb,KAAMA,GAAcC,EAAcA,EAAY,GAAK,OACnD,UAAW,OAAOpB,EAAc,IAAcA,EAAY,OAC1D,UAAW,OAAOgY,EAAc,IAAcA,EAAY,MAAA,CAC5D,CACD,EAEKM,EAAW,MAAOC,GAAW,CACjC,GAAI,CAEF,MAAMjQ,EAAOnH,EACTC,EACAiB,EAAM,KAAKiG,GAAQA,EAAK,KAAOiQ,EAAO,IAAI,EAE9C,GAAI,CAACjQ,EAAM,CACJnH,GACHgX,EAAK,SAAS,OAAQ,CAAE,QAAS,iBAAkB,EAErD,MACF,CAEA,MAAMP,EAAgB,IAAI,KAAKW,EAAO,SAAS,EAC/CX,EAAc,SAASW,EAAO,UAAU,KAAMA,EAAO,UAAU,OAAQ,EAAG,CAAC,EAE3E,MAAMV,EAAc,IAAI,KAAKU,EAAO,OAAO,EAC3CV,EAAY,SAASU,EAAO,QAAQ,KAAMA,EAAO,QAAQ,OAAQ,EAAG,CAAC,EAErE,MAAM5U,EAAY,CAChB,KAAA2E,EACA,MAAOiQ,EAAO,MACd,MAAOA,EAAO,MACd,YAAaA,EAAO,YACpB,UAAWX,EAAc,YAAA,EACzB,QAASC,EAAY,YAAA,CAAY,EAG7BjU,EAAW,MAAMH,EAAYE,CAAS,EAC5CsU,GAAA,MAAAA,EAAiBrU,GACjBqR,EAAA,EACAkD,EAAK,MAAA,CACP,OAASnV,EAAO,CACd,QAAQ,MAAM,0BAA2BA,CAAK,CAEhD,CACF,EAEAF,OAAAA,EAAAA,UAAU,IAAM,CACdqV,EAAK,MAAM,CACT,UAAAnY,EACA,UAAAgY,CAAA,CACD,CACH,EAAG,CAAChY,EAAWgY,EAAWG,CAAI,CAAC,EAG7B1S,EAAAA,KAACoR,GAAA,CAAO,KAAM7D,EAAQ,aAAckC,EAClC,SAAA,CAAA7Q,EAAAA,IAAC0S,GAAA,CAAc,QAAO,GAAE,SAAAjW,CAAA,CAAS,SAEhCqW,GAAA,CACC,SAAA,CAAA1R,OAAC4R,GAAA,CACC,SAAA,CAAAhT,EAAAA,IAACkT,IAAY,SAAA,eAAA,CAAa,EACzBW,GACC7T,EAAAA,IAACmT,GAAA,CAAkB,UAAU,OAAO,SAAA,2FAAA,CAEpC,CAAA,EAEJ,EAEAnT,EAAAA,IAACkR,GAAA,CAAM,GAAG4C,EACR,gBAAC,OAAA,CAAK,GAAG,aAAa,SAAUA,EAAK,aAAaG,CAAQ,EAAG,UAAU,kBACpE,SAAA,CAAA,CAACnX,GACAkD,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,OACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,aAAA,CAAW,EACtBhS,EAAAA,IAACkS,GACC,SAAA9Q,EAAAA,KAAC6B,EAAA,CAAO,MAAOkR,EAAM,MAAO,cAAeA,EAAM,SAC/C,SAAA,CAAAnU,EAAAA,IAACqD,EAAA,CAAc,eAAcyO,EAAW,QACtC,eAAC1O,EAAA,CAAY,YAAY,mBAAmB,CAAA,CAC9C,EAEApD,MAAC0D,EAAA,CACE,SAAA1F,EAAM,OACLgC,MAAC6D,EAAA,CAAyB,MAAOI,EAAK,GAAI,UAAU,SAClD,SAAA7C,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAACyB,GAAA,CAAqB,UAAU,SAC9B,SAAA,CAAA7C,MAAC+C,IAAY,IAAKkB,EAAK,aAAe,OAAW,IAAKA,EAAK,KAAM,QAChEjB,GAAA,CAAe,UAAU,WAAY,SAAAiB,EAAK,KAAK,CAAC,CAAA,CAAE,CAAA,CAAA,EAFxCA,EAAK,EAGlB,EAEAjE,EAAAA,IAAC,IAAA,CAAE,UAAU,WAAY,WAAK,IAAA,CAAK,CAAA,CAAA,CACrC,CAAA,EAReiE,EAAK,EAStB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,QACCqO,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAKNtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,QACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,EAAA,CAAU,QAAQ,QAAQ,SAAA,QAAK,EAEhChS,EAAAA,IAACkS,EAAA,CACC,SAAAlS,EAAAA,IAAC8O,GAAA,CAAM,GAAG,QAAQ,YAAY,gBAAgB,eAAcgD,EAAW,QAAU,GAAGqC,EAAO,EAC7F,QAEC7B,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJlR,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,YACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,EAAA,CAAU,QAAQ,YAAY,SAAA,aAAU,QAExCE,EAAA,CACC,SAAAlS,EAAAA,IAACuQ,GAAA,CACC,GAAG,YACH,MAAO4D,EAAM,MACb,SAAUrV,GAAQqV,EAAM,SAASrV,CAAI,EACrC,YAAY,gBACZ,eAAcgT,EAAW,OAAA,CAAA,EAE7B,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,YACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,YAAA,CAAU,EAErBhS,MAACkS,EAAA,CACC,SAAAlS,EAAAA,IAACiP,EAAA,CAAU,MAAOkF,EAAM,MAAO,SAAUA,EAAM,SAAU,UAAW,GAAI,eAAcrC,EAAW,QAAS,EAC5G,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CAEJ,EACF,EAEAlR,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,UACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,UAAA,CAAQ,QAClBE,EAAA,CACC,SAAAlS,EAAAA,IAACuQ,GAAA,CACC,MAAO4D,EAAM,MACb,SAAUrV,GAAQqV,EAAM,SAASrV,CAAI,EACrC,YAAY,gBACZ,eAAcgT,EAAW,OAAA,CAAA,EAE7B,QACCQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,UACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,UAAA,CAAQ,EAEnBhS,MAACkS,EAAA,CACC,SAAAlS,EAAAA,IAACiP,EAAA,CAAU,MAAOkF,EAAM,MAAO,SAAUA,EAAM,SAAU,UAAW,GAAI,eAAcrC,EAAW,QAAS,EAC5G,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CAEJ,EACF,EAEAtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,QACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,OAAA,CAAK,EAChBhS,EAAAA,IAACkS,GACC,SAAA9Q,EAAAA,KAAC6B,EAAA,CAAO,MAAOkR,EAAM,MAAO,cAAeA,EAAM,SAC/C,SAAA,CAAAnU,EAAAA,IAACqD,EAAA,CAAc,eAAcyO,EAAW,QACtC,eAAC1O,EAAA,CAAY,YAAY,mBAAmB,CAAA,CAC9C,SAECM,EAAA,CACC,SAAA,CAAA1D,EAAAA,IAAC6D,GAAW,MAAM,OAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,mCAAA,CAAoC,EAAE,MAAA,CAAA,CAEvD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,QAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EAAE,OAAA,CAAA,CAExD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,MAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAA,CAAmC,EAAE,KAAA,CAAA,CAEtD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,SAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,EAAE,QAAA,CAAA,CAEzD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,SAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,EAAE,QAAA,CAAA,CAEzD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,SAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,EAAE,QAAA,CAAA,CAEzD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,OAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,EAAE,MAAA,CAAA,CAE1D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,QACCsS,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,cACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,aAAA,CAAW,EAEtBhS,EAAAA,IAACkS,EAAA,CACC,SAAAlS,EAAAA,IAACgP,GAAA,CAAU,GAAGmF,EAAO,MAAOA,EAAM,MAAO,eAAcrC,EAAW,OAAA,CAAS,EAC7E,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CACF,SAECW,GAAA,CACC,SAAA,CAAAjT,EAAAA,IAAC4S,GAAA,CAAY,QAAO,GAClB,SAAA5S,EAAAA,IAACyB,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,SAAA,QAAA,CAExC,EACF,QAECA,EAAA,CAAO,KAAK,aAAa,KAAK,SAAS,SAAA,cAAA,CAExC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CClTO,SAAS2S,GAAe,CAC7B,KAAA3P,EACA,OAAAvG,EACA,aAAAmW,EACA,gBAAAC,EAAkB,GAClB,kBAAAC,EAAoB,GACpB,iBAAAC,EAAmB,GACnB,eAAAC,EAAiB,GACjB,mBAAAC,EAAqB,GACrB,eAAAC,EAAiB,CAAC,MAAO,OAAQ,QAAS,OAAQ,QAAQ,EAC1D,UAAAhT,EACA,qBAAAiT,EACA,sBAAAC,EACA,sBAAAC,EACA,mBAAAC,CACF,EAAG,CACD,KAAM,CAAE,WAAAjY,CAAA,EAAemD,EAAA,EAEjB+U,EAAoBC,GAAY,CAChCZ,GACFA,EAAaY,CAAO,CAExB,EAGMC,EAAuBT,GAAkB,CAAC3X,EAEhD,cACG,MAAA,CAAI,UAAWsD,EAAG,kFAAmFuB,CAAS,EAC3G,SAAA,EAAA2S,GAAmBC,IACnBnT,EAAAA,KAAC,MAAA,CAAI,UAAWhB,EAAG,0BAA2BwU,CAAoB,EAC/D,SAAA,CAAAN,SAAoBpQ,GAAA,EAAY,EAChCqQ,GAAqBvU,EAAAA,IAACyK,GAAA,CAAc,KAAAhG,EAAY,OAAAvG,CAAA,CAAgB,CAAA,EACnE,GAGAsW,GAAoBC,GAAkBC,IACtCtT,EAAAA,KAAC,OAAI,UAAWhB,EAAG,oEAAqEyU,CAAqB,EACzG,SAAA,EAAAL,GAAoBC,IACpBrT,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACZ,SAAA,CAAAoT,UACE,MAAA,CAAI,UAAWpU,EAAG,2GAA4G0U,CAAqB,EACjJ,SAAA,CAAAH,EAAe,SAAS,KAAK,GAC5B3U,EAAAA,IAACyB,EAAA,CACC,aAAW,cACX,KAAK,OACL,QAASgD,IAAS,MAAQ,UAAY,UACtC,UAAU,gCACV,QAAS,IAAMuQ,EAAiB,KAAK,EAErC,SAAAhV,EAAAA,IAACmV,EAAAA,KAAA,CAAK,YAAa,GAAA,CAAK,CAAA,CAAA,EAI3BR,EAAe,SAAS,MAAM,GAC7B3U,EAAAA,IAACyB,EAAA,CACC,aAAW,eACX,KAAK,OACL,QAASgD,IAAS,OAAS,UAAY,UACvC,UAAU,qCACV,QAAS,IAAMuQ,EAAiB,MAAM,EAEtC,SAAAhV,EAAAA,IAACoV,EAAAA,QAAA,CAAQ,YAAa,GAAA,CAAK,CAAA,CAAA,EAI9BT,EAAe,SAAS,OAAO,GAC9B3U,EAAAA,IAACyB,EAAA,CACC,aAAW,gBACX,KAAK,OACL,QAASgD,IAAS,QAAU,UAAY,UACxC,UAAU,qCACV,QAAS,IAAMuQ,EAAiB,OAAO,EAEvC,SAAAhV,EAAAA,IAACqV,EAAAA,QAAA,CAAQ,YAAa,GAAA,CAAK,CAAA,CAAA,EAI9BV,EAAe,SAAS,MAAM,GAC7B3U,EAAAA,IAACyB,EAAA,CACC,aAAW,eACX,KAAK,OACL,QAASgD,IAAS,OAAS,UAAY,UACvC,UAAU,qCACV,QAAS,IAAMuQ,EAAiB,MAAM,EAEtC,SAAAhV,EAAAA,IAACsV,EAAAA,QAAA,CAAQ,YAAa,GAAA,CAAK,CAAA,CAAA,EAI9BX,EAAe,SAAS,QAAQ,GAC/B3U,EAAAA,IAACyB,EAAA,CACC,aAAW,iBACX,KAAK,OACL,QAASgD,IAAS,SAAW,UAAY,UACzC,UAAU,uCACV,QAAS,IAAMuQ,EAAiB,QAAQ,EAExC,SAAAhV,EAAAA,IAACuV,EAAAA,cAAA,CAAc,YAAa,GAAA,CAAK,CAAA,CAAA,CACnC,EAEJ,EAGDL,SAAyBlR,GAAA,CAAA,CAAW,CAAA,EACvC,EAGD0Q,SACEhB,EAAA,CACC,SAAAtS,EAAAA,KAACK,GAAO,UAAWrB,EAAG,mBAAoB2U,CAAkB,EAC1D,SAAA,CAAA/U,EAAAA,IAACwV,EAAAA,KAAA,EAAK,EAAE,WAAA,CAAA,CAEV,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EAEJ,CAEJ,CChJO,SAASC,GAAgB,CAAE,IAAArO,EAAK,KAAAtI,EAAM,OAAAZ,GAAU,CACrD,KAAM,CAAE,gBAAAL,CAAA,EAAoBoC,EAAA,EAEtByV,EAAgB,EAChBhL,EAAaxM,EAAO,OAEpBkG,EAAc,IAAM,CACxBvG,EAAgBiB,CAAI,CACtB,EAEA,OACEsC,EAAAA,KAAC,SAAA,CACC,QAASgD,EACT,KAAK,SACL,UAAU,uKAEV,SAAA,CAAApE,EAAAA,IAAC,MAAA,CACC,UAAWI,EACT,2EACAuV,EAAAA,QAAQ7W,CAAI,GAAK,kDAAA,EAGlB,SAAAsI,CAAA,CAAA,EAGFsD,EAAa,GACZ1K,EAAAA,IAAC,MAAA,CAAI,UAAU,sBACZ,SAAA0K,GAAcgL,EACbxX,EAAO,IAAIkI,GACTpG,EAAAA,IAAC,MAAA,CAEC,UAAWI,EACT,wBACAgG,EAAM,QAAU,QAAU,cAC1BA,EAAM,QAAU,SAAW,eAC3BA,EAAM,QAAU,OAAS,aACzBA,EAAM,QAAU,UAAY,gBAC5BA,EAAM,QAAU,UAAY,gBAC5BA,EAAM,QAAU,UAAY,gBAC5BA,EAAM,QAAU,QAAU,gBAAA,CAC5B,EAVKA,EAAM,EAAA,CAYd,EAEDhF,EAAAA,KAAAsB,WAAA,CACE,SAAA,CAAA1C,EAAAA,IAAC,MAAA,CACC,UAAWI,EACT,wBACAlC,EAAO,CAAC,EAAE,QAAU,QAAU,cAC9BA,EAAO,CAAC,EAAE,QAAU,SAAW,eAC/BA,EAAO,CAAC,EAAE,QAAU,OAAS,aAC7BA,EAAO,CAAC,EAAE,QAAU,UAAY,gBAChCA,EAAO,CAAC,EAAE,QAAU,UAAY,gBAChCA,EAAO,CAAC,EAAE,QAAU,UAAY,eAAA,CAClC,CAAA,EAEFkD,EAAAA,KAAC,OAAA,CAAK,UAAU,mCAAmC,SAAA,CAAA,IAAEsJ,EAAa,CAAA,CAAA,CAAE,CAAA,CAAA,CACtE,CAAA,CAEJ,CAAA,CAAA,CAAA,CAIR,CC9DO,SAASkL,GAAc,CAAE,MAAA3M,EAAO,OAAA/K,GAAU,CAC/C,KAAM,CAAE,gBAAAL,CAAA,EAAoBoC,EAAA,EAEtB4V,EAAY1Q,EAAAA,OAAO8D,EAAO,MAAM,EAEhCE,EAAc1G,EAAAA,QAAQ,IAAM,CAChC,MAAM6G,EAAYP,EAAAA,eAAeE,CAAK,EAChC6M,EAAWjR,EAAAA,aAAaoE,CAAK,EAAE,OAAA,EAE/B8M,EAAO,MAAM,KAAK,CAAE,OAAQzM,CAAA,EAAa,CAACX,EAAGpN,IAAMA,EAAI,CAAC,EAG9D,MAAO,CAAC,GAFO,MAAMua,CAAQ,EAAE,KAAK,IAAI,EAErB,GAAGC,CAAI,CAC5B,EAAG,CAAC9M,CAAK,CAAC,EAEJ+M,EAAW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAE3D5R,EAAc,IAAM,CACxBvG,EAAgB,IAAI,KAAKoL,EAAM,YAAA,EAAeA,EAAM,WAAY,CAAC,CAAC,CACpE,EAEA,OACE7H,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAApB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASoE,EACT,UAAU,qJAET,SAAAyR,CAAA,CAAA,EAGHzU,EAAAA,KAAC,MAAA,CAAI,UAAU,sDACb,SAAA,CAAApB,MAAC,MAAA,CAAI,UAAU,yCACZ,SAAAgW,EAAS,IAAI,CAAC5O,EAAKzH,IAClBK,EAAAA,IAAC,OAAgB,UAAU,4CACxB,SAAAoH,CAAA,EADOzH,CAEV,CACD,EACH,EAEAK,MAAC,OAAI,UAAU,qCACZ,WAAY,IAAI,CAACoH,EAAKzH,IAAU,CAC/B,GAAIyH,IAAQ,KAAM,OAAOpH,EAAAA,IAAC,OAA2B,UAAU,QAA5B,SAASL,CAAK,EAAqB,EAEtE,MAAMb,EAAO,IAAI,KAAKmK,EAAM,cAAeA,EAAM,SAAA,EAAY7B,CAAG,EAC1DX,EAAYvI,EAAO,OAAOkI,GAASF,EAAAA,UAAUK,EAAAA,SAASH,EAAM,SAAS,EAAGtH,CAAI,GAAKoH,YAAUK,EAAAA,SAASH,EAAM,OAAO,EAAGtH,CAAI,CAAC,EAE/H,OAAOkB,MAACyV,IAAmC,IAAArO,EAAU,KAAAtI,EAAY,OAAQ2H,GAA5C,OAAOW,CAAG,EAA6C,CACtF,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCrDO,SAAS6O,GAAiB,CAAE,UAAAC,GAAa,CAC9C,KAAM,CAAE,aAAAtY,CAAA,EAAiBqC,EAAA,EAEnBkW,EAAS1T,EAAAA,QAAQ,IAAM,CAC3B,MAAM2T,EAAYrR,EAAAA,YAAYnH,CAAY,EAC1C,OAAO,MAAM,KAAK,CAAE,OAAQ,EAAA,EAAM,CAAC+K,EAAGpN,IAAM+J,EAAAA,UAAU8Q,EAAW7a,CAAC,CAAC,CACrE,EAAG,CAACqC,CAAY,CAAC,EAEjB,OACEoC,MAAC,OAAI,UAAU,MACb,eAAC,MAAA,CAAI,UAAU,sEACZ,SAAAmW,EAAO,OACNnW,EAAAA,IAAC4V,GAAA,CAAqC,MAAA3M,EAAc,OAAQiN,CAAA,EAAxCjN,EAAM,SAAA,CAA6C,CACxE,CAAA,CACH,CAAA,CACF,CAEJ,CCpBA,MAAMoN,GAAsB7U,GAAAA,IAAI,sBAAuB,CACrD,SAAU,CACR,MAAO,CACL,KAAM,+BACN,MAAO,iCACP,IAAK,6BACL,OAAQ,mCACR,OAAQ,mCACR,KAAM,qCACN,OAAQ,kCAAA,CACV,EAEF,gBAAiB,CACf,MAAO,MAAA,CAEX,CAAC,EAEM,SAAS8U,GAAY,CAAE,MAAAC,EAAO,UAAA5U,GAAa,CAChD,OAAO3B,MAAC,MAAA,CAAI,UAAWI,EAAGiW,GAAoB,CAAE,MAAAE,EAAO,UAAA5U,EAAW,CAAC,EAAG,CACxE,CCbO,SAAS6U,IAAiB,CAC/B,KAAM,CAAE,YAAA/W,GAAgBQ,IAExB,MAAO,CAAE,YAAAR,CAAW,CACtB,CCRO,MAAMgX,GAAY,CACvB,MAAO,OACT,EAEO,SAASC,GAAe,CAAE,MAAAtQ,EAAO,SAAA3J,GAAY,CAClD,MAAMsF,EAAM4U,EAAAA,OAAO,IAAI,EAEjB,CAAC,CAAE,WAAAlW,CAAA,EAAcmW,EAAMC,CAAO,EAAIC,GAAAA,QAAQ,KAAO,CACrD,KAAML,GAAU,MAChB,KAAM,IAAM,SACV,MAAM3O,IAAQwD,EAAAvJ,EAAI,UAAJ,YAAAuJ,EAAa,cAAe,EACpCyL,IAASpL,EAAA5J,EAAI,UAAJ,YAAA4J,EAAa,eAAgB,EAC5C,MAAO,CAAE,MAAAvF,EAAO,SAAA3J,EAAU,MAAAqL,EAAO,OAAAiP,CAAA,CACnC,EACA,QAAShW,IAAY,CAAE,WAAYA,EAAQ,YAAW,EAAE,EACxD,EAGFtC,OAAAA,EAAAA,UAAU,IAAM,CACdoY,EAAQG,GAAAA,cAAA,EAAiB,CAAE,qBAAsB,GAAM,CACzD,EAAG,CAACH,CAAO,CAAC,EAEZD,EAAK7U,CAAG,EAGN/B,EAAAA,IAAC,OAAI,IAAA+B,EAAU,UAAW3B,EAAGK,GAAc,YAAY,EACpD,SAAAhE,EACH,CAEJ,CC3BO,SAASwa,GAAiB,CAAE,KAAAC,EAAM,SAAAza,GAAY,CACnD,KAAM,CAAE,YAAAgD,CAAA,EAAgB+W,GAAA,EAElB,CAAC,CAAE,OAAAW,EAAQ,QAAAC,CAAA,EAAWC,CAAI,EAAIC,GAAAA,QAClC,KAAO,CACL,OAAQb,GAAU,MAClB,KAAO/V,GAAS,CACd,MAAM6W,EAAe7W,EAAK,MAEpB8W,EAAiBjR,EAAAA,SAASgR,EAAa,SAAS,EAChDE,EAAelR,EAAAA,SAASgR,EAAa,OAAO,EAE5CG,EAAkBC,EAAAA,yBAAyBF,EAAcD,CAAc,EAEvEI,EAAe,IAAI,KAAKV,EAAK,IAAI,EACvCU,EAAa,SAASJ,EAAe,SAAA,EAAYA,EAAe,WAAA,EAAcA,EAAe,WAAA,EAAcA,EAAe,gBAAA,CAAiB,EAC3I,MAAMK,EAAa,IAAI,KAAKD,EAAa,QAAA,EAAYF,CAAe,EAEpE,OAAAjY,EAAY,CACV,GAAG8X,EACH,UAAWK,EAAa,YAAA,EACxB,QAASC,EAAW,YAAA,CAAY,CACjC,EAEM,CAAE,MAAO,EAAA,CAClB,EACA,QAAS9W,IAAY,CACnB,OAAQA,EAAQ,OAAA,EAChB,QAASA,EAAQ,QAAA,CAAQ,EAC3B,GAEF,CAACmW,EAAK,KAAMzX,CAAW,CAAA,EAGzB,OACEO,MAAC,MAAA,CAAI,IAAKqX,EAAM,UAAWjX,EAAG+W,GAAUC,GAAW,cAAc,EAC9D,SAAA3a,CAAA,CACH,CAEJ,CCnBO,SAASqb,GAAgB,CAAE,SAAArb,EAAU,MAAA2J,EAAO,eAAA2R,EAAgB,mBAAAlE,EAAqB,IAAQ,CAC9F,KAAM,CAAE,OAAAlF,EAAQ,QAAAiC,EAAS,SAAAC,CAAA,EAAapC,GAAA,EAEhC,CAAE,MAAAzQ,EAAO,YAAAyB,EAAa,WAAA3C,EAAY,YAAAC,CAAA,EAAgBkD,EAAA,EAElD6T,EAAOC,GAAAA,QAAQ,CACnB,SAAUC,GAAYZ,GAAkBtW,CAAU,CAAC,EACnD,cAAe,CACb,KAAMA,IAAcC,GAAA,YAAAA,EAAa,KAAMqJ,EAAM,KAAK,GAClD,MAAOA,EAAM,MACb,YAAaA,EAAM,YACnB,UAAWG,EAAAA,SAASH,EAAM,SAAS,EACnC,UAAW,CAAE,KAAMG,EAAAA,SAASH,EAAM,SAAS,EAAE,WAAY,OAAQG,EAAAA,SAASH,EAAM,SAAS,EAAE,YAAW,EACtG,QAASG,EAAAA,SAASH,EAAM,OAAO,EAC/B,QAAS,CAAE,KAAMG,EAAAA,SAASH,EAAM,OAAO,EAAE,WAAY,OAAQG,EAAAA,SAASH,EAAM,OAAO,EAAE,YAAW,EAChG,MAAOA,EAAM,KAAA,CACf,CACD,EAEK6N,EAAW,MAAOC,GAAW,CACjC,GAAI,CAEF,MAAMjQ,EAAOnH,EACTC,EACAiB,EAAM,KAAKiG,GAAQA,EAAK,KAAOiQ,EAAO,IAAI,EAE9C,GAAI,CAACjQ,EAAM,CACJnH,GACHgX,EAAK,SAAS,OAAQ,CAAE,QAAS,iBAAkB,EAErD,MACF,CAEA,MAAMP,EAAgB,IAAI,KAAKW,EAAO,SAAS,EAC/CX,EAAc,SAASW,EAAO,UAAU,KAAMA,EAAO,UAAU,OAAQ,EAAG,CAAC,EAE3E,MAAMV,EAAc,IAAI,KAAKU,EAAO,OAAO,EAC3CV,EAAY,SAASU,EAAO,QAAQ,KAAMA,EAAO,QAAQ,OAAQ,EAAG,CAAC,EAErE,MAAMxU,EAAe,MAAMD,EAAY,CACrC,GAAG2G,EACH,KAAAnC,EACA,MAAOiQ,EAAO,MACd,MAAOA,EAAO,MACd,YAAaA,EAAO,YACpB,UAAWX,EAAc,YAAA,EACzB,QAASC,EAAY,YAAA,CAAY,CAClC,EAEDuE,GAAA,MAAAA,EAAiBrY,GACjBkR,EAAA,CACF,OAASjS,EAAO,CACd,QAAQ,MAAM,0BAA2BA,CAAK,CAEhD,CACF,EAEA,OACEyC,EAAAA,KAACoR,GAAA,CAAO,KAAM7D,EAAQ,aAAckC,EAClC,SAAA,CAAA7Q,EAAAA,IAAC0S,GAAA,CAAc,QAAO,GAAE,SAAAjW,CAAA,CAAS,SAEhCqW,GAAA,CACC,SAAA,CAAA1R,OAAC4R,GAAA,CACC,SAAA,CAAAhT,EAAAA,IAACkT,IAAY,SAAA,YAAA,CAAU,EACtBW,GACC7T,EAAAA,IAACmT,GAAA,CAAkB,UAAU,OAAO,SAAA,sFAAA,CAEpC,CAAA,EAEJ,EAEAnT,EAAAA,IAACkR,GAAA,CAAM,GAAG4C,EACR,gBAAC,OAAA,CAAK,GAAG,aAAa,SAAUA,EAAK,aAAaG,CAAQ,EAAG,UAAU,kBACpE,SAAA,CAAA,CAACnX,GACAkD,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,OACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,aAAA,CAAW,EACtBhS,EAAAA,IAACkS,GACC,SAAA9Q,EAAAA,KAAC6B,EAAA,CAAO,MAAOkR,EAAM,MAAO,cAAeA,EAAM,SAC/C,SAAA,CAAAnU,EAAAA,IAACqD,EAAA,CAAc,eAAcyO,EAAW,QACtC,eAAC1O,EAAA,CAAY,YAAY,mBAAmB,CAAA,CAC9C,EAEApD,MAAC0D,EAAA,CACE,SAAA1F,EAAM,OACLgC,MAAC6D,EAAA,CAAyB,MAAOI,EAAK,GAAI,UAAU,SAClD,SAAA7C,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAACyB,GAAA,CAAqB,UAAU,SAC9B,SAAA,CAAA7C,MAAC+C,IAAY,IAAKkB,EAAK,aAAe,OAAW,IAAKA,EAAK,KAAM,QAChEjB,GAAA,CAAe,UAAU,WAAY,SAAAiB,EAAK,KAAK,CAAC,CAAA,CAAE,CAAA,CAAA,EAFxCA,EAAK,EAGlB,EAEAjE,EAAAA,IAAC,IAAA,CAAE,UAAU,WAAY,WAAK,IAAA,CAAK,CAAA,CAAA,CACrC,CAAA,EAReiE,EAAK,EAStB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,QACCqO,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAKNtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,QACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,EAAA,CAAU,QAAQ,QAAQ,SAAA,QAAK,EAEhChS,EAAAA,IAACkS,EAAA,CACC,SAAAlS,EAAAA,IAAC8O,GAAA,CAAM,GAAG,QAAQ,YAAY,gBAAgB,eAAcgD,EAAW,QAAU,GAAGqC,EAAO,EAC7F,QAEC7B,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJlR,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,YACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,EAAA,CAAU,QAAQ,YAAY,SAAA,aAAU,QAExCE,EAAA,CACC,SAAAlS,EAAAA,IAACuQ,GAAA,CACC,GAAG,YACH,MAAO4D,EAAM,MACb,SAAUrV,GAAQqV,EAAM,SAASrV,CAAI,EACrC,YAAY,gBACZ,eAAcgT,EAAW,OAAA,CAAA,EAE7B,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,YACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,YAAA,CAAU,EAErBhS,MAACkS,EAAA,CACC,SAAAlS,EAAAA,IAACiP,EAAA,CAAU,MAAOkF,EAAM,MAAO,SAAUA,EAAM,SAAU,UAAW,GAAI,eAAcrC,EAAW,QAAS,EAC5G,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CAEJ,EACF,EAEAlR,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,UACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,UAAA,CAAQ,QAClBE,EAAA,CACC,SAAAlS,EAAAA,IAACuQ,GAAA,CACC,MAAO4D,EAAM,MACb,SAAUrV,GAAQqV,EAAM,SAASrV,CAAI,EACrC,YAAY,gBACZ,eAAcgT,EAAW,OAAA,CAAA,EAE7B,QACCQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,UACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,KAChB1Q,OAAC2Q,EAAA,CAAS,UAAU,SAClB,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,UAAA,CAAQ,EAEnBhS,MAACkS,EAAA,CACC,SAAAlS,EAAAA,IAACiP,EAAA,CAAU,MAAOkF,EAAM,MAAO,SAAUA,EAAM,SAAU,UAAW,GAAI,eAAcrC,EAAW,QAAS,EAC5G,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CAEJ,EACF,EAEAtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,QACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,OAAA,CAAK,EAChBhS,EAAAA,IAACkS,GACC,SAAA9Q,EAAAA,KAAC6B,EAAA,CAAO,MAAOkR,EAAM,MAAO,cAAeA,EAAM,SAC/C,SAAA,CAAAnU,EAAAA,IAACqD,EAAA,CAAc,eAAcyO,EAAW,QACtC,eAAC1O,EAAA,CAAY,YAAY,mBAAmB,CAAA,CAC9C,SAECM,EAAA,CACC,SAAA,CAAA1D,EAAAA,IAAC6D,GAAW,MAAM,OAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,mCAAA,CAAoC,EAAE,MAAA,CAAA,CAEvD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,QAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EAAE,OAAA,CAAA,CAExD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,MAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAA,CAAmC,EAAE,KAAA,CAAA,CAEtD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,SAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,EAAE,QAAA,CAAA,CAEzD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,SAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,EAAE,QAAA,CAAA,CAEzD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,SAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,EAAE,QAAA,CAAA,CAEzD,CAAA,CACF,QAEC6D,EAAA,CAAW,MAAM,OAChB,SAAAzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,EAAE,MAAA,CAAA,CAE1D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,QACCsS,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,EAIJtS,EAAAA,IAACqR,EAAA,CACC,QAASyC,EAAK,QACd,KAAK,cACL,OAAQ,CAAC,CAAE,MAAAK,EAAO,WAAArC,CAAA,WACfC,EAAA,CACC,SAAA,CAAA/R,EAAAA,IAACgS,GAAU,SAAA,aAAA,CAAW,EAEtBhS,EAAAA,IAACkS,EAAA,CACC,SAAAlS,EAAAA,IAACgP,GAAA,CAAU,GAAGmF,EAAO,MAAOA,EAAM,MAAO,eAAcrC,EAAW,OAAA,CAAS,EAC7E,QAECQ,EAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CACF,SAECW,GAAA,CACC,SAAA,CAAAjT,EAAAA,IAAC4S,GAAA,CAAY,QAAO,GAClB,SAAA5S,EAAAA,IAACyB,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,SAAA,QAAA,CAExC,EACF,QAECA,EAAA,CAAO,KAAK,aAAa,KAAK,SAAS,SAAA,cAAA,CAExC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCnUO,SAASuW,GAAmB,CAAE,MAAA5R,EAAO,SAAA3J,GAAY,CACtD,MAAMd,EAAY4K,EAAAA,SAASH,EAAM,SAAS,EACpCxK,EAAU2K,EAAAA,SAASH,EAAM,OAAO,EAEtC,OACEpG,EAAAA,IAAA0C,EAAAA,SAAA,CACE,gBAAC8P,GAAA,CACC,SAAA,CAAAxS,EAAAA,IAAC0S,GAAA,CAAc,QAAO,GAAE,SAAAjW,CAAA,CAAS,SAEhCqW,GAAA,CACC,SAAA,CAAA9S,EAAAA,IAACgT,GAAA,CACC,SAAAhT,MAACkT,GAAA,CAAa,SAAA9M,EAAM,MAAM,EAC5B,EAEAhF,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACiY,EAAAA,KAAA,CAAK,UAAU,sBAAA,CAAuB,SACtC,MAAA,CACC,SAAA,CAAAjY,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,cAAW,QAC7C,IAAA,CAAE,UAAU,gCAAiC,SAAAoG,EAAM,KAAK,IAAA,CAAK,CAAA,CAAA,CAChE,CAAA,EACF,EAEAhF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACkY,EAAAA,SAAA,CAAS,UAAU,sBAAA,CAAuB,SAC1C,MAAA,CACC,SAAA,CAAAlY,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,aAAU,QAC5C,IAAA,CAAE,UAAU,gCAAiC,SAAAmF,EAAAA,OAAOxJ,EAAW,oBAAoB,CAAA,CAAE,CAAA,CAAA,CACxF,CAAA,EACF,EAEAyF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACmY,EAAAA,MAAA,CAAM,UAAU,sBAAA,CAAuB,SACvC,MAAA,CACC,SAAA,CAAAnY,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,WAAQ,QAC1C,IAAA,CAAE,UAAU,gCAAiC,SAAAmF,EAAAA,OAAOvJ,EAAS,oBAAoB,CAAA,CAAE,CAAA,CAAA,CACtF,CAAA,EACF,EAEAwF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAApB,EAAAA,IAACoY,EAAAA,KAAA,CAAK,UAAU,sBAAA,CAAuB,SACtC,MAAA,CACC,SAAA,CAAApY,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,cAAW,EAC9CA,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,WAAM,WAAA,CAAY,CAAA,CAAA,CAClE,CAAA,CAAA,CACF,CAAA,EACF,EAEAA,MAACiT,GAAA,CACC,SAAAjT,EAAAA,IAAC8X,GAAA,CAAgB,MAAA1R,EACf,SAAApG,EAAAA,IAACyB,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,SAAA,MAAA,CAExC,EACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CCxDA,MAAM4W,GAAqB7W,GAAAA,IACzB,+MACA,CACE,SAAU,CACR,MAAO,CAEL,KAAM,iIACN,MAAO,wIACP,IAAK,0HACL,OAAQ,+IACR,OAAQ,+IACR,OAAQ,+IACR,KAAM,sJAGN,WAAY,iEACZ,YAAa,kEACb,UAAW,gEACX,aAAc,mEACd,aAAc,mEACd,aAAc,mEACd,WAAY,mEAAA,EAEd,iBAAkB,CAChB,MAAO,oFACP,OAAQ,kEACR,KAAM,iCACN,KAAM,EAAA,CACR,EAEF,gBAAiB,CACf,MAAO,UAAA,CACT,CAEJ,EAEO,SAAS8W,GAAgB,CAAE,MAAAlS,EAAO,SAAAmS,EAAU,gBAAAC,EAAiB,eAAAC,EAAgB,UAAA9W,EAAW,SAAU+W,GAAgB,CACvH,KAAM,CAAE,aAAArb,CAAA,EAAiB4C,EAAA,EAEnB0Y,EAAYrO,EAAAA,WAAW/D,EAAAA,SAASH,EAAM,SAAS,CAAC,EAChDwS,EAAUC,EAAAA,SAAStS,EAAAA,SAASH,EAAM,OAAO,CAAC,EAEhD,GAAImS,EAAWI,GAAaJ,EAAWK,EAAS,OAAO,KAEvD,IAAIjV,EAEA+U,EACF/U,EAAW+U,EACFF,GAAmBC,GAEnBvS,EAAAA,UAAUyS,EAAWC,CAAO,EADrCjV,EAAW,OAGFuC,EAAAA,UAAUqS,EAAUI,CAAS,EACtChV,EAAW,QACFuC,EAAAA,UAAUqS,EAAUK,CAAO,EACpCjV,EAAW,OAEXA,EAAW,SAGb,MAAMmV,EAAkB,CAAC,QAAS,MAAM,EAAE,SAASnV,CAAQ,EAErD4S,EAAQlZ,IAAiB,MAAQ,GAAG+I,EAAM,KAAK,OAASA,EAAM,MAE9D2S,EAAoB3Y,EAAGiY,GAAmB,CAAE,MAAA9B,EAAO,iBAAkB5S,EAAU,UAAAhC,CAAA,CAAW,CAAC,EAE3FqX,EAAiBpZ,GAAM,EACvBA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACEA,EAAE,yBAAyB,aAAaA,EAAE,cAAc,MAAA,EAEhE,EAEA,OACEI,EAAAA,IAAC0W,GAAA,CAAe,MAAAtQ,EACd,SAAApG,EAAAA,IAACgY,IAAmB,MAAA5R,EAClB,SAAAhF,EAAAA,KAAC,MAAA,CAAI,KAAK,SAAS,SAAU,EAAG,UAAW2X,EAAmB,UAAWC,EACvE,SAAA,CAAA5X,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACZ,SAAA,CAAA,CAAC,CAAC,SAAU,MAAM,EAAE,SAASuC,CAAQ,GAAK,CAAC,QAAS,KAAK,EAAE,SAAStG,CAAY,GAC/E2C,EAAAA,IAAC,MAAA,CAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,UAAU,UAAU,qBACpD,SAAAA,MAAC,SAAA,CAAO,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,EAC9B,EAGD8Y,GACC1X,EAAAA,KAAC,IAAA,CAAE,UAAU,gCACV,SAAA,CAAAoX,GACCpX,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAU,SAAA,CAAA,OACnBoX,EAAgB,OAAKC,EAAe,KAAG,GAAA,EAC9C,EAEDrS,EAAM,KAAA,CAAA,CACT,CAAA,EAEJ,EAEC0S,GAAmB9Y,EAAAA,IAAC,OAAA,CAAM,SAAAmF,EAAAA,OAAO,IAAI,KAAKiB,EAAM,SAAS,EAAG,QAAQ,CAAA,CAAE,CAAA,CAAA,CACzE,EACF,EACF,CAEJ,CCnGA,MAAM6S,GAAqB,EAEpB,SAASC,GAAQ,CAAE,KAAAhC,EAAM,OAAAhZ,EAAQ,eAAA4L,GAAkB,CACxD,KAAM,CAAE,gBAAAjM,CAAA,EAAoBoC,EAAA,EAEtB,CAAE,IAAAmH,EAAK,aAAA0B,EAAc,KAAAhK,CAAA,EAASoY,EAE9BiC,EAAa1W,EAAAA,QAAQ,IAAM+H,GAAmB1L,EAAMZ,EAAQ4L,CAAc,EAAG,CAAChL,EAAMZ,EAAQ4L,CAAc,CAAC,EAC3GsP,EAAWta,EAAK,OAAA,IAAa,EAE7BsF,EAAc,IAAM,CACxBvG,EAAgBiB,CAAI,CACtB,EAEA,OACEkB,EAAAA,IAACiX,GAAA,CAAiB,KAAAC,EAChB,SAAA9V,EAAAA,KAAC,MAAA,CAAI,UAAWhB,EAAG,sEAAuEgZ,GAAY,YAAY,EAChH,SAAA,CAAApZ,EAAAA,IAAC,SAAA,CACC,QAASoE,EACT,UAAWhE,EACT,2LACA,CAAC0I,GAAgB,aACjB6M,EAAAA,QAAQ7W,CAAI,GAAK,+DAAA,EAGlB,SAAAsI,CAAA,CAAA,EAGHpH,EAAAA,IAAC,MAAA,CAAI,UAAWI,EAAG,+DAAgE,CAAC0I,GAAgB,YAAY,EAC7G,UAAC,EAAG,EAAG,CAAC,EAAE,IAAInF,GAAY,CACzB,MAAMyC,EAAQ+S,EAAW,KAAKvZ,GAAKA,EAAE,WAAa+D,CAAQ,EACpD0V,EAAWjT,EAAQ,SAASA,EAAM,EAAE,IAAIzC,CAAQ,GAAK,SAASA,CAAQ,GAE5E,OACE3D,MAAC,MAAA,CAAmB,UAAU,YAC3B,YACCoB,EAAAA,KAAAsB,WAAA,CACE,SAAA,CAAA1C,EAAAA,IAACsW,GAAA,CAAY,UAAU,YAAY,MAAOlQ,EAAM,MAAO,EACvDpG,MAACsY,IAAgB,UAAU,iBAAiB,MAAAlS,EAAc,SAAUkE,aAAWxL,CAAI,CAAA,CAAG,CAAA,CAAA,CACxF,GALMua,CAOV,CAEJ,CAAC,CAAA,CACH,EAECF,EAAW,OAASF,IACnB7X,EAAAA,KAAC,IAAA,CAAE,UAAWhB,EAAG,2DAA4D,CAAC0I,GAAgB,YAAY,EACxG,SAAA,CAAA1H,EAAAA,KAAC,OAAA,CAAK,UAAU,YAAY,SAAA,CAAA,IAAE+X,EAAW,OAASF,EAAA,EAAmB,EACrE7X,EAAAA,KAAC,OAAA,CAAK,UAAU,mBAAmB,SAAA,CAAA,IAAE+X,EAAW,OAASF,GAAmB,UAAA,CAAA,CAAQ,CAAA,CAAA,CACtF,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CC3DA,MAAMK,GAAY,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAE3D,SAASC,GAAkB,CAAE,gBAAAlR,EAAiB,eAAAsB,GAAkB,CACrE,KAAM,CAAE,aAAA/L,CAAA,EAAiBqC,EAAA,EAEnBiW,EAAY,CAAC,GAAGvM,EAAgB,GAAGtB,CAAe,EAElDmR,EAAQ/W,EAAAA,QAAQ,IAAMmG,GAAiBhL,CAAY,EAAG,CAACA,CAAY,CAAC,EAEpEkM,EAAiBrH,EAAAA,QACrB,IAAMiH,GAA6BC,EAAgBtB,EAAiBzK,CAAY,EAChF,CAAC+L,EAAgBtB,EAAiBzK,CAAY,CAAA,EAGhD,cACG,MAAA,CACC,SAAA,CAAAoC,EAAAA,IAAC,OAAI,UAAU,4BACZ,YAAU,IAAIoH,SACZ,MAAA,CAAc,UAAU,wCACvB,SAAApH,EAAAA,IAAC,QAAK,UAAU,4CAA6C,WAAI,CAAA,EADzDoH,CAEV,CACD,CAAA,CACH,QAEC,MAAA,CAAI,UAAU,mCACZ,SAAAoS,EAAM,OACLxZ,EAAAA,IAACkZ,GAAA,CAAsC,KAAAhC,EAAY,OAAQhB,EAAW,eAAApM,CAAA,EAAxDoN,EAAK,KAAK,YAAA,CAA8E,CACvG,CAAA,CACH,CAAA,EACF,CAEJ,CClCA,MAAMuC,GAAa/X,EAAM,WACvB,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,CAAA,EAASC,IAClCX,EAAAA,KAACsY,EAAoB,KAApB,CAAyB,IAAA3X,EAAU,UAAW3B,EAAG,2BAA4BuB,CAAS,EAAI,GAAGG,EAC5F,SAAA,CAAA9B,EAAAA,IAAC0Z,EAAoB,SAApB,CAA6B,UAAU,8BAA+B,SAAAjd,EAAS,QAC/Ekd,GAAA,EAAU,EACX3Z,MAAC0Z,EAAoB,OAApB,CAAA,CAA2B,CAAA,CAAA,CAC9B,CAEJ,EACAD,GAAW,YAAcC,EAAoB,KAAK,YAElD,MAAMC,GAAYjY,EAAM,WACtB,CAAC,CAAE,UAAAC,EAAW,YAAAiY,EAAc,WAAY,GAAG9X,CAAA,EAASC,IAClD/B,EAAAA,IAAC0Z,EAAoB,oBAApB,CACC,IAAA3X,EACA,YAAA6X,EACA,UAAWxZ,EACT,gDACAwZ,IAAgB,YAAc,qDAC9BA,IAAgB,cAAgB,uDAChCjY,CAAA,EAED,GAAGG,EAEJ,SAAA9B,EAAAA,IAAC0Z,EAAoB,gBAApB,CAAoC,UAAU,wCAAA,CAAyC,CAAA,CAAA,CAG9F,EACAC,GAAU,YAAcD,EAAoB,oBAAoB,YCzBhE,MAAMG,GAA0BrY,GAAAA,IAC9B,4JACA,CACE,SAAU,CACR,MAAO,CAEL,KAAM,iIACN,MAAO,wIACP,IAAK,0HACL,OAAQ,+IACR,OAAQ,+IACR,OAAQ,+IACR,KAAM,sJAGN,WAAY,iEACZ,YAAa,kEACb,UAAW,gEACX,aAAc,mEACd,aAAc,mEACd,aAAc,mEACd,WAAY,mEAAA,CACd,EAEF,gBAAiB,CACf,MAAO,UAAA,CACT,CAEJ,EAEO,SAASsY,GAAgB,CAAE,MAAA1T,EAAO,gBAAAoS,EAAiB,eAAAC,EAAgB,UAAA9W,GAAa,CACrF,KAAM,CAAE,aAAAtE,CAAA,EAAiB4C,EAAA,EAEnBtE,EAAY4K,EAAAA,SAASH,EAAM,SAAS,EACpCxK,EAAU2K,EAAAA,SAASH,EAAM,OAAO,EAEhCmQ,EAAQlZ,IAAiB,MAAQ,GAAG+I,EAAM,KAAK,OAASA,EAAM,MAE9D2T,EAAyBF,GAAwB,CAAE,MAAAtD,EAAO,UAAA5U,EAAW,EAErEqX,EAAiBpZ,GAAM,EACvBA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACEA,EAAE,yBAAyB,aAAaA,EAAE,cAAc,MAAA,EAEhE,EAEA,aACGoY,GAAA,CAAmB,MAAA5R,EAClB,SAAApG,EAAAA,IAAC,MAAA,CAAI,KAAK,SAAS,SAAU,EAAG,UAAW+Z,EAAwB,UAAWf,EAC5E,SAAA5X,OAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAA,CAAC,QAAS,KAAK,EAAE,SAAS/D,CAAY,GACrC2C,EAAAA,IAAC,MAAA,CAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,UAAU,UAAU,qBACpD,SAAAA,EAAAA,IAAC,SAAA,CAAO,GAAG,IAAI,GAAG,IAAI,EAAE,GAAA,CAAI,CAAA,CAC9B,EAGFoB,EAAAA,KAAC,IAAA,CAAE,UAAU,cACV,SAAA,CAAAoX,GAAmBC,GAClBrX,OAAC,OAAA,CAAK,UAAU,eAAe,SAAA,CAAA,OACxBoX,EAAgB,OAAKC,EAAe,KAAG,GAAA,EAC9C,EAEDrS,EAAM,KAAA,CAAA,CACT,CAAA,EACF,EAEAhF,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAApB,EAAAA,IAACiY,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,QACjC,IAAA,CAAE,UAAU,0BAA2B,SAAA7R,EAAM,KAAK,IAAA,CAAK,CAAA,EAC1D,EAEAhF,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAACmY,EAAAA,MAAA,CAAM,UAAU,iBAAA,CAAkB,EACnC/W,EAAAA,KAAC,IAAA,CAAE,UAAU,0BACV,SAAA,CAAA+D,EAAAA,OAAOxJ,EAAW,QAAQ,EAAE,MAAIwJ,EAAAA,OAAOvJ,EAAS,QAAQ,CAAA,CAAA,CAC3D,CAAA,EACF,EAEAwF,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAACoY,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EAClCpY,EAAAA,IAAC,IAAA,CAAE,UAAU,0BAA2B,WAAM,WAAA,CAAY,CAAA,CAAA,CAC5D,CAAA,CAAA,CACF,EACF,EACF,CAEJ,CC5FO,SAASga,GAAe,CAAE,KAAAlb,EAAM,OAAAZ,EAAQ,eAAAyL,GAAkB,CAC/D,MAAMjD,EAAe,CAAC,GAAGxI,CAAM,EAAE,KAAK,CAACyI,EAAGC,IAAM,IAAI,KAAKD,EAAE,SAAS,EAAE,UAAY,IAAI,KAAKC,EAAE,SAAS,EAAE,SAAS,EAEjH,OACExF,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,0DACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAmF,EAAAA,OAAOrG,EAAM,oBAAoB,CAAA,CAAE,EAC3E,EAEAsC,EAAAA,KAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAAuI,EAAe,OAAS,GACvBA,EAAe,IAAIvD,GAAS,CAC1B,MAAMU,EAAawD,EAAAA,WAAW/D,EAAAA,SAASH,EAAM,SAAS,CAAC,EACjD+D,EAAWG,EAAAA,WAAW/D,EAAAA,SAASH,EAAM,OAAO,CAAC,EAC7C6T,EAAc3P,EAAAA,WAAWxL,CAAI,EAE7B2Z,EAAiBvO,EAAAA,iBAAiBC,EAAUrD,CAAU,EAAI,EAC1D0R,EAAkBtO,EAAAA,iBAAiB+P,EAAanT,CAAU,EAAI,EACpE,aAAQgT,GAAA,CAA+B,MAAA1T,EAAc,gBAAAoS,EAAkC,eAAAC,CAAA,EAA1DrS,EAAM,EAAoF,CACzH,CAAC,EAEFM,EAAa,OAAS,GAAKA,EAAa,IAAIN,GAASpG,EAAAA,IAAC8Z,GAAA,CAA+B,MAAA1T,GAAVA,EAAM,EAAkB,CAAE,CAAA,CAAA,CACxG,CAAA,EACF,CAEJ,CCpBO,SAAS8T,GAAmB,CAAE,gBAAA7R,EAAiB,eAAAsB,GAAkB,CACtE,KAAM,CAAE,aAAA/L,CAAA,EAAiBqC,EAAA,EAEnBka,EAAc1X,EAAAA,QAAQ,IAAM,CAChC,MAAM2X,MAAe,IAErB,OAAA/R,EAAgB,QAAQjC,GAAS,OAC/B,MAAMiU,EAAY9T,EAAAA,SAASH,EAAM,SAAS,EAC1C,GAAI,CAACJ,EAAAA,YAAYqU,EAAWzc,CAAY,EAAG,OAE3C,MAAM0c,EAAUnV,EAAAA,OAAOkV,EAAW,YAAY,EAEzCD,EAAS,IAAIE,CAAO,GACvBF,EAAS,IAAIE,EAAS,CAAE,KAAMhQ,EAAAA,WAAW+P,CAAS,EAAG,OAAQ,CAAA,EAAI,eAAgB,CAAA,EAAI,GAGvF/O,EAAA8O,EAAS,IAAIE,CAAO,IAApB,MAAAhP,EAAuB,OAAO,KAAKlF,EACrC,CAAC,EAEDuD,EAAe,QAAQvD,GAAS,OAC9B,MAAMU,EAAaP,EAAAA,SAASH,EAAM,SAAS,EACrC+D,EAAW5D,EAAAA,SAASH,EAAM,OAAO,EAEvC,IAAI6T,EAAc3P,EAAAA,WAAWxD,CAAU,EACvC,MAAMyT,EAAW1B,EAAAA,SAAS1O,CAAQ,EAElC,KAAO8P,GAAeM,GAAU,CAC9B,GAAIvU,EAAAA,YAAYiU,EAAarc,CAAY,EAAG,CAC1C,MAAM0c,EAAUnV,EAAAA,OAAO8U,EAAa,YAAY,EAE3CG,EAAS,IAAIE,CAAO,GACvBF,EAAS,IAAIE,EAAS,CAAE,KAAM,IAAI,KAAKL,CAAW,EAAG,OAAQ,CAAA,EAAI,eAAgB,CAAA,EAAI,GAGvF3O,EAAA8O,EAAS,IAAIE,CAAO,IAApB,MAAAhP,EAAuB,eAAe,KAAKlF,EAC7C,CACA6T,EAAc,IAAI,KAAKA,EAAY,QAAQA,EAAY,QAAA,EAAY,CAAC,CAAC,CACvE,CACF,CAAC,EAEM,MAAM,KAAKG,EAAS,OAAA,CAAQ,EAAE,KAAK,CAACzT,EAAGC,IAAMD,EAAE,KAAK,QAAA,EAAYC,EAAE,KAAK,SAAS,CACzF,EAAG,CAACyB,EAAiBsB,EAAgB/L,CAAY,CAAC,EAE5C4c,EAAenS,EAAgB,OAAS,GAAKsB,EAAe,OAAS,EAE3E,OACE3J,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAAA,EAAAA,IAACyZ,GAAA,CAAW,UAAU,SAAS,KAAK,SAClC,SAAArY,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACZ,SAAA,CAAA+Y,EAAY,IAAIM,GACfza,EAAAA,IAACga,IAAyD,KAAMS,EAAS,KAAM,OAAQA,EAAS,OAAQ,eAAgBA,EAAS,cAAA,EAA5GtV,EAAAA,OAAOsV,EAAS,KAAM,YAAY,CAA0F,CAClJ,EAEA,CAACD,GACApZ,EAAAA,KAAC,MAAA,CAAI,UAAU,8EACb,SAAA,CAAApB,EAAAA,IAAC0a,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,EAChC1a,EAAAA,IAAC,IAAA,CAAE,UAAU,uBAAuB,SAAA,4CAAA,CAA0C,CAAA,CAAA,CAChF,CAAA,CAAA,CAEJ,EACF,EACF,CAEJ,CC9DA,MAAM2a,GAAgCnZ,GAAAA,IACpC,6KACA,CACE,SAAU,CACR,MAAO,CAEL,KAAM,iIACN,MAAO,wIACP,IAAK,0HACL,OAAQ,+IACR,OAAQ,+IACR,OAAQ,+IACR,KAAM,sJAGN,WAAY,iEACZ,YAAa,kEACb,UAAW,gEACX,aAAc,mEACd,aAAc,mEACd,aAAc,mEACd,WAAY,mEAAA,CACd,EAEF,gBAAiB,CACf,MAAO,UAAA,CACT,CAEJ,EAEO,SAASoZ,GAAW,CAAE,MAAAxU,EAAO,UAAAzE,GAAa,CAC/C,KAAM,CAAE,aAAAtE,CAAA,EAAiB4C,EAAA,EAEnB0E,EAAQ4B,EAAAA,SAASH,EAAM,SAAS,EAChCxB,EAAM2B,EAAAA,SAASH,EAAM,OAAO,EAC5ByU,EAAoBnT,EAAAA,oBAAoB9C,EAAKD,CAAK,EAClDmW,EAAkBD,EAAoB,GAAM,GAAK,EAEjDtE,EAAQlZ,IAAiB,MAAQ,GAAG+I,EAAM,KAAK,OAASA,EAAM,MAE9D2U,EAA+B3a,EAAGua,GAA8B,CAAE,MAAApE,EAAO,UAAA5U,EAAW,EAAGkZ,EAAoB,IAAM,qBAAqB,EAEtI7B,EAAiBpZ,GAAM,EACvBA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACEA,EAAE,yBAAyB,aAAaA,EAAE,cAAc,MAAA,EAEhE,EAEA,OACEI,EAAAA,IAAC0W,IAAe,MAAAtQ,EACd,SAAApG,EAAAA,IAACgY,IAAmB,MAAA5R,EAClB,SAAAhF,EAAAA,KAAC,MAAA,CAAI,KAAK,SAAS,SAAU,EAAG,UAAW2Z,EAA8B,MAAO,CAAE,OAAQ,GAAGD,CAAc,IAAA,EAAQ,UAAW9B,EAC5H,SAAA,CAAA5X,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACZ,SAAA,CAAA,CAAC,QAAS,KAAK,EAAE,SAAS/D,CAAY,GACrC2C,EAAAA,IAAC,MAAA,CAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,UAAU,UAAU,qBACpD,SAAAA,EAAAA,IAAC,SAAA,CAAO,GAAG,IAAI,GAAG,IAAI,EAAE,GAAA,CAAI,CAAA,CAC9B,EAGFA,EAAAA,IAAC,IAAA,CAAE,UAAU,yBAA0B,WAAM,KAAA,CAAM,CAAA,EACrD,EAEC6a,EAAoB,IACnBzZ,EAAAA,KAAC,IAAA,CACE,SAAA,CAAA+D,EAAAA,OAAOR,EAAO,QAAQ,EAAE,MAAIQ,EAAAA,OAAOP,EAAK,QAAQ,CAAA,CAAA,CACnD,CAAA,CAAA,CAEJ,EACF,EACF,CAEJ,CC1EO,SAASoW,EAAmB,CAAE,KAAAlc,EAAM,KAAAmJ,EAAM,OAAAgT,EAAQ,SAAAxe,GAAY,CACnE,KAAM,CAAE,YAAAgD,CAAA,EAAgB+W,GAAA,EAElB,CAAC,CAAE,OAAAW,EAAQ,QAAAC,CAAA,EAAWC,CAAI,EAAIC,GAAAA,QAClC,KAAO,CACL,OAAQb,GAAU,MAClB,KAAO/V,GAAS,CACd,MAAM6W,EAAe7W,EAAK,MAEpB8W,EAAiBjR,EAAAA,SAASgR,EAAa,SAAS,EAChDE,EAAelR,EAAAA,SAASgR,EAAa,OAAO,EAE5CG,EAAkBC,EAAAA,yBAAyBF,EAAcD,CAAc,EAEvEI,EAAe,IAAI,KAAK9Y,CAAI,EAClC8Y,EAAa,SAAS3P,EAAMgT,EAAQ,EAAG,CAAC,EACxC,MAAMpD,EAAa,IAAI,KAAKD,EAAa,QAAA,EAAYF,CAAe,EAEpE,OAAAjY,EAAY,CACV,GAAG8X,EACH,UAAWK,EAAa,YAAA,EACxB,QAASC,EAAW,YAAA,CAAY,CACjC,EAEM,CAAE,MAAO,EAAA,CAClB,EACA,QAAS9W,IAAY,CACnB,OAAQA,EAAQ,OAAA,EAChB,QAASA,EAAQ,QAAA,CAAQ,EAC3B,GAEF,CAACjC,EAAMmJ,EAAMgT,EAAQxb,CAAW,CAAA,EAGlC,OACEO,EAAAA,IAAC,MAAA,CAAI,IAAKqX,EAAM,UAAWjX,EAAG,WAAY+W,GAAUC,GAAW,cAAc,EAC1E,SAAA3a,CAAA,CACH,CAEJ,CC5CO,SAASye,GAAiB,CAAE,iBAAAC,EAAkB,gBAAAC,GAAmB,CACtE,KAAM,CAACC,EAAaC,CAAc,EAAI/d,EAAAA,SAAS,IAAI,IAAM,EAEzDkB,EAAAA,UAAU,IAAM,CACd,MAAM8c,EAAQ,YAAY,IAAMD,MAAmB,IAAM,EAAG,GAAS,EACrE,MAAO,IAAM,cAAcC,CAAK,CAClC,EAAG,CAAA,CAAE,EAEL,MAAMC,EAAyB,IAAM,CACnC,MAAMC,EAAUJ,EAAY,SAAA,EAAa,GAAKA,EAAY,WAAA,EAEpDzT,EAAsBuT,EAAmB,GAEzCtT,EADoBuT,EAAkB,GACIxT,EAEhD,OAAS6T,EAAU7T,GAAuBC,EAAuB,GACnE,EAEM6T,EAAoB,IACjBvW,EAAAA,OAAOkW,EAAa,QAAQ,EAG/BM,EAAcN,EAAY,SAAA,EAChC,OAAIM,EAAcR,GAAoBQ,GAAeP,EAAwB,KAG3Eha,EAAAA,KAAC,MAAA,CAAI,UAAU,sEAAsE,MAAO,CAAE,IAAK,GAAGoa,EAAA,CAAwB,GAAA,EAC5H,SAAA,CAAAxb,EAAAA,IAAC,MAAA,CAAI,UAAU,wFAAA,CAAyF,EACxGA,EAAAA,IAAC,MAAA,CAAI,UAAU,+GAAgH,YAAkB,CAAE,CAAA,EACrJ,CAEJ,CC9BO,SAAS4b,GAAyB,CAAE,aAAAhe,EAAc,eAAA+L,GAAkB,CACzE,MAAMnC,EAAW8C,EAAAA,WAAW1M,CAAY,EAClCie,EAAShD,EAAAA,SAASjb,CAAY,EAE9Bke,EAAsBnS,EACzB,OAAOvD,GAAS,CACf,MAAMU,EAAaP,EAAAA,SAASH,EAAM,SAAS,EACrC+D,EAAW5D,EAAAA,SAASH,EAAM,OAAO,EAOvC,OAJEE,EAAAA,iBAAiBkB,EAAU,CAAE,MAAOV,EAAY,IAAKqD,EAAU,GAC/D7D,EAAAA,iBAAiBuV,EAAQ,CAAE,MAAO/U,EAAY,IAAKqD,EAAU,GAC5DrD,GAAcU,GAAY2C,GAAY0R,CAG3C,CAAC,EACA,KAAK,CAAClV,EAAGC,IAAM,CACd,MAAMmV,EAAY7R,mBAAiB3D,EAAAA,SAASI,EAAE,OAAO,EAAGJ,EAAAA,SAASI,EAAE,SAAS,CAAC,EAE7E,OADkBuD,mBAAiB3D,EAAAA,SAASK,EAAE,OAAO,EAAGL,EAAAA,SAASK,EAAE,SAAS,CAAC,EAC1DmV,CACrB,CAAC,EAEH,OAAID,EAAoB,SAAW,EAAU,KAG3C1a,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,MAAA,CAAO,QACrB,MAAA,CAAI,UAAU,2CACZ,SAAA8b,EAAoB,IAAI1V,GAAS,CAChC,MAAMU,EAAawD,EAAAA,WAAW/D,EAAAA,SAASH,EAAM,SAAS,CAAC,EACjD+D,EAAWG,EAAAA,WAAW/D,EAAAA,SAASH,EAAM,OAAO,CAAC,EAC7C6T,EAAc3P,EAAAA,WAAW1M,CAAY,EAErC6a,EAAiBvO,EAAAA,iBAAiBC,EAAUrD,CAAU,EAAI,EAC1D0R,EAAkBtO,EAAAA,iBAAiB+P,EAAanT,CAAU,EAAI,EAEpE,OAAO9G,MAACsY,IAA+B,MAAAlS,EAAc,SAAUxI,EAAc,gBAAA4a,EAAkC,eAAAC,CAAA,EAAlFrS,EAAM,EAA4G,CACjJ,CAAC,CAAA,CACH,CAAA,EACF,CAEJ,CC5BO,SAAS4V,GAAgB,CAAE,gBAAA3T,EAAiB,eAAAsB,GAAkB,CACnE,KAAM,CAAE,aAAA/L,EAAc,gBAAAC,EAAiB,MAAAG,EAAO,aAAAR,EAAc,aAAAE,CAAA,EAAiBuC,EAAA,EAEvE,CAAE,MAAAf,EAAO,kBAAAoJ,EAAmB,gBAAAC,GAAoBH,GAAgB5K,EAAc6K,CAAe,EAE7F4T,EAAgB5V,GAAiBgC,CAAe,EAEhD5B,EAAY4B,EAAgB,OAAOjC,GAAS,CAChD,MAAMiU,EAAY9T,EAAAA,SAASH,EAAM,SAAS,EAC1C,OACEiU,EAAU,QAAA,IAAczc,EAAa,QAAA,GACrCyc,EAAU,SAAA,IAAezc,EAAa,YACtCyc,EAAU,YAAA,IAAkBzc,EAAa,YAAA,CAE7C,CAAC,EAEKse,EAAgB1V,GAAYC,CAAS,EAE3C,OACErF,EAAAA,KAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAApB,EAAAA,IAAC4b,GAAA,CAAyB,aAAAhe,EAA4B,eAAA+L,CAAA,CAAgC,EAGtFvI,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,MAAA,CAAO,EACtBoB,EAAAA,KAAC,OAAA,CAAK,UAAU,6EACb,SAAA,CAAA+D,EAAAA,OAAOvH,EAAc,IAAI,EAAE,UAAE,OAAA,CAAK,UAAU,gCAAiC,SAAAuH,EAAAA,OAAOvH,EAAc,GAAG,CAAA,CAAE,CAAA,CAAA,CAC1G,CAAA,CAAA,CACF,CAAA,EACF,EAEAoC,EAAAA,IAACyZ,IAAW,UAAU,YAAY,KAAK,SACrC,SAAArY,EAAAA,KAAC,MAAA,CAAI,UAAU,OAEb,SAAA,CAAApB,EAAAA,IAAC,OAAI,UAAU,gBACZ,WAAM,IAAI,CAACiI,EAAMtI,IAChBK,EAAAA,IAAC,OAAe,UAAU,WAAW,MAAO,CAAE,OAAQ,QACpD,SAAAA,EAAAA,IAAC,OAAI,UAAU,gDACZ,aAAU,GAAKA,EAAAA,IAAC,QAAK,UAAU,gCAAiC,kBAAO,IAAI,KAAA,EAAO,SAASiI,EAAM,EAAG,EAAG,CAAC,EAAG,MAAM,CAAA,CAAE,EACtH,CAAA,EAHQA,CAIV,CACD,CAAA,CACH,EAGA7G,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,WACZ,SAAA,CAAAlC,EAAM,IAAI,CAAC+I,EAAMtI,IAAU,CAC1B,MAAMwc,EAAa,CAACnU,GAAcpK,EAAcqK,EAAMvK,CAAY,EAElE,OACE0D,EAAAA,KAAC,MAAA,CAAe,UAAWhB,EAAG,WAAY+b,GAAc,2BAA2B,EAAG,MAAO,CAAE,OAAQ,MAAA,EACpG,SAAA,CAAAxc,IAAU,GAAKK,EAAAA,IAAC,MAAA,CAAI,UAAU,wDAAwD,EAEvFA,EAAAA,IAACgb,GAAmB,KAAMpd,EAAc,KAAAqK,EAAY,OAAQ,EAC1D,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAW9V,EAAc,UAAW,CAAE,KAAAqK,EAAM,OAAQ,CAAA,EAClE,eAAC,MAAA,CAAI,UAAU,qFAAqF,CAAA,CACtG,CAAA,CACF,EAEAjI,EAAAA,IAACgb,GAAmB,KAAMpd,EAAc,KAAAqK,EAAY,OAAQ,GAC1D,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAW9V,EAAc,UAAW,CAAE,KAAAqK,EAAM,OAAQ,EAAA,EAClE,eAAC,MAAA,CAAI,UAAU,0FAA0F,CAAA,CAC3G,CAAA,CACF,EAEAjI,EAAAA,IAAC,MAAA,CAAI,UAAU,uEAAA,CAAwE,EAEvFA,EAAAA,IAACgb,GAAmB,KAAMpd,EAAc,KAAAqK,EAAY,OAAQ,GAC1D,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAW9V,EAAc,UAAW,CAAE,KAAAqK,EAAM,OAAQ,EAAA,EAClE,eAAC,MAAA,CAAI,UAAU,0FAA0F,CAAA,CAC3G,CAAA,CACF,EAEAjI,EAAAA,IAACgb,GAAmB,KAAMpd,EAAc,KAAAqK,EAAY,OAAQ,GAC1D,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAW9V,EAAc,UAAW,CAAE,KAAAqK,EAAM,OAAQ,EAAA,EAClE,eAAC,MAAA,CAAI,UAAU,yFAAA,CAA0F,CAAA,CAC3G,CAAA,CACF,CAAA,CAAA,EA3BQA,CA4BV,CAEJ,CAAC,EAEAiU,EAAc,IAAI,CAAClV,EAAOK,IACzBL,EAAM,IAAIZ,GAAS,CACjB,IAAIgW,EAAQjV,GAAmBf,EAAOxI,EAAcyJ,EAAY6U,EAAc,OAAQ,CAAE,KAAM5T,EAAmB,GAAIC,CAAA,CAAiB,EAYtI,OAXmB2T,EAAc,KAC/B,CAACG,EAAYC,IACXA,IAAejV,GACfgV,EAAW,KAAKE,GACdC,EAAAA,wBACE,CAAE,MAAOjW,WAASH,EAAM,SAAS,EAAG,IAAKG,EAAAA,SAASH,EAAM,OAAO,CAAA,EAC/D,CAAE,MAAOG,EAAAA,SAASgW,EAAW,SAAS,EAAG,IAAKhW,EAAAA,SAASgW,EAAW,OAAO,CAAA,CAAE,CAC7E,CACF,IAGaH,EAAQ,CAAE,GAAGA,EAAO,MAAO,OAAQ,KAAM,IAAA,GAGxDpc,EAAAA,IAAC,MAAA,CAAmB,UAAU,eAAe,MAAAoc,EAC3C,eAACxB,GAAA,CAAW,MAAAxU,CAAA,CAAc,CAAA,EADlBA,EAAM,EAEhB,CAEJ,CAAC,CAAA,CACH,EACF,EAEApG,EAAAA,IAACkb,GAAA,CAAiB,iBAAkB5S,EAAmB,gBAAiBC,CAAA,CAAiB,CAAA,CAAA,CAC3F,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAEAnH,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAApB,EAAAA,IAAC0P,GAAA,CAAe,UAAU,gBAAgB,KAAK,SAAS,SAAU9R,EAAc,SAAUC,EAAiB,aAAY,EAAA,CAAC,EAExHuD,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACZ,SAAA,CAAA6a,EAAc,OAAS,EACtB7a,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,kCACd,SAAA,CAAApB,EAAAA,IAAC,OAAA,CAAK,UAAU,kFAAA,CAAmF,EACnGA,EAAAA,IAAC,OAAA,CAAK,UAAU,yDAAA,CAA0D,CAAA,EAC5E,EAEAA,EAAAA,IAAC,IAAA,CAAE,UAAU,wCAAwC,SAAA,eAAA,CAAa,CAAA,EACpE,EAEAA,EAAAA,IAAC,IAAA,CAAE,UAAU,uDAAuD,SAAA,iDAA8C,EAGnHic,EAAc,OAAS,GACtBjc,EAAAA,IAACyZ,IAAW,UAAU,iBAAiB,KAAK,SAC1C,eAAC,MAAA,CAAI,UAAU,iBACZ,SAAAwC,EAAc,IAAI7V,GAAS,CAC1B,MAAMnC,EAAOjG,EAAM,KAAKiG,GAAQA,EAAK,KAAOmC,EAAM,KAAK,EAAE,EAEzD,OACEhF,EAAAA,KAAC,MAAA,CAAmB,UAAU,cAC5B,SAAA,CAAApB,EAAAA,IAAC,IAAA,CAAE,UAAU,qCAAsC,SAAAoG,EAAM,MAAM,EAE9DnC,GACC7C,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAApB,EAAAA,IAACiY,EAAAA,KAAA,CAAK,UAAU,UAAA,CAAW,EAC3BjY,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,WAAK,IAAA,CAAK,CAAA,EACvC,EAGFoB,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAApB,EAAAA,IAACkY,EAAAA,SAAA,CAAS,UAAU,UAAA,CAAW,EAC/BlY,MAAC,QAAK,UAAU,UAAW,kBAAO,IAAI,KAAQ,aAAa,CAAA,CAAE,CAAA,EAC/D,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAApB,EAAAA,IAACmY,EAAAA,MAAA,CAAM,UAAU,UAAA,CAAW,EAC5B/W,EAAAA,KAAC,OAAA,CAAK,UAAU,UACb,SAAA,CAAA+D,EAAAA,OAAOoB,EAAAA,SAASH,EAAM,SAAS,EAAG,QAAQ,EAAE,MAAIjB,EAAAA,OAAOoB,EAAAA,SAASH,EAAM,OAAO,EAAG,QAAQ,CAAA,CAAA,CAC3F,CAAA,CAAA,CACF,CAAA,CAAA,EApBQA,EAAM,EAqBhB,CAEJ,CAAC,EACH,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCvLO,SAASqW,GAA0B,CAAE,aAAA7e,EAAc,eAAA+L,GAAkB,CAC1E,MAAM+S,EAAYzX,EAAAA,YAAYrH,CAAY,EACpC+e,EAAUzX,EAAAA,UAAUtH,CAAY,EAChCoY,EAAW,MAAM,KAAK,CAAE,OAAQ,CAAA,EAAK,CAACrN,EAAGpN,IAAMqK,EAAAA,QAAQ8W,EAAWnhB,CAAC,CAAC,EAEpEqhB,EAAkBna,EAAAA,QAAQ,IACvBkH,EACJ,IAAIvD,GAAS,CACZ,MAAMzB,EAAQ4B,EAAAA,SAASH,EAAM,SAAS,EAChCxB,EAAM2B,EAAAA,SAASH,EAAM,OAAO,EAC5ByW,EAAgBC,EAAAA,SAASnY,EAAO+X,CAAS,EAAIA,EAAY/X,EACzDoY,EAAcC,EAAAA,QAAQpY,EAAK+X,CAAO,EAAIA,EAAU/X,EAChDqY,EAAa/S,EAAAA,iBAAiB2S,EAAeH,CAAS,EACtDQ,EAAWhT,EAAAA,iBAAiB6S,EAAaL,CAAS,EAExD,MAAO,CACL,GAAGtW,EACH,cAAAyW,EACA,YAAAE,EACA,WAAAE,EACA,SAAAC,CAAA,CAEJ,CAAC,EACA,KAAK,CAACvW,EAAGC,IAAM,CACd,MAAMuW,EAAYxW,EAAE,cAAc,UAAYC,EAAE,cAAc,QAAA,EAC9D,OAAIuW,IAAc,EAAUA,EACrBvW,EAAE,SAAWA,EAAE,YAAcD,EAAE,SAAWA,EAAE,WACrD,CAAC,EACF,CAACgD,EAAgB+S,EAAWC,CAAO,CAAC,EAEjCS,EAAY3a,EAAAA,QAAQ,IAAM,CAC9B,MAAM4a,EAAO,CAAA,EAEb,OAAAT,EAAgB,QAAQxW,GAAS,CAC/B,IAAIkX,EAAWD,EAAK,UAAUE,GAAOA,EAAI,MAAM3d,GAAKA,EAAE,SAAWwG,EAAM,YAAcxG,EAAE,WAAawG,EAAM,QAAQ,CAAC,EAE/GkX,IAAa,KACfA,EAAWD,EAAK,OAChBA,EAAK,KAAK,EAAE,GAGdA,EAAKC,CAAQ,EAAE,KAAKlX,CAAK,CAC3B,CAAC,EAEMiX,CACT,EAAG,CAACT,CAAe,CAAC,EAkBpB,OAhBwBna,EAAAA,QAAQ,IACvBkH,EAAe,KAAKvD,GAAS,CAClC,MAAMzB,EAAQ4B,EAAAA,SAASH,EAAM,SAAS,EAChCxB,EAAM2B,EAAAA,SAASH,EAAM,OAAO,EAElC,OAEGzB,GAAS+X,GAAa/X,GAASgY,GAE/B/X,GAAO8X,GAAa9X,GAAO+X,GAE3BhY,GAAS+X,GAAa9X,GAAO+X,CAElC,CAAC,EACA,CAAChT,EAAgB+S,EAAWC,CAAO,CAAC,EAOrCvb,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,QAC9B,MAAA,CAAI,UAAU,qDACZ,SAAAgW,EAAS,IAAI,CAAC5O,EAAKc,IAClBlI,EAAAA,IAAC,OAA4B,UAAU,kCACpC,WAAU,IAAI,CAACud,EAAKD,IAAa,CAChC,MAAMlX,EAAQmX,EAAI,KAAK3d,GAAKA,EAAE,YAAcsI,GAAYtI,EAAE,UAAYsI,CAAQ,EAE9E,GAAI,CAAC9B,EACH,OAAOpG,MAAC,OAAoC,UAAU,OAAA,EAArC,GAAGsd,CAAQ,IAAIpV,CAAQ,EAAsB,EAGhE,IAAIvE,EAAW,OAEf,OAAIuE,IAAa9B,EAAM,YAAc8B,IAAa9B,EAAM,SACtDzC,EAAW,OACFuE,IAAa9B,EAAM,WAC5BzC,EAAW,QACFuE,IAAa9B,EAAM,SAC5BzC,EAAW,OAEXA,EAAW,SAGN3D,EAAAA,IAACsY,GAAA,CAAgD,MAAAlS,EAAc,SAAUkE,EAAAA,WAAWlD,CAAG,EAAG,SAAAzD,CAAA,EAApE,GAAGyC,EAAM,EAAE,IAAI8B,CAAQ,EAAiE,CACvH,CAAC,CAAA,EArBOd,EAAI,YAAA,CAsBd,CACD,CAAA,CACH,CAAA,EACF,EAjCO,IAmCX,CCzFO,SAASoW,GAAiB,CAAE,gBAAAnV,EAAiB,eAAAsB,GAAkB,CACpE,KAAM,CAAE,aAAA/L,EAAc,aAAAF,EAAc,aAAAF,CAAA,EAAiByC,EAAA,EAE/C,CAAE,MAAAf,EAAO,kBAAAoJ,EAAmB,gBAAAC,GAAoBH,GAAgB5K,EAAc6K,CAAe,EAE7FqU,EAAYzX,EAAAA,YAAYrH,CAAY,EACpCoY,EAAW,MAAM,KAAK,CAAE,OAAQ,CAAA,EAAK,CAACrN,EAAGpN,IAAMqK,EAAAA,QAAQ8W,EAAWnhB,CAAC,CAAC,EAE1E,OACE6F,EAAAA,KAAAsB,WAAA,CACE,SAAA,CAAAtB,EAAAA,KAAC,MAAA,CAAI,UAAU,kGACb,SAAA,CAAApB,EAAAA,IAAC,KAAE,SAAA,kDAAA,CAAgD,EACnDA,EAAAA,IAAC,KAAE,SAAA,yCAAA,CAAuC,CAAA,EAC5C,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAApB,EAAAA,IAACyc,GAAA,CAA0B,aAAA7e,EAA4B,eAAA+L,CAAA,CAAgC,EAGvFvI,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAApB,EAAAA,IAAC,MAAA,CAAI,UAAU,MAAA,CAAO,EACtBA,EAAAA,IAAC,MAAA,CAAI,UAAU,4CACZ,SAAAgW,EAAS,IAAI,CAAC5O,EAAKzH,IAClByB,EAAAA,KAAC,OAAA,CAAiB,UAAU,6DACzB,SAAA,CAAA+D,EAAAA,OAAOiC,EAAK,IAAI,EAAE,UAAE,OAAA,CAAK,UAAU,qCAAsC,SAAAjC,EAAAA,OAAOiC,EAAK,GAAG,CAAA,CAAE,CAAA,CAAA,EADlFzH,CAEX,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAEAK,EAAAA,IAACyZ,IAAW,UAAU,YAAY,KAAK,SACrC,SAAArY,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAEb,SAAA,CAAApB,EAAAA,IAAC,OAAI,UAAU,gBACZ,WAAM,IAAI,CAACiI,EAAMtI,IAChBK,EAAAA,IAAC,OAAe,UAAU,WAAW,MAAO,CAAE,OAAQ,QACpD,SAAAA,EAAAA,IAAC,OAAI,UAAU,gDACZ,aAAU,GAAKA,EAAAA,IAAC,QAAK,UAAU,gCAAiC,kBAAO,IAAI,KAAA,EAAO,SAASiI,EAAM,EAAG,EAAG,CAAC,EAAG,MAAM,CAAA,CAAE,EACtH,CAAA,EAHQA,CAIV,CACD,CAAA,CACH,EAGA7G,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAApB,MAAC,OAAI,UAAU,4BACZ,WAAS,IAAI,CAACoH,EAAKc,IAAa,CAC/B,MAAMzB,EAAY4B,EAAgB,OAAOjC,GAASF,EAAAA,UAAUK,EAAAA,SAASH,EAAM,SAAS,EAAGgB,CAAG,GAAKlB,YAAUK,EAAAA,SAASH,EAAM,OAAO,EAAGgB,CAAG,CAAC,EAChI8U,EAAgB1V,GAAYC,CAAS,EAE3C,OACErF,EAAAA,KAAC,MAAA,CAAmB,UAAU,WAC3B,SAAA,CAAAlC,EAAM,IAAI,CAAC+I,EAAMtI,IAAU,CAC1B,MAAMwc,EAAa,CAACnU,GAAcZ,EAAKa,EAAMvK,CAAY,EAEzD,OACE0D,EAAAA,KAAC,MAAA,CAAe,UAAWhB,EAAG,WAAY+b,GAAc,2BAA2B,EAAG,MAAO,CAAE,OAAQ,MAAA,EACpG,SAAA,CAAAxc,IAAU,GAAKK,EAAAA,IAAC,MAAA,CAAI,UAAU,wDAAwD,EAEvFA,EAAAA,IAACgb,GAAmB,KAAM5T,EAAK,KAAAa,EAAY,OAAQ,EACjD,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAWtM,EAAK,UAAW,CAAE,KAAAa,EAAM,OAAQ,CAAA,EACzD,eAAC,MAAA,CAAI,UAAU,qFAAqF,CAAA,CACtG,CAAA,CACF,EAEAjI,EAAAA,IAACgb,GAAmB,KAAM5T,EAAK,KAAAa,EAAY,OAAQ,GACjD,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAWtM,EAAK,UAAW,CAAE,KAAAa,EAAM,OAAQ,EAAA,EACzD,eAAC,MAAA,CAAI,UAAU,0FAA0F,CAAA,CAC3G,CAAA,CACF,EAEAjI,EAAAA,IAAC,MAAA,CAAI,UAAU,uEAAA,CAAwE,EAEvFA,EAAAA,IAACgb,GAAmB,KAAM5T,EAAK,KAAAa,EAAY,OAAQ,GACjD,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAWtM,EAAK,UAAW,CAAE,KAAAa,EAAM,OAAQ,EAAA,EACzD,eAAC,MAAA,CAAI,UAAU,0FAA0F,CAAA,CAC3G,CAAA,CACF,EAEAjI,EAAAA,IAACgb,GAAmB,KAAM5T,EAAK,KAAAa,EAAY,OAAQ,GACjD,SAAAjI,EAAAA,IAAC0T,EAAA,CAAe,UAAWtM,EAAK,UAAW,CAAE,KAAAa,EAAM,OAAQ,EAAA,EACzD,eAAC,MAAA,CAAI,UAAU,yFAAA,CAA0F,CAAA,CAC3G,CAAA,CACF,CAAA,CAAA,EA3BQA,CA4BV,CAEJ,CAAC,EAEAiU,EAAc,IAAI,CAAClV,EAAOK,IACzBL,EAAM,IAAIZ,GAAS,CACjB,IAAIgW,EAAQjV,GAAmBf,EAAOgB,EAAKC,EAAY6U,EAAc,OAAQ,CAAE,KAAM5T,EAAmB,GAAIC,CAAA,CAAiB,EAY7H,OAXmB2T,EAAc,KAC/B,CAACG,EAAYC,IACXA,IAAejV,GACfgV,EAAW,KAAKE,IACdC,EAAAA,wBACE,CAAE,MAAOjW,WAASH,EAAM,SAAS,EAAG,IAAKG,EAAAA,SAASH,EAAM,OAAO,CAAA,EAC/D,CAAE,MAAOG,EAAAA,SAASgW,GAAW,SAAS,EAAG,IAAKhW,EAAAA,SAASgW,GAAW,OAAO,CAAA,CAAE,CAC7E,CACF,IAGaH,EAAQ,CAAE,GAAGA,EAAO,MAAO,OAAQ,KAAM,IAAA,GAGxDpc,EAAAA,IAAC,MAAA,CAAmB,UAAU,eAAe,MAAAoc,EAC3C,eAACxB,GAAA,CAAW,MAAAxU,CAAA,CAAc,CAAA,EADlBA,EAAM,EAEhB,CAEJ,CAAC,CAAA,CACH,CAAA,EA3DQ8B,CA4DV,CAEJ,CAAC,CAAA,CACH,EAEAlI,EAAAA,IAACkb,GAAA,CAAiB,iBAAkB5S,EAAmB,gBAAiBC,CAAA,CAAiB,CAAA,CAAA,CAC3F,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCjHO,SAASkV,GAAgB,CAC9B,KAAAhZ,EACA,aAAA4P,EACA,WAAAqJ,EAAa,GACb,YAAAC,EAAc,CAAA,EACd,UAAAhc,EACA,gBAAAic,EACA,iBAAAC,CACF,EAAG,CACD,KAAM,CAAE,aAAAjgB,EAAc,eAAAE,EAAgB,OAAAI,CAAA,EAAW+B,EAAA,EAE3C6d,EAAiBrb,EAAAA,QAAQ,IACtBvE,EAAO,OAAOkI,GAAS,CAC5B,MAAMoR,EAAiBjR,EAAAA,SAASH,EAAM,SAAS,EACzCqR,EAAelR,EAAAA,SAASH,EAAM,OAAO,EAE3C,GAAI3B,IAAS,OAAQ,CACnB,MAAM2R,EAAY,IAAI,KAAKxY,EAAa,YAAA,EAAe,EAAG,CAAC,EACrDmgB,EAAU,IAAI,KAAKngB,EAAa,YAAA,EAAe,GAAI,GAAI,GAAI,GAAI,GAAI,GAAG,EACtEogB,EAAmBxG,GAAkBuG,GAAWtG,GAAgBrB,EAChE6H,EAAcngB,IAAmB,OAASsI,EAAM,KAAK,KAAOtI,EAClE,OAAOkgB,GAAoBC,CAC7B,CAEA,GAAIxZ,IAAS,SAAWA,IAAS,SAAU,CACzC,MAAMmF,EAAa,IAAI,KAAKhM,EAAa,cAAeA,EAAa,SAAA,EAAY,CAAC,EAC5EiM,EAAW,IAAI,KAAKjM,EAAa,cAAeA,EAAa,SAAA,EAAa,EAAG,EAAG,GAAI,GAAI,GAAI,GAAG,EAC/FsgB,EAAoB1G,GAAkB3N,GAAY4N,GAAgB7N,EAClEqU,EAAcngB,IAAmB,OAASsI,EAAM,KAAK,KAAOtI,EAClE,OAAOogB,GAAqBD,CAC9B,CAEA,GAAIxZ,IAAS,OAAQ,CACnB,MAAM0Z,EAAYvgB,EAAa,OAAA,EAEzB8e,EAAY,IAAI,KAAK9e,CAAY,EACvC8e,EAAU,QAAQ9e,EAAa,QAAA,EAAYugB,CAAS,EACpDzB,EAAU,SAAS,EAAG,EAAG,EAAG,CAAC,EAE7B,MAAMC,EAAU,IAAI,KAAKD,CAAS,EAClCC,EAAQ,QAAQD,EAAU,QAAA,EAAY,CAAC,EACvCC,EAAQ,SAAS,GAAI,GAAI,GAAI,GAAG,EAEhC,MAAMyB,EAAmB5G,GAAkBmF,GAAWlF,GAAgBiF,EAChEuB,GAAcngB,IAAmB,OAASsI,EAAM,KAAK,KAAOtI,EAClE,OAAOsgB,GAAoBH,EAC7B,CAEA,GAAIxZ,IAAS,MAAO,CAClB,MAAM+C,EAAW,IAAI,KAAK5J,EAAa,cAAeA,EAAa,SAAA,EAAYA,EAAa,QAAA,EAAW,EAAG,EAAG,CAAC,EACxGie,EAAS,IAAI,KAAKje,EAAa,cAAeA,EAAa,SAAA,EAAYA,EAAa,QAAA,EAAW,GAAI,GAAI,EAAE,EACzGygB,EAAkB7G,GAAkBqE,GAAUpE,GAAgBjQ,EAC9DyW,EAAcngB,IAAmB,OAASsI,EAAM,KAAK,KAAOtI,EAClE,OAAOugB,GAAmBJ,CAC5B,CACF,CAAC,EACA,CAACrgB,EAAcE,EAAgBI,EAAQuG,CAAI,CAAC,EAEzC4D,EAAkByV,EAAe,OAAO1X,GAAS,CACrD,MAAMzK,EAAY4K,EAAAA,SAASH,EAAM,SAAS,EACpCxK,EAAU2K,EAAAA,SAASH,EAAM,OAAO,EACtC,OAAOF,EAAAA,UAAUvK,EAAWC,CAAO,CACrC,CAAC,EAEK+N,EAAiBmU,EAAe,OAAO1X,GAAS,CACpD,MAAMzK,EAAY4K,EAAAA,SAASH,EAAM,SAAS,EACpCxK,EAAU2K,EAAAA,SAASH,EAAM,OAAO,EACtC,MAAO,CAACF,EAAAA,UAAUvK,EAAWC,CAAO,CACtC,CAAC,EAKK0iB,EAAkB7b,EAAAA,QAAQ,IACvBqb,EAAe,IAAI1X,IAAU,CAAE,GAAGA,EAAO,QAASA,EAAM,SAAA,EAAY,EAC1E,CAAC0X,CAAc,CAAC,EAEnB,cACG,MAAA,CAAI,UAAW1d,EAAG,oCAAqCuB,CAAS,EAC9D,SAAA,CAAA+b,GACC1d,EAAAA,IAACoU,GAAA,CACC,KAAA3P,EACA,OAAQqZ,EACR,aAAAzJ,EACA,UAAWjU,EAAGwd,EAAiBD,EAAY,SAAS,EACnD,GAAGA,CAAA,CAAA,EAIR3d,MAACmB,GAAA,CACC,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAWyc,EACb,SAAA,CAAApZ,IAAS,OAASzE,EAAAA,IAACgc,GAAA,CAAgB,gBAAA3T,EAAkC,eAAAsB,EAAgC,EACrGlF,IAAS,SAAWzE,EAAAA,IAACuZ,GAAA,CAAkB,gBAAAlR,EAAkC,eAAAsB,EAAgC,EACzGlF,IAAS,QAAUzE,EAAAA,IAACwd,GAAA,CAAiB,gBAAAnV,EAAkC,eAAAsB,EAAgC,EACvGlF,IAAS,QAAUzE,EAAAA,IAACiW,GAAA,CAAiB,UAAWqI,EAAiB,EACjE7Z,IAAS,UAAYzE,EAAAA,IAACka,GAAA,CAAmB,gBAAA7R,EAAkC,eAAAsB,CAAA,CAAgC,CAAA,CAAA,CAC9G,CAAA,CACF,CAAA,EACF,CAEJ,CC3HO,SAAS4U,IAA0B,CACxC,KAAM,CAAE,aAAAlhB,EAAc,gBAAAC,CAAA,EAAoB2C,EAAA,EAE1C,OACEmB,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAApB,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAwB,SAAA,uBAAoB,EAEzDoB,EAAAA,KAAC6B,EAAA,CAAO,MAAO5F,EAAc,cAAeC,EAC1C,SAAA,CAAA0C,MAACqD,EAAA,CAAc,UAAU,OACvB,SAAArD,MAACoD,IAAY,EACf,SAECM,EAAA,CACC,SAAA,CAAA1D,EAAAA,IAAC6D,EAAA,CAAW,MAAM,MAAM,SAAA,MAAG,EAC3B7D,EAAAA,IAAC6D,EAAA,CAAW,MAAM,UAAU,SAAA,UAAO,EACnC7D,EAAAA,IAAC6D,EAAA,CAAW,MAAM,QAAQ,SAAA,OAAA,CAAK,CAAA,CAAA,CACjC,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCnBA,MAAM2a,GAAkBC,GAAiB,SAEnCC,GAAUD,GAAiB,KAE3BE,GAAiBF,GAAiB,QAElCG,GAAiBld,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,WAAA2O,EAAa,EAAG,GAAGxO,GAASC,IAChF/B,EAAAA,IAACye,GAAiB,OAAjB,CACC,SAAAze,EAAAA,IAACye,GAAiB,QAAjB,CACC,IAAA1c,EACA,WAAAuO,EACA,UAAWlQ,EACT,saACAuB,CAAA,EAED,GAAGG,CAAA,CACN,EACF,CACD,EACD8c,GAAe,YAAcH,GAAiB,QAAQ,YCf/C,SAASI,IAA0B,CACxC,KAAM,CAAE,aAAArhB,EAAc,gBAAAC,CAAA,EAAoBwC,EAAA,EAEpC,CAAC6e,EAAMC,CAAO,EAAIxhB,WAAS,CAAE,KAAMC,EAAa,KAAM,OAAQ,EAAG,EACjE,CAACwhB,EAAIC,CAAK,EAAI1hB,WAAS,CAAE,KAAMC,EAAa,GAAI,OAAQ,EAAG,EAE3D0hB,EAAc,IAAM,CACxB,MAAMC,EAASH,EAAG,OAAS,EAAI,GAAKA,EAAG,KACvCvhB,EAAgB,CAAE,KAAMqhB,EAAK,KAAM,GAAIK,EAAQ,CACjD,EAEA,OACE/d,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAwB,SAAA,uBAAoB,EAEzDA,MAACwe,GAAA,CAAgB,cAAe,IAC9B,gBAACE,GAAA,CACC,SAAA,CAAA1e,MAAC2e,GAAA,CACC,SAAA3e,EAAAA,IAACof,EAAAA,KAAA,CAAK,UAAU,SAAS,EAC3B,QAECR,GAAA,CAAe,UAAU,uBACxB,SAAA5e,EAAAA,IAAC,IAAA,CAAE,qIAAyH,CAAA,CAC9H,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,KAAE,SAAA,MAAA,CAAI,EACPA,EAAAA,IAACiP,EAAA,CAAU,GAAG,aAAa,UAAW,GAAI,YAAY,OAAO,MAAO6P,EAAM,SAAUC,CAAA,CAAS,EAC7F/e,EAAAA,IAAC,KAAE,SAAA,IAAA,CAAE,EACLA,EAAAA,IAACiP,EAAA,CAAU,GAAG,WAAW,UAAW,GAAI,YAAY,OAAO,MAAO+P,EAAI,SAAUC,CAAA,CAAO,CAAA,EACzF,QAECxd,EAAA,CAAO,UAAU,aAAa,QAASyd,EAAa,SAAA,OAAA,CAErD,CAAA,EACF,CAEJ,CC7CA,MAAMG,GAAS3d,EAAM,WACnB,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IACxB/B,EAAAA,IAACsf,GAAiB,KAAjB,CACC,UAAWlf,EACT,8XACAuB,CAAA,EAED,GAAGG,EACJ,IAAAC,EAEA,SAAA/B,EAAAA,IAACsf,GAAiB,MAAjB,CACC,UAAWlf,EACT,4KAAA,CACF,CAAA,CACF,CAAA,CAEH,EACHif,GAAO,YAAcC,GAAiB,KAAK,YCV3C,MAAMC,GAAe,CACnB,CAAE,MAAO,EAAG,KAAM,QAAA,EAClB,CAAE,MAAO,EAAG,KAAM,QAAA,EAClB,CAAE,MAAO,EAAG,KAAM,SAAA,EAClB,CAAE,MAAO,EAAG,KAAM,WAAA,EAClB,CAAE,MAAO,EAAG,KAAM,UAAA,EAClB,CAAE,MAAO,EAAG,KAAM,QAAA,EAClB,CAAE,MAAO,EAAG,KAAM,UAAA,CACpB,EAEO,SAASC,IAA0B,CACxC,KAAM,CAAE,aAAA9hB,EAAc,gBAAAC,CAAA,EAAoBsC,EAAA,EAEpC,CAACwf,EAAmBC,CAAoB,EAAIniB,EAAAA,SAAS,CAAE,GAAGG,EAAc,EAExEiiB,EAAmBC,GAAU,CACjCF,EAAqBlgB,IAAS,CAC5B,GAAGA,EACH,CAACogB,CAAK,EAAGpgB,EAAKogB,CAAK,EAAE,KAAO,GAAKpgB,EAAKogB,CAAK,EAAE,GAAK,EAAI,CAAE,KAAM,EAAG,GAAI,CAAA,EAAM,CAAE,KAAM,EAAG,GAAI,EAAA,CAAG,EAC7F,CACJ,EAEMC,EAAmB,CAACD,EAAOE,EAAU7T,IAAU,CAC9CA,GAELyT,EAAqBlgB,GAAQ,CAC3B,MAAMugB,EAAa,CAAE,GAAGvgB,EAAKogB,CAAK,EAAG,CAACE,CAAQ,EAAG7T,EAAM,IAAA,EACvD,OAAI6T,IAAa,MAAQ7T,EAAM,OAAS,GAAK8T,EAAW,OAAS,IAAGA,EAAW,GAAK,IAC7E,CAAE,GAAGvgB,EAAM,CAACogB,CAAK,EAAGG,CAAA,CAC7B,CAAC,CACH,EAEMC,EAAa,IAAM,CACvB,MAAMC,EAAsB,CAAE,GAAGR,CAAA,EAEjC,UAAWG,KAASK,EAAqB,CACvC,MAAM7Y,EAAM6Y,EAAoB,SAASL,CAAK,CAAC,EAC3BH,EAAkB,SAASG,CAAK,CAAC,EAAE,KAAO,GAAKH,EAAkB,SAASG,CAAK,CAAC,EAAE,GAAK,EAGrGxY,EAAI,OAAS,GAAKA,EAAI,KAAO,EAC/B6Y,EAAoBL,CAAK,EAAI,CAAE,KAAM,EAAG,GAAI,EAAA,EACnCxY,EAAI,KAAO,GAAKA,EAAI,KAAO,IACpC6Y,EAAoBL,CAAK,EAAI,CAAE,GAAGxY,EAAK,GAAI,EAAA,GAG7C6Y,EAAoBL,CAAK,EAAI,CAAE,KAAM,EAAG,GAAI,CAAA,CAEhD,CAEAjiB,EAAgBsiB,CAAmB,CACrC,EAEA,OACE7e,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAwB,SAAA,uBAAoB,EAEzDA,MAACwe,GAAA,CAAgB,cAAe,IAC9B,gBAACE,GAAA,CACC,SAAA,CAAA1e,MAAC2e,GAAA,CACC,SAAA3e,EAAAA,IAACof,EAAAA,KAAA,CAAK,UAAU,SAAS,EAC3B,QAECR,GAAA,CAAe,UAAU,uBACxB,SAAA5e,EAAAA,IAAC,IAAA,CAAE,oIAAwH,CAAA,CAC7H,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,QAEC,MAAA,CAAI,UAAU,YACZ,SAAAuf,GAAa,IAAInY,GAAO,CACvB,MAAM8Y,EAAcT,EAAkBrY,EAAI,KAAK,EAAE,KAAO,GAAKqY,EAAkBrY,EAAI,KAAK,EAAE,GAAK,EAE/F,OACEhG,EAAAA,KAAC,MAAA,CAAoB,UAAU,0BAC7B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAApB,MAACqf,GAAA,CAAO,QAASa,EAAa,gBAAiB,IAAMP,EAAgBvY,EAAI,KAAK,EAAG,EACjFpH,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,WAAI,IAAA,CAAK,CAAA,EAClD,EAECkgB,EACC9e,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,QAAK,SAAA,MAAA,CAAI,EACVA,EAAAA,IAACiP,EAAA,CACC,GAAI,GAAG7H,EAAI,KAAK,aAAa,QAC7B,UAAW,GACX,YAAY,OACZ,MAAO,CAAE,KAAMqY,EAAkBrY,EAAI,KAAK,EAAE,KAAM,OAAQ,CAAA,EAC1D,SAAU6E,GAAS4T,EAAiBzY,EAAI,MAAO,OAAQ6E,CAAK,CAAA,CAAA,CAC9D,EACF,EAEA7K,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAAC,QAAK,SAAA,IAAA,CAAE,EACRA,EAAAA,IAACiP,EAAA,CACC,GAAI,GAAG7H,EAAI,KAAK,aAAa,MAC7B,UAAW,GACX,YAAY,OACZ,MAAO,CAAE,KAAMqY,EAAkBrY,EAAI,KAAK,EAAE,GAAI,OAAQ,CAAA,EACxD,SAAU6E,GAAS4T,EAAiBzY,EAAI,MAAO,KAAM6E,CAAK,CAAA,CAAA,CAC5D,CAAA,CACF,CAAA,CAAA,CACF,EAEA7K,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAApB,EAAAA,IAACmgB,EAAAA,KAAA,CAAK,UAAU,QAAA,CAAS,EACzBngB,EAAAA,IAAC,QAAK,SAAA,QAAA,CAAM,CAAA,CAAA,CACd,CAAA,CAAA,EAlCMoH,EAAI,KAoCd,CAEJ,CAAC,CAAA,CACH,QAEC3F,EAAA,CAAO,UAAU,aAAa,QAASue,EAAY,SAAA,OAAA,CAEpD,CAAA,EACF,CAEJ,CChIA,MAAMI,GAAYC,EAAmB,KAE/BC,GAAgB5e,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,GAAGG,CAAA,EAASC,IAC/D/B,EAAAA,IAACqgB,EAAmB,KAAnB,CACC,IAAAte,EACA,UAAW3B,EAAG,WAAYuB,CAAS,EAClC,GAAGG,CAAA,CACN,CACD,EACDwe,GAAc,YAAc,gBAE5B,MAAMC,GAAmB7e,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,CAAA,EAASC,IAC5E/B,EAAAA,IAACqgB,EAAmB,OAAnB,CAA0B,UAAU,OACnC,SAAAjf,EAAAA,KAACif,EAAmB,QAAnB,CACC,IAAAte,EACA,UAAW3B,EACT,iJACAuB,CAAA,EAED,GAAGG,EAEH,SAAA,CAAArF,EACDuD,EAAAA,IAACsD,EAAAA,YAAA,CAAY,UAAU,0EAAA,CAA2E,CAAA,CAAA,CACpG,EACF,CACD,EACDid,GAAiB,YAAcF,EAAmB,QAAQ,YAE1D,MAAMG,GAAmB9e,EAAM,WAAW,CAAC,CAAE,UAAAC,EAAW,SAAAlF,EAAU,GAAGqF,GAASC,IAC5E/B,EAAAA,IAACqgB,EAAmB,QAAnB,CACC,IAAAte,EACA,UAAU,4GACT,GAAGD,EAEJ,eAAC,MAAA,CAAI,UAAW1B,EAAG,YAAauB,CAAS,EAAI,SAAAlF,CAAA,CAAS,CAAA,CACxD,CACD,EACD+jB,GAAiB,YAAcH,EAAmB,QAAQ,YCzC1D,SAASI,GAAS,CAChB,UAAA9e,EACA,GAAGG,CACL,EAAG,CACD,OACE9B,EAAAA,IAAC,MAAA,CACC,UAAWI,EAAG,yCAA0CuB,CAAS,EAChE,GAAGG,CAAA,CAAA,CAGV,CCZY,MAAC4e,GAAoB,qBACpBC,GAAuB,GAAK,GAAK,GAAK,IAEtCC,GAAiB,CAAE,MAAO,MAAM,ECDtC,SAASC,GAASC,EAAO,CAC9B,SAAS,OAAS,GAAGJ,EAAiB,IAAII,CAAK,qBAAqBH,EAAoB,GACxF,SAAS,gBAAgB,UAAU,OAAO,QAAS,MAAM,EACzD,SAAS,gBAAgB,UAAU,IAAIG,CAAK,CAC9C,CCEO,SAASC,IAAc,CAC5B,KAAM,CAACC,EAAcC,CAAe,EAAI1jB,WAAA,EAExCkB,EAAAA,UAAU,IAAM,CACd,MAAMuiB,EAAe,SAAS,gBAAgB,UAAU,SAAS,MAAM,EAAI,OAAS,QACpFC,EAAgBD,CAAY,CAC9B,EAAG,CAAA,CAAE,EAEL,MAAME,EAAc,IAAM,CACxB,MAAMC,EAAWH,IAAiB,QAAU,OAAS,QACrDH,GAASM,CAAQ,EACjBF,EAAgBE,CAAQ,CAC1B,EAEA,OAAKH,SAGFvf,EAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,QAASyf,EAC1C,SAAA,CAAAF,IAAiB,eAAYI,EAAAA,IAAA,CAAA,CAAI,EACjCJ,IAAiB,QAAUhhB,MAACmgB,EAAAA,KAAA,CAAA,CAAK,CAAA,EACpC,EANwBngB,EAAAA,IAACygB,GAAA,CAAS,UAAU,SAAS,CAQzD,CCzBO,SAASY,IAAS,CACvB,aACG,SAAA,CAAO,UAAU,4EAChB,SAAAjgB,EAAAA,KAAC,MAAA,CAAI,UAAU,0DACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAApB,EAAAA,IAAC,OAAI,UAAU,mEACb,eAACkY,EAAAA,SAAA,CAAS,UAAU,yBAAyB,CAAA,CAC/C,EAEA9W,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAApB,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAgC,SAAA,eAAY,EACzDoB,EAAAA,KAAC,IAAA,CAAE,UAAU,0BAA0B,SAAA,CAAA,mCACJ,IACjCA,EAAAA,KAAC,IAAA,CACC,KAAK,8BACL,OAAO,SACP,UAAU,gHACX,SAAA,CAAA,WAECpB,EAAAA,IAACshB,EAAAA,aAAA,CAAa,KAAM,GAAI,UAAU,iBAAA,CAAkB,CAAA,CAAA,CAAA,CACtD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,EAEAlgB,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,EAAAA,KAAC,IAAA,CACC,KAAK,2CACL,OAAO,SACP,UAAU,sHACX,SAAA,CAAA,iBAECpB,EAAAA,IAACshB,EAAAA,aAAA,CAAa,KAAM,GAAI,UAAU,iBAAA,CAAkB,CAAA,CAAA,CAAA,EAGtDlgB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAApB,EAAAA,IAACyB,EAAA,CAAO,KAAK,OAAO,QAAO,GAAC,QAAQ,QAClC,SAAAzB,EAAAA,IAAC,IAAA,CAAE,KAAK,4BAA4B,OAAO,SACzC,SAAAoB,EAAAA,KAAC,MAAA,CACC,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QAEf,SAAA,CAAApB,MAAC,QAAK,OAAO,OAAO,EAAE,gBAAgB,KAAK,OAAO,EAClDA,EAAAA,IAAC,OAAA,CAAK,EAAE,mCAAA,CAAoC,EAC5CA,EAAAA,IAAC,OAAA,CAAK,EAAE,4CAAA,CAA6C,CAAA,CAAA,CAAA,EAEzD,CAAA,CACF,QAEC+gB,GAAA,CAAA,CAAY,CAAA,CAAA,CACf,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CCnEY,MAACQ,GAAgB,CAAC,QAAS,MAAM,ECItC,SAASC,IAAW,OACzB,GAAI,OAAO,SAAa,IACtB,OAAOZ,GAAe,MAIxB,MAAMa,EADU,SAAS,OAAO,MAAM,GAAG,EACb,KAAKC,GAAUA,EAAO,OAAO,WAAW,GAAGhB,EAAiB,GAAG,CAAC,EAE5F,GAAI,CAACe,EACH,OAAOb,GAAe,MAGxB,MAAME,GAAQxV,EAAAmW,EAAY,MAAM,GAAG,EAAE,CAAC,IAAxB,YAAAnW,EAA2B,OACzC,OAAKiW,GAAc,SAAST,CAAK,EAI1BA,EAHEF,GAAe,KAI1B,CCpBY,MAACe,GAAQ,CACnB,SAAU,cACZ","x_google_ignoreList":[14,15,16,17,18]}
|