@easyteam/auto-scheduler-modal-ui 0.1.3 → 0.1.5

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AutoSchedulerModal.tsx","../src/icons/AutoSchedulerIcons.tsx","../src/theme/mergeTheme.ts","../src/constants.ts","../src/utils/theme.ts","../src/buildSchedulePayload.ts","../src/api/api.ts","../src/utils/violationMessages.ts","../src/utils/mapViolationsToResult.ts","../src/ViolatedConstraintsPanel.tsx","../src/AutoSchedulerModalWithProvider.tsx","../src/ViolatedConstraintsPanelWithProvider.tsx","../src/utils/ruleIdFriendlyNames.ts","../src/api/types.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Badge,\n Box,\n Button,\n ChakraProvider,\n Checkbox,\n Divider,\n HStack,\n IconButton,\n Input,\n InputGroup,\n InputRightAddon,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n Stack,\n Text,\n useTheme,\n} from \"@chakra-ui/react\";\nimport type { AutoSchedulerModalProps, SolveApiResponse } from \"./types\";\nimport {\n ChevronDownIcon,\n CheckIcon,\n CloseIcon,\n FailedIcon,\n InfoIcon,\n MagicIcon,\n WarningIcon,\n} from \"./icons/AutoSchedulerIcons\";\nimport { mergeThemeWithBase, resolveThemeParts } from \"./theme/mergeTheme\";\nimport {\n defaultStyles,\n HARD_CONSTRAINT_DEFAULTS,\n HARD_CONSTRAINT_OPTIONS,\n OPTIMIZATION_OPTION_GROUPS,\n SCHEDULE_STEPS,\n STEP_INTERVAL_MS,\n POLL_INTERVAL_MS,\n OPTIMIZING_STEP_INDEX,\n NETWORK_ERROR_FAILURE,\n} from \"./constants\";\nimport { buildStyles } from \"./utils/theme\";\nimport { buildSchedulePayload } from \"./buildSchedulePayload\";\nimport { getToken, submitSolveJob, getJobStatus, getJobResult, getJobSolution } from \"./api/api\";\nimport { mapViolationsToResult } from \"./utils/mapViolationsToResult\";\nimport type { Screen, StepStatus, ViolatedConstraintsResult } from \"./types\";\nimport { ViolatedConstraintsPanel } from \"./ViolatedConstraintsPanel\";\n\n\nexport function AutoSchedulerModal({\n baseURL,\n isOpen,\n title = \"Auto-scheduling\",\n bannerText,\n jurisdictions,\n openShifts,\n employees,\n timeOffs,\n locationPlaceholder = \"Select locations\",\n onClose,\n cancelLabel = \"Cancel\",\n primaryActionLabel = \"Create schedule\",\n onPrimaryAction: _onPrimaryAction,\n onFixManually,\n initialConfig,\n theme,\n cssVarsRoot,\n generateRecommendationsURLAndHeaders,\n getTokenURLAndHeaders,\n onSolution,\n getStoredConfigForLocations,\n persistConfigForLocations,\n errorToast,\n}: AutoSchedulerModalProps) {\n const baseTheme = useTheme();\n const { chakraOverride, styleOverrides } = useMemo(\n () => resolveThemeParts(theme),\n [theme],\n );\n const mergedTheme = useMemo(\n () => mergeThemeWithBase(baseTheme as Record<string, unknown>, chakraOverride),\n [baseTheme, chakraOverride],\n );\n const styles = useMemo(() => buildStyles(defaultStyles, styleOverrides), [styleOverrides]);\n const [selectedConstraintIds, setSelectedConstraintIds] = useState<string[]>([]);\n const [constraintValues, setConstraintValues] = useState<Record<string, string>>({});\n const [selectedOptimizationIds, setSelectedOptimizationIds] = useState<string[]>([]);\n const [optimizationValues, setOptimizationValues] = useState<Record<string, string>>({});\n const [screen, setScreen] = useState<Screen>(\"configure\");\n const [activeStepIndex, setActiveStepIndex] = useState(0);\n const [completedStepIndex, setCompletedStepIndex] = useState(-1);\n const [lastFailure, setLastFailure] = useState<ViolatedConstraintsResult | null>(null);\n const [selectedLocationIds, setSelectedLocationIds] = useState<string[]>([]);\n const timersRef = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n const pollIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const runIdRef = useRef(0);\n\n const selectedByJurisdiction = useMemo(\n () =>\n jurisdictions\n .map((jurisdiction) => ({\n ...jurisdiction,\n selectedLocations: jurisdiction.locations.filter((location) =>\n selectedLocationIds.includes(location.id),\n ),\n }))\n .filter((jurisdiction) => jurisdiction.selectedLocations.length > 0),\n [jurisdictions, selectedLocationIds],\n );\n\n const selectedCount = selectedByJurisdiction.reduce(\n (total, jurisdiction) => total + jurisdiction.selectedLocations.length,\n 0,\n );\n\n const locationIdsWithOpenShifts = useMemo(() => {\n return new Set(\n openShifts\n .filter((shift) => !shift.employeeId)\n .map((shift) => shift.location.id),\n );\n }, [openShifts]);\n\n const selectedConstraints = useMemo(\n () => HARD_CONSTRAINT_OPTIONS.filter((option) => selectedConstraintIds.includes(option.id)),\n [selectedConstraintIds],\n );\n\n const optimizationOptions = useMemo(\n () =>\n OPTIMIZATION_OPTION_GROUPS.flatMap((group) =>\n group.options.map((option) => ({\n ...option,\n groupId: group.id,\n groupName: group.name,\n })),\n ),\n [],\n );\n\n const selectedOptimizationOptions = useMemo(\n () =>\n optimizationOptions.filter((option) =>\n selectedOptimizationIds.includes(option.id),\n ),\n [optimizationOptions, selectedOptimizationIds],\n );\n\n\n const hasEmptyInputs = useMemo(() => {\n const hasEmptyConstraint = selectedConstraints.some(\n (opt) => !constraintValues[opt.id]?.trim(),\n );\n const hasEmptyWeight =\n selectedOptimizationOptions.length >= 2 &&\n selectedOptimizationOptions.some(\n (opt) => !optimizationValues[`${opt.id}_weightPoints`]?.trim(),\n );\n return hasEmptyConstraint || hasEmptyWeight;\n }, [selectedConstraints, constraintValues, selectedOptimizationOptions, optimizationValues]);\n\n const allocationSummary = useMemo(() => {\n if (selectedOptimizationOptions.length === 0) return \"\";\n const totalWeight = selectedOptimizationOptions.reduce(\n (sum, opt) => sum + (Number(optimizationValues[`${opt.id}_weightPoints`]) || 1),\n 0,\n );\n const parts = selectedOptimizationOptions.map((opt) => {\n const weight = Number(optimizationValues[`${opt.id}_weightPoints`]) || 1;\n const pct = Math.round((weight / totalWeight) * 100);\n return `${opt.title} ${pct}%`;\n });\n return `Scheduling priorities: ${parts.join(\", \")}.`;\n }, [selectedOptimizationOptions, optimizationValues]);\n\n const clearTimers = () => {\n timersRef.current.forEach((timerId) => clearTimeout(timerId));\n timersRef.current = [];\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n pollIntervalRef.current = null;\n }\n };\n\n const resetProgress = () => {\n setActiveStepIndex(0);\n setCompletedStepIndex(-1);\n };\n\n useEffect(() => {\n if (!isOpen) {\n clearTimers();\n setScreen(\"configure\");\n setLastFailure(null);\n setSelectedLocationIds([]);\n setSelectedOptimizationIds([]);\n setSelectedConstraintIds([]);\n setConstraintValues({});\n setOptimizationValues({});\n resetProgress();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && initialConfig) {\n setSelectedLocationIds(initialConfig.selectedLocationIds);\n setSelectedConstraintIds(initialConfig.selectedConstraintIds);\n setConstraintValues(initialConfig.constraintValues);\n setSelectedOptimizationIds(initialConfig.selectedOptimizationIds);\n setOptimizationValues(initialConfig.optimizationValues);\n if (initialConfig.failure) {\n setLastFailure(initialConfig.failure);\n }\n setScreen(\"configure\");\n }\n }, [isOpen, initialConfig]);\n\n useEffect(() => {\n if (\n selectedLocationIds.length === 0 ||\n initialConfig ||\n !getStoredConfigForLocations\n ) {\n return;\n }\n const stored = getStoredConfigForLocations(selectedLocationIds);\n if (stored) {\n setSelectedConstraintIds(stored.selectedConstraintIds);\n setConstraintValues(stored.constraintValues);\n setSelectedOptimizationIds(stored.selectedOptimizationIds);\n setOptimizationValues(stored.optimizationValues);\n } else {\n setSelectedConstraintIds([]);\n setConstraintValues({});\n setSelectedOptimizationIds([]);\n setOptimizationValues({});\n }\n }, [selectedLocationIds, initialConfig, getStoredConfigForLocations]);\n\n useEffect(() => () => clearTimers(), []);\n\n useEffect(() => {\n setSelectedLocationIds((previous) => {\n const filtered = previous.filter((id) => locationIdsWithOpenShifts.has(id));\n return filtered.length === previous.length ? previous : filtered;\n });\n }, [locationIdsWithOpenShifts]);\n\n const stepStatusForIndex = (index: number): StepStatus => {\n if (index <= completedStepIndex) {\n return \"done\";\n }\n if (index === activeStepIndex) {\n return \"active\";\n }\n return \"pending\";\n };\n\n const resetBeforeSubmit = () => {\n clearTimers();\n setScreen(\"creating\");\n setLastFailure(null);\n resetProgress();\n runIdRef.current += 1;\n return runIdRef.current;\n }\n\n const schedule = (delayMs: number, action: () => void, runId: number) => {\n const timerId = setTimeout(() => {\n if (runIdRef.current !== runId) {\n return;\n }\n action();\n }, delayMs);\n timersRef.current.push(timerId);\n };\n\n const afterSuccessSteps = (runId: number, response: SolveApiResponse) => {\n schedule(STEP_INTERVAL_MS, () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(2);\n setActiveStepIndex(3);\n }, runId);\n schedule(STEP_INTERVAL_MS * 2, () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(3);\n setActiveStepIndex(4);\n }, runId);\n schedule(STEP_INTERVAL_MS * 3, async () => {\n if (runIdRef.current !== runId) return;\n\n try {\n await onSolution(response.solution);\n setCompletedStepIndex(4);\n setActiveStepIndex(4);\n } catch (err) {\n console.error(err);\n const defaultErrorMessage = \"Failed to create schedule shifts\";\n const detailedErrorMessage = (err instanceof Error) ? err.message || defaultErrorMessage : defaultErrorMessage;\n setLastFailure({\n violatedConstraints: [\n {\n title: \"Something went wrong\",\n detail: detailedErrorMessage,\n },\n ],\n recommendedFixes: [],\n });\n setScreen(\"failed\");\n }\n }, runId);\n }\n\n const handleCreateSchedule = () => {\n if (selectedCount === 0) {\n return;\n }\n\n const payload = buildSchedulePayload({\n employees,\n openShifts,\n timeOffs,\n selectedLocationIds,\n jurisdictions,\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n });\n\n persistConfigForLocations?.(selectedLocationIds, {\n selectedLocationIds,\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n });\n\n const runId = resetBeforeSubmit();\n\n schedule(STEP_INTERVAL_MS, async () => {\n setCompletedStepIndex(0);\n setActiveStepIndex(1);\n\n try {\n const token = await getToken(getTokenURLAndHeaders.url, getTokenURLAndHeaders.headers);\n if (!token) {\n throw new Error(\"Failed to get auto-scheduler token\");\n }\n\n const auth = { authorization: `Bearer ${token}` };\n const { jobId } = await submitSolveJob(baseURL, payload, auth);\n\n if (runIdRef.current !== runId) {\n return;\n }\n\n setCompletedStepIndex(1);\n setActiveStepIndex(OPTIMIZING_STEP_INDEX);\n\n const pollForResult = async () => {\n if (runIdRef.current !== runId) return;\n try {\n const statusRes = await getJobStatus(baseURL, jobId, auth);\n if (runIdRef.current !== runId) return;\n\n if (statusRes.status === \"NOT_SOLVING\" || statusRes.status === \"TERMINATED_EARLY\") {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n pollIntervalRef.current = null;\n }\n const response = await getJobResult(baseURL, jobId, auth);\n if (runIdRef.current !== runId) return;\n let responseForHandling = response;\n if (response.explanation.isFeasible) {\n const solution = await getJobSolution(baseURL, jobId, auth);\n if (runIdRef.current !== runId) return;\n responseForHandling = { ...response, solution };\n }\n handleSolveResult(runId, responseForHandling);\n return;\n }\n } catch (err) {\n if (runIdRef.current !== runId) return;\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n pollIntervalRef.current = null;\n }\n console.error(err);\n setLastFailure(NETWORK_ERROR_FAILURE);\n setScreen(\"failed\");\n }\n };\n\n pollForResult();\n pollIntervalRef.current = setInterval(pollForResult, POLL_INTERVAL_MS);\n } catch (err) {\n if (runIdRef.current !== runId) {\n return;\n }\n console.error(err);\n setLastFailure(NETWORK_ERROR_FAILURE);\n setScreen(\"failed\");\n }\n }, runId);\n };\n\n const handleSolveResult = (runId: number, response: SolveApiResponse) => {\n if (!response.explanation.isFeasible) {\n const result = mapViolationsToResult(\n response.explanation.violations ?? [],\n response.explanation.summary\n );\n\n const selectedLocations = jurisdictions.flatMap((j) => j.locations).filter((l) =>\n selectedLocationIds.includes(l.id)\n );\n const recommendationPayload = generateRecommendationsURLAndHeaders\n ? {\n context: {\n selectedLocationIds,\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n timezone: selectedLocations[0]?.timezone,\n },\n locations: selectedLocations,\n employees,\n openShifts: openShifts.filter((s) => !s.employeeId),\n assignedShifts: openShifts.filter((s) => Boolean(s.employeeId)),\n timeOffs: timeOffs ?? [],\n explanation: response.explanation,\n }\n : undefined;\n\n setLastFailure({\n ...result,\n recommendedFixes: [],\n recommendationPayload,\n });\n setScreen(\"failed\");\n } else {\n afterSuccessSteps(runId, response);\n }\n };\n\n const handleAdjustConstraints = () => {\n clearTimers();\n setScreen(\"configure\");\n };\n\n const handleToggleLocation = (locationId: string) => {\n if (!locationIdsWithOpenShifts.has(locationId)) {\n return;\n }\n\n if (selectedLocationIds.includes(locationId)) {\n setSelectedLocationIds(selectedLocationIds.filter((id) => id !== locationId));\n return;\n }\n\n setSelectedLocationIds([...selectedLocationIds, locationId]);\n };\n\n const handleToggleConstraint = (constraintId: string) => {\n setSelectedConstraintIds((prev) => {\n if (prev.includes(constraintId)) {\n setConstraintValues((values) => {\n const next = { ...values };\n delete next[constraintId];\n return next;\n });\n return prev.filter((id) => id !== constraintId);\n }\n\n if (HARD_CONSTRAINT_DEFAULTS[constraintId]) {\n setConstraintValues((values) => ({\n ...values,\n [constraintId]: HARD_CONSTRAINT_DEFAULTS[constraintId],\n }));\n }\n return [...prev, constraintId];\n });\n };\n\n const handleToggleOptimization = (optionId: string) => {\n setSelectedOptimizationIds((prev) => {\n if (prev.includes(optionId)) {\n setOptimizationValues((values) => {\n const next = { ...values };\n delete next[`${optionId}_weightPoints`];\n if (optionId === \"fair_hour_distribution\") {\n delete next[\"fair_hour_distribution_balanceTarget\"];\n delete next[\"fair_hour_distribution_period\"];\n } else if (optionId === \"minimize_overtime\") {\n delete next[\"minimize_overtime_thresholdMinutes\"];\n delete next[\"minimize_overtime_period\"];\n }\n return next;\n });\n return prev.filter((id) => id !== optionId);\n }\n\n if (prev.length >= 3) return prev;\n\n setOptimizationValues((values) => ({\n ...values,\n [`${optionId}_weightPoints`]: \"1\",\n }));\n return [...prev, optionId];\n });\n };\n\n const modalTitle = screen === \"configure\" ? title : \"Creating schedule\";\n const showConfiguration = screen === \"configure\";\n const showFailed = screen === \"failed\";\n\n const violationTitle = useMemo(\n () => showFailed ? \"Schedule can’t be created\" : \"Validating compliance rules\",\n [showFailed]\n );\n\n const violationPanel = lastFailure ? (\n <ViolatedConstraintsPanel\n violatedConstraints={lastFailure}\n title={violationTitle}\n subtitle=\"\"\n errorToast={errorToast}\n generateRecommendationsURLAndHeaders={generateRecommendationsURLAndHeaders}\n styles={styles}\n />\n ) : null;\n\n const configurationContent = (\n <Stack spacing=\"20px\">\n <Box sx={styles.banner}>\n <Box sx={styles.bannerIcon}>\n <MagicIcon />\n </Box>\n {bannerText ? (\n <Text sx={styles.bannerText}>{bannerText}</Text>\n ) : (\n <Stack spacing=\"4px\" flex={1}>\n <Text sx={styles.bannerTitle}>\n Create a smarter retail schedule in seconds.\n </Text>\n <Text sx={styles.bannerText}>\n AI assigns open shifts using your rules, availability, and\n optimization priorities while keeping existing assigned shifts in\n place.\n </Text>\n </Stack>\n )}\n </Box>\n\n {openShifts.length === 0 ? (\n <Box\n sx={{\n bg: \"#FFF4E5\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"8px\",\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-start\",\n }}\n >\n <Box sx={{ color: \"#B76E00\", flexShrink: 0, mt: \"2px\" }}>\n <WarningIcon />\n </Box>\n <Text sx={{ fontSize: \"13px\", color: \"#7A4100\", lineHeight: \"20px\" }}>\n There are no open shifts to schedule. Add open shifts before creating a schedule.\n </Text>\n </Box>\n ) : null}\n\n <Stack spacing=\"8px\" sx={styles.locationSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.locationLabelRow}>\n <Text sx={styles.locationLabel}>Location</Text>\n {selectedCount > 0 ? (\n <Badge sx={styles.locationBadge}>{selectedCount}</Badge>\n ) : null}\n </HStack>\n <Text sx={styles.locationSubtitle}>\n Select locations within the same labor jurisdiction. Locations from different jurisdictions cannot be combined.\n </Text>\n </Stack>\n\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button variant=\"unstyled\" sx={styles.locationTrigger}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.locationTriggerText,\n ...(selectedLocationIds.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedLocationIds.length > 0\n ? jurisdictions\n .flatMap((j) => j.locations)\n .filter((l) => selectedLocationIds.includes(l.id))\n .map((l) => l.name)\n .join(\", \")\n : locationPlaceholder}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.popoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"4px\">\n {jurisdictions.map((jurisdiction) => (\n <Box key={jurisdiction.id}>\n <Text sx={styles.groupHeader}>{jurisdiction.title}</Text>\n <Stack spacing=\"2px\">\n {jurisdiction.locations.map((location) => (\n <HStack\n key={location.id}\n as=\"label\"\n sx={{\n ...styles.optionRow,\n cursor: locationIdsWithOpenShifts.has(location.id)\n ? \"pointer\"\n : \"not-allowed\",\n opacity: locationIdsWithOpenShifts.has(location.id) ? 1 : 0.55,\n }}\n >\n <Checkbox\n id={`location-${location.id}`}\n isChecked={selectedLocationIds.includes(location.id)}\n isDisabled={!locationIdsWithOpenShifts.has(location.id)}\n onChange={() => handleToggleLocation(location.id)}\n />\n <Text sx={styles.optionLabel}>{location.name}</Text>\n </HStack>\n ))}\n </Stack>\n </Box>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n\n <Stack spacing=\"8px\">\n {selectedByJurisdiction.map((jurisdiction) => (\n <Box key={jurisdiction.id} sx={styles.selectedBanner}>\n <Box sx={styles.selectedBannerIcon}>\n <InfoIcon />\n </Box>\n <Box sx={styles.selectedBannerText}>\n <Text fontWeight={600}>Compliance jurisdiction: {jurisdiction.title}</Text>\n <Text>\n {jurisdiction.selectedLocations.map((location) => location.name).join(\", \")}\n </Text>\n </Box>\n </Box>\n ))}\n </Stack>\n </Stack>\n\n <Stack spacing=\"16px\" sx={styles.hardConstraintsSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.hardConstraintsLabelRow}>\n <Text sx={styles.hardConstraintsLabel}>\n Required rules\n </Text>\n {selectedConstraintIds.length > 0 ? (\n <Badge sx={styles.hardConstraintsBadge}>{selectedConstraintIds.length}</Badge>\n ) : null}\n </HStack>\n <Text sx={styles.hardConstraintsSubtitle}>\n Assigned shifts will be required to meet the following rules:\n </Text>\n </Stack>\n\n {showConfiguration && lastFailure ? violationPanel : null}\n\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button variant=\"unstyled\" sx={styles.hardConstraintsTrigger}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.hardConstraintsTriggerText,\n ...(selectedConstraintIds.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedConstraintIds.length > 0\n ? HARD_CONSTRAINT_OPTIONS\n .filter((o) => selectedConstraintIds.includes(o.id))\n .map((o) => o.name)\n .join(\", \")\n : \"Select rules\"}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.hardConstraintsPopoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"4px\">\n {HARD_CONSTRAINT_OPTIONS.map((option) => (\n <HStack\n key={option.id}\n as=\"label\"\n sx={{ ...styles.hardConstraintsOptionRow, cursor: \"pointer\" }}\n >\n <Checkbox\n id={`constraint-${option.id}`}\n isChecked={selectedConstraintIds.includes(option.id)}\n onChange={() => handleToggleConstraint(option.id)}\n />\n <Text sx={styles.hardConstraintsOptionLabel}>{option.name}</Text>\n </HStack>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n\n {selectedConstraints.length > 0 ? (\n <Box sx={styles.hardConstraintsInputsContainer}>\n <Stack spacing=\"16px\">\n {selectedConstraints.map((option, index) => (\n <Stack key={option.id} sx={styles.hardConstraintsInputItem}>\n <Text sx={styles.hardConstraintsInputLabel}>\n {index + 1}. {option.name}\n </Text>\n <InputGroup>\n <Input\n type=\"number\"\n value={constraintValues[option.id] ?? \"\"}\n onChange={(event) =>\n setConstraintValues((prev) => ({\n ...prev,\n [option.id]: event.target.value,\n }))\n }\n min={option.id === \"max_work_days_per_week\" ? 1 : undefined}\n max={option.id === \"max_work_days_per_week\" ? 6 : undefined}\n step={option.id === \"max_work_days_per_week\" ? undefined : \"any\"}\n sx={styles.hardConstraintsInputField}\n />\n <InputRightAddon sx={styles.optimizationSuffix}>\n {option.id === \"max_work_days_per_week\" ? \"days\" : \"hours\"}\n </InputRightAddon>\n </InputGroup>\n </Stack>\n ))}\n </Stack>\n </Box>\n ) : null}\n </Stack>\n\n <Stack spacing=\"16px\" sx={styles.optimizationSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.optimizationLabelRow}>\n <Text sx={styles.optimizationLabel}>Optimization</Text>\n {selectedOptimizationIds.length > 0 ? (\n <Badge sx={styles.optimizationBadge}>{selectedOptimizationIds.length}</Badge>\n ) : null}\n </HStack>\n <Text sx={styles.optimizationSubtitle}>\n Your schedule will be optimized based on the following priorities:\n </Text>\n </Stack>\n\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button variant=\"unstyled\" sx={styles.optimizationTrigger}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.optimizationTriggerText,\n ...(selectedOptimizationIds.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedOptimizationIds.length > 0\n ? optimizationOptions\n .filter((o) => selectedOptimizationIds.includes(o.id))\n .map((o) => o.title)\n .join(\", \")\n : \"Select optimization priorities\"}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.optimizationPopoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"4px\">\n {OPTIMIZATION_OPTION_GROUPS.map((group) => (\n <Box key={group.id}>\n <Text sx={styles.optimizationGroupHeader}>{group.name}</Text>\n <Stack spacing=\"2px\">\n {group.options.map((option) => (\n <Stack\n key={option.id}\n as=\"label\"\n spacing=\"2px\"\n sx={{ ...styles.optimizationOptionRow, cursor: \"pointer\" }}\n >\n <HStack spacing=\"8px\">\n <Checkbox\n id={`optimization-${option.id}`}\n isChecked={selectedOptimizationIds.includes(option.id)}\n isDisabled={\n !selectedOptimizationIds.includes(option.id) &&\n selectedOptimizationIds.length >= 3\n }\n onChange={() => handleToggleOptimization(option.id)}\n />\n <Text sx={styles.optimizationOptionLabel}>{option.title}</Text>\n </HStack>\n {option.subtitle ? (\n <Text sx={styles.optimizationOptionHelp}>{option.subtitle}</Text>\n ) : null}\n </Stack>\n ))}\n </Stack>\n </Box>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n\n {selectedOptimizationOptions.length >= 2 ? (\n <Box sx={styles.optimizationInputsContainer}>\n <Stack spacing=\"16px\">\n {selectedOptimizationOptions.map((option, index) => (\n <Stack\n key={option.id}\n sx={styles.optimizationInputItem}\n >\n <Stack sx={styles.hardConstraintsInputItem}>\n <Text sx={styles.hardConstraintsInputLabel}>{index + 1}. {option.title}</Text>\n <InputGroup>\n <Input\n type=\"text\"\n value={optimizationValues[`${option.id}_weightPoints`] ?? \"1\"}\n onChange={(e) => {\n const val = e.target.value;\n if (val !== \"\" && (!/^\\d+$/.test(val) || Number(val) < 1)) return;\n setOptimizationValues((prev) => ({\n ...prev,\n [`${option.id}_weightPoints`]: val,\n }));\n }}\n sx={styles.hardConstraintsInputField}\n />\n <InputRightAddon sx={styles.optimizationSuffix}>\n points\n </InputRightAddon>\n </InputGroup>\n </Stack>\n </Stack>\n ))}\n </Stack>\n <Divider sx={{ ...styles.optimizationDivider, my: \"16px\" }} />\n <Text sx={styles.optimizationSummary}>{allocationSummary}</Text>\n </Box>\n ) : null}\n </Stack>\n </Stack>\n );\n\n const stepsContent = (\n <Stack spacing=\"16px\" sx={styles.stepsContainer}>\n {showFailed ? violationPanel : null}\n <Stack spacing=\"14px\" sx={styles.stepsList}>\n {SCHEDULE_STEPS.map((step, index) => {\n const status = stepStatusForIndex(index);\n const isFailedStep = showFailed && index === activeStepIndex;\n const iconStyles = {\n ...styles.stepIcon,\n ...(status === \"active\" ? styles.stepIconActive : null),\n ...(status === \"done\" ? styles.stepIconDone : null),\n ...(status === \"pending\" ? styles.stepIconPending : null),\n ...(isFailedStep ? styles.stepIconFailed : null),\n };\n const titleStyles = {\n ...styles.stepTitle,\n ...(status === \"active\" ? styles.stepTitleActive : null),\n ...(status === \"done\" ? styles.stepTitleDone : null),\n ...(status === \"pending\" ? styles.stepTitlePending : null),\n ...(isFailedStep ? styles.stepTitleFailed : null),\n };\n return (\n <HStack key={step.title} sx={styles.stepRow}>\n <Box sx={iconStyles}>\n {isFailedStep ? (\n <FailedIcon width={12} height={12} />\n ) : status === \"active\" ? (\n <Spinner size=\"sm\" thickness=\"2px\" speed=\"0.7s\" />\n ) : status === \"done\" ? (\n <CheckIcon width={12} height={12} />\n ) : null}\n </Box>\n <Box>\n <Text sx={titleStyles}>{step.title}</Text>\n {status === \"active\" && step.subtitle ? (\n <Text sx={styles.stepSubtitle}>{step.subtitle}</Text>\n ) : null}\n </Box>\n </HStack>\n );\n })}\n </Stack>\n </Stack>\n );\n\n const modalFooter = showConfiguration ? (\n <ModalFooter sx={styles.footer}>\n <Button variant=\"outline\" onClick={onClose} sx={styles.cancelButton}>\n {cancelLabel}\n </Button>\n <Button\n onClick={handleCreateSchedule}\n isDisabled={selectedCount === 0 || openShifts.length === 0 || hasEmptyInputs}\n sx={styles.primaryButton}\n >\n {primaryActionLabel}\n </Button>\n </ModalFooter>\n ) : showFailed ? (\n <ModalFooter sx={styles.failedFooter}>\n <Button\n variant=\"outline\"\n onClick={() => {\n if (lastFailure) {\n onFixManually?.(lastFailure, {\n selectedLocationIds,\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n });\n }\n onClose();\n }}\n sx={styles.failedSecondaryButton}\n >\n Fix manually on schedule\n </Button>\n <Button onClick={handleAdjustConstraints} sx={styles.failedPrimaryButton}>\n Adjust constraints\n </Button>\n </ModalFooter>\n ) : null;\n\n const modalContent = (\n <Modal isOpen={isOpen} onClose={onClose} isCentered motionPreset=\"scale\" closeOnOverlayClick={false} closeOnEsc={false}>\n <ModalOverlay sx={styles.overlay} />\n <ModalContent sx={styles.content}>\n <ModalHeader sx={styles.header}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text sx={styles.title}>{modalTitle}</Text>\n <IconButton\n aria-label=\"Close modal\"\n variant=\"ghost\"\n size=\"sm\"\n icon={<CloseIcon />}\n onClick={onClose}\n sx={styles.closeButton}\n />\n </HStack>\n </ModalHeader>\n <ModalBody sx={showConfiguration ? styles.body : { ...styles.body, ...styles.creatingBody }}>\n {showConfiguration ? configurationContent : stepsContent}\n </ModalBody>\n {modalFooter}\n </ModalContent>\n </Modal>\n );\n\n if (theme || cssVarsRoot) {\n return (\n <ChakraProvider theme={mergedTheme} cssVarsRoot={cssVarsRoot}>\n {modalContent}\n </ChakraProvider>\n );\n }\n\n return modalContent;\n}\n","import type { SVGProps } from \"react\";\n\nexport interface DotIconProps extends SVGProps<SVGSVGElement> {\n /** Size of the dot in pixels. Defaults to 6. */\n size?: number;\n}\n\nexport function DotIcon({ size = 6, fill, stroke, ...props }: DotIconProps) {\n const useStroke = stroke != null;\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill={useStroke ? \"none\" : (fill ?? \"currentColor\")}\n stroke={stroke}\n width={size}\n height={size}\n {...props}\n >\n <circle cx=\"10\" cy=\"10\" r=\"10\" />\n </svg>\n );\n}\n\nexport function MagicIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path d=\"M10 2.5l1.2 3.3 3.3 1.2-3.3 1.2-1.2 3.3-1.2-3.3-3.3-1.2 3.3-1.2L10 2.5z\" />\n <path d=\"M4.5 11.2l.7 1.9 1.9.7-1.9.7-.7 1.9-.7-1.9-1.9-.7 1.9-.7.7-1.9z\" />\n <path d=\"M15.5 12.5l.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6.6-1.7z\" />\n </svg>\n );\n}\n\nexport function InfoIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path d=\"M10 1.75a8.25 8.25 0 1 0 0 16.5 8.25 8.25 0 0 0 0-16.5zm0 3.75a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm-1 4.25c0-.41.34-.75.75-.75h.5c.41 0 .75.34.75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.25a.75.75 0 0 1-.75-.75z\" />\n </svg>\n );\n}\n\nexport function WarningIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M9.25 3.6a.86.86 0 0 1 1.5 0l7.2 12.1a.86.86 0 0 1-.75 1.3H2.8a.86.86 0 0 1-.75-1.3l7.2-12.1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 7v4.7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"10\" cy=\"13.5\" r=\"0.9\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function ChevronDownIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M5 7.5l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CloseIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M5.5 5.5l9 9m0-9l-9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CheckIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M5.5 10.5l3 3 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FailedIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M6.5 6.5l7 7m0-7l-7 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import type { ThemeOverride } from \"@chakra-ui/react\";\nimport type {\n AutoSchedulerModalStyleOverrides,\n AutoSchedulerModalTheme,\n EasyTeamThemeOverrides,\n} from \"../types\";\n\nconst componentNameMap: Record<string, string> = {\n button: \"Button\",\n input: \"Input\",\n tooltip: \"Tooltip\",\n modal: \"Modal\",\n switch: \"Switch\",\n drawer: \"Drawer\",\n checkbox: \"Checkbox\",\n radio: \"Radio\",\n menu: \"Menu\",\n tabs: \"Tabs\",\n select: \"Select\",\n numberinput: \"NumberInput\",\n textarea: \"Textarea\",\n popover: \"Popover\",\n badge: \"Badge\",\n text: \"Text\",\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst mapComponentOverrides = (overrides: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n\n Object.entries(overrides).forEach(([key, value]) => {\n if (key === \"components\" && isRecord(value)) {\n Object.assign(result, value);\n return;\n }\n\n const normalizedKey = componentNameMap[key] ?? componentNameMap[key.toLowerCase()] ?? key;\n result[normalizedKey] = value;\n });\n\n return result;\n};\n\nconst deepMerge = (\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...target };\n\n Object.entries(source).forEach(([key, value]) => {\n if (isRecord(value) && isRecord(result[key])) {\n result[key] = deepMerge(result[key] as Record<string, unknown>, value);\n return;\n }\n\n result[key] = value;\n });\n\n return result;\n};\n\nexport type ResolvedThemeParts = {\n chakraOverride?: ThemeOverride;\n styleOverrides?: AutoSchedulerModalStyleOverrides;\n};\n\nexport const resolveThemeParts = (\n theme?: AutoSchedulerModalTheme,\n): ResolvedThemeParts => {\n if (!theme || !isRecord(theme)) {\n return {};\n }\n\n const autoSchedulerModal = isRecord(theme.autoSchedulerModal)\n ? (theme.autoSchedulerModal as AutoSchedulerModalStyleOverrides)\n : undefined;\n\n if (\"tokens\" in theme) {\n const easyTheme = theme as EasyTeamThemeOverrides & {\n autoSchedulerModal?: AutoSchedulerModalStyleOverrides;\n };\n const { tokens, autoSchedulerModal: _ignored, ...rest } = easyTheme;\n const chakraOverride: ThemeOverride = {\n ...(isRecord(tokens) ? tokens : {}),\n components: mapComponentOverrides(rest),\n };\n\n return { chakraOverride, styleOverrides: autoSchedulerModal };\n }\n\n const { autoSchedulerModal: _ignored, ...override } =\n theme as ThemeOverride & { autoSchedulerModal?: AutoSchedulerModalStyleOverrides };\n\n return { chakraOverride: override, styleOverrides: autoSchedulerModal };\n};\n\nexport const mergeThemeWithBase = (\n baseTheme: Record<string, unknown>,\n override?: ThemeOverride,\n): Record<string, unknown> => {\n if (!override) {\n return baseTheme;\n }\n\n return deepMerge(baseTheme, override as Record<string, unknown>);\n};\n","import { AutoSchedulerModalStyleOverrides, ViolatedConstraintsResult } from \"./types\";\n\nexport const HARD_CONSTRAINT_DEFAULTS: Record<string, string> = {\n max_weekly_hours: \"40\",\n max_daily_hours: \"8\",\n min_rest_between_shifts: \"24\",\n max_work_days_per_week: \"6\",\n};\n\nexport const HARD_CONSTRAINT_OPTIONS = [\n { id: \"max_weekly_hours\", name: \"Maximum weekly hours\" },\n { id: \"max_daily_hours\", name: \"Maximum daily hours\" },\n { id: \"min_rest_between_shifts\", name: \"Minimum rest between shifts\" },\n { id: \"max_work_days_per_week\", name: \"Maximum work days per week\" },\n // { id: \"minor_max_daily_hours\", name: \"Minor maximum daily hours\" },\n // { id: \"minor_late_hours_restriction\", name: \"Minor late hours restriction\" },\n // { id: \"part_time_weekly_limit\", name: \"Part-time weekly limit\" },\n // { id: \"min_staffing\", name: \"Minimum staffing\" },\n] as const;\n\nexport const OPTIMIZATION_OPTION_GROUPS = [\n {\n id: \"employee_happiness\",\n name: \"Employee happiness\",\n options: [\n {\n id: \"fair_hour_distribution\",\n title: \"Fair hour distribution\",\n subtitle: \"Distribute shifts evenly across all staff members\",\n },\n {\n id: \"staff_preferences\",\n title: \"Respect open shift preferences\",\n subtitle: \"Consider staff requests and preferred shifts when assigning\",\n },\n ],\n },\n {\n id: \"labor_cost_optimization\",\n name: \"Labor cost optimization\",\n options: [\n {\n id: \"minimize_overtime\",\n title: \"Minimize overtime\",\n subtitle: \"Reduce hours beyond standard work time\",\n },\n {\n id: \"cost_to_sales_ratio\",\n title: \"Cost-to-sales ratio\",\n subtitle:\n \"Assign shifts based on total compensation (wages + commissions) compared to sales performance\",\n },\n ],\n },\n {\n id: \"sales_optimization\",\n name: \"Sales optimization\",\n options: [\n {\n id: \"maximize_sales\",\n title: \"Maximize sales\",\n subtitle: \"Prioritize top-performing staff during peak hours\",\n },\n ],\n },\n] as const;\n\n// fair-hour-distribution\nexport const BALANCE_TARGET_OPTIONS = [\n { value: \"HOURS\", label: \"Hours\" },\n { value: \"SHIFTS\", label: \"Shifts\" },\n { value: \"WEEKEND_SHIFTS\", label: \"Weekend shifts\" },\n { value: \"OVERTIME_HOURS\", label: \"Overtime hours\" },\n] as const;\n\nexport const PERIOD_OPTIONS = [\n { value: \"DAY\", label: \"Day\" },\n { value: \"WEEK\", label: \"Week\" },\n { value: \"MONTH\", label: \"Month\" },\n] as const;\n\n// labor-cost-optimization\nexport const DIRECTION_OPTIONS = [\n { value: \"MINIMIZE\", label: \"Minimize\" },\n { value: \"MAXIMIZE\", label: \"Maximize\" },\n] as const;\n\nexport const defaultStyles: Required<AutoSchedulerModalStyleOverrides> = {\n overlay: {\n bg: \"rgba(0, 0, 0, 0.45)\",\n },\n content: {\n maxW: \"600px\",\n bg: \"white\",\n borderRadius: \"20px\",\n boxShadow:\n \"0px 20px 20px -8px rgba(26, 26, 26, 0.28), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.17)\",\n overflow: \"hidden\",\n maxH: \"calc(100vh - 32px)\",\n display: \"flex\",\n flexDirection: \"column\",\n },\n header: {\n bg: \"#f3f3f3\",\n borderBottom: \"1px solid #e3e3e3\",\n px: \"16px\",\n py: \"12px\",\n },\n title: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n closeButton: {\n color: \"#5c5c5c\",\n borderRadius: \"8px\",\n },\n body: {\n px: \"16px\",\n py: \"16px\",\n overflowY: \"auto\",\n flex: \"1 1 auto\",\n },\n banner: {\n backgroundColor: \"#F5EFFF !important\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"8px\",\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-start\",\n },\n bannerIcon: {\n color: \"#5c2dbf\",\n },\n bannerTitle: {\n fontSize: \"13px\",\n fontWeight: 700,\n color: \"#370e88\",\n lineHeight: \"20px\",\n },\n bannerText: {\n fontSize: \"13px\",\n color: \"#370e88\",\n lineHeight: \"20px\",\n },\n locationSection: {},\n locationLabelRow: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n locationLabel: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n locationBadge: {\n bg: \"#e1e3e5\",\n color: \"#303030\",\n borderRadius: \"999px\",\n px: \"6px\",\n py: \"2px\",\n fontSize: \"11px\",\n fontWeight: 600,\n },\n locationSubtitle: {\n fontSize: \"12px\",\n color: \"#616161\",\n },\n locationTrigger: {\n w: \"100%\",\n justifyContent: \"space-between\",\n px: \"12px\",\n h: \"32px\",\n borderRadius: \"8px\",\n border: \"1px solid rgb(185, 184, 184)\",\n },\n locationTriggerText: {\n fontSize: \"13px\",\n fontWeight: 450,\n color: \"#616161\",\n },\n popoverContent: {\n w: \"100%\",\n bg: \"white\",\n borderRadius: \"12px\",\n px: \"6px\",\n py: \"6px\",\n border: \"none\",\n maxH: \"260px\",\n overflowY: \"auto\",\n boxShadow:\n \"0px 4px 6px -2px rgba(26, 26, 26, 0.2), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.13)\",\n },\n groupHeader: {\n px: \"6px\",\n pt: \"2px\",\n pb: \"4px\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n optionRow: {\n px: \"6px\",\n py: \"6px\",\n borderRadius: \"8px\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n optionLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n selectedBanner: {\n bg: \"#eaf4ff\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"8px\",\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-start\",\n color: \"#00527c\",\n },\n selectedBannerIcon: {\n color: \"#00527c\",\n },\n selectedBannerText: {\n fontSize: \"13px\",\n lineHeight: \"20px\",\n color: \"#00527c\",\n },\n hardConstraintsSection: {},\n hardConstraintsLabelRow: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n hardConstraintsLabel: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n hardConstraintsBadge: {\n bg: \"rgba(0, 0, 0, 0.06)\",\n color: \"#616161\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"2px\",\n fontSize: \"12px\",\n fontWeight: 500,\n },\n hardConstraintsSubtitle: {\n fontSize: \"13px\",\n color: \"#616161\",\n },\n hardConstraintsTrigger: {\n w: \"100%\",\n justifyContent: \"space-between\",\n px: \"12px\",\n h: \"32px\",\n borderRadius: \"8px\",\n border: \"1px solid rgb(185, 184, 184)\",\n },\n hardConstraintsTriggerText: {\n fontSize: \"13px\",\n fontWeight: 450,\n color: \"#616161\",\n },\n hardConstraintsPopoverContent: {\n w: \"100%\",\n bg: \"white\",\n borderRadius: \"12px\",\n px: \"6px\",\n py: \"6px\",\n border: \"none\",\n boxShadow:\n \"0px 4px 6px -2px rgba(26, 26, 26, 0.2), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.13)\",\n },\n hardConstraintsOptionRow: {\n px: \"6px\",\n py: \"6px\",\n borderRadius: \"8px\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n hardConstraintsOptionLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n hardConstraintsInputsContainer: {\n bg: \"#f7f7f7\",\n border: \"1px solid #ebebeb\",\n borderRadius: \"8px\",\n px: \"16px\",\n py: \"16px\",\n },\n hardConstraintsInputItem: {\n gap: \"4px\",\n maxW: \"320px\",\n },\n hardConstraintsInputLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n hardConstraintsInputField: {\n bg: \"#fdfdfd\",\n border: \"1px solid #8a8a8a\",\n borderTopLeftRadius: \"8px\",\n borderBottomLeftRadius: \"8px\",\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n h: \"28px\",\n px: \"12px\",\n },\n optimizationSection: {},\n optimizationLabelRow: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n optimizationLabel: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n optimizationBadge: {\n bg: \"rgba(0, 0, 0, 0.06)\",\n color: \"#616161\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"2px\",\n fontSize: \"12px\",\n fontWeight: 500,\n },\n optimizationSubtitle: {\n fontSize: \"13px\",\n color: \"#616161\",\n },\n optimizationTrigger: {\n w: \"100%\",\n justifyContent: \"space-between\",\n px: \"12px\",\n h: \"32px\",\n borderRadius: \"8px\",\n border: \"1px solid rgb(185, 184, 184)\",\n },\n optimizationTriggerText: {\n fontSize: \"13px\",\n fontWeight: 450,\n color: \"#616161\",\n },\n optimizationPopoverContent: {\n w: \"100%\",\n bg: \"white\",\n borderRadius: \"12px\",\n px: \"6px\",\n py: \"6px\",\n border: \"none\",\n boxShadow:\n \"0px 4px 6px -2px rgba(26, 26, 26, 0.2), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.13)\",\n },\n optimizationGroupHeader: {\n px: \"6px\",\n pt: \"2px\",\n pb: \"4px\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n optimizationOptionRow: {\n px: \"6px\",\n py: \"6px\",\n borderRadius: \"8px\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n },\n optimizationOptionLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n optimizationOptionHelp: {\n fontSize: \"13px\",\n color: \"#616161\",\n ml: \"1.5rem\"\n },\n optimizationInputsContainer: {\n bg: \"#f7f7f7\",\n border: \"1px solid #ebebeb\",\n borderRadius: \"8px\",\n px: \"16px\",\n py: \"16px\",\n },\n optimizationInputItem: {\n gap: \"4px\",\n maxW: \"320px\",\n },\n optimizationInputLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n optimizationInputField: {\n bg: \"#fdfdfd\",\n border: \"1px solid #8a8a8a\",\n borderTopLeftRadius: \"8px\",\n borderBottomLeftRadius: \"8px\",\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n h: \"28px\",\n px: \"12px\",\n },\n optimizationSuffix: {\n fontSize: \"13px\",\n color: \"#616161\",\n h: \"28px\",\n bg: \"#fdfdfd\",\n border: \"1px solid #8a8a8a\",\n borderLeft: \"none\",\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderTopRightRadius: \"8px\",\n borderBottomRightRadius: \"8px\",\n },\n optimizationDivider: {\n borderColor: \"#ebebeb\",\n },\n optimizationSummary: {\n fontSize: \"13px\",\n color: \"#616161\",\n },\n creatingBody: {\n py: \"20px\",\n },\n stepsContainer: {},\n stepsList: {},\n stepRow: {\n alignItems: \"flex-start\",\n gap: \"12px\",\n },\n stepIcon: {\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"999px\",\n border: \"2px solid #d1d1d1\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#616161\",\n flexShrink: 0,\n },\n stepIconActive: {\n border: \"none\",\n color: \"#303030\",\n },\n stepIconDone: {\n border: \"none\",\n bg: \"#008060\",\n color: \"white\",\n borderRadius: \"10px\",\n },\n stepIconPending: {\n borderColor: \"#d1d1d1\",\n color: \"#d1d1d1\",\n },\n stepIconFailed: {\n border: \"none\",\n bg: \"#d72c0d\",\n color: \"white\",\n borderRadius: \"10px\",\n },\n stepTitle: {\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n stepTitleActive: {},\n stepTitleDone: {\n color: \"#9b9b9b\",\n fontWeight: 500,\n },\n stepTitlePending: {\n color: \"#9b9b9b\",\n fontWeight: 500,\n },\n stepTitleFailed: {\n color: \"#d72c0d\",\n fontWeight: 600,\n },\n stepSubtitle: {\n fontSize: \"12px\",\n color: \"#616161\",\n },\n violationPanel: {\n border: \"1px solid #e7e7e7\",\n borderRadius: \"12px\",\n px: \"12px\",\n py: \"12px\",\n bg: \"white\",\n },\n violationHeaderRow: {\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n violationHeader: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n violationIcon: {\n color: \"#8E1F0B\",\n },\n violationTitle: {\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#8E1F0B\",\n },\n violationSubtitle: {\n fontSize: \"12px\",\n color: \"#616161\",\n },\n violationToggleButton: {\n borderRadius: \"8px\",\n color: \"#5c5c5c\",\n },\n violationToggleIcon: {\n color: \"#5c5c5c\",\n },\n violationContent: {\n pt: \"8px\",\n },\n violationItem: {\n bg: \"#fceaea\",\n borderRadius: \"8px\",\n px: \"10px\",\n py: \"8px\",\n },\n violationItemTitle: {\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#8E1F0B\",\n },\n violationItemDetailRow: {\n alignItems: \"center\",\n },\n violationItemDetail: {\n fontSize: \"12px\",\n color: \"#b42318\",\n },\n violationBullet: {\n color: \"#b42318\",\n flexShrink: 0,\n },\n recommendationsBox: {\n bg: \"#eaf2ff\",\n borderRadius: \"8px\",\n px: \"10px\",\n py: \"8px\",\n },\n recommendationsTitle: {\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#1f4eb0\",\n mb: \"4px\",\n },\n recommendationsList: {},\n recommendationsItem: {\n fontSize: \"12px\",\n color: \"#1f4eb0\",\n },\n recommendationsBullet: {\n color: \"#1f4eb0\",\n flexShrink: 0,\n },\n recommendationsToggle: {\n alignSelf: \"flex-start\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n height: \"28px\",\n px: \"12px\",\n },\n failedFooter: {\n borderTop: \"1px solid #e3e3e3\",\n px: \"16px\",\n py: \"16px\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n },\n failedPrimaryButton: {\n fontSize: \"12px\",\n fontWeight: 600,\n borderRadius: \"8px\",\n bg: \"#303030\",\n color: \"white\",\n height: \"30px\",\n },\n failedSecondaryButton: {\n fontSize: \"12px\",\n fontWeight: 500,\n borderRadius: \"8px\",\n borderColor: \"#e3e3e3\",\n color: \"#303030\",\n height: \"30px\",\n },\n footer: {\n borderTop: \"1px solid #e3e3e3\",\n px: \"16px\",\n py: \"16px\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n },\n cancelButton: {\n fontSize: \"12px\",\n fontWeight: 500,\n borderRadius: \"8px\",\n borderColor: \"#e3e3e3\",\n color: \"#303030\",\n height: \"30px\",\n },\n primaryButton: {\n fontSize: \"12px\",\n fontWeight: 600,\n borderRadius: \"8px\",\n bg: \"#303030\",\n color: \"white\",\n height: \"30px\",\n },\n violatedConstraintsSecondaryButton: {\n fontWeight: 600,\n },\n};\n\nexport const SCHEDULE_STEPS: Array<{ title: string; subtitle?: string }> = [\n {\n title: \"Analyzing requirements\",\n subtitle: \"Reviewing your required rules and optimization priorities.\",\n },\n { title: \"Validating required rules\",\n subtitle: \"Ensuring all assigned shifts meet your required rules.\"\n },\n { title: \"Optimizing assigned shifts\",\n subtitle: \"Applying optimization priorities to improve coverage and performance.\",\n },\n { title: \"Checking schedule feasibility\", subtitle: \"Confirming the schedule is feasible and respects all required rules.\" },\n { title: \"Finalizing schedule\" },\n];\n\nexport const STEP_INTERVAL_MS = 1200;\nexport const POLL_INTERVAL_MS = 2500;\nexport const OPTIMIZING_STEP_INDEX = 2;\nexport const API_BASE_URL = \"http://localhost:8080\";\n\nexport const OPTIONS_WITHOUT_INPUTS = [\"staff_preferences\", \"cost_to_sales_ratio\", \"maximize_sales\"];\n\nexport const NETWORK_ERROR_FAILURE: ViolatedConstraintsResult = {\n violatedConstraints: [\n { title: \"Something went wrong\", detail: \"Please try again or check your connection.\" },\n ],\n recommendedFixes: [],\n};\n","import type { AutoSchedulerModalStyleOverrides } from \"../types\";\n\nexport const buildStyles = (defaultStyles: Required<AutoSchedulerModalStyleOverrides>, overrides?: AutoSchedulerModalStyleOverrides): Required<AutoSchedulerModalStyleOverrides> => ({\n overlay: { ...defaultStyles.overlay, ...overrides?.overlay },\n content: { ...defaultStyles.content, ...overrides?.content },\n header: { ...defaultStyles.header, ...overrides?.header },\n title: { ...defaultStyles.title, ...overrides?.title },\n closeButton: { ...defaultStyles.closeButton, ...overrides?.closeButton },\n body: { ...defaultStyles.body, ...overrides?.body },\n banner: { ...defaultStyles.banner, ...overrides?.banner },\n bannerIcon: { ...defaultStyles.bannerIcon, ...overrides?.bannerIcon },\n bannerTitle: { ...defaultStyles.bannerTitle, ...overrides?.bannerTitle },\n bannerText: { ...defaultStyles.bannerText, ...overrides?.bannerText },\n locationSection: { ...defaultStyles.locationSection, ...overrides?.locationSection },\n locationLabelRow: { ...defaultStyles.locationLabelRow, ...overrides?.locationLabelRow },\n locationLabel: { ...defaultStyles.locationLabel, ...overrides?.locationLabel },\n locationBadge: { ...defaultStyles.locationBadge, ...overrides?.locationBadge },\n locationSubtitle: { ...defaultStyles.locationSubtitle, ...overrides?.locationSubtitle },\n locationTrigger: { ...defaultStyles.locationTrigger, ...overrides?.locationTrigger },\n locationTriggerText: {\n ...defaultStyles.locationTriggerText,\n ...overrides?.locationTriggerText,\n },\n popoverContent: { ...defaultStyles.popoverContent, ...overrides?.popoverContent },\n groupHeader: { ...defaultStyles.groupHeader, ...overrides?.groupHeader },\n optionRow: { ...defaultStyles.optionRow, ...overrides?.optionRow },\n optionLabel: { ...defaultStyles.optionLabel, ...overrides?.optionLabel },\n selectedBanner: { ...defaultStyles.selectedBanner, ...overrides?.selectedBanner },\n selectedBannerIcon: { ...defaultStyles.selectedBannerIcon, ...overrides?.selectedBannerIcon },\n selectedBannerText: {\n ...defaultStyles.selectedBannerText,\n ...overrides?.selectedBannerText,\n },\n hardConstraintsSection: {\n ...defaultStyles.hardConstraintsSection,\n ...overrides?.hardConstraintsSection,\n },\n hardConstraintsLabelRow: {\n ...defaultStyles.hardConstraintsLabelRow,\n ...overrides?.hardConstraintsLabelRow,\n },\n hardConstraintsLabel: {\n ...defaultStyles.hardConstraintsLabel,\n ...overrides?.hardConstraintsLabel,\n },\n hardConstraintsBadge: {\n ...defaultStyles.hardConstraintsBadge,\n ...overrides?.hardConstraintsBadge,\n },\n hardConstraintsSubtitle: {\n ...defaultStyles.hardConstraintsSubtitle,\n ...overrides?.hardConstraintsSubtitle,\n },\n hardConstraintsTrigger: {\n ...defaultStyles.hardConstraintsTrigger,\n ...overrides?.hardConstraintsTrigger,\n },\n hardConstraintsTriggerText: {\n ...defaultStyles.hardConstraintsTriggerText,\n ...overrides?.hardConstraintsTriggerText,\n },\n hardConstraintsPopoverContent: {\n ...defaultStyles.hardConstraintsPopoverContent,\n ...overrides?.hardConstraintsPopoverContent,\n },\n hardConstraintsOptionRow: {\n ...defaultStyles.hardConstraintsOptionRow,\n ...overrides?.hardConstraintsOptionRow,\n },\n hardConstraintsOptionLabel: {\n ...defaultStyles.hardConstraintsOptionLabel,\n ...overrides?.hardConstraintsOptionLabel,\n },\n hardConstraintsInputsContainer: {\n ...defaultStyles.hardConstraintsInputsContainer,\n ...overrides?.hardConstraintsInputsContainer,\n },\n hardConstraintsInputItem: {\n ...defaultStyles.hardConstraintsInputItem,\n ...overrides?.hardConstraintsInputItem,\n },\n hardConstraintsInputLabel: {\n ...defaultStyles.hardConstraintsInputLabel,\n ...overrides?.hardConstraintsInputLabel,\n },\n hardConstraintsInputField: {\n ...defaultStyles.hardConstraintsInputField,\n ...overrides?.hardConstraintsInputField,\n },\n optimizationSection: {\n ...defaultStyles.optimizationSection,\n ...overrides?.optimizationSection,\n },\n optimizationLabelRow: {\n ...defaultStyles.optimizationLabelRow,\n ...overrides?.optimizationLabelRow,\n },\n optimizationLabel: {\n ...defaultStyles.optimizationLabel,\n ...overrides?.optimizationLabel,\n },\n optimizationBadge: {\n ...defaultStyles.optimizationBadge,\n ...overrides?.optimizationBadge,\n },\n optimizationSubtitle: {\n ...defaultStyles.optimizationSubtitle,\n ...overrides?.optimizationSubtitle,\n },\n optimizationTrigger: {\n ...defaultStyles.optimizationTrigger,\n ...overrides?.optimizationTrigger,\n },\n optimizationTriggerText: {\n ...defaultStyles.optimizationTriggerText,\n ...overrides?.optimizationTriggerText,\n },\n optimizationPopoverContent: {\n ...defaultStyles.optimizationPopoverContent,\n ...overrides?.optimizationPopoverContent,\n },\n optimizationGroupHeader: {\n ...defaultStyles.optimizationGroupHeader,\n ...overrides?.optimizationGroupHeader,\n },\n optimizationOptionRow: {\n ...defaultStyles.optimizationOptionRow,\n ...overrides?.optimizationOptionRow,\n },\n optimizationOptionLabel: {\n ...defaultStyles.optimizationOptionLabel,\n ...overrides?.optimizationOptionLabel,\n },\n optimizationOptionHelp: {\n ...defaultStyles.optimizationOptionHelp,\n ...overrides?.optimizationOptionHelp,\n },\n optimizationInputsContainer: {\n ...defaultStyles.optimizationInputsContainer,\n ...overrides?.optimizationInputsContainer,\n },\n optimizationInputItem: {\n ...defaultStyles.optimizationInputItem,\n ...overrides?.optimizationInputItem,\n },\n optimizationInputLabel: {\n ...defaultStyles.optimizationInputLabel,\n ...overrides?.optimizationInputLabel,\n },\n optimizationInputField: {\n ...defaultStyles.optimizationInputField,\n ...overrides?.optimizationInputField,\n },\n optimizationSuffix: {\n ...defaultStyles.optimizationSuffix,\n ...overrides?.optimizationSuffix,\n },\n optimizationDivider: {\n ...defaultStyles.optimizationDivider,\n ...overrides?.optimizationDivider,\n },\n optimizationSummary: {\n ...defaultStyles.optimizationSummary,\n ...overrides?.optimizationSummary,\n },\n creatingBody: {\n ...defaultStyles.creatingBody,\n ...overrides?.creatingBody,\n },\n stepsContainer: {\n ...defaultStyles.stepsContainer,\n ...overrides?.stepsContainer,\n },\n stepsList: {\n ...defaultStyles.stepsList,\n ...overrides?.stepsList,\n },\n stepRow: {\n ...defaultStyles.stepRow,\n ...overrides?.stepRow,\n },\n stepIcon: {\n ...defaultStyles.stepIcon,\n ...overrides?.stepIcon,\n },\n stepIconActive: {\n ...defaultStyles.stepIconActive,\n ...overrides?.stepIconActive,\n },\n stepIconDone: {\n ...defaultStyles.stepIconDone,\n ...overrides?.stepIconDone,\n },\n stepIconPending: {\n ...defaultStyles.stepIconPending,\n ...overrides?.stepIconPending,\n },\n stepIconFailed: {\n ...defaultStyles.stepIconFailed,\n ...overrides?.stepIconFailed,\n },\n stepTitle: {\n ...defaultStyles.stepTitle,\n ...overrides?.stepTitle,\n },\n stepTitleActive: {\n ...defaultStyles.stepTitleActive,\n ...overrides?.stepTitleActive,\n },\n stepTitleDone: {\n ...defaultStyles.stepTitleDone,\n ...overrides?.stepTitleDone,\n },\n stepTitlePending: {\n ...defaultStyles.stepTitlePending,\n ...overrides?.stepTitlePending,\n },\n stepTitleFailed: {\n ...defaultStyles.stepTitleFailed,\n ...overrides?.stepTitleFailed,\n },\n stepSubtitle: {\n ...defaultStyles.stepSubtitle,\n ...overrides?.stepSubtitle,\n },\n violationPanel: {\n ...defaultStyles.violationPanel,\n ...overrides?.violationPanel,\n },\n violationHeaderRow: {\n ...defaultStyles.violationHeaderRow,\n ...overrides?.violationHeaderRow,\n },\n violationHeader: {\n ...defaultStyles.violationHeader,\n ...overrides?.violationHeader,\n },\n violationIcon: {\n ...defaultStyles.violationIcon,\n ...overrides?.violationIcon,\n },\n violationTitle: {\n ...defaultStyles.violationTitle,\n ...overrides?.violationTitle,\n },\n violationSubtitle: {\n ...defaultStyles.violationSubtitle,\n ...overrides?.violationSubtitle,\n },\n violationToggleButton: {\n ...defaultStyles.violationToggleButton,\n ...overrides?.violationToggleButton,\n },\n violationToggleIcon: {\n ...defaultStyles.violationToggleIcon,\n ...overrides?.violationToggleIcon,\n },\n violationContent: {\n ...defaultStyles.violationContent,\n ...overrides?.violationContent,\n },\n violationItem: {\n ...defaultStyles.violationItem,\n ...overrides?.violationItem,\n },\n violationItemTitle: {\n ...defaultStyles.violationItemTitle,\n ...overrides?.violationItemTitle,\n },\n violationItemDetailRow: {\n ...defaultStyles.violationItemDetailRow,\n ...overrides?.violationItemDetailRow,\n },\n violationItemDetail: {\n ...defaultStyles.violationItemDetail,\n ...overrides?.violationItemDetail,\n },\n violationBullet: {\n ...defaultStyles.violationBullet,\n ...overrides?.violationBullet,\n },\n recommendationsBox: {\n ...defaultStyles.recommendationsBox,\n ...overrides?.recommendationsBox,\n },\n recommendationsTitle: {\n ...defaultStyles.recommendationsTitle,\n ...overrides?.recommendationsTitle,\n },\n recommendationsList: {\n ...defaultStyles.recommendationsList,\n ...overrides?.recommendationsList,\n },\n recommendationsItem: {\n ...defaultStyles.recommendationsItem,\n ...overrides?.recommendationsItem,\n },\n recommendationsBullet: {\n ...defaultStyles.recommendationsBullet,\n ...overrides?.recommendationsBullet,\n },\n recommendationsToggle: {\n ...defaultStyles.recommendationsToggle,\n ...overrides?.recommendationsToggle,\n },\n failedFooter: {\n ...defaultStyles.failedFooter,\n ...overrides?.failedFooter,\n },\n failedPrimaryButton: {\n ...defaultStyles.failedPrimaryButton,\n ...overrides?.failedPrimaryButton,\n },\n failedSecondaryButton: {\n ...defaultStyles.failedSecondaryButton,\n ...overrides?.failedSecondaryButton,\n },\n footer: { ...defaultStyles.footer, ...overrides?.footer },\n cancelButton: { ...defaultStyles.cancelButton, ...overrides?.cancelButton },\n primaryButton: { ...defaultStyles.primaryButton, ...overrides?.primaryButton },\n violatedConstraintsSecondaryButton: {\n ...defaultStyles.violatedConstraintsSecondaryButton,\n ...overrides?.violatedConstraintsSecondaryButton,\n },\n});","import type { RuleOverrideEntry, SchedulePayload, TimeOff } from \"./types\";\nimport type { Employee, OpenShift, JurisdictionGroup, LocationOption } from \"./types\";\n\nconst UI_TO_BACKEND_RULE_ID: Record<string, string> = {\n max_weekly_hours: \"max-weekly-hours\",\n max_daily_hours: \"max-daily-hours\",\n min_rest_between_shifts: \"min-rest-between-shifts\",\n max_work_days_per_week: \"max-work-days-per-week\",\n fair_hour_distribution: \"fair-hour-distribution\",\n minimize_overtime: \"overtime-balance\",\n cost_to_sales_ratio: \"labor-cost-optimization\",\n maximize_sales: \"maximize-sales-performance\",\n staff_preferences: \"staff-open-shift-preferences\",\n};\n\nconst BACKEND_TO_UI_RULE_ID: Record<string, string> = Object.fromEntries(\n Object.entries(UI_TO_BACKEND_RULE_ID).map(([ui, backend]) => [backend, ui]),\n);\n\nfunction toBackendRuleId(uiOptionId: string): string | undefined {\n return UI_TO_BACKEND_RULE_ID[uiOptionId];\n}\n\nfunction buildParametersForRule(\n backendRuleId: string,\n constraintValues: Record<string, string>,\n _optimizationValues: Record<string, string>\n): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n switch (backendRuleId) {\n case \"max-weekly-hours\": {\n const value = constraintValues[\"max_weekly_hours\"]?.trim();\n if (value) {\n const limitMinutes = Number(value) * 60;\n if (Number.isFinite(limitMinutes) && limitMinutes >= 1) {\n params.limitMinutes = limitMinutes;\n }\n }\n break;\n }\n case \"max-daily-hours\": {\n const value = constraintValues[\"max_daily_hours\"]?.trim();\n if (value) {\n const limitMinutes = Number(value) * 60;\n if (Number.isFinite(limitMinutes) && limitMinutes >= 1) {\n params.limitMinutes = limitMinutes;\n }\n }\n break;\n }\n case \"min-rest-between-shifts\": {\n const value = constraintValues[\"min_rest_between_shifts\"]?.trim();\n if (value) {\n const minGapMinutes = Number(value) * 60;\n if (Number.isFinite(minGapMinutes) && minGapMinutes >= 1) {\n params.minGapMinutes = minGapMinutes;\n }\n }\n break;\n }\n case \"max-work-days-per-week\": {\n const value = constraintValues[\"max_work_days_per_week\"]?.trim();\n if (value) {\n const maxWorkDays = Number(value);\n if (Number.isFinite(maxWorkDays) && maxWorkDays >= 1 && maxWorkDays <= 6) {\n params.limitDays = maxWorkDays;\n }\n }\n break;\n }\n default:\n break;\n }\n\n return params;\n}\n\nfunction hasAnyParameterOverrides(\n selectedConstraintIds: string[],\n constraintValues: Record<string, string>,\n selectedOptimizationIds: string[],\n optimizationValues: Record<string, string>\n): boolean {\n for (const id of selectedConstraintIds) {\n const value = constraintValues[id]?.trim();\n if (value && Number.isFinite(Number(value))) return true;\n }\n for (const id of selectedOptimizationIds) {\n const weight = optimizationValues[`${id}_weightPoints`]?.trim();\n if (weight && Number.isFinite(Number(weight))) return true;\n if (id === \"fair_hour_distribution\") {\n if (\n optimizationValues[\"fair_hour_distribution_balanceTarget\"]?.trim() ||\n optimizationValues[\"fair_hour_distribution_period\"]?.trim()\n ) {\n return true;\n }\n } else if (id === \"minimize_overtime\") {\n if (\n optimizationValues[\"minimize_overtime_thresholdMinutes\"]?.trim() ||\n optimizationValues[\"minimize_overtime_period\"]?.trim()\n ) return true;\n } else if (id === \"cost_to_sales_ratio\" || id === \"maximize_sales\") {\n // These rules always need explicit parameters sent to the backend\n return true;\n }\n }\n return false;\n}\n\nexport function buildRulesPayload(\n selectedConstraintIds: string[],\n constraintValues: Record<string, string>,\n selectedOptimizationIds: string[],\n optimizationValues: Record<string, string>\n): { ruleIds?: string[]; ruleOverrides?: RuleOverrideEntry[] } {\n const allSelectedRuleIds = [\n ...selectedConstraintIds.map(toBackendRuleId),\n ...selectedOptimizationIds.map(toBackendRuleId),\n ].filter((id): id is string => Boolean(id));\n\n if (allSelectedRuleIds.length === 0) {\n return {};\n }\n\n const hasOverrides = hasAnyParameterOverrides(\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues\n );\n\n if (!hasOverrides) {\n return { ruleIds: allSelectedRuleIds };\n }\n\n const ruleOverrides: RuleOverrideEntry[] = allSelectedRuleIds.map((ruleId) => {\n const params = buildParametersForRule(ruleId, constraintValues, optimizationValues);\n const uiId = BACKEND_TO_UI_RULE_ID[ruleId];\n const weightRaw = uiId ? optimizationValues[`${uiId}_weightPoints`]?.trim() : undefined;\n const weightPoints = weightRaw ? Number(weightRaw) : undefined;\n if (weightPoints && Number.isFinite(weightPoints) && weightPoints >= 1) {\n params.weightPoints = weightPoints;\n }\n return {\n ruleId,\n ...(Object.keys(params).length > 0 ? { parameters: params } : {}),\n };\n });\n\n return { ruleIds: allSelectedRuleIds, ruleOverrides };\n}\n\nfunction toApiShift(\n shift: OpenShift,\n includeEmployeePreferences: boolean\n): SchedulePayload[\"shifts\"][0] {\n const startDateTime =\n \"startDateTime\" in shift ? (shift as { startDateTime: string }).startDateTime : shift.startTime;\n const endDateTime =\n \"endDateTime\" in shift ? (shift as { endDateTime: string }).endDateTime : shift.endTime;\n return {\n id: shift.id,\n startDateTime,\n endDateTime,\n ...(shift.employeeId ? { employeeId: String(shift.employeeId) } : {}),\n requiredPosition: shift.requiredPosition || undefined,\n requiredCount: shift.requiredCount ?? 1,\n location: shift.location\n ? {\n id: String(shift.location.id),\n timezone: \"timezone\" in shift.location ? (shift.location as { timezone?: string }).timezone : undefined,\n tags: \"tags\" in shift.location ? (shift.location as { tags?: string[] }).tags : undefined,\n }\n : undefined,\n ...(includeEmployeePreferences && shift.employeePreferences\n ? {\n employeePreferences: shift.employeePreferences.map((p) => ({\n employeeId: p.employeeId,\n level: p.level,\n })),\n }\n : {}),\n };\n}\n\nfunction toApiEmployee(employee: Employee): SchedulePayload[\"employees\"][0] {\n return {\n id: String(employee.id),\n name: employee.name ?? undefined,\n position: employee.position ?? undefined,\n locationIds: employee.locationIds ?? undefined,\n properties: employee.properties ? (employee.properties as Record<string, unknown>) : undefined,\n };\n}\n\nfunction toApiLocation(location: LocationOption): SchedulePayload[\"locations\"][0] {\n return {\n id: String(location.id),\n timezone: location.timezone ?? undefined,\n jurisdiction: location.jurisdiction ?? undefined,\n tags: \"tags\" in location ? (location as { tags?: string[] }).tags : undefined,\n };\n}\n\nexport type BuildSchedulePayloadInput = {\n employees: Employee[];\n openShifts: OpenShift[];\n timeOffs?: TimeOff[];\n selectedLocationIds: string[];\n jurisdictions: JurisdictionGroup[];\n selectedConstraintIds: string[];\n constraintValues: Record<string, string>;\n selectedOptimizationIds: string[];\n optimizationValues: Record<string, string>;\n};\n\nexport function buildSchedulePayload(input: BuildSchedulePayloadInput): SchedulePayload {\n const {\n employees,\n openShifts,\n timeOffs,\n selectedLocationIds,\n jurisdictions,\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n } = input;\n\n const locationsMap = new Map<string, LocationOption>();\n for (const j of jurisdictions) {\n for (const loc of j.locations) {\n locationsMap.set(loc.id, loc);\n }\n }\n\n const selectedLocations = selectedLocationIds\n .map((id) => locationsMap.get(id))\n .filter((loc): loc is LocationOption => Boolean(loc));\n\n const rules = buildRulesPayload(\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues\n );\n\n const includeEmployeePreferences = selectedOptimizationIds.includes(\"staff_preferences\");\n\n return {\n employees: employees.map(toApiEmployee),\n shifts: openShifts.map((shift) => toApiShift(shift, includeEmployeePreferences)),\n locations: selectedLocations.map(toApiLocation),\n ...(timeOffs && timeOffs.length > 0 ? { timeOffs } : {}),\n ...rules,\n };\n}\n","import axios from \"axios\";\nimport type { SchedulePayload } from \"../types\";\nimport type { SolveApiResponse } from \"../types\";\n\nconst axiosInstance = axios.create({\n headers: { \"Content-Type\": \"application/json\" },\n});\n\nexport type SolveScheduleOptions = {\n authorization?: string;\n};\n\nexport type JobStatusResponse = {\n jobId: string;\n status: string;\n};\n\nexport async function getToken(\n fullUrl: string,\n headers?: Record<string, string>,\n): Promise<string> {\n const tokenRes = await axiosInstance.get(fullUrl, {\n ...(headers ? { headers } : {}),\n });\n return tokenRes.data?.token;\n}\n\n/**\n * Submits a solve job to the queue. Returns immediately with jobId.\n * Use with getJobStatus and getJobResult for polling.\n */\nexport async function submitSolveJob(\n baseURL: string,\n payload: SchedulePayload,\n options?: SolveScheduleOptions,\n): Promise<JobStatusResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.post<JobStatusResponse>(\n `${cleanBaseUrl}/api/schedule/solve-async`,\n payload,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * Gets the current status of a solve job.\n * Status: QUEUED | SOLVING_ACTIVE | NOT_SOLVING | TERMINATED_EARLY\n */\nexport async function getJobStatus(\n baseURL: string,\n jobId: string,\n options?: SolveScheduleOptions,\n): Promise<JobStatusResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.get<JobStatusResponse>(\n `${cleanBaseUrl}/api/schedule/status/${jobId}`,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * Gets the full solve result when job status is terminal\n * (NOT_SOLVING or TERMINATED_EARLY).\n * Returns 404 if job not found or still in progress.\n */\nexport async function getJobResult(\n baseURL: string,\n jobId: string,\n options?: SolveScheduleOptions,\n): Promise<SolveApiResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.get<SolveApiResponse>(\n `${cleanBaseUrl}/api/schedule/result/${jobId}`,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * Gets the solved schedule for a completed job.\n */\nexport async function getJobSolution(\n baseURL: string,\n jobId: string,\n options?: SolveScheduleOptions,\n): Promise<SolveApiResponse[\"solution\"]> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.get<SolveApiResponse[\"solution\"]>(\n `${cleanBaseUrl}/api/schedule/solution/${jobId}`,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * @deprecated Use submitSolveJob + getJobStatus + getJobResult for queue-based flow.\n * Synchronous solve - blocks until solver completes.\n */\nexport async function solveSchedule(\n baseURL: string,\n payload: SchedulePayload,\n options?: SolveScheduleOptions,\n): Promise<SolveApiResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.post<SolveApiResponse>(\n `${cleanBaseUrl}/api/schedule/solve`,\n payload,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n","export type ViolationMessage = {\n title: string;\n detail: string;\n};\n\nconst SYSTEM_CONSTRAINT_MESSAGES: Record<string, ViolationMessage> = {\n \"system-unassigned-Hard\": {\n title: \"Not enough eligible staff to cover all shifts\",\n detail: \"Some open shifts require more team members with the required position than are currently available.\",\n },\n \"system-position-Hard\": {\n title: \"Required position not matched\",\n detail: \"Some open shifts require a position that isn't assigned to the available team members.\",\n },\n \"system-location-Hard\": {\n title: \"Location assignment mismatch\",\n detail: \"Some open shifts are set for a location that isn't assigned to the available team members.\",\n },\n \"system-employee-unavailable-Hard\": {\n title: \"No eligible staff available for shift\",\n detail: \"Some open shifts don't have any remaining eligible team members available at that time.\",\n },\n \"system-employee-unavailable-time-Hard\": {\n title: \"Unavailable time\",\n detail: \"Unavailable time\",\n },\n \"system-employee-available-time-Hard\": {\n title: \"Outside available time\",\n detail: \"Outside available time\",\n },\n \"system-employee-time-off-Hard\": {\n title: \"Time off prevents assignment\",\n detail: \"Some open shifts overlap with approved time off for the remaining eligible team members.\",\n },\n};\n\nconst RULE_ID_MESSAGES: Record<string, ViolationMessage> = {\n \"max-weekly-hours\": {\n title: \"Maximum weekly hours exceeded\",\n detail: \"Some team members would exceed weekly hour limits if all open shifts are assigned.\",\n },\n \"max-daily-hours\": {\n title: \"Maximum daily hours exceeded\",\n detail: \"Some team members would exceed daily hour limits if all open shifts are assigned.\",\n },\n \"min-rest-between-shifts\": {\n title: \"Minimum rest between shifts\",\n detail: \"Some team members would not receive the required rest time if all open shifts are assigned.\",\n },\n \"min-days-off-per-week\": {\n title: \"Maximum work days per week exceeded\",\n detail: \"Some team members would exceed the allowed work days this week if all open shifts are assigned.\",\n },\n \"fair-hour-distribution\": {\n title: \"Work distribution not balanced\",\n detail: \"Work distribution not balanced\",\n },\n \"overtime-balance\": {\n title: \"Overtime balance rule violated\",\n detail: \"Overtime balance rule violated\",\n },\n \"manager-cashier-ratio\": {\n title: \"Staffing ratio violated\",\n detail: \"Staffing ratio violated\",\n },\n \"min-staffing\": {\n title: \"Minimum staffing not met\",\n detail: \"Minimum staffing not met\",\n },\n \"shift-duration-limits\": {\n title: \"Shift duration outside allowed range\",\n detail: \"Shift duration outside allowed range\",\n },\n \"max-consecutive-days\": {\n title: \"Shift sequence rule violated\",\n detail: \"Shift sequence rule violated\",\n },\n \"some-transactional-rule\": {\n title: \"Policy rule violated\",\n detail: \"Policy rule violated\",\n },\n};\n\nconst ARCHETYPE_FALLBACK_MESSAGES: Record<string, ViolationMessage> = {\n \"Accumulator violation (HARD)\": {\n title: \"Hours limit exceeded\",\n detail: \"Hours limit exceeded\",\n },\n \"Spacer violation (HARD)\": {\n title: \"Rest period not met\",\n detail: \"Rest period not met\",\n },\n \"Spacer periodic violation (HARD)\": {\n title: \"Required rest period not met\",\n detail: \"Required rest period not met\",\n },\n \"Composition violation (HARD)\": {\n title: \"Staffing ratio violated\",\n detail: \"Staffing ratio violated\",\n },\n \"Transactional violation (HARD)\": {\n title: \"Policy rule violated\",\n detail: \"Policy rule violated\",\n },\n \"Balancer violation (HARD)\": {\n title: \"Work distribution not balanced\",\n detail: \"Work distribution not balanced\",\n },\n \"Coverage violation (HARD)\": {\n title: \"Minimum staffing not met\",\n detail: \"Minimum staffing not met\",\n },\n \"Sizing violation (HARD)\": {\n title: \"Shift duration outside allowed range\",\n detail: \"Shift duration outside allowed range\",\n },\n \"Sequencer violation (HARD)\": {\n title: \"Shift sequence rule violated\",\n detail: \"Shift sequence rule violated\",\n },\n \"Overtime balance violation (HARD)\": {\n title: \"Overtime balance rule violated\",\n detail: \"Overtime balance rule violated\",\n },\n};\n\nconst FALLBACK_MESSAGE: ViolationMessage = {\n title: \"Rule violated\",\n detail: \"Rule violated\",\n};\n\nexport function getSystemConstraintMessage(\n constraintName?: string,\n description?: string\n): ViolationMessage {\n if (constraintName && constraintName in SYSTEM_CONSTRAINT_MESSAGES) {\n return SYSTEM_CONSTRAINT_MESSAGES[constraintName];\n }\n if (description?.trim()) {\n return { title: description, detail: description };\n }\n return FALLBACK_MESSAGE;\n}\n\nexport function getRuleBasedViolationMessage(\n ruleId: string,\n constraintName?: string,\n description?: string\n): ViolationMessage {\n if (ruleId && ruleId in RULE_ID_MESSAGES) {\n return RULE_ID_MESSAGES[ruleId];\n }\n if (constraintName && constraintName in ARCHETYPE_FALLBACK_MESSAGES) {\n return ARCHETYPE_FALLBACK_MESSAGES[constraintName];\n }\n if (description?.trim()) {\n return { title: description, detail: description };\n }\n return FALLBACK_MESSAGE;\n}\n","import type { SolveApiResponse, ViolatedConstraintsResult } from \"../types\";\nimport {\n getSystemConstraintMessage,\n getRuleBasedViolationMessage,\n} from \"./violationMessages\";\n\ntype Violation = SolveApiResponse[\"explanation\"][\"violations\"][number];\n\nexport function mapViolationsToResult(\n violations: Violation[],\n summary?: string\n): ViolatedConstraintsResult {\n const hardViolations = violations.filter((v) => v.isHardViolation === true);\n\n const seenTitles = new Set<string>();\n const violatedConstraints: Array<{ title: string; detail: string }> = [];\n\n for (const v of hardViolations) {\n const hasRuleId = v.ruleId != null && v.ruleId !== undefined && String(v.ruleId).trim() !== \"\";\n\n const msg = hasRuleId\n ? getRuleBasedViolationMessage(\n v.ruleId!,\n v.constraintName,\n v.description\n )\n : getSystemConstraintMessage(v.constraintName, v.description);\n\n if (!seenTitles.has(msg.title)) {\n seenTitles.add(msg.title);\n violatedConstraints.push(msg);\n }\n }\n\n const result: ViolatedConstraintsResult = {\n violatedConstraints,\n recommendedFixes: [],\n };\n\n if (violatedConstraints.length === 0 && summary?.trim()) {\n result.violatedConstraints = [\n {\n title: \"Schedule could not be created\",\n detail: summary,\n },\n ];\n } else if (violatedConstraints.length === 0) {\n result.violatedConstraints = [\n {\n title: \"Schedule could not be created\",\n detail: \"Please adjust constraints and try again.\",\n },\n ];\n }\n\n return result;\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n Box,\n Button,\n HStack,\n IconButton,\n Spinner,\n Stack,\n Text,\n} from \"@chakra-ui/react\";\nimport axios from \"axios\";\nimport type { ScheduleRecommendation, ViolatedConstraintsPanelProps } from \"./types\";\nimport { ChevronDownIcon, DotIcon, WarningIcon } from \"./icons/AutoSchedulerIcons\";\nimport { defaultStyles } from \"./constants\";\nimport { buildStyles } from \"./utils/theme\";\n\nconst DEFAULT_TITLE = \"Schedule can't be created\";\nconst DEFAULT_SUBTITLE =\n \"Some required rules aren't being met. Review the issues below to continue.\";\n\nexport function ViolatedConstraintsPanel({\n violatedConstraints,\n title = DEFAULT_TITLE,\n subtitle = DEFAULT_SUBTITLE,\n showSecondaryButton = false,\n secondaryButtonTitle,\n onSecondaryButtonClick,\n generateRecommendationsURLAndHeaders,\n styles: stylesProp,\n styleOverrides,\n errorToast,\n}: ViolatedConstraintsPanelProps) {\n const [showRecommendations, setShowRecommendations] = useState(false);\n const [isExpanded, setIsExpanded] = useState(true);\n const [recommendations, setRecommendations] = useState<string[] | null>(null);\n const [isLoadingRecommendations, setIsLoadingRecommendations] = useState(false);\n const [isDisabledRecommendations, setIsDisabledRecommendations] = useState(false);\n const [recommendationsButtonText, setRecommendationsButtonText] = useState(\"Show recommendations\");\n\n const styles = useMemo(() => {\n if (stylesProp) return stylesProp;\n return buildStyles(defaultStyles, styleOverrides);\n }, [stylesProp, styleOverrides]);\n\n const canFetchRecommendations =\n Boolean(generateRecommendationsURLAndHeaders) &&\n Boolean(violatedConstraints.recommendationPayload);\n\n const hasPreFetchedFixes = violatedConstraints.recommendedFixes.length > 0;\n const showRecommendationsButton = canFetchRecommendations || hasPreFetchedFixes;\n\n const displayRecommendations =\n recommendations !== null ? recommendations : violatedConstraints.recommendedFixes;\n const hasRecommendations = displayRecommendations.length > 0;\n\n const handleToggleRecommendations = useCallback(async () => {\n if (showRecommendations) {\n setShowRecommendations(false);\n return;\n }\n\n if (recommendations !== null) {\n return;\n }\n\n if (!canFetchRecommendations) {\n return;\n }\n\n const payload = violatedConstraints.recommendationPayload!;\n setIsLoadingRecommendations(true);\n try {\n const recResponse = await axios.post(\n generateRecommendationsURLAndHeaders!.url,\n payload,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n ...generateRecommendationsURLAndHeaders!.headers,\n },\n }\n );\n const { success, data, msg } = recResponse.data;\n const { isExpired, recommendations } = data ?? {};\n\n if (!success) {\n const errorMsg = msg || \"Failed to fetch recommendations\";\n errorToast?.(errorMsg);\n if (isExpired) {\n setIsDisabledRecommendations(true);\n setRecommendationsButtonText(\"Daily limit reached\");\n }\n\n return;\n }\n\n\n setShowRecommendations(true);\n const fetchedRecommendations = recommendations as ScheduleRecommendation[];\n\n if (fetchedRecommendations) {\n setRecommendations(fetchedRecommendations.map((r) => r.recommendation));\n } else {\n setRecommendations([]);\n }\n } catch (recErr) {\n console.error(\"[ViolatedConstraintsPanel] failed to fetch recommendations:\", recErr);\n setRecommendations([]);\n } finally {\n setIsLoadingRecommendations(false);\n }\n }, [\n showRecommendations,\n recommendations,\n canFetchRecommendations,\n violatedConstraints.recommendationPayload,\n generateRecommendationsURLAndHeaders,\n errorToast\n ]);\n\n return (\n <Box sx={styles.violationPanel}>\n <HStack sx={styles.violationHeaderRow}>\n <HStack sx={styles.violationHeader}>\n <Box sx={styles.violationIcon}>\n <WarningIcon />\n </Box>\n <Box>\n <Text sx={styles.violationTitle}>{title}</Text>\n <Text sx={styles.violationSubtitle}>{subtitle}</Text>\n </Box>\n </HStack>\n <IconButton\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n variant=\"ghost\"\n size=\"sm\"\n icon={\n <Box\n sx={styles.violationToggleIcon}\n transform={isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\"}\n >\n <ChevronDownIcon />\n </Box>\n }\n onClick={() => setIsExpanded((prev) => !prev)}\n sx={styles.violationToggleButton}\n />\n </HStack>\n {isExpanded ? (\n <Stack spacing=\"8px\" sx={styles.violationContent}>\n <Stack spacing=\"8px\">\n {violatedConstraints.violatedConstraints.map((constraint, index) => (\n <Box key={`${constraint.title}-${index}`} sx={styles.violationItem}>\n <Text sx={styles.violationItemTitle}>{constraint.title}</Text>\n <HStack spacing=\"6px\" sx={styles.violationItemDetailRow}>\n <Box sx={styles.violationBullet}>\n <DotIcon size={6} />\n </Box>\n <Text sx={styles.violationItemDetail}>{constraint.detail}</Text>\n </HStack>\n </Box>\n ))}\n </Stack>\n {showRecommendations && hasRecommendations ? (\n <Box sx={styles.recommendationsBox}>\n <Text sx={styles.recommendationsTitle}>Recommended fixes</Text>\n <Stack spacing=\"4px\" sx={styles.recommendationsList}>\n {displayRecommendations.map((fix, index) => (\n <HStack key={`${fix}-${index}`} spacing=\"6px\">\n <Box sx={styles.recommendationsBullet}>\n <DotIcon size={6} />\n </Box>\n <Text sx={styles.recommendationsItem}>{fix}</Text>\n </HStack>\n ))}\n </Stack>\n </Box>\n ) : null}\n <HStack spacing=\"8px\" flexWrap=\"wrap\">\n {showRecommendationsButton ? (\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={handleToggleRecommendations}\n isDisabled={isLoadingRecommendations || isDisabledRecommendations}\n sx={{ ...styles.recommendationsToggle, minWidth: \"140px\" }}\n >\n {isLoadingRecommendations ? (\n <Spinner size=\"sm\" thickness=\"2px\" />\n ) : (\n showRecommendations ? \"Hide recommendations\" : recommendationsButtonText\n )}\n </Button>\n ) : null}\n {showSecondaryButton && secondaryButtonTitle && onSecondaryButtonClick ? (\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={onSecondaryButtonClick}\n sx={{ ...styles.failedSecondaryButton, ...styles.violatedConstraintsSecondaryButton }}\n >\n {secondaryButtonTitle}\n </Button>\n ) : null}\n </HStack>\n </Stack>\n ) : null}\n </Box>\n );\n}\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport { AutoSchedulerModal } from \"./AutoSchedulerModal\";\nimport type { AutoSchedulerModalProps } from \"./types\";\n\n/**\n * Self-contained AutoSchedulerModal that wraps itself in ChakraProvider.\n * Use this when the host app may have multiple React instances (e.g. local packages in Next.js),\n * which can cause \"Cannot read properties of null (reading 'useContext')\" when using Chakra's useTheme.\n */\nexport function AutoSchedulerModalWithProvider(props: AutoSchedulerModalProps) {\n return (\n <ChakraProvider>\n <AutoSchedulerModal {...props} />\n </ChakraProvider>\n );\n}\n","\nimport type { ViolatedConstraintsPanelProps } from \"./types\";\nimport { ViolatedConstraintsPanel } from \"./ViolatedConstraintsPanel\";\nimport { ChakraProvider } from \"@chakra-ui/react\";\n\nexport function ViolatedConstraintsPanelWithProvider(props: ViolatedConstraintsPanelProps) {\n return (\n <ChakraProvider>\n <ViolatedConstraintsPanel {...props} />\n </ChakraProvider>\n );\n}\n","/**\n * Mapping of ruleId/constraintName to user-friendly display names.\n * Used for justification messages like \"Staff preferences is fully met\".\n *\n * Source: auto-scheduler solver constraint names and rules JSON.\n */\nexport const RULE_ID_FRIENDLY_NAMES: Record<string, string> = {\n // System soft constraints (format: system-{type}-soft)\n \"system-employee-preference-soft\": \"Staff preferences\",\n \"system-employee-prefer-not-time-soft\": \"Prefer-not availability\",\n \"system-no-overlapping-shifts-soft\": \"No overlapping shifts\",\n \"system-overtime-soft\": \"Expected overtime\",\n\n // Archetype soft constraints (format: {archetype}-soft)\n \"accumulator-soft\": \"Hours limit\",\n \"accumulatordays-soft\": \"Work days limit\",\n \"spacer-soft\": \"Rest between shifts\",\n \"spacerperiodic-soft\": \"Required rest period\",\n \"composition-soft\": \"Staffing ratio\",\n \"transactional-soft\": \"Policy rule\",\n \"balancer-medium\": \"Fair work distribution\",\n \"balancerovertime-medium\": \"Minimize overtime\",\n \"coverage-soft\": \"Minimum staffing\",\n \"sizing-soft\": \"Shift duration limit\",\n \"sequencer-soft\": \"Shift sequence\",\n \"optimizerminimize-soft\": \"Minimize target\",\n \"optimizermaximize-soft\": \"Maximize target\",\n\n // Rule IDs (from rules JSON)\n \"max-weekly-hours\": \"Max weekly hours\",\n \"max-daily-hours\": \"Max daily hours\",\n \"min-rest-between-shifts\": \"Min rest between shifts\",\n \"min-days-off-per-week\": \"Min days off per week\",\n \"max-work-days-per-week\": \"Max work days per week\",\n \"fair-hour-distribution\": \"Fair hour distribution\",\n \"overtime-balance\": \"Overtime balance\",\n \"labor-cost-optimization\": \"Labor cost optimization\",\n \"maximize-sales-performance\": \"Maximize sales performance\",\n \"split-shift-penalty\": \"Split shift penalty\",\n \"shift-continuity-penalty\": \"Shift continuity penalty\",\n \"manager-cashier-ratio\": \"Staffing ratio\",\n \"min-staffing\": \"Minimum staffing\",\n \"shift-duration-limits\": \"Shift duration limit\",\n \"max-consecutive-days\": \"Shift sequence\",\n \"some-transactional-rule\": \"Policy rule\",\n};\n\n/**\n * Returns a user-friendly display name for a ruleId or constraintName.\n * Falls back to humanizing the raw string (replace - with spaces, capitalize) for unknown values.\n */\nexport function getFriendlyRuleName(ruleIdOrConstraintName: string): string {\n const trimmed = ruleIdOrConstraintName?.trim();\n if (!trimmed) return \"Unknown\";\n\n const mapped = RULE_ID_FRIENDLY_NAMES[trimmed.toLocaleLowerCase()];\n if (mapped) return mapped;\n\n // Fallback: humanize (replace - with spaces, capitalize words)\n return trimmed\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n","export class RequestError extends Error {\n status: number;\n payload?: unknown;\n\n constructor(message: string, status: number, payload?: unknown) {\n super(message);\n this.name = \"RequestError\";\n this.status = status;\n this.payload = payload;\n }\n}\n\n// --- schedule solution types (matches API response from POST /api/schedule/solve) ---\n\nexport type ScheduleSolutionEmployee = {\n id: string;\n name?: string;\n position?: string;\n properties?: Record<string, unknown>;\n locationIds?: string[];\n};\n\nexport type ScheduleSolutionLocation = {\n id: string;\n timezone?: string;\n jurisdiction?: string;\n tags?: string[];\n properties?: Record<string, unknown>;\n};\n\nexport type ScheduleSolutionShift = {\n id: string;\n startDateTime?: string;\n endDateTime?: string;\n startTime?: string;\n endTime?: string;\n requiredHours?: number;\n requiredPosition?: string | null;\n requiredCount?: number;\n location?: ScheduleSolutionLocation;\n employeePreferences?: Array<{ employeeId: string; level: string }>;\n};\n\nexport type ShiftAssignmentJustification = {\n status: string; // \"SATISFIED\" | \"VIOLATED\"\n constraintName?: string;\n ruleId?: string | null;\n archetype?: string | null;\n jurisdiction?: string | null;\n type: string; // \"HARD\" | \"SOFT\"\n impact?: string;\n description?: string;\n};\n\nexport type ScheduleSolutionShiftAssignment = {\n id: number;\n shift?: ScheduleSolutionShift;\n slotIndex?: number;\n employee?: ScheduleSolutionEmployee | null;\n pinned: boolean;\n justifications?: ShiftAssignmentJustification[];\n};\n\nexport type ScheduleSolutionAvailability = {\n employeeId: string;\n type?: string;\n daysOfWeek?: string[];\n specificDates?: string[];\n startTime?: string;\n endTime?: string;\n};\n\nexport type ScheduleSolutionTimeOff = {\n employeeId: string;\n startDateTime: string;\n endDateTime: string;\n};\n\nexport type ScheduleSolutionWaiver = {\n employeeId: string;\n ruleId: string;\n expiry?: string;\n};\n\nexport type ScheduleSolutionRuleMetadata = Record<string, unknown>;\n\nexport type ScheduleSolutionRuleOverride = {\n ruleId: string;\n parameters?: Record<string, unknown>;\n};\n\nexport type ScheduleSolution = {\n employees?: ScheduleSolutionEmployee[];\n shifts?: ScheduleSolutionShift[];\n shiftAssignments?: ScheduleSolutionShiftAssignment[];\n locations?: ScheduleSolutionLocation[];\n availabilities?: ScheduleSolutionAvailability[];\n timeOffs?: ScheduleSolutionTimeOff[];\n waivers?: ScheduleSolutionWaiver[];\n ruleMetadata?: ScheduleSolutionRuleMetadata[];\n ruleOverrides?: ScheduleSolutionRuleOverride[];\n ruleIds?: string[] | null;\n demandCurve?: unknown | null;\n mode?: \"FIXED_TEMPLATE\" | \"FLEXIBLE_DEMAND\" | \"MIXED\";\n score?: string;\n};\n"],"mappings":"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","names":["useMemo","useState","Box","Button","HStack","IconButton","Spinner","Stack","Text","_ignored","defaultStyles","axios","jsx","jsxs","axios","recommendations","jsx","jsxs","useMemo","useState","Stack","Box","Text","HStack","Button","Spinner","IconButton","ChakraProvider","jsx","ChakraProvider","ChakraProvider","jsx"]}
1
+ {"version":3,"sources":["../src/AutoSchedulerModal.tsx","../src/types.ts","../src/icons/AutoSchedulerIcons.tsx","../src/theme/mergeTheme.ts","../src/constants.ts","../src/utils/theme.ts","../src/utils/ruleIdMapping.ts","../src/buildSchedulePayload.ts","../src/api/api.ts","../src/utils/violationMessages.ts","../src/utils/mapViolationsToResult.ts","../src/ViolatedConstraintsPanel.tsx","../src/weekDates.ts","../src/AutoSchedulerModalWithProvider.tsx","../src/ViolatedConstraintsPanelWithProvider.tsx","../src/utils/ruleIdFriendlyNames.ts","../src/api/types.ts"],"sourcesContent":["import { cloneElement, isValidElement, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport {\n Badge,\n Box,\n Button,\n ChakraProvider,\n Checkbox,\n Divider,\n HStack,\n IconButton,\n Input,\n InputGroup,\n InputRightAddon,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverTrigger,\n Portal,\n Spinner,\n Stack,\n Text,\n useTheme,\n} from \"@chakra-ui/react\";\nimport { Drawer as EtDrawer } from \"@easyteam/web-ui\";\nimport type { AutoSchedulerModalProps, HardConstraintOption, SoftConstraintGroup, SolveApiResponse } from \"./types\";\nimport { InfeasibleScheduleError } from \"./types\";\nimport { ChevronDownIcon, CheckIcon, CloseIcon, FailedIcon, InfoIcon, MagicIcon, WarningIcon } from \"./icons/AutoSchedulerIcons\";\nimport { mergeThemeWithBase, resolveThemeParts } from \"./theme/mergeTheme\";\nimport {\n defaultStyles,\n HARD_CONSTRAINT_DEFAULTS,\n HARD_CONSTRAINT_OPTIONS,\n OPTIMIZATION_OPTION_GROUPS,\n SCHEDULE_STEPS,\n STEP_INTERVAL_MS,\n POLL_INTERVAL_MS,\n OPTIMIZING_STEP_INDEX,\n NETWORK_ERROR_FAILURE,\n} from \"./constants\";\nimport { buildStyles } from \"./utils/theme\";\nimport { buildSchedulePayload } from \"./buildSchedulePayload\";\nimport { getToken, submitSolveJob, getJobStatus, getJobResult, getJobSolution } from \"./api/api\";\nimport { mapViolationsToResult } from \"./utils/mapViolationsToResult\";\nimport type { Screen, StepStatus, ViolatedConstraintsResult } from \"./types\";\nimport type { ViolationMessage } from \"./utils/violationMessages\";\nimport { toBackendRuleId } from \"./utils/ruleIdMapping\";\nimport { ViolatedConstraintsPanel } from \"./ViolatedConstraintsPanel\";\nimport {\n defaultSelectedScheduleDates,\n getSequentialWeekDatesFromWeekStart,\n todayCalendarYmdInTimezone,\n weekdayTwoLetterFromYmd,\n} from \"./weekDates\";\n\n/** Fresh node each call — same React element can't mount under Cost-to-sales and Maximize sales. */\nfunction resolveOptimizationFooter(footer: ReactNode | (() => ReactNode) | undefined, key: string) {\n if (!footer) return null;\n const node = typeof footer === \"function\" ? footer() : footer;\n if (isValidElement(node)) return cloneElement(node, { key });\n return node;\n}\n\nconst DRAWER_WIDTH_MAP = { sm: \"448px\", md: \"578px\", lg: \"600px\" } as const;\n\nexport function AutoSchedulerModal({\n displayMode,\n drawerSize = \"lg\",\n baseURL,\n isOpen,\n title = \"Auto-scheduling\",\n bannerTitle = \"Create a smarter retail schedule in seconds.\",\n bannerText = \"AI assigns open shifts using your rules, availability, and optimization priorities while keeping existing\\n assigned shifts in place.\",\n jurisdictions,\n openShifts,\n employees,\n timeOffs,\n locationPlaceholder = \"Select locations\",\n onClose,\n cancelLabel = \"Cancel\",\n primaryActionLabel = \"Create schedule\",\n onPrimaryAction: _onPrimaryAction,\n onFixManually,\n initialConfig,\n theme,\n cssVarsRoot,\n generateRecommendationsURLAndHeaders,\n getTokenURLAndHeaders,\n onSolution,\n getStoredConfigForLocations,\n persistConfigForLocations,\n errorToast,\n organizationId,\n constraintDefinitionIds,\n constraintDefinitions,\n hardConstraintOptions,\n softConstraintGroups,\n optimizationFooter,\n trafficForecast,\n builtinConstraintOptions,\n subLocations,\n showSubLocations,\n teams,\n showTeams,\n onSelectionChange,\n onGenerate,\n onGenerateSolution,\n solveStatus,\n scheduleWeekStartYmd,\n todayCalendarYmd,\n evaluationTimezone,\n}: AutoSchedulerModalProps) {\n const baseTheme = useTheme();\n const { chakraOverride, styleOverrides } = useMemo(() => resolveThemeParts(theme), [theme]);\n const mergedTheme = useMemo(\n () => mergeThemeWithBase(baseTheme as Record<string, unknown>, chakraOverride),\n [baseTheme, chakraOverride],\n );\n const styles = useMemo(() => buildStyles(defaultStyles, styleOverrides), [styleOverrides]);\n\n const effectiveHardConstraintOptions = useMemo<HardConstraintOption[]>(() => {\n const base = hardConstraintOptions ?? (HARD_CONSTRAINT_OPTIONS as unknown as HardConstraintOption[]);\n return base.map((opt) => ({\n ...opt,\n defaultValue: opt.defaultValue ?? HARD_CONSTRAINT_DEFAULTS[opt.id],\n suffix: opt.suffix ?? (opt.id === \"max_work_days_per_week\" ? \"days\" : \"hours\"),\n min: opt.min ?? (opt.id === \"max_work_days_per_week\" ? 1 : undefined),\n max: opt.max ?? (opt.id === \"max_work_days_per_week\" ? 6 : undefined),\n }));\n }, [hardConstraintOptions]);\n\n const effectiveSoftConstraintGroups = useMemo<SoftConstraintGroup[]>(\n () => (softConstraintGroups ?? OPTIMIZATION_OPTION_GROUPS) as SoftConstraintGroup[],\n [softConstraintGroups],\n );\n\n const effectiveBuiltinOptions = useMemo(\n () => builtinConstraintOptions ?? [],\n [builtinConstraintOptions],\n );\n const defaultSelectedBuiltinIds = useMemo(\n () => effectiveBuiltinOptions.filter((option) => option.defaultSelected).map((option) => option.id),\n [effectiveBuiltinOptions],\n );\n\n const dynamicViolationMessages = useMemo<Record<string, ViolationMessage>>(() => {\n const map: Record<string, ViolationMessage> = {};\n for (const opt of effectiveHardConstraintOptions) {\n const msg = { title: opt.name, detail: opt.description || opt.name };\n map[opt.id] = msg;\n const backendRuleId = toBackendRuleId(opt.id);\n if (backendRuleId) {\n map[backendRuleId] = msg;\n }\n }\n for (const group of effectiveSoftConstraintGroups) {\n for (const opt of group.options) {\n const msg = { title: opt.title, detail: opt.subtitle || opt.title };\n map[opt.id] = msg;\n const backendRuleId = toBackendRuleId(opt.id);\n if (backendRuleId) {\n map[backendRuleId] = msg;\n }\n }\n }\n return map;\n }, [effectiveHardConstraintOptions, effectiveSoftConstraintGroups]);\n\n const [selectedSubLocationIds, setSelectedSubLocationIds] = useState<string[]>([]);\n const [selectedTeamIds, setSelectedTeamIds] = useState<string[]>([]);\n const [selectedConstraintIds, setSelectedConstraintIds] = useState<string[]>([]);\n const [constraintValues, setConstraintValues] = useState<Record<string, string>>({});\n const [selectedOptimizationIds, setSelectedOptimizationIds] = useState<string[]>([]);\n const [optimizationValues, setOptimizationValues] = useState<Record<string, string>>({});\n const [selectedScheduleDates, setSelectedScheduleDates] = useState<string[]>([]);\n const [screen, setScreen] = useState<Screen>(\"configure\");\n const [activeStepIndex, setActiveStepIndex] = useState(0);\n const [completedStepIndex, setCompletedStepIndex] = useState(-1);\n const [lastFailure, setLastFailure] = useState<ViolatedConstraintsResult | null>(null);\n const [selectedLocationIds, setSelectedLocationIds] = useState<string[]>([]);\n const timersRef = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n const pollIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const runIdRef = useRef(0);\n\n const weekDatesOrdered = useMemo(() => {\n if (!scheduleWeekStartYmd) return [];\n return getSequentialWeekDatesFromWeekStart(scheduleWeekStartYmd);\n }, [scheduleWeekStartYmd]);\n\n const toggleScheduleDate = (ymd: string) => {\n setSelectedScheduleDates((prev) =>\n prev.includes(ymd) ? prev.filter((d) => d !== ymd) : [...prev, ymd].sort(),\n );\n };\n\n const selectedByJurisdiction = useMemo(\n () =>\n jurisdictions\n .map((jurisdiction) => ({\n ...jurisdiction,\n selectedLocations: jurisdiction.locations.filter((location) => selectedLocationIds.includes(location.id)),\n }))\n .filter((jurisdiction) => jurisdiction.selectedLocations.length > 0),\n [jurisdictions, selectedLocationIds],\n );\n\n const selectedCount = selectedByJurisdiction.reduce(\n (total, jurisdiction) => total + jurisdiction.selectedLocations.length,\n 0,\n );\n\n const locationIdsWithOpenShifts = useMemo(() => {\n return new Set(openShifts.filter((shift) => !shift.employeeId).map((shift) => shift.location.id));\n }, [openShifts]);\n\n const filteredSubLocations = useMemo(\n () => subLocations?.filter((sl) => selectedLocationIds.includes(sl.parentId)) ?? [],\n [subLocations, selectedLocationIds],\n );\n\n const selectedLocationTimezone = useMemo(() => {\n const allLocations = jurisdictions.flatMap((jurisdiction) => jurisdiction.locations);\n for (const id of selectedLocationIds) {\n const timezone = allLocations.find((location) => location.id === id)?.timezone?.trim();\n if (timezone) return timezone;\n }\n return evaluationTimezone?.trim() || \"UTC\";\n }, [evaluationTimezone, jurisdictions, selectedLocationIds]);\n\n const effectiveTodayCalendarYmd = useMemo(() => {\n return todayCalendarYmd ?? todayCalendarYmdInTimezone(selectedLocationTimezone);\n }, [selectedLocationTimezone, todayCalendarYmd]);\n\n const selectedConstraints = useMemo(\n () => effectiveHardConstraintOptions.filter((option) => selectedConstraintIds.includes(option.id)),\n [effectiveHardConstraintOptions, selectedConstraintIds],\n );\n\n const selectedConstraintDisplayOptions = useMemo(\n () =>\n effectiveHardConstraintOptions.filter(\n (option) => selectedConstraintIds.includes(option.id) || (option.readOnly && option.defaultSelected),\n ),\n [effectiveHardConstraintOptions, selectedConstraintIds],\n );\n\n const optimizationOptions = useMemo(\n () =>\n effectiveSoftConstraintGroups.flatMap((group) =>\n group.options.map((option) => ({\n ...option,\n groupId: group.id,\n groupName: group.name,\n })),\n ),\n [effectiveSoftConstraintGroups],\n );\n\n const selectedOptimizationOptions = useMemo(\n () => optimizationOptions.filter((option) => selectedOptimizationIds.includes(option.id)),\n [optimizationOptions, selectedOptimizationIds],\n );\n\n const selectedOptimizationDisplayOptions = useMemo(\n () =>\n optimizationOptions.filter(\n (option) => selectedOptimizationIds.includes(option.id) || (option.readOnly && option.defaultSelected),\n ),\n [optimizationOptions, selectedOptimizationIds],\n );\n\n // Read-only, default-selected options are shown as checked in the UI but are\n // not part of selectedConstraintIds/selectedOptimizationIds. Merge them in so\n // solver payloads and persisted config reflect what the user actually sees.\n const effectiveSelectedConstraintIds = useMemo(\n () =>\n Array.from(\n new Set([\n ...selectedConstraintIds,\n ...effectiveHardConstraintOptions\n .filter((option) => option.readOnly && option.defaultSelected)\n .map((option) => option.id),\n ]),\n ),\n [selectedConstraintIds, effectiveHardConstraintOptions],\n );\n\n const effectiveSelectedOptimizationIds = useMemo(\n () =>\n Array.from(\n new Set([\n ...selectedOptimizationIds,\n ...optimizationOptions\n .filter((option) => option.readOnly && option.defaultSelected)\n .map((option) => option.id),\n ]),\n ),\n [selectedOptimizationIds, optimizationOptions],\n );\n\n const hasEmptyInputs = useMemo(() => {\n const hasEmptyConstraint = selectedConstraints\n .filter((opt) => opt.defaultValue != null)\n .some((opt) => !constraintValues[opt.id]?.trim());\n const hasEmptyWeight =\n selectedOptimizationOptions.length >= 2 &&\n selectedOptimizationOptions.some((opt) => !optimizationValues[`${opt.id}_weightPoints`]?.trim());\n return hasEmptyConstraint || hasEmptyWeight;\n }, [selectedConstraints, constraintValues, selectedOptimizationOptions, optimizationValues]);\n\n const allocationSummary = useMemo(() => {\n if (selectedOptimizationOptions.length === 0) return \"\";\n const totalWeight = selectedOptimizationOptions.reduce(\n (sum, opt) => sum + (Number(optimizationValues[`${opt.id}_weightPoints`]) || 1),\n 0,\n );\n const parts = selectedOptimizationOptions.map((opt) => {\n const weight = Number(optimizationValues[`${opt.id}_weightPoints`]) || 1;\n const pct = Math.round((weight / totalWeight) * 100);\n return `${opt.title} ${pct}%`;\n });\n return `Scheduling priorities: ${parts.join(\", \")}.`;\n }, [selectedOptimizationOptions, optimizationValues]);\n\n const clearTimers = () => {\n timersRef.current.forEach((timerId) => clearTimeout(timerId));\n timersRef.current = [];\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n pollIntervalRef.current = null;\n }\n };\n\n const resetProgress = () => {\n setActiveStepIndex(0);\n setCompletedStepIndex(-1);\n };\n\n useEffect(() => {\n if (!isOpen) {\n clearTimers();\n setScreen(\"configure\");\n setLastFailure(null);\n setSelectedLocationIds([]);\n setSelectedSubLocationIds([]);\n setSelectedTeamIds([]);\n setSelectedOptimizationIds([]);\n setSelectedConstraintIds([]);\n setConstraintValues({});\n setOptimizationValues({});\n setSelectedScheduleDates([]);\n resetProgress();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen || !scheduleWeekStartYmd) return;\n if (weekDatesOrdered.length === 0) {\n setSelectedScheduleDates([]);\n return;\n }\n const today = effectiveTodayCalendarYmd ?? weekDatesOrdered[0];\n setSelectedScheduleDates(defaultSelectedScheduleDates(weekDatesOrdered, today));\n }, [isOpen, scheduleWeekStartYmd, weekDatesOrdered, effectiveTodayCalendarYmd]);\n\n useEffect(() => {\n if (isOpen && initialConfig) {\n setSelectedLocationIds(initialConfig.selectedLocationIds);\n setSelectedConstraintIds(initialConfig.selectedConstraintIds);\n setConstraintValues(initialConfig.constraintValues);\n setSelectedOptimizationIds(initialConfig.selectedOptimizationIds);\n setOptimizationValues(initialConfig.optimizationValues);\n if (initialConfig.failure) {\n setLastFailure(initialConfig.failure);\n }\n setScreen(\"configure\");\n }\n }, [isOpen, initialConfig]);\n\n useEffect(() => {\n if (selectedLocationIds.length === 0 || initialConfig || !getStoredConfigForLocations) {\n return;\n }\n const stored = getStoredConfigForLocations(selectedLocationIds);\n if (stored) {\n setSelectedConstraintIds(stored.selectedConstraintIds);\n setConstraintValues(stored.constraintValues);\n setSelectedOptimizationIds(stored.selectedOptimizationIds);\n setOptimizationValues(stored.optimizationValues);\n } else {\n setSelectedConstraintIds([]);\n setConstraintValues({});\n setSelectedOptimizationIds([]);\n setOptimizationValues({});\n }\n }, [selectedLocationIds, initialConfig, getStoredConfigForLocations]);\n\n useEffect(() => () => clearTimers(), []);\n\n useEffect(() => {\n if (onGenerate) return;\n setSelectedLocationIds((previous) => {\n const filtered = previous.filter((id) => locationIdsWithOpenShifts.has(id));\n return filtered.length === previous.length ? previous : filtered;\n });\n }, [locationIdsWithOpenShifts, onGenerate]);\n\n const stepStatusForIndex = (index: number): StepStatus => {\n if (index <= completedStepIndex) {\n return \"done\";\n }\n if (index === activeStepIndex) {\n return \"active\";\n }\n return \"pending\";\n };\n\n const resetBeforeSubmit = () => {\n clearTimers();\n setScreen(\"creating\");\n setLastFailure(null);\n resetProgress();\n runIdRef.current += 1;\n return runIdRef.current;\n };\n\n const schedule = (delayMs: number, action: () => void, runId: number) => {\n const timerId = setTimeout(() => {\n if (runIdRef.current !== runId) {\n return;\n }\n action();\n }, delayMs);\n timersRef.current.push(timerId);\n };\n\n const afterSuccessSteps = (runId: number, response: SolveApiResponse) => {\n schedule(\n STEP_INTERVAL_MS,\n () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(2);\n setActiveStepIndex(3);\n },\n runId,\n );\n schedule(\n STEP_INTERVAL_MS * 2,\n () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(3);\n setActiveStepIndex(4);\n },\n runId,\n );\n schedule(\n STEP_INTERVAL_MS * 3,\n async () => {\n if (runIdRef.current !== runId) return;\n\n try {\n await onSolution?.(response.solution);\n setCompletedStepIndex(4);\n setActiveStepIndex(4);\n } catch (err) {\n console.error(err);\n const defaultErrorMessage = \"Failed to create schedule shifts\";\n const detailedErrorMessage = err instanceof Error ? err.message || defaultErrorMessage : defaultErrorMessage;\n setLastFailure({\n violatedConstraints: [\n {\n title: \"Something went wrong\",\n detail: detailedErrorMessage,\n },\n ],\n recommendedFixes: [],\n });\n setScreen(\"failed\");\n }\n },\n runId,\n );\n };\n\n const handleCreateSchedule = () => {\n if (selectedCount === 0) {\n return;\n }\n\n if (scheduleWeekStartYmd && selectedScheduleDates.length === 0) {\n return;\n }\n\n // onGenerate path — bypasses the Java solver flow entirely\n if (onGenerate) {\n const runId = resetBeforeSubmit();\n schedule(\n STEP_INTERVAL_MS,\n async () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(0);\n setActiveStepIndex(1);\n try {\n const generateResult = await onGenerate({\n selectedLocationIds,\n selectedSubLocationIds,\n selectedTeamIds,\n schedulerTimezone: selectedLocationTimezone,\n selectedScheduleDates,\n selectedConstraintIds: effectiveSelectedConstraintIds,\n constraintValues,\n selectedOptimizationIds: effectiveSelectedOptimizationIds,\n optimizationValues,\n selectedBuiltinIds: defaultSelectedBuiltinIds,\n });\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(1);\n setActiveStepIndex(2);\n schedule(\n STEP_INTERVAL_MS,\n () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(2);\n setActiveStepIndex(3);\n },\n runId,\n );\n schedule(\n STEP_INTERVAL_MS * 2,\n () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(3);\n setActiveStepIndex(4);\n },\n runId,\n );\n schedule(\n STEP_INTERVAL_MS * 3,\n () => {\n if (runIdRef.current !== runId) return;\n setCompletedStepIndex(4);\n setActiveStepIndex(4);\n onGenerateSolution?.(generateResult);\n onClose();\n },\n runId,\n );\n } catch (err) {\n if (runIdRef.current !== runId) return;\n if (err instanceof InfeasibleScheduleError) {\n setLastFailure(err.failure);\n } else {\n const msg = err instanceof Error ? err.message : \"Unknown error\";\n setLastFailure({\n violatedConstraints: [{ title: \"Error\", detail: msg }],\n recommendedFixes: [],\n });\n }\n setScreen(\"failed\");\n }\n },\n runId,\n );\n return;\n }\n\n const payload = buildSchedulePayload({\n employees,\n openShifts,\n timeOffs,\n selectedLocationIds,\n jurisdictions,\n selectedConstraintIds: effectiveSelectedConstraintIds,\n constraintValues,\n selectedOptimizationIds: effectiveSelectedOptimizationIds,\n optimizationValues,\n trafficForecast,\n constraintDefinitionIds,\n constraintDefinitions,\n organizationId,\n });\n\n persistConfigForLocations?.(selectedLocationIds, {\n selectedLocationIds,\n selectedConstraintIds: effectiveSelectedConstraintIds,\n constraintValues,\n selectedOptimizationIds: effectiveSelectedOptimizationIds,\n optimizationValues,\n selectedBuiltinIds: defaultSelectedBuiltinIds,\n });\n\n const runId = resetBeforeSubmit();\n\n schedule(\n STEP_INTERVAL_MS,\n async () => {\n setCompletedStepIndex(0);\n setActiveStepIndex(1);\n\n try {\n const token = await getToken(getTokenURLAndHeaders!.url, getTokenURLAndHeaders!.headers);\n if (!token) {\n throw new Error(\"Failed to get auto-scheduler token\");\n }\n\n const selectedDates = [...selectedScheduleDates].sort();\n const horizonOptions =\n selectedDates.length > 0\n ? {\n horizonStartDate: selectedDates[0],\n horizonEndDate: selectedDates[selectedDates.length - 1],\n }\n : {};\n const auth = { authorization: `Bearer ${token}`, ...horizonOptions };\n const { jobId } = await submitSolveJob(baseURL!, payload, auth);\n\n if (runIdRef.current !== runId) {\n return;\n }\n\n setCompletedStepIndex(1);\n setActiveStepIndex(OPTIMIZING_STEP_INDEX);\n\n const pollForResult = async () => {\n if (runIdRef.current !== runId) return;\n try {\n const statusRes = await getJobStatus(baseURL!, jobId, auth);\n if (runIdRef.current !== runId) return;\n\n if (statusRes.status === \"NOT_SOLVING\" || statusRes.status === \"TERMINATED_EARLY\") {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n pollIntervalRef.current = null;\n }\n const response = await getJobResult(baseURL!, jobId, auth);\n if (runIdRef.current !== runId) return;\n let responseForHandling = response;\n if (response.explanation.isFeasible) {\n const solution = await getJobSolution(baseURL!, jobId, auth);\n if (runIdRef.current !== runId) return;\n responseForHandling = { ...response, solution };\n }\n handleSolveResult(runId, responseForHandling);\n return;\n }\n } catch (err) {\n if (runIdRef.current !== runId) return;\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n pollIntervalRef.current = null;\n }\n console.error(err);\n setLastFailure(NETWORK_ERROR_FAILURE);\n setScreen(\"failed\");\n }\n };\n\n pollForResult();\n pollIntervalRef.current = setInterval(pollForResult, POLL_INTERVAL_MS);\n } catch (err) {\n if (runIdRef.current !== runId) {\n return;\n }\n console.error(err);\n setLastFailure(NETWORK_ERROR_FAILURE);\n setScreen(\"failed\");\n }\n },\n runId,\n );\n };\n\n const handleSolveResult = (runId: number, response: SolveApiResponse) => {\n if (!response.explanation.isFeasible) {\n const result = mapViolationsToResult(response.explanation.violations ?? [], response.explanation.summary, dynamicViolationMessages);\n\n const selectedLocations = jurisdictions\n .flatMap((j) => j.locations)\n .filter((l) => selectedLocationIds.includes(l.id));\n const recommendationPayload = generateRecommendationsURLAndHeaders\n ? {\n context: {\n selectedLocationIds,\n selectedConstraintIds: effectiveSelectedConstraintIds,\n constraintValues,\n selectedOptimizationIds: effectiveSelectedOptimizationIds,\n optimizationValues,\n timezone: selectedLocationTimezone,\n },\n locations: selectedLocations,\n employees,\n openShifts: openShifts.filter(\n (s) => !s.employeeId && selectedLocationIds.includes(String(s.location?.id)),\n ),\n assignedShifts: openShifts.filter(\n (s) => Boolean(s.employeeId) && selectedLocationIds.includes(String(s.location?.id)),\n ),\n timeOffs: timeOffs ?? [],\n explanation: response.explanation,\n }\n : undefined;\n\n setLastFailure({\n ...result,\n recommendedFixes: [],\n recommendationPayload,\n });\n setScreen(\"failed\");\n } else {\n afterSuccessSteps(runId, response);\n }\n };\n\n const handleAdjustConstraints = () => {\n clearTimers();\n setScreen(\"configure\");\n };\n\n const handleToggleLocation = (locationId: string) => {\n if (!onGenerate && !locationIdsWithOpenShifts.has(locationId)) {\n return;\n }\n\n const newLocationIds = selectedLocationIds.includes(locationId)\n ? selectedLocationIds.filter((id) => id !== locationId)\n : [...selectedLocationIds, locationId];\n\n setSelectedLocationIds(newLocationIds);\n\n // Remove sublocations whose parent was deselected\n const filteredSubs = selectedSubLocationIds.filter((subId) => {\n const sub = subLocations?.find((s) => s.id === subId);\n return sub ? newLocationIds.includes(sub.parentId) : false;\n });\n if (filteredSubs.length !== selectedSubLocationIds.length) {\n setSelectedSubLocationIds(filteredSubs);\n }\n\n onSelectionChange?.(\n newLocationIds,\n filteredSubs.length !== selectedSubLocationIds.length ? filteredSubs : selectedSubLocationIds,\n );\n };\n\n const handleToggleSubLocation = (subLocationId: string) => {\n const next = selectedSubLocationIds.includes(subLocationId)\n ? selectedSubLocationIds.filter((id) => id !== subLocationId)\n : [...selectedSubLocationIds, subLocationId];\n setSelectedSubLocationIds(next);\n onSelectionChange?.(selectedLocationIds, next);\n };\n\n const handleToggleTeam = (teamId: string) => {\n setSelectedTeamIds((prev) => (prev.includes(teamId) ? prev.filter((id) => id !== teamId) : [...prev, teamId]));\n };\n\n const handleToggleConstraint = (constraintId: string) => {\n setSelectedConstraintIds((prev) => {\n if (prev.includes(constraintId)) {\n setConstraintValues((values) => {\n const next = { ...values };\n delete next[constraintId];\n return next;\n });\n return prev.filter((id) => id !== constraintId);\n }\n\n const defaultVal = effectiveHardConstraintOptions.find((o) => o.id === constraintId)?.defaultValue;\n if (defaultVal) {\n setConstraintValues((values) => ({\n ...values,\n [constraintId]: defaultVal,\n }));\n }\n return [...prev, constraintId];\n });\n };\n\n const handleToggleOptimization = (optionId: string) => {\n setSelectedOptimizationIds((prev) => {\n if (prev.includes(optionId)) {\n setOptimizationValues((values) => {\n const next = { ...values };\n delete next[`${optionId}_weightPoints`];\n if (optionId === \"fair_hour_distribution\") {\n delete next[\"fair_hour_distribution_balanceTarget\"];\n delete next[\"fair_hour_distribution_period\"];\n } else if (optionId === \"minimize_overtime\") {\n delete next[\"minimize_overtime_thresholdMinutes\"];\n delete next[\"minimize_overtime_period\"];\n }\n return next;\n });\n return prev.filter((id) => id !== optionId);\n }\n\n if (prev.length >= 3) return prev;\n\n setOptimizationValues((values) => ({\n ...values,\n [`${optionId}_weightPoints`]: \"1\",\n }));\n return [...prev, optionId];\n });\n };\n\n const modalTitle = screen === \"configure\" ? title : \"Creating schedule\";\n const showConfiguration = screen === \"configure\";\n const showFailed = screen === \"failed\";\n\n const violationTitle = useMemo(\n () => (showFailed ? \"Schedule can’t be created\" : \"Validating compliance rules\"),\n [showFailed],\n );\n\n const violationPanel = lastFailure ? (\n <ViolatedConstraintsPanel\n violatedConstraints={lastFailure}\n title={violationTitle}\n subtitle=\"\"\n errorToast={errorToast}\n generateRecommendationsURLAndHeaders={generateRecommendationsURLAndHeaders}\n styles={styles}\n />\n ) : null;\n\n const configurationContent = (\n <Stack spacing=\"20px\">\n <Box sx={styles.banner}>\n <Box sx={styles.bannerIcon}>\n <MagicIcon />\n </Box>\n <Stack spacing=\"4px\" flex={1}>\n <Text sx={styles.bannerTitle}>{bannerTitle}</Text>\n <Text sx={styles.bannerText}>{bannerText}</Text>\n </Stack>\n </Box>\n\n {!onGenerate && openShifts.length === 0 ? (\n <Box\n sx={{\n bg: \"#FFF4E5\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"8px\",\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-start\",\n }}\n >\n <Box sx={{ color: \"#B76E00\", flexShrink: 0, mt: \"2px\" }}>\n <WarningIcon />\n </Box>\n <Text sx={{ fontSize: \"13px\", color: \"#7A4100\", lineHeight: \"20px\" }}>\n There are no open shifts to schedule. Add open shifts before creating a schedule.\n </Text>\n </Box>\n ) : null}\n\n <Stack spacing=\"8px\" sx={styles.locationSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.locationLabelRow}>\n <Text sx={styles.locationLabel}>Location</Text>\n {selectedCount > 0 ? <Badge sx={styles.locationBadge}>{selectedCount}</Badge> : null}\n </HStack>\n <Text sx={styles.locationSubtitle}>\n Select locations within the same labor jurisdiction. Locations from different jurisdictions cannot be\n combined.\n </Text>\n </Stack>\n\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button variant=\"unstyled\" sx={styles.locationTrigger}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.locationTriggerText,\n ...(selectedLocationIds.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedLocationIds.length > 0\n ? jurisdictions\n .flatMap((j) => j.locations)\n .filter((l) => selectedLocationIds.includes(l.id))\n .map((l) => l.name)\n .join(\", \")\n : locationPlaceholder}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.popoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"4px\">\n {jurisdictions.map((jurisdiction) => (\n <Box key={jurisdiction.id}>\n <Text sx={styles.groupHeader}>{jurisdiction.title}</Text>\n <Stack spacing=\"2px\">\n {jurisdiction.locations.map((location) => {\n const isEnabled = onGenerate || locationIdsWithOpenShifts.has(location.id);\n return (\n <HStack\n key={location.id}\n as=\"label\"\n sx={{\n ...styles.optionRow,\n cursor: isEnabled ? \"pointer\" : \"not-allowed\",\n opacity: isEnabled ? 1 : 0.55,\n }}\n >\n <Checkbox\n id={`location-${location.id}`}\n isChecked={selectedLocationIds.includes(location.id)}\n isDisabled={!isEnabled}\n onChange={() => handleToggleLocation(location.id)}\n />\n <Text sx={styles.optionLabel}>{location.name}</Text>\n </HStack>\n );\n })}\n </Stack>\n </Box>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n\n <Stack spacing=\"8px\">\n {selectedByJurisdiction.map((jurisdiction) => (\n <Box key={jurisdiction.id} sx={styles.selectedBanner}>\n <Box sx={styles.selectedBannerIcon}>\n <InfoIcon />\n </Box>\n <Box sx={styles.selectedBannerText}>\n <Text fontWeight={600}>Compliance jurisdiction: {jurisdiction.title}</Text>\n <Text>{jurisdiction.selectedLocations.map((location) => location.name).join(\", \")}</Text>\n </Box>\n </Box>\n ))}\n </Stack>\n </Stack>\n\n {showSubLocations && (\n <Stack spacing=\"8px\" sx={styles.locationSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.locationLabelRow}>\n <Text sx={styles.locationLabel}>Sub-location</Text>\n {selectedSubLocationIds.length > 0 && (\n <Badge sx={styles.locationBadge}>{selectedSubLocationIds.length}</Badge>\n )}\n </HStack>\n </Stack>\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button\n variant=\"unstyled\"\n isDisabled={selectedLocationIds.length === 0 || filteredSubLocations.length === 0}\n sx={{\n ...styles.locationTrigger,\n ...(selectedLocationIds.length === 0 || filteredSubLocations.length === 0\n ? { opacity: 0.5, cursor: \"not-allowed\" }\n : {}),\n }}\n >\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.locationTriggerText,\n ...(selectedSubLocationIds.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedSubLocationIds.length > 0\n ? filteredSubLocations\n .filter((s) => selectedSubLocationIds.includes(s.id))\n .map((s) => s.name)\n .join(\", \")\n : \"Select sub-locations\"}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.popoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"2px\">\n {filteredSubLocations.map((sub) => (\n <HStack key={sub.id} as=\"label\" sx={{ ...styles.optionRow, cursor: \"pointer\" }}>\n <Checkbox\n id={`sublocation-${sub.id}`}\n isChecked={selectedSubLocationIds.includes(sub.id)}\n onChange={() => handleToggleSubLocation(sub.id)}\n />\n <Text sx={styles.optionLabel}>{sub.name}</Text>\n </HStack>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n </Stack>\n )}\n\n {showTeams && (\n <Stack spacing=\"8px\" sx={styles.locationSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.locationLabelRow}>\n <Text sx={styles.locationLabel}>Teams</Text>\n {selectedTeamIds.length > 0 && <Badge sx={styles.locationBadge}>{selectedTeamIds.length}</Badge>}\n </HStack>\n </Stack>\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button\n variant=\"unstyled\"\n isDisabled={!teams || teams.length === 0}\n sx={{\n ...styles.locationTrigger,\n ...(!teams || teams.length === 0 ? { opacity: 0.5, cursor: \"not-allowed\" } : {}),\n }}\n >\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.locationTriggerText,\n ...(selectedTeamIds.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedTeamIds.length > 0\n ? (teams ?? [])\n .filter((t) => selectedTeamIds.includes(t.id))\n .map((t) => t.name)\n .join(\", \")\n : \"Select teams\"}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.popoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"2px\">\n {(teams ?? []).map((team) => (\n <HStack key={team.id} as=\"label\" sx={{ ...styles.optionRow, cursor: \"pointer\" }}>\n <Checkbox\n id={`team-${team.id}`}\n isChecked={selectedTeamIds.includes(team.id)}\n onChange={() => handleToggleTeam(team.id)}\n />\n <Text sx={styles.optionLabel}>{team.name}</Text>\n </HStack>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n </Stack>\n )}\n\n {scheduleWeekStartYmd ? (\n <Stack spacing=\"8px\" sx={styles.locationSection}>\n <Text sx={{ ...styles.locationLabel, fontWeight: 600 }}>Generate schedule for:</Text>\n <HStack spacing={2} flexWrap=\"wrap\">\n {weekDatesOrdered.map((ymd) => {\n const selected = selectedScheduleDates.includes(ymd);\n return (\n <Button\n key={ymd}\n type=\"button\"\n variant=\"unstyled\"\n onClick={() => toggleScheduleDate(ymd)}\n borderRadius=\"full\"\n minW=\"40px\"\n h=\"40px\"\n px={0}\n fontSize=\"sm\"\n fontWeight={600}\n borderWidth={selected ? \"2px\" : \"1px\"}\n borderStyle=\"solid\"\n borderColor={selected ? \"#5b44ff\" : \"#e2e8f0\"}\n bg={selected ? \"#ede9fe\" : \"#ffffff\"}\n color={selected ? \"#5b44ff\" : \"#303030\"}\n aria-pressed={selected}\n aria-label={`${weekdayTwoLetterFromYmd(ymd)} ${ymd}`}\n >\n {weekdayTwoLetterFromYmd(ymd)}\n </Button>\n );\n })}\n </HStack>\n </Stack>\n ) : null}\n\n <Stack spacing=\"16px\" sx={styles.hardConstraintsSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.hardConstraintsLabelRow}>\n <Text sx={styles.hardConstraintsLabel}>Required rules</Text>\n {selectedConstraintDisplayOptions.length > 0 ? (\n <Badge sx={styles.hardConstraintsBadge}>{selectedConstraintDisplayOptions.length}</Badge>\n ) : null}\n </HStack>\n <Text sx={styles.hardConstraintsSubtitle}>Assigned shifts will be required to meet the following rules:</Text>\n </Stack>\n\n {showConfiguration && lastFailure ? violationPanel : null}\n\n <Popover placement=\"bottom-start\" matchWidth isLazy>\n <PopoverTrigger>\n <Button variant=\"unstyled\" sx={styles.hardConstraintsTrigger}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.hardConstraintsTriggerText,\n ...(selectedConstraintDisplayOptions.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedConstraintDisplayOptions.length > 0\n ? selectedConstraintDisplayOptions.map((o) => o.name).join(\", \")\n : \"Select rules\"}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent sx={styles.hardConstraintsPopoverContent}>\n <PopoverBody p={0}>\n <Stack spacing=\"4px\">\n {effectiveHardConstraintOptions.map((option) => (\n <HStack key={option.id} as=\"label\" sx={{ ...styles.hardConstraintsOptionRow, cursor: \"pointer\" }}>\n <Checkbox\n id={`constraint-${option.id}`}\n isChecked={selectedConstraintIds.includes(option.id) || Boolean(option.readOnly && option.defaultSelected)}\n isDisabled={option.readOnly}\n onChange={() => {\n if (!option.readOnly) handleToggleConstraint(option.id);\n }}\n />\n <Text sx={styles.hardConstraintsOptionLabel}>{option.name}</Text>\n </HStack>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n\n {selectedConstraints.filter((o) => o.defaultValue != null).length > 0 ? (\n <Box sx={styles.hardConstraintsInputsContainer}>\n <Stack spacing=\"16px\">\n {selectedConstraints.filter((o) => o.defaultValue != null).map((option, index) => (\n <Stack key={option.id} sx={styles.hardConstraintsInputItem}>\n <Text sx={styles.hardConstraintsInputLabel}>\n {index + 1}. {option.name}\n </Text>\n <InputGroup>\n <Input\n type=\"number\"\n value={constraintValues[option.id] ?? \"\"}\n onChange={(event) =>\n setConstraintValues((prev) => ({\n ...prev,\n [option.id]: event.target.value,\n }))\n }\n min={option.min}\n max={option.max}\n step={option.max != null ? undefined : \"any\"}\n sx={styles.hardConstraintsInputField}\n />\n <InputRightAddon sx={styles.optimizationSuffix}>\n {option.suffix}\n </InputRightAddon>\n </InputGroup>\n </Stack>\n ))}\n </Stack>\n </Box>\n ) : null}\n </Stack>\n\n <Stack spacing=\"16px\" sx={styles.optimizationSection}>\n <Stack spacing=\"4px\">\n <HStack sx={styles.optimizationLabelRow}>\n <Text sx={styles.optimizationLabel}>Optimization</Text>\n {selectedOptimizationDisplayOptions.length > 0 ? (\n <Badge sx={styles.optimizationBadge}>{selectedOptimizationDisplayOptions.length}</Badge>\n ) : null}\n </HStack>\n <Text sx={styles.optimizationSubtitle}>\n Your schedule will be optimized based on the following priorities:\n </Text>\n </Stack>\n\n <Popover placement=\"top-start\" strategy=\"fixed\" matchWidth isLazy gutter={4}>\n <PopoverTrigger>\n <Button variant=\"unstyled\" sx={styles.optimizationTrigger}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text\n sx={{\n ...styles.optimizationTriggerText,\n ...(selectedOptimizationDisplayOptions.length > 0 ? { color: \"#303030\" } : {}),\n }}\n noOfLines={1}\n >\n {selectedOptimizationDisplayOptions.length > 0\n ? selectedOptimizationDisplayOptions.map((o) => o.title).join(\", \")\n : \"Select optimization priorities\"}\n </Text>\n <Box color=\"#5c5c5c\">\n <ChevronDownIcon />\n </Box>\n </HStack>\n </Button>\n </PopoverTrigger>\n <Portal appendToParentPortal={false}>\n <PopoverContent\n sx={{\n ...styles.optimizationPopoverContent,\n maxH: \"min(560px, calc(100vh - 96px))\",\n overflowY: \"auto\",\n zIndex: 1500,\n scrollbarWidth: \"none\",\n msOverflowStyle: \"none\",\n \"&::-webkit-scrollbar\": { display: \"none\" },\n }}\n >\n <PopoverBody p={0}>\n <Stack spacing=\"4px\">\n {effectiveSoftConstraintGroups.map((group) => (\n <Box key={group.id}>\n <Text sx={styles.optimizationGroupHeader}>{group.name}</Text>\n <Stack spacing=\"2px\">\n {group.options.map((option) => (\n <Box key={option.id}>\n <Stack\n as=\"label\"\n spacing=\"2px\"\n sx={{ ...styles.optimizationOptionRow, cursor: \"pointer\" }}\n >\n <HStack spacing=\"8px\">\n <Checkbox\n id={`optimization-${option.id}`}\n isChecked={selectedOptimizationIds.includes(option.id) || Boolean(option.readOnly && option.defaultSelected)}\n isDisabled={\n option.readOnly ||\n (!selectedOptimizationIds.includes(option.id) && selectedOptimizationIds.length >= 3)\n }\n onChange={() => {\n if (!option.readOnly) handleToggleOptimization(option.id);\n }}\n />\n <Text sx={styles.optimizationOptionLabel}>{option.title}</Text>\n </HStack>\n {option.subtitle ? <Text sx={styles.optimizationOptionHelp}>{option.subtitle}</Text> : null}\n </Stack>\n {optimizationFooter &&\n (option.id === \"cost_to_sales_ratio\" || option.id === \"maximize_sales\") ? (\n <Box px=\"12px\" pt=\"4px\" pb=\"6px\">\n {resolveOptimizationFooter(optimizationFooter, option.id)}\n </Box>\n ) : null}\n </Box>\n ))}\n </Stack>\n </Box>\n ))}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Portal>\n </Popover>\n\n {selectedOptimizationOptions.length >= 2 ? (\n <Box sx={styles.optimizationInputsContainer}>\n <Stack spacing=\"16px\">\n {selectedOptimizationOptions.map((option, index) => (\n <Stack key={option.id} sx={styles.optimizationInputItem}>\n <Stack sx={styles.hardConstraintsInputItem}>\n <Text sx={styles.hardConstraintsInputLabel}>\n {index + 1}. {option.title}\n </Text>\n <InputGroup>\n <Input\n type=\"text\"\n value={optimizationValues[`${option.id}_weightPoints`] ?? \"1\"}\n onChange={(e) => {\n const val = e.target.value;\n if (val !== \"\" && (!/^\\d+$/.test(val) || Number(val) < 1)) return;\n setOptimizationValues((prev) => ({\n ...prev,\n [`${option.id}_weightPoints`]: val,\n }));\n }}\n sx={styles.hardConstraintsInputField}\n />\n <InputRightAddon sx={styles.optimizationSuffix}>points</InputRightAddon>\n </InputGroup>\n </Stack>\n </Stack>\n ))}\n </Stack>\n <Divider sx={{ ...styles.optimizationDivider, my: \"16px\" }} />\n <Text sx={styles.optimizationSummary}>{allocationSummary}</Text>\n </Box>\n ) : null}\n </Stack>\n\n </Stack>\n );\n\n const stepsContent = (\n <Stack spacing=\"16px\" sx={styles.stepsContainer}>\n {showFailed ? violationPanel : null}\n <Stack spacing=\"14px\" sx={styles.stepsList}>\n {SCHEDULE_STEPS.map((rawStep, index) => {\n const isQueueWait = index === 1 && solveStatus === \"QUEUED\";\n const step = isQueueWait\n ? { title: \"Waiting in queue…\", subtitle: undefined }\n : rawStep;\n const status = stepStatusForIndex(index);\n const isFailedStep = showFailed && index === activeStepIndex;\n const iconStyles = {\n ...styles.stepIcon,\n ...(status === \"active\" ? styles.stepIconActive : null),\n ...(status === \"done\" ? styles.stepIconDone : null),\n ...(status === \"pending\" ? styles.stepIconPending : null),\n ...(isFailedStep ? styles.stepIconFailed : null),\n };\n const titleStyles = {\n ...styles.stepTitle,\n ...(status === \"active\" ? styles.stepTitleActive : null),\n ...(status === \"done\" ? styles.stepTitleDone : null),\n ...(status === \"pending\" ? styles.stepTitlePending : null),\n ...(isFailedStep ? styles.stepTitleFailed : null),\n };\n return (\n <HStack key={rawStep.title} sx={styles.stepRow}>\n <Box sx={iconStyles}>\n {isFailedStep ? (\n <FailedIcon width={12} height={12} />\n ) : status === \"active\" ? (\n <Spinner size=\"sm\" thickness=\"2px\" speed=\"0.7s\" />\n ) : status === \"done\" ? (\n <CheckIcon width={10} height={10} />\n ) : null}\n </Box>\n <Box>\n <Text sx={titleStyles}>{step.title}</Text>\n {status === \"active\" && step.subtitle ? <Text sx={styles.stepSubtitle}>{step.subtitle}</Text> : null}\n </Box>\n </HStack>\n );\n })}\n </Stack>\n </Stack>\n );\n\n // Footer button content (shared between modal and drawer)\n const footerButtons = showConfiguration ? (\n <>\n <Button variant=\"outline\" onClick={onClose} sx={styles.cancelButton}>\n {cancelLabel}\n </Button>\n <Button\n onClick={handleCreateSchedule}\n isDisabled={\n selectedCount === 0 ||\n (!onGenerate && openShifts.length === 0) ||\n hasEmptyInputs ||\n (Boolean(scheduleWeekStartYmd) && selectedScheduleDates.length === 0)\n }\n sx={styles.primaryButton}\n >\n {primaryActionLabel}\n </Button>\n </>\n ) : showFailed ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => {\n if (lastFailure) {\n onFixManually?.(lastFailure, {\n selectedLocationIds,\n selectedConstraintIds: effectiveSelectedConstraintIds,\n constraintValues,\n selectedOptimizationIds: effectiveSelectedOptimizationIds,\n optimizationValues,\n selectedBuiltinIds: defaultSelectedBuiltinIds,\n });\n }\n onClose();\n }}\n sx={styles.failedSecondaryButton}\n >\n Fix manually on schedule\n </Button>\n <Button onClick={handleAdjustConstraints} sx={styles.failedPrimaryButton}>\n Adjust constraints\n </Button>\n </>\n ) : null;\n\n const bodyStyles = showConfiguration ? styles.body : { ...styles.body, ...styles.creatingBody };\n const bodyContent = showConfiguration ? configurationContent : stepsContent;\n\n const modalContent = (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n isCentered\n motionPreset=\"scale\"\n closeOnOverlayClick={false}\n closeOnEsc={false}\n trapFocus={false}\n >\n <ModalOverlay sx={styles.overlay} />\n <ModalContent sx={styles.content}>\n <ModalHeader sx={styles.header}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text sx={styles.title}>{modalTitle}</Text>\n <IconButton\n aria-label=\"Close modal\"\n variant=\"ghost\"\n size=\"sm\"\n icon={<CloseIcon />}\n onClick={onClose}\n sx={styles.closeButton}\n />\n </HStack>\n </ModalHeader>\n <ModalBody sx={bodyStyles}>{bodyContent}</ModalBody>\n {footerButtons && (\n <ModalFooter sx={showFailed ? styles.failedFooter : styles.footer}>{footerButtons}</ModalFooter>\n )}\n </ModalContent>\n </Modal>\n );\n\n const drawerFooterNode = footerButtons ? (\n <HStack\n align=\"center\"\n justify=\"flex-end\"\n px={6}\n h=\"68px\"\n bg=\"gray.50\"\n borderTop=\"1px solid\"\n borderColor=\"gray.200\"\n gap={2}\n flexShrink={0}\n w=\"full\"\n >\n {footerButtons}\n </HStack>\n ) : undefined;\n\n const drawerContent = (\n <EtDrawer\n isOpen={isOpen}\n onClose={onClose}\n title={modalTitle}\n closeOnOverlayClick={false}\n maxW={DRAWER_WIDTH_MAP[drawerSize]}\n bodySx={bodyStyles as Record<string, unknown>}\n footer={drawerFooterNode}\n >\n {bodyContent}\n </EtDrawer>\n );\n\n const content = displayMode === \"drawer\" ? drawerContent : modalContent;\n\n if (theme || cssVarsRoot) {\n return (\n <ChakraProvider theme={mergedTheme} cssVarsRoot={cssVarsRoot}>\n {content}\n </ChakraProvider>\n );\n }\n\n return content;\n}\n","import type { ReactNode } from \"react\";\nimport type { ThemeOverride } from \"@chakra-ui/react\";\nimport { ScheduleSolution } from \"./api/types\";\n\nexport type LocationOption = {\n id: string;\n name: string;\n timezone: string;\n jurisdiction: string;\n properties?: Record<string, unknown>;\n};\n\nexport type JurisdictionGroup = {\n id: string;\n title: string;\n locations: LocationOption[];\n};\n\nexport type TimeOff = {\n employeeId: string;\n startDateTime: string;\n endDateTime: string;\n};\n\nexport type OpenShift = {\n id: string;\n startTime: string;\n endTime: string;\n location: { id: string };\n requiredPosition: string;\n requiredCount: number;\n isDraft?: boolean;\n isPublished?: boolean;\n employeePreferences: Array<{\n employeeId: string;\n level: \"PREFERRED\" | \"AVAILABLE\" | \"UNAVAILABLE\" | string;\n }>;\n employeeId?: string;\n};\n\nexport type EmployeeProperties = {\n employer_type: string;\n worker_type: string;\n costToRevenueRatio?: number;\n avgSalesAmount?: number;\n /** Integer basis points (e.g. 1234 = 12.34%). Omit when unknown. */\n conversionRate?: number;\n [key: string]: object | string | number | boolean | undefined;\n}\n\n/** One hourly traffic cell for the solver TrafficForecast fact (location-local). */\nexport type TrafficForecastEntry = {\n locationId: string;\n date: string; // yyyy-MM-dd\n hour: number; // 0–23\n visits: number;\n};\n\nexport type Employee = {\n id: string;\n name: string;\n position: string;\n locationIds: Array<string>;\n properties: EmployeeProperties;\n}\n\nexport type EasyTeamThemeOverrides = {\n tokens?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport type AutoSchedulerModalStyleOverrides = {\n overlay?: Record<string, unknown>;\n content?: Record<string, unknown>;\n header?: Record<string, unknown>;\n title?: Record<string, unknown>;\n closeButton?: Record<string, unknown>;\n body?: Record<string, unknown>;\n banner?: Record<string, unknown>;\n bannerIcon?: Record<string, unknown>;\n bannerTitle?: Record<string, unknown>;\n bannerText?: Record<string, unknown>;\n locationSection?: Record<string, unknown>;\n locationLabelRow?: Record<string, unknown>;\n locationLabel?: Record<string, unknown>;\n locationBadge?: Record<string, unknown>;\n locationSubtitle?: Record<string, unknown>;\n locationTrigger?: Record<string, unknown>;\n locationTriggerText?: Record<string, unknown>;\n popoverContent?: Record<string, unknown>;\n groupHeader?: Record<string, unknown>;\n optionRow?: Record<string, unknown>;\n optionLabel?: Record<string, unknown>;\n selectedBanner?: Record<string, unknown>;\n selectedBannerIcon?: Record<string, unknown>;\n selectedBannerText?: Record<string, unknown>;\n hardConstraintsSection?: Record<string, unknown>;\n hardConstraintsLabelRow?: Record<string, unknown>;\n hardConstraintsLabel?: Record<string, unknown>;\n hardConstraintsBadge?: Record<string, unknown>;\n hardConstraintsSubtitle?: Record<string, unknown>;\n hardConstraintsTrigger?: Record<string, unknown>;\n hardConstraintsTriggerText?: Record<string, unknown>;\n hardConstraintsPopoverContent?: Record<string, unknown>;\n hardConstraintsOptionRow?: Record<string, unknown>;\n hardConstraintsOptionLabel?: Record<string, unknown>;\n hardConstraintsInputsContainer?: Record<string, unknown>;\n hardConstraintsInputItem?: Record<string, unknown>;\n hardConstraintsInputLabel?: Record<string, unknown>;\n hardConstraintsInputField?: Record<string, unknown>;\n optimizationSection?: Record<string, unknown>;\n optimizationLabelRow?: Record<string, unknown>;\n optimizationLabel?: Record<string, unknown>;\n optimizationBadge?: Record<string, unknown>;\n optimizationSubtitle?: Record<string, unknown>;\n optimizationTrigger?: Record<string, unknown>;\n optimizationTriggerText?: Record<string, unknown>;\n optimizationPopoverContent?: Record<string, unknown>;\n optimizationGroupHeader?: Record<string, unknown>;\n optimizationOptionRow?: Record<string, unknown>;\n optimizationOptionLabel?: Record<string, unknown>;\n optimizationOptionHelp?: Record<string, unknown>;\n optimizationInputsContainer?: Record<string, unknown>;\n optimizationInputItem?: Record<string, unknown>;\n optimizationInputLabel?: Record<string, unknown>;\n optimizationInputField?: Record<string, unknown>;\n optimizationSuffix?: Record<string, unknown>;\n optimizationDivider?: Record<string, unknown>;\n optimizationSummary?: Record<string, unknown>;\n creatingBody?: Record<string, unknown>;\n stepsContainer?: Record<string, unknown>;\n stepsList?: Record<string, unknown>;\n stepRow?: Record<string, unknown>;\n stepIcon?: Record<string, unknown>;\n stepIconActive?: Record<string, unknown>;\n stepIconDone?: Record<string, unknown>;\n stepIconPending?: Record<string, unknown>;\n stepIconFailed?: Record<string, unknown>;\n stepTitle?: Record<string, unknown>;\n stepTitleActive?: Record<string, unknown>;\n stepTitleDone?: Record<string, unknown>;\n stepTitlePending?: Record<string, unknown>;\n stepTitleFailed?: Record<string, unknown>;\n stepSubtitle?: Record<string, unknown>;\n violationPanel?: Record<string, unknown>;\n violationHeaderRow?: Record<string, unknown>;\n violationHeader?: Record<string, unknown>;\n violationIcon?: Record<string, unknown>;\n violationTitle?: Record<string, unknown>;\n violationSubtitle?: Record<string, unknown>;\n violationToggleButton?: Record<string, unknown>;\n violationToggleIcon?: Record<string, unknown>;\n violationContent?: Record<string, unknown>;\n violationItem?: Record<string, unknown>;\n violationItemTitle?: Record<string, unknown>;\n violationItemDetailRow?: Record<string, unknown>;\n violationItemDetail?: Record<string, unknown>;\n violationBullet?: Record<string, unknown>;\n recommendationsBox?: Record<string, unknown>;\n recommendationsTitle?: Record<string, unknown>;\n recommendationsList?: Record<string, unknown>;\n recommendationsItem?: Record<string, unknown>;\n recommendationsBullet?: Record<string, unknown>;\n recommendationsToggle?: Record<string, unknown>;\n failedFooter?: Record<string, unknown>;\n failedPrimaryButton?: Record<string, unknown>;\n failedSecondaryButton?: Record<string, unknown>;\n footer?: Record<string, unknown>;\n cancelButton?: Record<string, unknown>;\n primaryButton?: Record<string, unknown>;\n violatedConstraintsSecondaryButton?: Record<string, unknown>;\n};\n\nexport type AutoSchedulerModalTheme =\n | (ThemeOverride & { autoSchedulerModal?: AutoSchedulerModalStyleOverrides })\n | (EasyTeamThemeOverrides & { autoSchedulerModal?: AutoSchedulerModalStyleOverrides });\n\nexport type SubLocationOption = {\n id: string;\n name: string;\n parentId: string;\n};\n\nexport type TeamOption = {\n id: string;\n name: string;\n resources: {\n id: string;\n externalEmployeeId?: string;\n type?: string;\n properties?: { name?: string } & Record<string, unknown>;\n [key: string]: unknown;\n }[]\n};\n\nexport type HardConstraintOption = {\n id: string;\n name: string;\n /** Shows this option as selected without requiring user interaction. */\n defaultSelected?: boolean;\n /** Prevents changing an implicitly selected option in the scheduler drawer. */\n readOnly?: boolean;\n /** When present, the modal shows a numeric input on selection. */\n defaultValue?: string;\n /** Label next to the input, e.g. 'hours' or 'days'. Defaults to 'hours'. */\n suffix?: string;\n min?: number;\n max?: number;\n /** Used as violation message detail when the solver reports this constraint as violated. */\n description?: string;\n};\n\nexport type SoftConstraintOption = {\n id: string;\n title: string;\n /** Shows this option as selected without requiring user interaction. */\n defaultSelected?: boolean;\n /** Prevents changing an implicitly selected option in the scheduler drawer. */\n readOnly?: boolean;\n /** Shown below the title in the picker. Also used as violation message detail. */\n subtitle?: string;\n};\n\nexport type SoftConstraintGroup = {\n id: string;\n name: string;\n options: SoftConstraintOption[];\n};\n\nexport type BuiltinConstraintOption = {\n id: string;\n title: string;\n subtitle?: string;\n category?: string;\n defaultSelected?: boolean;\n};\n\nexport type GenerateScheduleConfig = {\n selectedLocationIds: string[];\n selectedSubLocationIds: string[];\n selectedTeamIds: string[];\n /** IANA timezone resolved from the selected drawer location. */\n schedulerTimezone?: string;\n /** Calendar dates YYYY-MM-DD within the viewed week to include in workflow evaluation and solver optimization */\n selectedScheduleDates: string[];\n selectedConstraintIds: string[];\n constraintValues: Record<string, string>;\n selectedOptimizationIds: string[];\n optimizationValues: Record<string, string>;\n /** Opt-in built-in Timefold constraint slugs (not org visual-rule UUIDs). */\n selectedBuiltinIds?: string[];\n};\n\nexport type AutoSchedulerModalProps = {\n /** Controls whether the component renders as a modal or a right-side drawer */\n displayMode?: 'modal' | 'drawer';\n /** Width of the drawer when displayMode=\"drawer\". \"sm\"=448px, \"md\"=578px, \"lg\"=600px. Defaults to \"lg\". */\n drawerSize?: 'sm' | 'md' | 'lg';\n /** When true, the drawer fills 100% viewport height. Defaults to false. */\n drawerFullHeight?: boolean;\n baseURL?: string;\n isOpen: boolean;\n title?: string;\n bannerTitle?: string;\n bannerText?: string;\n jurisdictions: JurisdictionGroup[];\n employees: Employee[];\n openShifts: OpenShift[];\n timeOffs?: TimeOff[];\n locationPlaceholder?: string;\n onClose: () => void;\n cancelLabel?: string;\n primaryActionLabel?: string;\n onPrimaryAction?: () => void;\n onFixManually?: (failure: ViolatedConstraintsResult, config: AutoSchedulerModalConfig) => void;\n initialConfig?: AutoSchedulerModalConfig & { failure?: ViolatedConstraintsResult };\n theme?: AutoSchedulerModalTheme;\n cssVarsRoot?: string;\n generateRecommendationsURLAndHeaders?: {\n url: string;\n headers?: Record<string, string>;\n };\n getTokenURLAndHeaders?: {\n url: string;\n headers?: Record<string, string>;\n };\n onSolution?: (solution: ScheduleSolution) => Promise<void>;\n /** When provided, fetches stored config for a location set to prefill the form */\n getStoredConfigForLocations?: (locationIds: string[]) => AutoSchedulerModalConfig | null;\n /** When provided, persists config after successful schedule creation */\n persistConfigForLocations?: (locationIds: string[], config: AutoSchedulerModalConfig) => void;\n errorToast?: (msg: string) => void;\n /** Organization id — required when sending visual rule ids */\n organizationId?: string;\n /** Visual rule ids attached to this solve (production path) */\n constraintDefinitionIds?: string[];\n /** Inline visual rule definitions (sandbox/test path; for unsaved rules) */\n constraintDefinitions?: unknown[];\n /** Replaces the built-in hard constraint list shown in \"Required rules\". */\n hardConstraintOptions?: HardConstraintOption[];\n /** Replaces the built-in optimization groups shown in \"Optimization\". */\n softConstraintGroups?: SoftConstraintGroup[];\n /** Optional footer under Optimization (e.g. host-owned Avia attribution). Prefer a render fn when showing in multiple places. */\n optimizationFooter?: ReactNode | (() => ReactNode);\n /**\n * Hourly traffic forecast for the solve week (location-local).\n * When Maximize Sales is selected and this is non-empty, the modal injects\n * traffic-forecast-incentive and serializes this field on the solve payload.\n */\n trafficForecast?: TrafficForecastEntry[];\n /** Opt-in built-in Timefold constraints (solver catalog slugs). */\n builtinConstraintOptions?: BuiltinConstraintOption[];\n /** All sub-locations (with parentId). The component filters them internally based on selected location IDs. */\n subLocations?: SubLocationOption[];\n /** When true, renders the sub-locations multiselect (filtered by selected locations). Defaults to false. */\n showSubLocations?: boolean;\n /** Teams list. The caller should update this reactively in response to onSelectionChange. */\n teams?: TeamOption[];\n /** When true, renders the teams multiselect. Defaults to false. */\n showTeams?: boolean;\n /**\n * Called when the user changes location or sub-location selection.\n * Use this to re-fetch teams filtered by the new selection.\n */\n onSelectionChange?: (locationIds: string[], subLocationIds: string[]) => void;\n /**\n * When provided, replaces the Java solver flow entirely.\n * The component shows the progress animation and calls this function at step 1.\n * Resolving means success (the resolved value is forwarded to onGenerateSolution);\n * throwing means failure (shown in the failed screen).\n */\n onGenerate?: (config: GenerateScheduleConfig) => Promise<unknown>;\n /**\n * Called after onGenerate resolves successfully, just before the drawer/modal closes.\n * Receives the value returned by onGenerate.\n */\n onGenerateSolution?: (result: unknown) => void;\n /**\n * Calendar week-start date YYYY-MM-DD (matches ops weekly schedule / evaluate-range window).\n * When `onGenerate` is used, pass the week currently shown on the schedule grid.\n */\n scheduleWeekStartYmd?: string;\n /**\n * Today's civil date YYYY-MM-DD in `evaluationTimezone`, used to leave past week days unselected by default.\n */\n todayCalendarYmd?: string;\n /**\n * IANA timezone for interpreting today + backend evaluate-range date filtering (defaults to UTC).\n */\n evaluationTimezone?: string;\n /**\n * Live status of the underlying solve job. When set to \"QUEUED\" while the\n * progress UI is visible, step 2's caption is replaced with \"Waiting in queue…\".\n * Any other value (or null/undefined) leaves the step copy unchanged.\n */\n solveStatus?: SolveJobStatus | null;\n};\n\nexport type Screen = \"configure\" | \"creating\" | \"failed\";\nexport type StepStatus = \"pending\" | \"active\" | \"done\";\n\n/**\n * Status of an async solve job, as reported by the scheduler service.\n * QUEUED → waiting for a solver slot\n * SOLVING_ACTIVE → solver is running\n * NOT_SOLVING / TERMINATED_EARLY → terminal\n */\nexport type SolveJobStatus =\n | \"QUEUED\"\n | \"SOLVING_ACTIVE\"\n | \"NOT_SOLVING\"\n | \"TERMINATED_EARLY\";\n\nexport type RuleOverrideEntry = {\n ruleId: string;\n parameters?: Record<string, unknown>;\n weightPoints?: number;\n};\n\nexport type SchedulePayload = {\n employees: Array<{\n id: string;\n name?: string;\n position?: string;\n locationIds?: string[];\n properties?: Record<string, unknown>;\n }>;\n shifts: Array<{\n id: string;\n startDateTime: string;\n endDateTime: string;\n employeeId?: string;\n requiredHours?: number;\n requiredPosition?: string | null;\n requiredCount?: number;\n location?: { id: string; timezone?: string; tags?: string[] };\n employeePreferences?: Array<{ employeeId: string; level: string }>;\n }>;\n locations: Array<{\n id: string;\n timezone?: string;\n jurisdiction?: string;\n tags?: string[];\n properties?: Record<string, unknown>;\n }>;\n timeOffs?: TimeOff[];\n ruleIds?: string[];\n ruleOverrides?: RuleOverrideEntry[];\n /** Hourly traffic forecast problem fact (omit when unused). */\n trafficForecast?: TrafficForecastEntry[];\n // Visual constraint definition IDs — production path (auto-scheduler fetches full defs from embedded_backend)\n constraintDefinitionIds?: string[];\n // Visual constraint definitions inline — sandbox/test path (unsaved rules)\n constraintDefinitions?: unknown[];\n // Organization scoping required when constraintDefinitionIds are provided\n organizationId?: string;\n};\n\nexport type AutoSchedulerModalConfig = {\n selectedLocationIds: string[];\n selectedConstraintIds: string[];\n constraintValues: Record<string, string>;\n selectedOptimizationIds: string[];\n optimizationValues: Record<string, string>;\n selectedBuiltinIds?: string[];\n};\n\nexport type SolveApiExplanation = SolveApiResponse[\"explanation\"];\n\n/** Full POST body for the getRecommendationURL API (context, locations, employees, shifts, etc.) */\nexport type RecommendationPayload = {\n context: {\n selectedLocationIds: string[];\n selectedConstraintIds: string[];\n constraintValues: Record<string, string>;\n selectedOptimizationIds: string[];\n optimizationValues: Record<string, string>;\n timezone?: string;\n };\n locations: LocationOption[];\n employees: Employee[];\n openShifts: OpenShift[];\n assignedShifts: OpenShift[];\n timeOffs: TimeOff[];\n explanation: SolveApiExplanation;\n};\n\nexport type ViolatedConstraintsResult = {\n violatedConstraints: Array<{ title: string; detail: string }>;\n recommendedFixes: string[];\n /** Full context for fetching recommendations; built once in the modal and passed through */\n recommendationPayload?: RecommendationPayload;\n};\n\nexport type ViolatedConstraintsPanelStyleOverrides = Pick<\n AutoSchedulerModalStyleOverrides,\n | \"violationPanel\"\n | \"violationHeaderRow\"\n | \"violationHeader\"\n | \"violationIcon\"\n | \"violationTitle\"\n | \"violationSubtitle\"\n | \"violationToggleButton\"\n | \"violationToggleIcon\"\n | \"violationContent\"\n | \"violationItem\"\n | \"violationItemTitle\"\n | \"violationItemDetailRow\"\n | \"violationItemDetail\"\n | \"violationBullet\"\n | \"recommendationsBox\"\n | \"recommendationsTitle\"\n | \"recommendationsList\"\n | \"recommendationsItem\"\n | \"recommendationsBullet\"\n | \"recommendationsToggle\"\n | \"failedSecondaryButton\"\n>;\n\nexport type ViolatedConstraintsPanelProps = {\n violatedConstraints: ViolatedConstraintsResult;\n title?: string;\n subtitle?: string;\n showSecondaryButton?: boolean;\n secondaryButtonTitle?: string;\n onSecondaryButtonClick?: () => void;\n /** When provided with violatedConstraints.recommendationPayload, enables \"Show recommendations\" and fetch */\n generateRecommendationsURLAndHeaders?: {\n url: string;\n headers?: Record<string, string>;\n };\n styles?: Record<string, Record<string, unknown>>;\n styleOverrides?: ViolatedConstraintsPanelStyleOverrides;\n errorToast?: (msg: string) => void;\n};\n\nexport type SolveApiResponse = {\n problemId: string;\n solution: ScheduleSolution;\n explanation: {\n isFeasible: boolean;\n violations: Array<{\n constraintName?: string;\n description?: string;\n affectedEntities?: string[];\n ruleId?: string;\n archetype?: string;\n jurisdiction?: string | null;\n penalty?: string;\n isHardViolation?: boolean;\n }>;\n summary?: string;\n };\n complianceReport?: unknown;\n};\n\n\nexport type ScheduleRecommendation = {\n hard_violation_identified: string;\n root_cause: string;\n recommendation: string;\n why_this_resolves_it: string;\n};\n\nexport class InfeasibleScheduleError extends Error {\n readonly failure: ViolatedConstraintsResult;\n constructor(failure: ViolatedConstraintsResult) {\n super(\"Schedule could not be created due to constraint violations\");\n this.name = \"InfeasibleScheduleError\";\n this.failure = failure;\n }\n}\n","import type { SVGProps } from \"react\";\n\nexport interface DotIconProps extends SVGProps<SVGSVGElement> {\n /** Size of the dot in pixels. Defaults to 6. */\n size?: number;\n}\n\nexport function DotIcon({ size = 6, fill, stroke, ...props }: DotIconProps) {\n const useStroke = stroke != null;\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill={useStroke ? \"none\" : (fill ?? \"currentColor\")}\n stroke={stroke}\n width={size}\n height={size}\n {...props}\n >\n <circle cx=\"10\" cy=\"10\" r=\"10\" />\n </svg>\n );\n}\n\nexport function MagicIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path d=\"M10 2.5l1.2 3.3 3.3 1.2-3.3 1.2-1.2 3.3-1.2-3.3-3.3-1.2 3.3-1.2L10 2.5z\" />\n <path d=\"M4.5 11.2l.7 1.9 1.9.7-1.9.7-.7 1.9-.7-1.9-1.9-.7 1.9-.7.7-1.9z\" />\n <path d=\"M15.5 12.5l.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6.6-1.7z\" />\n </svg>\n );\n}\n\nexport function InfoIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path d=\"M10 1.75a8.25 8.25 0 1 0 0 16.5 8.25 8.25 0 0 0 0-16.5zm0 3.75a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm-1 4.25c0-.41.34-.75.75-.75h.5c.41 0 .75.34.75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.25a.75.75 0 0 1-.75-.75z\" />\n </svg>\n );\n}\n\nexport function WarningIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M9.25 3.6a.86.86 0 0 1 1.5 0l7.2 12.1a.86.86 0 0 1-.75 1.3H2.8a.86.86 0 0 1-.75-1.3l7.2-12.1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 7v4.7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"10\" cy=\"13.5\" r=\"0.9\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function ChevronDownIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M5 7.5l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CloseIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M5.5 5.5l9 9m0-9l-9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CheckIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"\n />\n </svg>\n );\n}\n\nexport function FailedIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path\n d=\"M6.5 6.5l7 7m0-7l-7 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import type { ThemeOverride } from \"@chakra-ui/react\";\nimport type {\n AutoSchedulerModalStyleOverrides,\n AutoSchedulerModalTheme,\n EasyTeamThemeOverrides,\n} from \"../types\";\n\nconst componentNameMap: Record<string, string> = {\n button: \"Button\",\n input: \"Input\",\n tooltip: \"Tooltip\",\n modal: \"Modal\",\n switch: \"Switch\",\n drawer: \"Drawer\",\n checkbox: \"Checkbox\",\n radio: \"Radio\",\n menu: \"Menu\",\n tabs: \"Tabs\",\n select: \"Select\",\n numberinput: \"NumberInput\",\n textarea: \"Textarea\",\n popover: \"Popover\",\n badge: \"Badge\",\n text: \"Text\",\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst mapComponentOverrides = (overrides: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n\n Object.entries(overrides).forEach(([key, value]) => {\n if (key === \"components\" && isRecord(value)) {\n Object.assign(result, value);\n return;\n }\n\n const normalizedKey = componentNameMap[key] ?? componentNameMap[key.toLowerCase()] ?? key;\n result[normalizedKey] = value;\n });\n\n return result;\n};\n\nconst deepMerge = (\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...target };\n\n Object.entries(source).forEach(([key, value]) => {\n if (isRecord(value) && isRecord(result[key])) {\n result[key] = deepMerge(result[key] as Record<string, unknown>, value);\n return;\n }\n\n result[key] = value;\n });\n\n return result;\n};\n\nexport type ResolvedThemeParts = {\n chakraOverride?: ThemeOverride;\n styleOverrides?: AutoSchedulerModalStyleOverrides;\n};\n\nexport const resolveThemeParts = (\n theme?: AutoSchedulerModalTheme,\n): ResolvedThemeParts => {\n if (!theme || !isRecord(theme)) {\n return {};\n }\n\n const autoSchedulerModal = isRecord(theme.autoSchedulerModal)\n ? (theme.autoSchedulerModal as AutoSchedulerModalStyleOverrides)\n : undefined;\n\n if (\"tokens\" in theme) {\n const easyTheme = theme as EasyTeamThemeOverrides & {\n autoSchedulerModal?: AutoSchedulerModalStyleOverrides;\n };\n const { tokens, autoSchedulerModal: _ignored, ...rest } = easyTheme;\n const chakraOverride: ThemeOverride = {\n ...(isRecord(tokens) ? tokens : {}),\n components: mapComponentOverrides(rest),\n };\n\n return { chakraOverride, styleOverrides: autoSchedulerModal };\n }\n\n const { autoSchedulerModal: _ignored, ...override } =\n theme as ThemeOverride & { autoSchedulerModal?: AutoSchedulerModalStyleOverrides };\n\n return { chakraOverride: override, styleOverrides: autoSchedulerModal };\n};\n\nexport const mergeThemeWithBase = (\n baseTheme: Record<string, unknown>,\n override?: ThemeOverride,\n): Record<string, unknown> => {\n if (!override) {\n return baseTheme;\n }\n\n return deepMerge(baseTheme, override as Record<string, unknown>);\n};\n","import { AutoSchedulerModalStyleOverrides, ViolatedConstraintsResult } from \"./types\";\n\nexport const HARD_CONSTRAINT_DEFAULTS: Record<string, string> = {\n max_weekly_hours: \"40\",\n max_daily_hours: \"8\",\n min_rest_between_shifts: \"24\",\n max_work_days_per_week: \"6\",\n};\n\nexport const HARD_CONSTRAINT_OPTIONS = [\n { id: \"max_weekly_hours\", name: \"Maximum weekly hours\" },\n { id: \"max_daily_hours\", name: \"Maximum daily hours\" },\n { id: \"min_rest_between_shifts\", name: \"Minimum rest between shifts\" },\n { id: \"max_work_days_per_week\", name: \"Maximum work days per week\" },\n // { id: \"minor_max_daily_hours\", name: \"Minor maximum daily hours\" },\n // { id: \"minor_late_hours_restriction\", name: \"Minor late hours restriction\" },\n // { id: \"part_time_weekly_limit\", name: \"Part-time weekly limit\" },\n // { id: \"min_staffing\", name: \"Minimum staffing\" },\n] as const;\n\nexport const OPTIMIZATION_OPTION_GROUPS = [\n {\n id: \"employee_happiness\",\n name: \"Employee happiness\",\n options: [\n {\n id: \"fair_hour_distribution\",\n title: \"Fair hour distribution\",\n subtitle: \"Distribute shifts evenly across all staff members\",\n },\n {\n id: \"staff_preferences\",\n title: \"Respect open shift preferences\",\n subtitle: \"Consider staff requests and preferred shifts when assigning\",\n },\n ],\n },\n {\n id: \"labor_cost_optimization\",\n name: \"Labor cost optimization\",\n options: [\n {\n id: \"minimize_overtime\",\n title: \"Minimize overtime\",\n subtitle: \"Reduce hours beyond standard work time\",\n },\n {\n id: \"cost_to_sales_ratio\",\n title: \"Cost-to-sales ratio\",\n subtitle:\n \"Assign shifts based on total compensation (wages + commissions) compared to sales performance\",\n },\n ],\n },\n {\n id: \"sales_optimization\",\n name: \"Sales optimization\",\n options: [\n {\n id: \"maximize_sales\",\n title: \"Maximize sales\",\n subtitle: \"Prioritize top-performing staff during peak hours\",\n },\n ],\n },\n] as const;\n\n// fair-hour-distribution\nexport const BALANCE_TARGET_OPTIONS = [\n { value: \"HOURS\", label: \"Hours\" },\n { value: \"SHIFTS\", label: \"Shifts\" },\n { value: \"WEEKEND_SHIFTS\", label: \"Weekend shifts\" },\n { value: \"OVERTIME_HOURS\", label: \"Overtime hours\" },\n] as const;\n\nexport const PERIOD_OPTIONS = [\n { value: \"DAY\", label: \"Day\" },\n { value: \"WEEK\", label: \"Week\" },\n { value: \"MONTH\", label: \"Month\" },\n] as const;\n\n// labor-cost-optimization\nexport const DIRECTION_OPTIONS = [\n { value: \"MINIMIZE\", label: \"Minimize\" },\n { value: \"MAXIMIZE\", label: \"Maximize\" },\n] as const;\n\nexport const defaultStyles: Required<AutoSchedulerModalStyleOverrides> = {\n overlay: {\n bg: \"rgba(0, 0, 0, 0.45)\",\n },\n content: {\n maxW: \"600px\",\n bg: \"white\",\n borderRadius: \"20px\",\n boxShadow:\n \"0px 20px 20px -8px rgba(26, 26, 26, 0.28), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.17)\",\n overflow: \"hidden\",\n maxH: \"calc(100vh - 32px)\",\n display: \"flex\",\n flexDirection: \"column\",\n },\n header: {\n bg: \"#f3f3f3\",\n borderBottom: \"1px solid #e3e3e3\",\n px: \"16px\",\n py: \"12px\",\n },\n title: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n closeButton: {\n color: \"#5c5c5c\",\n borderRadius: \"8px\",\n },\n body: {\n px: \"16px\",\n py: \"16px\",\n overflowY: \"auto\",\n flex: \"1 1 auto\",\n },\n banner: {\n backgroundColor: \"#F5EFFF !important\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"8px\",\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-start\",\n },\n bannerIcon: {\n color: \"#5c2dbf\",\n },\n bannerTitle: {\n fontSize: \"13px\",\n fontWeight: 700,\n color: \"#370e88\",\n lineHeight: \"20px\",\n },\n bannerText: {\n fontSize: \"13px\",\n color: \"#370e88\",\n lineHeight: \"20px\",\n },\n locationSection: {},\n locationLabelRow: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n locationLabel: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n locationBadge: {\n bg: \"#e1e3e5\",\n color: \"#303030\",\n borderRadius: \"999px\",\n px: \"6px\",\n py: \"2px\",\n fontSize: \"11px\",\n fontWeight: 600,\n },\n locationSubtitle: {\n fontSize: \"12px\",\n color: \"#616161\",\n },\n locationTrigger: {\n w: \"100%\",\n justifyContent: \"space-between\",\n px: \"12px\",\n h: \"32px\",\n borderRadius: \"8px\",\n border: \"1px solid rgb(185, 184, 184)\",\n },\n locationTriggerText: {\n fontSize: \"13px\",\n fontWeight: 450,\n color: \"#616161\",\n },\n popoverContent: {\n w: \"100%\",\n bg: \"white\",\n borderRadius: \"12px\",\n px: \"6px\",\n py: \"6px\",\n border: \"none\",\n maxH: \"260px\",\n overflowY: \"auto\",\n boxShadow:\n \"0px 4px 6px -2px rgba(26, 26, 26, 0.2), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.13)\",\n },\n groupHeader: {\n px: \"6px\",\n pt: \"2px\",\n pb: \"4px\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n optionRow: {\n px: \"6px\",\n py: \"6px\",\n borderRadius: \"8px\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n optionLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n selectedBanner: {\n bg: \"#eaf4ff\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"8px\",\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-start\",\n color: \"#00527c\",\n },\n selectedBannerIcon: {\n color: \"#00527c\",\n },\n selectedBannerText: {\n fontSize: \"13px\",\n lineHeight: \"20px\",\n color: \"#00527c\",\n },\n hardConstraintsSection: {},\n hardConstraintsLabelRow: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n hardConstraintsLabel: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n hardConstraintsBadge: {\n bg: \"rgba(0, 0, 0, 0.06)\",\n color: \"#616161\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"2px\",\n fontSize: \"12px\",\n fontWeight: 500,\n },\n hardConstraintsSubtitle: {\n fontSize: \"13px\",\n color: \"#616161\",\n },\n hardConstraintsTrigger: {\n w: \"100%\",\n justifyContent: \"space-between\",\n px: \"12px\",\n h: \"32px\",\n borderRadius: \"8px\",\n border: \"1px solid rgb(185, 184, 184)\",\n },\n hardConstraintsTriggerText: {\n fontSize: \"13px\",\n fontWeight: 450,\n color: \"#616161\",\n },\n hardConstraintsPopoverContent: {\n w: \"100%\",\n bg: \"white\",\n borderRadius: \"12px\",\n px: \"6px\",\n py: \"6px\",\n border: \"none\",\n boxShadow:\n \"0px 4px 6px -2px rgba(26, 26, 26, 0.2), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.13)\",\n },\n hardConstraintsOptionRow: {\n px: \"6px\",\n py: \"6px\",\n borderRadius: \"8px\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n hardConstraintsOptionLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n hardConstraintsInputsContainer: {\n bg: \"#f7f7f7\",\n border: \"1px solid #ebebeb\",\n borderRadius: \"8px\",\n px: \"16px\",\n py: \"16px\",\n },\n hardConstraintsInputItem: {\n gap: \"4px\",\n maxW: \"320px\",\n },\n hardConstraintsInputLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n hardConstraintsInputField: {\n bg: \"#fdfdfd\",\n border: \"1px solid #8a8a8a\",\n borderTopLeftRadius: \"8px\",\n borderBottomLeftRadius: \"8px\",\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n h: \"28px\",\n px: \"12px\",\n },\n optimizationSection: {},\n optimizationLabelRow: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n optimizationLabel: {\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n optimizationBadge: {\n bg: \"rgba(0, 0, 0, 0.06)\",\n color: \"#616161\",\n borderRadius: \"8px\",\n px: \"8px\",\n py: \"2px\",\n fontSize: \"12px\",\n fontWeight: 500,\n },\n optimizationSubtitle: {\n fontSize: \"13px\",\n color: \"#616161\",\n },\n optimizationTrigger: {\n w: \"100%\",\n justifyContent: \"space-between\",\n px: \"12px\",\n h: \"32px\",\n borderRadius: \"8px\",\n border: \"1px solid rgb(185, 184, 184)\",\n },\n optimizationTriggerText: {\n fontSize: \"13px\",\n fontWeight: 450,\n color: \"#616161\",\n },\n optimizationPopoverContent: {\n w: \"100%\",\n bg: \"white\",\n borderRadius: \"12px\",\n px: \"6px\",\n py: \"6px\",\n border: \"none\",\n boxShadow:\n \"0px 4px 6px -2px rgba(26, 26, 26, 0.2), inset 0px 1px 0px rgba(204, 204, 204, 0.5), inset 0px -1px 0px rgba(0, 0, 0, 0.17), inset 1px 0px 0px rgba(0, 0, 0, 0.13), inset -1px 0px 0px rgba(0, 0, 0, 0.13)\",\n },\n optimizationGroupHeader: {\n px: \"6px\",\n pt: \"2px\",\n pb: \"4px\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n optimizationOptionRow: {\n px: \"6px\",\n py: \"6px\",\n borderRadius: \"8px\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n },\n optimizationOptionLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n optimizationOptionHelp: {\n fontSize: \"13px\",\n color: \"#616161\",\n ml: \"1.5rem\"\n },\n optimizationInputsContainer: {\n bg: \"#f7f7f7\",\n border: \"1px solid #ebebeb\",\n borderRadius: \"8px\",\n px: \"16px\",\n py: \"16px\",\n },\n optimizationInputItem: {\n gap: \"4px\",\n maxW: \"320px\",\n },\n optimizationInputLabel: {\n fontSize: \"13px\",\n color: \"#303030\",\n },\n optimizationInputField: {\n bg: \"#fdfdfd\",\n border: \"1px solid #8a8a8a\",\n borderTopLeftRadius: \"8px\",\n borderBottomLeftRadius: \"8px\",\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n h: \"28px\",\n px: \"12px\",\n },\n optimizationSuffix: {\n fontSize: \"13px\",\n color: \"#616161\",\n h: \"28px\",\n bg: \"#fdfdfd\",\n border: \"1px solid #8a8a8a\",\n borderLeft: \"none\",\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderTopRightRadius: \"8px\",\n borderBottomRightRadius: \"8px\",\n },\n optimizationDivider: {\n borderColor: \"#ebebeb\",\n },\n optimizationSummary: {\n fontSize: \"13px\",\n color: \"#616161\",\n },\n creatingBody: {\n py: \"20px\",\n },\n stepsContainer: {},\n stepsList: {},\n stepRow: {\n alignItems: \"flex-start\",\n gap: \"12px\",\n },\n stepIcon: {\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"999px\",\n border: \"2px solid #d1d1d1\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#616161\",\n flexShrink: 0,\n },\n stepIconActive: {\n border: \"none\",\n color: \"#303030\",\n },\n stepIconDone: {\n border: \"none\",\n bg: \"#5338ff\",\n color: \"white\",\n borderRadius: \"10px\",\n },\n stepIconPending: {\n borderColor: \"#d1d1d1\",\n color: \"#d1d1d1\",\n },\n stepIconFailed: {\n border: \"none\",\n bg: \"#d72c0d\",\n color: \"white\",\n borderRadius: \"10px\",\n },\n stepTitle: {\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#303030\",\n },\n stepTitleActive: {},\n stepTitleDone: {\n color: \"#9b9b9b\",\n fontWeight: 500,\n },\n stepTitlePending: {\n color: \"#9b9b9b\",\n fontWeight: 500,\n },\n stepTitleFailed: {\n color: \"#d72c0d\",\n fontWeight: 600,\n },\n stepSubtitle: {\n fontSize: \"12px\",\n color: \"#616161\",\n },\n violationPanel: {\n border: \"1px solid #e7e7e7\",\n borderRadius: \"12px\",\n px: \"12px\",\n py: \"12px\",\n bg: \"white\",\n },\n violationHeaderRow: {\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n violationHeader: {\n alignItems: \"center\",\n gap: \"8px\",\n },\n violationIcon: {\n color: \"#8E1F0B\",\n },\n violationTitle: {\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"#8E1F0B\",\n },\n violationSubtitle: {\n fontSize: \"12px\",\n color: \"#616161\",\n },\n violationToggleButton: {\n borderRadius: \"8px\",\n color: \"#5c5c5c\",\n },\n violationToggleIcon: {\n color: \"#5c5c5c\",\n },\n violationContent: {\n pt: \"8px\",\n },\n violationItem: {\n bg: \"#fceaea\",\n borderRadius: \"8px\",\n px: \"10px\",\n py: \"8px\",\n },\n violationItemTitle: {\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#8E1F0B\",\n },\n violationItemDetailRow: {\n alignItems: \"center\",\n },\n violationItemDetail: {\n fontSize: \"12px\",\n color: \"#b42318\",\n },\n violationBullet: {\n color: \"#b42318\",\n flexShrink: 0,\n },\n recommendationsBox: {\n bg: \"#eaf2ff\",\n borderRadius: \"8px\",\n px: \"10px\",\n py: \"8px\",\n },\n recommendationsTitle: {\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#1f4eb0\",\n mb: \"4px\",\n },\n recommendationsList: {},\n recommendationsItem: {\n fontSize: \"12px\",\n color: \"#1f4eb0\",\n },\n recommendationsBullet: {\n color: \"#1f4eb0\",\n flexShrink: 0,\n },\n recommendationsToggle: {\n alignSelf: \"flex-start\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n height: \"28px\",\n px: \"12px\",\n },\n failedFooter: {\n borderTop: \"1px solid #e3e3e3\",\n px: \"16px\",\n py: \"16px\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n },\n failedPrimaryButton: {\n fontSize: \"12px\",\n fontWeight: 600,\n borderRadius: \"8px\",\n bg: \"#303030\",\n color: \"white\",\n height: \"30px\",\n },\n failedSecondaryButton: {\n fontSize: \"12px\",\n fontWeight: 500,\n borderRadius: \"8px\",\n borderColor: \"#e3e3e3\",\n color: \"#303030\",\n height: \"30px\",\n },\n footer: {\n borderTop: \"1px solid #e3e3e3\",\n px: \"16px\",\n py: \"16px\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n },\n cancelButton: {\n fontSize: \"12px\",\n fontWeight: 500,\n borderRadius: \"8px\",\n borderColor: \"#e3e3e3\",\n color: \"#303030\",\n height: \"30px\",\n },\n primaryButton: {\n fontSize: \"12px\",\n fontWeight: 600,\n borderRadius: \"8px\",\n bg: \"#303030\",\n color: \"white\",\n height: \"30px\",\n },\n violatedConstraintsSecondaryButton: {\n fontWeight: 600,\n },\n};\n\nexport const SCHEDULE_STEPS: Array<{ title: string; subtitle?: string }> = [\n {\n title: \"Analyzing requirements\",\n subtitle: \"Reviewing your required rules and optimization priorities.\",\n },\n { title: \"Validating required rules\",\n subtitle: \"Ensuring all assigned shifts meet your required rules.\"\n },\n { title: \"Optimizing assigned shifts\",\n subtitle: \"Applying optimization priorities to improve coverage and performance.\",\n },\n { title: \"Checking schedule feasibility\", subtitle: \"Confirming the schedule is feasible and respects all required rules.\" },\n { title: \"Finalizing schedule\" },\n];\n\nexport const STEP_INTERVAL_MS = 1200;\nexport const POLL_INTERVAL_MS = 2500;\nexport const OPTIMIZING_STEP_INDEX = 2;\nexport const API_BASE_URL = \"http://localhost:8080\";\n\nexport const OPTIONS_WITHOUT_INPUTS = [\"staff_preferences\", \"cost_to_sales_ratio\", \"maximize_sales\"];\n\nexport const NETWORK_ERROR_FAILURE: ViolatedConstraintsResult = {\n violatedConstraints: [\n { title: \"Something went wrong\", detail: \"Please try again or check your connection.\" },\n ],\n recommendedFixes: [],\n};\n","import type { AutoSchedulerModalStyleOverrides } from \"../types\";\n\nexport const buildStyles = (defaultStyles: Required<AutoSchedulerModalStyleOverrides>, overrides?: AutoSchedulerModalStyleOverrides): Required<AutoSchedulerModalStyleOverrides> => ({\n overlay: { ...defaultStyles.overlay, ...overrides?.overlay },\n content: { ...defaultStyles.content, ...overrides?.content },\n header: { ...defaultStyles.header, ...overrides?.header },\n title: { ...defaultStyles.title, ...overrides?.title },\n closeButton: { ...defaultStyles.closeButton, ...overrides?.closeButton },\n body: { ...defaultStyles.body, ...overrides?.body },\n banner: { ...defaultStyles.banner, ...overrides?.banner },\n bannerIcon: { ...defaultStyles.bannerIcon, ...overrides?.bannerIcon },\n bannerTitle: { ...defaultStyles.bannerTitle, ...overrides?.bannerTitle },\n bannerText: { ...defaultStyles.bannerText, ...overrides?.bannerText },\n locationSection: { ...defaultStyles.locationSection, ...overrides?.locationSection },\n locationLabelRow: { ...defaultStyles.locationLabelRow, ...overrides?.locationLabelRow },\n locationLabel: { ...defaultStyles.locationLabel, ...overrides?.locationLabel },\n locationBadge: { ...defaultStyles.locationBadge, ...overrides?.locationBadge },\n locationSubtitle: { ...defaultStyles.locationSubtitle, ...overrides?.locationSubtitle },\n locationTrigger: { ...defaultStyles.locationTrigger, ...overrides?.locationTrigger },\n locationTriggerText: {\n ...defaultStyles.locationTriggerText,\n ...overrides?.locationTriggerText,\n },\n popoverContent: { ...defaultStyles.popoverContent, ...overrides?.popoverContent },\n groupHeader: { ...defaultStyles.groupHeader, ...overrides?.groupHeader },\n optionRow: { ...defaultStyles.optionRow, ...overrides?.optionRow },\n optionLabel: { ...defaultStyles.optionLabel, ...overrides?.optionLabel },\n selectedBanner: { ...defaultStyles.selectedBanner, ...overrides?.selectedBanner },\n selectedBannerIcon: { ...defaultStyles.selectedBannerIcon, ...overrides?.selectedBannerIcon },\n selectedBannerText: {\n ...defaultStyles.selectedBannerText,\n ...overrides?.selectedBannerText,\n },\n hardConstraintsSection: {\n ...defaultStyles.hardConstraintsSection,\n ...overrides?.hardConstraintsSection,\n },\n hardConstraintsLabelRow: {\n ...defaultStyles.hardConstraintsLabelRow,\n ...overrides?.hardConstraintsLabelRow,\n },\n hardConstraintsLabel: {\n ...defaultStyles.hardConstraintsLabel,\n ...overrides?.hardConstraintsLabel,\n },\n hardConstraintsBadge: {\n ...defaultStyles.hardConstraintsBadge,\n ...overrides?.hardConstraintsBadge,\n },\n hardConstraintsSubtitle: {\n ...defaultStyles.hardConstraintsSubtitle,\n ...overrides?.hardConstraintsSubtitle,\n },\n hardConstraintsTrigger: {\n ...defaultStyles.hardConstraintsTrigger,\n ...overrides?.hardConstraintsTrigger,\n },\n hardConstraintsTriggerText: {\n ...defaultStyles.hardConstraintsTriggerText,\n ...overrides?.hardConstraintsTriggerText,\n },\n hardConstraintsPopoverContent: {\n ...defaultStyles.hardConstraintsPopoverContent,\n ...overrides?.hardConstraintsPopoverContent,\n },\n hardConstraintsOptionRow: {\n ...defaultStyles.hardConstraintsOptionRow,\n ...overrides?.hardConstraintsOptionRow,\n },\n hardConstraintsOptionLabel: {\n ...defaultStyles.hardConstraintsOptionLabel,\n ...overrides?.hardConstraintsOptionLabel,\n },\n hardConstraintsInputsContainer: {\n ...defaultStyles.hardConstraintsInputsContainer,\n ...overrides?.hardConstraintsInputsContainer,\n },\n hardConstraintsInputItem: {\n ...defaultStyles.hardConstraintsInputItem,\n ...overrides?.hardConstraintsInputItem,\n },\n hardConstraintsInputLabel: {\n ...defaultStyles.hardConstraintsInputLabel,\n ...overrides?.hardConstraintsInputLabel,\n },\n hardConstraintsInputField: {\n ...defaultStyles.hardConstraintsInputField,\n ...overrides?.hardConstraintsInputField,\n },\n optimizationSection: {\n ...defaultStyles.optimizationSection,\n ...overrides?.optimizationSection,\n },\n optimizationLabelRow: {\n ...defaultStyles.optimizationLabelRow,\n ...overrides?.optimizationLabelRow,\n },\n optimizationLabel: {\n ...defaultStyles.optimizationLabel,\n ...overrides?.optimizationLabel,\n },\n optimizationBadge: {\n ...defaultStyles.optimizationBadge,\n ...overrides?.optimizationBadge,\n },\n optimizationSubtitle: {\n ...defaultStyles.optimizationSubtitle,\n ...overrides?.optimizationSubtitle,\n },\n optimizationTrigger: {\n ...defaultStyles.optimizationTrigger,\n ...overrides?.optimizationTrigger,\n },\n optimizationTriggerText: {\n ...defaultStyles.optimizationTriggerText,\n ...overrides?.optimizationTriggerText,\n },\n optimizationPopoverContent: {\n ...defaultStyles.optimizationPopoverContent,\n ...overrides?.optimizationPopoverContent,\n },\n optimizationGroupHeader: {\n ...defaultStyles.optimizationGroupHeader,\n ...overrides?.optimizationGroupHeader,\n },\n optimizationOptionRow: {\n ...defaultStyles.optimizationOptionRow,\n ...overrides?.optimizationOptionRow,\n },\n optimizationOptionLabel: {\n ...defaultStyles.optimizationOptionLabel,\n ...overrides?.optimizationOptionLabel,\n },\n optimizationOptionHelp: {\n ...defaultStyles.optimizationOptionHelp,\n ...overrides?.optimizationOptionHelp,\n },\n optimizationInputsContainer: {\n ...defaultStyles.optimizationInputsContainer,\n ...overrides?.optimizationInputsContainer,\n },\n optimizationInputItem: {\n ...defaultStyles.optimizationInputItem,\n ...overrides?.optimizationInputItem,\n },\n optimizationInputLabel: {\n ...defaultStyles.optimizationInputLabel,\n ...overrides?.optimizationInputLabel,\n },\n optimizationInputField: {\n ...defaultStyles.optimizationInputField,\n ...overrides?.optimizationInputField,\n },\n optimizationSuffix: {\n ...defaultStyles.optimizationSuffix,\n ...overrides?.optimizationSuffix,\n },\n optimizationDivider: {\n ...defaultStyles.optimizationDivider,\n ...overrides?.optimizationDivider,\n },\n optimizationSummary: {\n ...defaultStyles.optimizationSummary,\n ...overrides?.optimizationSummary,\n },\n creatingBody: {\n ...defaultStyles.creatingBody,\n ...overrides?.creatingBody,\n },\n stepsContainer: {\n ...defaultStyles.stepsContainer,\n ...overrides?.stepsContainer,\n },\n stepsList: {\n ...defaultStyles.stepsList,\n ...overrides?.stepsList,\n },\n stepRow: {\n ...defaultStyles.stepRow,\n ...overrides?.stepRow,\n },\n stepIcon: {\n ...defaultStyles.stepIcon,\n ...overrides?.stepIcon,\n },\n stepIconActive: {\n ...defaultStyles.stepIconActive,\n ...overrides?.stepIconActive,\n },\n stepIconDone: {\n ...defaultStyles.stepIconDone,\n ...overrides?.stepIconDone,\n },\n stepIconPending: {\n ...defaultStyles.stepIconPending,\n ...overrides?.stepIconPending,\n },\n stepIconFailed: {\n ...defaultStyles.stepIconFailed,\n ...overrides?.stepIconFailed,\n },\n stepTitle: {\n ...defaultStyles.stepTitle,\n ...overrides?.stepTitle,\n },\n stepTitleActive: {\n ...defaultStyles.stepTitleActive,\n ...overrides?.stepTitleActive,\n },\n stepTitleDone: {\n ...defaultStyles.stepTitleDone,\n ...overrides?.stepTitleDone,\n },\n stepTitlePending: {\n ...defaultStyles.stepTitlePending,\n ...overrides?.stepTitlePending,\n },\n stepTitleFailed: {\n ...defaultStyles.stepTitleFailed,\n ...overrides?.stepTitleFailed,\n },\n stepSubtitle: {\n ...defaultStyles.stepSubtitle,\n ...overrides?.stepSubtitle,\n },\n violationPanel: {\n ...defaultStyles.violationPanel,\n ...overrides?.violationPanel,\n },\n violationHeaderRow: {\n ...defaultStyles.violationHeaderRow,\n ...overrides?.violationHeaderRow,\n },\n violationHeader: {\n ...defaultStyles.violationHeader,\n ...overrides?.violationHeader,\n },\n violationIcon: {\n ...defaultStyles.violationIcon,\n ...overrides?.violationIcon,\n },\n violationTitle: {\n ...defaultStyles.violationTitle,\n ...overrides?.violationTitle,\n },\n violationSubtitle: {\n ...defaultStyles.violationSubtitle,\n ...overrides?.violationSubtitle,\n },\n violationToggleButton: {\n ...defaultStyles.violationToggleButton,\n ...overrides?.violationToggleButton,\n },\n violationToggleIcon: {\n ...defaultStyles.violationToggleIcon,\n ...overrides?.violationToggleIcon,\n },\n violationContent: {\n ...defaultStyles.violationContent,\n ...overrides?.violationContent,\n },\n violationItem: {\n ...defaultStyles.violationItem,\n ...overrides?.violationItem,\n },\n violationItemTitle: {\n ...defaultStyles.violationItemTitle,\n ...overrides?.violationItemTitle,\n },\n violationItemDetailRow: {\n ...defaultStyles.violationItemDetailRow,\n ...overrides?.violationItemDetailRow,\n },\n violationItemDetail: {\n ...defaultStyles.violationItemDetail,\n ...overrides?.violationItemDetail,\n },\n violationBullet: {\n ...defaultStyles.violationBullet,\n ...overrides?.violationBullet,\n },\n recommendationsBox: {\n ...defaultStyles.recommendationsBox,\n ...overrides?.recommendationsBox,\n },\n recommendationsTitle: {\n ...defaultStyles.recommendationsTitle,\n ...overrides?.recommendationsTitle,\n },\n recommendationsList: {\n ...defaultStyles.recommendationsList,\n ...overrides?.recommendationsList,\n },\n recommendationsItem: {\n ...defaultStyles.recommendationsItem,\n ...overrides?.recommendationsItem,\n },\n recommendationsBullet: {\n ...defaultStyles.recommendationsBullet,\n ...overrides?.recommendationsBullet,\n },\n recommendationsToggle: {\n ...defaultStyles.recommendationsToggle,\n ...overrides?.recommendationsToggle,\n },\n failedFooter: {\n ...defaultStyles.failedFooter,\n ...overrides?.failedFooter,\n },\n failedPrimaryButton: {\n ...defaultStyles.failedPrimaryButton,\n ...overrides?.failedPrimaryButton,\n },\n failedSecondaryButton: {\n ...defaultStyles.failedSecondaryButton,\n ...overrides?.failedSecondaryButton,\n },\n footer: { ...defaultStyles.footer, ...overrides?.footer },\n cancelButton: { ...defaultStyles.cancelButton, ...overrides?.cancelButton },\n primaryButton: { ...defaultStyles.primaryButton, ...overrides?.primaryButton },\n violatedConstraintsSecondaryButton: {\n ...defaultStyles.violatedConstraintsSecondaryButton,\n ...overrides?.violatedConstraintsSecondaryButton,\n },\n});","export const UI_TO_BACKEND_RULE_ID: Record<string, string> = {\n max_weekly_hours: \"max-weekly-hours\",\n max_daily_hours: \"max-daily-hours\",\n min_rest_between_shifts: \"min-rest-between-shifts\",\n max_work_days_per_week: \"max-work-days-per-week\",\n fair_hour_distribution: \"fair-hour-distribution\",\n minimize_overtime: \"overtime-balance\",\n cost_to_sales_ratio: \"labor-cost-optimization\",\n maximize_sales: \"maximize-sales-performance\",\n staff_preferences: \"staff-open-shift-preferences\",\n};\n\nexport const BACKEND_TO_UI_RULE_ID: Record<string, string> = Object.fromEntries(\n Object.entries(UI_TO_BACKEND_RULE_ID).map(([ui, backend]) => [backend, ui]),\n);\n\nexport function toBackendRuleId(uiOptionId: string): string | undefined {\n return UI_TO_BACKEND_RULE_ID[uiOptionId];\n}\n","import type { RuleOverrideEntry, SchedulePayload, TimeOff, TrafficForecastEntry } from \"./types\";\nimport type { Employee, OpenShift, JurisdictionGroup, LocationOption } from \"./types\";\nimport { BACKEND_TO_UI_RULE_ID, toBackendRuleId } from \"./utils/ruleIdMapping\";\n\n/** Soft companion for conversion rate — silent inject under Maximize Sales / Cost-to-sales. */\nexport const MAXIMIZE_CONVERSION_RATE_RULE_ID = \"maximize-conversion-rate\";\n/** Soft companion for traffic × sales — silent inject under Maximize Sales only. */\nexport const TRAFFIC_FORECAST_INCENTIVE_RULE_ID = \"traffic-forecast-incentive\";\n\nconst SALES_OPTIMIZATION_UI_IDS = new Set([\"maximize_sales\", \"cost_to_sales_ratio\"]);\n\nfunction buildParametersForRule(\n backendRuleId: string,\n constraintValues: Record<string, string>,\n _optimizationValues: Record<string, string>\n): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n switch (backendRuleId) {\n case \"max-weekly-hours\": {\n const value = constraintValues[\"max_weekly_hours\"]?.trim();\n if (value) {\n const limitMinutes = Number(value) * 60;\n if (Number.isFinite(limitMinutes) && limitMinutes >= 1) {\n params.limitMinutes = limitMinutes;\n }\n }\n break;\n }\n case \"max-daily-hours\": {\n const value = constraintValues[\"max_daily_hours\"]?.trim();\n if (value) {\n const limitMinutes = Number(value) * 60;\n if (Number.isFinite(limitMinutes) && limitMinutes >= 1) {\n params.limitMinutes = limitMinutes;\n }\n }\n break;\n }\n case \"min-rest-between-shifts\": {\n const value = constraintValues[\"min_rest_between_shifts\"]?.trim();\n if (value) {\n const minGapMinutes = Number(value) * 60;\n if (Number.isFinite(minGapMinutes) && minGapMinutes >= 1) {\n params.minGapMinutes = minGapMinutes;\n }\n }\n break;\n }\n case \"max-work-days-per-week\": {\n const value = constraintValues[\"max_work_days_per_week\"]?.trim();\n if (value) {\n const maxWorkDays = Number(value);\n if (Number.isFinite(maxWorkDays) && maxWorkDays >= 1 && maxWorkDays <= 6) {\n params.limitDays = maxWorkDays;\n }\n }\n break;\n }\n default:\n break;\n }\n\n return params;\n}\n\nfunction hasAnyParameterOverrides(\n selectedConstraintIds: string[],\n constraintValues: Record<string, string>,\n selectedOptimizationIds: string[],\n optimizationValues: Record<string, string>\n): boolean {\n for (const id of selectedConstraintIds) {\n const value = constraintValues[id]?.trim();\n if (value && Number.isFinite(Number(value))) return true;\n }\n for (const id of selectedOptimizationIds) {\n const weight = optimizationValues[`${id}_weightPoints`]?.trim();\n if (weight && Number.isFinite(Number(weight))) return true;\n if (id === \"fair_hour_distribution\") {\n if (\n optimizationValues[\"fair_hour_distribution_balanceTarget\"]?.trim() ||\n optimizationValues[\"fair_hour_distribution_period\"]?.trim()\n ) {\n return true;\n }\n } else if (id === \"minimize_overtime\") {\n if (\n optimizationValues[\"minimize_overtime_thresholdMinutes\"]?.trim() ||\n optimizationValues[\"minimize_overtime_period\"]?.trim()\n ) return true;\n } else if (id === \"cost_to_sales_ratio\" || id === \"maximize_sales\") {\n // These rules always need explicit parameters sent to the backend\n return true;\n }\n }\n return false;\n}\n\nexport type SiblingRuleOptions = {\n /** Inject maximize-conversion-rate when sales opts are selected. */\n includeConversionRate?: boolean;\n /** Inject traffic-forecast-incentive when Maximize Sales is selected. */\n includeTrafficIncentive?: boolean;\n};\n\nfunction appendSiblingRuleId(ruleIds: string[], siblingId: string): void {\n if (!ruleIds.includes(siblingId)) {\n ruleIds.push(siblingId);\n }\n}\n\n/**\n * Build ruleIds / ruleOverrides. Sibling Avia-agnostic rules are appended into\n * whichever structure is returned (Maximize Sales forces the overrides path).\n */\nexport function buildRulesPayload(\n selectedConstraintIds: string[],\n constraintValues: Record<string, string>,\n selectedOptimizationIds: string[],\n optimizationValues: Record<string, string>,\n siblings: SiblingRuleOptions = {}\n): { ruleIds?: string[]; ruleOverrides?: RuleOverrideEntry[] } {\n const allSelectedRuleIds = [\n ...selectedConstraintIds.map(toBackendRuleId),\n ...selectedOptimizationIds.map(toBackendRuleId),\n ].filter((id): id is string => Boolean(id));\n\n const salesOptSelected = selectedOptimizationIds.some((id) => SALES_OPTIMIZATION_UI_IDS.has(id));\n const maximizeSalesSelected = selectedOptimizationIds.includes(\"maximize_sales\");\n\n if (siblings.includeConversionRate && salesOptSelected) {\n appendSiblingRuleId(allSelectedRuleIds, MAXIMIZE_CONVERSION_RATE_RULE_ID);\n }\n if (siblings.includeTrafficIncentive && maximizeSalesSelected) {\n appendSiblingRuleId(allSelectedRuleIds, TRAFFIC_FORECAST_INCENTIVE_RULE_ID);\n }\n\n if (allSelectedRuleIds.length === 0) {\n return {};\n }\n\n const hasOverrides = hasAnyParameterOverrides(\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues\n );\n\n if (!hasOverrides) {\n return { ruleIds: allSelectedRuleIds };\n }\n\n const ruleOverrides: RuleOverrideEntry[] = allSelectedRuleIds.map((ruleId) => {\n const params = buildParametersForRule(ruleId, constraintValues, optimizationValues);\n const uiId = BACKEND_TO_UI_RULE_ID[ruleId];\n const weightRaw = uiId ? optimizationValues[`${uiId}_weightPoints`]?.trim() : undefined;\n const weightPoints = weightRaw ? Number(weightRaw) : undefined;\n if (weightPoints && Number.isFinite(weightPoints) && weightPoints >= 1) {\n params.weightPoints = weightPoints;\n }\n return {\n ruleId,\n ...(Object.keys(params).length > 0 ? { parameters: params } : {}),\n };\n });\n\n return { ruleIds: allSelectedRuleIds, ruleOverrides };\n}\n\nfunction toApiShift(\n shift: OpenShift,\n includeEmployeePreferences: boolean\n): SchedulePayload[\"shifts\"][0] {\n const startDateTime =\n \"startDateTime\" in shift ? (shift as { startDateTime: string }).startDateTime : shift.startTime;\n const endDateTime =\n \"endDateTime\" in shift ? (shift as { endDateTime: string }).endDateTime : shift.endTime;\n return {\n id: shift.id,\n startDateTime,\n endDateTime,\n ...(shift.employeeId ? { employeeId: String(shift.employeeId) } : {}),\n requiredPosition: shift.requiredPosition || undefined,\n requiredCount: shift.requiredCount ?? 1,\n location: shift.location\n ? {\n id: String(shift.location.id),\n timezone: \"timezone\" in shift.location ? (shift.location as { timezone?: string }).timezone : undefined,\n tags: \"tags\" in shift.location ? (shift.location as { tags?: string[] }).tags : undefined,\n }\n : undefined,\n ...(includeEmployeePreferences && shift.employeePreferences\n ? {\n employeePreferences: shift.employeePreferences.map((p) => ({\n employeeId: p.employeeId,\n level: p.level,\n })),\n }\n : {}),\n };\n}\n\nfunction toApiEmployee(employee: Employee): SchedulePayload[\"employees\"][0] {\n return {\n id: String(employee.id),\n name: employee.name ?? undefined,\n position: employee.position ?? undefined,\n locationIds: employee.locationIds ?? undefined,\n properties: employee.properties ? (employee.properties as Record<string, unknown>) : undefined,\n };\n}\n\nfunction toApiLocation(location: LocationOption): SchedulePayload[\"locations\"][0] {\n return {\n id: String(location.id),\n timezone: location.timezone ?? undefined,\n jurisdiction: location.jurisdiction ?? undefined,\n tags: \"tags\" in location ? (location as { tags?: string[] }).tags : undefined,\n properties: location.properties ? location.properties : undefined,\n };\n}\n\nfunction employeeHasConversionRate(employee: Employee): boolean {\n const value = employee.properties?.conversionRate;\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n\nfunction employeeTouchesSelectedLocations(\n employee: Employee,\n selectedLocationIds: string[],\n): boolean {\n const ids = employee.locationIds ?? [];\n return ids.some((id) => selectedLocationIds.includes(String(id)));\n}\n\nfunction hasConversionRateInSelectedLocations(\n employees: Employee[],\n selectedLocationIds: string[],\n): boolean {\n return employees.some(\n (employee) =>\n employeeTouchesSelectedLocations(employee, selectedLocationIds) &&\n employeeHasConversionRate(employee),\n );\n}\n\nexport type BuildSchedulePayloadInput = {\n employees: Employee[];\n openShifts: OpenShift[];\n timeOffs?: TimeOff[];\n selectedLocationIds: string[];\n jurisdictions: JurisdictionGroup[];\n selectedConstraintIds: string[];\n constraintValues: Record<string, string>;\n selectedOptimizationIds: string[];\n optimizationValues: Record<string, string>;\n trafficForecast?: TrafficForecastEntry[];\n // Visual rules — production path (ids resolved server-side)\n constraintDefinitionIds?: string[];\n // Visual rules — sandbox/test path (full definitions inline, for unsaved rules)\n constraintDefinitions?: unknown[];\n organizationId?: string;\n};\n\nexport function buildSchedulePayload(input: BuildSchedulePayloadInput): SchedulePayload {\n const {\n employees,\n openShifts,\n timeOffs,\n selectedLocationIds,\n jurisdictions,\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n trafficForecast,\n constraintDefinitionIds,\n constraintDefinitions,\n organizationId,\n } = input;\n\n const locationsMap = new Map<string, LocationOption>();\n for (const j of jurisdictions) {\n for (const loc of j.locations) {\n locationsMap.set(loc.id, loc);\n }\n }\n\n const selectedLocations = selectedLocationIds\n .map((id) => locationsMap.get(id))\n .filter((loc): loc is LocationOption => Boolean(loc));\n\n // Only shifts for the locations the user selected in the modal.\n const scopedOpenShifts = openShifts.filter((shift) =>\n selectedLocationIds.includes(String(shift.location?.id)),\n );\n\n // Same location scope as open shifts / traffic forecast — ignore CVR outside the solve.\n const includeConversionRate = hasConversionRateInSelectedLocations(\n employees,\n selectedLocationIds,\n );\n // Only forecast rows for locations in this solve (open-shift / selected locations).\n const scopedTrafficForecast = (trafficForecast ?? []).filter((entry) =>\n selectedLocationIds.includes(String(entry.locationId)),\n );\n const includeTrafficIncentive = scopedTrafficForecast.length > 0;\n\n const rules = buildRulesPayload(\n selectedConstraintIds,\n constraintValues,\n selectedOptimizationIds,\n optimizationValues,\n { includeConversionRate, includeTrafficIncentive }\n );\n\n const includeEmployeePreferences = selectedOptimizationIds.includes(\"staff_preferences\");\n\n // Visual rules: ids for production, inline defs for sandbox. Both can coexist;\n // the backend decides precedence (typically inline defs override ids for testing).\n const hasIds = Boolean(constraintDefinitionIds && constraintDefinitionIds.length > 0);\n const hasDefs = Boolean(constraintDefinitions && constraintDefinitions.length > 0);\n const hasRules = hasIds || hasDefs;\n\n // Visual-rule ids are resolved server-side against the caller's organization,\n // so fail fast here instead of letting the backend reject the request later.\n if (hasIds && !organizationId) {\n throw new Error(\"organizationId is required when constraintDefinitionIds are provided\");\n }\n\n const trafficRuleActive =\n includeTrafficIncentive && selectedOptimizationIds.includes(\"maximize_sales\");\n\n return {\n employees: employees.map(toApiEmployee),\n shifts: scopedOpenShifts.map((shift) => toApiShift(shift, includeEmployeePreferences)),\n locations: selectedLocations.map(toApiLocation),\n ...(timeOffs && timeOffs.length > 0 ? { timeOffs } : {}),\n ...rules,\n ...(trafficRuleActive ? { trafficForecast: scopedTrafficForecast } : {}),\n ...(hasIds ? { constraintDefinitionIds } : {}),\n ...(hasDefs ? { constraintDefinitions } : {}),\n ...(hasRules && organizationId ? { organizationId } : {}),\n };\n}\n","import axios from \"axios\";\nimport type { SchedulePayload } from \"../types\";\nimport type { SolveApiResponse } from \"../types\";\n\nconst axiosInstance = axios.create({\n headers: { \"Content-Type\": \"application/json\" },\n});\n\nexport type SolveScheduleOptions = {\n authorization?: string;\n horizonStartDate?: string;\n horizonEndDate?: string;\n};\n\nexport type JobStatusResponse = {\n jobId: string;\n status: string;\n};\n\nexport async function getToken(\n fullUrl: string,\n headers?: Record<string, string>,\n): Promise<string> {\n const tokenRes = await axiosInstance.get(fullUrl, {\n ...(headers ? { headers } : {}),\n });\n return tokenRes.data?.token;\n}\n\n/**\n * Submits a solve job to the queue. Returns immediately with jobId.\n * Use with getJobStatus and getJobResult for polling.\n */\nexport async function submitSolveJob(\n baseURL: string,\n payload: SchedulePayload,\n options?: SolveScheduleOptions,\n): Promise<JobStatusResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.post<JobStatusResponse>(\n withHorizonQuery(`${cleanBaseUrl}/api/schedule/solve-async`, options),\n payload,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * Gets the current status of a solve job.\n * Status: QUEUED | SOLVING_ACTIVE | NOT_SOLVING | TERMINATED_EARLY\n */\nexport async function getJobStatus(\n baseURL: string,\n jobId: string,\n options?: SolveScheduleOptions,\n): Promise<JobStatusResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.get<JobStatusResponse>(\n `${cleanBaseUrl}/api/schedule/status/${jobId}`,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * Gets the full solve result when job status is terminal\n * (NOT_SOLVING or TERMINATED_EARLY).\n * Returns 404 if job not found or still in progress.\n */\nexport async function getJobResult(\n baseURL: string,\n jobId: string,\n options?: SolveScheduleOptions,\n): Promise<SolveApiResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.get<SolveApiResponse>(\n `${cleanBaseUrl}/api/schedule/result/${jobId}`,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * Gets the solved schedule for a completed job.\n */\nexport async function getJobSolution(\n baseURL: string,\n jobId: string,\n options?: SolveScheduleOptions,\n): Promise<SolveApiResponse[\"solution\"]> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.get<SolveApiResponse[\"solution\"]>(\n `${cleanBaseUrl}/api/schedule/solution/${jobId}`,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\n/**\n * @deprecated Use submitSolveJob + getJobStatus + getJobResult for queue-based flow.\n * Synchronous solve - blocks until solver completes.\n */\nexport async function solveSchedule(\n baseURL: string,\n payload: SchedulePayload,\n options?: SolveScheduleOptions,\n): Promise<SolveApiResponse> {\n const cleanBaseUrl = baseURL.replace(/\\/$/, \"\");\n const headers: Record<string, string> = {};\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n const response = await axiosInstance.post<SolveApiResponse>(\n withHorizonQuery(`${cleanBaseUrl}/api/schedule/solve`, options),\n payload,\n { headers: Object.keys(headers).length > 0 ? headers : undefined },\n );\n return response.data;\n}\n\nfunction withHorizonQuery(url: string, options?: SolveScheduleOptions): string {\n if (!options?.horizonStartDate || !options?.horizonEndDate) {\n return url;\n }\n const params = new URLSearchParams({\n dateRangeStart: options.horizonStartDate,\n dateRangeEnd: options.horizonEndDate,\n });\n return `${url}?${params.toString()}`;\n}\n","export type ViolationMessage = {\n title: string;\n detail: string;\n};\n\nconst INTERNAL_VIOLATION_PATTERNS = [\n /\\w+Rule\\{/,\n /\\[I@/,\n /Employee\\{id=/,\n /Accumulator violation \\(Rule:/,\n /^Schedule has \\d+ hard, \\d+ medium, and \\d+ soft constraint violation/,\n /ConstraintMatch\\{/,\n /MatchAnalysis\\{/,\n /Indictment\\{/,\n /Hard constraint violation \\(count:/,\n];\n\nexport function isInternalViolationText(text?: string): boolean {\n const trimmed = text?.trim();\n if (!trimmed) return false;\n return INTERNAL_VIOLATION_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nconst SYSTEM_CONSTRAINT_MESSAGES: Record<string, ViolationMessage> = {\n \"system-unassigned-Hard\": {\n title: \"Not enough eligible staff to cover all shifts\",\n detail: \"Some open shifts require more team members with the required position than are currently available.\",\n },\n \"system-position-Hard\": {\n title: \"Required position not matched\",\n detail: \"Some open shifts require a position that isn't assigned to the available team members.\",\n },\n \"system-location-Hard\": {\n title: \"Location assignment mismatch\",\n detail: \"Some open shifts are set for a location that isn't assigned to the available team members.\",\n },\n \"system-employee-unavailable-Hard\": {\n title: \"No eligible staff available for shift\",\n detail: \"Some open shifts don't have any remaining eligible team members available at that time.\",\n },\n \"system-employee-unavailable-time-Hard\": {\n title: \"Unavailable time\",\n detail: \"Some open shifts fall outside the available time windows for the remaining eligible team members.\",\n },\n \"system-employee-available-time-Hard\": {\n title: \"Outside available time\",\n detail: \"Some open shifts fall outside the available time windows for the remaining eligible team members.\",\n },\n \"system-employee-time-off-Hard\": {\n title: \"Time off prevents assignment\",\n detail: \"Some open shifts overlap with approved time off for the remaining eligible team members.\",\n },\n \"system-no-overlapping-shifts-Hard\": {\n title: \"Overlapping shifts\",\n detail: \"Some team members would be assigned to overlapping shifts if all open shifts are assigned.\",\n },\n};\n\nconst RULE_ID_MESSAGES: Record<string, ViolationMessage> = {\n \"max-weekly-hours\": {\n title: \"Maximum weekly hours exceeded\",\n detail: \"Some team members would exceed weekly hour limits if all open shifts are assigned.\",\n },\n \"max-daily-hours\": {\n title: \"Maximum daily hours exceeded\",\n detail: \"Some team members would exceed daily hour limits if all open shifts are assigned.\",\n },\n \"min-rest-between-shifts\": {\n title: \"Minimum rest between shifts\",\n detail: \"Some team members would not receive the required rest time if all open shifts are assigned.\",\n },\n \"max-work-days-per-week\": {\n title: \"Maximum work days per week exceeded\",\n detail: \"Some team members would exceed the allowed work days this week if all open shifts are assigned.\",\n },\n \"min-days-off-per-week\": {\n title: \"Minimum days off not met\",\n detail: \"Some team members would not receive the required days off this week if all open shifts are assigned.\",\n },\n \"fair-hour-distribution\": {\n title: \"Work distribution not balanced\",\n detail: \"Some team members would receive an uneven share of shifts if all open shifts are assigned.\",\n },\n \"overtime-balance\": {\n title: \"Overtime balance rule violated\",\n detail: \"Some team members would exceed overtime limits if all open shifts are assigned.\",\n },\n \"labor-cost-optimization\": {\n title: \"Labor cost optimization conflict\",\n detail: \"Some open shifts cannot be assigned while meeting labor cost optimization priorities.\",\n },\n \"maximize-sales-performance\": {\n title: \"Sales optimization conflict\",\n detail: \"Some open shifts cannot be assigned while meeting sales optimization priorities.\",\n },\n \"staff-open-shift-preferences\": {\n title: \"Staff preferences conflict\",\n detail: \"Some open shifts cannot be assigned while respecting all staff shift preferences.\",\n },\n \"split-shift-penalty\": {\n title: \"Split shift rule violated\",\n detail: \"Some team members would receive split shifts that violate scheduling preferences.\",\n },\n \"shift-continuity-penalty\": {\n title: \"Shift continuity rule violated\",\n detail: \"Some team members would receive shift patterns that violate continuity preferences.\",\n },\n \"manager-cashier-ratio\": {\n title: \"Staffing ratio violated\",\n detail: \"Some open shifts cannot be assigned while meeting required staffing ratios.\",\n },\n \"min-staffing\": {\n title: \"Minimum staffing not met\",\n detail: \"Some time periods would not meet minimum staffing requirements if all open shifts are assigned.\",\n },\n \"shift-duration-limits\": {\n title: \"Shift duration outside allowed range\",\n detail: \"Some open shifts fall outside the allowed shift duration range.\",\n },\n \"max-consecutive-days\": {\n title: \"Shift sequence rule violated\",\n detail: \"Some team members would violate consecutive shift rules if all open shifts are assigned.\",\n },\n \"some-transactional-rule\": {\n title: \"Policy rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all policy requirements.\",\n },\n};\n\nconst CONSTRAINT_NAME_MESSAGES: Record<string, ViolationMessage> = {\n \"AccumulatorDays-Hard\": {\n title: \"Maximum work days per week exceeded\",\n detail: \"Some team members would exceed the allowed work days this week if all open shifts are assigned.\",\n },\n \"Accumulator-Hard\": {\n title: \"Hours limit exceeded\",\n detail: \"Some team members would exceed hour limits if all open shifts are assigned.\",\n },\n \"Spacer-Hard\": {\n title: \"Rest period not met\",\n detail: \"Some team members would not receive the required rest time if all open shifts are assigned.\",\n },\n \"SpacerPeriodic-Hard\": {\n title: \"Required rest period not met\",\n detail: \"Some team members would not receive the required rest period if all open shifts are assigned.\",\n },\n \"Composition-Hard\": {\n title: \"Staffing ratio violated\",\n detail: \"Some open shifts cannot be assigned while meeting required staffing ratios.\",\n },\n \"Transactional-Hard\": {\n title: \"Policy rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all policy requirements.\",\n },\n \"Balancer-Hard\": {\n title: \"Work distribution not balanced\",\n detail: \"Some team members would receive an uneven share of shifts if all open shifts are assigned.\",\n },\n \"Coverage-Hard\": {\n title: \"Minimum staffing not met\",\n detail: \"Some time periods would not meet minimum staffing requirements if all open shifts are assigned.\",\n },\n \"Sizing-Hard\": {\n title: \"Shift duration outside allowed range\",\n detail: \"Some open shifts fall outside the allowed shift duration range.\",\n },\n \"Sequencer-Hard\": {\n title: \"Shift sequence rule violated\",\n detail: \"Some team members would violate consecutive shift rules if all open shifts are assigned.\",\n },\n \"OptimizerMinimize-Hard\": {\n title: \"Optimization rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all optimization priorities.\",\n },\n \"OptimizerMaximize-Hard\": {\n title: \"Optimization rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all optimization priorities.\",\n },\n};\n\nconst ARCHETYPE_FALLBACK_MESSAGES: Record<string, ViolationMessage> = {\n AccumulatorDays: {\n title: \"Maximum work days per week exceeded\",\n detail: \"Some team members would exceed the allowed work days this week if all open shifts are assigned.\",\n },\n Accumulator: {\n title: \"Hours limit exceeded\",\n detail: \"Some team members would exceed hour limits if all open shifts are assigned.\",\n },\n Spacer: {\n title: \"Rest period not met\",\n detail: \"Some team members would not receive the required rest time if all open shifts are assigned.\",\n },\n SpacerPeriodic: {\n title: \"Required rest period not met\",\n detail: \"Some team members would not receive the required rest period if all open shifts are assigned.\",\n },\n Composition: {\n title: \"Staffing ratio violated\",\n detail: \"Some open shifts cannot be assigned while meeting required staffing ratios.\",\n },\n Transactional: {\n title: \"Policy rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all policy requirements.\",\n },\n Balancer: {\n title: \"Work distribution not balanced\",\n detail: \"Some team members would receive an uneven share of shifts if all open shifts are assigned.\",\n },\n Coverage: {\n title: \"Minimum staffing not met\",\n detail: \"Some time periods would not meet minimum staffing requirements if all open shifts are assigned.\",\n },\n Sizing: {\n title: \"Shift duration outside allowed range\",\n detail: \"Some open shifts fall outside the allowed shift duration range.\",\n },\n Sequencer: {\n title: \"Shift sequence rule violated\",\n detail: \"Some team members would violate consecutive shift rules if all open shifts are assigned.\",\n },\n OptimizerMinimize: {\n title: \"Optimization rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all optimization priorities.\",\n },\n OptimizerMaximize: {\n title: \"Optimization rule violated\",\n detail: \"Some open shifts cannot be assigned while meeting all optimization priorities.\",\n },\n};\n\nconst FALLBACK_MESSAGE: ViolationMessage = {\n title: \"Rule violated\",\n detail: \"Please adjust constraints and try again.\",\n};\n\nfunction parseBackendConstraintName(constraintName?: string): { ruleId?: string; archetype?: string } {\n if (!constraintName?.trim()) return {};\n\n let name = constraintName.trim();\n for (const suffix of [\"Hard\", \"Medium\", \"Soft\"]) {\n if (name.endsWith(`-${suffix}`)) {\n name = name.slice(0, -(suffix.length + 1));\n break;\n }\n }\n\n if (name.startsWith(\"system-\")) {\n return {};\n }\n\n const lastDash = name.lastIndexOf(\"-\");\n if (lastDash > 0) {\n return {\n ruleId: name.slice(0, lastDash),\n archetype: name.slice(lastDash + 1),\n };\n }\n\n return { archetype: name };\n}\n\nfunction resolveRuleIdMessage(ruleId?: string): ViolationMessage | undefined {\n if (!ruleId?.trim()) return undefined;\n return RULE_ID_MESSAGES[ruleId.trim()];\n}\n\nfunction stripSeveritySuffix(name: string): string {\n return name.replace(/-(Hard|Medium|Soft)$/, \"\");\n}\n\nfunction resolveConstraintNameMessage(constraintName?: string): ViolationMessage | undefined {\n if (!constraintName?.trim()) return undefined;\n\n const trimmed = constraintName.trim();\n const exact = CONSTRAINT_NAME_MESSAGES[trimmed];\n if (exact) return exact;\n\n // Prefer full rule ids with dashes (e.g. max-work-days-per-week-Hard) before archetype split.\n const severityStripped = stripSeveritySuffix(trimmed);\n const directRuleId = resolveRuleIdMessage(severityStripped);\n if (directRuleId) return directRuleId;\n\n const parsed = parseBackendConstraintName(trimmed);\n if (parsed.ruleId) {\n const fromEmbeddedRuleId = resolveRuleIdMessage(parsed.ruleId);\n if (fromEmbeddedRuleId) return fromEmbeddedRuleId;\n }\n\n if (parsed.archetype && parsed.archetype in ARCHETYPE_FALLBACK_MESSAGES) {\n return ARCHETYPE_FALLBACK_MESSAGES[parsed.archetype];\n }\n\n return undefined;\n}\n\nfunction safeDescriptionMessage(description?: string): ViolationMessage | undefined {\n if (!description?.trim() || isInternalViolationText(description)) {\n return undefined;\n }\n return { title: description.trim(), detail: description.trim() };\n}\n\nexport function getSystemConstraintMessage(\n constraintName?: string,\n description?: string\n): ViolationMessage {\n if (constraintName && constraintName in SYSTEM_CONSTRAINT_MESSAGES) {\n return SYSTEM_CONSTRAINT_MESSAGES[constraintName];\n }\n\n const fromConstraintName = resolveConstraintNameMessage(constraintName);\n if (fromConstraintName) return fromConstraintName;\n\n return safeDescriptionMessage(description) ?? FALLBACK_MESSAGE;\n}\n\nexport function getRuleBasedViolationMessage(\n ruleId: string,\n constraintName?: string,\n description?: string,\n archetype?: string\n): ViolationMessage {\n const fromRuleId = resolveRuleIdMessage(ruleId);\n if (fromRuleId) return fromRuleId;\n\n const fromConstraintName = resolveConstraintNameMessage(constraintName);\n if (fromConstraintName) return fromConstraintName;\n\n if (archetype?.trim() && archetype.trim() in ARCHETYPE_FALLBACK_MESSAGES) {\n return ARCHETYPE_FALLBACK_MESSAGES[archetype.trim()];\n }\n\n return safeDescriptionMessage(description) ?? FALLBACK_MESSAGE;\n}\n","import type { SolveApiResponse, ViolatedConstraintsResult } from \"../types\";\nimport type { ViolationMessage } from \"./violationMessages\";\nimport {\n getSystemConstraintMessage,\n getRuleBasedViolationMessage,\n isInternalViolationText,\n} from \"./violationMessages\";\nimport { BACKEND_TO_UI_RULE_ID } from \"./ruleIdMapping\";\n\ntype Violation = SolveApiResponse[\"explanation\"][\"violations\"][number];\n\nfunction resolveCustomViolationMessage(\n ruleId: string,\n customMessages?: Record<string, ViolationMessage>\n): ViolationMessage | undefined {\n if (!customMessages) return undefined;\n\n const direct = customMessages[ruleId];\n if (direct) return direct;\n\n const uiRuleId = BACKEND_TO_UI_RULE_ID[ruleId];\n if (uiRuleId) {\n return customMessages[uiRuleId];\n }\n\n return undefined;\n}\n\nexport function mapViolationsToResult(\n violations: Violation[],\n summary?: string,\n customMessages?: Record<string, ViolationMessage>\n): ViolatedConstraintsResult {\n const hardViolations = violations.filter((v) => v.isHardViolation === true);\n\n const seenTitles = new Set<string>();\n const violatedConstraints: Array<{ title: string; detail: string }> = [];\n\n for (const v of hardViolations) {\n const hasRuleId = v.ruleId != null && v.ruleId !== undefined && String(v.ruleId).trim() !== \"\";\n\n const msg = hasRuleId\n ? (resolveCustomViolationMessage(v.ruleId!, customMessages) ??\n getRuleBasedViolationMessage(v.ruleId!, v.constraintName, v.description, v.archetype))\n : getSystemConstraintMessage(v.constraintName, v.description);\n\n if (!seenTitles.has(msg.title)) {\n seenTitles.add(msg.title);\n violatedConstraints.push(msg);\n }\n }\n\n const result: ViolatedConstraintsResult = {\n violatedConstraints,\n recommendedFixes: [],\n };\n\n if (violatedConstraints.length === 0) {\n const safeSummary = summary?.trim() && !isInternalViolationText(summary) ? summary.trim() : undefined;\n result.violatedConstraints = [\n {\n title: \"Schedule could not be created\",\n detail: safeSummary ?? \"Please adjust constraints and try again.\",\n },\n ];\n }\n\n return result;\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n Box,\n Button,\n HStack,\n IconButton,\n Spinner,\n Stack,\n Text,\n} from \"@chakra-ui/react\";\nimport axios from \"axios\";\nimport type { ScheduleRecommendation, ViolatedConstraintsPanelProps } from \"./types\";\nimport { ChevronDownIcon, DotIcon, WarningIcon } from \"./icons/AutoSchedulerIcons\";\nimport { defaultStyles } from \"./constants\";\nimport { buildStyles } from \"./utils/theme\";\n\nconst DEFAULT_TITLE = \"Schedule can't be created\";\nconst DEFAULT_SUBTITLE =\n \"Some required rules aren't being met. Review the issues below to continue.\";\n\nexport function ViolatedConstraintsPanel({\n violatedConstraints,\n title = DEFAULT_TITLE,\n subtitle = DEFAULT_SUBTITLE,\n showSecondaryButton = false,\n secondaryButtonTitle,\n onSecondaryButtonClick,\n generateRecommendationsURLAndHeaders,\n styles: stylesProp,\n styleOverrides,\n errorToast,\n}: ViolatedConstraintsPanelProps) {\n const [showRecommendations, setShowRecommendations] = useState(false);\n const [isExpanded, setIsExpanded] = useState(true);\n const [recommendations, setRecommendations] = useState<string[] | null>(null);\n const [isLoadingRecommendations, setIsLoadingRecommendations] = useState(false);\n const [isDisabledRecommendations, setIsDisabledRecommendations] = useState(false);\n const [recommendationsButtonText, setRecommendationsButtonText] = useState(\"Show recommendations\");\n\n const styles = useMemo(() => {\n if (stylesProp) return stylesProp;\n return buildStyles(defaultStyles, styleOverrides);\n }, [stylesProp, styleOverrides]);\n\n const canFetchRecommendations =\n Boolean(generateRecommendationsURLAndHeaders) &&\n Boolean(violatedConstraints.recommendationPayload);\n\n const hasPreFetchedFixes = violatedConstraints.recommendedFixes.length > 0;\n const showRecommendationsButton = canFetchRecommendations || hasPreFetchedFixes;\n\n const displayRecommendations =\n recommendations !== null ? recommendations : violatedConstraints.recommendedFixes;\n const hasRecommendations = displayRecommendations.length > 0;\n\n const handleToggleRecommendations = useCallback(async () => {\n if (showRecommendations) {\n setShowRecommendations(false);\n return;\n }\n\n if (recommendations !== null) {\n setShowRecommendations(true);\n return;\n }\n\n if (!canFetchRecommendations) {\n return;\n }\n\n const payload = violatedConstraints.recommendationPayload!;\n setIsLoadingRecommendations(true);\n try {\n const recResponse = await axios.post(\n generateRecommendationsURLAndHeaders!.url,\n payload,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n ...generateRecommendationsURLAndHeaders!.headers,\n },\n }\n );\n const { success, data, msg } = recResponse.data;\n const { isExpired, recommendations } = data ?? {};\n\n if (!success) {\n const errorMsg = msg || \"Failed to fetch recommendations\";\n errorToast?.(errorMsg);\n if (isExpired) {\n setIsDisabledRecommendations(true);\n setRecommendationsButtonText(\"Daily limit reached\");\n }\n\n return;\n }\n\n\n setShowRecommendations(true);\n const fetchedRecommendations = recommendations as ScheduleRecommendation[];\n\n if (fetchedRecommendations) {\n setRecommendations(fetchedRecommendations.map((r) => r.recommendation));\n } else {\n setRecommendations([]);\n }\n } catch (recErr) {\n console.error(\"[ViolatedConstraintsPanel] failed to fetch recommendations:\", recErr);\n setRecommendations([]);\n } finally {\n setIsLoadingRecommendations(false);\n }\n }, [\n showRecommendations,\n recommendations,\n canFetchRecommendations,\n violatedConstraints.recommendationPayload,\n generateRecommendationsURLAndHeaders,\n errorToast\n ]);\n\n return (\n <Box sx={styles.violationPanel}>\n <HStack sx={styles.violationHeaderRow}>\n <HStack sx={styles.violationHeader}>\n <Box sx={styles.violationIcon}>\n <WarningIcon />\n </Box>\n <Box>\n <Text sx={styles.violationTitle}>{title}</Text>\n <Text sx={styles.violationSubtitle}>{subtitle}</Text>\n </Box>\n </HStack>\n <IconButton\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n variant=\"ghost\"\n size=\"sm\"\n icon={\n <Box\n sx={styles.violationToggleIcon}\n transform={isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\"}\n >\n <ChevronDownIcon />\n </Box>\n }\n onClick={() => setIsExpanded((prev) => !prev)}\n sx={styles.violationToggleButton}\n />\n </HStack>\n {isExpanded ? (\n <Stack spacing=\"8px\" sx={styles.violationContent}>\n <Stack spacing=\"8px\">\n {violatedConstraints.violatedConstraints.map((constraint, index) => (\n <Box key={`${constraint.title}-${index}`} sx={styles.violationItem}>\n <Text sx={styles.violationItemTitle}>{constraint.title}</Text>\n <HStack spacing=\"6px\" sx={styles.violationItemDetailRow}>\n <Box sx={styles.violationBullet}>\n <DotIcon size={6} />\n </Box>\n <Text sx={styles.violationItemDetail}>{constraint.detail}</Text>\n </HStack>\n </Box>\n ))}\n </Stack>\n {showRecommendations && hasRecommendations ? (\n <Box sx={styles.recommendationsBox}>\n <Text sx={styles.recommendationsTitle}>Recommended fixes</Text>\n <Stack spacing=\"4px\" sx={styles.recommendationsList}>\n {displayRecommendations.map((fix, index) => (\n <HStack key={`${fix}-${index}`} spacing=\"6px\">\n <Box sx={styles.recommendationsBullet}>\n <DotIcon size={6} />\n </Box>\n <Text sx={styles.recommendationsItem}>{fix}</Text>\n </HStack>\n ))}\n </Stack>\n </Box>\n ) : null}\n <HStack spacing=\"8px\" flexWrap=\"wrap\">\n {showRecommendationsButton ? (\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={handleToggleRecommendations}\n isDisabled={isLoadingRecommendations || isDisabledRecommendations}\n sx={{ ...styles.recommendationsToggle, minWidth: \"140px\" }}\n >\n {isLoadingRecommendations ? (\n <Spinner size=\"sm\" thickness=\"2px\" />\n ) : (\n showRecommendations ? \"Hide recommendations\" : recommendationsButtonText\n )}\n </Button>\n ) : null}\n {showSecondaryButton && secondaryButtonTitle && onSecondaryButtonClick ? (\n <Button\n variant=\"outline\"\n size=\"xs\"\n onClick={onSecondaryButtonClick}\n sx={{ ...styles.failedSecondaryButton, ...styles.violatedConstraintsSecondaryButton }}\n >\n {secondaryButtonTitle}\n </Button>\n ) : null}\n </HStack>\n </Stack>\n ) : null}\n </Box>\n );\n}\n","/** Plain calendar YYYY-MM-DD parsed as local wall-clock date (no UTC midnight drift). */\nfunction parseCalendarYmd(ymd: string): Date {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(String(ymd).trim());\n if (!m) {\n return new Date(NaN);\n }\n return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n}\n\nfunction formatCalendarYmd(d: Date): string {\n const y = d.getFullYear();\n const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n const da = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${mo}-${da}`;\n}\n\n/** Seven consecutive calendar days starting at `weekStartYmd` (already aligned to org week start). */\nexport function getSequentialWeekDatesFromWeekStart(weekStartYmd: string): string[] {\n const base = parseCalendarYmd(weekStartYmd);\n if (Number.isNaN(base.getTime())) return [];\n const out: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(base.getFullYear(), base.getMonth(), base.getDate() + i);\n out.push(formatCalendarYmd(d));\n }\n return out;\n}\n\n/** Calendar-day weekday chip Su … Sa following JS getDay() order (0 = Sun). */\nexport function weekdayTwoLetterFromYmd(ymd: string): string {\n const labels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"] as const;\n const d = parseCalendarYmd(ymd);\n if (Number.isNaN(d.getTime())) return \"?\";\n return labels[d.getDay()] ?? \"?\";\n}\n\n/** Defaults to all week dates strictly on or after `todayYmd` (ISO date string compare). */\nexport function defaultSelectedScheduleDates(orderedWeekYmds: string[], todayYmd: string): string[] {\n return orderedWeekYmds.filter((d) => d >= todayYmd);\n}\n\nexport function todayCalendarYmdInTimezone(timezone?: string): string {\n const fallback = formatCalendarYmd(new Date());\n const tz = timezone?.trim();\n if (!tz) return fallback;\n\n try {\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: tz,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).formatToParts(new Date());\n const valueByType = new Map(parts.map((part) => [part.type, part.value]));\n const year = valueByType.get(\"year\");\n const month = valueByType.get(\"month\");\n const day = valueByType.get(\"day\");\n return year && month && day ? `${year}-${month}-${day}` : fallback;\n } catch {\n return fallback;\n }\n}\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport { AutoSchedulerModal } from \"./AutoSchedulerModal\";\nimport type { AutoSchedulerModalProps } from \"./types\";\n\n/**\n * Self-contained AutoSchedulerModal that wraps itself in ChakraProvider.\n * Use this when the host app may have multiple React instances (e.g. local packages in Next.js),\n * which can cause \"Cannot read properties of null (reading 'useContext')\" when using Chakra's useTheme.\n */\nexport function AutoSchedulerModalWithProvider(props: AutoSchedulerModalProps) {\n return (\n <ChakraProvider>\n <AutoSchedulerModal {...props} />\n </ChakraProvider>\n );\n}\n","\nimport type { ViolatedConstraintsPanelProps } from \"./types\";\nimport { ViolatedConstraintsPanel } from \"./ViolatedConstraintsPanel\";\nimport { ChakraProvider } from \"@chakra-ui/react\";\n\nexport function ViolatedConstraintsPanelWithProvider(props: ViolatedConstraintsPanelProps) {\n return (\n <ChakraProvider>\n <ViolatedConstraintsPanel {...props} />\n </ChakraProvider>\n );\n}\n","/**\n * Mapping of ruleId/constraintName to user-friendly display names.\n * Used for justification messages like \"Staff preferences is fully met\".\n *\n * Source: auto-scheduler solver constraint names and rules JSON.\n */\nexport const RULE_ID_FRIENDLY_NAMES: Record<string, string> = {\n // System soft constraints (format: system-{type}-soft)\n \"system-employee-preference-soft\": \"Staff preferences\",\n \"system-employee-prefer-not-time-soft\": \"Prefer-not availability\",\n \"system-no-overlapping-shifts-soft\": \"No overlapping shifts\",\n \"system-overtime-soft\": \"Expected overtime\",\n\n // Archetype soft constraints (format: {archetype}-soft)\n \"accumulator-soft\": \"Hours limit\",\n \"accumulatordays-soft\": \"Work days limit\",\n \"spacer-soft\": \"Rest between shifts\",\n \"spacerperiodic-soft\": \"Required rest period\",\n \"composition-soft\": \"Staffing ratio\",\n \"transactional-soft\": \"Policy rule\",\n \"balancer-medium\": \"Fair work distribution\",\n \"balancerovertime-medium\": \"Minimize overtime\",\n \"coverage-soft\": \"Minimum staffing\",\n \"sizing-soft\": \"Shift duration limit\",\n \"sequencer-soft\": \"Shift sequence\",\n \"optimizerminimize-soft\": \"Minimize target\",\n \"optimizermaximize-soft\": \"Maximize target\",\n\n // Rule IDs (from rules JSON)\n \"max-weekly-hours\": \"Max weekly hours\",\n \"max-daily-hours\": \"Max daily hours\",\n \"min-rest-between-shifts\": \"Min rest between shifts\",\n \"min-days-off-per-week\": \"Min days off per week\",\n \"max-work-days-per-week\": \"Max work days per week\",\n \"fair-hour-distribution\": \"Fair hour distribution\",\n \"overtime-balance\": \"Overtime balance\",\n \"labor-cost-optimization\": \"Labor cost optimization\",\n \"maximize-sales-performance\": \"Maximize sales performance\",\n \"split-shift-penalty\": \"Split shift penalty\",\n \"shift-continuity-penalty\": \"Shift continuity penalty\",\n \"manager-cashier-ratio\": \"Staffing ratio\",\n \"min-staffing\": \"Minimum staffing\",\n \"shift-duration-limits\": \"Shift duration limit\",\n \"max-consecutive-days\": \"Shift sequence\",\n \"some-transactional-rule\": \"Policy rule\",\n};\n\n/**\n * Returns a user-friendly display name for a ruleId or constraintName.\n * Falls back to humanizing the raw string (replace - with spaces, capitalize) for unknown values.\n */\nexport function getFriendlyRuleName(ruleIdOrConstraintName: string): string {\n const trimmed = ruleIdOrConstraintName?.trim();\n if (!trimmed) return \"Unknown\";\n\n const mapped = RULE_ID_FRIENDLY_NAMES[trimmed.toLocaleLowerCase()];\n if (mapped) return mapped;\n\n // Fallback: humanize (replace - with spaces, capitalize words)\n return trimmed\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n","export class RequestError extends Error {\n status: number;\n payload?: unknown;\n\n constructor(message: string, status: number, payload?: unknown) {\n super(message);\n this.name = \"RequestError\";\n this.status = status;\n this.payload = payload;\n }\n}\n\n// --- schedule solution types (matches API response from POST /api/schedule/solve) ---\n\nexport type ScheduleSolutionEmployee = {\n id: string;\n name?: string;\n position?: string;\n properties?: Record<string, unknown>;\n locationIds?: string[];\n};\n\nexport type ScheduleSolutionLocation = {\n id: string;\n timezone?: string;\n jurisdiction?: string;\n tags?: string[];\n properties?: Record<string, unknown>;\n};\n\nexport type ScheduleSolutionShift = {\n id: string;\n startDateTime?: string;\n endDateTime?: string;\n startTime?: string;\n endTime?: string;\n requiredHours?: number;\n requiredPosition?: string | null;\n requiredCount?: number;\n location?: ScheduleSolutionLocation;\n employeePreferences?: Array<{ employeeId: string; level: string }>;\n};\n\nexport type ShiftAssignmentJustification = {\n status: string; // \"SATISFIED\" | \"VIOLATED\"\n constraintName?: string;\n ruleId?: string | null;\n archetype?: string | null;\n jurisdiction?: string | null;\n type: string; // \"HARD\" | \"SOFT\"\n impact?: string;\n description?: string;\n};\n\nexport type ScheduleSolutionShiftAssignment = {\n id: number;\n shift?: ScheduleSolutionShift;\n slotIndex?: number;\n employee?: ScheduleSolutionEmployee | null;\n pinned: boolean;\n justifications?: ShiftAssignmentJustification[];\n};\n\nexport type ScheduleSolutionAvailability = {\n employeeId: string;\n type?: string;\n daysOfWeek?: string[];\n specificDates?: string[];\n startTime?: string;\n endTime?: string;\n};\n\nexport type ScheduleSolutionTimeOff = {\n employeeId: string;\n startDateTime: string;\n endDateTime: string;\n};\n\nexport type ScheduleSolutionWaiver = {\n employeeId: string;\n ruleId: string;\n expiry?: string;\n};\n\nexport type ScheduleSolutionRuleMetadata = Record<string, unknown>;\n\nexport type ScheduleSolutionRuleOverride = {\n ruleId: string;\n parameters?: Record<string, unknown>;\n};\n\nexport type ScheduleSolution = {\n employees?: ScheduleSolutionEmployee[];\n shifts?: ScheduleSolutionShift[];\n shiftAssignments?: ScheduleSolutionShiftAssignment[];\n locations?: ScheduleSolutionLocation[];\n availabilities?: ScheduleSolutionAvailability[];\n timeOffs?: ScheduleSolutionTimeOff[];\n waivers?: ScheduleSolutionWaiver[];\n ruleMetadata?: ScheduleSolutionRuleMetadata[];\n ruleOverrides?: ScheduleSolutionRuleOverride[];\n ruleIds?: string[] | null;\n demandCurve?: unknown | null;\n mode?: \"FIXED_TEMPLATE\" | \"FLEXIBLE_DEMAND\" | \"MIXED\";\n score?: string;\n};\n"],"mappings":";;;AAAA,SAAS,cAAc,gBAAgB,WAAW,WAAAA,UAAS,QAAQ,YAAAC,iBAAgC;AACnG;AAAA,EACE;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU,gBAAgB;;;AC+e5B,IAAM,0BAAN,cAAsC,MAAM;AAAA,EAEjD,YAAY,SAAoC;AAC9C,UAAM,4DAA4D;AAClE,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;;;AChgBM,cAOF,YAPE;AAZC,SAAS,QAAQ,EAAE,OAAO,GAAG,MAAM,QAAQ,GAAG,MAAM,GAAiB;AAC1E,QAAM,YAAY,UAAU;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAM,YAAY,SAAU,sBAAQ;AAAA,MACpC;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACP,GAAG;AAAA,MAEJ,8BAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA;AAAA,EACjC;AAEJ;AAEO,SAAS,UAAU,OAAgC;AACxD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ;AAAA,4BAAC,UAAK,GAAE,2EAA0E;AAAA,QAClF,oBAAC,UAAK,GAAE,mEAAkE;AAAA,QAC1E,oBAAC,UAAK,GAAE,oEAAmE;AAAA;AAAA;AAAA,EAC7E;AAEJ;AAEO,SAAS,SAAS,OAAgC;AACvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ,8BAAC,UAAK,GAAE,yMAAwM;AAAA;AAAA,EAClN;AAEJ;AAEO,SAAS,YAAY,OAAgC;AAC1D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,gBAAe;AAAA;AAAA,QACjB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA,QACA,oBAAC,YAAO,IAAG,MAAK,IAAG,QAAO,GAAE,OAAM,MAAK,gBAAe;AAAA;AAAA;AAAA,EACxD;AAEJ;AAEO,SAAS,gBAAgB,OAAgC;AAC9D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,UAAU,OAAgC;AACxD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,UAAU,OAAgC;AACxD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,GAAE;AAAA;AAAA,MACJ;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,WAAW,OAAgC;AACzD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;;;AC1JA,IAAM,mBAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,WAAW,CAAC,UAChB,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,wBAAwB,CAAC,cAAgE;AAC7F,QAAM,SAAkC,CAAC;AAEzC,SAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAhCtD;AAiCI,QAAI,QAAQ,gBAAgB,SAAS,KAAK,GAAG;AAC3C,aAAO,OAAO,QAAQ,KAAK;AAC3B;AAAA,IACF;AAEA,UAAM,iBAAgB,4BAAiB,GAAG,MAApB,YAAyB,iBAAiB,IAAI,YAAY,CAAC,MAA3D,YAAgE;AACtF,WAAO,aAAa,IAAI;AAAA,EAC1B,CAAC;AAED,SAAO;AACT;AAEA,IAAM,YAAY,CAChB,QACA,WAC4B;AAC5B,QAAM,SAAkC,EAAE,GAAG,OAAO;AAEpD,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,QAAI,SAAS,KAAK,KAAK,SAAS,OAAO,GAAG,CAAC,GAAG;AAC5C,aAAO,GAAG,IAAI,UAAU,OAAO,GAAG,GAA8B,KAAK;AACrE;AAAA,IACF;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAOO,IAAM,oBAAoB,CAC/B,UACuB;AACvB,MAAI,CAAC,SAAS,CAAC,SAAS,KAAK,GAAG;AAC9B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,qBAAqB,SAAS,MAAM,kBAAkB,IACvD,MAAM,qBACP;AAEJ,MAAI,YAAY,OAAO;AACrB,UAAM,YAAY;AAGlB,UAAM,EAAE,QAAQ,oBAAoBC,WAAU,GAAG,KAAK,IAAI;AAC1D,UAAM,iBAAgC;AAAA,MACpC,GAAI,SAAS,MAAM,IAAI,SAAS,CAAC;AAAA,MACjC,YAAY,sBAAsB,IAAI;AAAA,IACxC;AAEA,WAAO,EAAE,gBAAgB,gBAAgB,mBAAmB;AAAA,EAC9D;AAEA,QAAM,EAAE,oBAAoB,UAAU,GAAG,SAAS,IAChD;AAEF,SAAO,EAAE,gBAAgB,UAAU,gBAAgB,mBAAmB;AACxE;AAEO,IAAM,qBAAqB,CAChC,WACA,aAC4B;AAC5B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,WAAW,QAAmC;AACjE;;;ACzGO,IAAM,2BAAmD;AAAA,EAC9D,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,wBAAwB;AAC1B;AAEO,IAAM,0BAA0B;AAAA,EACrC,EAAE,IAAI,oBAAoB,MAAM,uBAAuB;AAAA,EACvD,EAAE,IAAI,mBAAmB,MAAM,sBAAsB;AAAA,EACrD,EAAE,IAAI,2BAA2B,MAAM,8BAA8B;AAAA,EACrE,EAAE,IAAI,0BAA0B,MAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAKrE;AAEO,IAAM,6BAA6B;AAAA,EACxC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAsBO,IAAM,gBAA4D;AAAA,EACvE,SAAS;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,WACE;AAAA,IACF,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,EACd;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB,kBAAkB;AAAA,IAChB,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,IACf,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WACE;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACX,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,wBAAwB,CAAC;AAAA,EACzB,yBAAyB;AAAA,IACvB,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,sBAAsB;AAAA,IACpB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,sBAAsB;AAAA,IACpB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA,EACA,4BAA4B;AAAA,IAC1B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,+BAA+B;AAAA,IAC7B,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,WACE;AAAA,EACJ;AAAA,EACA,0BAA0B;AAAA,IACxB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,4BAA4B;AAAA,IAC1B,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,gCAAgC;AAAA,IAC9B,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,0BAA0B;AAAA,IACxB,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,2BAA2B;AAAA,IACzB,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,GAAG;AAAA,IACH,IAAI;AAAA,EACN;AAAA,EACA,qBAAqB,CAAC;AAAA,EACtB,sBAAsB;AAAA,IACpB,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,mBAAmB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,sBAAsB;AAAA,IACpB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,4BAA4B;AAAA,IAC1B,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,WACE;AAAA,EACJ;AAAA,EACA,yBAAyB;AAAA,IACvB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,uBAAuB;AAAA,IACrB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,wBAAwB;AAAA,IACtB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,6BAA6B;AAAA,IAC3B,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,uBAAuB;AAAA,IACrB,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,wBAAwB;AAAA,IACtB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,wBAAwB;AAAA,IACtB,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,GAAG;AAAA,IACH,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,EAC3B;AAAA,EACA,qBAAqB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,IAAI;AAAA,EACN;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB,WAAW,CAAC;AAAA,EACZ,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA,EACA,iBAAiB;AAAA,IACf,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB,eAAe;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,kBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,iBAAiB;AAAA,IACf,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,IACjB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,uBAAuB;AAAA,IACrB,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EACA,qBAAqB;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,EACN;AAAA,EACA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,wBAAwB;AAAA,IACtB,YAAY;AAAA,EACd;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,sBAAsB;AAAA,IACpB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,IAAI;AAAA,EACN;AAAA,EACA,qBAAqB,CAAC;AAAA,EACtB,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,uBAAuB;AAAA,IACrB,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAAA,EACA,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,gBAAgB;AAAA,IAChB,KAAK;AAAA,EACP;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,gBAAgB;AAAA,IAChB,KAAK;AAAA,EACP;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,oCAAoC;AAAA,IAClC,YAAY;AAAA,EACd;AACF;AAEO,IAAM,iBAA8D;AAAA,EACzE;AAAA,IACE,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IAAE,OAAO;AAAA,IACP,UAAU;AAAA,EACX;AAAA,EACD;AAAA,IAAE,OAAO;AAAA,IACP,UAAU;AAAA,EACX;AAAA,EACD,EAAE,OAAO,iCAAiC,UAAU,uEAAuE;AAAA,EAC3H,EAAE,OAAO,sBAAsB;AACjC;AAEO,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,wBAAwB;AAK9B,IAAM,wBAAmD;AAAA,EAC9D,qBAAqB;AAAA,IACnB,EAAE,OAAO,wBAAwB,QAAQ,6CAA6C;AAAA,EACxF;AAAA,EACA,kBAAkB,CAAC;AACrB;;;AC5oBO,IAAM,cAAc,CAACC,gBAA2D,eAA8F;AAAA,EACnL,SAAS,EAAE,GAAGA,eAAc,SAAS,GAAG,uCAAW,QAAQ;AAAA,EAC3D,SAAS,EAAE,GAAGA,eAAc,SAAS,GAAG,uCAAW,QAAQ;AAAA,EAC3D,QAAQ,EAAE,GAAGA,eAAc,QAAQ,GAAG,uCAAW,OAAO;AAAA,EACxD,OAAO,EAAE,GAAGA,eAAc,OAAO,GAAG,uCAAW,MAAM;AAAA,EACrD,aAAa,EAAE,GAAGA,eAAc,aAAa,GAAG,uCAAW,YAAY;AAAA,EACvE,MAAM,EAAE,GAAGA,eAAc,MAAM,GAAG,uCAAW,KAAK;AAAA,EAClD,QAAQ,EAAE,GAAGA,eAAc,QAAQ,GAAG,uCAAW,OAAO;AAAA,EACxD,YAAY,EAAE,GAAGA,eAAc,YAAY,GAAG,uCAAW,WAAW;AAAA,EACpE,aAAa,EAAE,GAAGA,eAAc,aAAa,GAAG,uCAAW,YAAY;AAAA,EACvE,YAAY,EAAE,GAAGA,eAAc,YAAY,GAAG,uCAAW,WAAW;AAAA,EACpE,iBAAiB,EAAE,GAAGA,eAAc,iBAAiB,GAAG,uCAAW,gBAAgB;AAAA,EACnF,kBAAkB,EAAE,GAAGA,eAAc,kBAAkB,GAAG,uCAAW,iBAAiB;AAAA,EACtF,eAAe,EAAE,GAAGA,eAAc,eAAe,GAAG,uCAAW,cAAc;AAAA,EAC7E,eAAe,EAAE,GAAGA,eAAc,eAAe,GAAG,uCAAW,cAAc;AAAA,EAC7E,kBAAkB,EAAE,GAAGA,eAAc,kBAAkB,GAAG,uCAAW,iBAAiB;AAAA,EACtF,iBAAiB,EAAE,GAAGA,eAAc,iBAAiB,GAAG,uCAAW,gBAAgB;AAAA,EACnF,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gBAAgB,EAAE,GAAGA,eAAc,gBAAgB,GAAG,uCAAW,eAAe;AAAA,EAChF,aAAa,EAAE,GAAGA,eAAc,aAAa,GAAG,uCAAW,YAAY;AAAA,EACvE,WAAW,EAAE,GAAGA,eAAc,WAAW,GAAG,uCAAW,UAAU;AAAA,EACjE,aAAa,EAAE,GAAGA,eAAc,aAAa,GAAG,uCAAW,YAAY;AAAA,EACvE,gBAAgB,EAAE,GAAGA,eAAc,gBAAgB,GAAG,uCAAW,eAAe;AAAA,EAChF,oBAAoB,EAAE,GAAGA,eAAc,oBAAoB,GAAG,uCAAW,mBAAmB;AAAA,EAC5F,oBAAoB;AAAA,IAClB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,yBAAyB;AAAA,IACvB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,sBAAsB;AAAA,IACpB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,sBAAsB;AAAA,IACpB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,yBAAyB;AAAA,IACvB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,4BAA4B;AAAA,IAC1B,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,+BAA+B;AAAA,IAC7B,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,0BAA0B;AAAA,IACxB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,4BAA4B;AAAA,IAC1B,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gCAAgC;AAAA,IAC9B,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,0BAA0B;AAAA,IACxB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,2BAA2B;AAAA,IACzB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,2BAA2B;AAAA,IACzB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,sBAAsB;AAAA,IACpB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,mBAAmB;AAAA,IACjB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,mBAAmB;AAAA,IACjB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,sBAAsB;AAAA,IACpB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,yBAAyB;AAAA,IACvB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,4BAA4B;AAAA,IAC1B,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,yBAAyB;AAAA,IACvB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,yBAAyB;AAAA,IACvB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,6BAA6B;AAAA,IAC3B,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,oBAAoB;AAAA,IAClB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,IACZ,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,IACd,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,IACT,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,IACd,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,IACZ,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,iBAAiB;AAAA,IACf,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,IACd,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,IACT,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,iBAAiB;AAAA,IACf,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,IACb,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,IAChB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,iBAAiB;AAAA,IACf,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,IACZ,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,IACd,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,oBAAoB;AAAA,IAClB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,iBAAiB;AAAA,IACf,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,IACb,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,IACd,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,mBAAmB;AAAA,IACjB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,IAChB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,IACb,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,oBAAoB;AAAA,IAClB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,wBAAwB;AAAA,IACtB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,iBAAiB;AAAA,IACf,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,oBAAoB;AAAA,IAClB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,sBAAsB;AAAA,IACpB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,IACZ,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AAAA,EACA,QAAQ,EAAE,GAAGA,eAAc,QAAQ,GAAG,uCAAW,OAAO;AAAA,EACxD,cAAc,EAAE,GAAGA,eAAc,cAAc,GAAG,uCAAW,aAAa;AAAA,EAC1E,eAAe,EAAE,GAAGA,eAAc,eAAe,GAAG,uCAAW,cAAc;AAAA,EAC7E,oCAAoC;AAAA,IAClC,GAAGA,eAAc;AAAA,IACjB,GAAG,uCAAW;AAAA,EAChB;AACF;;;ACpUO,IAAM,wBAAgD;AAAA,EAC3D,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,mBAAmB;AACrB;AAEO,IAAM,wBAAgD,OAAO;AAAA,EAClE,OAAO,QAAQ,qBAAqB,EAAE,IAAI,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;AAC5E;AAEO,SAAS,gBAAgB,YAAwC;AACtE,SAAO,sBAAsB,UAAU;AACzC;;;ACbO,IAAM,mCAAmC;AAEzC,IAAM,qCAAqC;AAElD,IAAM,4BAA4B,oBAAI,IAAI,CAAC,kBAAkB,qBAAqB,CAAC;AAEnF,SAAS,uBACP,eACA,kBACA,qBACyB;AAf3B;AAgBE,QAAM,SAAkC,CAAC;AAEzC,UAAQ,eAAe;AAAA,IACrB,KAAK,oBAAoB;AACvB,YAAM,SAAQ,sBAAiB,kBAAkB,MAAnC,mBAAsC;AACpD,UAAI,OAAO;AACT,cAAM,eAAe,OAAO,KAAK,IAAI;AACrC,YAAI,OAAO,SAAS,YAAY,KAAK,gBAAgB,GAAG;AACtD,iBAAO,eAAe;AAAA,QACxB;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,SAAQ,sBAAiB,iBAAiB,MAAlC,mBAAqC;AACnD,UAAI,OAAO;AACT,cAAM,eAAe,OAAO,KAAK,IAAI;AACrC,YAAI,OAAO,SAAS,YAAY,KAAK,gBAAgB,GAAG;AACtD,iBAAO,eAAe;AAAA,QACxB;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,2BAA2B;AAC9B,YAAM,SAAQ,sBAAiB,yBAAyB,MAA1C,mBAA6C;AAC3D,UAAI,OAAO;AACT,cAAM,gBAAgB,OAAO,KAAK,IAAI;AACtC,YAAI,OAAO,SAAS,aAAa,KAAK,iBAAiB,GAAG;AACxD,iBAAO,gBAAgB;AAAA,QACzB;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,0BAA0B;AAC7B,YAAM,SAAQ,sBAAiB,wBAAwB,MAAzC,mBAA4C;AAC1D,UAAI,OAAO;AACT,cAAM,cAAc,OAAO,KAAK;AAChC,YAAI,OAAO,SAAS,WAAW,KAAK,eAAe,KAAK,eAAe,GAAG;AACxE,iBAAO,YAAY;AAAA,QACrB;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,uBACA,kBACA,yBACA,oBACS;AAvEX;AAwEE,aAAW,MAAM,uBAAuB;AACtC,UAAM,SAAQ,sBAAiB,EAAE,MAAnB,mBAAsB;AACpC,QAAI,SAAS,OAAO,SAAS,OAAO,KAAK,CAAC,EAAG,QAAO;AAAA,EACtD;AACA,aAAW,MAAM,yBAAyB;AACxC,UAAM,UAAS,wBAAmB,GAAG,EAAE,eAAe,MAAvC,mBAA0C;AACzD,QAAI,UAAU,OAAO,SAAS,OAAO,MAAM,CAAC,EAAG,QAAO;AACtD,QAAI,OAAO,0BAA0B;AACnC,YACE,wBAAmB,sCAAsC,MAAzD,mBAA4D,aAC5D,wBAAmB,+BAA+B,MAAlD,mBAAqD,SACrD;AACA,eAAO;AAAA,MACT;AAAA,IACF,WAAW,OAAO,qBAAqB;AACrC,YACE,wBAAmB,oCAAoC,MAAvD,mBAA0D,aAC1D,wBAAmB,0BAA0B,MAA7C,mBAAgD,QAChD,QAAO;AAAA,IACX,WAAW,OAAO,yBAAyB,OAAO,kBAAkB;AAElE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AASA,SAAS,oBAAoB,SAAmB,WAAyB;AACvE,MAAI,CAAC,QAAQ,SAAS,SAAS,GAAG;AAChC,YAAQ,KAAK,SAAS;AAAA,EACxB;AACF;AAMO,SAAS,kBACd,uBACA,kBACA,yBACA,oBACA,WAA+B,CAAC,GAC6B;AAC7D,QAAM,qBAAqB;AAAA,IACzB,GAAG,sBAAsB,IAAI,eAAe;AAAA,IAC5C,GAAG,wBAAwB,IAAI,eAAe;AAAA,EAChD,EAAE,OAAO,CAAC,OAAqB,QAAQ,EAAE,CAAC;AAE1C,QAAM,mBAAmB,wBAAwB,KAAK,CAAC,OAAO,0BAA0B,IAAI,EAAE,CAAC;AAC/F,QAAM,wBAAwB,wBAAwB,SAAS,gBAAgB;AAE/E,MAAI,SAAS,yBAAyB,kBAAkB;AACtD,wBAAoB,oBAAoB,gCAAgC;AAAA,EAC1E;AACA,MAAI,SAAS,2BAA2B,uBAAuB;AAC7D,wBAAoB,oBAAoB,kCAAkC;AAAA,EAC5E;AAEA,MAAI,mBAAmB,WAAW,GAAG;AACnC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO,EAAE,SAAS,mBAAmB;AAAA,EACvC;AAEA,QAAM,gBAAqC,mBAAmB,IAAI,CAAC,WAAW;AAzJhF;AA0JI,UAAM,SAAS,uBAAuB,QAAQ,kBAAkB,kBAAkB;AAClF,UAAM,OAAO,sBAAsB,MAAM;AACzC,UAAM,YAAY,QAAO,wBAAmB,GAAG,IAAI,eAAe,MAAzC,mBAA4C,SAAS;AAC9E,UAAM,eAAe,YAAY,OAAO,SAAS,IAAI;AACrD,QAAI,gBAAgB,OAAO,SAAS,YAAY,KAAK,gBAAgB,GAAG;AACtE,aAAO,eAAe;AAAA,IACxB;AACA,WAAO;AAAA,MACL;AAAA,MACA,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,YAAY,OAAO,IAAI,CAAC;AAAA,IACjE;AAAA,EACF,CAAC;AAED,SAAO,EAAE,SAAS,oBAAoB,cAAc;AACtD;AAEA,SAAS,WACP,OACA,4BAC8B;AA7KhC;AA8KE,QAAM,gBACJ,mBAAmB,QAAS,MAAoC,gBAAgB,MAAM;AACxF,QAAM,cACJ,iBAAiB,QAAS,MAAkC,cAAc,MAAM;AAClF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAI,MAAM,aAAa,EAAE,YAAY,OAAO,MAAM,UAAU,EAAE,IAAI,CAAC;AAAA,IACnE,kBAAkB,MAAM,oBAAoB;AAAA,IAC5C,gBAAe,WAAM,kBAAN,YAAuB;AAAA,IACtC,UAAU,MAAM,WACZ;AAAA,MACE,IAAI,OAAO,MAAM,SAAS,EAAE;AAAA,MAC5B,UAAU,cAAc,MAAM,WAAY,MAAM,SAAmC,WAAW;AAAA,MAC9F,MAAM,UAAU,MAAM,WAAY,MAAM,SAAiC,OAAO;AAAA,IAClF,IACA;AAAA,IACJ,GAAI,8BAA8B,MAAM,sBACpC;AAAA,MACE,qBAAqB,MAAM,oBAAoB,IAAI,CAAC,OAAO;AAAA,QACzD,YAAY,EAAE;AAAA,QACd,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ,IACA,CAAC;AAAA,EACP;AACF;AAEA,SAAS,cAAc,UAAqD;AA3M5E;AA4ME,SAAO;AAAA,IACL,IAAI,OAAO,SAAS,EAAE;AAAA,IACtB,OAAM,cAAS,SAAT,YAAiB;AAAA,IACvB,WAAU,cAAS,aAAT,YAAqB;AAAA,IAC/B,cAAa,cAAS,gBAAT,YAAwB;AAAA,IACrC,YAAY,SAAS,aAAc,SAAS,aAAyC;AAAA,EACvF;AACF;AAEA,SAAS,cAAc,UAA2D;AArNlF;AAsNE,SAAO;AAAA,IACL,IAAI,OAAO,SAAS,EAAE;AAAA,IACtB,WAAU,cAAS,aAAT,YAAqB;AAAA,IAC/B,eAAc,cAAS,iBAAT,YAAyB;AAAA,IACvC,MAAM,UAAU,WAAY,SAAiC,OAAO;AAAA,IACpE,YAAY,SAAS,aAAa,SAAS,aAAa;AAAA,EAC1D;AACF;AAEA,SAAS,0BAA0B,UAA6B;AA/NhE;AAgOE,QAAM,SAAQ,cAAS,eAAT,mBAAqB;AACnC,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ;AACxE;AAEA,SAAS,iCACP,UACA,qBACS;AAvOX;AAwOE,QAAM,OAAM,cAAS,gBAAT,YAAwB,CAAC;AACrC,SAAO,IAAI,KAAK,CAAC,OAAO,oBAAoB,SAAS,OAAO,EAAE,CAAC,CAAC;AAClE;AAEA,SAAS,qCACP,WACA,qBACS;AACT,SAAO,UAAU;AAAA,IACf,CAAC,aACC,iCAAiC,UAAU,mBAAmB,KAC9D,0BAA0B,QAAQ;AAAA,EACtC;AACF;AAoBO,SAAS,qBAAqB,OAAmD;AACtF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,eAAe,oBAAI,IAA4B;AACrD,aAAW,KAAK,eAAe;AAC7B,eAAW,OAAO,EAAE,WAAW;AAC7B,mBAAa,IAAI,IAAI,IAAI,GAAG;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,oBAAoB,oBACvB,IAAI,CAAC,OAAO,aAAa,IAAI,EAAE,CAAC,EAChC,OAAO,CAAC,QAA+B,QAAQ,GAAG,CAAC;AAGtD,QAAM,mBAAmB,WAAW;AAAA,IAAO,CAAC,UAAO;AAtSrD;AAuSI,iCAAoB,SAAS,QAAO,WAAM,aAAN,mBAAgB,EAAE,CAAC;AAAA;AAAA,EACzD;AAGA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,QAAM,yBAAyB,4CAAmB,CAAC,GAAG;AAAA,IAAO,CAAC,UAC5D,oBAAoB,SAAS,OAAO,MAAM,UAAU,CAAC;AAAA,EACvD;AACA,QAAM,0BAA0B,sBAAsB,SAAS;AAE/D,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,uBAAuB,wBAAwB;AAAA,EACnD;AAEA,QAAM,6BAA6B,wBAAwB,SAAS,mBAAmB;AAIvF,QAAM,SAAW,QAAQ,2BAA2B,wBAAwB,SAAS,CAAC;AACtF,QAAM,UAAW,QAAQ,yBAAyB,sBAAsB,SAAS,CAAC;AAClF,QAAM,WAAW,UAAU;AAI3B,MAAI,UAAU,CAAC,gBAAgB;AAC7B,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,QAAM,oBACJ,2BAA2B,wBAAwB,SAAS,gBAAgB;AAE9E,SAAO;AAAA,IACL,WAAW,UAAU,IAAI,aAAa;AAAA,IACtC,QAAQ,iBAAiB,IAAI,CAAC,UAAU,WAAW,OAAO,0BAA0B,CAAC;AAAA,IACrF,WAAW,kBAAkB,IAAI,aAAa;AAAA,IAC9C,GAAI,YAAY,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IACtD,GAAG;AAAA,IACH,GAAI,oBAAoB,EAAE,iBAAiB,sBAAsB,IAAI,CAAC;AAAA,IACtE,GAAI,SAAU,EAAE,wBAAwB,IAAK,CAAC;AAAA,IAC9C,GAAI,UAAU,EAAE,sBAAsB,IAAO,CAAC;AAAA,IAC9C,GAAI,YAAY,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,EACzD;AACF;;;ACzVA,OAAO,WAAW;AAIlB,IAAM,gBAAgB,MAAM,OAAO;AAAA,EACjC,SAAS,EAAE,gBAAgB,mBAAmB;AAChD,CAAC;AAaD,eAAsB,SACpB,SACA,SACiB;AAtBnB;AAuBE,QAAM,WAAW,MAAM,cAAc,IAAI,SAAS;AAAA,IAChD,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B,CAAC;AACD,UAAO,cAAS,SAAT,mBAAe;AACxB;AAMA,eAAsB,eACpB,SACA,SACA,SAC4B;AAC5B,QAAM,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAC9C,QAAM,UAAkC,CAAC;AACzC,MAAI,mCAAS,eAAe;AAC1B,YAAQ,gBAAgB,QAAQ;AAAA,EAClC;AACA,QAAM,WAAW,MAAM,cAAc;AAAA,IACnC,iBAAiB,GAAG,YAAY,6BAA6B,OAAO;AAAA,IACpE;AAAA,IACA,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU,OAAU;AAAA,EACnE;AACA,SAAO,SAAS;AAClB;AAMA,eAAsB,aACpB,SACA,OACA,SAC4B;AAC5B,QAAM,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAC9C,QAAM,UAAkC,CAAC;AACzC,MAAI,mCAAS,eAAe;AAC1B,YAAQ,gBAAgB,QAAQ;AAAA,EAClC;AACA,QAAM,WAAW,MAAM,cAAc;AAAA,IACnC,GAAG,YAAY,wBAAwB,KAAK;AAAA,IAC5C,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU,OAAU;AAAA,EACnE;AACA,SAAO,SAAS;AAClB;AAOA,eAAsB,aACpB,SACA,OACA,SAC2B;AAC3B,QAAM,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAC9C,QAAM,UAAkC,CAAC;AACzC,MAAI,mCAAS,eAAe;AAC1B,YAAQ,gBAAgB,QAAQ;AAAA,EAClC;AACA,QAAM,WAAW,MAAM,cAAc;AAAA,IACnC,GAAG,YAAY,wBAAwB,KAAK;AAAA,IAC5C,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU,OAAU;AAAA,EACnE;AACA,SAAO,SAAS;AAClB;AAKA,eAAsB,eACpB,SACA,OACA,SACuC;AACvC,QAAM,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAC9C,QAAM,UAAkC,CAAC;AACzC,MAAI,mCAAS,eAAe;AAC1B,YAAQ,gBAAgB,QAAQ;AAAA,EAClC;AACA,QAAM,WAAW,MAAM,cAAc;AAAA,IACnC,GAAG,YAAY,0BAA0B,KAAK;AAAA,IAC9C,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU,OAAU;AAAA,EACnE;AACA,SAAO,SAAS;AAClB;AAwBA,SAAS,iBAAiB,KAAa,SAAwC;AAC7E,MAAI,EAAC,mCAAS,qBAAoB,EAAC,mCAAS,iBAAgB;AAC1D,WAAO;AAAA,EACT;AACA,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ;AAAA,EACxB,CAAC;AACD,SAAO,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC;AACpC;;;AC5IA,IAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,wBAAwB,MAAwB;AAC9D,QAAM,UAAU,6BAAM;AACtB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,4BAA4B,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AAC5E;AAEA,IAAM,6BAA+D;AAAA,EACnE,0BAA0B;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,oCAAoC;AAAA,IAClC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,yCAAyC;AAAA,IACvC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,uCAAuC;AAAA,IACrC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,iCAAiC;AAAA,IAC/B,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,qCAAqC;AAAA,IACnC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,mBAAqD;AAAA,EACzD,oBAAoB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,2BAA2B;AAAA,IACzB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,0BAA0B;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,0BAA0B;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,2BAA2B;AAAA,IACzB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,8BAA8B;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,gCAAgC;AAAA,IAC9B,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,4BAA4B;AAAA,IAC1B,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,2BAA2B;AAAA,IACzB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,2BAA6D;AAAA,EACjE,wBAAwB;AAAA,IACtB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,sBAAsB;AAAA,IACpB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,0BAA0B;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,0BAA0B;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,8BAAgE;AAAA,EACpE,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,mBAAqC;AAAA,EACzC,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,2BAA2B,gBAAkE;AACpG,MAAI,EAAC,iDAAgB,QAAQ,QAAO,CAAC;AAErC,MAAI,OAAO,eAAe,KAAK;AAC/B,aAAW,UAAU,CAAC,QAAQ,UAAU,MAAM,GAAG;AAC/C,QAAI,KAAK,SAAS,IAAI,MAAM,EAAE,GAAG;AAC/B,aAAO,KAAK,MAAM,GAAG,EAAE,OAAO,SAAS,EAAE;AACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,KAAK,YAAY,GAAG;AACrC,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,MACL,QAAQ,KAAK,MAAM,GAAG,QAAQ;AAAA,MAC9B,WAAW,KAAK,MAAM,WAAW,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,KAAK;AAC3B;AAEA,SAAS,qBAAqB,QAA+C;AAC3E,MAAI,EAAC,iCAAQ,QAAQ,QAAO;AAC5B,SAAO,iBAAiB,OAAO,KAAK,CAAC;AACvC;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,KAAK,QAAQ,wBAAwB,EAAE;AAChD;AAEA,SAAS,6BAA6B,gBAAuD;AAC3F,MAAI,EAAC,iDAAgB,QAAQ,QAAO;AAEpC,QAAM,UAAU,eAAe,KAAK;AACpC,QAAM,QAAQ,yBAAyB,OAAO;AAC9C,MAAI,MAAO,QAAO;AAGlB,QAAM,mBAAmB,oBAAoB,OAAO;AACpD,QAAM,eAAe,qBAAqB,gBAAgB;AAC1D,MAAI,aAAc,QAAO;AAEzB,QAAM,SAAS,2BAA2B,OAAO;AACjD,MAAI,OAAO,QAAQ;AACjB,UAAM,qBAAqB,qBAAqB,OAAO,MAAM;AAC7D,QAAI,mBAAoB,QAAO;AAAA,EACjC;AAEA,MAAI,OAAO,aAAa,OAAO,aAAa,6BAA6B;AACvE,WAAO,4BAA4B,OAAO,SAAS;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,aAAoD;AAClF,MAAI,EAAC,2CAAa,WAAU,wBAAwB,WAAW,GAAG;AAChE,WAAO;AAAA,EACT;AACA,SAAO,EAAE,OAAO,YAAY,KAAK,GAAG,QAAQ,YAAY,KAAK,EAAE;AACjE;AAEO,SAAS,2BACd,gBACA,aACkB;AAlTpB;AAmTE,MAAI,kBAAkB,kBAAkB,4BAA4B;AAClE,WAAO,2BAA2B,cAAc;AAAA,EAClD;AAEA,QAAM,qBAAqB,6BAA6B,cAAc;AACtE,MAAI,mBAAoB,QAAO;AAE/B,UAAO,4BAAuB,WAAW,MAAlC,YAAuC;AAChD;AAEO,SAAS,6BACd,QACA,gBACA,aACA,WACkB;AAlUpB;AAmUE,QAAM,aAAa,qBAAqB,MAAM;AAC9C,MAAI,WAAY,QAAO;AAEvB,QAAM,qBAAqB,6BAA6B,cAAc;AACtE,MAAI,mBAAoB,QAAO;AAE/B,OAAI,uCAAW,WAAU,UAAU,KAAK,KAAK,6BAA6B;AACxE,WAAO,4BAA4B,UAAU,KAAK,CAAC;AAAA,EACrD;AAEA,UAAO,4BAAuB,WAAW,MAAlC,YAAuC;AAChD;;;ACnUA,SAAS,8BACP,QACA,gBAC8B;AAC9B,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,SAAS,eAAe,MAAM;AACpC,MAAI,OAAQ,QAAO;AAEnB,QAAM,WAAW,sBAAsB,MAAM;AAC7C,MAAI,UAAU;AACZ,WAAO,eAAe,QAAQ;AAAA,EAChC;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,YACA,SACA,gBAC2B;AAhC7B;AAiCE,QAAM,iBAAiB,WAAW,OAAO,CAAC,MAAM,EAAE,oBAAoB,IAAI;AAE1E,QAAM,aAAa,oBAAI,IAAY;AACnC,QAAM,sBAAgE,CAAC;AAEvE,aAAW,KAAK,gBAAgB;AAC9B,UAAM,YAAY,EAAE,UAAU,QAAQ,EAAE,WAAW,UAAa,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM;AAE5F,UAAM,MAAM,aACP,mCAA8B,EAAE,QAAS,cAAc,MAAvD,YACD,6BAA6B,EAAE,QAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,IACpF,2BAA2B,EAAE,gBAAgB,EAAE,WAAW;AAE9D,QAAI,CAAC,WAAW,IAAI,IAAI,KAAK,GAAG;AAC9B,iBAAW,IAAI,IAAI,KAAK;AACxB,0BAAoB,KAAK,GAAG;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,SAAoC;AAAA,IACxC;AAAA,IACA,kBAAkB,CAAC;AAAA,EACrB;AAEA,MAAI,oBAAoB,WAAW,GAAG;AACpC,UAAM,eAAc,mCAAS,WAAU,CAAC,wBAAwB,OAAO,IAAI,QAAQ,KAAK,IAAI;AAC5F,WAAO,sBAAsB;AAAA,MAC3B;AAAA,QACE,OAAO;AAAA,QACP,QAAQ,oCAAe;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACpEA,SAAS,aAAa,SAAS,gBAAgB;AAC/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAOC,YAAW;AAoHN,gBAAAC,MAEF,QAAAC,aAFE;AA9GZ,IAAM,gBAAgB;AACtB,IAAM,mBACJ;AAEK,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AACpE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA0B,IAAI;AAC5E,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAS,KAAK;AAC9E,QAAM,CAAC,2BAA2B,4BAA4B,IAAI,SAAS,KAAK;AAChF,QAAM,CAAC,2BAA2B,4BAA4B,IAAI,SAAS,sBAAsB;AAEjG,QAAM,SAAS,QAAQ,MAAM;AAC3B,QAAI,WAAY,QAAO;AACvB,WAAO,YAAY,eAAe,cAAc;AAAA,EAClD,GAAG,CAAC,YAAY,cAAc,CAAC;AAE/B,QAAM,0BACJ,QAAQ,oCAAoC,KAC5C,QAAQ,oBAAoB,qBAAqB;AAEnD,QAAM,qBAAqB,oBAAoB,iBAAiB,SAAS;AACzE,QAAM,4BAA4B,2BAA2B;AAE7D,QAAM,yBACJ,oBAAoB,OAAO,kBAAkB,oBAAoB;AACnE,QAAM,qBAAqB,uBAAuB,SAAS;AAE3D,QAAM,8BAA8B,YAAY,YAAY;AAC1D,QAAI,qBAAqB;AACvB,6BAAuB,KAAK;AAC5B;AAAA,IACF;AAEA,QAAI,oBAAoB,MAAM;AAC5B,6BAAuB,IAAI;AAC3B;AAAA,IACF;AAEA,QAAI,CAAC,yBAAyB;AAC5B;AAAA,IACF;AAEA,UAAM,UAAU,oBAAoB;AACpC,gCAA4B,IAAI;AAChC,QAAI;AACF,YAAM,cAAc,MAAMC,OAAM;AAAA,QAC9B,qCAAsC;AAAA,QACtC;AAAA,QACA;AAAA,UACE,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,GAAG,qCAAsC;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AACA,YAAM,EAAE,SAAS,MAAM,IAAI,IAAI,YAAY;AAC3C,YAAM,EAAE,WAAW,iBAAAC,iBAAgB,IAAI,sBAAQ,CAAC;AAEhD,UAAI,CAAC,SAAS;AACZ,cAAM,WAAW,OAAO;AACxB,iDAAa;AACb,YAAI,WAAW;AACb,uCAA6B,IAAI;AACjC,uCAA6B,qBAAqB;AAAA,QACpD;AAEA;AAAA,MACF;AAGA,6BAAuB,IAAI;AAC3B,YAAM,yBAAyBA;AAE/B,UAAI,wBAAwB;AAC1B,2BAAmB,uBAAuB,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;AAAA,MACxE,OAAO;AACL,2BAAmB,CAAC,CAAC;AAAA,MACvB;AAAA,IACF,SAAS,QAAQ;AACf,cAAQ,MAAM,+DAA+D,MAAM;AACnF,yBAAmB,CAAC,CAAC;AAAA,IACvB,UAAE;AACA,kCAA4B,KAAK;AAAA,IACnC;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,gBAAAF,MAAC,OAAI,IAAI,OAAO,gBACd;AAAA,oBAAAA,MAAC,UAAO,IAAI,OAAO,oBACjB;AAAA,sBAAAA,MAAC,UAAO,IAAI,OAAO,iBACjB;AAAA,wBAAAD,KAAC,OAAI,IAAI,OAAO,eACd,0BAAAA,KAAC,eAAY,GACf;AAAA,QACA,gBAAAC,MAAC,OACC;AAAA,0BAAAD,KAAC,QAAK,IAAI,OAAO,gBAAiB,iBAAM;AAAA,UACxC,gBAAAA,KAAC,QAAK,IAAI,OAAO,mBAAoB,oBAAS;AAAA,WAChD;AAAA,SACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAY,aAAa,aAAa;AAAA,UACtC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,MACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,OAAO;AAAA,cACX,WAAW,aAAa,mBAAmB;AAAA,cAE3C,0BAAAA,KAAC,mBAAgB;AAAA;AAAA,UACnB;AAAA,UAEF,SAAS,MAAM,cAAc,CAAC,SAAS,CAAC,IAAI;AAAA,UAC5C,IAAI,OAAO;AAAA;AAAA,MACb;AAAA,OACF;AAAA,IACC,aACC,gBAAAC,MAAC,SAAM,SAAQ,OAAM,IAAI,OAAO,kBAC9B;AAAA,sBAAAD,KAAC,SAAM,SAAQ,OACZ,8BAAoB,oBAAoB,IAAI,CAAC,YAAY,UACxD,gBAAAC,MAAC,OAAyC,IAAI,OAAO,eACnD;AAAA,wBAAAD,KAAC,QAAK,IAAI,OAAO,oBAAqB,qBAAW,OAAM;AAAA,QACvD,gBAAAC,MAAC,UAAO,SAAQ,OAAM,IAAI,OAAO,wBAC/B;AAAA,0BAAAD,KAAC,OAAI,IAAI,OAAO,iBACd,0BAAAA,KAAC,WAAQ,MAAM,GAAG,GACpB;AAAA,UACA,gBAAAA,KAAC,QAAK,IAAI,OAAO,qBAAsB,qBAAW,QAAO;AAAA,WAC3D;AAAA,WAPQ,GAAG,WAAW,KAAK,IAAI,KAAK,EAQtC,CACD,GACH;AAAA,MACC,uBAAuB,qBACtB,gBAAAC,MAAC,OAAI,IAAI,OAAO,oBACd;AAAA,wBAAAD,KAAC,QAAK,IAAI,OAAO,sBAAsB,+BAAiB;AAAA,QACxD,gBAAAA,KAAC,SAAM,SAAQ,OAAM,IAAI,OAAO,qBAC7B,iCAAuB,IAAI,CAAC,KAAK,UAChC,gBAAAC,MAAC,UAA+B,SAAQ,OACtC;AAAA,0BAAAD,KAAC,OAAI,IAAI,OAAO,uBACd,0BAAAA,KAAC,WAAQ,MAAM,GAAG,GACpB;AAAA,UACA,gBAAAA,KAAC,QAAK,IAAI,OAAO,qBAAsB,eAAI;AAAA,aAJhC,GAAG,GAAG,IAAI,KAAK,EAK5B,CACD,GACH;AAAA,SACF,IACE;AAAA,MACJ,gBAAAC,MAAC,UAAO,SAAQ,OAAM,UAAS,QAC5B;AAAA,oCACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,YAAY,4BAA4B;AAAA,YACxC,IAAI,EAAE,GAAG,OAAO,uBAAuB,UAAU,QAAQ;AAAA,YAExD,qCACC,gBAAAA,KAAC,WAAQ,MAAK,MAAK,WAAU,OAAM,IAEnC,sBAAsB,yBAAyB;AAAA;AAAA,QAEnD,IACE;AAAA,QACH,uBAAuB,wBAAwB,yBAC9C,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,IAAI,EAAE,GAAG,OAAO,uBAAuB,GAAG,OAAO,mCAAmC;AAAA,YAEnF;AAAA;AAAA,QACH,IACE;AAAA,SACN;AAAA,OACF,IACE;AAAA,KACN;AAEJ;;;ACjNA,SAAS,iBAAiB,KAAmB;AAC3C,QAAM,IAAI,4BAA4B,KAAK,OAAO,GAAG,EAAE,KAAK,CAAC;AAC7D,MAAI,CAAC,GAAG;AACN,WAAO,oBAAI,KAAK,GAAG;AAAA,EACrB;AACA,SAAO,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9D;AAEA,SAAS,kBAAkB,GAAiB;AAC1C,QAAM,IAAI,EAAE,YAAY;AACxB,QAAM,KAAK,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACnD,QAAM,KAAK,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC9C,SAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE;AACzB;AAGO,SAAS,oCAAoC,cAAgC;AAClF,QAAM,OAAO,iBAAiB,YAAY;AAC1C,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,CAAC;AAC1C,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,IAAI,CAAC;AAC1E,QAAI,KAAK,kBAAkB,CAAC,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AAGO,SAAS,wBAAwB,KAAqB;AA7B7D;AA8BE,QAAM,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AACxD,QAAM,IAAI,iBAAiB,GAAG;AAC9B,MAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AACtC,UAAO,YAAO,EAAE,OAAO,CAAC,MAAjB,YAAsB;AAC/B;AAGO,SAAS,6BAA6B,iBAA2B,UAA4B;AAClG,SAAO,gBAAgB,OAAO,CAAC,MAAM,KAAK,QAAQ;AACpD;AAEO,SAAS,2BAA2B,UAA2B;AACpE,QAAM,WAAW,kBAAkB,oBAAI,KAAK,CAAC;AAC7C,QAAM,KAAK,qCAAU;AACrB,MAAI,CAAC,GAAI,QAAO;AAEhB,MAAI;AACF,UAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,MAC7C,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC,EAAE,cAAc,oBAAI,KAAK,CAAC;AAC3B,UAAM,cAAc,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC,CAAC;AACxE,UAAM,OAAO,YAAY,IAAI,MAAM;AACnC,UAAM,QAAQ,YAAY,IAAI,OAAO;AACrC,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,WAAO,QAAQ,SAAS,MAAM,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AZwvBI,SA4iBA,UA5iBA,OAAAI,MAgBI,QAAAC,aAhBJ;AAxvBJ,SAAS,0BAA0B,QAAmD,KAAa;AACjG,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,OAAO,WAAW,aAAa,OAAO,IAAI;AACvD,MAAI,eAAe,IAAI,EAAG,QAAO,aAAa,MAAM,EAAE,IAAI,CAAC;AAC3D,SAAO;AACT;AAEA,IAAM,mBAAmB,EAAE,IAAI,SAAS,IAAI,SAAS,IAAI,QAAQ;AAE1D,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB;AAAA,EACA,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,YAAY,SAAS;AAC3B,QAAM,EAAE,gBAAgB,eAAe,IAAIC,SAAQ,MAAM,kBAAkB,KAAK,GAAG,CAAC,KAAK,CAAC;AAC1F,QAAM,cAAcA;AAAA,IAClB,MAAM,mBAAmB,WAAsC,cAAc;AAAA,IAC7E,CAAC,WAAW,cAAc;AAAA,EAC5B;AACA,QAAM,SAASA,SAAQ,MAAM,YAAY,eAAe,cAAc,GAAG,CAAC,cAAc,CAAC;AAEzF,QAAM,iCAAiCA,SAAgC,MAAM;AAC3E,UAAM,OAAO,wDAA0B;AACvC,WAAO,KAAK,IAAI,CAAC,QAAK;AA/H1B;AA+H8B;AAAA,QACxB,GAAG;AAAA,QACH,eAAc,SAAI,iBAAJ,YAAoB,yBAAyB,IAAI,EAAE;AAAA,QACjE,SAAQ,SAAI,WAAJ,YAAe,IAAI,OAAO,2BAA2B,SAAS;AAAA,QACtE,MAAK,SAAI,QAAJ,YAAY,IAAI,OAAO,2BAA2B,IAAI;AAAA,QAC3D,MAAK,SAAI,QAAJ,YAAY,IAAI,OAAO,2BAA2B,IAAI;AAAA,MAC7D;AAAA,KAAE;AAAA,EACJ,GAAG,CAAC,qBAAqB,CAAC;AAE1B,QAAM,gCAAgCA;AAAA,IACpC,MAAO,sDAAwB;AAAA,IAC/B,CAAC,oBAAoB;AAAA,EACvB;AAEA,QAAM,0BAA0BA;AAAA,IAC9B,MAAM,8DAA4B,CAAC;AAAA,IACnC,CAAC,wBAAwB;AAAA,EAC3B;AACA,QAAM,4BAA4BA;AAAA,IAChC,MAAM,wBAAwB,OAAO,CAAC,WAAW,OAAO,eAAe,EAAE,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,IAClG,CAAC,uBAAuB;AAAA,EAC1B;AAEA,QAAM,2BAA2BA,SAA0C,MAAM;AAC/E,UAAM,MAAwC,CAAC;AAC/C,eAAW,OAAO,gCAAgC;AAChD,YAAM,MAAM,EAAE,OAAO,IAAI,MAAM,QAAQ,IAAI,eAAe,IAAI,KAAK;AACnE,UAAI,IAAI,EAAE,IAAI;AACd,YAAM,gBAAgB,gBAAgB,IAAI,EAAE;AAC5C,UAAI,eAAe;AACjB,YAAI,aAAa,IAAI;AAAA,MACvB;AAAA,IACF;AACA,eAAW,SAAS,+BAA+B;AACjD,iBAAW,OAAO,MAAM,SAAS;AAC/B,cAAM,MAAM,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,YAAY,IAAI,MAAM;AAClE,YAAI,IAAI,EAAE,IAAI;AACd,cAAM,gBAAgB,gBAAgB,IAAI,EAAE;AAC5C,YAAI,eAAe;AACjB,cAAI,aAAa,IAAI;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,gCAAgC,6BAA6B,CAAC;AAElE,QAAM,CAAC,wBAAwB,yBAAyB,IAAIC,UAAmB,CAAC,CAAC;AACjF,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAmB,CAAC,CAAC;AACnE,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAmB,CAAC,CAAC;AAC/E,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAiC,CAAC,CAAC;AACnF,QAAM,CAAC,yBAAyB,0BAA0B,IAAIA,UAAmB,CAAC,CAAC;AACnF,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAiC,CAAC,CAAC;AACvF,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAmB,CAAC,CAAC;AAC/E,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiB,WAAW;AACxD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,CAAC;AACxD,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,EAAE;AAC/D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA2C,IAAI;AACrF,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAmB,CAAC,CAAC;AAC3E,QAAM,YAAY,OAA6C,CAAC,CAAC;AACjE,QAAM,kBAAkB,OAA8C,IAAI;AAC1E,QAAM,WAAW,OAAO,CAAC;AAEzB,QAAM,mBAAmBD,SAAQ,MAAM;AACrC,QAAI,CAAC,qBAAsB,QAAO,CAAC;AACnC,WAAO,oCAAoC,oBAAoB;AAAA,EACjE,GAAG,CAAC,oBAAoB,CAAC;AAEzB,QAAM,qBAAqB,CAAC,QAAgB;AAC1C;AAAA,MAAyB,CAAC,SACxB,KAAK,SAAS,GAAG,IAAI,KAAK,OAAO,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,KAAK;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,yBAAyBA;AAAA,IAC7B,MACE,cACG,IAAI,CAAC,kBAAkB;AAAA,MACtB,GAAG;AAAA,MACH,mBAAmB,aAAa,UAAU,OAAO,CAAC,aAAa,oBAAoB,SAAS,SAAS,EAAE,CAAC;AAAA,IAC1G,EAAE,EACD,OAAO,CAAC,iBAAiB,aAAa,kBAAkB,SAAS,CAAC;AAAA,IACvE,CAAC,eAAe,mBAAmB;AAAA,EACrC;AAEA,QAAM,gBAAgB,uBAAuB;AAAA,IAC3C,CAAC,OAAO,iBAAiB,QAAQ,aAAa,kBAAkB;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,4BAA4BA,SAAQ,MAAM;AAC9C,WAAO,IAAI,IAAI,WAAW,OAAO,CAAC,UAAU,CAAC,MAAM,UAAU,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,CAAC;AAAA,EAClG,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,uBAAuBA;AAAA,IAC3B,MAAG;AA7NP;AA6NU,gEAAc,OAAO,CAAC,OAAO,oBAAoB,SAAS,GAAG,QAAQ,OAArE,YAA2E,CAAC;AAAA;AAAA,IAClF,CAAC,cAAc,mBAAmB;AAAA,EACpC;AAEA,QAAM,2BAA2BA,SAAQ,MAAM;AAjOjD;AAkOI,UAAM,eAAe,cAAc,QAAQ,CAAC,iBAAiB,aAAa,SAAS;AACnF,eAAW,MAAM,qBAAqB;AACpC,YAAM,YAAW,wBAAa,KAAK,CAAC,aAAa,SAAS,OAAO,EAAE,MAAlD,mBAAqD,aAArD,mBAA+D;AAChF,UAAI,SAAU,QAAO;AAAA,IACvB;AACA,YAAO,yDAAoB,WAAU;AAAA,EACvC,GAAG,CAAC,oBAAoB,eAAe,mBAAmB,CAAC;AAE3D,QAAM,4BAA4BA,SAAQ,MAAM;AAC9C,WAAO,8CAAoB,2BAA2B,wBAAwB;AAAA,EAChF,GAAG,CAAC,0BAA0B,gBAAgB,CAAC;AAE/C,QAAM,sBAAsBA;AAAA,IAC1B,MAAM,+BAA+B,OAAO,CAAC,WAAW,sBAAsB,SAAS,OAAO,EAAE,CAAC;AAAA,IACjG,CAAC,gCAAgC,qBAAqB;AAAA,EACxD;AAEA,QAAM,mCAAmCA;AAAA,IACvC,MACE,+BAA+B;AAAA,MAC7B,CAAC,WAAW,sBAAsB,SAAS,OAAO,EAAE,KAAM,OAAO,YAAY,OAAO;AAAA,IACtF;AAAA,IACF,CAAC,gCAAgC,qBAAqB;AAAA,EACxD;AAEA,QAAM,sBAAsBA;AAAA,IAC1B,MACE,8BAA8B;AAAA,MAAQ,CAAC,UACrC,MAAM,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC7B,GAAG;AAAA,QACH,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,MACnB,EAAE;AAAA,IACJ;AAAA,IACF,CAAC,6BAA6B;AAAA,EAChC;AAEA,QAAM,8BAA8BA;AAAA,IAClC,MAAM,oBAAoB,OAAO,CAAC,WAAW,wBAAwB,SAAS,OAAO,EAAE,CAAC;AAAA,IACxF,CAAC,qBAAqB,uBAAuB;AAAA,EAC/C;AAEA,QAAM,qCAAqCA;AAAA,IACzC,MACE,oBAAoB;AAAA,MAClB,CAAC,WAAW,wBAAwB,SAAS,OAAO,EAAE,KAAM,OAAO,YAAY,OAAO;AAAA,IACxF;AAAA,IACF,CAAC,qBAAqB,uBAAuB;AAAA,EAC/C;AAKA,QAAM,iCAAiCA;AAAA,IACrC,MACE,MAAM;AAAA,MACJ,oBAAI,IAAI;AAAA,QACN,GAAG;AAAA,QACH,GAAG,+BACA,OAAO,CAAC,WAAW,OAAO,YAAY,OAAO,eAAe,EAC5D,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,IACF,CAAC,uBAAuB,8BAA8B;AAAA,EACxD;AAEA,QAAM,mCAAmCA;AAAA,IACvC,MACE,MAAM;AAAA,MACJ,oBAAI,IAAI;AAAA,QACN,GAAG;AAAA,QACH,GAAG,oBACA,OAAO,CAAC,WAAW,OAAO,YAAY,OAAO,eAAe,EAC5D,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,IACF,CAAC,yBAAyB,mBAAmB;AAAA,EAC/C;AAEA,QAAM,iBAAiBA,SAAQ,MAAM;AACnC,UAAM,qBAAqB,oBACxB,OAAO,CAAC,QAAQ,IAAI,gBAAgB,IAAI,EACxC,KAAK,CAAC,QAAK;AApTlB;AAoTqB,gBAAC,sBAAiB,IAAI,EAAE,MAAvB,mBAA0B;AAAA,KAAM;AAClD,UAAM,iBACJ,4BAA4B,UAAU,KACtC,4BAA4B,KAAK,CAAC,QAAK;AAvT7C;AAuTgD,gBAAC,wBAAmB,GAAG,IAAI,EAAE,eAAe,MAA3C,mBAA8C;AAAA,KAAM;AACjG,WAAO,sBAAsB;AAAA,EAC/B,GAAG,CAAC,qBAAqB,kBAAkB,6BAA6B,kBAAkB,CAAC;AAE3F,QAAM,oBAAoBA,SAAQ,MAAM;AACtC,QAAI,4BAA4B,WAAW,EAAG,QAAO;AACrD,UAAM,cAAc,4BAA4B;AAAA,MAC9C,CAAC,KAAK,QAAQ,OAAO,OAAO,mBAAmB,GAAG,IAAI,EAAE,eAAe,CAAC,KAAK;AAAA,MAC7E;AAAA,IACF;AACA,UAAM,QAAQ,4BAA4B,IAAI,CAAC,QAAQ;AACrD,YAAM,SAAS,OAAO,mBAAmB,GAAG,IAAI,EAAE,eAAe,CAAC,KAAK;AACvE,YAAM,MAAM,KAAK,MAAO,SAAS,cAAe,GAAG;AACnD,aAAO,GAAG,IAAI,KAAK,IAAI,GAAG;AAAA,IAC5B,CAAC;AACD,WAAO,0BAA0B,MAAM,KAAK,IAAI,CAAC;AAAA,EACnD,GAAG,CAAC,6BAA6B,kBAAkB,CAAC;AAEpD,QAAM,cAAc,MAAM;AACxB,cAAU,QAAQ,QAAQ,CAAC,YAAY,aAAa,OAAO,CAAC;AAC5D,cAAU,UAAU,CAAC;AACrB,QAAI,gBAAgB,SAAS;AAC3B,oBAAc,gBAAgB,OAAO;AACrC,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM;AAC1B,uBAAmB,CAAC;AACpB,0BAAsB,EAAE;AAAA,EAC1B;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,kBAAY;AACZ,gBAAU,WAAW;AACrB,qBAAe,IAAI;AACnB,6BAAuB,CAAC,CAAC;AACzB,gCAA0B,CAAC,CAAC;AAC5B,yBAAmB,CAAC,CAAC;AACrB,iCAA2B,CAAC,CAAC;AAC7B,+BAAyB,CAAC,CAAC;AAC3B,0BAAoB,CAAC,CAAC;AACtB,4BAAsB,CAAC,CAAC;AACxB,+BAAyB,CAAC,CAAC;AAC3B,oBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,qBAAsB;AACtC,QAAI,iBAAiB,WAAW,GAAG;AACjC,+BAAyB,CAAC,CAAC;AAC3B;AAAA,IACF;AACA,UAAM,QAAQ,gEAA6B,iBAAiB,CAAC;AAC7D,6BAAyB,6BAA6B,kBAAkB,KAAK,CAAC;AAAA,EAChF,GAAG,CAAC,QAAQ,sBAAsB,kBAAkB,yBAAyB,CAAC;AAE9E,YAAU,MAAM;AACd,QAAI,UAAU,eAAe;AAC3B,6BAAuB,cAAc,mBAAmB;AACxD,+BAAyB,cAAc,qBAAqB;AAC5D,0BAAoB,cAAc,gBAAgB;AAClD,iCAA2B,cAAc,uBAAuB;AAChE,4BAAsB,cAAc,kBAAkB;AACtD,UAAI,cAAc,SAAS;AACzB,uBAAe,cAAc,OAAO;AAAA,MACtC;AACA,gBAAU,WAAW;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,YAAU,MAAM;AACd,QAAI,oBAAoB,WAAW,KAAK,iBAAiB,CAAC,6BAA6B;AACrF;AAAA,IACF;AACA,UAAM,SAAS,4BAA4B,mBAAmB;AAC9D,QAAI,QAAQ;AACV,+BAAyB,OAAO,qBAAqB;AACrD,0BAAoB,OAAO,gBAAgB;AAC3C,iCAA2B,OAAO,uBAAuB;AACzD,4BAAsB,OAAO,kBAAkB;AAAA,IACjD,OAAO;AACL,+BAAyB,CAAC,CAAC;AAC3B,0BAAoB,CAAC,CAAC;AACtB,iCAA2B,CAAC,CAAC;AAC7B,4BAAsB,CAAC,CAAC;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,qBAAqB,eAAe,2BAA2B,CAAC;AAEpE,YAAU,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvC,YAAU,MAAM;AACd,QAAI,WAAY;AAChB,2BAAuB,CAAC,aAAa;AACnC,YAAM,WAAW,SAAS,OAAO,CAAC,OAAO,0BAA0B,IAAI,EAAE,CAAC;AAC1E,aAAO,SAAS,WAAW,SAAS,SAAS,WAAW;AAAA,IAC1D,CAAC;AAAA,EACH,GAAG,CAAC,2BAA2B,UAAU,CAAC;AAE1C,QAAM,qBAAqB,CAAC,UAA8B;AACxD,QAAI,SAAS,oBAAoB;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,UAAU,iBAAiB;AAC7B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,MAAM;AAC9B,gBAAY;AACZ,cAAU,UAAU;AACpB,mBAAe,IAAI;AACnB,kBAAc;AACd,aAAS,WAAW;AACpB,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,WAAW,CAAC,SAAiB,QAAoB,UAAkB;AACvE,UAAM,UAAU,WAAW,MAAM;AAC/B,UAAI,SAAS,YAAY,OAAO;AAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,OAAO;AACV,cAAU,QAAQ,KAAK,OAAO;AAAA,EAChC;AAEA,QAAM,oBAAoB,CAAC,OAAe,aAA+B;AACvE;AAAA,MACE;AAAA,MACA,MAAM;AACJ,YAAI,SAAS,YAAY,MAAO;AAChC,8BAAsB,CAAC;AACvB,2BAAmB,CAAC;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AACA;AAAA,MACE,mBAAmB;AAAA,MACnB,MAAM;AACJ,YAAI,SAAS,YAAY,MAAO;AAChC,8BAAsB,CAAC;AACvB,2BAAmB,CAAC;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AACA;AAAA,MACE,mBAAmB;AAAA,MACnB,YAAY;AACV,YAAI,SAAS,YAAY,MAAO;AAEhC,YAAI;AACF,iBAAM,yCAAa,SAAS;AAC5B,gCAAsB,CAAC;AACvB,6BAAmB,CAAC;AAAA,QACtB,SAAS,KAAK;AACZ,kBAAQ,MAAM,GAAG;AACjB,gBAAM,sBAAsB;AAC5B,gBAAM,uBAAuB,eAAe,QAAQ,IAAI,WAAW,sBAAsB;AACzF,yBAAe;AAAA,YACb,qBAAqB;AAAA,cACnB;AAAA,gBACE,OAAO;AAAA,gBACP,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,YACA,kBAAkB,CAAC;AAAA,UACrB,CAAC;AACD,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,MAAM;AACjC,QAAI,kBAAkB,GAAG;AACvB;AAAA,IACF;AAEA,QAAI,wBAAwB,sBAAsB,WAAW,GAAG;AAC9D;AAAA,IACF;AAGA,QAAI,YAAY;AACd,YAAME,SAAQ,kBAAkB;AAChC;AAAA,QACE;AAAA,QACA,YAAY;AACV,cAAI,SAAS,YAAYA,OAAO;AAChC,gCAAsB,CAAC;AACvB,6BAAmB,CAAC;AACpB,cAAI;AACF,kBAAM,iBAAiB,MAAM,WAAW;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,cACA,mBAAmB;AAAA,cACnB;AAAA,cACA,uBAAuB;AAAA,cACvB;AAAA,cACA,yBAAyB;AAAA,cACzB;AAAA,cACA,oBAAoB;AAAA,YACtB,CAAC;AACD,gBAAI,SAAS,YAAYA,OAAO;AAChC,kCAAsB,CAAC;AACvB,+BAAmB,CAAC;AACpB;AAAA,cACE;AAAA,cACA,MAAM;AACJ,oBAAI,SAAS,YAAYA,OAAO;AAChC,sCAAsB,CAAC;AACvB,mCAAmB,CAAC;AAAA,cACtB;AAAA,cACAA;AAAA,YACF;AACA;AAAA,cACE,mBAAmB;AAAA,cACnB,MAAM;AACJ,oBAAI,SAAS,YAAYA,OAAO;AAChC,sCAAsB,CAAC;AACvB,mCAAmB,CAAC;AAAA,cACtB;AAAA,cACAA;AAAA,YACF;AACA;AAAA,cACE,mBAAmB;AAAA,cACnB,MAAM;AACJ,oBAAI,SAAS,YAAYA,OAAO;AAChC,sCAAsB,CAAC;AACvB,mCAAmB,CAAC;AACpB,yEAAqB;AACrB,wBAAQ;AAAA,cACV;AAAA,cACAA;AAAA,YACF;AAAA,UACF,SAAS,KAAK;AACZ,gBAAI,SAAS,YAAYA,OAAO;AAChC,gBAAI,eAAe,yBAAyB;AAC1C,6BAAe,IAAI,OAAO;AAAA,YAC5B,OAAO;AACL,oBAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,6BAAe;AAAA,gBACb,qBAAqB,CAAC,EAAE,OAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,gBACrD,kBAAkB,CAAC;AAAA,cACrB,CAAC;AAAA,YACH;AACA,sBAAU,QAAQ;AAAA,UACpB;AAAA,QACF;AAAA,QACAA;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,UAAU,qBAAqB;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,uBAAuB;AAAA,MACvB;AAAA,MACA,yBAAyB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,2EAA4B,qBAAqB;AAAA,MAC/C;AAAA,MACA,uBAAuB;AAAA,MACvB;AAAA,MACA,yBAAyB;AAAA,MACzB;AAAA,MACA,oBAAoB;AAAA,IACtB;AAEA,UAAM,QAAQ,kBAAkB;AAEhC;AAAA,MACE;AAAA,MACA,YAAY;AACV,8BAAsB,CAAC;AACvB,2BAAmB,CAAC;AAEpB,YAAI;AACF,gBAAM,QAAQ,MAAM,SAAS,sBAAuB,KAAK,sBAAuB,OAAO;AACvF,cAAI,CAAC,OAAO;AACV,kBAAM,IAAI,MAAM,oCAAoC;AAAA,UACtD;AAEA,gBAAM,gBAAgB,CAAC,GAAG,qBAAqB,EAAE,KAAK;AACtD,gBAAM,iBACJ,cAAc,SAAS,IACnB;AAAA,YACE,kBAAkB,cAAc,CAAC;AAAA,YACjC,gBAAgB,cAAc,cAAc,SAAS,CAAC;AAAA,UACxD,IACA,CAAC;AACP,gBAAM,OAAO,EAAE,eAAe,UAAU,KAAK,IAAI,GAAG,eAAe;AACnE,gBAAM,EAAE,MAAM,IAAI,MAAM,eAAe,SAAU,SAAS,IAAI;AAE9D,cAAI,SAAS,YAAY,OAAO;AAC9B;AAAA,UACF;AAEA,gCAAsB,CAAC;AACvB,6BAAmB,qBAAqB;AAExC,gBAAM,gBAAgB,YAAY;AAChC,gBAAI,SAAS,YAAY,MAAO;AAChC,gBAAI;AACF,oBAAM,YAAY,MAAM,aAAa,SAAU,OAAO,IAAI;AAC1D,kBAAI,SAAS,YAAY,MAAO;AAEhC,kBAAI,UAAU,WAAW,iBAAiB,UAAU,WAAW,oBAAoB;AACjF,oBAAI,gBAAgB,SAAS;AAC3B,gCAAc,gBAAgB,OAAO;AACrC,kCAAgB,UAAU;AAAA,gBAC5B;AACA,sBAAM,WAAW,MAAM,aAAa,SAAU,OAAO,IAAI;AACzD,oBAAI,SAAS,YAAY,MAAO;AAChC,oBAAI,sBAAsB;AAC1B,oBAAI,SAAS,YAAY,YAAY;AACnC,wBAAM,WAAW,MAAM,eAAe,SAAU,OAAO,IAAI;AAC3D,sBAAI,SAAS,YAAY,MAAO;AAChC,wCAAsB,EAAE,GAAG,UAAU,SAAS;AAAA,gBAChD;AACA,kCAAkB,OAAO,mBAAmB;AAC5C;AAAA,cACF;AAAA,YACF,SAAS,KAAK;AACZ,kBAAI,SAAS,YAAY,MAAO;AAChC,kBAAI,gBAAgB,SAAS;AAC3B,8BAAc,gBAAgB,OAAO;AACrC,gCAAgB,UAAU;AAAA,cAC5B;AACA,sBAAQ,MAAM,GAAG;AACjB,6BAAe,qBAAqB;AACpC,wBAAU,QAAQ;AAAA,YACpB;AAAA,UACF;AAEA,wBAAc;AACd,0BAAgB,UAAU,YAAY,eAAe,gBAAgB;AAAA,QACvE,SAAS,KAAK;AACZ,cAAI,SAAS,YAAY,OAAO;AAC9B;AAAA,UACF;AACA,kBAAQ,MAAM,GAAG;AACjB,yBAAe,qBAAqB;AACpC,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,OAAe,aAA+B;AArqB3E;AAsqBI,QAAI,CAAC,SAAS,YAAY,YAAY;AACpC,YAAM,SAAS,uBAAsB,cAAS,YAAY,eAArB,YAAmC,CAAC,GAAG,SAAS,YAAY,SAAS,wBAAwB;AAElI,YAAM,oBAAoB,cACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAC1B,OAAO,CAAC,MAAM,oBAAoB,SAAS,EAAE,EAAE,CAAC;AACnD,YAAM,wBAAwB,uCAC1B;AAAA,QACE,SAAS;AAAA,UACP;AAAA,UACA,uBAAuB;AAAA,UACvB;AAAA,UACA,yBAAyB;AAAA,UACzB;AAAA,UACA,UAAU;AAAA,QACZ;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,YAAY,WAAW;AAAA,UACrB,CAAC,MAAG;AAzrBlB,gBAAAC;AAyrBqB,oBAAC,EAAE,cAAc,oBAAoB,SAAS,QAAOA,MAAA,EAAE,aAAF,gBAAAA,IAAY,EAAE,CAAC;AAAA;AAAA,QAC7E;AAAA,QACA,gBAAgB,WAAW;AAAA,UACzB,CAAC,MAAG;AA5rBlB,gBAAAA;AA4rBqB,2BAAQ,EAAE,UAAU,KAAK,oBAAoB,SAAS,QAAOA,MAAA,EAAE,aAAF,gBAAAA,IAAY,EAAE,CAAC;AAAA;AAAA,QACrF;AAAA,QACA,UAAU,8BAAY,CAAC;AAAA,QACvB,aAAa,SAAS;AAAA,MACxB,IACA;AAEJ,qBAAe;AAAA,QACb,GAAG;AAAA,QACH,kBAAkB,CAAC;AAAA,QACnB;AAAA,MACF,CAAC;AACD,gBAAU,QAAQ;AAAA,IACpB,OAAO;AACL,wBAAkB,OAAO,QAAQ;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,0BAA0B,MAAM;AACpC,gBAAY;AACZ,cAAU,WAAW;AAAA,EACvB;AAEA,QAAM,uBAAuB,CAAC,eAAuB;AACnD,QAAI,CAAC,cAAc,CAAC,0BAA0B,IAAI,UAAU,GAAG;AAC7D;AAAA,IACF;AAEA,UAAM,iBAAiB,oBAAoB,SAAS,UAAU,IAC1D,oBAAoB,OAAO,CAAC,OAAO,OAAO,UAAU,IACpD,CAAC,GAAG,qBAAqB,UAAU;AAEvC,2BAAuB,cAAc;AAGrC,UAAM,eAAe,uBAAuB,OAAO,CAAC,UAAU;AAC5D,YAAM,MAAM,6CAAc,KAAK,CAAC,MAAM,EAAE,OAAO;AAC/C,aAAO,MAAM,eAAe,SAAS,IAAI,QAAQ,IAAI;AAAA,IACvD,CAAC;AACD,QAAI,aAAa,WAAW,uBAAuB,QAAQ;AACzD,gCAA0B,YAAY;AAAA,IACxC;AAEA;AAAA,MACE;AAAA,MACA,aAAa,WAAW,uBAAuB,SAAS,eAAe;AAAA;AAAA,EAE3E;AAEA,QAAM,0BAA0B,CAAC,kBAA0B;AACzD,UAAM,OAAO,uBAAuB,SAAS,aAAa,IACtD,uBAAuB,OAAO,CAAC,OAAO,OAAO,aAAa,IAC1D,CAAC,GAAG,wBAAwB,aAAa;AAC7C,8BAA0B,IAAI;AAC9B,2DAAoB,qBAAqB;AAAA,EAC3C;AAEA,QAAM,mBAAmB,CAAC,WAAmB;AAC3C,uBAAmB,CAAC,SAAU,KAAK,SAAS,MAAM,IAAI,KAAK,OAAO,CAAC,OAAO,OAAO,MAAM,IAAI,CAAC,GAAG,MAAM,MAAM,CAAE;AAAA,EAC/G;AAEA,QAAM,yBAAyB,CAAC,iBAAyB;AACvD,6BAAyB,CAAC,SAAS;AA1vBvC;AA2vBM,UAAI,KAAK,SAAS,YAAY,GAAG;AAC/B,4BAAoB,CAAC,WAAW;AAC9B,gBAAM,OAAO,EAAE,GAAG,OAAO;AACzB,iBAAO,KAAK,YAAY;AACxB,iBAAO;AAAA,QACT,CAAC;AACD,eAAO,KAAK,OAAO,CAAC,OAAO,OAAO,YAAY;AAAA,MAChD;AAEA,YAAM,cAAa,oCAA+B,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,MAAhE,mBAAmE;AACtF,UAAI,YAAY;AACd,4BAAoB,CAAC,YAAY;AAAA,UAC/B,GAAG;AAAA,UACH,CAAC,YAAY,GAAG;AAAA,QAClB,EAAE;AAAA,MACJ;AACA,aAAO,CAAC,GAAG,MAAM,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,QAAM,2BAA2B,CAAC,aAAqB;AACrD,+BAA2B,CAAC,SAAS;AACnC,UAAI,KAAK,SAAS,QAAQ,GAAG;AAC3B,8BAAsB,CAAC,WAAW;AAChC,gBAAM,OAAO,EAAE,GAAG,OAAO;AACzB,iBAAO,KAAK,GAAG,QAAQ,eAAe;AACtC,cAAI,aAAa,0BAA0B;AACzC,mBAAO,KAAK,sCAAsC;AAClD,mBAAO,KAAK,+BAA+B;AAAA,UAC7C,WAAW,aAAa,qBAAqB;AAC3C,mBAAO,KAAK,oCAAoC;AAChD,mBAAO,KAAK,0BAA0B;AAAA,UACxC;AACA,iBAAO;AAAA,QACT,CAAC;AACD,eAAO,KAAK,OAAO,CAAC,OAAO,OAAO,QAAQ;AAAA,MAC5C;AAEA,UAAI,KAAK,UAAU,EAAG,QAAO;AAE7B,4BAAsB,CAAC,YAAY;AAAA,QACjC,GAAG;AAAA,QACH,CAAC,GAAG,QAAQ,eAAe,GAAG;AAAA,MAChC,EAAE;AACF,aAAO,CAAC,GAAG,MAAM,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,WAAW,cAAc,QAAQ;AACpD,QAAM,oBAAoB,WAAW;AACrC,QAAM,aAAa,WAAW;AAE9B,QAAM,iBAAiBH;AAAA,IACrB,MAAO,aAAa,mCAA8B;AAAA,IAClD,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,iBAAiB,cACrB,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,qBAAqB;AAAA,MACrB,OAAO;AAAA,MACP,UAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,IACE;AAEJ,QAAM,uBACJ,gBAAAC,MAACK,QAAA,EAAM,SAAQ,QACb;AAAA,oBAAAL,MAACM,MAAA,EAAI,IAAI,OAAO,QACd;AAAA,sBAAAP,KAACO,MAAA,EAAI,IAAI,OAAO,YACd,0BAAAP,KAAC,aAAU,GACb;AAAA,MACA,gBAAAC,MAACK,QAAA,EAAM,SAAQ,OAAM,MAAM,GACzB;AAAA,wBAAAN,KAACQ,OAAA,EAAK,IAAI,OAAO,aAAc,uBAAY;AAAA,QAC3C,gBAAAR,KAACQ,OAAA,EAAK,IAAI,OAAO,YAAa,sBAAW;AAAA,SAC3C;AAAA,OACF;AAAA,IAEC,CAAC,cAAc,WAAW,WAAW,IACpC,gBAAAP;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,IAAI;AAAA,UACJ,cAAc;AAAA,UACd,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,KAAK;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAP,KAACO,MAAA,EAAI,IAAI,EAAE,OAAO,WAAW,YAAY,GAAG,IAAI,MAAM,GACpD,0BAAAP,KAAC,eAAY,GACf;AAAA,UACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,EAAE,UAAU,QAAQ,OAAO,WAAW,YAAY,OAAO,GAAG,+FAEtE;AAAA;AAAA;AAAA,IACF,IACE;AAAA,IAEJ,gBAAAP,MAACK,QAAA,EAAM,SAAQ,OAAM,IAAI,OAAO,iBAC9B;AAAA,sBAAAL,MAACK,QAAA,EAAM,SAAQ,OACb;AAAA,wBAAAL,MAACQ,SAAA,EAAO,IAAI,OAAO,kBACjB;AAAA,0BAAAT,KAACQ,OAAA,EAAK,IAAI,OAAO,eAAe,sBAAQ;AAAA,UACvC,gBAAgB,IAAI,gBAAAR,KAAC,SAAM,IAAI,OAAO,eAAgB,yBAAc,IAAW;AAAA,WAClF;AAAA,QACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,kBAAkB,6HAGnC;AAAA,SACF;AAAA,MAEA,gBAAAP,MAAC,WAAQ,WAAU,gBAAe,YAAU,MAAC,QAAM,MACjD;AAAA,wBAAAD,KAAC,kBACC,0BAAAA,KAACU,SAAA,EAAO,SAAQ,YAAW,IAAI,OAAO,iBACpC,0BAAAT,MAACQ,SAAA,EAAO,SAAQ,iBAAgB,GAAE,QAChC;AAAA,0BAAAT;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,GAAG,OAAO;AAAA,gBACV,GAAI,oBAAoB,SAAS,IAAI,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,cAC/D;AAAA,cACA,WAAW;AAAA,cAEV,8BAAoB,SAAS,IAC1B,cACG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAC1B,OAAO,CAAC,MAAM,oBAAoB,SAAS,EAAE,EAAE,CAAC,EAChD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI,IACZ;AAAA;AAAA,UACN;AAAA,UACA,gBAAAR,KAACO,MAAA,EAAI,OAAM,WACT,0BAAAP,KAAC,mBAAgB,GACnB;AAAA,WACF,GACF,GACF;AAAA,QACA,gBAAAA,KAAC,kBAAe,IAAI,OAAO,gBACzB,0BAAAA,KAAC,eAAY,GAAG,GACd,0BAAAA,KAACM,QAAA,EAAM,SAAQ,OACZ,wBAAc,IAAI,CAAC,iBAClB,gBAAAL,MAACM,MAAA,EACC;AAAA,0BAAAP,KAACQ,OAAA,EAAK,IAAI,OAAO,aAAc,uBAAa,OAAM;AAAA,UAClD,gBAAAR,KAACM,QAAA,EAAM,SAAQ,OACZ,uBAAa,UAAU,IAAI,CAAC,aAAa;AACxC,kBAAM,YAAY,cAAc,0BAA0B,IAAI,SAAS,EAAE;AACzE,mBACE,gBAAAL;AAAA,cAACQ;AAAA,cAAA;AAAA,gBAEC,IAAG;AAAA,gBACH,IAAI;AAAA,kBACF,GAAG,OAAO;AAAA,kBACV,QAAQ,YAAY,YAAY;AAAA,kBAChC,SAAS,YAAY,IAAI;AAAA,gBAC3B;AAAA,gBAEA;AAAA,kCAAAT;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI,YAAY,SAAS,EAAE;AAAA,sBAC3B,WAAW,oBAAoB,SAAS,SAAS,EAAE;AAAA,sBACnD,YAAY,CAAC;AAAA,sBACb,UAAU,MAAM,qBAAqB,SAAS,EAAE;AAAA;AAAA,kBAClD;AAAA,kBACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,aAAc,mBAAS,MAAK;AAAA;AAAA;AAAA,cAdxC,SAAS;AAAA,YAehB;AAAA,UAEJ,CAAC,GACH;AAAA,aAzBQ,aAAa,EA0BvB,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,MAEA,gBAAAR,KAACM,QAAA,EAAM,SAAQ,OACZ,iCAAuB,IAAI,CAAC,iBAC3B,gBAAAL,MAACM,MAAA,EAA0B,IAAI,OAAO,gBACpC;AAAA,wBAAAP,KAACO,MAAA,EAAI,IAAI,OAAO,oBACd,0BAAAP,KAAC,YAAS,GACZ;AAAA,QACA,gBAAAC,MAACM,MAAA,EAAI,IAAI,OAAO,oBACd;AAAA,0BAAAN,MAACO,OAAA,EAAK,YAAY,KAAK;AAAA;AAAA,YAA0B,aAAa;AAAA,aAAM;AAAA,UACpE,gBAAAR,KAACQ,OAAA,EAAM,uBAAa,kBAAkB,IAAI,CAAC,aAAa,SAAS,IAAI,EAAE,KAAK,IAAI,GAAE;AAAA,WACpF;AAAA,WAPQ,aAAa,EAQvB,CACD,GACH;AAAA,OACF;AAAA,IAEC,oBACC,gBAAAP,MAACK,QAAA,EAAM,SAAQ,OAAM,IAAI,OAAO,iBAC9B;AAAA,sBAAAN,KAACM,QAAA,EAAM,SAAQ,OACb,0BAAAL,MAACQ,SAAA,EAAO,IAAI,OAAO,kBACjB;AAAA,wBAAAT,KAACQ,OAAA,EAAK,IAAI,OAAO,eAAe,0BAAY;AAAA,QAC3C,uBAAuB,SAAS,KAC/B,gBAAAR,KAAC,SAAM,IAAI,OAAO,eAAgB,iCAAuB,QAAO;AAAA,SAEpE,GACF;AAAA,MACA,gBAAAC,MAAC,WAAQ,WAAU,gBAAe,YAAU,MAAC,QAAM,MACjD;AAAA,wBAAAD,KAAC,kBACC,0BAAAA;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,YAAY,oBAAoB,WAAW,KAAK,qBAAqB,WAAW;AAAA,YAChF,IAAI;AAAA,cACF,GAAG,OAAO;AAAA,cACV,GAAI,oBAAoB,WAAW,KAAK,qBAAqB,WAAW,IACpE,EAAE,SAAS,KAAK,QAAQ,cAAc,IACtC,CAAC;AAAA,YACP;AAAA,YAEA,0BAAAT,MAACQ,SAAA,EAAO,SAAQ,iBAAgB,GAAE,QAChC;AAAA,8BAAAT;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,GAAG,OAAO;AAAA,oBACV,GAAI,uBAAuB,SAAS,IAAI,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,kBAClE;AAAA,kBACA,WAAW;AAAA,kBAEV,iCAAuB,SAAS,IAC7B,qBACG,OAAO,CAAC,MAAM,uBAAuB,SAAS,EAAE,EAAE,CAAC,EACnD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI,IACZ;AAAA;AAAA,cACN;AAAA,cACA,gBAAAR,KAACO,MAAA,EAAI,OAAM,WACT,0BAAAP,KAAC,mBAAgB,GACnB;AAAA,eACF;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAA,KAAC,kBAAe,IAAI,OAAO,gBACzB,0BAAAA,KAAC,eAAY,GAAG,GACd,0BAAAA,KAACM,QAAA,EAAM,SAAQ,OACZ,+BAAqB,IAAI,CAAC,QACzB,gBAAAL,MAACQ,SAAA,EAAoB,IAAG,SAAQ,IAAI,EAAE,GAAG,OAAO,WAAW,QAAQ,UAAU,GAC3E;AAAA,0BAAAT;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,eAAe,IAAI,EAAE;AAAA,cACzB,WAAW,uBAAuB,SAAS,IAAI,EAAE;AAAA,cACjD,UAAU,MAAM,wBAAwB,IAAI,EAAE;AAAA;AAAA,UAChD;AAAA,UACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,aAAc,cAAI,MAAK;AAAA,aAN7B,IAAI,EAOjB,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAGD,aACC,gBAAAP,MAACK,QAAA,EAAM,SAAQ,OAAM,IAAI,OAAO,iBAC9B;AAAA,sBAAAN,KAACM,QAAA,EAAM,SAAQ,OACb,0BAAAL,MAACQ,SAAA,EAAO,IAAI,OAAO,kBACjB;AAAA,wBAAAT,KAACQ,OAAA,EAAK,IAAI,OAAO,eAAe,mBAAK;AAAA,QACpC,gBAAgB,SAAS,KAAK,gBAAAR,KAAC,SAAM,IAAI,OAAO,eAAgB,0BAAgB,QAAO;AAAA,SAC1F,GACF;AAAA,MACA,gBAAAC,MAAC,WAAQ,WAAU,gBAAe,YAAU,MAAC,QAAM,MACjD;AAAA,wBAAAD,KAAC,kBACC,0BAAAA;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,YAAY,CAAC,SAAS,MAAM,WAAW;AAAA,YACvC,IAAI;AAAA,cACF,GAAG,OAAO;AAAA,cACV,GAAI,CAAC,SAAS,MAAM,WAAW,IAAI,EAAE,SAAS,KAAK,QAAQ,cAAc,IAAI,CAAC;AAAA,YAChF;AAAA,YAEA,0BAAAT,MAACQ,SAAA,EAAO,SAAQ,iBAAgB,GAAE,QAChC;AAAA,8BAAAT;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,GAAG,OAAO;AAAA,oBACV,GAAI,gBAAgB,SAAS,IAAI,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,kBAC3D;AAAA,kBACA,WAAW;AAAA,kBAEV,0BAAgB,SAAS,KACrB,wBAAS,CAAC,GACR,OAAO,CAAC,MAAM,gBAAgB,SAAS,EAAE,EAAE,CAAC,EAC5C,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI,IACZ;AAAA;AAAA,cACN;AAAA,cACA,gBAAAR,KAACO,MAAA,EAAI,OAAM,WACT,0BAAAP,KAAC,mBAAgB,GACnB;AAAA,eACF;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAA,KAAC,kBAAe,IAAI,OAAO,gBACzB,0BAAAA,KAAC,eAAY,GAAG,GACd,0BAAAA,KAACM,QAAA,EAAM,SAAQ,OACX,mCAAS,CAAC,GAAG,IAAI,CAAC,SAClB,gBAAAL,MAACQ,SAAA,EAAqB,IAAG,SAAQ,IAAI,EAAE,GAAG,OAAO,WAAW,QAAQ,UAAU,GAC5E;AAAA,0BAAAT;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,QAAQ,KAAK,EAAE;AAAA,cACnB,WAAW,gBAAgB,SAAS,KAAK,EAAE;AAAA,cAC3C,UAAU,MAAM,iBAAiB,KAAK,EAAE;AAAA;AAAA,UAC1C;AAAA,UACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,aAAc,eAAK,MAAK;AAAA,aAN9B,KAAK,EAOlB,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAGD,uBACC,gBAAAP,MAACK,QAAA,EAAM,SAAQ,OAAM,IAAI,OAAO,iBAC9B;AAAA,sBAAAN,KAACQ,OAAA,EAAK,IAAI,EAAE,GAAG,OAAO,eAAe,YAAY,IAAI,GAAG,oCAAsB;AAAA,MAC9E,gBAAAR,KAACS,SAAA,EAAO,SAAS,GAAG,UAAS,QAC1B,2BAAiB,IAAI,CAAC,QAAQ;AAC7B,cAAM,WAAW,sBAAsB,SAAS,GAAG;AACnD,eACE,gBAAAT;AAAA,UAACU;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS,MAAM,mBAAmB,GAAG;AAAA,YACrC,cAAa;AAAA,YACb,MAAK;AAAA,YACL,GAAE;AAAA,YACF,IAAI;AAAA,YACJ,UAAS;AAAA,YACT,YAAY;AAAA,YACZ,aAAa,WAAW,QAAQ;AAAA,YAChC,aAAY;AAAA,YACZ,aAAa,WAAW,YAAY;AAAA,YACpC,IAAI,WAAW,YAAY;AAAA,YAC3B,OAAO,WAAW,YAAY;AAAA,YAC9B,gBAAc;AAAA,YACd,cAAY,GAAG,wBAAwB,GAAG,CAAC,IAAI,GAAG;AAAA,YAEjD,kCAAwB,GAAG;AAAA;AAAA,UAlBvB;AAAA,QAmBP;AAAA,MAEJ,CAAC,GACH;AAAA,OACF,IACE;AAAA,IAEJ,gBAAAT,MAACK,QAAA,EAAM,SAAQ,QAAO,IAAI,OAAO,wBAC/B;AAAA,sBAAAL,MAACK,QAAA,EAAM,SAAQ,OACb;AAAA,wBAAAL,MAACQ,SAAA,EAAO,IAAI,OAAO,yBACjB;AAAA,0BAAAT,KAACQ,OAAA,EAAK,IAAI,OAAO,sBAAsB,4BAAc;AAAA,UACpD,iCAAiC,SAAS,IACzC,gBAAAR,KAAC,SAAM,IAAI,OAAO,sBAAuB,2CAAiC,QAAO,IAC/E;AAAA,WACN;AAAA,QACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,yBAAyB,2EAA6D;AAAA,SACzG;AAAA,MAEC,qBAAqB,cAAc,iBAAiB;AAAA,MAErD,gBAAAP,MAAC,WAAQ,WAAU,gBAAe,YAAU,MAAC,QAAM,MACjD;AAAA,wBAAAD,KAAC,kBACC,0BAAAA,KAACU,SAAA,EAAO,SAAQ,YAAW,IAAI,OAAO,wBACpC,0BAAAT,MAACQ,SAAA,EAAO,SAAQ,iBAAgB,GAAE,QAChC;AAAA,0BAAAT;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,GAAG,OAAO;AAAA,gBACV,GAAI,iCAAiC,SAAS,IAAI,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,cAC5E;AAAA,cACA,WAAW;AAAA,cAEV,2CAAiC,SAAS,IACvC,iCAAiC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,IAC7D;AAAA;AAAA,UACN;AAAA,UACA,gBAAAR,KAACO,MAAA,EAAI,OAAM,WACT,0BAAAP,KAAC,mBAAgB,GACnB;AAAA,WACF,GACF,GACF;AAAA,QACA,gBAAAA,KAAC,kBAAe,IAAI,OAAO,+BACzB,0BAAAA,KAAC,eAAY,GAAG,GACd,0BAAAA,KAACM,QAAA,EAAM,SAAQ,OACZ,yCAA+B,IAAI,CAAC,WACnC,gBAAAL,MAACQ,SAAA,EAAuB,IAAG,SAAQ,IAAI,EAAE,GAAG,OAAO,0BAA0B,QAAQ,UAAU,GAC7F;AAAA,0BAAAT;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,cAAc,OAAO,EAAE;AAAA,cAC3B,WAAW,sBAAsB,SAAS,OAAO,EAAE,KAAK,QAAQ,OAAO,YAAY,OAAO,eAAe;AAAA,cACzG,YAAY,OAAO;AAAA,cACnB,UAAU,MAAM;AACd,oBAAI,CAAC,OAAO,SAAU,wBAAuB,OAAO,EAAE;AAAA,cACxD;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,4BAA6B,iBAAO,MAAK;AAAA,aAT/C,OAAO,EAUpB,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,MAEC,oBAAoB,OAAO,CAAC,MAAM,EAAE,gBAAgB,IAAI,EAAE,SAAS,IAClE,gBAAAR,KAACO,MAAA,EAAI,IAAI,OAAO,gCACd,0BAAAP,KAACM,QAAA,EAAM,SAAQ,QACZ,8BAAoB,OAAO,CAAC,MAAM,EAAE,gBAAgB,IAAI,EAAE,IAAI,CAAC,QAAQ,UAAO;AA/oC7F;AAgpCgB,+BAAAL,MAACK,QAAA,EAAsB,IAAI,OAAO,0BAChC;AAAA,0BAAAL,MAACO,OAAA,EAAK,IAAI,OAAO,2BACd;AAAA,oBAAQ;AAAA,YAAE;AAAA,YAAG,OAAO;AAAA,aACvB;AAAA,UACA,gBAAAP,MAAC,cACC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO,sBAAiB,OAAO,EAAE,MAA1B,YAA+B;AAAA,gBACtC,UAAU,CAAC,UACT,oBAAoB,CAAC,UAAU;AAAA,kBAC7B,GAAG;AAAA,kBACH,CAAC,OAAO,EAAE,GAAG,MAAM,OAAO;AAAA,gBAC5B,EAAE;AAAA,gBAEJ,KAAK,OAAO;AAAA,gBACZ,KAAK,OAAO;AAAA,gBACZ,MAAM,OAAO,OAAO,OAAO,SAAY;AAAA,gBACvC,IAAI,OAAO;AAAA;AAAA,YACb;AAAA,YACA,gBAAAA,KAAC,mBAAgB,IAAI,OAAO,oBACzB,iBAAO,QACV;AAAA,aACF;AAAA,aAtBU,OAAO,EAuBnB;AAAA,OACD,GACH,GACF,IACE;AAAA,OACN;AAAA,IAEA,gBAAAC,MAACK,QAAA,EAAM,SAAQ,QAAO,IAAI,OAAO,qBAC/B;AAAA,sBAAAL,MAACK,QAAA,EAAM,SAAQ,OACb;AAAA,wBAAAL,MAACQ,SAAA,EAAO,IAAI,OAAO,sBACjB;AAAA,0BAAAT,KAACQ,OAAA,EAAK,IAAI,OAAO,mBAAmB,0BAAY;AAAA,UAC/C,mCAAmC,SAAS,IAC3C,gBAAAR,KAAC,SAAM,IAAI,OAAO,mBAAoB,6CAAmC,QAAO,IAC9E;AAAA,WACN;AAAA,QACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,sBAAsB,gFAEvC;AAAA,SACF;AAAA,MAEA,gBAAAP,MAAC,WAAQ,WAAU,aAAY,UAAS,SAAQ,YAAU,MAAC,QAAM,MAAC,QAAQ,GACxE;AAAA,wBAAAD,KAAC,kBACC,0BAAAA,KAACU,SAAA,EAAO,SAAQ,YAAW,IAAI,OAAO,qBACpC,0BAAAT,MAACQ,SAAA,EAAO,SAAQ,iBAAgB,GAAE,QAChC;AAAA,0BAAAT;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,GAAG,OAAO;AAAA,gBACV,GAAI,mCAAmC,SAAS,IAAI,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,cAC9E;AAAA,cACA,WAAW;AAAA,cAEV,6CAAmC,SAAS,IACzC,mCAAmC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,IAChE;AAAA;AAAA,UACN;AAAA,UACA,gBAAAR,KAACO,MAAA,EAAI,OAAM,WACT,0BAAAP,KAAC,mBAAgB,GACnB;AAAA,WACF,GACF,GACF;AAAA,QACA,gBAAAA,KAAC,UAAO,sBAAsB,OAC5B,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,cACF,GAAG,OAAO;AAAA,cACV,MAAM;AAAA,cACN,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,cACjB,wBAAwB,EAAE,SAAS,OAAO;AAAA,YAC5C;AAAA,YAEA,0BAAAA,KAAC,eAAY,GAAG,GACd,0BAAAA,KAACM,QAAA,EAAM,SAAQ,OACZ,wCAA8B,IAAI,CAAC,UAClC,gBAAAL,MAACM,MAAA,EACC;AAAA,8BAAAP,KAACQ,OAAA,EAAK,IAAI,OAAO,yBAA0B,gBAAM,MAAK;AAAA,cACtD,gBAAAR,KAACM,QAAA,EAAM,SAAQ,OACZ,gBAAM,QAAQ,IAAI,CAAC,WAClB,gBAAAL,MAACM,MAAA,EACC;AAAA,gCAAAN;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,IAAG;AAAA,oBACH,SAAQ;AAAA,oBACR,IAAI,EAAE,GAAG,OAAO,uBAAuB,QAAQ,UAAU;AAAA,oBAEzD;AAAA,sCAAAL,MAACQ,SAAA,EAAO,SAAQ,OACd;AAAA,wCAAAT;AAAA,0BAAC;AAAA;AAAA,4BACC,IAAI,gBAAgB,OAAO,EAAE;AAAA,4BAC7B,WAAW,wBAAwB,SAAS,OAAO,EAAE,KAAK,QAAQ,OAAO,YAAY,OAAO,eAAe;AAAA,4BAC3G,YACE,OAAO,YACN,CAAC,wBAAwB,SAAS,OAAO,EAAE,KAAK,wBAAwB,UAAU;AAAA,4BAErF,UAAU,MAAM;AACd,kCAAI,CAAC,OAAO,SAAU,0BAAyB,OAAO,EAAE;AAAA,4BAC1D;AAAA;AAAA,wBACF;AAAA,wBACA,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,yBAA0B,iBAAO,OAAM;AAAA,yBAC1D;AAAA,sBACC,OAAO,WAAW,gBAAAR,KAACQ,OAAA,EAAK,IAAI,OAAO,wBAAyB,iBAAO,UAAS,IAAU;AAAA;AAAA;AAAA,gBACzF;AAAA,gBACC,uBACA,OAAO,OAAO,yBAAyB,OAAO,OAAO,oBACpD,gBAAAR,KAACO,MAAA,EAAI,IAAG,QAAO,IAAG,OAAM,IAAG,OACxB,oCAA0B,oBAAoB,OAAO,EAAE,GAC1D,IACE;AAAA,mBA3BI,OAAO,EA4BjB,CACD,GACH;AAAA,iBAlCQ,MAAM,EAmChB,CACD,GACH,GACF;AAAA;AAAA,QACF,GACF;AAAA,SACF;AAAA,MAEC,4BAA4B,UAAU,IACrC,gBAAAN,MAACM,MAAA,EAAI,IAAI,OAAO,6BACd;AAAA,wBAAAP,KAACM,QAAA,EAAM,SAAQ,QACZ,sCAA4B,IAAI,CAAC,QAAQ,UAAO;AA7wC/D;AA8wCgB,iCAAAN,KAACM,QAAA,EAAsB,IAAI,OAAO,uBAChC,0BAAAL,MAACK,QAAA,EAAM,IAAI,OAAO,0BAChB;AAAA,4BAAAL,MAACO,OAAA,EAAK,IAAI,OAAO,2BACd;AAAA,sBAAQ;AAAA,cAAE;AAAA,cAAG,OAAO;AAAA,eACvB;AAAA,YACA,gBAAAP,MAAC,cACC;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO,wBAAmB,GAAG,OAAO,EAAE,eAAe,MAA9C,YAAmD;AAAA,kBAC1D,UAAU,CAAC,MAAM;AACf,0BAAM,MAAM,EAAE,OAAO;AACrB,wBAAI,QAAQ,OAAO,CAAC,QAAQ,KAAK,GAAG,KAAK,OAAO,GAAG,IAAI,GAAI;AAC3D,0CAAsB,CAAC,UAAU;AAAA,sBAC/B,GAAG;AAAA,sBACH,CAAC,GAAG,OAAO,EAAE,eAAe,GAAG;AAAA,oBACjC,EAAE;AAAA,kBACJ;AAAA,kBACA,IAAI,OAAO;AAAA;AAAA,cACb;AAAA,cACA,gBAAAA,KAAC,mBAAgB,IAAI,OAAO,oBAAoB,oBAAM;AAAA,eACxD;AAAA,aACF,KArBU,OAAO,EAsBnB;AAAA,SACD,GACH;AAAA,QACA,gBAAAA,KAAC,WAAQ,IAAI,EAAE,GAAG,OAAO,qBAAqB,IAAI,OAAO,GAAG;AAAA,QAC5D,gBAAAA,KAACQ,OAAA,EAAK,IAAI,OAAO,qBAAsB,6BAAkB;AAAA,SAC3D,IACE;AAAA,OACN;AAAA,KAEF;AAGF,QAAM,eACJ,gBAAAP,MAACK,QAAA,EAAM,SAAQ,QAAO,IAAI,OAAO,gBAC9B;AAAA,iBAAa,iBAAiB;AAAA,IAC/B,gBAAAN,KAACM,QAAA,EAAM,SAAQ,QAAO,IAAI,OAAO,WAC9B,yBAAe,IAAI,CAAC,SAAS,UAAU;AACtC,YAAM,cAAc,UAAU,KAAK,gBAAgB;AACnD,YAAM,OAAO,cACT,EAAE,OAAO,0BAAqB,UAAU,OAAU,IAClD;AACJ,YAAM,SAAS,mBAAmB,KAAK;AACvC,YAAM,eAAe,cAAc,UAAU;AAC7C,YAAM,aAAa;AAAA,QACjB,GAAG,OAAO;AAAA,QACV,GAAI,WAAW,WAAW,OAAO,iBAAiB;AAAA,QAClD,GAAI,WAAW,SAAS,OAAO,eAAe;AAAA,QAC9C,GAAI,WAAW,YAAY,OAAO,kBAAkB;AAAA,QACpD,GAAI,eAAe,OAAO,iBAAiB;AAAA,MAC7C;AACA,YAAM,cAAc;AAAA,QAClB,GAAG,OAAO;AAAA,QACV,GAAI,WAAW,WAAW,OAAO,kBAAkB;AAAA,QACnD,GAAI,WAAW,SAAS,OAAO,gBAAgB;AAAA,QAC/C,GAAI,WAAW,YAAY,OAAO,mBAAmB;AAAA,QACrD,GAAI,eAAe,OAAO,kBAAkB;AAAA,MAC9C;AACA,aACE,gBAAAL,MAACQ,SAAA,EAA2B,IAAI,OAAO,SACrC;AAAA,wBAAAT,KAACO,MAAA,EAAI,IAAI,YACN,yBACC,gBAAAP,KAAC,cAAW,OAAO,IAAI,QAAQ,IAAI,IACjC,WAAW,WACb,gBAAAA,KAACW,UAAA,EAAQ,MAAK,MAAK,WAAU,OAAM,OAAM,QAAO,IAC9C,WAAW,SACb,gBAAAX,KAAC,aAAU,OAAO,IAAI,QAAQ,IAAI,IAChC,MACN;AAAA,QACA,gBAAAC,MAACM,MAAA,EACC;AAAA,0BAAAP,KAACQ,OAAA,EAAK,IAAI,aAAc,eAAK,OAAM;AAAA,UAClC,WAAW,YAAY,KAAK,WAAW,gBAAAR,KAACQ,OAAA,EAAK,IAAI,OAAO,cAAe,eAAK,UAAS,IAAU;AAAA,WAClG;AAAA,WAbW,QAAQ,KAcrB;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAIF,QAAM,gBAAgB,oBACpB,gBAAAP,MAAA,YACE;AAAA,oBAAAD,KAACU,SAAA,EAAO,SAAQ,WAAU,SAAS,SAAS,IAAI,OAAO,cACpD,uBACH;AAAA,IACA,gBAAAV;AAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,YACE,kBAAkB,KACjB,CAAC,cAAc,WAAW,WAAW,KACtC,kBACC,QAAQ,oBAAoB,KAAK,sBAAsB,WAAW;AAAA,QAErE,IAAI,OAAO;AAAA,QAEV;AAAA;AAAA,IACH;AAAA,KACF,IACE,aACF,gBAAAT,MAAA,YACE;AAAA,oBAAAD;AAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,SAAS,MAAM;AACb,cAAI,aAAa;AACf,2DAAgB,aAAa;AAAA,cAC3B;AAAA,cACA,uBAAuB;AAAA,cACvB;AAAA,cACA,yBAAyB;AAAA,cACzB;AAAA,cACA,oBAAoB;AAAA,YACtB;AAAA,UACF;AACA,kBAAQ;AAAA,QACV;AAAA,QACA,IAAI,OAAO;AAAA,QACZ;AAAA;AAAA,IAED;AAAA,IACA,gBAAAV,KAACU,SAAA,EAAO,SAAS,yBAAyB,IAAI,OAAO,qBAAqB,gCAE1E;AAAA,KACF,IACE;AAEJ,QAAM,aAAa,oBAAoB,OAAO,OAAO,EAAE,GAAG,OAAO,MAAM,GAAG,OAAO,aAAa;AAC9F,QAAM,cAAc,oBAAoB,uBAAuB;AAE/D,QAAM,eACJ,gBAAAT;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,YAAU;AAAA,MACV,cAAa;AAAA,MACb,qBAAqB;AAAA,MACrB,YAAY;AAAA,MACZ,WAAW;AAAA,MAEX;AAAA,wBAAAD,KAAC,gBAAa,IAAI,OAAO,SAAS;AAAA,QAClC,gBAAAC,MAAC,gBAAa,IAAI,OAAO,SACvB;AAAA,0BAAAD,KAAC,eAAY,IAAI,OAAO,QACtB,0BAAAC,MAACQ,SAAA,EAAO,SAAQ,iBAAgB,GAAE,QAChC;AAAA,4BAAAT,KAACQ,OAAA,EAAK,IAAI,OAAO,OAAQ,sBAAW;AAAA,YACpC,gBAAAR;AAAA,cAACY;AAAA,cAAA;AAAA,gBACC,cAAW;AAAA,gBACX,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,MAAM,gBAAAZ,KAAC,aAAU;AAAA,gBACjB,SAAS;AAAA,gBACT,IAAI,OAAO;AAAA;AAAA,YACb;AAAA,aACF,GACF;AAAA,UACA,gBAAAA,KAAC,aAAU,IAAI,YAAa,uBAAY;AAAA,UACvC,iBACC,gBAAAA,KAAC,eAAY,IAAI,aAAa,OAAO,eAAe,OAAO,QAAS,yBAAc;AAAA,WAEtF;AAAA;AAAA;AAAA,EACF;AAGF,QAAM,mBAAmB,gBACvB,gBAAAA;AAAA,IAACS;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,IAAI;AAAA,MACJ,GAAE;AAAA,MACF,IAAG;AAAA,MACH,WAAU;AAAA,MACV,aAAY;AAAA,MACZ,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,GAAE;AAAA,MAED;AAAA;AAAA,EACH,IACE;AAEJ,QAAM,gBACJ,gBAAAT;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,qBAAqB;AAAA,MACrB,MAAM,iBAAiB,UAAU;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,MAEP;AAAA;AAAA,EACH;AAGF,QAAM,UAAU,gBAAgB,WAAW,gBAAgB;AAE3D,MAAI,SAAS,aAAa;AACxB,WACE,gBAAAA,KAAC,kBAAe,OAAO,aAAa,aACjC,mBACH;AAAA,EAEJ;AAEA,SAAO;AACT;;;Aa39CA,SAAS,kBAAAa,uBAAsB;AAYzB,gBAAAC,YAAA;AAHC,SAAS,+BAA+B,OAAgC;AAC7E,SACE,gBAAAA,KAACC,iBAAA,EACC,0BAAAD,KAAC,sBAAoB,GAAG,OAAO,GACjC;AAEJ;;;ACZA,SAAS,kBAAAE,uBAAsB;AAKzB,gBAAAC,YAAA;AAHC,SAAS,qCAAqC,OAAsC;AACzF,SACE,gBAAAA,KAACD,iBAAA,EACC,0BAAAC,KAAC,4BAA0B,GAAG,OAAO,GACvC;AAEJ;;;ACLO,IAAM,yBAAiD;AAAA;AAAA,EAE5D,mCAAmC;AAAA,EACnC,wCAAwC;AAAA,EACxC,qCAAqC;AAAA,EACrC,wBAAwB;AAAA;AAAA,EAGxB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA;AAAA,EAG1B,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,8BAA8B;AAAA,EAC9B,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,2BAA2B;AAC7B;AAMO,SAAS,oBAAoB,wBAAwC;AAC1E,QAAM,UAAU,iEAAwB;AACxC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,SAAS,uBAAuB,QAAQ,kBAAkB,CAAC;AACjE,MAAI,OAAQ,QAAO;AAGnB,SAAO,QACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG;AACb;;;AC/DO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAItC,YAAY,SAAiB,QAAgB,SAAmB;AAC9D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AACF;","names":["useMemo","useState","Box","Button","HStack","IconButton","Spinner","Stack","Text","_ignored","defaultStyles","axios","jsx","jsxs","axios","recommendations","jsx","jsxs","useMemo","useState","runId","_a","Stack","Box","Text","HStack","Button","Spinner","IconButton","ChakraProvider","jsx","ChakraProvider","ChakraProvider","jsx"]}